From 36f30bc68953a61beb18e5bdb41942e6b0993b9f Mon Sep 17 00:00:00 2001 From: Scott Creeley Date: Wed, 9 Aug 2017 13:51:46 -0400 Subject: [PATCH 1/2] Add VolumeType api to PV and PVC --- hack/import-restrictions.yaml | 2 + pkg/api/persistentvolume/util.go | 10 + pkg/api/persistentvolume/util_test.go | 61 ++ pkg/api/persistentvolumeclaim/BUILD | 37 ++ pkg/api/persistentvolumeclaim/OWNERS | 4 + pkg/api/persistentvolumeclaim/util.go | 31 + pkg/api/persistentvolumeclaim/util_test.go | 71 +++ pkg/api/pod/util.go | 16 + pkg/api/pod/util_test.go | 84 +++ pkg/apis/core/types.go | 32 + pkg/apis/core/v1/defaults.go | 10 + pkg/apis/core/v1/defaults_test.go | 54 ++ pkg/apis/core/validation/validation.go | 204 +++++- pkg/apis/core/validation/validation_test.go | 592 +++++++++++++++++- pkg/apis/settings/validation/validation.go | 4 +- pkg/features/kube_features.go | 7 + .../core/persistentvolume/strategy.go | 6 + .../core/persistentvolumeclaim/strategy.go | 10 +- staging/src/k8s.io/api/core/v1/types.go | 34 + 19 files changed, 1215 insertions(+), 54 deletions(-) create mode 100644 pkg/api/persistentvolumeclaim/BUILD create mode 100755 pkg/api/persistentvolumeclaim/OWNERS create mode 100644 pkg/api/persistentvolumeclaim/util.go create mode 100644 pkg/api/persistentvolumeclaim/util_test.go diff --git a/hack/import-restrictions.yaml b/hack/import-restrictions.yaml index 1b740a293cf..bd4479bd455 100644 --- a/hack/import-restrictions.yaml +++ b/hack/import-restrictions.yaml @@ -1,7 +1,9 @@ - baseImportPath: "./pkg/apis/core/" allowedImports: - k8s.io/apimachinery + - k8s.io/apiserver/pkg/util/feature - k8s.io/kubernetes/pkg/apis/core + - k8s.io/kubernetes/pkg/features - k8s.io/kubernetes/pkg/util - k8s.io/api/core/v1 diff --git a/pkg/api/persistentvolume/util.go b/pkg/api/persistentvolume/util.go index 6f651961338..ede89525f58 100644 --- a/pkg/api/persistentvolume/util.go +++ b/pkg/api/persistentvolume/util.go @@ -17,7 +17,9 @@ limitations under the License. package persistentvolume import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/features" ) func getClaimRefNamespace(pv *api.PersistentVolume) string { @@ -96,3 +98,11 @@ func VisitPVSecretNames(pv *api.PersistentVolume, visitor Visitor) bool { } return true } + +// DropDisabledAlphaFields removes disabled fields from the pv spec. +// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pv spec. +func DropDisabledAlphaFields(pvSpec *api.PersistentVolumeSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + pvSpec.VolumeMode = nil + } +} diff --git a/pkg/api/persistentvolume/util_test.go b/pkg/api/persistentvolume/util_test.go index 974a6dafa70..bd536e3cea0 100644 --- a/pkg/api/persistentvolume/util_test.go +++ b/pkg/api/persistentvolume/util_test.go @@ -24,7 +24,9 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/features" ) func TestPVSecrets(t *testing.T) { @@ -204,3 +206,62 @@ func collectSecretPaths(t *testing.T, path *field.Path, name string, tp reflect. return secretPaths } + +func newHostPathType(pathType string) *api.HostPathType { + hostPathType := new(api.HostPathType) + *hostPathType = api.HostPathType(pathType) + return hostPathType +} + +func TestDropAlphaPVVolumeMode(t *testing.T) { + vmode := api.PersistentVolumeFilesystem + + // PersistentVolume with VolumeMode set + pv := api.PersistentVolume{ + Spec: api.PersistentVolumeSpec{ + AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, + PersistentVolumeSource: api.PersistentVolumeSource{ + HostPath: &api.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(api.HostPathDirectory)), + }, + }, + StorageClassName: "test-storage-class", + VolumeMode: &vmode, + }, + } + + // Enable alpha feature BlockVolume + err1 := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err1 != nil { + t.Fatalf("Failed to enable feature gate for BlockVolume: %v", err1) + } + + // now test dropping the fields - should not be dropped + DropDisabledAlphaFields(&pv.Spec) + + // check to make sure VolumeDevices is still present + // if featureset is set to true + if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + if pv.Spec.VolumeMode == nil { + t.Error("VolumeMode in pv.Spec should not have been dropped based on feature-gate") + } + } + + // Disable alpha feature BlockVolume + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err != nil { + t.Fatalf("Failed to disable feature gate for BlockVolume: %v", err) + } + + // now test dropping the fields + DropDisabledAlphaFields(&pv.Spec) + + // check to make sure VolumeDevices is nil + // if featureset is set to false + if !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + if pv.Spec.VolumeMode != nil { + t.Error("DropDisabledAlphaFields VolumeMode for pv.Spec failed") + } + } +} diff --git a/pkg/api/persistentvolumeclaim/BUILD b/pkg/api/persistentvolumeclaim/BUILD new file mode 100644 index 00000000000..26471bdb6db --- /dev/null +++ b/pkg/api/persistentvolumeclaim/BUILD @@ -0,0 +1,37 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = ["util.go"], + deps = ["//pkg/api:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + library = ":go_default_library", + deps = [ + "//pkg/api:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + ], +) diff --git a/pkg/api/persistentvolumeclaim/OWNERS b/pkg/api/persistentvolumeclaim/OWNERS new file mode 100755 index 00000000000..8575aa9767a --- /dev/null +++ b/pkg/api/persistentvolumeclaim/OWNERS @@ -0,0 +1,4 @@ +reviewers: +- smarterclayton +- jsafrane +- david-mcmahon diff --git a/pkg/api/persistentvolumeclaim/util.go b/pkg/api/persistentvolumeclaim/util.go new file mode 100644 index 00000000000..a6321d3404f --- /dev/null +++ b/pkg/api/persistentvolumeclaim/util.go @@ -0,0 +1,31 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package persistentvolumeclaim + +import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/features" +) + +// DropDisabledAlphaFields removes disabled fields from the pvc spec. +// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pvc spec. +func DropDisabledAlphaFields(pvcSpec *core.PersistentVolumeClaimSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + pvcSpec.VolumeMode = nil + } +} diff --git a/pkg/api/persistentvolumeclaim/util_test.go b/pkg/api/persistentvolumeclaim/util_test.go new file mode 100644 index 00000000000..e12acb3a9e7 --- /dev/null +++ b/pkg/api/persistentvolumeclaim/util_test.go @@ -0,0 +1,71 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package persistentvolumeclaim + +import ( + "testing" + + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/features" +) + +func TestDropAlphaPVCVolumeMode(t *testing.T) { + vmode := core.PersistentVolumeFilesystem + + // PersistentVolume with VolumeMode set + pvc := core.PersistentVolumeClaim{ + Spec: core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + VolumeMode: &vmode, + }, + } + + // Enable alpha feature BlockVolume + err1 := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err1 != nil { + t.Fatalf("Failed to enable feature gate for BlockVolume: %v", err1) + } + + // now test dropping the fields - should not be dropped + DropDisabledAlphaFields(&pvc.Spec) + + // check to make sure VolumeDevices is still present + // if featureset is set to true + if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + if pvc.Spec.VolumeMode == nil { + t.Error("VolumeMode in pvc.Spec should not have been dropped based on feature-gate") + } + } + + // Disable alpha feature BlockVolume + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err != nil { + t.Fatalf("Failed to disable feature gate for BlockVolume: %v", err) + } + + // now test dropping the fields + DropDisabledAlphaFields(&pvc.Spec) + + // check to make sure VolumeDevices is nil + // if featureset is set to false + if !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + if pvc.Spec.VolumeMode != nil { + t.Error("DropDisabledAlphaFields VolumeMode for pvc.Spec failed") + } + } +} diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 3b0f61c9038..3cb7d69f399 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -243,12 +243,15 @@ func DropDisabledAlphaFields(podSpec *api.PodSpec) { } } } + for i := range podSpec.Containers { DropDisabledVolumeMountsAlphaFields(podSpec.Containers[i].VolumeMounts) } for i := range podSpec.InitContainers { DropDisabledVolumeMountsAlphaFields(podSpec.InitContainers[i].VolumeMounts) } + + DropDisabledVolumeDevicesAlphaFields(podSpec) } // DropDisabledVolumeMountsAlphaFields removes disabled fields from []VolumeMount. @@ -260,3 +263,16 @@ func DropDisabledVolumeMountsAlphaFields(volumeMounts []api.VolumeMount) { } } } + +// DropDisabledVolumeDevicesAlphaFields removes disabled fields from []VolumeDevice. +// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a VolumeDevice +func DropDisabledVolumeDevicesAlphaFields(podSpec *api.PodSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + for i := range podSpec.Containers { + podSpec.Containers[i].VolumeDevices = nil + } + for i := range podSpec.InitContainers { + podSpec.InitContainers[i].VolumeDevices = nil + } + } +} diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index 4e87a1189a2..1c7eb328fca 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -24,7 +24,9 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/features" ) func TestPodSecrets(t *testing.T) { @@ -254,3 +256,85 @@ func TestPodConfigmaps(t *testing.T) { t.Error("Extra names extracted. Verify VisitPodConfigmapNames() is correctly extracting resource names") } } + +func TestDropAlphaVolumeDevices(t *testing.T) { + testPod := api.Pod{ + Spec: api.PodSpec{ + RestartPolicy: api.RestartPolicyNever, + Containers: []api.Container{ + { + Name: "container1", + Image: "testimage", + VolumeDevices: []api.VolumeDevice{ + { + Name: "myvolume", + DevicePath: "/usr/test", + }, + }, + }, + }, + InitContainers: []api.Container{ + { + Name: "container1", + Image: "testimage", + VolumeDevices: []api.VolumeDevice{ + { + Name: "myvolume", + DevicePath: "/usr/test", + }, + }, + }, + }, + Volumes: []api.Volume{ + { + Name: "myvolume", + VolumeSource: api.VolumeSource{ + HostPath: &api.HostPathVolumeSource{ + Path: "/dev/xvdc", + }, + }, + }, + }, + }, + } + + // Enable alpha feature BlockVolume + err1 := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err1 != nil { + t.Fatalf("Failed to enable feature gate for BlockVolume: %v", err1) + } + + // now test dropping the fields - should not be dropped + DropDisabledAlphaFields(&testPod.Spec) + + // check to make sure VolumeDevices is still present + // if featureset is set to true + if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + if testPod.Spec.Containers[0].VolumeDevices == nil { + t.Error("VolumeDevices in Container should not have been dropped based on feature-gate") + } + if testPod.Spec.InitContainers[0].VolumeDevices == nil { + t.Error("VolumeDevices in Container should not have been dropped based on feature-gate") + } + } + + // Disable alpha feature BlockVolume + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err != nil { + t.Fatalf("Failed to disable feature gate for BlockVolume: %v", err) + } + + // now test dropping the fields + DropDisabledAlphaFields(&testPod.Spec) + + // check to make sure VolumeDevices is nil + // if featureset is set to false + if !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + if testPod.Spec.Containers[0].VolumeDevices != nil { + t.Error("DropDisabledAlphaFields for Containers failed") + } + if testPod.Spec.InitContainers[0].VolumeDevices != nil { + t.Error("DropDisabledAlphaFields for InitContainers failed") + } + } +} diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index 289426cc3ae..2fe5e50a03b 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -462,6 +462,11 @@ type PersistentVolumeSpec struct { // simply fail if one is invalid. // +optional MountOptions []string + // volumeMode defines if a volume is intended to be used with a formatted filesystem + // or to remain in raw block state. Value of Filesystem is implied when not included in spec. + // This is an alpha feature and may change in the future. + // +optional + VolumeMode *PersistentVolumeMode } // PersistentVolumeReclaimPolicy describes a policy for end-of-life maintenance of persistent volumes @@ -479,6 +484,16 @@ const ( PersistentVolumeReclaimRetain PersistentVolumeReclaimPolicy = "Retain" ) +// PersistentVolumeMode describes how a volume is intended to be consumed, either Block or Filesystem. +type PersistentVolumeMode string + +const ( + // PersistentVolumeBlock means the volume will not be formatted with a filesystem and will remain a raw block device. + PersistentVolumeBlock PersistentVolumeMode = "Block" + // PersistentVolumeFilesystem means the volume will be or is formatted with a filesystem. + PersistentVolumeFilesystem PersistentVolumeMode = "Filesystem" +) + type PersistentVolumeStatus struct { // Phase indicates if a volume is available, bound to a claim, or released by a claim // +optional @@ -548,6 +563,11 @@ type PersistentVolumeClaimSpec struct { // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1 // +optional StorageClassName *string + // volumeMode defines what type of volume is required by the claim. + // Value of Filesystem is implied when not included in claim spec. + // This is an alpha feature and may change in the future. + // +optional + VolumeMode *PersistentVolumeMode } type PersistentVolumeClaimConditionType string @@ -1586,6 +1606,14 @@ const ( MountPropagationBidirectional MountPropagationMode = "Bidirectional" ) +// VolumeDevice describes a mapping of a raw block device within a container. +type VolumeDevice struct { + // name must match the name of a persistentVolumeClaim in the pod + Name string + // devicePath is the path inside of the container that the device will be mapped to. + DevicePath string +} + // EnvVar represents an environment variable present in a Container. type EnvVar struct { // Required: This must be a C_IDENTIFIER. @@ -1879,6 +1907,10 @@ type Container struct { Resources ResourceRequirements // +optional VolumeMounts []VolumeMount + // volumeDevices is the list of block devices to be used by the container. + // This is an alpha feature and may change in the future. + // +optional + VolumeDevices []VolumeDevice // +optional LivenessProbe *Probe // +optional diff --git a/pkg/apis/core/v1/defaults.go b/pkg/apis/core/v1/defaults.go index d6b98368f34..236905db55b 100644 --- a/pkg/apis/core/v1/defaults.go +++ b/pkg/apis/core/v1/defaults.go @@ -20,6 +20,8 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/util/parsers" utilpointer "k8s.io/kubernetes/pkg/util/pointer" ) @@ -228,11 +230,19 @@ func SetDefaults_PersistentVolume(obj *v1.PersistentVolume) { if obj.Spec.PersistentVolumeReclaimPolicy == "" { obj.Spec.PersistentVolumeReclaimPolicy = v1.PersistentVolumeReclaimRetain } + if obj.Spec.VolumeMode == nil && utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + obj.Spec.VolumeMode = new(v1.PersistentVolumeMode) + *obj.Spec.VolumeMode = v1.PersistentVolumeFilesystem + } } func SetDefaults_PersistentVolumeClaim(obj *v1.PersistentVolumeClaim) { if obj.Status.Phase == "" { obj.Status.Phase = v1.ClaimPending } + if obj.Spec.VolumeMode == nil && utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + obj.Spec.VolumeMode = new(v1.PersistentVolumeMode) + *obj.Spec.VolumeMode = v1.PersistentVolumeFilesystem + } } func SetDefaults_ISCSIVolumeSource(obj *v1.ISCSIVolumeSource) { if obj.ISCSIInterface == "" { diff --git a/pkg/apis/core/v1/defaults_test.go b/pkg/apis/core/v1/defaults_test.go index 89984dc1142..9a071f38ae9 100644 --- a/pkg/apis/core/v1/defaults_test.go +++ b/pkg/apis/core/v1/defaults_test.go @@ -26,6 +26,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" corev1 "k8s.io/kubernetes/pkg/apis/core/v1" @@ -817,6 +818,33 @@ func TestSetDefaultPersistentVolume(t *testing.T) { if pv2.Spec.PersistentVolumeReclaimPolicy != v1.PersistentVolumeReclaimRetain { t.Errorf("Expected pv reclaim policy %v, got %v", v1.PersistentVolumeReclaimRetain, pv2.Spec.PersistentVolumeReclaimPolicy) } + + // When feature gate is disabled, field should not be defaulted + defaultMode := v1.PersistentVolumeFilesystem + outputMode := pv2.Spec.VolumeMode + if outputMode != nil { + t.Errorf("Expected VolumeMode to not be defaulted, got: %+v", outputMode) + } + + // When feature gate is enabled, field should be defaulted + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err != nil { + t.Fatalf("Failed to enable feature gate for BlockVolume: %v", err) + } + obj3 := roundTrip(t, runtime.Object(pv)).(*v1.PersistentVolume) + outputMode3 := obj3.Spec.VolumeMode + + if outputMode3 == nil { + t.Errorf("Expected VolumeMode to be defaulted to: %+v, got: nil", defaultMode) + } else if *outputMode3 != defaultMode { + t.Errorf("Expected VolumeMode to be defaulted to: %+v, got: %+v", defaultMode, outputMode3) + } + + err = utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err != nil { + t.Fatalf("Failed to disable feature gate for BlockVolume: %v", err) + } + } func TestSetDefaultPersistentVolumeClaim(t *testing.T) { @@ -827,6 +855,32 @@ func TestSetDefaultPersistentVolumeClaim(t *testing.T) { if pvc2.Status.Phase != v1.ClaimPending { t.Errorf("Expected claim phase %v, got %v", v1.ClaimPending, pvc2.Status.Phase) } + + // When feature gate is disabled, field should not be defaulted + defaultMode := v1.PersistentVolumeFilesystem + outputMode := pvc2.Spec.VolumeMode + if outputMode != nil { + t.Errorf("Expected VolumeMode to not be defaulted, got: %+v", outputMode) + } + + // When feature gate is enabled, field should be defaulted + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err != nil { + t.Fatalf("Failed to enable feature gate for BlockVolume: %v", err) + } + obj3 := roundTrip(t, runtime.Object(pvc)).(*v1.PersistentVolumeClaim) + outputMode3 := obj3.Spec.VolumeMode + + if outputMode3 == nil { + t.Errorf("Expected VolumeMode to be defaulted to: %+v, got: nil", defaultMode) + } else if *outputMode3 != defaultMode { + t.Errorf("Expected VolumeMode to be defaulted to: %+v, got: %+v", defaultMode, outputMode3) + } + + err = utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err != nil { + t.Fatalf("Failed to disable feature gate for BlockVolume: %v", err) + } } func TestSetDefaulEndpointsProtocol(t *testing.T) { diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 846f2d62de1..c67f2c49066 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -64,7 +64,7 @@ const isNotIntegerErrorMsg string = `must be an integer` const isNotPositiveErrorMsg string = `must be greater than zero` var pdPartitionErrorMsg string = validation.InclusiveRangeError(1, 255) -var volumeModeErrorMsg string = "must be a number between 0 and 0777 (octal), both inclusive" +var fileModeErrorMsg string = "must be a number between 0 and 0777 (octal), both inclusive" // BannedOwners is a black list of object that are not allowed to be owners. var BannedOwners = apimachineryvalidation.BannedOwners @@ -364,10 +364,11 @@ func ValidateNoNewFinalizers(newFinalizers []string, oldFinalizers []string, fld return apimachineryvalidation.ValidateNoNewFinalizers(newFinalizers, oldFinalizers, fldPath) } -func ValidateVolumes(volumes []core.Volume, fldPath *field.Path) (sets.String, field.ErrorList) { +func ValidateVolumes(volumes []core.Volume, fldPath *field.Path) (map[string]core.VolumeSource, field.ErrorList) { allErrs := field.ErrorList{} allNames := sets.String{} + vols := make(map[string]core.VolumeSource) for i, vol := range volumes { idxPath := fldPath.Index(i) namePath := idxPath.Child("name") @@ -382,12 +383,69 @@ func ValidateVolumes(volumes []core.Volume, fldPath *field.Path) (sets.String, f } if len(el) == 0 { allNames.Insert(vol.Name) + vols[vol.Name] = vol.VolumeSource } else { allErrs = append(allErrs, el...) } } - return allNames, allErrs + return vols, allErrs +} + +func IsMatchedVolume(name string, volumes map[string]core.VolumeSource) bool { + if _, ok := volumes[name]; ok { + return true + } else { + return false + } +} + +func isMatchedDevice(name string, volumes map[string]core.VolumeSource) (bool, bool) { + if source, ok := volumes[name]; ok { + if source.PersistentVolumeClaim != nil { + return true, true + } else { + return true, false + } + } else { + return false, false + } +} + +func mountNameAlreadyExists(name string, devices map[string]string) bool { + if _, ok := devices[name]; ok { + return true + } else { + return false + } +} + +func mountPathAlreadyExists(mountPath string, devices map[string]string) bool { + for _, devPath := range devices { + if mountPath == devPath { + return true + } + } + + return false +} + +func deviceNameAlreadyExists(name string, mounts map[string]string) bool { + if _, ok := mounts[name]; ok { + return true + } else { + return false + } +} + +func devicePathAlreadyExists(devicePath string, mounts map[string]string) bool { + for _, mountPath := range mounts { + if mountPath == devicePath { + return true + } + } + + return false } func validateVolumeSource(source *core.VolumeSource, fldPath *field.Path, volName string) field.ErrorList { @@ -745,7 +803,7 @@ func validateSecretVolumeSource(secretSource *core.SecretVolumeSource, fldPath * secretMode := secretSource.DefaultMode if secretMode != nil && (*secretMode > 0777 || *secretMode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *secretMode, volumeModeErrorMsg)) + allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *secretMode, fileModeErrorMsg)) } itemsPath := fldPath.Child("items") @@ -764,7 +822,7 @@ func validateConfigMapVolumeSource(configMapSource *core.ConfigMapVolumeSource, configMapMode := configMapSource.DefaultMode if configMapMode != nil && (*configMapMode > 0777 || *configMapMode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *configMapMode, volumeModeErrorMsg)) + allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *configMapMode, fileModeErrorMsg)) } itemsPath := fldPath.Child("items") @@ -785,7 +843,7 @@ func validateKeyToPath(kp *core.KeyToPath, fldPath *field.Path) field.ErrorList } allErrs = append(allErrs, validateLocalNonReservedPath(kp.Path, fldPath.Child("path"))...) if kp.Mode != nil && (*kp.Mode > 0777 || *kp.Mode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *kp.Mode, volumeModeErrorMsg)) + allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *kp.Mode, fileModeErrorMsg)) } return allErrs @@ -882,7 +940,7 @@ func validateDownwardAPIVolumeFile(file *core.DownwardAPIVolumeFile, fldPath *fi allErrs = append(allErrs, field.Required(fldPath, "one of fieldRef and resourceFieldRef is required")) } if file.Mode != nil && (*file.Mode > 0777 || *file.Mode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *file.Mode, volumeModeErrorMsg)) + allErrs = append(allErrs, field.Invalid(fldPath.Child("mode"), *file.Mode, fileModeErrorMsg)) } return allErrs @@ -893,7 +951,7 @@ func validateDownwardAPIVolumeSource(downwardAPIVolume *core.DownwardAPIVolumeSo downwardAPIMode := downwardAPIVolume.DefaultMode if downwardAPIMode != nil && (*downwardAPIMode > 0777 || *downwardAPIMode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *downwardAPIMode, volumeModeErrorMsg)) + allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *downwardAPIMode, fileModeErrorMsg)) } for _, file := range downwardAPIVolume.Items { @@ -983,7 +1041,7 @@ func validateProjectedVolumeSource(projection *core.ProjectedVolumeSource, fldPa projectionMode := projection.DefaultMode if projectionMode != nil && (*projectionMode > 0777 || *projectionMode < 0) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *projectionMode, volumeModeErrorMsg)) + allErrs = append(allErrs, field.Invalid(fldPath.Child("defaultMode"), *projectionMode, fileModeErrorMsg)) } allErrs = append(allErrs, validateProjectionSources(projection, projectionMode, fldPath)...) @@ -1344,6 +1402,8 @@ var supportedAccessModes = sets.NewString(string(core.ReadWriteOnce), string(cor var supportedReclaimPolicy = sets.NewString(string(core.PersistentVolumeReclaimDelete), string(core.PersistentVolumeReclaimRecycle), string(core.PersistentVolumeReclaimRetain)) +var supportedVolumeModes = sets.NewString(string(core.PersistentVolumeBlock), string(core.PersistentVolumeFilesystem)) + func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList { metaPath := field.NewPath("metadata") allErrs := ValidateObjectMeta(&pv.ObjectMeta, false, ValidatePersistentVolumeName, metaPath) @@ -1582,7 +1642,11 @@ func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList { allErrs = append(allErrs, field.Invalid(specPath.Child("storageClassName"), pv.Spec.StorageClassName, msg)) } } - + if pv.Spec.VolumeMode != nil && !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + allErrs = append(allErrs, field.Forbidden(specPath.Child("volumeMode"), "PersistentVolume volumeMode is disabled by feature-gate")) + } else if pv.Spec.VolumeMode != nil && !supportedVolumeModes.Has(string(*pv.Spec.VolumeMode)) { + allErrs = append(allErrs, field.NotSupported(specPath.Child("volumeMode"), *pv.Spec.VolumeMode, supportedVolumeModes.List())) + } return allErrs } @@ -1598,6 +1662,11 @@ func ValidatePersistentVolumeUpdate(newPv, oldPv *core.PersistentVolume) field.E } newPv.Status = oldPv.Status + + if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + allErrs = append(allErrs, ValidateImmutableField(newPv.Spec.VolumeMode, oldPv.Spec.VolumeMode, field.NewPath("volumeMode"))...) + } + return allErrs } @@ -1646,6 +1715,11 @@ func ValidatePersistentVolumeClaimSpec(spec *core.PersistentVolumeClaimSpec, fld allErrs = append(allErrs, field.Invalid(fldPath.Child("storageClassName"), *spec.StorageClassName, msg)) } } + if spec.VolumeMode != nil && !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("volumeMode"), "PersistentVolumeClaim volumeMode is disabled by feature-gate")) + } else if spec.VolumeMode != nil && !supportedVolumeModes.Has(string(*spec.VolumeMode)) { + allErrs = append(allErrs, field.NotSupported(fldPath.Child("volumeMode"), *spec.VolumeMode, supportedVolumeModes.List())) + } return allErrs } @@ -1692,6 +1766,10 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl // TODO: remove Beta when no longer needed allErrs = append(allErrs, ValidateImmutableAnnotation(newPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], oldPvc.ObjectMeta.Annotations[v1.BetaStorageClassAnnotation], v1.BetaStorageClassAnnotation, field.NewPath("metadata"))...) + if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + allErrs = append(allErrs, ValidateImmutableField(newPvc.Spec.VolumeMode, oldPvc.Spec.VolumeMode, field.NewPath("volumeMode"))...) + } + newPvc.Status = oldPvc.Status return allErrs } @@ -1975,7 +2053,27 @@ func validateSecretKeySelector(s *core.SecretKeySelector, fldPath *field.Path) f return allErrs } -func ValidateVolumeMounts(mounts []core.VolumeMount, volumes sets.String, container *core.Container, fldPath *field.Path) field.ErrorList { +func GetVolumeMountMap(mounts []core.VolumeMount) map[string]string { + volmounts := make(map[string]string) + + for _, mnt := range mounts { + volmounts[mnt.Name] = mnt.MountPath + } + + return volmounts +} + +func GetVolumeDeviceMap(devices []core.VolumeDevice) map[string]string { + voldevices := make(map[string]string) + + for _, dev := range devices { + voldevices[dev.Name] = dev.DevicePath + } + + return voldevices +} + +func ValidateVolumeMounts(mounts []core.VolumeMount, voldevices map[string]string, volumes map[string]core.VolumeSource, container *core.Container, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} mountpoints := sets.NewString() @@ -1983,7 +2081,8 @@ func ValidateVolumeMounts(mounts []core.VolumeMount, volumes sets.String, contai idxPath := fldPath.Index(i) if len(mnt.Name) == 0 { allErrs = append(allErrs, field.Required(idxPath.Child("name"), "")) - } else if !volumes.Has(mnt.Name) { + } + if !IsMatchedVolume(mnt.Name, volumes) { allErrs = append(allErrs, field.NotFound(idxPath.Child("name"), mnt.Name)) } if len(mnt.MountPath) == 0 { @@ -1993,6 +2092,15 @@ func ValidateVolumeMounts(mounts []core.VolumeMount, volumes sets.String, contai allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be unique")) } mountpoints.Insert(mnt.MountPath) + + // check for overlap with VolumeDevice + if mountNameAlreadyExists(mnt.Name, voldevices) { + allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), mnt.Name, "must not already exist in volumeDevices")) + } + if mountPathAlreadyExists(mnt.MountPath, voldevices) { + allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must not already exist as a path in volumeDevices")) + } + if len(mnt.SubPath) > 0 { allErrs = append(allErrs, validateLocalDescendingPath(mnt.SubPath, fldPath.Child("subPath"))...) } @@ -2004,6 +2112,60 @@ func ValidateVolumeMounts(mounts []core.VolumeMount, volumes sets.String, contai return allErrs } +func ValidateVolumeDevices(devices []core.VolumeDevice, volmounts map[string]string, volumes map[string]core.VolumeSource, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + devicepath := sets.NewString() + devicename := sets.NewString() + + if devices != nil && !utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("volumeDevices"), "Container volumeDevices is disabled by feature-gate")) + return allErrs + } + if devices != nil { + for i, dev := range devices { + idxPath := fldPath.Index(i) + devName := dev.Name + devPath := dev.DevicePath + didMatch, isPVC := isMatchedDevice(devName, volumes) + if len(devName) == 0 { + allErrs = append(allErrs, field.Required(idxPath.Child("name"), "")) + } + if devicename.Has(devName) { + allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), devName, "must be unique")) + } + // Must be PersistentVolumeClaim volume source + if didMatch && !isPVC { + allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), devName, "can only use volume source type of PersistentVolumeClaim for block mode")) + } + if !didMatch { + allErrs = append(allErrs, field.NotFound(idxPath.Child("name"), devName)) + } + if len(devPath) == 0 { + allErrs = append(allErrs, field.Required(idxPath.Child("devicePath"), "")) + } + if devicepath.Has(devPath) { + allErrs = append(allErrs, field.Invalid(idxPath.Child("devicePath"), devPath, "must be unique")) + } + if len(devPath) > 0 && len(validatePathNoBacksteps(devPath, fldPath.Child("devicePath"))) > 0 { + allErrs = append(allErrs, field.Invalid(idxPath.Child("devicePath"), devPath, "can not contain backsteps ('..')")) + } else { + devicepath.Insert(devPath) + } + // check for overlap with VolumeMount + if deviceNameAlreadyExists(devName, volmounts) { + allErrs = append(allErrs, field.Invalid(idxPath.Child("name"), devName, "must not already exist in volumeMounts")) + } + if devicePathAlreadyExists(devPath, volmounts) { + allErrs = append(allErrs, field.Invalid(idxPath.Child("devicePath"), devPath, "must not already exist as a path in volumeMounts")) + } + if len(devName) > 0 { + devicename.Insert(devName) + } + } + } + return allErrs +} + func validateProbe(probe *core.Probe, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -2187,10 +2349,10 @@ func validatePullPolicy(policy core.PullPolicy, fldPath *field.Path) field.Error return allErrors } -func validateInitContainers(containers, otherContainers []core.Container, volumes sets.String, fldPath *field.Path) field.ErrorList { +func validateInitContainers(containers, otherContainers []core.Container, deviceVolumes map[string]core.VolumeSource, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList if len(containers) > 0 { - allErrs = append(allErrs, validateContainers(containers, volumes, fldPath)...) + allErrs = append(allErrs, validateContainers(containers, deviceVolumes, fldPath)...) } allNames := sets.String{} @@ -2218,7 +2380,7 @@ func validateInitContainers(containers, otherContainers []core.Container, volume return allErrs } -func validateContainers(containers []core.Container, volumes sets.String, fldPath *field.Path) field.ErrorList { +func validateContainers(containers []core.Container, volumes map[string]core.VolumeSource, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if len(containers) == 0 { @@ -2229,6 +2391,9 @@ func validateContainers(containers []core.Container, volumes sets.String, fldPat for i, ctr := range containers { idxPath := fldPath.Index(i) namePath := idxPath.Child("name") + volMounts := GetVolumeMountMap(ctr.VolumeMounts) + volDevices := GetVolumeDeviceMap(ctr.VolumeDevices) + if len(ctr.Name) == 0 { allErrs = append(allErrs, field.Required(namePath, "")) } else { @@ -2266,7 +2431,8 @@ func validateContainers(containers []core.Container, volumes sets.String, fldPat allErrs = append(allErrs, validateContainerPorts(ctr.Ports, idxPath.Child("ports"))...) allErrs = append(allErrs, ValidateEnv(ctr.Env, idxPath.Child("env"))...) allErrs = append(allErrs, ValidateEnvFrom(ctr.EnvFrom, idxPath.Child("envFrom"))...) - allErrs = append(allErrs, ValidateVolumeMounts(ctr.VolumeMounts, volumes, &ctr, idxPath.Child("volumeMounts"))...) + allErrs = append(allErrs, ValidateVolumeMounts(ctr.VolumeMounts, volDevices, volumes, &ctr, idxPath.Child("volumeMounts"))...) + allErrs = append(allErrs, ValidateVolumeDevices(ctr.VolumeDevices, volMounts, volumes, idxPath.Child("volumeDevices"))...) allErrs = append(allErrs, validatePullPolicy(ctr.ImagePullPolicy, idxPath.Child("imagePullPolicy"))...) allErrs = append(allErrs, ValidateResourceRequirements(&ctr.Resources, idxPath.Child("resources"))...) allErrs = append(allErrs, ValidateSecurityContext(ctr.SecurityContext, idxPath.Child("securityContext"))...) @@ -2546,10 +2712,10 @@ func ValidatePod(pod *core.Pod) field.ErrorList { func ValidatePodSpec(spec *core.PodSpec, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} - allVolumes, vErrs := ValidateVolumes(spec.Volumes, fldPath.Child("volumes")) + vols, vErrs := ValidateVolumes(spec.Volumes, fldPath.Child("volumes")) allErrs = append(allErrs, vErrs...) - allErrs = append(allErrs, validateContainers(spec.Containers, allVolumes, fldPath.Child("containers"))...) - allErrs = append(allErrs, validateInitContainers(spec.InitContainers, spec.Containers, allVolumes, fldPath.Child("initContainers"))...) + allErrs = append(allErrs, validateContainers(spec.Containers, vols, fldPath.Child("containers"))...) + allErrs = append(allErrs, validateInitContainers(spec.InitContainers, spec.Containers, vols, fldPath.Child("initContainers"))...) allErrs = append(allErrs, validateRestartPolicy(&spec.RestartPolicy, fldPath.Child("restartPolicy"))...) allErrs = append(allErrs, validateDNSPolicy(&spec.DNSPolicy, fldPath.Child("dnsPolicy"))...) allErrs = append(allErrs, unversionedvalidation.ValidateLabels(spec.NodeSelector, fldPath.Child("nodeSelector"))...) diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index 4b8d1373e82..5583eb9a857 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -26,14 +26,12 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/legacyscheme" _ "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/apis/core" - api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/helper" "k8s.io/kubernetes/pkg/capabilities" "k8s.io/kubernetes/pkg/security/apparmor" @@ -82,6 +80,7 @@ func testVolumeWithNodeAffinity(t *testing.T, name string, namespace string, aff } func TestValidatePersistentVolumes(t *testing.T) { + validMode := core.PersistentVolumeFilesystem scenarios := map[string]struct { isExpectedFailure bool volume *core.PersistentVolume @@ -352,6 +351,25 @@ func TestValidatePersistentVolumes(t *testing.T) { StorageClassName: "-invalid-", }), }, + // VolumeMode alpha feature disabled + // TODO: remove when no longer alpha + "alpha disabled valid volume mode": { + isExpectedFailure: true, + volume: testVolume("foo", "", core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(core.HostPathDirectory)), + }, + }, + StorageClassName: "valid", + VolumeMode: &validMode, + }), + }, // LocalVolume alpha feature disabled // TODO: remove when no longer alpha "alpha disabled valid local volume": { @@ -434,38 +452,38 @@ func TestValidatePersistentVolumes(t *testing.T) { } func TestValidatePersistentVolumeSourceUpdate(t *testing.T) { - validVolume := testVolume("foo", "", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), + validVolume := testVolume("foo", "", core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("1G"), }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ Path: "/foo", - Type: newHostPathType(string(api.HostPathDirectory)), + Type: newHostPathType(string(core.HostPathDirectory)), }, }, StorageClassName: "valid", }) validPvSourceNoUpdate := validVolume.DeepCopy() invalidPvSourceUpdateType := validVolume.DeepCopy() - invalidPvSourceUpdateType.Spec.PersistentVolumeSource = api.PersistentVolumeSource{ - FlexVolume: &api.FlexVolumeSource{ + invalidPvSourceUpdateType.Spec.PersistentVolumeSource = core.PersistentVolumeSource{ + FlexVolume: &core.FlexVolumeSource{ Driver: "kubernetes.io/blue", FSType: "ext4", }, } invalidPvSourceUpdateDeep := validVolume.DeepCopy() - invalidPvSourceUpdateDeep.Spec.PersistentVolumeSource = api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ + invalidPvSourceUpdateDeep.Spec.PersistentVolumeSource = core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ Path: "/updated", - Type: newHostPathType(string(api.HostPathDirectory)), + Type: newHostPathType(string(core.HostPathDirectory)), }, } scenarios := map[string]struct { isExpectedFailure bool - oldVolume *api.PersistentVolume - newVolume *api.PersistentVolume + oldVolume *core.PersistentVolume + newVolume *core.PersistentVolume }{ "condition-no-update": { isExpectedFailure: false, @@ -720,6 +738,7 @@ func testVolumeClaimAnnotation(name string, namespace string, ann string, annval func TestValidatePersistentVolumeClaim(t *testing.T) { invalidClassName := "-invalid-" validClassName := "valid" + validMode := core.PersistentVolumeFilesystem scenarios := map[string]struct { isExpectedFailure bool claim *core.PersistentVolumeClaim @@ -888,7 +907,7 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { }, Resources: core.ResourceRequirements{ Requests: core.ResourceList{ - core.ResourceName(api.ResourceStorage): resource.MustParse("0G"), + core.ResourceName(core.ResourceStorage): resource.MustParse("0G"), }, }, }), @@ -916,6 +935,32 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { StorageClassName: &invalidClassName, }), }, + // VolumeMode alpha feature disabled + // TODO: remove when no longer alpha + "disabled alpha valid volume mode": { + isExpectedFailure: true, + claim: testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{ + Selector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "key2", + Operator: "Exists", + }, + }, + }, + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + core.ReadOnlyMany, + }, + Resources: core.ResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + StorageClassName: &validClassName, + VolumeMode: &validMode, + }), + }, } for name, scenario := range scenarios { @@ -929,7 +974,101 @@ func TestValidatePersistentVolumeClaim(t *testing.T) { } } +func TestAlphaPVVolumeModeUpdate(t *testing.T) { + block := core.PersistentVolumeBlock + file := core.PersistentVolumeFilesystem + + scenarios := map[string]struct { + isExpectedFailure bool + oldPV *core.PersistentVolume + newPV *core.PersistentVolume + enableBlock bool + }{ + "valid-update-volume-mode-block-to-block": { + isExpectedFailure: false, + oldPV: createTestVolModePV(&block), + newPV: createTestVolModePV(&block), + enableBlock: true, + }, + "valid-update-volume-mode-file-to-file": { + isExpectedFailure: false, + oldPV: createTestVolModePV(&file), + newPV: createTestVolModePV(&file), + enableBlock: true, + }, + "invalid-update-volume-mode-to-block": { + isExpectedFailure: true, + oldPV: createTestVolModePV(&file), + newPV: createTestVolModePV(&block), + enableBlock: true, + }, + "invalid-update-volume-mode-to-file": { + isExpectedFailure: true, + oldPV: createTestVolModePV(&block), + newPV: createTestVolModePV(&file), + enableBlock: true, + }, + "invalid-update-blocksupport-disabled": { + isExpectedFailure: true, + oldPV: createTestVolModePV(&block), + newPV: createTestVolModePV(&block), + enableBlock: false, + }, + "invalid-update-volume-mode-nil-to-file": { + isExpectedFailure: true, + oldPV: createTestVolModePV(nil), + newPV: createTestVolModePV(&file), + enableBlock: true, + }, + "invalid-update-volume-mode-nil-to-block": { + isExpectedFailure: true, + oldPV: createTestVolModePV(nil), + newPV: createTestVolModePV(&block), + enableBlock: true, + }, + "invalid-update-volume-mode-file-to-nil": { + isExpectedFailure: true, + oldPV: createTestVolModePV(&file), + newPV: createTestVolModePV(nil), + enableBlock: true, + }, + "invalid-update-volume-mode-block-to-nil": { + isExpectedFailure: true, + oldPV: createTestVolModePV(&block), + newPV: createTestVolModePV(nil), + enableBlock: true, + }, + "invalid-update-volume-mode-nil-to-nil": { + isExpectedFailure: false, + oldPV: createTestVolModePV(nil), + newPV: createTestVolModePV(nil), + enableBlock: true, + }, + "invalid-update-volume-mode-empty-to-mode": { + isExpectedFailure: true, + oldPV: createTestPV(), + newPV: createTestVolModePV(&block), + enableBlock: true, + }, + } + + for name, scenario := range scenarios { + // ensure we have a resource version specified for updates + toggleBlockVolumeFeature(scenario.enableBlock, t) + errs := ValidatePersistentVolumeUpdate(scenario.newPV, scenario.oldPV) + if len(errs) == 0 && scenario.isExpectedFailure { + t.Errorf("Unexpected success for scenario: %s", name) + } + if len(errs) > 0 && !scenario.isExpectedFailure { + t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) + } + } +} + func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { + block := core.PersistentVolumeBlock + file := core.PersistentVolumeFilesystem + validClaim := testVolumeClaimWithStatus("foo", "ns", core.PersistentVolumeClaimSpec{ AccessModes: []core.PersistentVolumeAccessMode{ core.ReadWriteOnce, @@ -999,6 +1138,42 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { }, VolumeName: "volume", }) + validClaimVolumeModeFile := testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + }, + VolumeMode: &file, + Resources: core.ResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + VolumeName: "volume", + }) + validClaimVolumeModeBlock := testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + }, + VolumeMode: &block, + Resources: core.ResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + VolumeName: "volume", + }) + invalidClaimVolumeModeNil := testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + }, + VolumeMode: nil, + Resources: core.ResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + VolumeName: "volume", + }) invalidUpdateClaimStorageClass := testVolumeClaimStorageClass("foo", "ns", "fast2", core.PersistentVolumeClaimSpec{ AccessModes: []core.PersistentVolumeAccessMode{ core.ReadOnlyMany, @@ -1080,78 +1255,168 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { oldClaim *core.PersistentVolumeClaim newClaim *core.PersistentVolumeClaim enableResize bool + enableBlock bool }{ "valid-update-volumeName-only": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validUpdateClaim, enableResize: false, + enableBlock: false, }, "valid-no-op-update": { isExpectedFailure: false, oldClaim: validUpdateClaim, newClaim: validUpdateClaim, enableResize: false, + enableBlock: false, }, "invalid-update-change-resources-on-bound-claim": { isExpectedFailure: true, oldClaim: validUpdateClaim, newClaim: invalidUpdateClaimResources, enableResize: false, + enableBlock: false, }, "invalid-update-change-access-modes-on-bound-claim": { isExpectedFailure: true, oldClaim: validUpdateClaim, newClaim: invalidUpdateClaimAccessModes, enableResize: false, + enableBlock: false, + }, + "valid-update-volume-mode-block-to-block": { + isExpectedFailure: false, + oldClaim: validClaimVolumeModeBlock, + newClaim: validClaimVolumeModeBlock, + enableResize: false, + enableBlock: true, + }, + "valid-update-volume-mode-file-to-file": { + isExpectedFailure: false, + oldClaim: validClaimVolumeModeFile, + newClaim: validClaimVolumeModeFile, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-to-block": { + isExpectedFailure: true, + oldClaim: validClaimVolumeModeFile, + newClaim: validClaimVolumeModeBlock, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-to-file": { + isExpectedFailure: true, + oldClaim: validClaimVolumeModeBlock, + newClaim: validClaimVolumeModeFile, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-nil-to-file": { + isExpectedFailure: true, + oldClaim: invalidClaimVolumeModeNil, + newClaim: validClaimVolumeModeFile, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-nil-to-block": { + isExpectedFailure: true, + oldClaim: invalidClaimVolumeModeNil, + newClaim: validClaimVolumeModeBlock, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-block-to-nil": { + isExpectedFailure: true, + oldClaim: validClaimVolumeModeBlock, + newClaim: invalidClaimVolumeModeNil, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-file-to-nil": { + isExpectedFailure: true, + oldClaim: validClaimVolumeModeFile, + newClaim: invalidClaimVolumeModeNil, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-empty-to-mode": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: validClaimVolumeModeBlock, + enableResize: false, + enableBlock: true, + }, + "invalid-update-volume-mode-mode-to-empty": { + isExpectedFailure: true, + oldClaim: validClaimVolumeModeBlock, + newClaim: validClaim, + enableResize: false, + enableBlock: true, + }, + "invalid-update-blocksupport-disabled": { + isExpectedFailure: true, + oldClaim: validClaimVolumeModeFile, + newClaim: validClaimVolumeModeFile, + enableResize: false, + enableBlock: false, }, "invalid-update-change-storage-class-annotation-after-creation": { isExpectedFailure: true, oldClaim: validClaimStorageClass, newClaim: invalidUpdateClaimStorageClass, enableResize: false, + enableBlock: false, }, "valid-update-mutable-annotation": { isExpectedFailure: false, oldClaim: validClaimAnnotation, newClaim: validUpdateClaimMutableAnnotation, enableResize: false, + enableBlock: false, }, "valid-update-add-annotation": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validAddClaimAnnotation, enableResize: false, + enableBlock: false, }, "valid-size-update-resize-disabled": { isExpectedFailure: true, oldClaim: validClaim, newClaim: validSizeUpdate, enableResize: false, + enableBlock: false, }, "valid-size-update-resize-enabled": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validSizeUpdate, enableResize: true, + enableBlock: false, }, "invalid-size-update-resize-enabled": { isExpectedFailure: true, oldClaim: validClaim, newClaim: invalidSizeUpdate, enableResize: true, + enableBlock: false, }, "unbound-size-update-resize-enabled": { isExpectedFailure: true, oldClaim: validClaim, newClaim: unboundSizeUpdate, enableResize: true, + enableBlock: false, }, } for name, scenario := range scenarios { // ensure we have a resource version specified for updates togglePVExpandFeature(scenario.enableResize, t) + toggleBlockVolumeFeature(scenario.enableBlock, t) scenario.oldClaim.ResourceVersion = "1" scenario.newClaim.ResourceVersion = "1" errs := ValidatePersistentVolumeClaimUpdate(scenario.newClaim, scenario.oldClaim) @@ -1164,6 +1429,23 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { } } +func toggleBlockVolumeFeature(toggleFlag bool, t *testing.T) { + if toggleFlag { + // Enable alpha feature BlockVolume + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err != nil { + t.Errorf("Failed to enable feature gate for BlockVolume: %v", err) + return + } + } else { + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err != nil { + t.Errorf("Failed to disable feature gate for BlockVolume: %v", err) + return + } + } +} + func togglePVExpandFeature(toggleFlag bool, t *testing.T) { if toggleFlag { // Enable alpha feature LocalStorageCapacityIsolation @@ -1356,27 +1638,27 @@ func TestValidateGlusterfs(t *testing.T) { func TestValidateCSIVolumeSource(t *testing.T) { testCases := []struct { name string - csi *api.CSIPersistentVolumeSource + csi *core.CSIPersistentVolumeSource errtype field.ErrorType errfield string }{ { name: "all required fields ok", - csi: &api.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true}, + csi: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true}, }, { name: "with default values ok", - csi: &api.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123"}, + csi: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123"}, }, { name: "missing driver name", - csi: &api.CSIPersistentVolumeSource{VolumeHandle: "test-123"}, + csi: &core.CSIPersistentVolumeSource{VolumeHandle: "test-123"}, errtype: field.ErrorTypeRequired, errfield: "driver", }, { name: "missing volume handle", - csi: &api.CSIPersistentVolumeSource{Driver: "my-driver"}, + csi: &core.CSIPersistentVolumeSource{Driver: "my-driver"}, errtype: field.ErrorTypeRequired, errfield: "volumeHandle", }, @@ -2988,7 +3270,7 @@ func TestValidateVolumes(t *testing.T) { t.Errorf("[%d: %q] expected error detail %q, got %q", i, tc.name, tc.errdetail, errs[0].Detail) } } else { - if len(names) != 1 || !names.Has(tc.vol.Name) { + if len(names) != 1 || !IsMatchedVolume(tc.vol.Name, names) { t.Errorf("[%d: %q] wrong names result: %v", i, tc.name, names) } } @@ -3130,6 +3412,153 @@ func TestAlphaHugePagesIsolation(t *testing.T) { } } +func TestAlphaPVCVolumeMode(t *testing.T) { + // Enable alpha feature BlockVolume for PVC + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err != nil { + t.Errorf("Failed to enable feature gate for BlockVolume: %v", err) + return + } + + block := core.PersistentVolumeBlock + file := core.PersistentVolumeFilesystem + fake := core.PersistentVolumeMode("fake") + empty := core.PersistentVolumeMode("") + + // Success Cases + successCasesPVC := map[string]*core.PersistentVolumeClaim{ + "valid block value": createTestVolModePVC(&block), + "valid filesystem value": createTestVolModePVC(&file), + "valid nil value": createTestVolModePVC(nil), + } + for k, v := range successCasesPVC { + if errs := ValidatePersistentVolumeClaim(v); len(errs) != 0 { + t.Errorf("expected success for %s", k) + } + } + + // Error Cases + errorCasesPVC := map[string]*core.PersistentVolumeClaim{ + "invalid value": createTestVolModePVC(&fake), + "empty value": createTestVolModePVC(&empty), + } + for k, v := range errorCasesPVC { + if errs := ValidatePersistentVolumeClaim(v); len(errs) == 0 { + t.Errorf("expected failure for %s", k) + } + } +} + +func TestAlphaPVVolumeMode(t *testing.T) { + // Enable alpha feature BlockVolume for PV + err := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err != nil { + t.Errorf("Failed to enable feature gate for BlockVolume: %v", err) + return + } + + block := core.PersistentVolumeBlock + file := core.PersistentVolumeFilesystem + fake := core.PersistentVolumeMode("fake") + empty := core.PersistentVolumeMode("") + + // Success Cases + successCasesPV := map[string]*core.PersistentVolume{ + "valid block value": createTestVolModePV(&block), + "valid filesystem value": createTestVolModePV(&file), + "valid nil value": createTestVolModePV(nil), + } + for k, v := range successCasesPV { + if errs := ValidatePersistentVolume(v); len(errs) != 0 { + t.Errorf("expected success for %s", k) + } + } + + // Error Cases + errorCasesPV := map[string]*core.PersistentVolume{ + "invalid value": createTestVolModePV(&fake), + "empty value": createTestVolModePV(&empty), + } + for k, v := range errorCasesPV { + if errs := ValidatePersistentVolume(v); len(errs) == 0 { + t.Errorf("expected failure for %s", k) + } + } +} + +func createTestVolModePVC(vmode *core.PersistentVolumeMode) *core.PersistentVolumeClaim { + validName := "valid-storage-class" + + pvc := core.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "default", + }, + Spec: core.PersistentVolumeClaimSpec{ + Resources: core.ResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + StorageClassName: &validName, + VolumeMode: vmode, + }, + } + return &pvc +} + +func createTestVolModePV(vmode *core.PersistentVolumeMode) *core.PersistentVolume { + + // PersistentVolume with VolumeMode set (valid and invalid) + pv := core.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "", + }, + Spec: core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(core.HostPathDirectory)), + }, + }, + StorageClassName: "test-storage-class", + VolumeMode: vmode, + }, + } + return &pv +} + +func createTestPV() *core.PersistentVolume { + + // PersistentVolume with VolumeMode set (valid and invalid) + pv := core.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "", + }, + Spec: core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(core.HostPathDirectory)), + }, + }, + StorageClassName: "test-storage-class", + }, + } + return &pv +} + func TestAlphaLocalStorageCapacityIsolation(t *testing.T) { testCases := []core.VolumeSource{ @@ -3881,7 +4310,16 @@ func TestValidateEnvFrom(t *testing.T) { } func TestValidateVolumeMounts(t *testing.T) { - volumes := sets.NewString("abc", "123", "abc-123") + volumes := []core.Volume{ + {Name: "abc", VolumeSource: core.VolumeSource{PersistentVolumeClaim: &core.PersistentVolumeClaimVolumeSource{ClaimName: "testclaim1"}}}, + {Name: "abc-123", VolumeSource: core.VolumeSource{PersistentVolumeClaim: &core.PersistentVolumeClaimVolumeSource{ClaimName: "testclaim2"}}}, + {Name: "123", VolumeSource: core.VolumeSource{HostPath: &core.HostPathVolumeSource{Path: "/foo/baz", Type: newHostPathType(string(core.HostPathUnset))}}}, + } + vols, v1err := ValidateVolumes(volumes, field.NewPath("field")) + if len(v1err) > 0 { + t.Errorf("Invalid test volume - expected success %v", v1err) + return + } container := core.Container{ SecurityContext: nil, } @@ -3899,7 +4337,11 @@ func TestValidateVolumeMounts(t *testing.T) { {Name: "abc-123", MountPath: "/bac", SubPath: ".baz"}, {Name: "abc-123", MountPath: "/bad", SubPath: "..baz"}, } - if errs := ValidateVolumeMounts(successCase, volumes, &container, field.NewPath("field")); len(errs) != 0 { + goodVolumeDevices := []core.VolumeDevice{ + {Name: "xyz", DevicePath: "/foofoo"}, + {Name: "uvw", DevicePath: "/foofoo/share/test"}, + } + if errs := ValidateVolumeMounts(successCase, GetVolumeDeviceMap(goodVolumeDevices), vols, &container, field.NewPath("field")); len(errs) != 0 { t.Errorf("expected success: %v", errs) } @@ -3913,9 +4355,16 @@ func TestValidateVolumeMounts(t *testing.T) { "subpath contains ..": {{Name: "abc", MountPath: "/bar", SubPath: "baz/../bat"}}, "subpath ends in ..": {{Name: "abc", MountPath: "/bar", SubPath: "./.."}}, "disabled MountPropagation feature gate": {{Name: "abc", MountPath: "/bar", MountPropagation: &propagation}}, + "name exists in volumeDevice": {{Name: "xyz", MountPath: "/bar"}}, + "mountpath exists in volumeDevice": {{Name: "uvw", MountPath: "/mnt/exists"}}, + "both exist in volumeDevice": {{Name: "xyz", MountPath: "/mnt/exists"}}, } + badVolumeDevice := []core.VolumeDevice{ + {Name: "xyz", DevicePath: "/mnt/exists"}, + } + for k, v := range errorCases { - if errs := ValidateVolumeMounts(v, volumes, &container, field.NewPath("field")); len(errs) == 0 { + if errs := ValidateVolumeMounts(v, GetVolumeDeviceMap(badVolumeDevice), vols, &container, field.NewPath("field")); len(errs) == 0 { t.Errorf("expected failure for %s", k) } } @@ -4033,9 +4482,16 @@ func TestValidateMountPropagation(t *testing.T) { return } + volumes := []core.Volume{ + {Name: "foo", VolumeSource: core.VolumeSource{HostPath: &core.HostPathVolumeSource{Path: "/foo/baz", Type: newHostPathType(string(core.HostPathUnset))}}}, + } + vols2, v2err := ValidateVolumes(volumes, field.NewPath("field")) + if len(v2err) > 0 { + t.Errorf("Invalid test volume - expected success %v", v2err) + return + } for i, test := range tests { - volumes := sets.NewString("foo") - errs := ValidateVolumeMounts([]core.VolumeMount{test.mount}, volumes, test.container, field.NewPath("field")) + errs := ValidateVolumeMounts([]core.VolumeMount{test.mount}, nil, vols2, test.container, field.NewPath("field")) if test.expectError && len(errs) == 0 { t.Errorf("test %d expected error, got none", i) } @@ -4043,7 +4499,81 @@ func TestValidateMountPropagation(t *testing.T) { t.Errorf("test %d expected success, got error: %v", i, errs) } } +} +func TestAlphaValidateVolumeDevices(t *testing.T) { + volumes := []core.Volume{ + {Name: "abc", VolumeSource: core.VolumeSource{PersistentVolumeClaim: &core.PersistentVolumeClaimVolumeSource{ClaimName: "testclaim1"}}}, + {Name: "abc-123", VolumeSource: core.VolumeSource{PersistentVolumeClaim: &core.PersistentVolumeClaimVolumeSource{ClaimName: "testclaim2"}}}, + {Name: "def", VolumeSource: core.VolumeSource{HostPath: &core.HostPathVolumeSource{Path: "/foo/baz", Type: newHostPathType(string(core.HostPathUnset))}}}, + } + + vols, v1err := ValidateVolumes(volumes, field.NewPath("field")) + if len(v1err) > 0 { + t.Errorf("Invalid test volumes - expected success %v", v1err) + return + } + + disabledAlphaVolDevice := []core.VolumeDevice{ + {Name: "abc", DevicePath: "/foo"}, + } + + successCase := []core.VolumeDevice{ + {Name: "abc", DevicePath: "/foo"}, + {Name: "abc-123", DevicePath: "/usr/share/test"}, + } + goodVolumeMounts := []core.VolumeMount{ + {Name: "xyz", MountPath: "/foofoo"}, + {Name: "ghi", MountPath: "/foo/usr/share/test"}, + } + + errorCases := map[string][]core.VolumeDevice{ + "empty name": {{Name: "", DevicePath: "/foo"}}, + "duplicate name": {{Name: "abc", DevicePath: "/foo"}, {Name: "abc", DevicePath: "/foo/bar"}}, + "name not found": {{Name: "not-found", DevicePath: "/usr/share/test"}}, + "name found but invalid source": {{Name: "def", DevicePath: "/usr/share/test"}}, + "empty devicepath": {{Name: "abc", DevicePath: ""}}, + "relative devicepath": {{Name: "abc-123", DevicePath: "baz"}}, + "duplicate devicepath": {{Name: "abc", DevicePath: "/foo"}, {Name: "abc-123", DevicePath: "/foo"}}, + "no backsteps": {{Name: "def", DevicePath: "/baz/../"}}, + "name exists in volumemounts": {{Name: "abc", DevicePath: "/baz/../"}}, + "path exists in volumemounts": {{Name: "xyz", DevicePath: "/this/path/exists"}}, + "both exist in volumemounts": {{Name: "abc", DevicePath: "/this/path/exists"}}, + } + badVolumeMounts := []core.VolumeMount{ + {Name: "abc", MountPath: "/foo"}, + {Name: "abc-123", MountPath: "/this/path/exists"}, + } + + // enable Alpha BlockVolume + err1 := utilfeature.DefaultFeatureGate.Set("BlockVolume=true") + if err1 != nil { + t.Errorf("Failed to enable feature gate for BlockVolume: %v", err1) + return + } + // Success Cases: + // Validate normal success cases - only PVC volumeSource + if errs := ValidateVolumeDevices(successCase, GetVolumeMountMap(goodVolumeMounts), vols, field.NewPath("field")); len(errs) != 0 { + t.Errorf("expected success: %v", errs) + } + + // Error Cases: + // Validate normal error cases - only PVC volumeSource + for k, v := range errorCases { + if errs := ValidateVolumeDevices(v, GetVolumeMountMap(badVolumeMounts), vols, field.NewPath("field")); len(errs) == 0 { + t.Errorf("expected failure for %s", k) + } + } + + // disable Alpha BlockVolume + err2 := utilfeature.DefaultFeatureGate.Set("BlockVolume=false") + if err2 != nil { + t.Errorf("Failed to disable feature gate for BlockVolume: %v", err2) + return + } + if errs := ValidateVolumeDevices(disabledAlphaVolDevice, GetVolumeMountMap(goodVolumeMounts), vols, field.NewPath("field")); len(errs) == 0 { + t.Errorf("expected failure: %v", errs) + } } func TestValidateProbe(t *testing.T) { @@ -4158,7 +4688,7 @@ func getResourceLimits(cpu, memory string) core.ResourceList { } func TestValidateContainers(t *testing.T) { - volumes := sets.String{} + volumeDevices := make(map[string]core.VolumeSource) capabilities.SetForTests(capabilities.Capabilities{ AllowPrivileged: true, }) @@ -4328,7 +4858,7 @@ func TestValidateContainers(t *testing.T) { }, {Name: "abc-1234", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File", SecurityContext: fakeValidSecurityContext(true)}, } - if errs := validateContainers(successCase, volumes, field.NewPath("field")); len(errs) != 0 { + if errs := validateContainers(successCase, volumeDevices, field.NewPath("field")); len(errs) != 0 { t.Errorf("expected success: %v", errs) } @@ -4590,7 +5120,7 @@ func TestValidateContainers(t *testing.T) { }, } for k, v := range errorCases { - if errs := validateContainers(v, volumes, field.NewPath("field")); len(errs) == 0 { + if errs := validateContainers(v, volumeDevices, field.NewPath("field")); len(errs) == 0 { t.Errorf("expected failure for %s", k) } } diff --git a/pkg/apis/settings/validation/validation.go b/pkg/apis/settings/validation/validation.go index 1acfef0d76e..50ac75aab44 100644 --- a/pkg/apis/settings/validation/validation.go +++ b/pkg/apis/settings/validation/validation.go @@ -43,11 +43,11 @@ func ValidatePodPresetSpec(spec *settings.PodPresetSpec, fldPath *field.Path) fi allErrs = append(allErrs, field.Required(fldPath.Child("volumes", "env", "envFrom", "volumeMounts"), "must specify at least one")) } - volumes, vErrs := apivalidation.ValidateVolumes(spec.Volumes, fldPath.Child("volumes")) + vols, vErrs := apivalidation.ValidateVolumes(spec.Volumes, fldPath.Child("volumes")) allErrs = append(allErrs, vErrs...) allErrs = append(allErrs, apivalidation.ValidateEnv(spec.Env, fldPath.Child("env"))...) allErrs = append(allErrs, apivalidation.ValidateEnvFrom(spec.EnvFrom, fldPath.Child("envFrom"))...) - allErrs = append(allErrs, apivalidation.ValidateVolumeMounts(spec.VolumeMounts, volumes, nil, fldPath.Child("volumeMounts"))...) + allErrs = append(allErrs, apivalidation.ValidateVolumeMounts(spec.VolumeMounts, nil, vols, nil, fldPath.Child("volumeMounts"))...) return allErrs } diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 14890722178..cc70071263d 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -187,6 +187,12 @@ const ( // // Enable mount/attachment of Container Storage Interface (CSI) backed PVs CSIPersistentVolume utilfeature.Feature = "CSIPersistentVolume" + + // owner: @screeley44 + // alpha: v1.9 + // + // Enable Block volume support in containers. + BlockVolume utilfeature.Feature = "BlockVolume" ) func init() { @@ -222,6 +228,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS MountContainers: {Default: false, PreRelease: utilfeature.Alpha}, VolumeScheduling: {Default: false, PreRelease: utilfeature.Alpha}, CSIPersistentVolume: {Default: false, PreRelease: utilfeature.Alpha}, + BlockVolume: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/pkg/registry/core/persistentvolume/strategy.go b/pkg/registry/core/persistentvolume/strategy.go index 924baabe109..477bca2bad5 100644 --- a/pkg/registry/core/persistentvolume/strategy.go +++ b/pkg/registry/core/persistentvolume/strategy.go @@ -28,6 +28,7 @@ import ( "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api/legacyscheme" + pvutil "k8s.io/kubernetes/pkg/api/persistentvolume" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" volumevalidation "k8s.io/kubernetes/pkg/volume/validation" @@ -51,6 +52,8 @@ func (persistentvolumeStrategy) NamespaceScoped() bool { func (persistentvolumeStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { pv := obj.(*api.PersistentVolume) pv.Status = api.PersistentVolumeStatus{} + + pvutil.DropDisabledAlphaFields(&pv.Spec) } func (persistentvolumeStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { @@ -72,6 +75,9 @@ func (persistentvolumeStrategy) PrepareForUpdate(ctx genericapirequest.Context, newPv := obj.(*api.PersistentVolume) oldPv := old.(*api.PersistentVolume) newPv.Status = oldPv.Status + + pvutil.DropDisabledAlphaFields(&newPv.Spec) + pvutil.DropDisabledAlphaFields(&oldPv.Spec) } func (persistentvolumeStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { diff --git a/pkg/registry/core/persistentvolumeclaim/strategy.go b/pkg/registry/core/persistentvolumeclaim/strategy.go index 1d9f3be68c4..1a63e1faea8 100644 --- a/pkg/registry/core/persistentvolumeclaim/strategy.go +++ b/pkg/registry/core/persistentvolumeclaim/strategy.go @@ -28,6 +28,7 @@ import ( "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api/legacyscheme" + pvcutil "k8s.io/kubernetes/pkg/api/persistentvolumeclaim" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/validation" ) @@ -48,8 +49,10 @@ func (persistentvolumeclaimStrategy) NamespaceScoped() bool { // PrepareForCreate clears the Status field which is not allowed to be set by end users on creation. func (persistentvolumeclaimStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { - pv := obj.(*api.PersistentVolumeClaim) - pv.Status = api.PersistentVolumeClaimStatus{} + pvc := obj.(*api.PersistentVolumeClaim) + pvc.Status = api.PersistentVolumeClaimStatus{} + + pvcutil.DropDisabledAlphaFields(&pvc.Spec) } func (persistentvolumeclaimStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { @@ -70,6 +73,9 @@ func (persistentvolumeclaimStrategy) PrepareForUpdate(ctx genericapirequest.Cont newPvc := obj.(*api.PersistentVolumeClaim) oldPvc := old.(*api.PersistentVolumeClaim) newPvc.Status = oldPvc.Status + + pvcutil.DropDisabledAlphaFields(&newPvc.Spec) + pvcutil.DropDisabledAlphaFields(&oldPvc.Spec) } func (persistentvolumeclaimStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 5865795b1b1..900454c6963 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -527,6 +527,11 @@ type PersistentVolumeSpec struct { // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options // +optional MountOptions []string `json:"mountOptions,omitempty" protobuf:"bytes,7,opt,name=mountOptions"` + // volumeMode defines if a volume is intended to be used with a formatted filesystem + // or to remain in raw block state. Value of Filesystem is implied when not included in spec. + // This is an alpha feature and may change in the future. + // +optional + VolumeMode *PersistentVolumeMode `json:"volumeMode,omitempty" protobuf:"bytes,8,opt,name=volumeMode,casttype=PersistentVolumeMode"` } // PersistentVolumeReclaimPolicy describes a policy for end-of-life maintenance of persistent volumes. @@ -544,6 +549,16 @@ const ( PersistentVolumeReclaimRetain PersistentVolumeReclaimPolicy = "Retain" ) +// PersistentVolumeMode describes how a volume is intended to be consumed, either Block or Filesystem. +type PersistentVolumeMode string + +const ( + // PersistentVolumeBlock means the volume will not be formatted with a filesystem and will remain a raw block device. + PersistentVolumeBlock PersistentVolumeMode = "Block" + // PersistentVolumeFilesystem means the volume will be or is formatted with a filesystem. + PersistentVolumeFilesystem PersistentVolumeMode = "Filesystem" +) + // PersistentVolumeStatus is the current status of a persistent volume. type PersistentVolumeStatus struct { // Phase indicates if a volume is available, bound to a claim, or released by a claim. @@ -631,6 +646,11 @@ type PersistentVolumeClaimSpec struct { // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 // +optional StorageClassName *string `json:"storageClassName,omitempty" protobuf:"bytes,5,opt,name=storageClassName"` + // volumeMode defines what type of volume is required by the claim. + // Value of Filesystem is implied when not included in claim spec. + // This is an alpha feature and may change in the future. + // +optional + VolumeMode *PersistentVolumeMode `json:"volumeMode,omitempty" protobuf:"bytes,6,opt,name=volumeMode,casttype=PersistentVolumeMode"` } // PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type @@ -1709,6 +1729,14 @@ const ( MountPropagationBidirectional MountPropagationMode = "Bidirectional" ) +// volumeDevice describes a mapping of a raw block device within a container. +type VolumeDevice struct { + // name must match the name of a persistentVolumeClaim in the pod + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // devicePath is the path inside of the container that the device will be mapped to. + DevicePath string `json:"devicePath" protobuf:"bytes,2,opt,name=devicePath"` +} + // EnvVar represents an environment variable present in a Container. type EnvVar struct { // Name of the environment variable. Must be a C_IDENTIFIER. @@ -2052,6 +2080,12 @@ type Container struct { // +patchMergeKey=mountPath // +patchStrategy=merge VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" patchStrategy:"merge" patchMergeKey:"mountPath" protobuf:"bytes,9,rep,name=volumeMounts"` + // volumeDevices is the list of block devices to be used by the container. + // This is an alpha feature and may change in the future. + // +patchMergeKey=devicePath + // +patchStrategy=merge + // +optional + VolumeDevices []VolumeDevice `json:"volumeDevices,omitempty" patchStrategy:"merge" patchMergeKey:"devicePath" protobuf:"bytes,21,rep,name=volumeDevices"` // Periodic probe of container liveness. // Container will be restarted if the probe fails. // Cannot be updated. From de4138d82831f1e3a7aeb4f2a7a8a01928c7e75c Mon Sep 17 00:00:00 2001 From: Scott Creeley Date: Sat, 18 Nov 2017 11:57:29 -0500 Subject: [PATCH 2/2] generated code for VolumeMode api change --- api/openapi-spec/swagger.json | 34 + api/swagger-spec/apps_v1.json | 33 + api/swagger-spec/apps_v1beta1.json | 33 + api/swagger-spec/apps_v1beta2.json | 33 + api/swagger-spec/batch_v1.json | 25 + api/swagger-spec/batch_v1beta1.json | 25 + api/swagger-spec/batch_v2alpha1.json | 25 + api/swagger-spec/extensions_v1beta1.json | 25 + api/swagger-spec/v1.json | 37 + docs/api-reference/apps/v1/definitions.html | 141 +- .../apps/v1beta1/definitions.html | 141 +- .../apps/v1beta2/definitions.html | 141 +- docs/api-reference/batch/v1/definitions.html | 48 + .../batch/v1beta1/definitions.html | 48 + .../batch/v2alpha1/definitions.html | 48 + .../extensions/v1beta1/definitions.html | 48 + docs/api-reference/v1/definitions.html | 66 + pkg/BUILD | 1 + pkg/api/persistentvolume/BUILD | 8 +- pkg/api/persistentvolumeclaim/BUILD | 14 +- pkg/api/pod/BUILD | 2 + pkg/apis/core/v1/BUILD | 3 + pkg/apis/core/v1/zz_generated.conversion.go | 30 + pkg/apis/core/validation/BUILD | 1 - pkg/apis/core/zz_generated.deepcopy.go | 39 + pkg/registry/core/persistentvolume/BUILD | 1 + pkg/registry/core/persistentvolumeclaim/BUILD | 1 + .../src/k8s.io/api/core/v1/generated.pb.go | 1808 ++++++++++------- .../src/k8s.io/api/core/v1/generated.proto | 28 + .../core/v1/types_swagger_doc_generated.go | 13 + .../api/core/v1/zz_generated.deepcopy.go | 39 + 31 files changed, 2056 insertions(+), 883 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index fe94d4f054c..6abaa389539 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -73936,6 +73936,15 @@ "description": "Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.", "type": "boolean" }, + "volumeDevices": { + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.VolumeDevice" + }, + "x-kubernetes-patch-merge-key": "devicePath", + "x-kubernetes-patch-strategy": "merge" + }, "volumeMounts": { "description": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "type": "array", @@ -75704,6 +75713,10 @@ "description": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "type": "string" }, + "volumeMode": { + "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.", + "type": "string" + }, "volumeName": { "description": "VolumeName is the binding reference to the PersistentVolume backing this claim.", "type": "string" @@ -75912,6 +75925,10 @@ "description": "StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://releases.k8s.io/HEAD/examples/volumes/storageos/README.md", "$ref": "#/definitions/io.k8s.api.core.v1.StorageOSPersistentVolumeSource" }, + "volumeMode": { + "description": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec. This is an alpha feature and may change in the future.", + "type": "string" + }, "vsphereVolume": { "description": "VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine", "$ref": "#/definitions/io.k8s.api.core.v1.VsphereVirtualDiskVolumeSource" @@ -77762,6 +77779,23 @@ } } }, + "io.k8s.api.core.v1.VolumeDevice": { + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "devicePath": { + "description": "devicePath is the path inside of the container that the device will be mapped to.", + "type": "string" + }, + "name": { + "description": "name must match the name of a persistentVolumeClaim in the pod", + "type": "string" + } + } + }, "io.k8s.api.core.v1.VolumeMount": { "description": "VolumeMount describes a mounting of a Volume within a container.", "required": [ diff --git a/api/swagger-spec/apps_v1.json b/api/swagger-spec/apps_v1.json index 1c568002396..988e11dfae7 100644 --- a/api/swagger-spec/apps_v1.json +++ b/api/swagger-spec/apps_v1.json @@ -7825,6 +7825,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -8077,6 +8084,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", @@ -9268,6 +9293,10 @@ "storageClassName": { "type": "string", "description": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1" + }, + "volumeMode": { + "$ref": "v1.PersistentVolumeMode", + "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future." } } }, @@ -9275,6 +9304,10 @@ "id": "v1.PersistentVolumeAccessMode", "properties": {} }, + "v1.PersistentVolumeMode": { + "id": "v1.PersistentVolumeMode", + "properties": {} + }, "v1.PersistentVolumeClaimStatus": { "id": "v1.PersistentVolumeClaimStatus", "description": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 10c2c6d6154..85edb809395 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -5459,6 +5459,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -5711,6 +5718,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", @@ -6576,6 +6601,10 @@ "storageClassName": { "type": "string", "description": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1" + }, + "volumeMode": { + "$ref": "v1.PersistentVolumeMode", + "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future." } } }, @@ -6583,6 +6612,10 @@ "id": "v1.PersistentVolumeAccessMode", "properties": {} }, + "v1.PersistentVolumeMode": { + "id": "v1.PersistentVolumeMode", + "properties": {} + }, "v1.PersistentVolumeClaimStatus": { "id": "v1.PersistentVolumeClaimStatus", "description": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index 8108a100106..893781217a4 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -7824,6 +7824,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -8076,6 +8083,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", @@ -9266,6 +9291,10 @@ "storageClassName": { "type": "string", "description": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1" + }, + "volumeMode": { + "$ref": "v1.PersistentVolumeMode", + "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future." } } }, @@ -9273,6 +9302,10 @@ "id": "v1.PersistentVolumeAccessMode", "properties": {} }, + "v1.PersistentVolumeMode": { + "id": "v1.PersistentVolumeMode", + "properties": {} + }, "v1.PersistentVolumeClaimStatus": { "id": "v1.PersistentVolumeClaimStatus", "description": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 4baf3b1a6f7..d1c7e2e7073 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -2799,6 +2799,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -3051,6 +3058,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", diff --git a/api/swagger-spec/batch_v1beta1.json b/api/swagger-spec/batch_v1beta1.json index d6463d9bdc1..b3b324e6c44 100644 --- a/api/swagger-spec/batch_v1beta1.json +++ b/api/swagger-spec/batch_v1beta1.json @@ -2854,6 +2854,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -3106,6 +3113,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json index 9c8b2ee61d1..b39bc5b19bb 100644 --- a/api/swagger-spec/batch_v2alpha1.json +++ b/api/swagger-spec/batch_v2alpha1.json @@ -2854,6 +2854,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -3106,6 +3113,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index e941401a421..fc45089dacc 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -8467,6 +8467,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -8719,6 +8726,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 84eb41c2794..f4691cefeb4 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -20323,6 +20323,10 @@ "storageClassName": { "type": "string", "description": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1" + }, + "volumeMode": { + "$ref": "v1.PersistentVolumeMode", + "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future." } } }, @@ -20386,6 +20390,10 @@ } } }, + "v1.PersistentVolumeMode": { + "id": "v1.PersistentVolumeMode", + "properties": {} + }, "v1.PersistentVolumeClaimStatus": { "id": "v1.PersistentVolumeClaimStatus", "description": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", @@ -20621,6 +20629,10 @@ "type": "string" }, "description": "A list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options" + }, + "volumeMode": { + "$ref": "v1.PersistentVolumeMode", + "description": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec. This is an alpha feature and may change in the future." } } }, @@ -22147,6 +22159,13 @@ }, "description": "Pod volumes to mount into the container's filesystem. Cannot be updated." }, + "volumeDevices": { + "type": "array", + "items": { + "$ref": "v1.VolumeDevice" + }, + "description": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future." + }, "livenessProbe": { "$ref": "v1.Probe", "description": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes" @@ -22385,6 +22404,24 @@ "id": "v1.MountPropagationMode", "properties": {} }, + "v1.VolumeDevice": { + "id": "v1.VolumeDevice", + "description": "volumeDevice describes a mapping of a raw block device within a container.", + "required": [ + "name", + "devicePath" + ], + "properties": { + "name": { + "type": "string", + "description": "name must match the name of a persistentVolumeClaim in the pod" + }, + "devicePath": { + "type": "string", + "description": "devicePath is the path inside of the container that the device will be mapped to." + } + } + }, "v1.Probe": { "id": "v1.Probe", "description": "Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.", diff --git a/docs/api-reference/apps/v1/definitions.html b/docs/api-reference/apps/v1/definitions.html index 15e6b843ee6..01b0c94bd47 100755 --- a/docs/api-reference/apps/v1/definitions.html +++ b/docs/api-reference/apps/v1/definitions.html @@ -955,6 +955,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

string

+ +

volumeMode

+

volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.

+

false

+

v1.PersistentVolumeMode

+ + @@ -3072,6 +3079,10 @@ When an object is created, the system will populate this list with the current s + +
+

v1.PersistentVolumeMode

+

v1.DeleteOptions

@@ -3460,6 +3471,47 @@ When an object is created, the system will populate this list with the current s +
+
+

v1.WeightedPodAffinityTerm

+
+

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

weight

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.

true

integer (int32)

podAffinityTerm

Required. A pod affinity term, associated with the corresponding weight.

true

v1.PodAffinityTerm

+

v1.Probe

@@ -3543,47 +3595,6 @@ When an object is created, the system will populate this list with the current s -
-
-

v1.WeightedPodAffinityTerm

-
-

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

weight

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.

true

integer (int32)

podAffinityTerm

Required. A pod affinity term, associated with the corresponding weight.

true

v1.PodAffinityTerm

-

v1.RollingUpdateStatefulSetStrategy

@@ -5496,6 +5507,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -5983,6 +6001,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 6f2939cf3c9..b27ff5f9091 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -983,6 +983,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

string

+ +

volumeMode

+

volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.

+

false

+

v1.PersistentVolumeMode

+ + @@ -3004,6 +3011,10 @@ When an object is created, the system will populate this list with the current s +
+
+

v1.PersistentVolumeMode

+

v1.DeleteOptions

@@ -3457,6 +3468,47 @@ The StatefulSet guarantees that a given network identity will always map to the +
+
+

v1.WeightedPodAffinityTerm

+
+

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

weight

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.

true

integer (int32)

podAffinityTerm

Required. A pod affinity term, associated with the corresponding weight.

true

v1.PodAffinityTerm

+

v1.Probe

@@ -3540,47 +3592,6 @@ The StatefulSet guarantees that a given network identity will always map to the -
-
-

v1.WeightedPodAffinityTerm

-
-

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

weight

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.

true

integer (int32)

podAffinityTerm

Required. A pod affinity term, associated with the corresponding weight.

true

v1.PodAffinityTerm

-

v1beta1.DeploymentSpec

@@ -5631,6 +5642,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -5981,6 +5999,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index 41e981618f0..66801276d66 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -930,6 +930,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

string

+ +

volumeMode

+

volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.

+

false

+

v1.PersistentVolumeMode

+ + @@ -3710,6 +3717,10 @@ When an object is created, the system will populate this list with the current s +
+
+

v1.PersistentVolumeMode

+

v1beta2.StatefulSet

@@ -4163,6 +4174,47 @@ The StatefulSet guarantees that a given network identity will always map to the +
+
+

v1.WeightedPodAffinityTerm

+
+

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

weight

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.

true

integer (int32)

podAffinityTerm

Required. A pod affinity term, associated with the corresponding weight.

true

v1.PodAffinityTerm

+

v1.Probe

@@ -4246,47 +4298,6 @@ The StatefulSet guarantees that a given network identity will always map to the -
-
-

v1.WeightedPodAffinityTerm

-
-

The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

weight

weight associated with matching the corresponding podAffinityTerm, in the range 1-100.

true

integer (int32)

podAffinityTerm

Required. A pod affinity term, associated with the corresponding weight.

true

v1.PodAffinityTerm

-

v1.SecretKeySelector

@@ -5965,6 +5976,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -6260,6 +6278,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 4bb09de4cee..92aedb32123 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -4447,6 +4447,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -4811,6 +4818,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/batch/v1beta1/definitions.html b/docs/api-reference/batch/v1beta1/definitions.html index eda9b9acc19..a83168f3198 100755 --- a/docs/api-reference/batch/v1beta1/definitions.html +++ b/docs/api-reference/batch/v1beta1/definitions.html @@ -4598,6 +4598,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -4893,6 +4900,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/batch/v2alpha1/definitions.html b/docs/api-reference/batch/v2alpha1/definitions.html index 43432ec8568..5fe4f19c4a2 100755 --- a/docs/api-reference/batch/v2alpha1/definitions.html +++ b/docs/api-reference/batch/v2alpha1/definitions.html @@ -4454,6 +4454,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -4749,6 +4756,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 2d590325677..44cf099e50d 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -6351,6 +6351,13 @@ Both these may change in the future. Incoming requests are matched against the h +

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -6756,6 +6763,47 @@ Both these may change in the future. Incoming requests are matched against the h +
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 5afcf31829d..839b2305c2d 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -1129,6 +1129,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

string

+ +

volumeMode

+

volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.

+

false

+

v1.PersistentVolumeMode

+ + @@ -4456,6 +4463,10 @@ The resulting set of endpoints can be viewed as:
+
+
+

v1.PersistentVolumeMode

+

v1.DeleteOptions

@@ -7478,6 +7489,13 @@ Examples:
+

volumeDevices

+

volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.

+

false

+

v1.VolumeDevice array

+ + +

livenessProbe

Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes

false

@@ -7834,6 +7852,13 @@ Examples:

string array

+ +

volumeMode

+

volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec. This is an alpha feature and may change in the future.

+

false

+

v1.PersistentVolumeMode

+ + @@ -8309,6 +8334,47 @@ Examples:
+
+
+

v1.VolumeDevice

+
+

volumeDevice describes a mapping of a raw block device within a container.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

name must match the name of a persistentVolumeClaim in the pod

true

string

devicePath

devicePath is the path inside of the container that the device will be mapped to.

true

string

+

v1.NodeSelectorRequirement

diff --git a/pkg/BUILD b/pkg/BUILD index fc74d006478..daabfd319ae 100644 --- a/pkg/BUILD +++ b/pkg/BUILD @@ -15,6 +15,7 @@ filegroup( "//pkg/api/events:all-srcs", "//pkg/api/legacyscheme:all-srcs", "//pkg/api/persistentvolume:all-srcs", + "//pkg/api/persistentvolumeclaim:all-srcs", "//pkg/api/pod:all-srcs", "//pkg/api/ref:all-srcs", "//pkg/api/resource:all-srcs", diff --git a/pkg/api/persistentvolume/BUILD b/pkg/api/persistentvolume/BUILD index 61a8714b8fd..f65e81e9f27 100644 --- a/pkg/api/persistentvolume/BUILD +++ b/pkg/api/persistentvolume/BUILD @@ -10,7 +10,11 @@ go_library( name = "go_default_library", srcs = ["util.go"], importpath = "k8s.io/kubernetes/pkg/api/persistentvolume", - deps = ["//pkg/apis/core:go_default_library"], + deps = [ + "//pkg/apis/core:go_default_library", + "//pkg/features:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + ], ) filegroup( @@ -33,7 +37,9 @@ go_test( library = ":go_default_library", deps = [ "//pkg/apis/core:go_default_library", + "//pkg/features:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/api/persistentvolumeclaim/BUILD b/pkg/api/persistentvolumeclaim/BUILD index 26471bdb6db..6c1cea847cd 100644 --- a/pkg/api/persistentvolumeclaim/BUILD +++ b/pkg/api/persistentvolumeclaim/BUILD @@ -9,7 +9,12 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], - deps = ["//pkg/api:go_default_library"], + importpath = "k8s.io/kubernetes/pkg/api/persistentvolumeclaim", + deps = [ + "//pkg/apis/core:go_default_library", + "//pkg/features:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + ], ) filegroup( @@ -28,10 +33,11 @@ filegroup( go_test( name = "go_default_test", srcs = ["util_test.go"], + importpath = "k8s.io/kubernetes/pkg/api/persistentvolumeclaim", library = ":go_default_library", deps = [ - "//pkg/api:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//pkg/apis/core:go_default_library", + "//pkg/features:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/api/pod/BUILD b/pkg/api/pod/BUILD index b48e4ebb58c..7b189d02eff 100644 --- a/pkg/api/pod/BUILD +++ b/pkg/api/pod/BUILD @@ -38,7 +38,9 @@ go_test( library = ":go_default_library", deps = [ "//pkg/apis/core:go_default_library", + "//pkg/features:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/apis/core/v1/BUILD b/pkg/apis/core/v1/BUILD index 9c49ad4c0e0..5796c614076 100644 --- a/pkg/apis/core/v1/BUILD +++ b/pkg/apis/core/v1/BUILD @@ -15,6 +15,7 @@ go_library( deps = [ "//pkg/apis/core:go_default_library", "//pkg/apis/extensions:go_default_library", + "//pkg/features:go_default_library", "//pkg/util/parsers:go_default_library", "//pkg/util/pointer:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -26,6 +27,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -54,6 +56,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 2c086be3a06..fd201cb99c0 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -391,6 +391,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_core_Toleration_To_v1_Toleration, Convert_v1_Volume_To_core_Volume, Convert_core_Volume_To_v1_Volume, + Convert_v1_VolumeDevice_To_core_VolumeDevice, + Convert_core_VolumeDevice_To_v1_VolumeDevice, Convert_v1_VolumeMount_To_core_VolumeMount, Convert_core_VolumeMount_To_v1_VolumeMount, Convert_v1_VolumeProjection_To_core_VolumeProjection, @@ -991,6 +993,7 @@ func autoConvert_v1_Container_To_core_Container(in *v1.Container, out *core.Cont return err } out.VolumeMounts = *(*[]core.VolumeMount)(unsafe.Pointer(&in.VolumeMounts)) + out.VolumeDevices = *(*[]core.VolumeDevice)(unsafe.Pointer(&in.VolumeDevices)) out.LivenessProbe = (*core.Probe)(unsafe.Pointer(in.LivenessProbe)) out.ReadinessProbe = (*core.Probe)(unsafe.Pointer(in.ReadinessProbe)) out.Lifecycle = (*core.Lifecycle)(unsafe.Pointer(in.Lifecycle)) @@ -1030,6 +1033,7 @@ func autoConvert_core_Container_To_v1_Container(in *core.Container, out *v1.Cont return err } out.VolumeMounts = *(*[]v1.VolumeMount)(unsafe.Pointer(&in.VolumeMounts)) + out.VolumeDevices = *(*[]v1.VolumeDevice)(unsafe.Pointer(&in.VolumeDevices)) out.LivenessProbe = (*v1.Probe)(unsafe.Pointer(in.LivenessProbe)) out.ReadinessProbe = (*v1.Probe)(unsafe.Pointer(in.ReadinessProbe)) out.Lifecycle = (*v1.Lifecycle)(unsafe.Pointer(in.Lifecycle)) @@ -3034,6 +3038,7 @@ func autoConvert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec( } out.VolumeName = in.VolumeName out.StorageClassName = (*string)(unsafe.Pointer(in.StorageClassName)) + out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) return nil } @@ -3050,6 +3055,7 @@ func autoConvert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec( } out.VolumeName = in.VolumeName out.StorageClassName = (*string)(unsafe.Pointer(in.StorageClassName)) + out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) return nil } @@ -3220,6 +3226,7 @@ func autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.Per out.PersistentVolumeReclaimPolicy = core.PersistentVolumeReclaimPolicy(in.PersistentVolumeReclaimPolicy) out.StorageClassName = in.StorageClassName out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) + out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) return nil } @@ -3238,6 +3245,7 @@ func autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.P out.PersistentVolumeReclaimPolicy = v1.PersistentVolumeReclaimPolicy(in.PersistentVolumeReclaimPolicy) out.StorageClassName = in.StorageClassName out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) + out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) return nil } @@ -5281,6 +5289,28 @@ func Convert_core_Volume_To_v1_Volume(in *core.Volume, out *v1.Volume, s convers return autoConvert_core_Volume_To_v1_Volume(in, out, s) } +func autoConvert_v1_VolumeDevice_To_core_VolumeDevice(in *v1.VolumeDevice, out *core.VolumeDevice, s conversion.Scope) error { + out.Name = in.Name + out.DevicePath = in.DevicePath + return nil +} + +// Convert_v1_VolumeDevice_To_core_VolumeDevice is an autogenerated conversion function. +func Convert_v1_VolumeDevice_To_core_VolumeDevice(in *v1.VolumeDevice, out *core.VolumeDevice, s conversion.Scope) error { + return autoConvert_v1_VolumeDevice_To_core_VolumeDevice(in, out, s) +} + +func autoConvert_core_VolumeDevice_To_v1_VolumeDevice(in *core.VolumeDevice, out *v1.VolumeDevice, s conversion.Scope) error { + out.Name = in.Name + out.DevicePath = in.DevicePath + return nil +} + +// Convert_core_VolumeDevice_To_v1_VolumeDevice is an autogenerated conversion function. +func Convert_core_VolumeDevice_To_v1_VolumeDevice(in *core.VolumeDevice, out *v1.VolumeDevice, s conversion.Scope) error { + return autoConvert_core_VolumeDevice_To_v1_VolumeDevice(in, out, s) +} + func autoConvert_v1_VolumeMount_To_core_VolumeMount(in *v1.VolumeMount, out *core.VolumeMount, s conversion.Scope) error { out.Name = in.Name out.ReadOnly = in.ReadOnly diff --git a/pkg/apis/core/validation/BUILD b/pkg/apis/core/validation/BUILD index ef2778079d9..acdbf6cc8ad 100644 --- a/pkg/apis/core/validation/BUILD +++ b/pkg/apis/core/validation/BUILD @@ -61,7 +61,6 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index 7945f5a54e4..1cdcce3b28a 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -706,6 +706,11 @@ func (in *Container) DeepCopyInto(out *Container) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.VolumeDevices != nil { + in, out := &in.VolumeDevices, &out.VolumeDevices + *out = make([]VolumeDevice, len(*in)) + copy(*out, *in) + } if in.LivenessProbe != nil { in, out := &in.LivenessProbe, &out.LivenessProbe if *in == nil { @@ -2885,6 +2890,15 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec **out = **in } } + if in.VolumeMode != nil { + in, out := &in.VolumeMode, &out.VolumeMode + if *in == nil { + *out = nil + } else { + *out = new(PersistentVolumeMode) + **out = **in + } + } return } @@ -3227,6 +3241,15 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.VolumeMode != nil { + in, out := &in.VolumeMode, &out.VolumeMode + if *in == nil { + *out = nil + } else { + *out = new(PersistentVolumeMode) + **out = **in + } + } return } @@ -5320,6 +5343,22 @@ func (in *Volume) DeepCopy() *Volume { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeDevice) DeepCopyInto(out *VolumeDevice) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeDevice. +func (in *VolumeDevice) DeepCopy() *VolumeDevice { + if in == nil { + return nil + } + out := new(VolumeDevice) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VolumeMount) DeepCopyInto(out *VolumeMount) { *out = *in diff --git a/pkg/registry/core/persistentvolume/BUILD b/pkg/registry/core/persistentvolume/BUILD index eefda27f79b..b98e547e596 100644 --- a/pkg/registry/core/persistentvolume/BUILD +++ b/pkg/registry/core/persistentvolume/BUILD @@ -15,6 +15,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/registry/core/persistentvolume", deps = [ "//pkg/api/legacyscheme:go_default_library", + "//pkg/api/persistentvolume:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/apis/core/validation:go_default_library", "//pkg/volume/validation:go_default_library", diff --git a/pkg/registry/core/persistentvolumeclaim/BUILD b/pkg/registry/core/persistentvolumeclaim/BUILD index cd9b8110b78..6da3f612b1a 100644 --- a/pkg/registry/core/persistentvolumeclaim/BUILD +++ b/pkg/registry/core/persistentvolumeclaim/BUILD @@ -15,6 +15,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/registry/core/persistentvolumeclaim", deps = [ "//pkg/api/legacyscheme:go_default_library", + "//pkg/api/persistentvolumeclaim:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/apis/core/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index bf325e7a411..1536d99624e 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -201,6 +201,7 @@ limitations under the License. Taint Toleration Volume + VolumeDevice VolumeMount VolumeProjection VolumeSource @@ -989,28 +990,32 @@ func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } +func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } +func (*VolumeDevice) ProtoMessage() {} +func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } + func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{179} + return fileDescriptorGenerated, []int{180} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{180} + return fileDescriptorGenerated, []int{181} } func init() { @@ -1190,6 +1195,7 @@ func init() { proto.RegisterType((*Taint)(nil), "k8s.io.api.core.v1.Taint") proto.RegisterType((*Toleration)(nil), "k8s.io.api.core.v1.Toleration") proto.RegisterType((*Volume)(nil), "k8s.io.api.core.v1.Volume") + proto.RegisterType((*VolumeDevice)(nil), "k8s.io.api.core.v1.VolumeDevice") proto.RegisterType((*VolumeMount)(nil), "k8s.io.api.core.v1.VolumeMount") proto.RegisterType((*VolumeProjection)(nil), "k8s.io.api.core.v1.VolumeProjection") proto.RegisterType((*VolumeSource)(nil), "k8s.io.api.core.v1.VolumeSource") @@ -2336,6 +2342,20 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.TerminationMessagePolicy))) i += copy(dAtA[i:], m.TerminationMessagePolicy) + if len(m.VolumeDevices) > 0 { + for _, msg := range m.VolumeDevices { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -5750,6 +5770,12 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(len(*m.StorageClassName))) i += copy(dAtA[i:], *m.StorageClassName) } + if m.VolumeMode != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeMode))) + i += copy(dAtA[i:], *m.VolumeMode) + } return i, nil } @@ -6255,6 +6281,12 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if m.VolumeMode != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeMode))) + i += copy(dAtA[i:], *m.VolumeMode) + } return i, nil } @@ -9638,6 +9670,32 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *VolumeDevice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VolumeDevice) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DevicePath))) + i += copy(dAtA[i:], m.DevicePath) + return i, nil +} + func (m *VolumeMount) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10545,6 +10603,12 @@ func (m *Container) Size() (n int) { } l = len(m.TerminationMessagePolicy) n += 2 + l + sovGenerated(uint64(l)) + if len(m.VolumeDevices) > 0 { + for _, e := range m.VolumeDevices { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -11795,6 +11859,10 @@ func (m *PersistentVolumeClaimSpec) Size() (n int) { l = len(*m.StorageClassName) n += 1 + l + sovGenerated(uint64(l)) } + if m.VolumeMode != nil { + l = len(*m.VolumeMode) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -11978,6 +12046,10 @@ func (m *PersistentVolumeSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.VolumeMode != nil { + l = len(*m.VolumeMode) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -13194,6 +13266,16 @@ func (m *Volume) Size() (n int) { return n } +func (m *VolumeDevice) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.DevicePath) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *VolumeMount) Size() (n int) { var l int _ = l @@ -13691,6 +13773,7 @@ func (this *Container) String() string { `TTY:` + fmt.Sprintf("%v", this.TTY) + `,`, `EnvFrom:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.EnvFrom), "EnvFromSource", "EnvFromSource", 1), `&`, ``, 1) + `,`, `TerminationMessagePolicy:` + fmt.Sprintf("%v", this.TerminationMessagePolicy) + `,`, + `VolumeDevices:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VolumeDevices), "VolumeDevice", "VolumeDevice", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -14754,6 +14837,7 @@ func (this *PersistentVolumeClaimSpec) String() string { `VolumeName:` + fmt.Sprintf("%v", this.VolumeName) + `,`, `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `StorageClassName:` + valueToStringGenerated(this.StorageClassName) + `,`, + `VolumeMode:` + valueToStringGenerated(this.VolumeMode) + `,`, `}`, }, "") return s @@ -14856,6 +14940,7 @@ func (this *PersistentVolumeSpec) String() string { `PersistentVolumeReclaimPolicy:` + fmt.Sprintf("%v", this.PersistentVolumeReclaimPolicy) + `,`, `StorageClassName:` + fmt.Sprintf("%v", this.StorageClassName) + `,`, `MountOptions:` + fmt.Sprintf("%v", this.MountOptions) + `,`, + `VolumeMode:` + valueToStringGenerated(this.VolumeMode) + `,`, `}`, }, "") return s @@ -15868,6 +15953,17 @@ func (this *Volume) String() string { }, "") return s } +func (this *VolumeDevice) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VolumeDevice{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `DevicePath:` + fmt.Sprintf("%v", this.DevicePath) + `,`, + `}`, + }, "") + return s +} func (this *VolumeMount) String() string { if this == nil { return "nil" @@ -19751,6 +19847,37 @@ func (m *Container) Unmarshal(dAtA []byte) error { } m.TerminationMessagePolicy = TerminationMessagePolicy(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeDevices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeDevices = append(m.VolumeDevices, VolumeDevice{}) + if err := m.VolumeDevices[len(m.VolumeDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -32048,6 +32175,36 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.StorageClassName = &s iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := PersistentVolumeMode(dAtA[iNdEx:postIndex]) + m.VolumeMode = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -33644,6 +33801,36 @@ func (m *PersistentVolumeSpec) Unmarshal(dAtA []byte) error { } m.MountOptions = append(m.MountOptions, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := PersistentVolumeMode(dAtA[iNdEx:postIndex]) + m.VolumeMode = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -45786,6 +45973,114 @@ func (m *Volume) Unmarshal(dAtA []byte) error { } return nil } +func (m *VolumeDevice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VolumeDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VolumeDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DevicePath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DevicePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *VolumeMount) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -47438,753 +47733,758 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11954 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x77, 0xb1, 0xcb, 0x59, 0x90, 0xbb, 0x58, 0x36, - 0x25, 0x72, 0xf9, 0x02, 0xc4, 0x25, 0x29, 0xae, 0x45, 0x8a, 0x36, 0x80, 0x01, 0x76, 0x87, 0xbb, - 0xd8, 0x1d, 0xde, 0xc1, 0xee, 0x8a, 0x34, 0xcd, 0x4f, 0x8d, 0x99, 0x0b, 0xa0, 0x89, 0x46, 0xf7, - 0xb0, 0xbb, 0x07, 0xbb, 0x60, 0xd9, 0x55, 0x5f, 0x14, 0x5b, 0x79, 0xd8, 0x3f, 0x5c, 0x89, 0x2b, - 0x71, 0x6c, 0x97, 0x53, 0x95, 0x47, 0xd9, 0x8a, 0x93, 0x54, 0x1c, 0x3b, 0xb2, 0x23, 0x39, 0x15, - 0xc7, 0x79, 0xc9, 0x7f, 0x14, 0x3b, 0x7f, 0xa4, 0x2a, 0x57, 0x10, 0x6b, 0x95, 0x4a, 0x2a, 0x3f, - 0x92, 0x4a, 0xe2, 0x5f, 0x46, 0x9c, 0x28, 0x75, 0x9f, 0x7d, 0x6f, 0x4f, 0xf7, 0xcc, 0x60, 0x89, - 0x05, 0x29, 0x95, 0xfe, 0xcd, 0xdc, 0x73, 0xee, 0xb9, 0xb7, 0xef, 0xe3, 0xdc, 0x73, 0xcf, 0x3d, - 0x0f, 0x78, 0x75, 0xe7, 0x72, 0x34, 0xef, 0x06, 0x0b, 0x3b, 0xed, 0x0d, 0x12, 0xfa, 0x24, 0x26, - 0xd1, 0xc2, 0x1e, 0xf1, 0x9b, 0x41, 0xb8, 0x20, 0x00, 0x4e, 0xcb, 0x5d, 0x68, 0x04, 0x21, 0x59, - 0xd8, 0x7b, 0x61, 0x61, 0x8b, 0xf8, 0x24, 0x74, 0x62, 0xd2, 0x9c, 0x6f, 0x85, 0x41, 0x1c, 0x20, - 0xc4, 0x71, 0xe6, 0x9d, 0x96, 0x3b, 0x4f, 0x71, 0xe6, 0xf7, 0x5e, 0x98, 0x7d, 0x7e, 0xcb, 0x8d, - 0xb7, 0xdb, 0x1b, 0xf3, 0x8d, 0x60, 0x77, 0x61, 0x2b, 0xd8, 0x0a, 0x16, 0x18, 0xea, 0x46, 0x7b, - 0x93, 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0x4e, 0x62, 0x76, 0x2d, 0x69, 0x86, 0xdc, 0x8b, 0x89, 0x1f, - 0xb9, 0x81, 0x1f, 0x3d, 0xef, 0xb4, 0xdc, 0x88, 0x84, 0x7b, 0x24, 0x5c, 0x68, 0xed, 0x6c, 0x51, - 0x58, 0x64, 0x22, 0x2c, 0xec, 0xbd, 0xb0, 0x41, 0x62, 0xa7, 0xa3, 0x47, 0xb3, 0x2f, 0x25, 0xe4, - 0x76, 0x9d, 0xc6, 0xb6, 0xeb, 0x93, 0x70, 0x5f, 0xd2, 0x58, 0x08, 0x49, 0x14, 0xb4, 0xc3, 0x06, - 0x39, 0x52, 0xad, 0x68, 0x61, 0x97, 0xc4, 0x4e, 0xc6, 0xd7, 0xcf, 0x2e, 0xe4, 0xd5, 0x0a, 0xdb, - 0x7e, 0xec, 0xee, 0x76, 0x36, 0xf3, 0x99, 0x5e, 0x15, 0xa2, 0xc6, 0x36, 0xd9, 0x75, 0x3a, 0xea, - 0xbd, 0x98, 0x57, 0xaf, 0x1d, 0xbb, 0xde, 0x82, 0xeb, 0xc7, 0x51, 0x1c, 0xa6, 0x2b, 0xd9, 0xdf, - 0xb4, 0xe0, 0xc2, 0xe2, 0x9d, 0xfa, 0x8a, 0xe7, 0x44, 0xb1, 0xdb, 0x58, 0xf2, 0x82, 0xc6, 0x4e, - 0x3d, 0x0e, 0x42, 0x72, 0x3b, 0xf0, 0xda, 0xbb, 0xa4, 0xce, 0x06, 0x02, 0x3d, 0x07, 0x23, 0x7b, - 0xec, 0x7f, 0xb5, 0x52, 0xb6, 0x2e, 0x58, 0x17, 0x4b, 0x4b, 0x53, 0x5f, 0x3f, 0x98, 0xfb, 0xc4, - 0xfd, 0x83, 0xb9, 0x91, 0xdb, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x24, 0x0c, 0x6d, 0x46, 0xeb, 0xfb, - 0x2d, 0x52, 0x2e, 0x30, 0xdc, 0x09, 0x81, 0x3b, 0xb4, 0x5a, 0xa7, 0xa5, 0x58, 0x40, 0xd1, 0x02, - 0x94, 0x5a, 0x4e, 0x18, 0xbb, 0xb1, 0x1b, 0xf8, 0xe5, 0xe2, 0x05, 0xeb, 0xe2, 0xe0, 0xd2, 0xb4, - 0x40, 0x2d, 0xd5, 0x24, 0x00, 0x27, 0x38, 0xb4, 0x1b, 0x21, 0x71, 0x9a, 0x37, 0x7d, 0x6f, 0xbf, - 0x3c, 0x70, 0xc1, 0xba, 0x38, 0x92, 0x74, 0x03, 0x8b, 0x72, 0xac, 0x30, 0xec, 0x5f, 0x28, 0xc0, - 0xc8, 0xe2, 0xe6, 0xa6, 0xeb, 0xbb, 0xf1, 0x3e, 0xba, 0x0d, 0x63, 0x7e, 0xd0, 0x24, 0xf2, 0x3f, - 0xfb, 0x8a, 0xd1, 0x4b, 0x17, 0xe6, 0x3b, 0x57, 0xe6, 0xfc, 0x0d, 0x0d, 0x6f, 0x69, 0xea, 0xfe, - 0xc1, 0xdc, 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0x2b, 0x68, 0x2a, 0xb2, 0x05, 0x46, - 0x76, 0x2e, 0x8b, 0x6c, 0x2d, 0x41, 0x5b, 0x9a, 0xbc, 0x7f, 0x30, 0x37, 0xaa, 0x15, 0x60, 0x9d, - 0x08, 0xda, 0x80, 0x49, 0xfa, 0xd7, 0x8f, 0x5d, 0x45, 0xb7, 0xc8, 0xe8, 0x3e, 0x91, 0x47, 0x57, - 0x43, 0x5d, 0x3a, 0x75, 0xff, 0x60, 0x6e, 0x32, 0x55, 0x88, 0xd3, 0x04, 0xed, 0x0f, 0x60, 0x62, - 0x31, 0x8e, 0x9d, 0xc6, 0x36, 0x69, 0xf2, 0x19, 0x44, 0x2f, 0xc1, 0x80, 0xef, 0xec, 0x12, 0x31, - 0xbf, 0x17, 0xc4, 0xc0, 0x0e, 0xdc, 0x70, 0x76, 0xc9, 0xe1, 0xc1, 0xdc, 0xd4, 0x2d, 0xdf, 0x7d, - 0xbf, 0x2d, 0x56, 0x05, 0x2d, 0xc3, 0x0c, 0x1b, 0x5d, 0x02, 0x68, 0x92, 0x3d, 0xb7, 0x41, 0x6a, - 0x4e, 0xbc, 0x2d, 0xe6, 0x1b, 0x89, 0xba, 0x50, 0x51, 0x10, 0xac, 0x61, 0xd9, 0xf7, 0xa0, 0xb4, - 0xb8, 0x17, 0xb8, 0xcd, 0x5a, 0xd0, 0x8c, 0xd0, 0x0e, 0x4c, 0xb6, 0x42, 0xb2, 0x49, 0x42, 0x55, - 0x54, 0xb6, 0x2e, 0x14, 0x2f, 0x8e, 0x5e, 0xba, 0x98, 0xf9, 0xb1, 0x26, 0xea, 0x8a, 0x1f, 0x87, - 0xfb, 0x4b, 0x8f, 0x88, 0xf6, 0x26, 0x53, 0x50, 0x9c, 0xa6, 0x6c, 0xff, 0xab, 0x02, 0x9c, 0x5e, - 0xfc, 0xa0, 0x1d, 0x92, 0x8a, 0x1b, 0xed, 0xa4, 0x57, 0x78, 0xd3, 0x8d, 0x76, 0x6e, 0x24, 0x23, - 0xa0, 0x96, 0x56, 0x45, 0x94, 0x63, 0x85, 0x81, 0x9e, 0x87, 0x61, 0xfa, 0xfb, 0x16, 0xae, 0x8a, - 0x4f, 0x3e, 0x25, 0x90, 0x47, 0x2b, 0x4e, 0xec, 0x54, 0x38, 0x08, 0x4b, 0x1c, 0xb4, 0x06, 0xa3, - 0x0d, 0xb6, 0x21, 0xb7, 0xd6, 0x82, 0x26, 0x61, 0x93, 0x59, 0x5a, 0x7a, 0x96, 0xa2, 0x2f, 0x27, - 0xc5, 0x87, 0x07, 0x73, 0x65, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, 0xd5, 0xfe, - 0x1a, 0x60, 0x94, 0x20, 0x63, 0x6f, 0x5d, 0xd4, 0xb6, 0xca, 0x20, 0xdb, 0x2a, 0x63, 0xd9, 0xdb, - 0x04, 0xbd, 0x00, 0x03, 0x3b, 0xae, 0xdf, 0x2c, 0x0f, 0x31, 0x5a, 0xe7, 0xe8, 0x9c, 0x5f, 0x73, - 0xfd, 0xe6, 0xe1, 0xc1, 0xdc, 0xb4, 0xd1, 0x1d, 0x5a, 0x88, 0x19, 0xaa, 0xfd, 0x27, 0x16, 0xcc, - 0x31, 0xd8, 0xaa, 0xeb, 0x91, 0x1a, 0x09, 0x23, 0x37, 0x8a, 0x89, 0x1f, 0x1b, 0x03, 0x7a, 0x09, - 0x20, 0x22, 0x8d, 0x90, 0xc4, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x57, 0x10, 0xac, 0x61, 0x51, 0x86, - 0x10, 0x6d, 0x3b, 0x21, 0x5b, 0x5f, 0x62, 0x60, 0x15, 0x43, 0xa8, 0x4b, 0x00, 0x4e, 0x70, 0x0c, - 0x86, 0x50, 0xec, 0xc5, 0x10, 0xd0, 0xe7, 0x60, 0x32, 0x69, 0x2c, 0x6a, 0x39, 0x0d, 0x39, 0x80, - 0x6c, 0xcb, 0xd4, 0x4d, 0x10, 0x4e, 0xe3, 0xda, 0x7f, 0xcf, 0x12, 0x8b, 0x87, 0x7e, 0xf5, 0xc7, - 0xfc, 0x5b, 0xed, 0xdf, 0xb6, 0x60, 0x78, 0xc9, 0xf5, 0x9b, 0xae, 0xbf, 0x85, 0xbe, 0x00, 0x23, - 0xf4, 0x6c, 0x6a, 0x3a, 0xb1, 0x23, 0xf8, 0xde, 0xa7, 0xb5, 0xbd, 0xa5, 0x8e, 0x8a, 0xf9, 0xd6, - 0xce, 0x16, 0x2d, 0x88, 0xe6, 0x29, 0x36, 0xdd, 0x6d, 0x37, 0x37, 0xde, 0x23, 0x8d, 0x78, 0x8d, - 0xc4, 0x4e, 0xf2, 0x39, 0x49, 0x19, 0x56, 0x54, 0xd1, 0x35, 0x18, 0x8a, 0x9d, 0x70, 0x8b, 0xc4, - 0x82, 0x01, 0x66, 0x32, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xfc, 0x06, 0x49, 0x8e, 0x85, 0x75, - 0x56, 0x15, 0x0b, 0x12, 0xf6, 0xaf, 0x59, 0x70, 0x76, 0xb9, 0x5e, 0xcd, 0x59, 0x57, 0x4f, 0xc2, - 0x50, 0x33, 0x74, 0xf7, 0x48, 0x28, 0xc6, 0x59, 0x51, 0xa9, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x32, - 0x8c, 0xf1, 0x03, 0xe9, 0xaa, 0xe3, 0x37, 0x3d, 0x39, 0xc4, 0x33, 0x02, 0x7b, 0xec, 0xb6, 0x06, - 0xc3, 0x06, 0xe6, 0x11, 0x07, 0xba, 0x01, 0x63, 0xcb, 0x4e, 0xcb, 0xd9, 0x70, 0x3d, 0x37, 0x76, - 0x49, 0x84, 0x9e, 0x82, 0xa2, 0xd3, 0x6c, 0x32, 0x1e, 0x56, 0x5a, 0x3a, 0x7d, 0xff, 0x60, 0xae, - 0xb8, 0xd8, 0xa4, 0x9b, 0x09, 0x14, 0xd6, 0x3e, 0xa6, 0x18, 0xe8, 0x19, 0x18, 0x68, 0x86, 0x41, - 0xab, 0x5c, 0x60, 0x98, 0x67, 0xe8, 0xbe, 0xab, 0x84, 0x41, 0x2b, 0x85, 0xca, 0x70, 0xec, 0xdf, - 0x2d, 0xc0, 0x63, 0xcb, 0xa4, 0xb5, 0xbd, 0x5a, 0xcf, 0x19, 0x95, 0x8b, 0x30, 0xb2, 0x1b, 0xf8, - 0x6e, 0x1c, 0x84, 0x91, 0x68, 0x9a, 0x6d, 0xf7, 0x35, 0x51, 0x86, 0x15, 0x14, 0x5d, 0x80, 0x81, - 0x56, 0xc2, 0xaa, 0xc7, 0x24, 0x9b, 0x67, 0x4c, 0x9a, 0x41, 0x28, 0x46, 0x3b, 0x22, 0xa1, 0x60, - 0x53, 0x0a, 0xe3, 0x56, 0x44, 0x42, 0xcc, 0x20, 0xc9, 0x7a, 0xa7, 0x3b, 0x41, 0xec, 0xa1, 0xd4, - 0x7a, 0xa7, 0x10, 0xac, 0x61, 0xa1, 0x1a, 0x94, 0xf8, 0x3f, 0x4c, 0x36, 0x19, 0x47, 0xca, 0x59, - 0x25, 0x75, 0x89, 0x24, 0x56, 0xc9, 0x38, 0xdb, 0x10, 0xb2, 0x10, 0x27, 0x44, 0x8c, 0x79, 0x1a, - 0xea, 0x39, 0x4f, 0x5f, 0x2b, 0x00, 0xe2, 0x43, 0xf8, 0x3d, 0x36, 0x70, 0xb7, 0x3a, 0x07, 0x2e, - 0xf3, 0x68, 0xbc, 0x1e, 0x34, 0x1c, 0x2f, 0xbd, 0xc7, 0x8e, 0x6b, 0xf4, 0x7e, 0xde, 0x02, 0xb4, - 0xec, 0xfa, 0x4d, 0x12, 0x9e, 0x80, 0x5c, 0x78, 0xb4, 0x0d, 0x78, 0x1d, 0x26, 0x96, 0x3d, 0x97, - 0xf8, 0x71, 0xb5, 0xb6, 0x1c, 0xf8, 0x9b, 0xee, 0x16, 0xfa, 0x2c, 0x4c, 0x50, 0x31, 0x39, 0x68, - 0xc7, 0x75, 0xd2, 0x08, 0x7c, 0x26, 0x51, 0x50, 0xe1, 0x12, 0xdd, 0x3f, 0x98, 0x9b, 0x58, 0x37, - 0x20, 0x38, 0x85, 0x69, 0xff, 0x11, 0xfd, 0xd0, 0x60, 0xb7, 0x15, 0xf8, 0xc4, 0x8f, 0x97, 0x03, - 0xbf, 0xc9, 0x25, 0xcf, 0xcf, 0xc2, 0x40, 0x4c, 0x3b, 0xce, 0x3f, 0xf2, 0x49, 0x39, 0xb5, 0xb4, - 0xbb, 0x87, 0x07, 0x73, 0x67, 0x3a, 0x6b, 0xb0, 0x0f, 0x62, 0x75, 0xd0, 0x0f, 0xc1, 0x50, 0x14, - 0x3b, 0x71, 0x3b, 0x12, 0x9f, 0xfd, 0xb8, 0xfc, 0xec, 0x3a, 0x2b, 0x3d, 0x3c, 0x98, 0x9b, 0x54, - 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0xd3, 0x30, 0xbc, 0x4b, 0xa2, 0xc8, 0xd9, 0x92, 0x42, 0xc3, - 0xa4, 0xa8, 0x3b, 0xbc, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0x27, 0x60, 0x90, 0x84, 0x61, 0x10, 0x8a, - 0x55, 0x35, 0x2e, 0x10, 0x07, 0x57, 0x68, 0x21, 0xe6, 0x30, 0xfb, 0xdf, 0x59, 0x30, 0xa9, 0xfa, - 0xca, 0xdb, 0x3a, 0x81, 0xd3, 0xe1, 0x6d, 0x80, 0x86, 0xfc, 0xc0, 0x88, 0xf1, 0xbb, 0xd1, 0x4b, - 0x4f, 0x66, 0x2d, 0xe1, 0xce, 0x61, 0x4c, 0x28, 0xab, 0xa2, 0x08, 0x6b, 0xd4, 0xec, 0x7f, 0x66, - 0xc1, 0xa9, 0xd4, 0x17, 0x5d, 0x77, 0xa3, 0x18, 0xbd, 0xd3, 0xf1, 0x55, 0xf3, 0xfd, 0x7d, 0x15, - 0xad, 0xcd, 0xbe, 0x49, 0xad, 0x39, 0x59, 0xa2, 0x7d, 0xd1, 0x55, 0x18, 0x74, 0x63, 0xb2, 0x2b, - 0x3f, 0xe6, 0x89, 0xae, 0x1f, 0xc3, 0x7b, 0x95, 0xcc, 0x48, 0x95, 0xd6, 0xc4, 0x9c, 0x80, 0xfd, - 0x3f, 0x2d, 0x28, 0xf1, 0x65, 0xbb, 0xe6, 0xb4, 0x4e, 0x60, 0x2e, 0xaa, 0x30, 0xc0, 0xa8, 0xf3, - 0x8e, 0x3f, 0x95, 0xdd, 0x71, 0xd1, 0x9d, 0x79, 0x2a, 0xfa, 0x71, 0x11, 0x5b, 0x31, 0x33, 0x5a, - 0x84, 0x19, 0x89, 0xd9, 0x57, 0xa0, 0xa4, 0x10, 0xd0, 0x14, 0x14, 0x77, 0x08, 0xbf, 0x56, 0x95, - 0x30, 0xfd, 0x89, 0x66, 0x60, 0x70, 0xcf, 0xf1, 0xda, 0x62, 0xb3, 0x63, 0xfe, 0xe7, 0xb3, 0x85, - 0xcb, 0x96, 0xfd, 0x55, 0xb6, 0xc7, 0x44, 0x23, 0x2b, 0xfe, 0x9e, 0x60, 0x26, 0x1f, 0xc0, 0x8c, - 0x97, 0xc1, 0xc3, 0xc4, 0x40, 0xf4, 0xcf, 0xf3, 0x1e, 0x13, 0x7d, 0x9d, 0xc9, 0x82, 0xe2, 0xcc, - 0x36, 0xe8, 0x31, 0x10, 0xb4, 0xe8, 0x8a, 0x72, 0x3c, 0xd6, 0x5f, 0x21, 0x2e, 0xdf, 0x14, 0x65, - 0x58, 0x41, 0x29, 0x83, 0x98, 0x51, 0x9d, 0xbf, 0x46, 0xf6, 0xeb, 0xc4, 0x23, 0x8d, 0x38, 0x08, - 0x3f, 0xd2, 0xee, 0x9f, 0xe3, 0xa3, 0xcf, 0xf9, 0xcb, 0xa8, 0x20, 0x50, 0xbc, 0x46, 0xf6, 0xf9, - 0x54, 0xe8, 0x5f, 0x57, 0xec, 0xfa, 0x75, 0xbf, 0x6e, 0xc1, 0xb8, 0xfa, 0xba, 0x13, 0xd8, 0x48, - 0x4b, 0xe6, 0x46, 0x3a, 0xd7, 0x75, 0x3d, 0xe6, 0x6c, 0xa1, 0xef, 0x32, 0x16, 0x20, 0x70, 0x6a, - 0x61, 0x40, 0x87, 0x86, 0xf2, 0xec, 0x8f, 0x72, 0x42, 0xfa, 0xf9, 0xae, 0x6b, 0x64, 0x7f, 0x3d, - 0xa0, 0xe2, 0x43, 0xf6, 0x77, 0x19, 0xb3, 0x36, 0xd0, 0x75, 0xd6, 0x7e, 0xb3, 0x00, 0xa7, 0xd5, - 0x08, 0x18, 0x07, 0xf4, 0xf7, 0xfa, 0x18, 0xbc, 0x00, 0xa3, 0x4d, 0xb2, 0xe9, 0xb4, 0xbd, 0x58, - 0xdd, 0x9c, 0x07, 0xb9, 0xf6, 0xa4, 0x92, 0x14, 0x63, 0x1d, 0xe7, 0x08, 0xc3, 0xf6, 0xaf, 0x81, - 0xf1, 0xde, 0xd8, 0xa1, 0x2b, 0x98, 0x4a, 0x6f, 0x9a, 0xfe, 0x63, 0x4c, 0xd7, 0x7f, 0x08, 0x5d, - 0xc7, 0x13, 0x30, 0xe8, 0xee, 0xd2, 0xb3, 0xb8, 0x60, 0x1e, 0xb1, 0x55, 0x5a, 0x88, 0x39, 0x0c, - 0x7d, 0x0a, 0x86, 0x1b, 0xc1, 0xee, 0xae, 0xe3, 0x37, 0xcb, 0x45, 0x26, 0x4f, 0x8e, 0xd2, 0xe3, - 0x7a, 0x99, 0x17, 0x61, 0x09, 0x43, 0x8f, 0xc1, 0x80, 0x13, 0x6e, 0x45, 0xe5, 0x01, 0x86, 0x33, - 0x42, 0x5b, 0x5a, 0x0c, 0xb7, 0x22, 0xcc, 0x4a, 0xa9, 0x9c, 0x78, 0x37, 0x08, 0x77, 0x5c, 0x7f, - 0xab, 0xe2, 0x86, 0x4c, 0xe8, 0xd3, 0xe4, 0xc4, 0x3b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x0a, 0x83, - 0xad, 0x20, 0x8c, 0xa3, 0xf2, 0x10, 0x1b, 0xee, 0xc7, 0x73, 0xb6, 0x12, 0xff, 0xda, 0x5a, 0x10, - 0xc6, 0xc9, 0x07, 0xd0, 0x7f, 0x11, 0xe6, 0xd5, 0xd1, 0x0f, 0x41, 0x91, 0xf8, 0x7b, 0xe5, 0x61, - 0x46, 0x65, 0x36, 0x8b, 0xca, 0x8a, 0xbf, 0x77, 0xdb, 0x09, 0x13, 0x3e, 0xb3, 0xe2, 0xef, 0x61, - 0x5a, 0x07, 0xbd, 0x05, 0x25, 0xa9, 0x3b, 0x8d, 0xca, 0x23, 0xf9, 0x4b, 0x0c, 0x0b, 0x24, 0x4c, - 0xde, 0x6f, 0xbb, 0x21, 0xd9, 0x25, 0x7e, 0x1c, 0x25, 0xb7, 0x5f, 0x09, 0x8d, 0x70, 0x42, 0x0d, - 0xbd, 0x25, 0xaf, 0x73, 0x6b, 0x41, 0xdb, 0x8f, 0xa3, 0x72, 0x89, 0x75, 0x2f, 0x53, 0xd1, 0x76, - 0x3b, 0xc1, 0x4b, 0xdf, 0xf7, 0x78, 0x65, 0x6c, 0x90, 0x42, 0x18, 0xc6, 0x3d, 0x77, 0x8f, 0xf8, - 0x24, 0x8a, 0x6a, 0x61, 0xb0, 0x41, 0xca, 0xc0, 0x7a, 0x7e, 0x36, 0x5b, 0xff, 0x14, 0x6c, 0x90, - 0xa5, 0xe9, 0xfb, 0x07, 0x73, 0xe3, 0xd7, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0x6e, 0xc1, 0x04, 0x15, - 0x50, 0xdd, 0x84, 0xe8, 0x68, 0x2f, 0xa2, 0x4c, 0x3a, 0xc5, 0x46, 0x25, 0x9c, 0x22, 0x82, 0xde, - 0x80, 0x92, 0xe7, 0x6e, 0x92, 0xc6, 0x7e, 0xc3, 0x23, 0xe5, 0x31, 0x46, 0x31, 0x73, 0x5b, 0x5d, - 0x97, 0x48, 0xfc, 0x02, 0xa0, 0xfe, 0xe2, 0xa4, 0x3a, 0xba, 0x0d, 0x67, 0x62, 0x12, 0xee, 0xba, - 0xbe, 0x43, 0xb7, 0x83, 0x90, 0x27, 0x99, 0x16, 0x6f, 0x9c, 0xad, 0xb7, 0xf3, 0x62, 0xe8, 0xce, - 0xac, 0x67, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x26, 0x4c, 0xb2, 0x9d, 0x50, 0x6b, 0x7b, 0x5e, 0x2d, - 0xf0, 0xdc, 0xc6, 0x7e, 0x79, 0x82, 0x11, 0xfc, 0x94, 0x54, 0xd3, 0x55, 0x4d, 0x30, 0xbd, 0xf1, - 0x26, 0xff, 0x70, 0xba, 0x36, 0xda, 0x60, 0x6a, 0x9b, 0x76, 0xe8, 0xc6, 0xfb, 0x74, 0xfd, 0x92, - 0x7b, 0x71, 0x79, 0xb2, 0xeb, 0xfd, 0x51, 0x47, 0x55, 0xba, 0x1d, 0xbd, 0x10, 0xa7, 0x09, 0xd2, - 0xad, 0x1d, 0xc5, 0x4d, 0xd7, 0x2f, 0x4f, 0x31, 0x8e, 0xa1, 0x76, 0x46, 0x9d, 0x16, 0x62, 0x0e, - 0x63, 0x2a, 0x1b, 0xfa, 0xe3, 0x26, 0xe5, 0xa0, 0xd3, 0x0c, 0x31, 0x51, 0xd9, 0x48, 0x00, 0x4e, - 0x70, 0xe8, 0xb1, 0x1c, 0xc7, 0xfb, 0x65, 0xc4, 0x50, 0xd5, 0x76, 0x59, 0x5f, 0x7f, 0x0b, 0xd3, - 0x72, 0x74, 0x1d, 0x86, 0x89, 0xbf, 0xb7, 0x1a, 0x06, 0xbb, 0xe5, 0x53, 0xf9, 0x7b, 0x76, 0x85, - 0xa3, 0x70, 0x86, 0x9e, 0x5c, 0x00, 0x44, 0x31, 0x96, 0x24, 0xd0, 0x3d, 0x28, 0x67, 0xcc, 0x08, - 0x9f, 0x80, 0x19, 0x36, 0x01, 0xaf, 0x89, 0xba, 0xe5, 0xf5, 0x1c, 0xbc, 0xc3, 0x2e, 0x30, 0x9c, - 0x4b, 0xdd, 0xde, 0x80, 0x09, 0xc5, 0x58, 0xd8, 0xdc, 0xa2, 0x39, 0x18, 0xa4, 0x1c, 0x53, 0x5e, - 0xa9, 0x4b, 0x74, 0x28, 0x99, 0x22, 0x0d, 0xf3, 0x72, 0x36, 0x94, 0xee, 0x07, 0x64, 0x69, 0x3f, - 0x26, 0xfc, 0x5a, 0x54, 0xd4, 0x86, 0x52, 0x02, 0x70, 0x82, 0x63, 0xff, 0x5f, 0x2e, 0x98, 0x24, - 0xdc, 0xab, 0x0f, 0x7e, 0xfd, 0x1c, 0x8c, 0x6c, 0x07, 0x51, 0x4c, 0xb1, 0x59, 0x1b, 0x83, 0x89, - 0x28, 0x72, 0x55, 0x94, 0x63, 0x85, 0x81, 0x5e, 0x85, 0xf1, 0x86, 0xde, 0x80, 0x38, 0x6c, 0x4e, - 0x8b, 0x2a, 0x66, 0xeb, 0xd8, 0xc4, 0x45, 0x97, 0x61, 0x84, 0x3d, 0xa7, 0x34, 0x02, 0x4f, 0x5c, - 0xc0, 0xe4, 0x89, 0x39, 0x52, 0x13, 0xe5, 0x87, 0xda, 0x6f, 0xac, 0xb0, 0xe9, 0xa5, 0x98, 0x76, - 0xa1, 0x5a, 0x13, 0x6c, 0x5e, 0x5d, 0x8a, 0xaf, 0xb2, 0x52, 0x2c, 0xa0, 0xf6, 0x5f, 0x29, 0x68, - 0xa3, 0x4c, 0xaf, 0x14, 0x04, 0xd5, 0x60, 0xf8, 0xae, 0xe3, 0xc6, 0xae, 0xbf, 0x25, 0xce, 0xf3, - 0xa7, 0xbb, 0xf2, 0x7c, 0x56, 0xe9, 0x0e, 0xaf, 0xc0, 0x4f, 0x25, 0xf1, 0x07, 0x4b, 0x32, 0x94, - 0x62, 0xd8, 0xf6, 0x7d, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, - 0x64, 0xd0, 0x3b, 0x00, 0x72, 0xdd, 0x90, 0xa6, 0x78, 0xc6, 0x78, 0xae, 0x37, 0xd1, 0x75, 0x55, - 0x67, 0x69, 0x82, 0x9e, 0x79, 0xc9, 0x7f, 0xac, 0xd1, 0xb3, 0x63, 0x26, 0xf7, 0x74, 0x76, 0x06, - 0xfd, 0x28, 0xdd, 0xaa, 0x4e, 0x18, 0x93, 0xe6, 0x62, 0x2c, 0x06, 0xe7, 0x99, 0xfe, 0xc4, 0xd6, - 0x75, 0x77, 0x97, 0xe8, 0xdb, 0x5a, 0x10, 0xc1, 0x09, 0x3d, 0xfb, 0xb7, 0x8a, 0x50, 0xce, 0xeb, - 0x2e, 0x5d, 0x74, 0xe4, 0x9e, 0x1b, 0x2f, 0x53, 0x71, 0xc5, 0x32, 0x17, 0xdd, 0x8a, 0x28, 0xc7, - 0x0a, 0x83, 0xce, 0x7e, 0xe4, 0x6e, 0xc9, 0x5b, 0xc7, 0x60, 0x32, 0xfb, 0x75, 0x56, 0x8a, 0x05, - 0x94, 0xe2, 0x85, 0xc4, 0x89, 0xc4, 0x3b, 0x99, 0xb6, 0x4a, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0x2b, - 0x0c, 0x06, 0x7a, 0x28, 0x0c, 0x8c, 0x21, 0x1a, 0x3c, 0xde, 0x21, 0x42, 0xef, 0x02, 0x6c, 0xba, - 0xbe, 0x1b, 0x6d, 0x33, 0xea, 0x43, 0x47, 0xa6, 0xae, 0x84, 0x9d, 0x55, 0x45, 0x05, 0x6b, 0x14, - 0xd1, 0xcb, 0x30, 0xaa, 0x36, 0x60, 0xb5, 0x52, 0x1e, 0x36, 0x1f, 0x61, 0x12, 0x6e, 0x54, 0xc1, - 0x3a, 0x9e, 0xfd, 0x5e, 0x7a, 0xbd, 0x88, 0x1d, 0xa0, 0x8d, 0xaf, 0xd5, 0xef, 0xf8, 0x16, 0xba, - 0x8f, 0xaf, 0xfd, 0x7b, 0x45, 0x98, 0x34, 0x1a, 0x6b, 0x47, 0x7d, 0xf0, 0xac, 0x2b, 0xf4, 0x20, - 0x72, 0x62, 0x22, 0xf6, 0x9f, 0xdd, 0x7b, 0xab, 0xe8, 0x87, 0x15, 0xdd, 0x01, 0xbc, 0x3e, 0x7a, - 0x17, 0x4a, 0x9e, 0x13, 0x31, 0xe5, 0x03, 0x11, 0xfb, 0xae, 0x1f, 0x62, 0x89, 0xa0, 0xef, 0x44, - 0xb1, 0x76, 0x16, 0x70, 0xda, 0x09, 0x49, 0x7a, 0x62, 0x52, 0xe1, 0x44, 0x3e, 0xc4, 0xaa, 0x4e, - 0x50, 0x09, 0x66, 0x1f, 0x73, 0x18, 0xba, 0x0c, 0x63, 0x21, 0x61, 0xab, 0x62, 0x99, 0xca, 0x5a, - 0x6c, 0x99, 0x0d, 0x26, 0x42, 0x19, 0xd6, 0x60, 0xd8, 0xc0, 0x4c, 0x64, 0xed, 0xa1, 0x2e, 0xb2, - 0xf6, 0xd3, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0xa3, 0xca, 0x8b, 0xb1, 0x84, 0xa7, 0x17, - 0xcc, 0x48, 0x9f, 0x0b, 0xe6, 0x19, 0x98, 0xa8, 0x38, 0x64, 0x37, 0xf0, 0x57, 0xfc, 0x66, 0x2b, - 0x70, 0xfd, 0x18, 0x95, 0x61, 0x80, 0x9d, 0x0e, 0x7c, 0x6f, 0x0f, 0x50, 0x0a, 0x78, 0x80, 0x4a, - 0xce, 0xf6, 0x1f, 0x16, 0x60, 0xbc, 0x42, 0x3c, 0x12, 0x13, 0x7e, 0xd7, 0x88, 0xd0, 0x2a, 0xa0, - 0xad, 0xd0, 0x69, 0x90, 0x1a, 0x09, 0xdd, 0xa0, 0xa9, 0x2b, 0x23, 0x8b, 0x4c, 0xe1, 0x8f, 0xae, - 0x74, 0x40, 0x71, 0x46, 0x0d, 0xf4, 0x36, 0x8c, 0xb7, 0x42, 0x62, 0xe8, 0xd0, 0xac, 0x3c, 0x71, - 0xa1, 0xa6, 0x23, 0x72, 0x49, 0xd5, 0x28, 0xc2, 0x26, 0x29, 0xf4, 0x23, 0x30, 0x15, 0x84, 0xad, - 0x6d, 0xc7, 0xaf, 0x90, 0x16, 0xf1, 0x9b, 0x54, 0x14, 0x17, 0x3a, 0x82, 0x99, 0xfb, 0x07, 0x73, - 0x53, 0x37, 0x53, 0x30, 0xdc, 0x81, 0x8d, 0xde, 0x86, 0xe9, 0x56, 0x18, 0xb4, 0x9c, 0x2d, 0xb6, - 0x50, 0x84, 0xc4, 0xc1, 0xb9, 0xcf, 0x73, 0xf7, 0x0f, 0xe6, 0xa6, 0x6b, 0x69, 0xe0, 0xe1, 0xc1, - 0xdc, 0x29, 0x36, 0x50, 0xb4, 0x24, 0x01, 0xe2, 0x4e, 0x32, 0xf6, 0x16, 0x9c, 0xae, 0x04, 0x77, - 0xfd, 0xbb, 0x4e, 0xd8, 0x5c, 0xac, 0x55, 0xb5, 0xcb, 0xfd, 0x0d, 0x79, 0xb9, 0xe4, 0x8f, 0xc5, - 0x99, 0xe7, 0x94, 0x56, 0x93, 0x8b, 0xff, 0xab, 0xae, 0x47, 0x72, 0x94, 0x08, 0x7f, 0xbd, 0x60, - 0xb4, 0x94, 0xe0, 0x2b, 0xbd, 0xbf, 0x95, 0xab, 0xf7, 0x7f, 0x13, 0x46, 0x36, 0x5d, 0xe2, 0x35, - 0x31, 0xd9, 0x14, 0x33, 0xf3, 0x54, 0xfe, 0xfb, 0xd7, 0x2a, 0xc5, 0x94, 0x4a, 0x23, 0x7e, 0x35, - 0x5d, 0x15, 0x95, 0xb1, 0x22, 0x83, 0x76, 0x60, 0x4a, 0xde, 0x7d, 0x24, 0x54, 0x6c, 0xe2, 0xa7, - 0xbb, 0x5d, 0xa8, 0x4c, 0xe2, 0x6c, 0x02, 0x71, 0x8a, 0x0c, 0xee, 0x20, 0x4c, 0xef, 0xa2, 0xbb, - 0xf4, 0xb8, 0x1a, 0x60, 0x4b, 0x9a, 0xdd, 0x45, 0xd9, 0xb5, 0x9a, 0x95, 0xda, 0xbf, 0x64, 0xc1, - 0x23, 0x1d, 0x23, 0x23, 0xd4, 0x0b, 0xc7, 0x3c, 0x0b, 0xe9, 0xeb, 0x7e, 0xa1, 0xf7, 0x75, 0xdf, - 0xfe, 0xfb, 0x16, 0xcc, 0xac, 0xec, 0xb6, 0xe2, 0xfd, 0x8a, 0x6b, 0xbe, 0x4d, 0xbc, 0x02, 0x43, - 0xbb, 0xa4, 0xe9, 0xb6, 0x77, 0xc5, 0xcc, 0xcd, 0x49, 0x96, 0xbe, 0xc6, 0x4a, 0x0f, 0x0f, 0xe6, - 0xc6, 0xeb, 0x71, 0x10, 0x3a, 0x5b, 0x84, 0x17, 0x60, 0x81, 0xce, 0x0e, 0x46, 0xf7, 0x03, 0x72, - 0xdd, 0xdd, 0x75, 0xe5, 0x7b, 0x66, 0x57, 0x95, 0xd7, 0xbc, 0x1c, 0xd0, 0xf9, 0x37, 0xdb, 0x8e, - 0x1f, 0xbb, 0xf1, 0xbe, 0x78, 0x76, 0x91, 0x44, 0x70, 0x42, 0xcf, 0xfe, 0xa6, 0x05, 0x93, 0x92, - 0x97, 0x2c, 0x36, 0x9b, 0x21, 0x89, 0x22, 0x34, 0x0b, 0x05, 0xb7, 0x25, 0x7a, 0x09, 0xa2, 0x97, - 0x85, 0x6a, 0x0d, 0x17, 0xdc, 0x16, 0xaa, 0x41, 0x89, 0x3f, 0x8b, 0x26, 0x8b, 0xab, 0xaf, 0xc7, - 0x55, 0xd6, 0x83, 0x75, 0x59, 0x13, 0x27, 0x44, 0xa4, 0x54, 0xcc, 0xce, 0xa1, 0xa2, 0xf9, 0x66, - 0x73, 0x55, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc2, 0x88, 0x1f, 0x34, 0xf9, 0x2b, 0x35, 0xdf, 0xd3, - 0x6c, 0xc9, 0xde, 0x10, 0x65, 0x58, 0x41, 0xed, 0x9f, 0xb1, 0x60, 0x4c, 0x7e, 0x59, 0x9f, 0x02, - 0x3a, 0xdd, 0x5a, 0x89, 0x70, 0x9e, 0x6c, 0x2d, 0x2a, 0x60, 0x33, 0x88, 0x21, 0x57, 0x17, 0x8f, - 0x22, 0x57, 0xdb, 0xbf, 0x58, 0x80, 0x09, 0xd9, 0x9d, 0x7a, 0x7b, 0x23, 0x22, 0x31, 0x5a, 0x87, - 0x92, 0xc3, 0x87, 0x9c, 0xc8, 0x15, 0xfb, 0x44, 0xf6, 0x8d, 0xcb, 0x98, 0x9f, 0x44, 0xd4, 0x59, - 0x94, 0xb5, 0x71, 0x42, 0x08, 0x79, 0x30, 0xed, 0x07, 0x31, 0x3b, 0xf6, 0x14, 0xbc, 0xdb, 0xbb, - 0x40, 0x9a, 0xfa, 0x59, 0x41, 0x7d, 0xfa, 0x46, 0x9a, 0x0a, 0xee, 0x24, 0x8c, 0x56, 0xa4, 0x96, - 0xa7, 0xc8, 0x5a, 0xb8, 0xd0, 0xad, 0x85, 0x7c, 0x25, 0x8f, 0xfd, 0x3b, 0x16, 0x94, 0x24, 0xda, - 0x49, 0x3c, 0x01, 0xad, 0xc1, 0x70, 0xc4, 0x26, 0x41, 0x0e, 0x8d, 0xdd, 0xad, 0xe3, 0x7c, 0xbe, - 0x92, 0xd3, 0x9c, 0xff, 0x8f, 0xb0, 0xa4, 0xc1, 0xd4, 0xd4, 0xaa, 0xfb, 0x1f, 0x13, 0x35, 0xb5, - 0xea, 0x4f, 0xce, 0x09, 0xf3, 0x5f, 0x58, 0x9f, 0xb5, 0xbb, 0x3c, 0x15, 0x3a, 0x5b, 0x21, 0xd9, - 0x74, 0xef, 0xa5, 0x85, 0xce, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x81, 0xb1, 0x86, 0xd4, 0xee, - 0x26, 0x6c, 0xe0, 0xc9, 0xae, 0xba, 0x72, 0xf5, 0xac, 0xc2, 0x2d, 0xd8, 0x96, 0xb5, 0xfa, 0xd8, - 0xa0, 0x66, 0x3e, 0xcc, 0x17, 0x7b, 0x3d, 0xcc, 0x27, 0x74, 0x73, 0x9f, 0x96, 0xed, 0x5f, 0xb6, - 0x60, 0x88, 0xeb, 0x08, 0xfb, 0x53, 0xaa, 0x6a, 0xcf, 0x44, 0xc9, 0xd8, 0xdd, 0xa6, 0x85, 0xe2, - 0xd5, 0x08, 0xad, 0x41, 0x89, 0xfd, 0x60, 0xba, 0x92, 0x62, 0xbe, 0xe9, 0x1e, 0x6f, 0x55, 0xef, - 0xe0, 0x6d, 0x59, 0x0d, 0x27, 0x14, 0xec, 0x9f, 0x2b, 0x52, 0x56, 0x95, 0xa0, 0x1a, 0x27, 0xb8, - 0xf5, 0xf0, 0x4e, 0xf0, 0xc2, 0xc3, 0x3a, 0xc1, 0xb7, 0x60, 0xb2, 0xa1, 0xbd, 0x49, 0x25, 0x33, - 0x79, 0xb1, 0xeb, 0x22, 0xd1, 0x9e, 0xaf, 0xb8, 0x9e, 0x6c, 0xd9, 0x24, 0x82, 0xd3, 0x54, 0xd1, - 0x8f, 0xc2, 0x18, 0x9f, 0x67, 0xd1, 0xca, 0x00, 0x6b, 0xe5, 0x53, 0xf9, 0xeb, 0x45, 0x6f, 0x82, - 0xad, 0xc4, 0xba, 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x2f, 0x0d, 0xc2, 0xe0, 0xca, 0x1e, 0xf1, 0xe3, - 0x13, 0x60, 0x48, 0x0d, 0x98, 0x70, 0xfd, 0xbd, 0xc0, 0xdb, 0x23, 0x4d, 0x0e, 0x3f, 0xca, 0xe1, - 0x7a, 0x46, 0x90, 0x9e, 0xa8, 0x1a, 0x24, 0x70, 0x8a, 0xe4, 0xc3, 0xb8, 0xb5, 0x5f, 0x81, 0x21, - 0x3e, 0xf7, 0xe2, 0xca, 0x9e, 0xa9, 0x01, 0x67, 0x83, 0x28, 0x76, 0x41, 0xa2, 0x51, 0xe0, 0x2a, - 0x77, 0x51, 0x1d, 0xbd, 0x07, 0x13, 0x9b, 0x6e, 0x18, 0xc5, 0xf4, 0xba, 0x1d, 0xc5, 0xce, 0x6e, - 0xeb, 0x01, 0x6e, 0xe9, 0x6a, 0x1c, 0x56, 0x0d, 0x4a, 0x38, 0x45, 0x19, 0x6d, 0xc1, 0x38, 0xbd, - 0x38, 0x26, 0x4d, 0x0d, 0x1f, 0xb9, 0x29, 0xa5, 0x86, 0xbb, 0xae, 0x13, 0xc2, 0x26, 0x5d, 0xca, - 0x4c, 0x1a, 0xec, 0xa2, 0x39, 0xc2, 0x24, 0x0a, 0xc5, 0x4c, 0xf8, 0x0d, 0x93, 0xc3, 0x28, 0x4f, - 0x62, 0xb6, 0x1c, 0x25, 0x93, 0x27, 0x25, 0x16, 0x1b, 0xf6, 0x97, 0xe9, 0xe9, 0x48, 0xc7, 0xf0, - 0x04, 0x8e, 0x96, 0xd7, 0xcd, 0xa3, 0xe5, 0x6c, 0xee, 0x7c, 0xe6, 0x1c, 0x2b, 0x5f, 0x80, 0x51, - 0x6d, 0xba, 0xd1, 0x02, 0x94, 0x1a, 0xd2, 0xf0, 0x40, 0x70, 0x5d, 0x25, 0xbe, 0x28, 0x8b, 0x04, - 0x9c, 0xe0, 0xd0, 0xd1, 0xa0, 0xc2, 0x5e, 0xda, 0xac, 0x89, 0x8a, 0x82, 0x98, 0x41, 0xec, 0x17, - 0x01, 0x56, 0xee, 0x91, 0xc6, 0x22, 0xbf, 0x78, 0x69, 0xef, 0x5b, 0x56, 0xfe, 0xfb, 0x96, 0xfd, - 0xef, 0x2d, 0x98, 0x58, 0x5d, 0x36, 0x04, 0xf2, 0x79, 0x00, 0x2e, 0x85, 0xde, 0xb9, 0x73, 0x43, - 0x6a, 0x86, 0xb9, 0x72, 0x4f, 0x95, 0x62, 0x0d, 0x03, 0x9d, 0x85, 0xa2, 0xd7, 0xf6, 0x85, 0x70, - 0x38, 0x7c, 0xff, 0x60, 0xae, 0x78, 0xbd, 0xed, 0x63, 0x5a, 0xa6, 0x59, 0x12, 0x15, 0xfb, 0xb6, - 0x24, 0xea, 0x69, 0x30, 0x8e, 0xe6, 0x60, 0xf0, 0xee, 0x5d, 0xb7, 0x19, 0x95, 0x07, 0x13, 0xad, - 0xf5, 0x9d, 0x3b, 0xd5, 0x4a, 0x84, 0x79, 0xb9, 0xfd, 0xe7, 0x8a, 0x30, 0xb5, 0xea, 0x91, 0x7b, - 0x0f, 0x64, 0x90, 0xd8, 0xaf, 0xf5, 0xd3, 0xad, 0xce, 0xf3, 0xf8, 0xb8, 0xed, 0xbd, 0x7a, 0x0f, - 0xc5, 0x3b, 0x30, 0xcc, 0x9f, 0x49, 0xf9, 0x60, 0x8c, 0x5e, 0x7a, 0x21, 0xab, 0x0b, 0xe9, 0xb1, - 0x98, 0x17, 0x8a, 0x0f, 0x6e, 0x33, 0xa2, 0x98, 0x98, 0x28, 0xc5, 0x92, 0xe4, 0xec, 0x67, 0x61, - 0x4c, 0xc7, 0x3c, 0x92, 0xf1, 0xc8, 0x9f, 0xb7, 0xe0, 0xd4, 0xaa, 0x17, 0x34, 0x76, 0x52, 0xa6, - 0x68, 0x2f, 0xc3, 0x28, 0xdd, 0x4f, 0x91, 0x61, 0x84, 0x6b, 0x98, 0x65, 0x0b, 0x10, 0xd6, 0xf1, - 0xb4, 0x6a, 0xb7, 0x6e, 0x55, 0x2b, 0x59, 0xd6, 0xdc, 0x02, 0x84, 0x75, 0x3c, 0xfb, 0x1b, 0x16, - 0x9c, 0xbb, 0xb2, 0xbc, 0x92, 0x58, 0x63, 0x76, 0x18, 0x94, 0x53, 0xe1, 0xae, 0xa9, 0x75, 0x25, - 0x11, 0xee, 0x2a, 0xac, 0x17, 0x02, 0xfa, 0x71, 0x71, 0x96, 0xf8, 0x55, 0x0b, 0x4e, 0x5d, 0x71, - 0x63, 0x4c, 0x5a, 0x41, 0xda, 0xb4, 0x39, 0x24, 0xad, 0x20, 0x72, 0xe3, 0x20, 0xdc, 0x4f, 0x9b, - 0x36, 0x63, 0x05, 0xc1, 0x1a, 0x16, 0x6f, 0x79, 0xcf, 0x8d, 0x68, 0x4f, 0x0b, 0xe6, 0x0d, 0x13, - 0x8b, 0x72, 0xac, 0x30, 0xe8, 0x87, 0x35, 0xdd, 0x90, 0x49, 0x08, 0xfb, 0x62, 0x3b, 0xab, 0x0f, - 0xab, 0x48, 0x00, 0x4e, 0x70, 0xec, 0x5f, 0xb2, 0xe0, 0xf4, 0x15, 0xaf, 0x1d, 0xc5, 0x24, 0xdc, - 0x8c, 0x8c, 0xce, 0xbe, 0x08, 0x25, 0x22, 0xa5, 0x70, 0xd1, 0x57, 0x75, 0x6e, 0x28, 0xf1, 0x9c, - 0xdb, 0x55, 0x2b, 0xbc, 0x3e, 0xec, 0x3a, 0x8f, 0x66, 0x8f, 0xf8, 0x1b, 0x05, 0x18, 0xbf, 0xba, - 0xbe, 0x5e, 0xbb, 0x42, 0x62, 0xc1, 0x32, 0x7b, 0x6b, 0x90, 0xb0, 0x76, 0x11, 0xee, 0x26, 0xeb, - 0xb4, 0x63, 0xd7, 0x9b, 0xe7, 0x8e, 0x3c, 0xf3, 0x55, 0x3f, 0xbe, 0x19, 0xd6, 0xe3, 0xd0, 0xf5, - 0xb7, 0x32, 0xaf, 0xce, 0x92, 0xb1, 0x17, 0xf3, 0x18, 0x3b, 0x7a, 0x11, 0x86, 0x98, 0x27, 0x91, - 0x94, 0x3a, 0x1e, 0x55, 0xa2, 0x02, 0x2b, 0x3d, 0x3c, 0x98, 0x2b, 0xdd, 0xc2, 0x55, 0xfe, 0x07, - 0x0b, 0x54, 0x74, 0x0b, 0x46, 0xb7, 0xe3, 0xb8, 0x75, 0x95, 0x38, 0x4d, 0x12, 0x4a, 0xee, 0x70, - 0x3e, 0x8b, 0x3b, 0xd0, 0x41, 0xe0, 0x68, 0xc9, 0x86, 0x4a, 0xca, 0x22, 0xac, 0xd3, 0xb1, 0xeb, - 0x00, 0x09, 0xec, 0x98, 0xae, 0x0d, 0xf6, 0x77, 0x2c, 0x18, 0xe6, 0x46, 0xdd, 0x21, 0x7a, 0x0d, - 0x06, 0xc8, 0x3d, 0xd2, 0x10, 0x27, 0x78, 0x66, 0x87, 0x93, 0x53, 0x8e, 0x2b, 0xc1, 0xe8, 0x7f, - 0xcc, 0x6a, 0xa1, 0xab, 0x30, 0x4c, 0x7b, 0x7b, 0x45, 0x59, 0xb8, 0x3f, 0x9e, 0xf7, 0xc5, 0x6a, - 0xda, 0xf9, 0xc1, 0x28, 0x8a, 0xb0, 0xac, 0xce, 0x14, 0x3a, 0x8d, 0x56, 0x9d, 0x32, 0xb0, 0xb8, - 0xdb, 0x75, 0x6b, 0x7d, 0xb9, 0xc6, 0x91, 0x04, 0x35, 0xae, 0xd0, 0x91, 0x85, 0x38, 0x21, 0x62, - 0xaf, 0x43, 0x89, 0x4e, 0xea, 0xa2, 0xe7, 0x3a, 0xdd, 0x75, 0x49, 0xcf, 0x42, 0x49, 0xea, 0x75, - 0x22, 0x61, 0x76, 0xce, 0xa8, 0x4a, 0xb5, 0x4f, 0x84, 0x13, 0xb8, 0xbd, 0x09, 0x33, 0xec, 0x91, - 0xd4, 0x89, 0xb7, 0x8d, 0x3d, 0xd6, 0x7b, 0x31, 0x3f, 0x27, 0xe4, 0x2b, 0x3e, 0x33, 0x65, 0xcd, - 0x4e, 0x76, 0x4c, 0x52, 0xd4, 0x64, 0xad, 0xff, 0x34, 0x00, 0xd3, 0xd5, 0xfa, 0x72, 0xdd, 0x54, - 0x2c, 0x5e, 0x86, 0x31, 0x2e, 0x09, 0xd0, 0x05, 0xed, 0x78, 0xa2, 0x35, 0xf5, 0x70, 0xb0, 0xae, - 0xc1, 0xb0, 0x81, 0x89, 0xce, 0x41, 0xd1, 0x7d, 0xdf, 0x4f, 0x9b, 0xc2, 0x55, 0xdf, 0xbc, 0x81, - 0x69, 0x39, 0x05, 0x53, 0xa1, 0x82, 0x33, 0x50, 0x05, 0x56, 0x82, 0xc5, 0xeb, 0x30, 0xe1, 0x46, - 0x8d, 0xc8, 0xad, 0xfa, 0x94, 0xbb, 0x24, 0x1e, 0x22, 0x89, 0xc4, 0x4f, 0xbb, 0xaa, 0xa0, 0x38, - 0x85, 0xad, 0x71, 0xf3, 0xc1, 0xbe, 0x05, 0x93, 0x9e, 0xd6, 0xd7, 0x54, 0xe6, 0x6a, 0xb1, 0xaf, - 0x8b, 0x98, 0x59, 0x8e, 0x90, 0xb9, 0xf8, 0x07, 0x47, 0x58, 0xc2, 0xd0, 0x15, 0x98, 0x6e, 0x6c, - 0x3b, 0xad, 0xc5, 0x76, 0xbc, 0x5d, 0x71, 0xa3, 0x46, 0xb0, 0x47, 0xc2, 0x7d, 0x26, 0x09, 0x8f, - 0x24, 0x4a, 0x26, 0x05, 0x58, 0xbe, 0xba, 0x58, 0xa3, 0x98, 0xb8, 0xb3, 0x8e, 0x29, 0x82, 0xc0, - 0xb1, 0x89, 0x20, 0x8b, 0x30, 0x29, 0xdb, 0xaa, 0x93, 0x88, 0x1d, 0x0f, 0xa3, 0xac, 0x77, 0xca, - 0x81, 0x4b, 0x14, 0xab, 0xbe, 0xa5, 0xf1, 0xd1, 0x2b, 0x30, 0xee, 0xfa, 0x6e, 0xec, 0x3a, 0x71, - 0x10, 0xb2, 0xc3, 0x75, 0x8c, 0x1f, 0x18, 0x94, 0xc3, 0x57, 0x75, 0x00, 0x36, 0xf1, 0xec, 0xf7, - 0xa0, 0xa4, 0x6c, 0xcd, 0xa4, 0xb9, 0xa4, 0x95, 0x63, 0x2e, 0xd9, 0xfb, 0x44, 0x90, 0x1a, 0xf3, - 0x62, 0xa6, 0xc6, 0xfc, 0x6f, 0x58, 0x90, 0x98, 0xdc, 0xa0, 0xab, 0x50, 0x6a, 0x05, 0xec, 0xd5, - 0x2c, 0x94, 0x4f, 0xd1, 0x8f, 0x66, 0x32, 0x0f, 0xce, 0xa8, 0xf8, 0xf8, 0xd5, 0x64, 0x0d, 0x9c, - 0x54, 0x46, 0x4b, 0x30, 0xdc, 0x0a, 0x49, 0x3d, 0x66, 0x4e, 0x23, 0x3d, 0xe9, 0xf0, 0x35, 0xc2, - 0xf1, 0xb1, 0xac, 0x68, 0xff, 0xa6, 0x05, 0xc0, 0x95, 0xd2, 0x8e, 0xbf, 0x45, 0x4e, 0xe0, 0xa2, - 0x5d, 0x81, 0x81, 0xa8, 0x45, 0x1a, 0xdd, 0xde, 0x33, 0x93, 0xfe, 0xd4, 0x5b, 0xa4, 0x91, 0x0c, - 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xa7, 0x00, 0x26, 0x12, 0x34, 0x7a, 0x01, 0x42, 0xcf, 0x1b, - 0x26, 0xf9, 0x67, 0x53, 0x26, 0xf9, 0x25, 0x86, 0xad, 0x59, 0xe1, 0xbf, 0x07, 0xc5, 0x5d, 0xe7, - 0x9e, 0xb8, 0x65, 0x3d, 0xdb, 0xbd, 0x1b, 0x94, 0xfe, 0xfc, 0x9a, 0x73, 0x8f, 0xcb, 0xb1, 0xcf, - 0xca, 0x05, 0xb2, 0xe6, 0xdc, 0x3b, 0xe4, 0xaf, 0x96, 0x8c, 0x49, 0xd1, 0xcb, 0xdc, 0x17, 0xff, - 0x63, 0xf2, 0x9f, 0x2d, 0x3b, 0xda, 0x08, 0x6b, 0xcb, 0xf5, 0x85, 0x8a, 0xb6, 0xaf, 0xb6, 0x5c, - 0x3f, 0xdd, 0x96, 0xeb, 0xf7, 0xd1, 0x96, 0xeb, 0xa3, 0x0f, 0x60, 0x58, 0x3c, 0x87, 0x30, 0x5b, - 0xc2, 0xd1, 0x4b, 0x0b, 0x7d, 0xb4, 0x27, 0x5e, 0x53, 0x78, 0x9b, 0x0b, 0x52, 0x4e, 0x17, 0xa5, - 0x3d, 0xdb, 0x95, 0x0d, 0xa2, 0xbf, 0x66, 0xc1, 0x84, 0xf8, 0x8d, 0xc9, 0xfb, 0x6d, 0x12, 0xc5, - 0x42, 0x1e, 0xf8, 0x4c, 0xff, 0x7d, 0x10, 0x15, 0x79, 0x57, 0x3e, 0x23, 0xd9, 0xac, 0x09, 0xec, - 0xd9, 0xa3, 0x54, 0x2f, 0xd0, 0x3f, 0xb4, 0x60, 0x66, 0xd7, 0xb9, 0xc7, 0x5b, 0xe4, 0x65, 0xd8, - 0x89, 0xdd, 0x40, 0xd8, 0x46, 0xbe, 0xd6, 0xdf, 0xf4, 0x77, 0x54, 0xe7, 0x9d, 0x94, 0x66, 0x54, - 0x33, 0x59, 0x28, 0x3d, 0xbb, 0x9a, 0xd9, 0xaf, 0xd9, 0x4d, 0x18, 0x91, 0xeb, 0x2d, 0xe3, 0x36, - 0x54, 0xd1, 0x85, 0x9d, 0x23, 0xbf, 0x46, 0x69, 0xb7, 0x27, 0xd6, 0x8e, 0x58, 0x6b, 0x0f, 0xb5, - 0x9d, 0xf7, 0x60, 0x4c, 0x5f, 0x63, 0x0f, 0xb5, 0xad, 0xf7, 0xe1, 0x54, 0xc6, 0x5a, 0x7a, 0xa8, - 0x4d, 0xde, 0x85, 0xb3, 0xb9, 0xeb, 0xe3, 0x61, 0x36, 0x6c, 0xff, 0x86, 0xa5, 0xf3, 0xc1, 0x13, - 0x50, 0x4f, 0x2d, 0x9b, 0xea, 0xa9, 0xf3, 0xdd, 0x77, 0x4e, 0x8e, 0x8e, 0xea, 0x1d, 0xbd, 0xd3, - 0x94, 0xab, 0xa3, 0x37, 0x60, 0xc8, 0xa3, 0x25, 0xf2, 0x1d, 0xce, 0xee, 0xbd, 0x23, 0x13, 0x59, - 0x8a, 0x95, 0x47, 0x58, 0x50, 0xb0, 0x7f, 0xdb, 0x82, 0x81, 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, - 0xf3, 0xb9, 0xa4, 0x45, 0x94, 0x86, 0x79, 0xec, 0xdc, 0x5d, 0x91, 0x91, 0x28, 0x72, 0x06, 0xe6, - 0xff, 0x14, 0x60, 0x94, 0x36, 0x25, 0x0d, 0x46, 0x5e, 0x85, 0x71, 0xcf, 0xd9, 0x20, 0x9e, 0x54, - 0x99, 0xa7, 0x2f, 0xb1, 0xd7, 0x75, 0x20, 0x36, 0x71, 0x69, 0xe5, 0x4d, 0xfd, 0xf5, 0x40, 0xc8, - 0x2f, 0xaa, 0xb2, 0xf1, 0xb4, 0x80, 0x4d, 0x5c, 0x7a, 0x9f, 0xba, 0xeb, 0xc4, 0x8d, 0x6d, 0x71, - 0xc1, 0x55, 0xdd, 0xbd, 0x43, 0x0b, 0x31, 0x87, 0x51, 0x01, 0x4e, 0xae, 0xce, 0xdb, 0x24, 0x64, - 0x02, 0x1c, 0x17, 0x8f, 0x95, 0x00, 0x87, 0x4d, 0x30, 0x4e, 0xe3, 0x67, 0xf8, 0xe6, 0x0d, 0x32, - 0x73, 0x98, 0x3e, 0x7c, 0xf3, 0x50, 0x0d, 0x66, 0x5c, 0xbf, 0xe1, 0xb5, 0x9b, 0xe4, 0x96, 0xcf, - 0xa5, 0x3b, 0xcf, 0xfd, 0x80, 0x34, 0x85, 0x00, 0xad, 0x2c, 0x97, 0xaa, 0x19, 0x38, 0x38, 0xb3, - 0xa6, 0xfd, 0xff, 0xc1, 0xa9, 0xeb, 0x81, 0xd3, 0x5c, 0x72, 0x3c, 0xc7, 0x6f, 0x90, 0xb0, 0xea, - 0x6f, 0xf5, 0x7c, 0x90, 0xd7, 0x9f, 0xcf, 0x0b, 0xbd, 0x9e, 0xcf, 0xed, 0x6d, 0x40, 0x7a, 0x03, - 0xc2, 0x0c, 0x0c, 0xc3, 0xb0, 0xcb, 0x9b, 0x12, 0xcb, 0xff, 0xa9, 0x6c, 0xe9, 0xba, 0xa3, 0x67, - 0x9a, 0x81, 0x13, 0x2f, 0xc0, 0x92, 0x90, 0x7d, 0x19, 0x32, 0x7d, 0x33, 0x7a, 0x5f, 0xa5, 0xed, - 0x97, 0x61, 0x9a, 0xd5, 0x3c, 0xda, 0x35, 0xcf, 0xfe, 0x4b, 0x16, 0x4c, 0xde, 0x48, 0x79, 0xd3, - 0x3e, 0x09, 0x43, 0x3c, 0x1e, 0x4b, 0x5a, 0xe9, 0x55, 0x67, 0xa5, 0x58, 0x40, 0x8f, 0x5d, 0xe7, - 0xf2, 0x5d, 0x0b, 0x4a, 0xca, 0x51, 0xff, 0x04, 0x84, 0xda, 0x65, 0x43, 0xa8, 0xcd, 0xd4, 0x05, - 0xa8, 0xee, 0xe4, 0xc9, 0xb4, 0xe8, 0x9a, 0xf2, 0x0b, 0xed, 0xa2, 0x06, 0x48, 0xc8, 0x70, 0x2f, - 0xc2, 0x09, 0xd3, 0x79, 0x54, 0x7a, 0x8a, 0xb2, 0x17, 0x71, 0x85, 0xfb, 0x31, 0x79, 0x11, 0x57, - 0xfd, 0xc9, 0xe1, 0x7e, 0x35, 0xad, 0xcb, 0xec, 0x54, 0xf8, 0x61, 0x66, 0x35, 0xca, 0xf6, 0xa6, - 0x72, 0xc7, 0x9e, 0x13, 0x56, 0xa0, 0xa2, 0xf4, 0x90, 0x31, 0x32, 0xf1, 0x8f, 0x07, 0x55, 0x48, - 0xaa, 0xd8, 0x57, 0x61, 0x32, 0x35, 0x60, 0xe8, 0x65, 0x18, 0x6c, 0x6d, 0x3b, 0x11, 0x49, 0x59, - 0x01, 0x0d, 0xd6, 0x68, 0xe1, 0xe1, 0xc1, 0xdc, 0x84, 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6, 0xff, - 0x87, 0x05, 0x03, 0x37, 0x82, 0xe6, 0x49, 0x2c, 0xa6, 0xd7, 0x8d, 0xc5, 0xf4, 0x58, 0x5e, 0x48, - 0x9a, 0xdc, 0x75, 0xb4, 0x9a, 0x5a, 0x47, 0xe7, 0x73, 0x29, 0x74, 0x5f, 0x42, 0xbb, 0x30, 0xca, - 0x02, 0xdd, 0x08, 0xab, 0xa4, 0x17, 0x8d, 0xfb, 0xd5, 0x5c, 0xea, 0x7e, 0x35, 0xa9, 0xa1, 0x6a, - 0xb7, 0xac, 0xa7, 0x61, 0x58, 0x58, 0xc6, 0xa4, 0xed, 0x63, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0x97, - 0x8b, 0x60, 0x04, 0xd6, 0x41, 0xbf, 0x63, 0xc1, 0x7c, 0xc8, 0x3d, 0x82, 0x9a, 0x95, 0x76, 0xe8, - 0xfa, 0x5b, 0xf5, 0xc6, 0x36, 0x69, 0xb6, 0x3d, 0xd7, 0xdf, 0xaa, 0x6e, 0xf9, 0x81, 0x2a, 0x5e, - 0xb9, 0x47, 0x1a, 0x6d, 0xa6, 0x07, 0xef, 0x11, 0xc5, 0x47, 0xbd, 0x3c, 0x5f, 0xba, 0x7f, 0x30, - 0x37, 0x8f, 0x8f, 0x44, 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, 0x1b, 0x16, 0x2c, 0xf0, 0x78, 0x33, 0xfd, - 0xf7, 0xbf, 0xcb, 0x6d, 0xb4, 0x26, 0x49, 0x25, 0x44, 0xd6, 0x49, 0xb8, 0xbb, 0xf4, 0x8a, 0x18, - 0xd0, 0x85, 0xda, 0xd1, 0xda, 0xc2, 0x47, 0xed, 0x9c, 0xfd, 0x2f, 0x8a, 0x30, 0x4e, 0x47, 0x31, - 0xf1, 0x82, 0x7f, 0xd9, 0x58, 0x12, 0x8f, 0xa7, 0x96, 0xc4, 0xb4, 0x81, 0x7c, 0x3c, 0x0e, 0xf0, - 0x11, 0x4c, 0x7b, 0x4e, 0x14, 0x5f, 0x25, 0x4e, 0x18, 0x6f, 0x10, 0x87, 0x3d, 0xf5, 0x8a, 0x65, - 0x7e, 0x94, 0xd7, 0x63, 0xa5, 0xfe, 0xba, 0x9e, 0x26, 0x86, 0x3b, 0xe9, 0xa3, 0x3d, 0x40, 0xec, - 0x59, 0x39, 0x74, 0xfc, 0x88, 0x7f, 0x8b, 0x2b, 0x74, 0xe4, 0x47, 0x6b, 0x75, 0x56, 0xb4, 0x8a, - 0xae, 0x77, 0x50, 0xc3, 0x19, 0x2d, 0x68, 0xe6, 0x02, 0x83, 0xfd, 0x9a, 0x0b, 0x0c, 0xf5, 0x30, - 0x42, 0xdf, 0x85, 0x29, 0x31, 0x2b, 0x9b, 0xee, 0x96, 0x38, 0xa4, 0xdf, 0x4a, 0x99, 0x13, 0x59, - 0xfd, 0x1b, 0x3e, 0xf4, 0xb0, 0x25, 0xb2, 0x7f, 0x1c, 0x4e, 0xd1, 0xe6, 0x4c, 0x93, 0xe9, 0x08, - 0x11, 0x98, 0xdc, 0x69, 0x6f, 0x10, 0x8f, 0xc4, 0xb2, 0x4c, 0x34, 0x9a, 0x29, 0xf6, 0x9b, 0xb5, - 0x13, 0xd9, 0xf2, 0x9a, 0x49, 0x02, 0xa7, 0x69, 0xda, 0xbf, 0x62, 0x01, 0x33, 0x4c, 0x3c, 0x81, - 0xe3, 0xef, 0x73, 0xe6, 0xf1, 0x57, 0xce, 0xe3, 0x40, 0x39, 0x27, 0xdf, 0x4b, 0x7c, 0x5a, 0x6a, - 0x61, 0x70, 0x6f, 0x5f, 0xca, 0xfe, 0xbd, 0x25, 0xae, 0xff, 0x6d, 0xf1, 0x0d, 0xa9, 0x1c, 0x24, - 0xd1, 0x4f, 0xc0, 0x48, 0xc3, 0x69, 0x39, 0x0d, 0x1e, 0xd1, 0x2c, 0x57, 0xfb, 0x63, 0x54, 0x9a, - 0x5f, 0x16, 0x35, 0xb8, 0x36, 0xe3, 0xd3, 0xf2, 0x2b, 0x65, 0x71, 0x4f, 0x0d, 0x86, 0x6a, 0x72, - 0x76, 0x07, 0xc6, 0x0d, 0x62, 0x0f, 0xf5, 0xea, 0xfb, 0x13, 0xfc, 0xb8, 0x50, 0x37, 0x96, 0x5d, - 0x98, 0xf6, 0xb5, 0xff, 0x94, 0x39, 0x4a, 0x71, 0xfa, 0x93, 0xbd, 0x0e, 0x04, 0xc6, 0x49, 0x35, - 0xc3, 0xcb, 0x14, 0x19, 0xdc, 0x49, 0xd9, 0xfe, 0x5b, 0x16, 0x3c, 0xa2, 0x23, 0x6a, 0xbe, 0xab, - 0xbd, 0xf4, 0xc9, 0x15, 0x18, 0x09, 0x5a, 0x24, 0x74, 0x92, 0x3b, 0xd9, 0x45, 0x39, 0xe8, 0x37, - 0x45, 0xf9, 0xe1, 0xc1, 0xdc, 0x8c, 0x4e, 0x5d, 0x96, 0x63, 0x55, 0x13, 0xd9, 0x30, 0xc4, 0x06, - 0x23, 0x12, 0x7e, 0xc5, 0x2c, 0xea, 0x17, 0x7b, 0xee, 0x8a, 0xb0, 0x80, 0xd8, 0x3f, 0x65, 0xf1, - 0x85, 0xa5, 0x77, 0x1d, 0xbd, 0x0f, 0x53, 0xbb, 0xf4, 0xfa, 0xb6, 0x72, 0xaf, 0x15, 0x72, 0x35, - 0xba, 0x1c, 0xa7, 0x67, 0x7b, 0x8d, 0x93, 0xf6, 0x91, 0x4b, 0x65, 0xd1, 0xe7, 0xa9, 0xb5, 0x14, - 0x31, 0xdc, 0x41, 0xde, 0xfe, 0xd3, 0x02, 0xdf, 0x89, 0x4c, 0xaa, 0x7b, 0x1a, 0x86, 0x5b, 0x41, - 0x73, 0xb9, 0x5a, 0xc1, 0x62, 0x84, 0x14, 0xbb, 0xaa, 0xf1, 0x62, 0x2c, 0xe1, 0xe8, 0x12, 0x00, - 0xb9, 0x17, 0x93, 0xd0, 0x77, 0x3c, 0xf5, 0x18, 0xaf, 0x84, 0xa7, 0x15, 0x05, 0xc1, 0x1a, 0x16, - 0xad, 0xd3, 0x0a, 0x83, 0x3d, 0xb7, 0xc9, 0x1c, 0x3b, 0x8a, 0x66, 0x9d, 0x9a, 0x82, 0x60, 0x0d, - 0x8b, 0x5e, 0x95, 0xdb, 0x7e, 0xc4, 0x0f, 0x40, 0x67, 0x43, 0x84, 0xe2, 0x19, 0x49, 0xae, 0xca, - 0xb7, 0x74, 0x20, 0x36, 0x71, 0xd1, 0x22, 0x0c, 0xc5, 0x0e, 0x7b, 0x62, 0x1e, 0xcc, 0x37, 0xd9, - 0x59, 0xa7, 0x18, 0x7a, 0x88, 0x2b, 0x5a, 0x01, 0x8b, 0x8a, 0xe8, 0x6d, 0xc9, 0x82, 0x39, 0x4b, - 0x16, 0xa6, 0x57, 0xb9, 0xcb, 0x56, 0x67, 0xdf, 0x3a, 0x0f, 0x16, 0x26, 0x5d, 0x06, 0x2d, 0xfb, - 0x27, 0x4b, 0x00, 0x89, 0xb4, 0x87, 0x3e, 0xe8, 0x60, 0x11, 0xcf, 0x75, 0x97, 0x0f, 0x8f, 0x8f, - 0x3f, 0xa0, 0x2f, 0x59, 0x30, 0xea, 0x78, 0x5e, 0xd0, 0x70, 0x62, 0x36, 0xca, 0x85, 0xee, 0x2c, - 0x4a, 0xb4, 0xbf, 0x98, 0xd4, 0xe0, 0x5d, 0x78, 0x51, 0xbe, 0x1e, 0x6b, 0x90, 0x9e, 0xbd, 0xd0, - 0x1b, 0x46, 0x9f, 0x96, 0x97, 0x00, 0xbe, 0x3c, 0x66, 0xd3, 0x97, 0x80, 0x12, 0xe3, 0xc6, 0x9a, - 0xfc, 0x8f, 0x6e, 0x19, 0x31, 0x6b, 0x06, 0xf2, 0xdd, 0x73, 0x0d, 0xa1, 0xa7, 0x57, 0xb8, 0x1a, - 0x54, 0xd3, 0x4d, 0xd0, 0x07, 0xf3, 0x7d, 0xd8, 0x35, 0xe9, 0xba, 0x87, 0xf9, 0xf9, 0x7b, 0x30, - 0xd9, 0x34, 0x8f, 0x5b, 0xb1, 0x9a, 0x9e, 0xca, 0xa3, 0x9b, 0x3a, 0x9d, 0x93, 0x03, 0x36, 0x05, - 0xc0, 0x69, 0xc2, 0xa8, 0xc6, 0x9d, 0x01, 0xaa, 0xfe, 0x66, 0x20, 0x4c, 0xf8, 0xec, 0xdc, 0xb9, - 0xdc, 0x8f, 0x62, 0xb2, 0x4b, 0x31, 0x93, 0x73, 0xf4, 0x86, 0xa8, 0x8b, 0x15, 0x15, 0xf4, 0x06, - 0x0c, 0x31, 0x0f, 0xad, 0xa8, 0x3c, 0x92, 0xaf, 0x07, 0x34, 0x9d, 0x8b, 0x93, 0x4d, 0xc5, 0xfe, - 0x46, 0x58, 0x50, 0x40, 0x57, 0x65, 0x88, 0x80, 0xa8, 0xea, 0xdf, 0x8a, 0x08, 0x0b, 0x11, 0x50, - 0x5a, 0xfa, 0x64, 0xe2, 0xfd, 0xcf, 0xcb, 0x33, 0x83, 0x59, 0x1a, 0x35, 0xa9, 0xbc, 0x22, 0xfe, - 0xcb, 0x18, 0x99, 0x65, 0xc8, 0xef, 0x9e, 0x19, 0x47, 0x33, 0x19, 0xce, 0xdb, 0x26, 0x09, 0x9c, - 0xa6, 0x79, 0xa2, 0xc7, 0xe7, 0xac, 0x0f, 0x53, 0xe9, 0x8d, 0xf5, 0x50, 0x8f, 0xeb, 0xef, 0x0c, - 0xc0, 0x84, 0xb9, 0x10, 0xd0, 0x02, 0x94, 0x04, 0x11, 0x15, 0x2e, 0x4c, 0xad, 0xed, 0x35, 0x09, - 0xc0, 0x09, 0x0e, 0x0b, 0x97, 0xc6, 0xaa, 0x6b, 0xb6, 0x59, 0x49, 0xb8, 0x34, 0x05, 0xc1, 0x1a, - 0x16, 0x15, 0xa2, 0x37, 0x82, 0x20, 0x56, 0x47, 0x81, 0x5a, 0x2d, 0x4b, 0xac, 0x14, 0x0b, 0x28, - 0x3d, 0x02, 0x76, 0x48, 0xe8, 0x13, 0xcf, 0xd4, 0x64, 0xaa, 0x23, 0xe0, 0x9a, 0x0e, 0xc4, 0x26, - 0x2e, 0x3d, 0xd2, 0x82, 0x88, 0x2d, 0x3f, 0x21, 0xaa, 0x27, 0xb6, 0x6e, 0x75, 0xee, 0xa1, 0x28, - 0xe1, 0xe8, 0x2d, 0x78, 0x44, 0x39, 0x14, 0x62, 0xae, 0x19, 0x96, 0x2d, 0x0e, 0x19, 0x37, 0xeb, - 0x47, 0x96, 0xb3, 0xd1, 0x70, 0x5e, 0x7d, 0xf4, 0x3a, 0x4c, 0x08, 0x11, 0x58, 0x52, 0x1c, 0x36, - 0x8d, 0x15, 0xae, 0x19, 0x50, 0x9c, 0xc2, 0x46, 0x15, 0x98, 0xa2, 0x25, 0x4c, 0x0a, 0x95, 0x14, - 0xb8, 0x63, 0xa4, 0x3a, 0xeb, 0xaf, 0xa5, 0xe0, 0xb8, 0xa3, 0x06, 0x5a, 0x84, 0x49, 0x2e, 0xa3, - 0xd0, 0x3b, 0x25, 0x9b, 0x07, 0x61, 0x59, 0xab, 0x36, 0xc2, 0x4d, 0x13, 0x8c, 0xd3, 0xf8, 0xe8, - 0x32, 0x8c, 0x39, 0x61, 0x63, 0xdb, 0x8d, 0x49, 0x23, 0x6e, 0x87, 0x3c, 0x00, 0x87, 0x66, 0xed, - 0xb1, 0xa8, 0xc1, 0xb0, 0x81, 0x69, 0x7f, 0x00, 0xa7, 0x32, 0x8c, 0xf2, 0xe9, 0xc2, 0x71, 0x5a, - 0xae, 0xfc, 0xa6, 0x94, 0xd5, 0xda, 0x62, 0xad, 0x2a, 0xbf, 0x46, 0xc3, 0xa2, 0xab, 0x93, 0xa9, - 0xc4, 0xb5, 0x40, 0xb6, 0x6a, 0x75, 0xae, 0x4a, 0x00, 0x4e, 0x70, 0xec, 0xdf, 0x07, 0xd0, 0x14, - 0x3a, 0x7d, 0xd8, 0x2c, 0x5d, 0x86, 0x31, 0x19, 0x7d, 0x59, 0x8b, 0xfa, 0xa9, 0x3e, 0xf3, 0x8a, - 0x06, 0xc3, 0x06, 0x26, 0xed, 0x9b, 0xaf, 0x62, 0x96, 0xa6, 0x6c, 0xe4, 0x92, 0x88, 0xa5, 0x09, - 0x0e, 0x7a, 0x0e, 0x46, 0x22, 0xe2, 0x6d, 0x5e, 0x77, 0xfd, 0x1d, 0xb1, 0xb0, 0x15, 0x17, 0xae, - 0x8b, 0x72, 0xac, 0x30, 0xd0, 0x12, 0x14, 0xdb, 0x6e, 0x53, 0x2c, 0x65, 0x79, 0xe0, 0x17, 0x6f, - 0x55, 0x2b, 0x87, 0x07, 0x73, 0x8f, 0xe7, 0x05, 0x95, 0xa6, 0x57, 0xfb, 0x68, 0x9e, 0x6e, 0x3f, - 0x5a, 0x39, 0xeb, 0x6d, 0x60, 0xe8, 0x88, 0x6f, 0x03, 0x97, 0x00, 0xc4, 0x57, 0xcb, 0xb5, 0x5c, - 0x4c, 0x66, 0xed, 0x8a, 0x82, 0x60, 0x0d, 0x0b, 0x45, 0x30, 0xdd, 0x08, 0x89, 0x23, 0xef, 0xd0, - 0xdc, 0xbc, 0x7c, 0xe4, 0xc1, 0x15, 0x04, 0xcb, 0x69, 0x62, 0xb8, 0x93, 0x3e, 0x0a, 0x60, 0xba, - 0x29, 0xfc, 0x57, 0x93, 0x46, 0x4b, 0x47, 0xb7, 0x69, 0x67, 0x06, 0x39, 0x69, 0x42, 0xb8, 0x93, - 0x36, 0x7a, 0x17, 0x66, 0x65, 0x61, 0xa7, 0xcb, 0x30, 0xdb, 0x2e, 0xc5, 0xa5, 0xf3, 0xf7, 0x0f, - 0xe6, 0x66, 0x2b, 0xb9, 0x58, 0xb8, 0x0b, 0x05, 0x84, 0x61, 0x88, 0xbd, 0x25, 0x45, 0xe5, 0x51, - 0x76, 0xce, 0x3d, 0x93, 0xaf, 0x0c, 0xa0, 0x6b, 0x7d, 0x9e, 0xbd, 0x43, 0x09, 0x33, 0xdf, 0xe4, - 0x59, 0x8e, 0x15, 0x62, 0x41, 0x09, 0x6d, 0xc2, 0xa8, 0xe3, 0xfb, 0x41, 0xec, 0x70, 0x11, 0x6a, - 0x2c, 0x5f, 0xf6, 0xd3, 0x08, 0x2f, 0x26, 0x35, 0x38, 0x75, 0x65, 0x39, 0xa8, 0x41, 0xb0, 0x4e, - 0x18, 0xdd, 0x85, 0xc9, 0xe0, 0x2e, 0x65, 0x8e, 0x52, 0x4b, 0x11, 0x95, 0xc7, 0x59, 0x5b, 0x2f, - 0xf5, 0xa9, 0xa7, 0x35, 0x2a, 0x6b, 0x5c, 0xcb, 0x24, 0x8a, 0xd3, 0xad, 0xa0, 0x79, 0x43, 0x5b, - 0x3d, 0x91, 0xd8, 0xb3, 0x27, 0xda, 0x6a, 0x5d, 0x39, 0xcd, 0x5c, 0xd0, 0xb9, 0xd9, 0x2a, 0xdb, - 0xfd, 0x93, 0x29, 0x17, 0xf4, 0x04, 0x84, 0x75, 0x3c, 0xb4, 0x0d, 0x63, 0xc9, 0x93, 0x55, 0x18, - 0xb1, 0x08, 0x35, 0xa3, 0x97, 0x2e, 0xf5, 0xf7, 0x71, 0x55, 0xad, 0x26, 0xbf, 0x39, 0xe8, 0x25, - 0xd8, 0xa0, 0x3c, 0xfb, 0x43, 0x30, 0xaa, 0x4d, 0xec, 0x51, 0xac, 0xb2, 0x67, 0x5f, 0x87, 0xa9, - 0xf4, 0xd4, 0x1d, 0xc9, 0xaa, 0xfb, 0x7f, 0x15, 0x60, 0x32, 0xe3, 0xe5, 0x8a, 0x05, 0xa6, 0x4e, - 0x31, 0xd4, 0x24, 0x0e, 0xb5, 0xc9, 0x16, 0x0b, 0x7d, 0xb0, 0x45, 0xc9, 0xa3, 0x8b, 0xb9, 0x3c, - 0x5a, 0xb0, 0xc2, 0x81, 0x0f, 0xc3, 0x0a, 0xcd, 0xd3, 0x67, 0xb0, 0xaf, 0xd3, 0xe7, 0x18, 0xd8, - 0xa7, 0x71, 0x80, 0x0d, 0xf7, 0x71, 0x80, 0xfd, 0x5c, 0x01, 0xa6, 0xd2, 0xf1, 0x84, 0x4f, 0xe0, - 0xbd, 0xe3, 0x0d, 0xe3, 0xbd, 0x23, 0x3b, 0xcc, 0x7b, 0x3a, 0xca, 0x71, 0xde, 0xdb, 0x07, 0x4e, - 0xbd, 0x7d, 0x3c, 0xd3, 0x17, 0xb5, 0xee, 0xef, 0x20, 0x7f, 0xbb, 0x00, 0xa7, 0xd3, 0x55, 0x96, - 0x3d, 0xc7, 0xdd, 0x3d, 0x81, 0xb1, 0xb9, 0x69, 0x8c, 0xcd, 0xf3, 0xfd, 0x7c, 0x0d, 0xeb, 0x5a, - 0xee, 0x00, 0xdd, 0x49, 0x0d, 0xd0, 0x42, 0xff, 0x24, 0xbb, 0x8f, 0xd2, 0x37, 0x8b, 0x70, 0x3e, - 0xb3, 0x5e, 0xf2, 0x5c, 0xb0, 0x6a, 0x3c, 0x17, 0x5c, 0x4a, 0x3d, 0x17, 0xd8, 0xdd, 0x6b, 0x1f, - 0xcf, 0xfb, 0x81, 0xf0, 0x3c, 0x63, 0xd1, 0xd3, 0x1e, 0xf0, 0xed, 0xc0, 0xf0, 0x3c, 0x53, 0x84, - 0xb0, 0x49, 0xf7, 0xfb, 0xe9, 0xcd, 0xe0, 0xf7, 0x2d, 0x38, 0x9b, 0x39, 0x37, 0x27, 0xa0, 0x57, - 0xbf, 0x61, 0xea, 0xd5, 0x9f, 0xee, 0x7b, 0xb5, 0xe6, 0x28, 0xda, 0x7f, 0xa9, 0x98, 0xf3, 0x2d, - 0x4c, 0x33, 0x79, 0x13, 0x46, 0x9d, 0x46, 0x83, 0x44, 0xd1, 0x5a, 0xd0, 0x54, 0xc1, 0xca, 0x9e, - 0x67, 0xd2, 0x46, 0x52, 0x7c, 0x78, 0x30, 0x37, 0x9b, 0x26, 0x91, 0x80, 0xb1, 0x4e, 0xc1, 0x0c, - 0x80, 0x58, 0x38, 0xd6, 0x00, 0x88, 0x97, 0x00, 0xf6, 0x94, 0xbe, 0x22, 0xad, 0xe6, 0xd4, 0x34, - 0x19, 0x1a, 0x16, 0xfa, 0x31, 0x76, 0x0b, 0xe0, 0xc6, 0x40, 0x7c, 0x29, 0xbe, 0xd8, 0xe7, 0x5c, - 0xe9, 0x86, 0x45, 0xdc, 0xc5, 0x59, 0xa9, 0x84, 0x15, 0x49, 0xf4, 0x23, 0x30, 0x15, 0xf1, 0x08, - 0x1a, 0xcb, 0x9e, 0x13, 0x31, 0xc7, 0x1a, 0xb1, 0x0a, 0x99, 0xdf, 0x72, 0x3d, 0x05, 0xc3, 0x1d, - 0xd8, 0xf6, 0xcf, 0x0d, 0xc0, 0xa3, 0x5d, 0x98, 0x0f, 0x5a, 0x34, 0x1f, 0xef, 0x9f, 0x4d, 0xeb, - 0xed, 0x66, 0x33, 0x2b, 0x1b, 0x8a, 0xbc, 0xd4, 0x1c, 0x17, 0x3e, 0xf4, 0x1c, 0xff, 0xb4, 0xa5, - 0x69, 0x54, 0xb9, 0x89, 0xef, 0xe7, 0x8e, 0xc8, 0x54, 0x8f, 0x51, 0xc5, 0xba, 0x99, 0xa1, 0xa7, - 0xbc, 0xd4, 0x77, 0x77, 0xfa, 0x56, 0x5c, 0x9e, 0xec, 0x53, 0xcf, 0x17, 0x2d, 0x78, 0x3c, 0xb3, - 0xbf, 0x86, 0xb1, 0xd1, 0x02, 0x94, 0x1a, 0xb4, 0x50, 0x73, 0xb2, 0x4b, 0x5c, 0x5d, 0x25, 0x00, - 0x27, 0x38, 0x86, 0x4d, 0x51, 0xa1, 0xa7, 0x4d, 0xd1, 0x3f, 0xb7, 0x60, 0x26, 0xdd, 0x89, 0x13, - 0xe0, 0x80, 0x55, 0x93, 0x03, 0x7e, 0xb2, 0x9f, 0xb9, 0xcc, 0x61, 0x7e, 0xff, 0x76, 0x12, 0xce, - 0xe4, 0xe4, 0x8b, 0xd8, 0x83, 0xe9, 0xad, 0x06, 0x31, 0xdd, 0x17, 0xc5, 0xc7, 0x64, 0x7a, 0x7a, - 0x76, 0xf5, 0x75, 0xe4, 0x17, 0xd9, 0x0e, 0x14, 0xdc, 0xd9, 0x04, 0xfa, 0xa2, 0x05, 0x33, 0xce, - 0xdd, 0xa8, 0x23, 0xdb, 0x94, 0x58, 0x33, 0x2f, 0x65, 0xea, 0x57, 0x7b, 0x64, 0xa7, 0x62, 0x2e, - 0x46, 0x33, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x84, 0x45, 0x5c, 0x48, 0x2a, 0x27, 0x77, 0x71, 0xb0, - 0xcd, 0x72, 0x7f, 0xe2, 0xbc, 0x50, 0x42, 0xb0, 0xa2, 0x83, 0x6e, 0x43, 0x69, 0x4b, 0xfa, 0x24, - 0x0a, 0x5e, 0x9b, 0x79, 0x78, 0x65, 0x3a, 0x2e, 0x72, 0x9f, 0x0f, 0x05, 0xc2, 0x09, 0x29, 0xf4, - 0x3a, 0x14, 0xfd, 0xcd, 0xa8, 0x5b, 0xc2, 0x8c, 0x94, 0x0d, 0x1e, 0xf7, 0x94, 0xbe, 0xb1, 0x5a, - 0xc7, 0xb4, 0x22, 0xba, 0x0a, 0xc5, 0x70, 0xa3, 0x29, 0x9e, 0x04, 0x32, 0xe5, 0x49, 0xbc, 0x54, - 0xc9, 0x5e, 0x24, 0x9c, 0x12, 0x5e, 0xaa, 0x60, 0x4a, 0x02, 0xad, 0xc2, 0x20, 0x73, 0x76, 0x12, - 0x9a, 0xff, 0xcc, 0x98, 0x0f, 0x1d, 0x8e, 0x5c, 0xdc, 0x89, 0x9a, 0x15, 0x63, 0x5e, 0x1d, 0xbd, - 0x01, 0x43, 0x0d, 0x96, 0x49, 0x42, 0xa8, 0x69, 0xb2, 0xe3, 0x98, 0x74, 0xe4, 0x9a, 0xe0, 0xef, - 0x9d, 0xbc, 0x1c, 0x0b, 0x0a, 0x68, 0x1d, 0x86, 0x1a, 0xa4, 0xb5, 0xbd, 0x19, 0x09, 0xed, 0xcb, - 0xa7, 0x33, 0x69, 0x75, 0x49, 0x9c, 0x22, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x42, 0x61, - 0xb3, 0x21, 0xfc, 0x9e, 0x32, 0x35, 0xfe, 0xa6, 0x63, 0xfb, 0xd2, 0xd0, 0xfd, 0x83, 0xb9, 0xc2, - 0xea, 0x32, 0x2e, 0x6c, 0x36, 0xd0, 0x0d, 0x18, 0xde, 0xe4, 0xde, 0xc9, 0x22, 0xe2, 0xef, 0x53, - 0xd9, 0x8e, 0xd3, 0x1d, 0x0e, 0xcc, 0xdc, 0x5f, 0x47, 0x00, 0xb0, 0x24, 0x82, 0xd6, 0x01, 0x36, - 0x95, 0x97, 0xb5, 0x08, 0xf9, 0xfb, 0xc9, 0x7e, 0x7c, 0xb1, 0x85, 0x2a, 0x42, 0x95, 0x62, 0x8d, - 0x0e, 0xfa, 0x02, 0x94, 0x1c, 0x99, 0xc9, 0x88, 0x85, 0xfb, 0x35, 0x25, 0x83, 0x64, 0xeb, 0x75, - 0x4f, 0xf2, 0xc4, 0xd7, 0xad, 0x42, 0xc2, 0x09, 0x51, 0xb4, 0x03, 0xe3, 0x7b, 0x51, 0x6b, 0x9b, - 0xc8, 0xad, 0xca, 0x62, 0x00, 0xe7, 0x1c, 0x4d, 0xb7, 0x05, 0xa2, 0x1b, 0xc6, 0x6d, 0xc7, 0xeb, - 0xe0, 0x2e, 0xcc, 0xb9, 0xeb, 0xb6, 0x4e, 0x0c, 0x9b, 0xb4, 0xe9, 0xa0, 0xbf, 0xdf, 0x0e, 0x36, - 0xf6, 0x63, 0x22, 0x22, 0x03, 0x67, 0x0e, 0xfa, 0x9b, 0x1c, 0xa5, 0x73, 0xd0, 0x05, 0x00, 0x4b, - 0x22, 0x74, 0x33, 0x3b, 0x32, 0x4b, 0x98, 0xd0, 0xb7, 0x3c, 0x9d, 0x3b, 0x3c, 0x1d, 0xfd, 0x4d, - 0x06, 0x85, 0x71, 0xc1, 0x84, 0x14, 0xe3, 0x7e, 0xad, 0xed, 0x20, 0x0e, 0xfc, 0x14, 0xe7, 0x9d, - 0xce, 0xe7, 0x7e, 0xb5, 0x0c, 0xfc, 0x4e, 0xee, 0x97, 0x85, 0x85, 0x33, 0xdb, 0x42, 0x4d, 0x98, - 0x68, 0x05, 0x61, 0x7c, 0x37, 0x08, 0xe5, 0xaa, 0x42, 0x5d, 0x2e, 0xe2, 0x06, 0xa6, 0x68, 0x91, - 0xd9, 0x6a, 0x9b, 0x10, 0x9c, 0xa2, 0x89, 0x3e, 0x0f, 0xc3, 0x51, 0xc3, 0xf1, 0x48, 0xf5, 0x66, - 0xf9, 0x54, 0xfe, 0xb1, 0x52, 0xe7, 0x28, 0x39, 0xab, 0x8b, 0x4d, 0x8e, 0x40, 0xc1, 0x92, 0x1c, - 0xe5, 0x43, 0x2c, 0xdc, 0x3c, 0x0b, 0x6a, 0x9c, 0xc3, 0x87, 0x3a, 0xec, 0x99, 0x39, 0x1f, 0x62, - 0xc5, 0x98, 0x57, 0xa7, 0x7b, 0x40, 0xc8, 0xa3, 0x41, 0x54, 0x3e, 0x9d, 0xbf, 0x07, 0x84, 0x18, - 0x7b, 0xb3, 0xde, 0x6d, 0x0f, 0x28, 0x24, 0x9c, 0x10, 0xa5, 0xbc, 0x97, 0xf2, 0xcb, 0x33, 0xf9, - 0xbc, 0x37, 0x37, 0xcd, 0x15, 0xe7, 0xbd, 0x94, 0x6b, 0x52, 0x12, 0xf6, 0x57, 0x87, 0x3a, 0x65, - 0x11, 0x76, 0x83, 0xf9, 0x49, 0xab, 0xe3, 0x79, 0xff, 0x33, 0xfd, 0x2a, 0x54, 0x8e, 0x51, 0x0a, - 0xfd, 0xa2, 0x05, 0x67, 0x5a, 0x99, 0x1f, 0x22, 0x0e, 0xf6, 0xfe, 0xf4, 0x32, 0xfc, 0xd3, 0x55, - 0xe0, 0xf1, 0x6c, 0x38, 0xce, 0x69, 0x29, 0x2d, 0xe9, 0x17, 0x3f, 0xb4, 0xa4, 0xbf, 0x06, 0x23, - 0x4c, 0x78, 0x4c, 0x02, 0x1d, 0xf5, 0x65, 0x24, 0xc7, 0x44, 0x84, 0x65, 0x51, 0x11, 0x2b, 0x12, - 0xe8, 0x67, 0x2c, 0x38, 0x97, 0xee, 0x3a, 0x26, 0x0c, 0x2c, 0x82, 0x66, 0xf2, 0xcb, 0xd3, 0xaa, - 0xf8, 0xfe, 0x73, 0xb5, 0x6e, 0xc8, 0x87, 0xbd, 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x25, 0xe3, 0xf6, - 0x36, 0x64, 0xbe, 0xfe, 0xf5, 0xbe, 0xc1, 0xa1, 0x97, 0x60, 0x6c, 0x37, 0x68, 0xfb, 0xd2, 0x83, - 0x45, 0xf8, 0x27, 0x33, 0x4d, 0xf3, 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0x93, 0xbd, 0x4d, 0x7c, 0xd9, - 0xca, 0x10, 0x83, 0xf9, 0xfd, 0xf2, 0x35, 0xf3, 0x7e, 0xf9, 0x64, 0xfa, 0x7e, 0xd9, 0xa1, 0x07, - 0x34, 0xae, 0x96, 0xfd, 0x07, 0x03, 0xee, 0x37, 0x12, 0x94, 0xed, 0xc1, 0x85, 0x5e, 0x0c, 0x9f, - 0x19, 0x0a, 0x36, 0xd5, 0x0b, 0x7a, 0x62, 0x28, 0xd8, 0xac, 0x56, 0x30, 0x83, 0xf4, 0x1b, 0x53, - 0xc4, 0xfe, 0x6f, 0x16, 0x14, 0x6b, 0x41, 0xf3, 0x04, 0xf4, 0x9a, 0x9f, 0x33, 0xf4, 0x9a, 0x8f, - 0xe6, 0xe4, 0x31, 0xcd, 0xd5, 0x62, 0xae, 0xa4, 0xb4, 0x98, 0xe7, 0xf2, 0x08, 0x74, 0xd7, 0x59, - 0xfe, 0x9d, 0x22, 0xe8, 0x59, 0x57, 0xd1, 0xbf, 0x7c, 0x10, 0x8b, 0xf3, 0x62, 0xb7, 0x44, 0xac, - 0x82, 0x32, 0xb3, 0x2f, 0x94, 0xce, 0xac, 0xdf, 0x63, 0x86, 0xe7, 0x77, 0x88, 0xbb, 0xb5, 0x1d, - 0x93, 0x66, 0xfa, 0x73, 0x4e, 0xce, 0xf0, 0xfc, 0x3f, 0x5b, 0x30, 0x99, 0x6a, 0x1d, 0x79, 0x59, - 0x9e, 0x71, 0x0f, 0xa8, 0xcf, 0x9a, 0xee, 0xe9, 0x4a, 0x37, 0x0f, 0xa0, 0x1e, 0x8d, 0xa4, 0xce, - 0x88, 0xc9, 0xd3, 0xea, 0x55, 0x29, 0xc2, 0x1a, 0x06, 0x7a, 0x19, 0x46, 0xe3, 0xa0, 0x15, 0x78, - 0xc1, 0xd6, 0xfe, 0x35, 0x22, 0xa3, 0xd8, 0xa8, 0xa7, 0xbd, 0xf5, 0x04, 0x84, 0x75, 0x3c, 0xfb, - 0x57, 0x8b, 0x90, 0xce, 0xd4, 0xfb, 0x83, 0x35, 0xf9, 0xf1, 0x5c, 0x93, 0xdf, 0xb4, 0x60, 0x8a, - 0xb6, 0xce, 0x6c, 0xb7, 0xa4, 0xc9, 0xb6, 0xca, 0x1a, 0x62, 0x75, 0xc9, 0x1a, 0xf2, 0x24, 0xe5, - 0x5d, 0xcd, 0xa0, 0x1d, 0x0b, 0x9d, 0x93, 0xc6, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, 0xc2, - 0x50, 0xf8, 0xbb, 0xe9, 0x78, 0x24, 0x0c, 0xb1, 0x80, 0xca, 0xa4, 0x22, 0x03, 0x39, 0x49, 0x45, - 0x58, 0x00, 0x38, 0x61, 0x2f, 0x24, 0x04, 0x0a, 0x2d, 0x00, 0x9c, 0x34, 0x24, 0x4a, 0x70, 0xec, - 0xdf, 0x28, 0xc2, 0x58, 0x2d, 0x68, 0x26, 0xcf, 0x36, 0x2f, 0x19, 0xcf, 0x36, 0x17, 0x52, 0xcf, - 0x36, 0x53, 0x3a, 0xee, 0x0f, 0x1e, 0x69, 0x3e, 0xaa, 0x47, 0x9a, 0x3f, 0xb3, 0x60, 0xa2, 0x16, - 0x34, 0xe9, 0x02, 0xfd, 0x7e, 0x5a, 0x8d, 0x7a, 0x78, 0xc1, 0xa1, 0x2e, 0xe1, 0x05, 0xff, 0xae, - 0x05, 0xc3, 0xb5, 0xa0, 0x79, 0x02, 0xfa, 0xd8, 0xd7, 0x4c, 0x7d, 0xec, 0x23, 0x39, 0x5c, 0x36, - 0x47, 0x05, 0xfb, 0x95, 0x22, 0x8c, 0xd3, 0x7e, 0x06, 0x5b, 0x72, 0x96, 0x8c, 0x11, 0xb1, 0xfa, - 0x18, 0x11, 0x2a, 0xcc, 0x05, 0x9e, 0x17, 0xdc, 0x4d, 0xcf, 0xd8, 0x2a, 0x2b, 0xc5, 0x02, 0x8a, - 0x9e, 0x83, 0x91, 0x56, 0x48, 0xf6, 0xdc, 0xa0, 0x1d, 0xa5, 0x3d, 0x66, 0x6b, 0xa2, 0x1c, 0x2b, - 0x0c, 0x2a, 0xb7, 0x47, 0xae, 0xdf, 0x20, 0xd2, 0x86, 0x68, 0x80, 0xd9, 0x10, 0xf1, 0x08, 0xad, - 0x5a, 0x39, 0x36, 0xb0, 0xd0, 0x1d, 0x28, 0xb1, 0xff, 0x6c, 0xdf, 0x1c, 0x3d, 0x67, 0x88, 0x08, - 0x8b, 0x2e, 0x08, 0xe0, 0x84, 0x16, 0xba, 0x04, 0x10, 0x4b, 0x6b, 0xa7, 0x48, 0x38, 0x74, 0x2b, - 0x89, 0x52, 0xd9, 0x41, 0x45, 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x29, 0x76, 0x5c, 0xef, 0xba, 0xeb, - 0x93, 0x48, 0x58, 0x8b, 0x89, 0xa8, 0xe7, 0xa2, 0x10, 0x27, 0x70, 0x7a, 0xa2, 0xb3, 0x70, 0x01, - 0x3c, 0xe3, 0xd0, 0x08, 0xc3, 0x66, 0x27, 0xfa, 0x75, 0x55, 0x8a, 0x35, 0x0c, 0xfb, 0x32, 0x9c, - 0xae, 0x05, 0xcd, 0x5a, 0x10, 0xc6, 0xab, 0x41, 0x78, 0xd7, 0x09, 0x9b, 0x72, 0xfe, 0xe6, 0x64, - 0x00, 0x6e, 0x7a, 0xea, 0x0e, 0x72, 0xbd, 0x82, 0x11, 0x5a, 0xfb, 0x45, 0x76, 0xa6, 0x1f, 0xd1, - 0xb5, 0xe7, 0xdf, 0x14, 0x00, 0xd5, 0x98, 0x3d, 0x96, 0x91, 0x96, 0xea, 0x5d, 0x98, 0x88, 0xc8, - 0x75, 0xd7, 0x6f, 0xdf, 0x93, 0xf7, 0xab, 0x2e, 0x7e, 0x53, 0xf5, 0x15, 0x1d, 0x93, 0x6b, 0x69, - 0xcc, 0x32, 0x9c, 0xa2, 0x46, 0x87, 0x30, 0x6c, 0xfb, 0x8b, 0xd1, 0xad, 0x88, 0x84, 0x22, 0x0d, - 0x13, 0x1b, 0x42, 0x2c, 0x0b, 0x71, 0x02, 0xa7, 0x4b, 0x86, 0xfd, 0xb9, 0x11, 0xf8, 0x38, 0x08, - 0x62, 0xb9, 0xc8, 0x58, 0x22, 0x0f, 0xad, 0x1c, 0x1b, 0x58, 0x68, 0x15, 0x50, 0xd4, 0x6e, 0xb5, - 0x3c, 0xf6, 0xc8, 0xe9, 0x78, 0x57, 0xc2, 0xa0, 0xdd, 0xe2, 0x0f, 0x55, 0x22, 0x07, 0x46, 0xbd, - 0x03, 0x8a, 0x33, 0x6a, 0x50, 0xc6, 0xb0, 0x19, 0xb1, 0xdf, 0x22, 0x62, 0x00, 0xd7, 0x97, 0xd6, - 0x59, 0x11, 0x96, 0x30, 0xfb, 0x27, 0xd8, 0x61, 0xc6, 0xb2, 0xe7, 0xc4, 0xed, 0x90, 0xa0, 0x5d, - 0x18, 0x6f, 0xb1, 0x03, 0x2b, 0x0e, 0x03, 0xcf, 0x23, 0x52, 0x6e, 0x7c, 0x30, 0xdb, 0x30, 0x9e, - 0x4d, 0x43, 0x27, 0x87, 0x4d, 0xea, 0xf6, 0x4f, 0x4e, 0x32, 0xbe, 0x54, 0xe7, 0x97, 0x96, 0x61, - 0x61, 0xf1, 0x2d, 0x24, 0xb4, 0xd9, 0xfc, 0x6c, 0x75, 0x09, 0xa7, 0x17, 0x56, 0xe3, 0x58, 0xd6, - 0x45, 0x6f, 0xb2, 0x17, 0x3e, 0xce, 0x0c, 0x7a, 0xe5, 0xc9, 0xe4, 0x58, 0xc6, 0x63, 0x9e, 0xa8, - 0x88, 0x35, 0x22, 0xe8, 0x3a, 0x8c, 0x8b, 0x64, 0x2b, 0x42, 0xf1, 0x50, 0x34, 0xae, 0xbf, 0xe3, - 0x58, 0x07, 0x1e, 0xa6, 0x0b, 0xb0, 0x59, 0x19, 0x6d, 0xc1, 0x39, 0x2d, 0x35, 0x58, 0x86, 0x7d, - 0x22, 0xe7, 0x2d, 0x8f, 0xdf, 0x3f, 0x98, 0x3b, 0xb7, 0xde, 0x0d, 0x11, 0x77, 0xa7, 0x83, 0x6e, - 0xc2, 0x69, 0xa7, 0x11, 0xbb, 0x7b, 0xa4, 0x42, 0x9c, 0xa6, 0xe7, 0xfa, 0xc4, 0x0c, 0x21, 0x71, - 0xf6, 0xfe, 0xc1, 0xdc, 0xe9, 0xc5, 0x2c, 0x04, 0x9c, 0x5d, 0x0f, 0xbd, 0x06, 0xa5, 0xa6, 0x1f, - 0x89, 0x31, 0x18, 0x32, 0xb2, 0xde, 0x95, 0x2a, 0x37, 0xea, 0xea, 0xfb, 0x93, 0x3f, 0x38, 0xa9, - 0x80, 0xb6, 0x60, 0x4c, 0x77, 0x13, 0x13, 0x19, 0x13, 0x9f, 0xef, 0x72, 0xb7, 0x35, 0x7c, 0xab, - 0xb8, 0xd6, 0x4d, 0x59, 0xff, 0x1a, 0x6e, 0x57, 0x06, 0x61, 0xf4, 0x06, 0xa0, 0x88, 0x84, 0x7b, - 0x6e, 0x83, 0x2c, 0x36, 0x58, 0x08, 0x63, 0xa6, 0xab, 0x19, 0x31, 0x5c, 0x59, 0x50, 0xbd, 0x03, - 0x03, 0x67, 0xd4, 0x42, 0x57, 0x29, 0x47, 0xd1, 0x4b, 0x85, 0xb1, 0xb6, 0x14, 0xf3, 0xca, 0x15, - 0xd2, 0x0a, 0x49, 0xc3, 0x89, 0x49, 0xd3, 0xa4, 0x88, 0x53, 0xf5, 0xe8, 0x79, 0xa3, 0x32, 0x43, - 0x80, 0x69, 0x62, 0xdc, 0x99, 0x1d, 0x82, 0xde, 0x90, 0xb6, 0x83, 0x28, 0xbe, 0x41, 0xe2, 0xbb, - 0x41, 0xb8, 0x23, 0xe2, 0xbe, 0x25, 0x61, 0x21, 0x13, 0x10, 0xd6, 0xf1, 0xa8, 0x44, 0xc4, 0x9e, - 0xd8, 0xaa, 0x15, 0xf6, 0xf6, 0x31, 0x92, 0xec, 0x93, 0xab, 0xbc, 0x18, 0x4b, 0xb8, 0x44, 0xad, - 0xd6, 0x96, 0xd9, 0x8b, 0x46, 0x0a, 0xb5, 0x5a, 0x5b, 0xc6, 0x12, 0x8e, 0x48, 0x67, 0x46, 0xc1, - 0x89, 0xfc, 0xb7, 0xa8, 0x4e, 0xbe, 0xdc, 0x67, 0x52, 0x41, 0x1f, 0xa6, 0x54, 0x2e, 0x43, 0x1e, - 0x10, 0x2f, 0x2a, 0x4f, 0xb2, 0x45, 0xd2, 0x7f, 0x34, 0x3d, 0xa5, 0x8b, 0xab, 0xa6, 0x28, 0xe1, - 0x0e, 0xda, 0x46, 0x68, 0x92, 0xa9, 0x9e, 0x99, 0x3d, 0x16, 0xa0, 0x14, 0xb5, 0x37, 0x9a, 0xc1, - 0xae, 0xe3, 0xfa, 0xec, 0x01, 0x42, 0x13, 0x44, 0xea, 0x12, 0x80, 0x13, 0x1c, 0xb4, 0x0a, 0x23, - 0x8e, 0xb8, 0x7c, 0x89, 0x27, 0x83, 0xcc, 0x58, 0x05, 0xf2, 0x82, 0xc6, 0xf5, 0xa0, 0xf2, 0x1f, - 0x56, 0x75, 0xd1, 0xab, 0x30, 0x2e, 0xdc, 0xe9, 0x84, 0x25, 0xec, 0x29, 0xd3, 0xf3, 0xa2, 0xae, - 0x03, 0xb1, 0x89, 0x8b, 0x7e, 0x0c, 0x26, 0x28, 0x95, 0x84, 0xb1, 0x95, 0x67, 0xfa, 0xe1, 0x88, - 0x5a, 0xc4, 0x76, 0xbd, 0x32, 0x4e, 0x11, 0x43, 0x4d, 0x78, 0xcc, 0x69, 0xc7, 0x01, 0x53, 0x56, - 0x9a, 0xeb, 0x7f, 0x3d, 0xd8, 0x21, 0x3e, 0x7b, 0x27, 0x18, 0x59, 0xba, 0x70, 0xff, 0x60, 0xee, - 0xb1, 0xc5, 0x2e, 0x78, 0xb8, 0x2b, 0x15, 0x74, 0x0b, 0x46, 0xe3, 0xc0, 0x13, 0x26, 0xec, 0x51, - 0xf9, 0x4c, 0x7e, 0x68, 0xa5, 0x75, 0x85, 0xa6, 0xab, 0x13, 0x54, 0x55, 0xac, 0xd3, 0x41, 0xeb, - 0x7c, 0x8f, 0xb1, 0x40, 0xa0, 0x24, 0x2a, 0x3f, 0x92, 0x3f, 0x30, 0x2a, 0x5e, 0xa8, 0xb9, 0x05, - 0x45, 0x4d, 0xac, 0x93, 0x41, 0x57, 0x60, 0xba, 0x15, 0xba, 0x01, 0x5b, 0xd8, 0x4a, 0x51, 0x5c, - 0x36, 0x82, 0xee, 0x4d, 0xd7, 0xd2, 0x08, 0xb8, 0xb3, 0x0e, 0xba, 0x48, 0x05, 0x54, 0x5e, 0x58, - 0x3e, 0xcb, 0x33, 0xbe, 0x70, 0xe1, 0x94, 0x97, 0x61, 0x05, 0x9d, 0xfd, 0x61, 0x98, 0xee, 0xe0, - 0x94, 0x47, 0x32, 0x27, 0xfe, 0x47, 0x83, 0x50, 0x52, 0xea, 0x40, 0xb4, 0x60, 0x6a, 0x79, 0xcf, - 0xa6, 0xb5, 0xbc, 0x23, 0x54, 0x5e, 0xd3, 0x15, 0xbb, 0xeb, 0x19, 0x09, 0xeb, 0x2f, 0xe4, 0xb0, - 0x86, 0xfe, 0x7d, 0xff, 0x8e, 0x90, 0xcc, 0x3f, 0xb9, 0x30, 0x0e, 0x74, 0xbd, 0x30, 0xf6, 0x99, - 0x3c, 0x92, 0x5e, 0x0d, 0x5b, 0x41, 0xb3, 0x5a, 0x4b, 0x67, 0x53, 0xab, 0xd1, 0x42, 0xcc, 0x61, - 0x4c, 0xb8, 0xa7, 0xc7, 0x3a, 0x13, 0xee, 0x87, 0x1f, 0x50, 0xb8, 0x97, 0x04, 0x70, 0x42, 0x0b, - 0x79, 0x30, 0xdd, 0x30, 0x13, 0xe1, 0x29, 0x7f, 0xbf, 0x27, 0x7a, 0xa6, 0xa4, 0x6b, 0x6b, 0x19, - 0x72, 0x96, 0xd3, 0x54, 0x70, 0x27, 0x61, 0xf4, 0x2a, 0x8c, 0xbc, 0x1f, 0x44, 0x6c, 0xd9, 0x89, - 0xb3, 0x4d, 0x7a, 0x58, 0x8d, 0xbc, 0x79, 0xb3, 0xce, 0xca, 0x0f, 0x0f, 0xe6, 0x46, 0x6b, 0x41, - 0x53, 0xfe, 0xc5, 0xaa, 0x02, 0xba, 0x07, 0xa7, 0x0d, 0x8e, 0xa0, 0xba, 0x0b, 0xfd, 0x77, 0xf7, - 0x9c, 0x68, 0xee, 0x74, 0x35, 0x8b, 0x12, 0xce, 0x6e, 0xc0, 0xfe, 0x2a, 0x57, 0x7a, 0x0a, 0xd5, - 0x08, 0x89, 0xda, 0xde, 0x49, 0xa4, 0xc1, 0x58, 0x31, 0xb4, 0x36, 0x0f, 0xac, 0x58, 0xff, 0x3d, - 0x8b, 0x29, 0xd6, 0xd7, 0xc9, 0x6e, 0xcb, 0x73, 0xe2, 0x93, 0x30, 0x22, 0x7f, 0x13, 0x46, 0x62, - 0xd1, 0x5a, 0xb7, 0xcc, 0x1d, 0x5a, 0xa7, 0xd8, 0xe3, 0x82, 0x3a, 0x10, 0x65, 0x29, 0x56, 0x64, - 0xec, 0x7f, 0xc2, 0x67, 0x40, 0x42, 0x4e, 0x40, 0xb7, 0x50, 0x31, 0x75, 0x0b, 0x73, 0x3d, 0xbe, - 0x20, 0x47, 0xc7, 0xf0, 0x8f, 0xcd, 0x7e, 0xb3, 0xbb, 0xc7, 0xc7, 0xfd, 0x45, 0xc7, 0xfe, 0x05, - 0x0b, 0x66, 0xb2, 0x8c, 0x0b, 0xa8, 0x10, 0xc3, 0x6f, 0x3e, 0xea, 0x85, 0x4b, 0x8d, 0xe0, 0x6d, - 0x51, 0x8e, 0x15, 0x46, 0xdf, 0xd1, 0xf3, 0x8f, 0x16, 0x4e, 0xec, 0x26, 0x98, 0x39, 0x13, 0xd1, - 0xeb, 0xdc, 0x2b, 0xc4, 0x52, 0x49, 0x0d, 0x8f, 0xe6, 0x11, 0x62, 0xff, 0x5a, 0x01, 0x66, 0xb8, - 0x8a, 0x7a, 0x71, 0x2f, 0x70, 0x9b, 0xb5, 0xa0, 0x29, 0x7c, 0x64, 0xde, 0x86, 0xb1, 0x96, 0x76, - 0x5d, 0xed, 0x16, 0xd0, 0x48, 0xbf, 0xd6, 0x26, 0xd7, 0x06, 0xbd, 0x14, 0x1b, 0xb4, 0x50, 0x13, - 0xc6, 0xc8, 0x9e, 0xdb, 0x50, 0x7a, 0xce, 0xc2, 0x91, 0x59, 0xba, 0x6a, 0x65, 0x45, 0xa3, 0x83, - 0x0d, 0xaa, 0x0f, 0x21, 0xc7, 0x8d, 0xfd, 0x8b, 0x16, 0x3c, 0x92, 0x13, 0xfe, 0x88, 0x36, 0x77, - 0x97, 0x3d, 0x06, 0x88, 0x04, 0x9c, 0xaa, 0x39, 0xfe, 0x44, 0x80, 0x05, 0x14, 0x7d, 0x1e, 0x80, - 0xab, 0xf8, 0xa9, 0x14, 0x2d, 0x3e, 0xbd, 0xbf, 0xb0, 0x20, 0x5a, 0xec, 0x08, 0x59, 0x1f, 0x6b, - 0xb4, 0xec, 0x5f, 0x29, 0xc2, 0x20, 0xcf, 0xc6, 0xbe, 0x0a, 0xc3, 0xdb, 0x3c, 0xd8, 0x72, 0x3f, - 0x71, 0x9d, 0x93, 0xeb, 0x08, 0x2f, 0xc0, 0xb2, 0x32, 0x5a, 0x83, 0x53, 0xc2, 0x0f, 0xab, 0x42, - 0x3c, 0x67, 0x5f, 0xde, 0x6a, 0x79, 0xe2, 0x13, 0x19, 0x94, 0xff, 0x54, 0xb5, 0x13, 0x05, 0x67, - 0xd5, 0x43, 0xaf, 0x77, 0x84, 0x58, 0xe4, 0x61, 0xaa, 0x95, 0x0c, 0xdc, 0x23, 0xcc, 0xe2, 0xab, - 0x30, 0xde, 0xea, 0xb8, 0xbf, 0x6b, 0x89, 0xb0, 0xcd, 0x3b, 0xbb, 0x89, 0xcb, 0xac, 0x0a, 0xda, - 0xcc, 0x86, 0x62, 0x7d, 0x3b, 0x24, 0xd1, 0x76, 0xe0, 0x35, 0x45, 0xd6, 0xd7, 0xc4, 0xaa, 0x20, - 0x05, 0xc7, 0x1d, 0x35, 0x28, 0x95, 0x4d, 0xc7, 0xf5, 0xda, 0x21, 0x49, 0xa8, 0x0c, 0x99, 0x54, - 0x56, 0x53, 0x70, 0xdc, 0x51, 0x83, 0xae, 0xa3, 0xd3, 0x22, 0x65, 0xa8, 0xf4, 0xce, 0x57, 0xa6, - 0x22, 0xc3, 0xd2, 0x4a, 0xbf, 0x4b, 0xc4, 0x18, 0xf1, 0xe4, 0xaf, 0x92, 0x8e, 0x6a, 0x09, 0xe9, - 0x84, 0x7d, 0xbe, 0xa4, 0xf2, 0x20, 0x89, 0x2b, 0xff, 0xd8, 0x82, 0x53, 0x19, 0x26, 0x69, 0x9c, - 0x55, 0x6d, 0xb9, 0x51, 0xac, 0xf2, 0x6d, 0x68, 0xac, 0x8a, 0x97, 0x63, 0x85, 0x41, 0xf7, 0x03, - 0x67, 0x86, 0x69, 0x06, 0x28, 0x4c, 0x3e, 0x04, 0xf4, 0x68, 0x0c, 0x10, 0x5d, 0x80, 0x81, 0x76, - 0x44, 0x42, 0x99, 0xf1, 0x51, 0xf2, 0x6f, 0xa6, 0x11, 0x64, 0x10, 0x2a, 0x51, 0x6e, 0x29, 0x65, - 0x9c, 0x26, 0x51, 0x72, 0x75, 0x1c, 0x87, 0xd9, 0x3f, 0x5b, 0x84, 0xb3, 0xb9, 0xe6, 0xa5, 0xb4, - 0x4b, 0xbb, 0x81, 0xef, 0xc6, 0x81, 0x8a, 0xf5, 0xc7, 0x43, 0x9b, 0x90, 0xd6, 0xf6, 0x9a, 0x28, - 0xc7, 0x0a, 0x03, 0x3d, 0x29, 0x13, 0x02, 0xa7, 0x33, 0x8a, 0x2c, 0x55, 0x8c, 0x9c, 0xc0, 0xfd, - 0xa6, 0x06, 0x7a, 0x02, 0x06, 0x5a, 0x81, 0xca, 0xd6, 0xae, 0x66, 0x96, 0x76, 0x37, 0x08, 0x3c, - 0xcc, 0x80, 0xe8, 0x53, 0x62, 0x1c, 0x52, 0x2f, 0x17, 0xd8, 0x69, 0x06, 0x91, 0x36, 0x18, 0x4f, - 0xc3, 0xf0, 0x0e, 0xd9, 0x0f, 0x5d, 0x7f, 0x2b, 0xfd, 0x6e, 0x73, 0x8d, 0x17, 0x63, 0x09, 0x37, - 0xb3, 0xed, 0x0d, 0xf7, 0xca, 0xb6, 0x77, 0xd4, 0xc4, 0x3e, 0x23, 0x3d, 0x8f, 0xb6, 0x9f, 0x2e, - 0xc2, 0x24, 0x5e, 0xaa, 0xfc, 0x60, 0x22, 0x6e, 0x75, 0x4e, 0xc4, 0x71, 0xa7, 0x59, 0xea, 0x3d, - 0x1b, 0x5f, 0xb1, 0x60, 0x92, 0x05, 0x38, 0x16, 0xa1, 0x39, 0xdc, 0xc0, 0x3f, 0x01, 0xd1, 0xed, - 0x09, 0x18, 0x0c, 0x69, 0xa3, 0xe9, 0xdc, 0x29, 0xac, 0x27, 0x98, 0xc3, 0xd0, 0x63, 0x30, 0xc0, - 0xba, 0x40, 0x27, 0x6f, 0x8c, 0xa7, 0x38, 0xa8, 0x38, 0xb1, 0x83, 0x59, 0x29, 0xf3, 0x91, 0xc4, - 0xa4, 0xe5, 0xb9, 0xbc, 0xd3, 0x89, 0x06, 0xfc, 0xe3, 0xe1, 0x23, 0x99, 0xd9, 0xb5, 0x0f, 0xe7, - 0x23, 0x99, 0x4d, 0xb2, 0xfb, 0xb5, 0xe8, 0xbf, 0x17, 0xe0, 0x7c, 0x66, 0xbd, 0xbe, 0x7d, 0x24, - 0xbb, 0xd7, 0x3e, 0x9e, 0xe7, 0xf7, 0xec, 0x57, 0xf1, 0xe2, 0x09, 0xbe, 0x8a, 0x0f, 0xf4, 0x2b, - 0x39, 0x0e, 0xf6, 0xe1, 0xba, 0x98, 0x39, 0x64, 0x1f, 0x13, 0xd7, 0xc5, 0xcc, 0xbe, 0xe5, 0x5c, - 0xeb, 0xbe, 0x5b, 0xc8, 0xf9, 0x16, 0x76, 0xc1, 0xbb, 0x48, 0xf9, 0x0c, 0x03, 0x46, 0x42, 0x12, - 0x1e, 0xe3, 0x3c, 0x86, 0x97, 0x61, 0x05, 0x45, 0xae, 0xe6, 0x04, 0xc8, 0xbb, 0xf6, 0xea, 0x91, - 0xb6, 0xcc, 0xbc, 0xf9, 0x60, 0xa1, 0xc7, 0x11, 0x49, 0x3b, 0x04, 0xae, 0x69, 0x97, 0xf2, 0x62, - 0xff, 0x97, 0xf2, 0xb1, 0xec, 0x0b, 0x39, 0x5a, 0x84, 0xc9, 0x5d, 0xd7, 0x67, 0x09, 0x90, 0x4d, - 0x51, 0x54, 0xf9, 0xc4, 0xaf, 0x99, 0x60, 0x9c, 0xc6, 0x9f, 0x7d, 0x15, 0xc6, 0x1f, 0x5c, 0x8b, - 0xf8, 0xcd, 0x22, 0x3c, 0xda, 0x65, 0xdb, 0x73, 0x5e, 0x6f, 0xcc, 0x81, 0xc6, 0xeb, 0x3b, 0xe6, - 0xa1, 0x06, 0x33, 0x9b, 0x6d, 0xcf, 0xdb, 0x67, 0x86, 0x67, 0xa4, 0x29, 0x31, 0x84, 0xac, 0xa8, - 0xa2, 0x97, 0xaf, 0x66, 0xe0, 0xe0, 0xcc, 0x9a, 0xe8, 0x0d, 0x40, 0xc1, 0x06, 0x8b, 0xa8, 0xdd, - 0x4c, 0xa2, 0xa3, 0xb0, 0x81, 0x2f, 0x26, 0x9b, 0xf1, 0x66, 0x07, 0x06, 0xce, 0xa8, 0x45, 0x85, - 0x7e, 0x7a, 0x2a, 0xed, 0xab, 0x6e, 0xa5, 0x84, 0x7e, 0xac, 0x03, 0xb1, 0x89, 0x8b, 0xae, 0xc0, - 0xb4, 0xb3, 0xe7, 0xb8, 0x3c, 0x5a, 0x9e, 0x24, 0xc0, 0xa5, 0x7e, 0xa5, 0xbb, 0x5b, 0x4c, 0x23, - 0xe0, 0xce, 0x3a, 0x29, 0x6f, 0xc6, 0xa1, 0x7c, 0x6f, 0xc6, 0xee, 0x7c, 0xb1, 0x97, 0x2a, 0xd6, - 0xfe, 0x0f, 0x16, 0x3d, 0xbe, 0x32, 0x32, 0xee, 0xd2, 0x71, 0x50, 0x2a, 0x45, 0xcd, 0xb1, 0x50, - 0x8d, 0xc3, 0xb2, 0x0e, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x51, 0x62, 0xf7, 0x6e, 0x88, 0xee, 0xc2, - 0xe3, 0x57, 0x61, 0xa0, 0xb7, 0x60, 0xb8, 0xe9, 0xee, 0xb9, 0x51, 0x10, 0x8a, 0xcd, 0x72, 0xd4, - 0x2c, 0xf3, 0x8a, 0x0f, 0x56, 0x38, 0x19, 0x2c, 0xe9, 0xd9, 0x3f, 0x5d, 0x80, 0x71, 0xd9, 0xe2, - 0x9b, 0xed, 0x20, 0x76, 0x4e, 0xe0, 0x58, 0xbe, 0x62, 0x1c, 0xcb, 0x9f, 0xea, 0xe6, 0xf6, 0xcc, - 0xba, 0x94, 0x7b, 0x1c, 0xdf, 0x4c, 0x1d, 0xc7, 0x4f, 0xf5, 0x26, 0xd5, 0xfd, 0x18, 0xfe, 0xa7, - 0x16, 0x4c, 0x1b, 0xf8, 0x27, 0x70, 0x1a, 0xac, 0x9a, 0xa7, 0xc1, 0xe3, 0x3d, 0xbf, 0x21, 0xe7, - 0x14, 0xf8, 0x72, 0x21, 0xd5, 0x77, 0xc6, 0xfd, 0xdf, 0x87, 0x81, 0x6d, 0x27, 0x6c, 0x76, 0x8b, - 0xf9, 0xda, 0x51, 0x69, 0xfe, 0xaa, 0x13, 0x36, 0x39, 0x0f, 0x7f, 0x4e, 0x25, 0x03, 0x74, 0xc2, - 0x66, 0x4f, 0x37, 0x0f, 0xd6, 0x14, 0xba, 0x0c, 0x43, 0x51, 0x23, 0x68, 0x29, 0x73, 0xd8, 0x0b, - 0x3c, 0x51, 0x20, 0x2d, 0x39, 0x3c, 0x98, 0x43, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0xfc, 0xd9, 0x2d, - 0x28, 0xa9, 0xa6, 0x1f, 0xaa, 0xa1, 0xff, 0x1f, 0x16, 0xe1, 0x54, 0xc6, 0xba, 0x40, 0x91, 0x31, - 0x5a, 0x2f, 0xf4, 0xb9, 0x9c, 0x3e, 0xe4, 0x78, 0x45, 0xec, 0xc6, 0xd2, 0x14, 0xf3, 0xdf, 0x77, - 0xa3, 0xb7, 0x22, 0x92, 0x6e, 0x94, 0x16, 0xf5, 0x6e, 0x94, 0x36, 0x76, 0x62, 0x43, 0x4d, 0x1b, - 0x52, 0x3d, 0x7d, 0xa8, 0x73, 0xfa, 0x27, 0x45, 0x98, 0xc9, 0x8a, 0x96, 0x80, 0x7e, 0x3c, 0x95, - 0x41, 0xe6, 0xa5, 0x7e, 0xe3, 0x2c, 0xf0, 0xb4, 0x32, 0x22, 0xbc, 0xd4, 0xbc, 0x99, 0x53, 0xa6, - 0xe7, 0x30, 0x8b, 0x36, 0x99, 0xdf, 0x55, 0xc8, 0x33, 0xff, 0xc8, 0x2d, 0xfe, 0x99, 0xbe, 0x3b, - 0x20, 0x52, 0x06, 0x45, 0x29, 0xbf, 0x2b, 0x59, 0xdc, 0xdb, 0xef, 0x4a, 0xb6, 0x3c, 0xeb, 0xc2, - 0xa8, 0xf6, 0x35, 0x0f, 0x75, 0xc6, 0x77, 0xe8, 0x89, 0xa2, 0xf5, 0xfb, 0xa1, 0xce, 0xfa, 0x2f, - 0x5a, 0x90, 0x32, 0x5d, 0x53, 0x2a, 0x29, 0x2b, 0x57, 0x25, 0x75, 0x01, 0x06, 0xc2, 0xc0, 0x23, - 0xe9, 0xa4, 0x22, 0x38, 0xf0, 0x08, 0x66, 0x10, 0x95, 0xf9, 0xbb, 0x98, 0x97, 0xf9, 0x9b, 0x5e, - 0x8d, 0x3d, 0xb2, 0x47, 0xa4, 0x36, 0x42, 0xf1, 0xe4, 0xeb, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x95, - 0x01, 0x38, 0xd7, 0xd5, 0x73, 0x91, 0x5e, 0x59, 0xb6, 0x9c, 0x98, 0xdc, 0x75, 0xf6, 0xd3, 0x21, - 0x8f, 0xaf, 0xf0, 0x62, 0x2c, 0xe1, 0xcc, 0xd0, 0x96, 0x47, 0x4d, 0x4c, 0x29, 0xf0, 0x44, 0xb0, - 0x44, 0x01, 0x35, 0x15, 0x47, 0xc5, 0xe3, 0x50, 0x1c, 0x5d, 0x02, 0x88, 0x22, 0x6f, 0xc5, 0xa7, - 0x12, 0x58, 0x53, 0x58, 0xf0, 0x26, 0xd1, 0x35, 0xeb, 0xd7, 0x05, 0x04, 0x6b, 0x58, 0xa8, 0x02, - 0x53, 0xad, 0x30, 0x88, 0xb9, 0x3e, 0xb4, 0xc2, 0x6d, 0x47, 0x06, 0x4d, 0xa7, 0xb1, 0x5a, 0x0a, - 0x8e, 0x3b, 0x6a, 0xa0, 0x97, 0x61, 0x54, 0x38, 0x92, 0xd5, 0x82, 0xc0, 0x13, 0xaa, 0x1a, 0x65, - 0x89, 0x50, 0x4f, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0x31, 0x25, 0xeb, 0x70, 0x66, 0x35, 0xae, 0x68, - 0xd5, 0xf0, 0x52, 0x91, 0x53, 0x46, 0xfa, 0x8a, 0x9c, 0x92, 0x28, 0xaf, 0x4a, 0x7d, 0xbf, 0x2b, - 0x41, 0x4f, 0x75, 0xcf, 0xaf, 0x0f, 0xc0, 0x29, 0xb1, 0x70, 0x1e, 0xf6, 0x72, 0x79, 0x48, 0x59, - 0xc4, 0x7f, 0xb0, 0x66, 0x4e, 0x7a, 0xcd, 0x7c, 0xb5, 0x08, 0x43, 0x7c, 0x2a, 0x4e, 0x40, 0x86, - 0x5f, 0x15, 0x4a, 0xbf, 0x2e, 0xb1, 0x47, 0x78, 0x5f, 0xe6, 0x2b, 0x4e, 0xec, 0xf0, 0xf3, 0x4b, - 0xb1, 0xd1, 0x44, 0x3d, 0x88, 0xe6, 0x0d, 0x46, 0x3b, 0x9b, 0xd2, 0x6a, 0x01, 0xa7, 0xa1, 0xb1, - 0xdd, 0x77, 0x01, 0x22, 0x96, 0xc9, 0x9a, 0xd2, 0x10, 0x51, 0x6c, 0x9e, 0xe9, 0xd2, 0x7a, 0x5d, - 0x21, 0xf3, 0x3e, 0x24, 0x4b, 0x50, 0x01, 0xb0, 0x46, 0x71, 0xf6, 0x15, 0x28, 0x29, 0xe4, 0x5e, - 0x2a, 0x80, 0x31, 0xfd, 0xd4, 0xfb, 0x1c, 0x4c, 0xa6, 0xda, 0x3a, 0x92, 0x06, 0xe1, 0xb7, 0x2c, - 0x98, 0xe4, 0x5d, 0x5e, 0xf1, 0xf7, 0xc4, 0x66, 0xff, 0x00, 0x66, 0xbc, 0x8c, 0x4d, 0x27, 0x66, - 0xb4, 0xff, 0x4d, 0xaa, 0x34, 0x06, 0x59, 0x50, 0x9c, 0xd9, 0x06, 0xba, 0x08, 0x23, 0x3c, 0x07, - 0xbf, 0xe3, 0x09, 0x6f, 0x82, 0x31, 0x9e, 0x85, 0x80, 0x97, 0x61, 0x05, 0xb5, 0xbf, 0x65, 0xc1, - 0x34, 0xef, 0xf9, 0x35, 0xb2, 0xaf, 0x6e, 0xc7, 0x1f, 0x65, 0xdf, 0x45, 0x92, 0x85, 0x42, 0x4e, - 0x92, 0x05, 0xfd, 0xd3, 0x8a, 0x5d, 0x3f, 0xed, 0xd7, 0x2c, 0x10, 0x2b, 0xf0, 0x04, 0xee, 0x81, - 0x3f, 0x6c, 0xde, 0x03, 0x67, 0xf3, 0x17, 0x75, 0xce, 0x05, 0xf0, 0xcf, 0x2c, 0x98, 0xe2, 0x08, - 0xc9, 0x43, 0xe4, 0x47, 0x3a, 0x0f, 0xfd, 0x64, 0xfe, 0x52, 0xa9, 0x96, 0xb3, 0x3f, 0xca, 0x98, - 0xac, 0x81, 0xae, 0x93, 0xd5, 0x94, 0x1b, 0xe8, 0x08, 0x19, 0xed, 0x8e, 0x1c, 0x17, 0xd4, 0xfe, - 0xaf, 0x16, 0x20, 0xde, 0x8c, 0x71, 0x2e, 0xd3, 0xd3, 0x8e, 0x95, 0x6a, 0x9a, 0xa0, 0x84, 0xd5, - 0x28, 0x08, 0xd6, 0xb0, 0x8e, 0x65, 0x78, 0x52, 0xaf, 0xc9, 0xc5, 0xde, 0xaf, 0xc9, 0x47, 0x18, - 0xd1, 0xbf, 0x3c, 0x00, 0x69, 0xd3, 0x65, 0x74, 0x1b, 0xc6, 0x1a, 0x4e, 0xcb, 0xd9, 0x70, 0x3d, - 0x37, 0x76, 0x49, 0xd4, 0xcd, 0x0c, 0x65, 0x59, 0xc3, 0x13, 0xef, 0x84, 0x5a, 0x09, 0x36, 0xe8, - 0xa0, 0x79, 0x80, 0x56, 0xe8, 0xee, 0xb9, 0x1e, 0xd9, 0x62, 0x57, 0x61, 0xe6, 0xbf, 0xc4, 0x6d, - 0x2b, 0x64, 0x29, 0xd6, 0x30, 0x32, 0xfc, 0x5d, 0x8a, 0x0f, 0xcf, 0xdf, 0x65, 0xe0, 0x88, 0xfe, - 0x2e, 0x83, 0x7d, 0xf9, 0xbb, 0x60, 0x38, 0x23, 0xcf, 0x6e, 0xfa, 0x7f, 0xd5, 0xf5, 0x88, 0x10, - 0xd8, 0xb8, 0x57, 0xd3, 0xec, 0xfd, 0x83, 0xb9, 0x33, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x9f, - 0x87, 0xb2, 0xe3, 0x79, 0xc1, 0x5d, 0x35, 0x6a, 0x2b, 0x51, 0xc3, 0xf1, 0x92, 0x30, 0xd9, 0x23, - 0x4b, 0x8f, 0xdd, 0x3f, 0x98, 0x2b, 0x2f, 0xe6, 0xe0, 0xe0, 0xdc, 0xda, 0xf6, 0x0e, 0x9c, 0xaa, - 0x93, 0x50, 0x26, 0xc9, 0x54, 0x5b, 0x6c, 0x1d, 0x4a, 0x61, 0x8a, 0xa9, 0xf4, 0x15, 0xfa, 0x42, - 0x0b, 0x61, 0x28, 0x99, 0x48, 0x42, 0xc8, 0xfe, 0x53, 0x0b, 0x86, 0x85, 0x39, 0xf4, 0x09, 0xc8, - 0x32, 0x8b, 0x86, 0x3e, 0x72, 0x2e, 0x9b, 0xf1, 0xb2, 0xce, 0xe4, 0x6a, 0x22, 0xab, 0x29, 0x4d, - 0xe4, 0xe3, 0xdd, 0x88, 0x74, 0xd7, 0x41, 0xfe, 0x7c, 0x11, 0x26, 0x4c, 0x53, 0xf0, 0x13, 0x18, - 0x82, 0x1b, 0x30, 0x1c, 0x09, 0xbf, 0x83, 0x42, 0xbe, 0xfd, 0x6a, 0x7a, 0x12, 0x13, 0x2b, 0x17, - 0xe1, 0x69, 0x20, 0x89, 0x64, 0x3a, 0x34, 0x14, 0x1f, 0xa2, 0x43, 0x43, 0x2f, 0x6b, 0xfc, 0x81, - 0xe3, 0xb0, 0xc6, 0xb7, 0xbf, 0xc6, 0x98, 0xbf, 0x5e, 0x7e, 0x02, 0x72, 0xc1, 0x15, 0xf3, 0x98, - 0xb0, 0xbb, 0xac, 0x2c, 0xd1, 0xa9, 0x1c, 0xf9, 0xe0, 0x1f, 0x58, 0x30, 0x2a, 0x10, 0x4f, 0xa0, - 0xdb, 0x3f, 0x62, 0x76, 0xfb, 0xd1, 0x2e, 0xdd, 0xce, 0xe9, 0xef, 0xdf, 0x2c, 0xa8, 0xfe, 0xd6, - 0x82, 0x30, 0xee, 0x2b, 0x6d, 0xc2, 0x08, 0xbd, 0x0d, 0x06, 0x8d, 0xc0, 0x13, 0x87, 0xf9, 0x63, - 0x89, 0x63, 0x2b, 0x2f, 0x3f, 0xd4, 0x7e, 0x63, 0x85, 0xcd, 0xfc, 0x2e, 0x83, 0x30, 0x16, 0x07, - 0x68, 0xe2, 0x77, 0x19, 0x84, 0x31, 0x66, 0x10, 0xd4, 0x04, 0x88, 0x9d, 0x70, 0x8b, 0xc4, 0xb4, - 0x4c, 0x78, 0x82, 0xe7, 0xef, 0xc2, 0x76, 0xec, 0x7a, 0xf3, 0xae, 0x1f, 0x47, 0x71, 0x38, 0x5f, - 0xf5, 0xe3, 0x9b, 0x21, 0xbf, 0x1b, 0x68, 0x9e, 0xaa, 0x8a, 0x16, 0xd6, 0xe8, 0x4a, 0x57, 0x29, - 0xd6, 0xc6, 0xa0, 0xf9, 0x50, 0x78, 0x43, 0x94, 0x63, 0x85, 0x61, 0xbf, 0xc2, 0x78, 0x32, 0x1b, - 0xa0, 0xa3, 0x39, 0x91, 0x7e, 0x63, 0x44, 0x0d, 0x2d, 0x7b, 0x25, 0xa8, 0xe8, 0xae, 0xaa, 0xdd, - 0x59, 0x20, 0x6d, 0x58, 0x77, 0x0b, 0x48, 0xfc, 0x59, 0xd1, 0x8f, 0x76, 0xbc, 0x1f, 0x3f, 0xdf, - 0x83, 0x97, 0x1e, 0xe1, 0xc5, 0x98, 0xc5, 0xf0, 0x64, 0xb1, 0x0e, 0xab, 0xb5, 0x74, 0x62, 0x8b, - 0x65, 0x09, 0xc0, 0x09, 0x0e, 0x5a, 0x10, 0x37, 0x4b, 0xae, 0x9f, 0x7b, 0x34, 0x75, 0xb3, 0x94, - 0x9f, 0xaf, 0x5d, 0x2d, 0x5f, 0x80, 0x51, 0x95, 0x2c, 0xac, 0xc6, 0x73, 0x2e, 0x95, 0xb8, 0x2c, - 0xb5, 0x92, 0x14, 0x63, 0x1d, 0x07, 0xad, 0xc3, 0x64, 0xc4, 0x33, 0x99, 0x49, 0xef, 0x25, 0xa1, - 0x37, 0x78, 0x46, 0xbe, 0x3b, 0xd7, 0x4d, 0xf0, 0x21, 0x2b, 0xe2, 0x9b, 0x55, 0xfa, 0x3b, 0xa5, - 0x49, 0xa0, 0xd7, 0x61, 0xc2, 0xd3, 0x33, 0x3a, 0xd7, 0x84, 0x5a, 0x41, 0x99, 0x65, 0x1a, 0xf9, - 0x9e, 0x6b, 0x38, 0x85, 0x4d, 0x85, 0x00, 0xbd, 0x44, 0x04, 0xc3, 0x72, 0xfc, 0x2d, 0x12, 0x89, - 0x54, 0x47, 0x4c, 0x08, 0xb8, 0x9e, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0xcb, 0x30, 0x26, 0x3f, 0x5f, - 0xf3, 0xe6, 0x4b, 0x8c, 0x7f, 0x35, 0x18, 0x36, 0x30, 0xd1, 0x5d, 0x38, 0x2d, 0xff, 0xaf, 0x87, - 0xce, 0xe6, 0xa6, 0xdb, 0x10, 0xce, 0x94, 0xa3, 0x8c, 0xc4, 0xa2, 0xf4, 0x84, 0x58, 0xc9, 0x42, - 0x3a, 0x3c, 0x98, 0xbb, 0x20, 0x46, 0x2d, 0x13, 0xce, 0x26, 0x31, 0x9b, 0x3e, 0x5a, 0x83, 0x53, - 0xdb, 0xc4, 0xf1, 0xe2, 0xed, 0xe5, 0x6d, 0xd2, 0xd8, 0x91, 0x9b, 0x88, 0xf9, 0x08, 0x6a, 0x26, - 0xb3, 0x57, 0x3b, 0x51, 0x70, 0x56, 0x3d, 0xf4, 0x0e, 0x94, 0x5b, 0xed, 0x0d, 0xcf, 0x8d, 0xb6, - 0x6f, 0x04, 0x31, 0x7b, 0xea, 0x56, 0xb9, 0xb6, 0x84, 0x33, 0xa1, 0xf2, 0x8f, 0xac, 0xe5, 0xe0, - 0xe1, 0x5c, 0x0a, 0xe8, 0x03, 0x38, 0x9d, 0x5a, 0x0c, 0x3c, 0x7d, 0x9b, 0x70, 0x3a, 0x7c, 0x3a, - 0x7b, 0x3b, 0x65, 0x54, 0xe0, 0x2e, 0xae, 0x99, 0x20, 0x9c, 0xdd, 0xc4, 0x87, 0x33, 0x80, 0x78, - 0x9f, 0x56, 0xd6, 0xa4, 0x1b, 0xf4, 0x05, 0x18, 0xd3, 0x57, 0x91, 0x38, 0x60, 0x9e, 0xec, 0x95, - 0xbd, 0x5c, 0xc8, 0x46, 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09, 0x64, 0x7f, 0x1f, 0xba, - 0x0e, 0x23, 0x0d, 0xcf, 0x25, 0x7e, 0x5c, 0xad, 0x75, 0x73, 0x82, 0x5f, 0x16, 0x38, 0x62, 0xc0, - 0x44, 0x2c, 0x36, 0x5e, 0x86, 0x15, 0x05, 0xfb, 0x77, 0x0b, 0x30, 0xd7, 0x23, 0xb0, 0x5f, 0x4a, - 0x07, 0x68, 0xf5, 0xa5, 0x03, 0x5c, 0x94, 0x99, 0xc3, 0x6e, 0xa4, 0xee, 0x9f, 0xa9, 0xac, 0x60, - 0xc9, 0x2d, 0x34, 0x8d, 0xdf, 0xb7, 0xdd, 0xa4, 0xae, 0x46, 0x1c, 0xe8, 0x69, 0xd1, 0x6b, 0x3c, - 0x1f, 0x0c, 0xf6, 0x2f, 0xd1, 0xe7, 0xaa, 0x82, 0xed, 0xaf, 0x15, 0xe0, 0xb4, 0x1a, 0xc2, 0xef, - 0xdf, 0x81, 0xbb, 0xd5, 0x39, 0x70, 0xc7, 0xa0, 0x48, 0xb7, 0x6f, 0xc2, 0x50, 0x7d, 0x3f, 0x6a, - 0xc4, 0x5e, 0x1f, 0x02, 0xd0, 0x13, 0xc6, 0x06, 0x4d, 0x8e, 0x69, 0x96, 0xfc, 0x53, 0xec, 0x57, - 0xfb, 0x2f, 0x58, 0x30, 0xb9, 0xbe, 0x5c, 0xab, 0x07, 0x8d, 0x1d, 0x12, 0x2f, 0x72, 0x35, 0x11, - 0x16, 0xf2, 0x8f, 0xf5, 0x80, 0x72, 0x4d, 0x96, 0xc4, 0x74, 0x01, 0x06, 0xb6, 0x83, 0x28, 0x4e, - 0xbf, 0xb2, 0x5d, 0x0d, 0xa2, 0x18, 0x33, 0x88, 0xfd, 0x47, 0x16, 0x0c, 0xb2, 0x7c, 0x97, 0xbd, - 0xf2, 0xa2, 0xf6, 0xf3, 0x5d, 0xe8, 0x65, 0x18, 0x22, 0x9b, 0x9b, 0xa4, 0x11, 0x8b, 0x59, 0x95, - 0xde, 0x75, 0x43, 0x2b, 0xac, 0x94, 0x1e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0x74, 0x07, - 0x4a, 0xb1, 0xbb, 0x4b, 0x16, 0x9b, 0x4d, 0xf1, 0x4e, 0xf1, 0x00, 0xce, 0x8c, 0xeb, 0x92, 0x00, - 0x4e, 0x68, 0xd9, 0x3f, 0x5b, 0x00, 0x48, 0x3c, 0x70, 0x7b, 0x7d, 0xe2, 0x52, 0x47, 0xea, 0xd7, - 0x27, 0x33, 0x52, 0xbf, 0xa2, 0x84, 0x60, 0x46, 0xe2, 0x57, 0x35, 0x4c, 0xc5, 0xbe, 0x86, 0x69, - 0xe0, 0x28, 0xc3, 0xb4, 0x0c, 0xd3, 0x89, 0x07, 0xb1, 0x19, 0x4e, 0x81, 0x05, 0xf5, 0x5e, 0x4f, - 0x03, 0x71, 0x27, 0xbe, 0xfd, 0x25, 0x0b, 0x84, 0xbb, 0x41, 0x1f, 0x8b, 0xf9, 0x6d, 0x99, 0xa5, - 0xd1, 0x88, 0x0f, 0x7a, 0x21, 0xdf, 0xff, 0x42, 0x44, 0x05, 0x55, 0x87, 0x87, 0x11, 0x0b, 0xd4, - 0xa0, 0x65, 0xff, 0xd5, 0x02, 0x8c, 0x72, 0x30, 0x8b, 0x3d, 0xd9, 0x47, 0x6f, 0x8e, 0x14, 0x12, - 0x9e, 0x25, 0x30, 0xa4, 0x84, 0x55, 0xe4, 0x70, 0x3d, 0x81, 0xa1, 0x04, 0xe0, 0x04, 0x07, 0x3d, - 0x0d, 0xc3, 0x51, 0x7b, 0x83, 0xa1, 0xa7, 0xcc, 0xdb, 0xeb, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x3c, - 0x4c, 0xf1, 0x7a, 0x61, 0xd0, 0x72, 0xb6, 0xb8, 0x6e, 0x67, 0x50, 0xf9, 0x9b, 0x4d, 0xad, 0xa5, - 0x60, 0x87, 0x07, 0x73, 0x33, 0xe9, 0x32, 0xa6, 0x15, 0xec, 0xa0, 0x42, 0x57, 0xec, 0x54, 0xda, - 0x95, 0x05, 0x5d, 0x85, 0x21, 0xce, 0x8c, 0x04, 0x73, 0xe8, 0xf2, 0xd6, 0xa3, 0x39, 0xc0, 0xb0, - 0x68, 0xd9, 0x82, 0x9f, 0x89, 0xfa, 0xe8, 0x1d, 0x18, 0x6d, 0x06, 0x77, 0xfd, 0xbb, 0x4e, 0xd8, - 0x5c, 0xac, 0x55, 0xc5, 0x7c, 0x66, 0xca, 0x34, 0x95, 0x04, 0x4d, 0x77, 0xaa, 0x61, 0x7a, 0xcd, - 0x04, 0x84, 0x75, 0x72, 0x68, 0x9d, 0x85, 0x4b, 0xe2, 0x19, 0xc6, 0xbb, 0xd9, 0x83, 0xa9, 0xa4, - 0xe4, 0x1a, 0xe5, 0x71, 0x11, 0x53, 0x49, 0xe4, 0x27, 0x4f, 0x08, 0xd9, 0x5f, 0x3c, 0x05, 0xc6, - 0x3a, 0x32, 0x42, 0xc2, 0x5b, 0xc7, 0x14, 0x12, 0x1e, 0xc3, 0x08, 0xd9, 0x6d, 0xc5, 0xfb, 0x15, - 0x37, 0xec, 0x96, 0x0b, 0x64, 0x45, 0xe0, 0x74, 0xd2, 0x94, 0x10, 0xac, 0xe8, 0x64, 0xc7, 0xed, - 0x2f, 0x7e, 0x84, 0x71, 0xfb, 0x07, 0x4e, 0x30, 0x6e, 0xff, 0x0d, 0x18, 0xde, 0x72, 0x63, 0x4c, - 0x5a, 0x81, 0x38, 0x88, 0x33, 0x57, 0xc2, 0x15, 0x8e, 0xd2, 0x19, 0x49, 0x5a, 0x00, 0xb0, 0x24, - 0x82, 0xde, 0x50, 0x7b, 0x60, 0x28, 0x5f, 0x8e, 0xed, 0x7c, 0x16, 0xc8, 0xdc, 0x05, 0x22, 0x4e, - 0xff, 0xf0, 0x83, 0xc6, 0xe9, 0x57, 0xd1, 0xf5, 0x47, 0x3e, 0x5c, 0x74, 0x7d, 0x23, 0x0f, 0x41, - 0xe9, 0xf8, 0xf2, 0x10, 0x7c, 0xc9, 0x82, 0xd3, 0xad, 0xac, 0x94, 0x1c, 0x22, 0x4e, 0xfe, 0xcb, - 0x7d, 0xe7, 0x1c, 0x31, 0x1a, 0x64, 0x17, 0x9a, 0x4c, 0x34, 0x9c, 0xdd, 0x1c, 0x1d, 0xe8, 0x70, - 0xa3, 0x29, 0x82, 0xeb, 0x3f, 0x91, 0x93, 0xd0, 0xa0, 0x4b, 0x1a, 0x83, 0x87, 0x13, 0x50, 0x3f, - 0x49, 0x6a, 0x30, 0xfe, 0xa1, 0x93, 0x1a, 0xbc, 0xa1, 0x92, 0x1a, 0x74, 0x09, 0x4a, 0xc3, 0x53, - 0x16, 0xf4, 0x4c, 0x65, 0xa0, 0xa5, 0x23, 0x98, 0x3c, 0x8e, 0x74, 0x04, 0xef, 0x9a, 0xcc, 0x9e, - 0xc7, 0xc6, 0x7f, 0xb6, 0x07, 0xb3, 0x37, 0xe8, 0x76, 0x67, 0xf7, 0x3c, 0xf5, 0xc2, 0xf4, 0x03, - 0xa5, 0x5e, 0xb8, 0xad, 0x27, 0x35, 0x40, 0x3d, 0xa2, 0xf6, 0x53, 0xa4, 0x3e, 0x53, 0x19, 0xdc, - 0xd6, 0x8f, 0xa0, 0x53, 0xf9, 0x74, 0xd5, 0x49, 0xd3, 0x49, 0x37, 0xeb, 0x10, 0xea, 0x4c, 0x91, - 0x30, 0x73, 0x32, 0x29, 0x12, 0x4e, 0x1f, 0x7b, 0x8a, 0x84, 0x33, 0x27, 0x90, 0x22, 0xe1, 0x91, - 0x8f, 0x34, 0x45, 0x42, 0xf9, 0x21, 0xa4, 0x48, 0xb8, 0x91, 0xa4, 0x48, 0x38, 0x9b, 0x3f, 0x25, - 0x19, 0xf6, 0x62, 0x39, 0x89, 0x11, 0x6e, 0x43, 0xa9, 0x25, 0xbd, 0x9d, 0xcb, 0xb3, 0xf9, 0x53, - 0x92, 0xe9, 0x12, 0xcd, 0xa7, 0x44, 0x81, 0x70, 0x42, 0x8a, 0xd2, 0x4d, 0x12, 0x25, 0x3c, 0xda, - 0x45, 0x65, 0x95, 0xa5, 0x0c, 0xc8, 0x4f, 0x8f, 0x60, 0xff, 0xc5, 0x02, 0x9c, 0xef, 0xbe, 0xae, - 0x13, 0x4d, 0x42, 0x2d, 0xd1, 0x7c, 0xa7, 0x34, 0x09, 0x4c, 0xe8, 0xd2, 0xb0, 0xfa, 0x0e, 0x09, - 0x71, 0x05, 0xa6, 0x95, 0xa1, 0x98, 0xe7, 0x36, 0xf6, 0xb5, 0xbc, 0x6a, 0xca, 0x69, 0xa5, 0x9e, - 0x46, 0xc0, 0x9d, 0x75, 0xd0, 0x22, 0x4c, 0x1a, 0x85, 0xd5, 0x8a, 0x10, 0xf6, 0x95, 0xea, 0xa2, - 0x6e, 0x82, 0x71, 0x1a, 0xdf, 0xfe, 0xb2, 0x05, 0x8f, 0xe4, 0xc4, 0x38, 0xee, 0x3b, 0xe2, 0xc1, - 0x26, 0x4c, 0xb6, 0xcc, 0xaa, 0x3d, 0x02, 0xa3, 0x18, 0x91, 0x94, 0x55, 0x5f, 0x53, 0x00, 0x9c, - 0x26, 0xba, 0x74, 0xf1, 0xeb, 0xdf, 0x3e, 0xff, 0x89, 0x3f, 0xf8, 0xf6, 0xf9, 0x4f, 0x7c, 0xeb, - 0xdb, 0xe7, 0x3f, 0xf1, 0xff, 0xdf, 0x3f, 0x6f, 0x7d, 0xfd, 0xfe, 0x79, 0xeb, 0x0f, 0xee, 0x9f, - 0xb7, 0xbe, 0x75, 0xff, 0xbc, 0xf5, 0xc7, 0xf7, 0xcf, 0x5b, 0x3f, 0xfb, 0x9d, 0xf3, 0x9f, 0x78, - 0xbb, 0xb0, 0xf7, 0xc2, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xed, 0x49, 0x5a, 0x86, 0x34, 0xd6, - 0x00, 0x00, + // 12037 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0xdd, 0x87, 0x3b, 0xee, 0x81, 0xbc, 0xc3, 0x71, 0x28, + 0x1d, 0x8f, 0x5f, 0x80, 0x78, 0x24, 0xc5, 0xb3, 0x48, 0xd1, 0x06, 0xb0, 0xc0, 0x1d, 0x78, 0x87, + 0xbb, 0x65, 0x2f, 0xee, 0x4e, 0xa4, 0x29, 0x46, 0x83, 0xdd, 0x06, 0x30, 0xc4, 0x60, 0x66, 0x39, + 0x33, 0x8b, 0x3b, 0xb0, 0xac, 0xaa, 0x84, 0x91, 0x95, 0x0f, 0xf9, 0x87, 0x2a, 0x51, 0x25, 0x8e, + 0xe5, 0x72, 0xaa, 0x12, 0xa7, 0x6c, 0x45, 0x49, 0x2a, 0x8e, 0x1c, 0xd9, 0x91, 0x9c, 0x8a, 0xe3, + 0xa4, 0x12, 0xf9, 0x8f, 0x62, 0xe7, 0x8f, 0x54, 0xe5, 0x0a, 0x62, 0x9d, 0x5c, 0x49, 0xe5, 0x47, + 0x52, 0x49, 0xfc, 0xcb, 0x88, 0x13, 0xa5, 0xfa, 0x73, 0xba, 0x67, 0x67, 0x76, 0x17, 0x47, 0x1c, + 0x48, 0xa9, 0xf4, 0x6f, 0xb7, 0xdf, 0xeb, 0xd7, 0x3d, 0xfd, 0xf1, 0xfa, 0xf5, 0xeb, 0xf7, 0x01, + 0x2f, 0x6d, 0x5f, 0x8a, 0x66, 0xdd, 0x60, 0x6e, 0xbb, 0xb5, 0x4e, 0x42, 0x9f, 0xc4, 0x24, 0x9a, + 0xdb, 0x25, 0x7e, 0x23, 0x08, 0xe7, 0x04, 0xc0, 0x69, 0xba, 0x73, 0xf5, 0x20, 0x24, 0x73, 0xbb, + 0xcf, 0xce, 0x6d, 0x12, 0x9f, 0x84, 0x4e, 0x4c, 0x1a, 0xb3, 0xcd, 0x30, 0x88, 0x03, 0x84, 0x38, + 0xce, 0xac, 0xd3, 0x74, 0x67, 0x29, 0xce, 0xec, 0xee, 0xb3, 0xd3, 0xcf, 0x6c, 0xba, 0xf1, 0x56, + 0x6b, 0x7d, 0xb6, 0x1e, 0xec, 0xcc, 0x6d, 0x06, 0x9b, 0xc1, 0x1c, 0x43, 0x5d, 0x6f, 0x6d, 0xb0, + 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x49, 0x4c, 0xaf, 0x26, 0xcd, 0x90, 0xbb, 0x31, 0xf1, 0x23, 0x37, + 0xf0, 0xa3, 0x67, 0x9c, 0xa6, 0x1b, 0x91, 0x70, 0x97, 0x84, 0x73, 0xcd, 0xed, 0x4d, 0x0a, 0x8b, + 0x4c, 0x84, 0xb9, 0xdd, 0x67, 0xd7, 0x49, 0xec, 0xb4, 0xf5, 0x68, 0xfa, 0xf9, 0x84, 0xdc, 0x8e, + 0x53, 0xdf, 0x72, 0x7d, 0x12, 0xee, 0x49, 0x1a, 0x73, 0x21, 0x89, 0x82, 0x56, 0x58, 0x27, 0x87, + 0xaa, 0x15, 0xcd, 0xed, 0x90, 0xd8, 0xc9, 0xf8, 0xfa, 0xe9, 0xb9, 0xbc, 0x5a, 0x61, 0xcb, 0x8f, + 0xdd, 0x9d, 0xf6, 0x66, 0x3e, 0xd1, 0xad, 0x42, 0x54, 0xdf, 0x22, 0x3b, 0x4e, 0x5b, 0xbd, 0xe7, + 0xf2, 0xea, 0xb5, 0x62, 0xd7, 0x9b, 0x73, 0xfd, 0x38, 0x8a, 0xc3, 0x74, 0x25, 0xfb, 0xbb, 0x16, + 0x9c, 0x9b, 0xbf, 0x5d, 0x5b, 0xf2, 0x9c, 0x28, 0x76, 0xeb, 0x0b, 0x5e, 0x50, 0xdf, 0xae, 0xc5, + 0x41, 0x48, 0x6e, 0x05, 0x5e, 0x6b, 0x87, 0xd4, 0xd8, 0x40, 0xa0, 0xa7, 0x61, 0x68, 0x97, 0xfd, + 0x5f, 0xa9, 0x94, 0xad, 0x73, 0xd6, 0x85, 0xd2, 0xc2, 0xc4, 0xb7, 0xf7, 0x67, 0x3e, 0x72, 0x6f, + 0x7f, 0x66, 0xe8, 0x96, 0x28, 0xc7, 0x0a, 0x03, 0x9d, 0x87, 0x81, 0x8d, 0x68, 0x6d, 0xaf, 0x49, + 0xca, 0x05, 0x86, 0x3b, 0x26, 0x70, 0x07, 0x96, 0x6b, 0xb4, 0x14, 0x0b, 0x28, 0x9a, 0x83, 0x52, + 0xd3, 0x09, 0x63, 0x37, 0x76, 0x03, 0xbf, 0x5c, 0x3c, 0x67, 0x5d, 0xe8, 0x5f, 0x98, 0x14, 0xa8, + 0xa5, 0xaa, 0x04, 0xe0, 0x04, 0x87, 0x76, 0x23, 0x24, 0x4e, 0xe3, 0x86, 0xef, 0xed, 0x95, 0xfb, + 0xce, 0x59, 0x17, 0x86, 0x92, 0x6e, 0x60, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x4b, 0x05, 0x18, 0x9a, + 0xdf, 0xd8, 0x70, 0x7d, 0x37, 0xde, 0x43, 0xb7, 0x60, 0xc4, 0x0f, 0x1a, 0x44, 0xfe, 0x67, 0x5f, + 0x31, 0x7c, 0xf1, 0xdc, 0x6c, 0xfb, 0xca, 0x9c, 0xbd, 0xae, 0xe1, 0x2d, 0x4c, 0xdc, 0xdb, 0x9f, + 0x19, 0xd1, 0x4b, 0xb0, 0x41, 0x07, 0x61, 0x18, 0x6e, 0x06, 0x0d, 0x45, 0xb6, 0xc0, 0xc8, 0xce, + 0x64, 0x91, 0xad, 0x26, 0x68, 0x0b, 0xe3, 0xf7, 0xf6, 0x67, 0x86, 0xb5, 0x02, 0xac, 0x13, 0x41, + 0xeb, 0x30, 0x4e, 0xff, 0xfa, 0xb1, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xc7, 0xf2, 0xe8, 0x6a, 0xa8, + 0x0b, 0x27, 0xee, 0xed, 0xcf, 0x8c, 0xa7, 0x0a, 0x71, 0x9a, 0xa0, 0xfd, 0x2e, 0x8c, 0xcd, 0xc7, + 0xb1, 0x53, 0xdf, 0x22, 0x0d, 0x3e, 0x83, 0xe8, 0x79, 0xe8, 0xf3, 0x9d, 0x1d, 0x22, 0xe6, 0xf7, + 0x9c, 0x18, 0xd8, 0xbe, 0xeb, 0xce, 0x0e, 0x39, 0xd8, 0x9f, 0x99, 0xb8, 0xe9, 0xbb, 0xef, 0xb4, + 0xc4, 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0x8b, 0x00, 0x0d, 0xb2, 0xeb, 0xd6, 0x49, 0xd5, 0x89, + 0xb7, 0xc4, 0x7c, 0x23, 0x51, 0x17, 0x2a, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x2e, 0x94, 0xe6, 0x77, + 0x03, 0xb7, 0x51, 0x0d, 0x1a, 0x11, 0xda, 0x86, 0xf1, 0x66, 0x48, 0x36, 0x48, 0xa8, 0x8a, 0xca, + 0xd6, 0xb9, 0xe2, 0x85, 0xe1, 0x8b, 0x17, 0x32, 0x3f, 0xd6, 0x44, 0x5d, 0xf2, 0xe3, 0x70, 0x6f, + 0xe1, 0x21, 0xd1, 0xde, 0x78, 0x0a, 0x8a, 0xd3, 0x94, 0xed, 0x7f, 0x5b, 0x80, 0x93, 0xf3, 0xef, + 0xb6, 0x42, 0x52, 0x71, 0xa3, 0xed, 0xf4, 0x0a, 0x6f, 0xb8, 0xd1, 0xf6, 0xf5, 0x64, 0x04, 0xd4, + 0xd2, 0xaa, 0x88, 0x72, 0xac, 0x30, 0xd0, 0x33, 0x30, 0x48, 0x7f, 0xdf, 0xc4, 0x2b, 0xe2, 0x93, + 0x4f, 0x08, 0xe4, 0xe1, 0x8a, 0x13, 0x3b, 0x15, 0x0e, 0xc2, 0x12, 0x07, 0xad, 0xc2, 0x70, 0x9d, + 0x6d, 0xc8, 0xcd, 0xd5, 0xa0, 0x41, 0xd8, 0x64, 0x96, 0x16, 0x9e, 0xa2, 0xe8, 0x8b, 0x49, 0xf1, + 0xc1, 0xfe, 0x4c, 0x99, 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xbf, 0xfa, + 0x18, 0x25, 0xc8, 0xd8, 0x5b, 0x17, 0xb4, 0xad, 0xd2, 0xcf, 0xb6, 0xca, 0x48, 0xf6, 0x36, 0x41, + 0xcf, 0x42, 0xdf, 0xb6, 0xeb, 0x37, 0xca, 0x03, 0x8c, 0xd6, 0x19, 0x3a, 0xe7, 0x57, 0x5d, 0xbf, + 0x71, 0xb0, 0x3f, 0x33, 0x69, 0x74, 0x87, 0x16, 0x62, 0x86, 0x6a, 0xff, 0xa9, 0x05, 0x33, 0x0c, + 0xb6, 0xec, 0x7a, 0xa4, 0x4a, 0xc2, 0xc8, 0x8d, 0x62, 0xe2, 0xc7, 0xc6, 0x80, 0x5e, 0x04, 0x88, + 0x48, 0x3d, 0x24, 0xb1, 0x36, 0xa4, 0x6a, 0x61, 0xd4, 0x14, 0x04, 0x6b, 0x58, 0x94, 0x21, 0x44, + 0x5b, 0x4e, 0xc8, 0xd6, 0x97, 0x18, 0x58, 0xc5, 0x10, 0x6a, 0x12, 0x80, 0x13, 0x1c, 0x83, 0x21, + 0x14, 0xbb, 0x31, 0x04, 0xf4, 0x29, 0x18, 0x4f, 0x1a, 0x8b, 0x9a, 0x4e, 0x5d, 0x0e, 0x20, 0xdb, + 0x32, 0x35, 0x13, 0x84, 0xd3, 0xb8, 0xf6, 0x3f, 0xb4, 0xc4, 0xe2, 0xa1, 0x5f, 0xfd, 0x21, 0xff, + 0x56, 0xfb, 0xb7, 0x2d, 0x18, 0x5c, 0x70, 0xfd, 0x86, 0xeb, 0x6f, 0xa2, 0xcf, 0xc2, 0x10, 0x3d, + 0x9b, 0x1a, 0x4e, 0xec, 0x08, 0xbe, 0xf7, 0x71, 0x6d, 0x6f, 0xa9, 0xa3, 0x62, 0xb6, 0xb9, 0xbd, + 0x49, 0x0b, 0xa2, 0x59, 0x8a, 0x4d, 0x77, 0xdb, 0x8d, 0xf5, 0xb7, 0x49, 0x3d, 0x5e, 0x25, 0xb1, + 0x93, 0x7c, 0x4e, 0x52, 0x86, 0x15, 0x55, 0x74, 0x15, 0x06, 0x62, 0x27, 0xdc, 0x24, 0xb1, 0x60, + 0x80, 0x99, 0x8c, 0x8a, 0xd7, 0xc4, 0x74, 0x47, 0x12, 0xbf, 0x4e, 0x92, 0x63, 0x61, 0x8d, 0x55, + 0xc5, 0x82, 0x84, 0xfd, 0x35, 0x0b, 0x4e, 0x2f, 0xd6, 0x56, 0x72, 0xd6, 0xd5, 0x79, 0x18, 0x68, + 0x84, 0xee, 0x2e, 0x09, 0xc5, 0x38, 0x2b, 0x2a, 0x15, 0x56, 0x8a, 0x05, 0x14, 0x5d, 0x82, 0x11, + 0x7e, 0x20, 0x5d, 0x71, 0xfc, 0x86, 0x27, 0x87, 0x78, 0x4a, 0x60, 0x8f, 0xdc, 0xd2, 0x60, 0xd8, + 0xc0, 0x3c, 0xe4, 0x40, 0xd7, 0x61, 0x64, 0xd1, 0x69, 0x3a, 0xeb, 0xae, 0xe7, 0xc6, 0x2e, 0x89, + 0xd0, 0xe3, 0x50, 0x74, 0x1a, 0x0d, 0xc6, 0xc3, 0x4a, 0x0b, 0x27, 0xef, 0xed, 0xcf, 0x14, 0xe7, + 0x1b, 0x74, 0x33, 0x81, 0xc2, 0xda, 0xc3, 0x14, 0x03, 0x3d, 0x09, 0x7d, 0x8d, 0x30, 0x68, 0x96, + 0x0b, 0x0c, 0xf3, 0x14, 0xdd, 0x77, 0x95, 0x30, 0x68, 0xa6, 0x50, 0x19, 0x8e, 0xfd, 0xbb, 0x05, + 0x78, 0x64, 0x91, 0x34, 0xb7, 0x96, 0x6b, 0x39, 0xa3, 0x72, 0x01, 0x86, 0x76, 0x02, 0xdf, 0x8d, + 0x83, 0x30, 0x12, 0x4d, 0xb3, 0xed, 0xbe, 0x2a, 0xca, 0xb0, 0x82, 0xa2, 0x73, 0xd0, 0xd7, 0x4c, + 0x58, 0xf5, 0x88, 0x64, 0xf3, 0x8c, 0x49, 0x33, 0x08, 0xc5, 0x68, 0x45, 0x24, 0x14, 0x6c, 0x4a, + 0x61, 0xdc, 0x8c, 0x48, 0x88, 0x19, 0x24, 0x59, 0xef, 0x74, 0x27, 0x88, 0x3d, 0x94, 0x5a, 0xef, + 0x14, 0x82, 0x35, 0x2c, 0x54, 0x85, 0x12, 0xff, 0x87, 0xc9, 0x06, 0xe3, 0x48, 0x39, 0xab, 0xa4, + 0x26, 0x91, 0xc4, 0x2a, 0x19, 0x65, 0x1b, 0x42, 0x16, 0xe2, 0x84, 0x88, 0x31, 0x4f, 0x03, 0x5d, + 0xe7, 0xe9, 0x5b, 0x05, 0x40, 0x7c, 0x08, 0x7f, 0xc4, 0x06, 0xee, 0x66, 0xfb, 0xc0, 0x65, 0x1e, + 0x8d, 0xd7, 0x82, 0xba, 0xe3, 0xa5, 0xf7, 0xd8, 0x51, 0x8d, 0xde, 0x2f, 0x5a, 0x80, 0x16, 0x5d, + 0xbf, 0x41, 0xc2, 0x63, 0x90, 0x0b, 0x0f, 0xb7, 0x01, 0xaf, 0xc1, 0xd8, 0xa2, 0xe7, 0x12, 0x3f, + 0x5e, 0xa9, 0x2e, 0x06, 0xfe, 0x86, 0xbb, 0x89, 0x3e, 0x09, 0x63, 0x54, 0x4c, 0x0e, 0x5a, 0x71, + 0x8d, 0xd4, 0x03, 0x9f, 0x49, 0x14, 0x54, 0xb8, 0x44, 0xf7, 0xf6, 0x67, 0xc6, 0xd6, 0x0c, 0x08, + 0x4e, 0x61, 0xda, 0x7f, 0x44, 0x3f, 0x34, 0xd8, 0x69, 0x06, 0x3e, 0xf1, 0xe3, 0xc5, 0xc0, 0x6f, + 0x70, 0xc9, 0xf3, 0x93, 0xd0, 0x17, 0xd3, 0x8e, 0xf3, 0x8f, 0x3c, 0x2f, 0xa7, 0x96, 0x76, 0xf7, + 0x60, 0x7f, 0xe6, 0x54, 0x7b, 0x0d, 0xf6, 0x41, 0xac, 0x0e, 0xfa, 0x29, 0x18, 0x88, 0x62, 0x27, + 0x6e, 0x45, 0xe2, 0xb3, 0x1f, 0x95, 0x9f, 0x5d, 0x63, 0xa5, 0x07, 0xfb, 0x33, 0xe3, 0xaa, 0x1a, + 0x2f, 0xc2, 0xa2, 0x02, 0x7a, 0x02, 0x06, 0x77, 0x48, 0x14, 0x39, 0x9b, 0x52, 0x68, 0x18, 0x17, + 0x75, 0x07, 0x57, 0x79, 0x31, 0x96, 0x70, 0xf4, 0x18, 0xf4, 0x93, 0x30, 0x0c, 0x42, 0xb1, 0xaa, + 0x46, 0x05, 0x62, 0xff, 0x12, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0x07, 0x0b, 0xc6, 0x55, 0x5f, 0x79, + 0x5b, 0xc7, 0x70, 0x3a, 0xbc, 0x01, 0x50, 0x97, 0x1f, 0x18, 0x31, 0x7e, 0x37, 0x7c, 0xf1, 0x7c, + 0xd6, 0x12, 0x6e, 0x1f, 0xc6, 0x84, 0xb2, 0x2a, 0x8a, 0xb0, 0x46, 0xcd, 0xfe, 0x97, 0x16, 0x9c, + 0x48, 0x7d, 0xd1, 0x35, 0x37, 0x8a, 0xd1, 0x9b, 0x6d, 0x5f, 0x35, 0xdb, 0xdb, 0x57, 0xd1, 0xda, + 0xec, 0x9b, 0xd4, 0x9a, 0x93, 0x25, 0xda, 0x17, 0x5d, 0x81, 0x7e, 0x37, 0x26, 0x3b, 0xf2, 0x63, + 0x1e, 0xeb, 0xf8, 0x31, 0xbc, 0x57, 0xc9, 0x8c, 0xac, 0xd0, 0x9a, 0x98, 0x13, 0xb0, 0xff, 0x97, + 0x05, 0x25, 0xbe, 0x6c, 0x57, 0x9d, 0xe6, 0x31, 0xcc, 0xc5, 0x0a, 0xf4, 0x31, 0xea, 0xbc, 0xe3, + 0x8f, 0x67, 0x77, 0x5c, 0x74, 0x67, 0x96, 0x8a, 0x7e, 0x5c, 0xc4, 0x56, 0xcc, 0x8c, 0x16, 0x61, + 0x46, 0x62, 0xfa, 0x45, 0x28, 0x29, 0x04, 0x34, 0x01, 0xc5, 0x6d, 0xc2, 0xaf, 0x55, 0x25, 0x4c, + 0x7f, 0xa2, 0x29, 0xe8, 0xdf, 0x75, 0xbc, 0x96, 0xd8, 0xec, 0x98, 0xff, 0xf9, 0x64, 0xe1, 0x92, + 0x65, 0x7f, 0x93, 0xed, 0x31, 0xd1, 0xc8, 0x92, 0xbf, 0x2b, 0x98, 0xc9, 0xbb, 0x30, 0xe5, 0x65, + 0xf0, 0x30, 0x31, 0x10, 0xbd, 0xf3, 0xbc, 0x47, 0x44, 0x5f, 0xa7, 0xb2, 0xa0, 0x38, 0xb3, 0x0d, + 0x7a, 0x0c, 0x04, 0x4d, 0xba, 0xa2, 0x1c, 0x8f, 0xf5, 0x57, 0x88, 0xcb, 0x37, 0x44, 0x19, 0x56, + 0x50, 0xca, 0x20, 0xa6, 0x54, 0xe7, 0xaf, 0x92, 0xbd, 0x1a, 0xf1, 0x48, 0x3d, 0x0e, 0xc2, 0x0f, + 0xb4, 0xfb, 0x67, 0xf8, 0xe8, 0x73, 0xfe, 0x32, 0x2c, 0x08, 0x14, 0xaf, 0x92, 0x3d, 0x3e, 0x15, + 0xfa, 0xd7, 0x15, 0x3b, 0x7e, 0xdd, 0x6f, 0x58, 0x30, 0xaa, 0xbe, 0xee, 0x18, 0x36, 0xd2, 0x82, + 0xb9, 0x91, 0xce, 0x74, 0x5c, 0x8f, 0x39, 0x5b, 0xe8, 0x87, 0x8c, 0x05, 0x08, 0x9c, 0x6a, 0x18, + 0xd0, 0xa1, 0xa1, 0x3c, 0xfb, 0x83, 0x9c, 0x90, 0x5e, 0xbe, 0xeb, 0x2a, 0xd9, 0x5b, 0x0b, 0xa8, + 0xf8, 0x90, 0xfd, 0x5d, 0xc6, 0xac, 0xf5, 0x75, 0x9c, 0xb5, 0xdf, 0x2c, 0xc0, 0x49, 0x35, 0x02, + 0xc6, 0x01, 0xfd, 0xa3, 0x3e, 0x06, 0xcf, 0xc2, 0x70, 0x83, 0x6c, 0x38, 0x2d, 0x2f, 0x56, 0x37, + 0xe7, 0x7e, 0xae, 0x3d, 0xa9, 0x24, 0xc5, 0x58, 0xc7, 0x39, 0xc4, 0xb0, 0xfd, 0xea, 0x30, 0xe3, + 0xbd, 0xb1, 0x43, 0x57, 0x30, 0x95, 0xde, 0x34, 0xfd, 0xc7, 0x88, 0xae, 0xff, 0x10, 0xba, 0x8e, + 0xc7, 0xa0, 0xdf, 0xdd, 0xa1, 0x67, 0x71, 0xc1, 0x3c, 0x62, 0x57, 0x68, 0x21, 0xe6, 0x30, 0xf4, + 0x31, 0x18, 0xac, 0x07, 0x3b, 0x3b, 0x8e, 0xdf, 0x28, 0x17, 0x99, 0x3c, 0x39, 0x4c, 0x8f, 0xeb, + 0x45, 0x5e, 0x84, 0x25, 0x0c, 0x3d, 0x02, 0x7d, 0x4e, 0xb8, 0x19, 0x95, 0xfb, 0x18, 0xce, 0x10, + 0x6d, 0x69, 0x3e, 0xdc, 0x8c, 0x30, 0x2b, 0xa5, 0x72, 0xe2, 0x9d, 0x20, 0xdc, 0x76, 0xfd, 0xcd, + 0x8a, 0x1b, 0x32, 0xa1, 0x4f, 0x93, 0x13, 0x6f, 0x2b, 0x08, 0xd6, 0xb0, 0xd0, 0x32, 0xf4, 0x37, + 0x83, 0x30, 0x8e, 0xca, 0x03, 0x6c, 0xb8, 0x1f, 0xcd, 0xd9, 0x4a, 0xfc, 0x6b, 0xab, 0x41, 0x18, + 0x27, 0x1f, 0x40, 0xff, 0x45, 0x98, 0x57, 0x47, 0x3f, 0x05, 0x45, 0xe2, 0xef, 0x96, 0x07, 0x19, + 0x95, 0xe9, 0x2c, 0x2a, 0x4b, 0xfe, 0xee, 0x2d, 0x27, 0x4c, 0xf8, 0xcc, 0x92, 0xbf, 0x8b, 0x69, + 0x1d, 0xf4, 0x3a, 0x94, 0xa4, 0xee, 0x34, 0x2a, 0x0f, 0xe5, 0x2f, 0x31, 0x2c, 0x90, 0x30, 0x79, + 0xa7, 0xe5, 0x86, 0x64, 0x87, 0xf8, 0x71, 0x94, 0xdc, 0x7e, 0x25, 0x34, 0xc2, 0x09, 0x35, 0xf4, + 0xba, 0xbc, 0xce, 0xad, 0x06, 0x2d, 0x3f, 0x8e, 0xca, 0x25, 0xd6, 0xbd, 0x4c, 0x45, 0xdb, 0xad, + 0x04, 0x2f, 0x7d, 0xdf, 0xe3, 0x95, 0xb1, 0x41, 0x0a, 0x61, 0x18, 0xf5, 0xdc, 0x5d, 0xe2, 0x93, + 0x28, 0xaa, 0x86, 0xc1, 0x3a, 0x29, 0x03, 0xeb, 0xf9, 0xe9, 0x6c, 0xfd, 0x53, 0xb0, 0x4e, 0x16, + 0x26, 0xef, 0xed, 0xcf, 0x8c, 0x5e, 0xd3, 0xeb, 0x60, 0x93, 0x04, 0xba, 0x09, 0x63, 0x54, 0x40, + 0x75, 0x13, 0xa2, 0xc3, 0xdd, 0x88, 0x32, 0xe9, 0x14, 0x1b, 0x95, 0x70, 0x8a, 0x08, 0x7a, 0x15, + 0x4a, 0x9e, 0xbb, 0x41, 0xea, 0x7b, 0x75, 0x8f, 0x94, 0x47, 0x18, 0xc5, 0xcc, 0x6d, 0x75, 0x4d, + 0x22, 0xf1, 0x0b, 0x80, 0xfa, 0x8b, 0x93, 0xea, 0xe8, 0x16, 0x9c, 0x8a, 0x49, 0xb8, 0xe3, 0xfa, + 0x0e, 0xdd, 0x0e, 0x42, 0x9e, 0x64, 0x5a, 0xbc, 0x51, 0xb6, 0xde, 0xce, 0x8a, 0xa1, 0x3b, 0xb5, + 0x96, 0x89, 0x85, 0x73, 0x6a, 0xa3, 0x1b, 0x30, 0xce, 0x76, 0x42, 0xb5, 0xe5, 0x79, 0xd5, 0xc0, + 0x73, 0xeb, 0x7b, 0xe5, 0x31, 0x46, 0xf0, 0x63, 0x52, 0x4d, 0xb7, 0x62, 0x82, 0xe9, 0x8d, 0x37, + 0xf9, 0x87, 0xd3, 0xb5, 0xd1, 0x3a, 0x53, 0xdb, 0xb4, 0x42, 0x37, 0xde, 0xa3, 0xeb, 0x97, 0xdc, + 0x8d, 0xcb, 0xe3, 0x1d, 0xef, 0x8f, 0x3a, 0xaa, 0xd2, 0xed, 0xe8, 0x85, 0x38, 0x4d, 0x90, 0x6e, + 0xed, 0x28, 0x6e, 0xb8, 0x7e, 0x79, 0x82, 0x71, 0x0c, 0xb5, 0x33, 0x6a, 0xb4, 0x10, 0x73, 0x18, + 0x53, 0xd9, 0xd0, 0x1f, 0x37, 0x28, 0x07, 0x9d, 0x64, 0x88, 0x89, 0xca, 0x46, 0x02, 0x70, 0x82, + 0x43, 0x8f, 0xe5, 0x38, 0xde, 0x2b, 0x23, 0x86, 0xaa, 0xb6, 0xcb, 0xda, 0xda, 0xeb, 0x98, 0x96, + 0xa3, 0x6b, 0x30, 0x48, 0xfc, 0xdd, 0xe5, 0x30, 0xd8, 0x29, 0x9f, 0xc8, 0xdf, 0xb3, 0x4b, 0x1c, + 0x85, 0x33, 0xf4, 0xe4, 0x02, 0x20, 0x8a, 0xb1, 0x24, 0x81, 0xee, 0x42, 0x39, 0x63, 0x46, 0xf8, + 0x04, 0x4c, 0xb1, 0x09, 0x78, 0x59, 0xd4, 0x2d, 0xaf, 0xe5, 0xe0, 0x1d, 0x74, 0x80, 0xe1, 0x5c, + 0xea, 0xe8, 0x33, 0x30, 0xca, 0x37, 0x14, 0xd7, 0xf7, 0x46, 0xe5, 0x93, 0xec, 0x6b, 0xce, 0xe5, + 0x6f, 0x4e, 0x8e, 0xb8, 0x70, 0x52, 0x74, 0x68, 0x54, 0x2f, 0x8d, 0xb0, 0x49, 0xcd, 0x5e, 0x87, + 0x31, 0xc5, 0xb7, 0xd8, 0xd2, 0x41, 0x33, 0xd0, 0x4f, 0x19, 0xb2, 0xbc, 0xb1, 0x97, 0xe8, 0x4c, + 0x31, 0x3d, 0x1d, 0xe6, 0xe5, 0x6c, 0xa6, 0xdc, 0x77, 0xc9, 0xc2, 0x5e, 0x4c, 0xf8, 0xad, 0xab, + 0xa8, 0xcd, 0x94, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x7f, 0x5c, 0xee, 0x49, 0x98, 0x63, 0x0f, 0xc7, + 0xc1, 0xd3, 0x30, 0xb4, 0x15, 0x44, 0x31, 0xc5, 0x66, 0x6d, 0xf4, 0x27, 0x92, 0xce, 0x15, 0x51, + 0x8e, 0x15, 0x06, 0x7a, 0x09, 0x46, 0xeb, 0x7a, 0x03, 0xe2, 0x2c, 0x53, 0x43, 0x60, 0xb4, 0x8e, + 0x4d, 0x5c, 0x74, 0x09, 0x86, 0xd8, 0x6b, 0x4d, 0x3d, 0xf0, 0xc4, 0xfd, 0x4e, 0x1e, 0xc8, 0x43, + 0x55, 0x51, 0x7e, 0xa0, 0xfd, 0xc6, 0x0a, 0x9b, 0xde, 0xb9, 0x69, 0x17, 0x56, 0xaa, 0xe2, 0x14, + 0x51, 0x77, 0xee, 0x2b, 0xac, 0x14, 0x0b, 0xa8, 0xfd, 0x37, 0x0a, 0xda, 0x28, 0xd3, 0x1b, 0x0b, + 0x41, 0x55, 0x18, 0xbc, 0xe3, 0xb8, 0xb1, 0xeb, 0x6f, 0x0a, 0x71, 0xe1, 0x89, 0x8e, 0x47, 0x0a, + 0xab, 0x74, 0x9b, 0x57, 0xe0, 0x87, 0x9e, 0xf8, 0x83, 0x25, 0x19, 0x4a, 0x31, 0x6c, 0xf9, 0x3e, + 0xa5, 0x58, 0xe8, 0x95, 0x22, 0xe6, 0x15, 0x38, 0x45, 0xf1, 0x07, 0x4b, 0x32, 0xe8, 0x4d, 0x00, + 0xb9, 0x2c, 0x49, 0x43, 0xbc, 0x92, 0x3c, 0xdd, 0x9d, 0xe8, 0x9a, 0xaa, 0xb3, 0x30, 0x46, 0x8f, + 0xd4, 0xe4, 0x3f, 0xd6, 0xe8, 0xd9, 0x31, 0x13, 0xab, 0xda, 0x3b, 0x83, 0x7e, 0x96, 0x72, 0x02, + 0x27, 0x8c, 0x49, 0x63, 0x3e, 0x16, 0x83, 0xf3, 0x64, 0x6f, 0x52, 0xf1, 0x9a, 0xbb, 0x43, 0x74, + 0xae, 0x21, 0x88, 0xe0, 0x84, 0x9e, 0xfd, 0x5b, 0x45, 0x28, 0xe7, 0x75, 0x97, 0x2e, 0x3a, 0x72, + 0xd7, 0x8d, 0x17, 0xa9, 0x34, 0x64, 0x99, 0x8b, 0x6e, 0x49, 0x94, 0x63, 0x85, 0x41, 0x67, 0x3f, + 0x72, 0x37, 0xe5, 0xa5, 0xa6, 0x3f, 0x99, 0xfd, 0x1a, 0x2b, 0xc5, 0x02, 0x4a, 0xf1, 0x42, 0xe2, + 0x44, 0xe2, 0x19, 0x4e, 0x5b, 0x25, 0x98, 0x95, 0x62, 0x01, 0xd5, 0xf5, 0x11, 0x7d, 0x5d, 0xf4, + 0x11, 0xc6, 0x10, 0xf5, 0x1f, 0xed, 0x10, 0xa1, 0xb7, 0x00, 0x36, 0x5c, 0xdf, 0x8d, 0xb6, 0x18, + 0xf5, 0x81, 0x43, 0x53, 0x57, 0xb2, 0xd4, 0xb2, 0xa2, 0x82, 0x35, 0x8a, 0xe8, 0x05, 0x18, 0x56, + 0x1b, 0x70, 0xa5, 0x52, 0x1e, 0x34, 0xdf, 0x78, 0x12, 0x6e, 0x54, 0xc1, 0x3a, 0x9e, 0xfd, 0x76, + 0x7a, 0xbd, 0x88, 0x1d, 0xa0, 0x8d, 0xaf, 0xd5, 0xeb, 0xf8, 0x16, 0x3a, 0x8f, 0xaf, 0xfd, 0x7b, + 0x45, 0x18, 0x37, 0x1a, 0x6b, 0x45, 0x3d, 0xf0, 0xac, 0xcb, 0xf4, 0x9c, 0x73, 0x62, 0x22, 0xf6, + 0x9f, 0xdd, 0x7d, 0xab, 0xe8, 0x67, 0x21, 0xdd, 0x01, 0xbc, 0x3e, 0x7a, 0x0b, 0x4a, 0x9e, 0x13, + 0x31, 0xdd, 0x06, 0x11, 0xfb, 0xae, 0x17, 0x62, 0xc9, 0x3d, 0xc2, 0x89, 0x62, 0xed, 0xa8, 0xe1, + 0xb4, 0x13, 0x92, 0xf4, 0x40, 0xa6, 0xb2, 0x8f, 0x7c, 0xe7, 0x55, 0x9d, 0xa0, 0x02, 0xd2, 0x1e, + 0xe6, 0x30, 0x74, 0x09, 0x46, 0x42, 0xc2, 0x56, 0xc5, 0x22, 0x15, 0xe5, 0xd8, 0x32, 0xeb, 0x4f, + 0x64, 0x3e, 0xac, 0xc1, 0xb0, 0x81, 0x99, 0x88, 0xf2, 0x03, 0x1d, 0x44, 0xf9, 0x27, 0x60, 0x90, + 0xfd, 0x50, 0x2b, 0x40, 0xcd, 0xc6, 0x0a, 0x2f, 0xc6, 0x12, 0x9e, 0x5e, 0x30, 0x43, 0x3d, 0x2e, + 0x98, 0x27, 0x61, 0xac, 0xe2, 0x90, 0x9d, 0xc0, 0x5f, 0xf2, 0x1b, 0xcd, 0xc0, 0xf5, 0x63, 0x54, + 0x86, 0x3e, 0x76, 0x3a, 0xf0, 0xbd, 0xdd, 0x47, 0x29, 0xe0, 0x3e, 0x2a, 0x98, 0xdb, 0x7f, 0x58, + 0x80, 0xd1, 0x0a, 0xf1, 0x48, 0x4c, 0xf8, 0x55, 0x26, 0x42, 0xcb, 0x80, 0x36, 0x43, 0xa7, 0x4e, + 0xaa, 0x24, 0x74, 0x83, 0x86, 0xae, 0xeb, 0x2c, 0xb2, 0xf7, 0x04, 0x74, 0xb9, 0x0d, 0x8a, 0x33, + 0x6a, 0xa0, 0x37, 0x60, 0xb4, 0x19, 0x12, 0x43, 0x45, 0x67, 0xe5, 0x49, 0x23, 0x55, 0x1d, 0x91, + 0x0b, 0xc2, 0x46, 0x11, 0x36, 0x49, 0xa1, 0x9f, 0x81, 0x89, 0x20, 0x6c, 0x6e, 0x39, 0x7e, 0x85, + 0x34, 0x89, 0xdf, 0xa0, 0x92, 0xbe, 0x50, 0x41, 0x4c, 0xdd, 0xdb, 0x9f, 0x99, 0xb8, 0x91, 0x82, + 0xe1, 0x36, 0x6c, 0xf4, 0x06, 0x4c, 0x36, 0xc3, 0xa0, 0xe9, 0x6c, 0xb2, 0x85, 0x22, 0x04, 0x1a, + 0xce, 0x7d, 0x9e, 0xbe, 0xb7, 0x3f, 0x33, 0x59, 0x4d, 0x03, 0x0f, 0xf6, 0x67, 0x4e, 0xb0, 0x81, + 0xa2, 0x25, 0x09, 0x10, 0xb7, 0x93, 0xb1, 0x37, 0xe1, 0x64, 0x25, 0xb8, 0xe3, 0xdf, 0x71, 0xc2, + 0xc6, 0x7c, 0x75, 0x45, 0xd3, 0x1d, 0x5c, 0x97, 0x77, 0x57, 0xfe, 0x16, 0x9d, 0x79, 0x4e, 0x69, + 0x35, 0xb9, 0xfc, 0xb2, 0xec, 0x7a, 0x24, 0x47, 0x47, 0xf1, 0xb7, 0x0b, 0x46, 0x4b, 0x09, 0xbe, + 0x7a, 0x56, 0xb0, 0x72, 0x9f, 0x15, 0x5e, 0x83, 0xa1, 0x0d, 0x97, 0x78, 0x0d, 0x4c, 0x36, 0xc4, + 0xcc, 0x3c, 0x9e, 0xff, 0xbc, 0xb6, 0x4c, 0x31, 0xa5, 0x4e, 0x8a, 0xdf, 0x7c, 0x97, 0x45, 0x65, + 0xac, 0xc8, 0xa0, 0x6d, 0x98, 0x90, 0x57, 0x2b, 0x09, 0x15, 0x9b, 0xf8, 0x89, 0x4e, 0xf7, 0x35, + 0x93, 0x38, 0x9b, 0x40, 0x9c, 0x22, 0x83, 0xdb, 0x08, 0xd3, 0xab, 0xee, 0x0e, 0x3d, 0xae, 0xfa, + 0xd8, 0x92, 0x66, 0x57, 0x5d, 0x76, 0x6b, 0x67, 0xa5, 0xf6, 0x2f, 0x5b, 0xf0, 0x50, 0xdb, 0xc8, + 0x08, 0xed, 0xc5, 0x11, 0xcf, 0x42, 0x5a, 0x9b, 0x50, 0xe8, 0xae, 0x4d, 0xb0, 0xff, 0x91, 0x05, + 0x53, 0x4b, 0x3b, 0xcd, 0x78, 0xaf, 0xe2, 0x9a, 0x4f, 0x1f, 0x2f, 0xc2, 0xc0, 0x0e, 0x69, 0xb8, + 0xad, 0x1d, 0x31, 0x73, 0x33, 0x92, 0xa5, 0xaf, 0xb2, 0xd2, 0x83, 0xfd, 0x99, 0xd1, 0x5a, 0x1c, + 0x84, 0xce, 0x26, 0xe1, 0x05, 0x58, 0xa0, 0xb3, 0x83, 0xd1, 0x7d, 0x97, 0x5c, 0x73, 0x77, 0x5c, + 0xf9, 0x5c, 0xda, 0x51, 0xa3, 0x36, 0x2b, 0x07, 0x74, 0xf6, 0xb5, 0x96, 0xe3, 0xc7, 0x6e, 0xbc, + 0x27, 0x5e, 0x75, 0x24, 0x11, 0x9c, 0xd0, 0xb3, 0xbf, 0x6b, 0xc1, 0xb8, 0xe4, 0x25, 0xf3, 0x8d, + 0x46, 0x48, 0xa2, 0x08, 0x4d, 0x43, 0xc1, 0x6d, 0x8a, 0x5e, 0x82, 0xe8, 0x65, 0x61, 0xa5, 0x8a, + 0x0b, 0x6e, 0x13, 0x55, 0xa1, 0xc4, 0x5f, 0x5d, 0x93, 0xc5, 0xd5, 0xd3, 0xdb, 0x2d, 0xeb, 0xc1, + 0x9a, 0xac, 0x89, 0x13, 0x22, 0x52, 0x2a, 0x66, 0xe7, 0x50, 0xd1, 0x7c, 0x12, 0xba, 0x22, 0xca, + 0xb1, 0xc2, 0x40, 0x17, 0x60, 0xc8, 0x0f, 0x1a, 0xfc, 0x11, 0x9c, 0xef, 0x69, 0xb6, 0x64, 0xaf, + 0x8b, 0x32, 0xac, 0xa0, 0xf6, 0x2f, 0x58, 0x30, 0x22, 0xbf, 0xac, 0x47, 0x01, 0x9d, 0x6e, 0xad, + 0x44, 0x38, 0x4f, 0xb6, 0x16, 0x15, 0xb0, 0x19, 0xc4, 0x90, 0xab, 0x8b, 0x87, 0x91, 0xab, 0xed, + 0xaf, 0x14, 0x60, 0x4c, 0x76, 0xa7, 0xd6, 0x5a, 0x8f, 0x48, 0x8c, 0xd6, 0xa0, 0xe4, 0xf0, 0x21, + 0x27, 0x72, 0xc5, 0x3e, 0x96, 0x7d, 0xa1, 0x33, 0xe6, 0x27, 0x11, 0x75, 0xe6, 0x65, 0x6d, 0x9c, + 0x10, 0x42, 0x1e, 0x4c, 0xfa, 0x41, 0xcc, 0x8e, 0x3d, 0x05, 0xef, 0xf4, 0xec, 0x90, 0xa6, 0x7e, + 0x5a, 0x50, 0x9f, 0xbc, 0x9e, 0xa6, 0x82, 0xdb, 0x09, 0xa3, 0x25, 0xa9, 0x44, 0x2a, 0xe6, 0x5f, + 0xe1, 0xf4, 0x59, 0xc8, 0xd6, 0x21, 0xd9, 0xbf, 0x63, 0x41, 0x49, 0xa2, 0x1d, 0xc7, 0x0b, 0xd3, + 0x2a, 0x0c, 0x46, 0x6c, 0x12, 0xe4, 0xd0, 0xd8, 0x9d, 0x3a, 0xce, 0xe7, 0x2b, 0x39, 0xcd, 0xf9, + 0xff, 0x08, 0x4b, 0x1a, 0x4c, 0x0b, 0xae, 0xba, 0xff, 0x21, 0xd1, 0x82, 0xab, 0xfe, 0xe4, 0x9c, + 0x30, 0xff, 0x95, 0xf5, 0x59, 0x53, 0x15, 0x50, 0xa1, 0xb3, 0x19, 0x92, 0x0d, 0xf7, 0x6e, 0x5a, + 0xe8, 0xac, 0xb2, 0x52, 0x2c, 0xa0, 0xe8, 0x4d, 0x18, 0xa9, 0x4b, 0xe5, 0x71, 0xc2, 0x06, 0xce, + 0x77, 0x54, 0xc5, 0xab, 0x57, 0x1b, 0x6e, 0x20, 0xb7, 0xa8, 0xd5, 0xc7, 0x06, 0x35, 0xf3, 0xdd, + 0xbf, 0xd8, 0xed, 0xdd, 0x3f, 0xa1, 0x9b, 0xfb, 0x72, 0x6d, 0xff, 0x8a, 0x05, 0x03, 0x5c, 0x05, + 0xd9, 0x9b, 0xce, 0x56, 0x7b, 0x85, 0x4a, 0xc6, 0xee, 0x16, 0x2d, 0x14, 0x8f, 0x52, 0x68, 0x15, + 0x4a, 0xec, 0x07, 0x53, 0xc5, 0x14, 0xf3, 0x2d, 0x03, 0x79, 0xab, 0x7a, 0x07, 0x6f, 0xc9, 0x6a, + 0x38, 0xa1, 0x60, 0x7f, 0xb9, 0x48, 0x59, 0x55, 0x82, 0x6a, 0x9c, 0xe0, 0xd6, 0x83, 0x3b, 0xc1, + 0x0b, 0x0f, 0xea, 0x04, 0xdf, 0x84, 0xf1, 0xba, 0xf6, 0xe4, 0x95, 0xcc, 0xe4, 0x85, 0x8e, 0x8b, + 0x44, 0x7b, 0x1d, 0xe3, 0x6a, 0xb8, 0x45, 0x93, 0x08, 0x4e, 0x53, 0x45, 0x3f, 0x0b, 0x23, 0x7c, + 0x9e, 0x45, 0x2b, 0x7d, 0xac, 0x95, 0x8f, 0xe5, 0xaf, 0x17, 0xbd, 0x09, 0xb6, 0x12, 0x6b, 0x5a, + 0x75, 0x6c, 0x10, 0xb3, 0xbf, 0xd0, 0x0f, 0xfd, 0x4b, 0xbb, 0xc4, 0x8f, 0x8f, 0x81, 0x21, 0xd5, + 0x61, 0xcc, 0xf5, 0x77, 0x03, 0x6f, 0x97, 0x34, 0x38, 0xfc, 0x30, 0x87, 0xeb, 0x29, 0x41, 0x7a, + 0x6c, 0xc5, 0x20, 0x81, 0x53, 0x24, 0x1f, 0xc4, 0xad, 0xfd, 0x32, 0x0c, 0xf0, 0xb9, 0x17, 0x57, + 0xf6, 0x4c, 0x05, 0x3b, 0x1b, 0x44, 0xb1, 0x0b, 0x12, 0x8d, 0x02, 0xd7, 0xe8, 0x8b, 0xea, 0xe8, + 0x6d, 0x18, 0xdb, 0x70, 0xc3, 0x28, 0xa6, 0xd7, 0xed, 0x28, 0x76, 0x76, 0x9a, 0xf7, 0x71, 0x4b, + 0x57, 0xe3, 0xb0, 0x6c, 0x50, 0xc2, 0x29, 0xca, 0x68, 0x13, 0x46, 0xe9, 0xc5, 0x31, 0x69, 0x6a, + 0xf0, 0xd0, 0x4d, 0x29, 0x35, 0xdc, 0x35, 0x9d, 0x10, 0x36, 0xe9, 0x52, 0x66, 0x52, 0x67, 0x17, + 0xcd, 0x21, 0x26, 0x51, 0x28, 0x66, 0xc2, 0x6f, 0x98, 0x1c, 0x46, 0x79, 0x12, 0x33, 0x15, 0x29, + 0x99, 0x3c, 0x29, 0x31, 0x08, 0xb1, 0xbf, 0x4a, 0x4f, 0x47, 0x3a, 0x86, 0xc7, 0x70, 0xb4, 0xbc, + 0x62, 0x1e, 0x2d, 0xa7, 0x73, 0xe7, 0x33, 0xe7, 0x58, 0xf9, 0x2c, 0x0c, 0x6b, 0xd3, 0x8d, 0xe6, + 0xa0, 0x54, 0x97, 0x76, 0x0d, 0x82, 0xeb, 0x2a, 0xf1, 0x45, 0x19, 0x3c, 0xe0, 0x04, 0x87, 0x8e, + 0x06, 0x15, 0xf6, 0xd2, 0x56, 0x53, 0x54, 0x14, 0xc4, 0x0c, 0x62, 0x3f, 0x07, 0xb0, 0x74, 0x97, + 0xd4, 0xe7, 0xf9, 0xc5, 0x4b, 0x7b, 0x3e, 0xb3, 0xf2, 0x9f, 0xcf, 0xec, 0xff, 0x68, 0xc1, 0xd8, + 0xf2, 0xa2, 0x21, 0x90, 0xcf, 0x02, 0x70, 0x29, 0xf4, 0xf6, 0xed, 0xeb, 0x52, 0x33, 0xcc, 0x95, + 0x7b, 0xaa, 0x14, 0x6b, 0x18, 0xe8, 0x34, 0x14, 0xbd, 0x96, 0x2f, 0x84, 0xc3, 0xc1, 0x7b, 0xfb, + 0x33, 0xc5, 0x6b, 0x2d, 0x1f, 0xd3, 0x32, 0xcd, 0x50, 0xa9, 0xd8, 0xb3, 0xa1, 0x52, 0x57, 0x7b, + 0x74, 0x34, 0x03, 0xfd, 0x77, 0xee, 0xb8, 0x8d, 0xa8, 0xdc, 0x9f, 0x68, 0xad, 0x6f, 0xdf, 0x5e, + 0xa9, 0x44, 0x98, 0x97, 0xdb, 0x7f, 0xa9, 0x08, 0x13, 0xcb, 0x1e, 0xb9, 0x7b, 0x5f, 0xf6, 0x8e, + 0xbd, 0x1a, 0x57, 0xdd, 0x6c, 0x3f, 0x8f, 0x8f, 0xda, 0x9c, 0xac, 0xfb, 0x50, 0xbc, 0x09, 0x83, + 0xfc, 0x15, 0x96, 0x0f, 0xc6, 0xf0, 0xc5, 0x67, 0xb3, 0xba, 0x90, 0x1e, 0x8b, 0x59, 0xa1, 0xf8, + 0xe0, 0x26, 0x29, 0x8a, 0x89, 0x89, 0x52, 0x2c, 0x49, 0x4e, 0x7f, 0x12, 0x46, 0x74, 0xcc, 0x43, + 0xd9, 0xa6, 0xfc, 0x65, 0x0b, 0x4e, 0x2c, 0x7b, 0x41, 0x7d, 0x3b, 0x65, 0xe9, 0xf6, 0x02, 0x0c, + 0xd3, 0xfd, 0x14, 0x19, 0x36, 0xbe, 0x86, 0xd5, 0xb7, 0x00, 0x61, 0x1d, 0x4f, 0xab, 0x76, 0xf3, + 0xe6, 0x4a, 0x25, 0xcb, 0x58, 0x5c, 0x80, 0xb0, 0x8e, 0x67, 0x7f, 0xc7, 0x82, 0x33, 0x97, 0x17, + 0x97, 0x12, 0x63, 0xcf, 0x36, 0x7b, 0x75, 0x2a, 0xdc, 0x35, 0xb4, 0xae, 0x24, 0xc2, 0x5d, 0x85, + 0xf5, 0x42, 0x40, 0x3f, 0x2c, 0xbe, 0x18, 0xbf, 0x6e, 0xc1, 0x89, 0xcb, 0x6e, 0x8c, 0x49, 0x33, + 0x48, 0x5b, 0x4e, 0x87, 0xa4, 0x19, 0x44, 0x6e, 0x1c, 0x84, 0x7b, 0x69, 0xcb, 0x69, 0xac, 0x20, + 0x58, 0xc3, 0xe2, 0x2d, 0xef, 0xba, 0x11, 0xed, 0x69, 0xc1, 0xbc, 0x61, 0x62, 0x51, 0x8e, 0x15, + 0x06, 0xfd, 0xb0, 0x86, 0x1b, 0x32, 0x09, 0x61, 0x4f, 0x6c, 0x67, 0xf5, 0x61, 0x15, 0x09, 0xc0, + 0x09, 0x8e, 0xfd, 0xcb, 0x16, 0x9c, 0xbc, 0xec, 0xb5, 0xa2, 0x98, 0x84, 0x1b, 0x91, 0xd1, 0xd9, + 0xe7, 0xa0, 0x44, 0xa4, 0x14, 0x2e, 0xfa, 0xaa, 0xce, 0x0d, 0x25, 0x9e, 0x73, 0xb3, 0x6d, 0x85, + 0xd7, 0x83, 0xd9, 0xe8, 0xe1, 0xcc, 0x1d, 0xbf, 0x5e, 0x80, 0xd1, 0x2b, 0x6b, 0x6b, 0xd5, 0xcb, + 0x24, 0x16, 0x2c, 0xb3, 0xbb, 0x06, 0x09, 0x6b, 0x17, 0xe1, 0x4e, 0xb2, 0x4e, 0x2b, 0x76, 0xbd, + 0x59, 0xee, 0x27, 0x34, 0xbb, 0xe2, 0xc7, 0x37, 0xc2, 0x5a, 0x1c, 0xba, 0xfe, 0x66, 0xe6, 0xd5, + 0x59, 0x32, 0xf6, 0x62, 0x1e, 0x63, 0x47, 0xcf, 0xc1, 0x00, 0x73, 0x54, 0x92, 0x52, 0xc7, 0xc3, + 0x4a, 0x54, 0x60, 0xa5, 0x07, 0xfb, 0x33, 0xa5, 0x9b, 0x78, 0x85, 0xff, 0xc1, 0x02, 0x15, 0xdd, + 0x84, 0xe1, 0xad, 0x38, 0x6e, 0x5e, 0x21, 0x4e, 0x83, 0x84, 0x92, 0x3b, 0x9c, 0xcd, 0xe2, 0x0e, + 0x74, 0x10, 0x38, 0x5a, 0xb2, 0xa1, 0x92, 0xb2, 0x08, 0xeb, 0x74, 0xec, 0x1a, 0x40, 0x02, 0x3b, + 0xa2, 0x6b, 0x83, 0xfd, 0x03, 0x0b, 0x06, 0xb9, 0xcd, 0x78, 0x88, 0x5e, 0x86, 0x3e, 0x72, 0x97, + 0xd4, 0xc5, 0x09, 0x9e, 0xd9, 0xe1, 0xe4, 0x94, 0xe3, 0x4a, 0x30, 0xfa, 0x1f, 0xb3, 0x5a, 0xe8, + 0x0a, 0x0c, 0xd2, 0xde, 0x5e, 0x56, 0x06, 0xf4, 0x8f, 0xe6, 0x7d, 0xb1, 0x9a, 0x76, 0x7e, 0x30, + 0x8a, 0x22, 0x2c, 0xab, 0x33, 0x85, 0x4e, 0xbd, 0x59, 0xa3, 0x0c, 0x2c, 0xee, 0x74, 0xdd, 0x5a, + 0x5b, 0xac, 0x72, 0x24, 0x41, 0x8d, 0x2b, 0x74, 0x64, 0x21, 0x4e, 0x88, 0xd8, 0x6b, 0x50, 0xa2, + 0x93, 0x3a, 0xef, 0xb9, 0x4e, 0x67, 0x5d, 0xd2, 0x53, 0x50, 0x92, 0x7a, 0x9d, 0x48, 0x58, 0xb5, + 0x33, 0xaa, 0x52, 0xed, 0x13, 0xe1, 0x04, 0x6e, 0x6f, 0xc0, 0x14, 0x7b, 0x24, 0x75, 0xe2, 0x2d, + 0x63, 0x8f, 0x75, 0x5f, 0xcc, 0x4f, 0x0b, 0xf9, 0x8a, 0xcf, 0x4c, 0x59, 0x33, 0xc3, 0x1d, 0x91, + 0x14, 0x35, 0x59, 0xeb, 0x4f, 0xfa, 0x60, 0x72, 0xa5, 0xb6, 0x58, 0x33, 0x15, 0x8b, 0x97, 0x60, + 0x84, 0x4b, 0x02, 0x74, 0x41, 0x3b, 0x9e, 0x68, 0x4d, 0x3d, 0x1c, 0xac, 0x69, 0x30, 0x6c, 0x60, + 0xa2, 0x33, 0x50, 0x74, 0xdf, 0xf1, 0xd3, 0x96, 0x76, 0x2b, 0xaf, 0x5d, 0xc7, 0xb4, 0x9c, 0x82, + 0xa9, 0x50, 0xc1, 0x19, 0xa8, 0x02, 0x2b, 0xc1, 0xe2, 0x15, 0x18, 0x73, 0xa3, 0x7a, 0xe4, 0xae, + 0xf8, 0x94, 0xbb, 0x24, 0x0e, 0x28, 0x89, 0xc4, 0x4f, 0xbb, 0xaa, 0xa0, 0x38, 0x85, 0xad, 0x71, + 0xf3, 0xfe, 0x9e, 0x05, 0x93, 0xae, 0xc6, 0xdd, 0x54, 0xe6, 0x6a, 0xb2, 0xaf, 0x8b, 0x98, 0xd5, + 0x8f, 0x90, 0xb9, 0xf8, 0x07, 0x47, 0x58, 0xc2, 0xd0, 0x65, 0x98, 0xac, 0x6f, 0x39, 0xcd, 0xf9, + 0x56, 0xbc, 0x55, 0x71, 0xa3, 0x7a, 0xb0, 0x4b, 0xc2, 0x3d, 0x26, 0x09, 0x0f, 0x25, 0x4a, 0x26, + 0x05, 0x58, 0xbc, 0x32, 0x5f, 0xa5, 0x98, 0xb8, 0xbd, 0x8e, 0x29, 0x82, 0xc0, 0x91, 0x89, 0x20, + 0xf3, 0x30, 0x2e, 0xdb, 0xaa, 0x91, 0x88, 0x1d, 0x0f, 0xc3, 0xac, 0x77, 0xca, 0x3f, 0x4c, 0x14, + 0xab, 0xbe, 0xa5, 0xf1, 0xd1, 0x8b, 0x30, 0xea, 0xfa, 0x6e, 0xec, 0x3a, 0x71, 0x10, 0xb2, 0xc3, + 0x75, 0x84, 0x1f, 0x18, 0x94, 0xc3, 0xaf, 0xe8, 0x00, 0x6c, 0xe2, 0xd9, 0x6f, 0x43, 0x49, 0x99, + 0xb2, 0x49, 0x6b, 0x4c, 0x2b, 0xc7, 0x1a, 0xb3, 0xfb, 0x89, 0x20, 0x35, 0xe6, 0xc5, 0x4c, 0x8d, + 0xf9, 0xdf, 0xb1, 0x20, 0xb1, 0xe8, 0x41, 0x57, 0xa0, 0xd4, 0x0c, 0xd8, 0xab, 0x59, 0x28, 0x9f, + 0xa2, 0x1f, 0xce, 0x64, 0x1e, 0x9c, 0x51, 0xf1, 0xf1, 0xab, 0xca, 0x1a, 0x38, 0xa9, 0x8c, 0x16, + 0x60, 0xb0, 0x19, 0x92, 0x5a, 0xcc, 0x7c, 0x52, 0xba, 0xd2, 0xe1, 0x6b, 0x84, 0xe3, 0x63, 0x59, + 0xd1, 0xfe, 0x4d, 0x0b, 0x80, 0x2b, 0xa5, 0x1d, 0x7f, 0x93, 0x1c, 0xc3, 0x45, 0xbb, 0x02, 0x7d, + 0x51, 0x93, 0xd4, 0x3b, 0xbd, 0x67, 0x26, 0xfd, 0xa9, 0x35, 0x49, 0x3d, 0x19, 0x70, 0xfa, 0x0f, + 0xb3, 0xda, 0xf6, 0xcf, 0x03, 0x8c, 0x25, 0x68, 0xf4, 0x02, 0x84, 0x9e, 0x31, 0x2c, 0xfe, 0x4f, + 0xa7, 0x2c, 0xfe, 0x4b, 0x0c, 0x5b, 0x33, 0xf2, 0x7f, 0x1b, 0x8a, 0x3b, 0xce, 0x5d, 0x71, 0xcb, + 0x7a, 0xaa, 0x73, 0x37, 0x28, 0xfd, 0xd9, 0x55, 0xe7, 0x2e, 0x97, 0x63, 0x9f, 0x92, 0x0b, 0x64, + 0xd5, 0xb9, 0x7b, 0xc0, 0x5f, 0x2d, 0x19, 0x93, 0xa2, 0x97, 0xb9, 0xf7, 0xfe, 0x73, 0xf2, 0x9f, + 0x2d, 0x3b, 0xda, 0x08, 0x6b, 0xcb, 0xf5, 0x85, 0x8a, 0xb6, 0xa7, 0xb6, 0x5c, 0x3f, 0xdd, 0x96, + 0xeb, 0xf7, 0xd0, 0x96, 0xeb, 0xa3, 0x77, 0x61, 0x50, 0x3c, 0x87, 0x30, 0x53, 0xc5, 0xe1, 0x8b, + 0x73, 0x3d, 0xb4, 0x27, 0x5e, 0x53, 0x78, 0x9b, 0x73, 0x52, 0x4e, 0x17, 0xa5, 0x5d, 0xdb, 0x95, + 0x0d, 0xa2, 0xbf, 0x65, 0xc1, 0x98, 0xf8, 0x8d, 0xc9, 0x3b, 0x2d, 0x12, 0xc5, 0x42, 0x1e, 0xf8, + 0x44, 0xef, 0x7d, 0x10, 0x15, 0x79, 0x57, 0x3e, 0x21, 0xd9, 0xac, 0x09, 0xec, 0xda, 0xa3, 0x54, + 0x2f, 0xd0, 0x3f, 0xb1, 0x60, 0x6a, 0xc7, 0xb9, 0xcb, 0x5b, 0xe4, 0x65, 0xd8, 0x89, 0xdd, 0x40, + 0x98, 0x5e, 0xbe, 0xdc, 0xdb, 0xf4, 0xb7, 0x55, 0xe7, 0x9d, 0x94, 0x56, 0x5a, 0x53, 0x59, 0x28, + 0x5d, 0xbb, 0x9a, 0xd9, 0xaf, 0xe9, 0x0d, 0x18, 0x92, 0xeb, 0x2d, 0xe3, 0x36, 0x54, 0xd1, 0x85, + 0x9d, 0x43, 0xbf, 0x46, 0x69, 0xb7, 0x27, 0xd6, 0x8e, 0x58, 0x6b, 0x0f, 0xb4, 0x9d, 0xb7, 0x61, + 0x44, 0x5f, 0x63, 0x0f, 0xb4, 0xad, 0x77, 0xe0, 0x44, 0xc6, 0x5a, 0x7a, 0xa0, 0x4d, 0xde, 0x81, + 0xd3, 0xb9, 0xeb, 0xe3, 0x41, 0x36, 0x6c, 0x7f, 0xdd, 0xd2, 0xf9, 0xe0, 0x31, 0xa8, 0xa7, 0x16, + 0x4d, 0xf5, 0xd4, 0xd9, 0xce, 0x3b, 0x27, 0x47, 0x47, 0xf5, 0xa6, 0xde, 0x69, 0xca, 0xd5, 0xd1, + 0xab, 0x30, 0xe0, 0xd1, 0x12, 0xf9, 0x0e, 0x67, 0x77, 0xdf, 0x91, 0x89, 0x2c, 0xc5, 0xca, 0x23, + 0x2c, 0x28, 0xd8, 0xbf, 0x6d, 0x41, 0xdf, 0x31, 0x8c, 0x04, 0x36, 0x47, 0xe2, 0x99, 0x5c, 0xd2, + 0x22, 0x08, 0xc4, 0x2c, 0x76, 0xee, 0x2c, 0xc9, 0x40, 0x17, 0x39, 0x03, 0xf3, 0x7f, 0x0b, 0x30, + 0x4c, 0x9b, 0x92, 0x06, 0x23, 0x2f, 0xc1, 0xa8, 0xe7, 0xac, 0x13, 0x4f, 0xaa, 0xcc, 0xd3, 0x97, + 0xd8, 0x6b, 0x3a, 0x10, 0x9b, 0xb8, 0xb4, 0xf2, 0x86, 0xfe, 0x7a, 0x20, 0xe4, 0x17, 0x55, 0xd9, + 0x78, 0x5a, 0xc0, 0x26, 0x2e, 0xbd, 0x4f, 0xdd, 0x71, 0xe2, 0xfa, 0x96, 0xb8, 0xe0, 0xaa, 0xee, + 0xde, 0xa6, 0x85, 0x98, 0xc3, 0xa8, 0x00, 0x27, 0x57, 0xe7, 0x2d, 0x12, 0x32, 0x01, 0x8e, 0x8b, + 0xc7, 0x4a, 0x80, 0xc3, 0x26, 0x18, 0xa7, 0xf1, 0x33, 0x5c, 0xff, 0xfa, 0x99, 0x39, 0x4c, 0x0f, + 0xae, 0x7f, 0xa8, 0x0a, 0x53, 0xae, 0x5f, 0xf7, 0x5a, 0x0d, 0x72, 0xd3, 0xe7, 0xd2, 0x9d, 0xe7, + 0xbe, 0x4b, 0x1a, 0x42, 0x80, 0x56, 0x96, 0x4b, 0x2b, 0x19, 0x38, 0x38, 0xb3, 0xa6, 0xfd, 0x17, + 0xe0, 0xc4, 0xb5, 0xc0, 0x69, 0x2c, 0x38, 0x9e, 0xe3, 0xd7, 0x49, 0xb8, 0xe2, 0x6f, 0x76, 0x7d, + 0x90, 0xd7, 0x9f, 0xcf, 0x0b, 0xdd, 0x9e, 0xcf, 0xed, 0x2d, 0x40, 0x7a, 0x03, 0xc2, 0x0c, 0x0c, + 0xc3, 0xa0, 0xcb, 0x9b, 0x12, 0xcb, 0xff, 0xf1, 0x6c, 0xe9, 0xba, 0xad, 0x67, 0x9a, 0x81, 0x13, + 0x2f, 0xc0, 0x92, 0x90, 0x7d, 0x09, 0x32, 0x5d, 0x3f, 0xba, 0x5f, 0xa5, 0xed, 0x17, 0x60, 0x92, + 0xd5, 0x3c, 0xdc, 0x35, 0xcf, 0xfe, 0x6b, 0x16, 0x8c, 0x5f, 0x4f, 0x39, 0xeb, 0x9e, 0x87, 0x01, + 0x1e, 0xee, 0x25, 0xad, 0xf4, 0xaa, 0xb1, 0x52, 0x2c, 0xa0, 0x47, 0xae, 0x73, 0xf9, 0xa1, 0x05, + 0x25, 0x15, 0x07, 0xe0, 0x18, 0x84, 0xda, 0x45, 0x43, 0xa8, 0xcd, 0xd4, 0x05, 0xa8, 0xee, 0xe4, + 0xc9, 0xb4, 0xe8, 0xaa, 0x72, 0x3b, 0xed, 0xa0, 0x06, 0x48, 0xc8, 0x70, 0x27, 0xc5, 0x31, 0xd3, + 0x37, 0x55, 0x3a, 0xa2, 0xb2, 0x17, 0x71, 0x85, 0xfb, 0x21, 0x79, 0x11, 0x57, 0xfd, 0xc9, 0xe1, + 0x7e, 0x55, 0xad, 0xcb, 0xec, 0x54, 0xf8, 0x69, 0x66, 0x35, 0xca, 0xf6, 0xa6, 0xf2, 0xf6, 0x9e, + 0x11, 0x56, 0xa0, 0xa2, 0xf4, 0x80, 0x31, 0x32, 0xf1, 0x8f, 0xc7, 0x6c, 0x48, 0xaa, 0xd8, 0x57, + 0x60, 0x3c, 0x35, 0x60, 0xe8, 0x05, 0xe8, 0x6f, 0x6e, 0x39, 0x11, 0x49, 0x59, 0x01, 0xf5, 0x57, + 0x69, 0xe1, 0xc1, 0xfe, 0xcc, 0x98, 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6, 0xff, 0xa7, 0x05, 0x7d, + 0xd7, 0x83, 0xc6, 0x71, 0x2c, 0xa6, 0x57, 0x8c, 0xc5, 0xf4, 0x48, 0x5e, 0xc4, 0x9b, 0xdc, 0x75, + 0xb4, 0x9c, 0x5a, 0x47, 0x67, 0x73, 0x29, 0x74, 0x5e, 0x42, 0x3b, 0x30, 0xcc, 0xe2, 0xe8, 0x08, + 0xab, 0xa4, 0xe7, 0x8c, 0xfb, 0xd5, 0x4c, 0xea, 0x7e, 0x35, 0xae, 0xa1, 0x6a, 0xb7, 0xac, 0x27, + 0x60, 0x50, 0x58, 0xc6, 0xa4, 0xed, 0x63, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0x57, 0x8a, 0x60, 0xc4, + 0xed, 0x41, 0xbf, 0x63, 0xc1, 0x6c, 0xc8, 0x1d, 0x8e, 0x1a, 0x95, 0x56, 0xe8, 0xfa, 0x9b, 0xb5, + 0xfa, 0x16, 0x69, 0xb4, 0x3c, 0xd7, 0xdf, 0x5c, 0xd9, 0xf4, 0x03, 0x55, 0xbc, 0x74, 0x97, 0xd4, + 0x5b, 0x4c, 0x0f, 0xde, 0x25, 0x48, 0x90, 0x7a, 0x79, 0xbe, 0x78, 0x6f, 0x7f, 0x66, 0x16, 0x1f, + 0x8a, 0x36, 0x3e, 0x64, 0x5f, 0xd0, 0x77, 0x2c, 0x98, 0xe3, 0xe1, 0x6c, 0x7a, 0xef, 0x7f, 0x87, + 0xdb, 0x68, 0x55, 0x92, 0x4a, 0x88, 0xac, 0x91, 0x70, 0x67, 0xe1, 0x45, 0x31, 0xa0, 0x73, 0xd5, + 0xc3, 0xb5, 0x85, 0x0f, 0xdb, 0x39, 0xfb, 0x5f, 0x17, 0x61, 0x94, 0x8e, 0x62, 0xe2, 0x64, 0xff, + 0x82, 0xb1, 0x24, 0x1e, 0x4d, 0x2d, 0x89, 0x49, 0x03, 0xf9, 0x68, 0xfc, 0xeb, 0x23, 0x98, 0xf4, + 0x9c, 0x28, 0xbe, 0x42, 0x9c, 0x30, 0x5e, 0x27, 0x0e, 0x7b, 0xea, 0x15, 0xcb, 0xfc, 0x30, 0xaf, + 0xc7, 0x4a, 0xfd, 0x75, 0x2d, 0x4d, 0x0c, 0xb7, 0xd3, 0x47, 0xbb, 0x80, 0xd8, 0xb3, 0x72, 0xe8, + 0xf8, 0x11, 0xff, 0x16, 0x57, 0xe8, 0xc8, 0x0f, 0xd7, 0xea, 0xb4, 0x68, 0x15, 0x5d, 0x6b, 0xa3, + 0x86, 0x33, 0x5a, 0xd0, 0xcc, 0x05, 0xfa, 0x7b, 0x35, 0x17, 0x18, 0xe8, 0x62, 0x84, 0xbe, 0x03, + 0x13, 0x62, 0x56, 0x36, 0xdc, 0x4d, 0x71, 0x48, 0xbf, 0x9e, 0x32, 0x27, 0xb2, 0x7a, 0x37, 0x7c, + 0xe8, 0x62, 0x4b, 0x64, 0xff, 0x1c, 0x9c, 0xa0, 0xcd, 0x99, 0x26, 0xd3, 0x11, 0x22, 0x30, 0xbe, + 0xdd, 0x5a, 0x27, 0x1e, 0x89, 0x65, 0x99, 0x68, 0x34, 0x53, 0xec, 0x37, 0x6b, 0x27, 0xb2, 0xe5, + 0x55, 0x93, 0x04, 0x4e, 0xd3, 0xb4, 0x7f, 0xcd, 0x02, 0x66, 0x98, 0x78, 0x0c, 0xc7, 0xdf, 0xa7, + 0xcc, 0xe3, 0xaf, 0x9c, 0xc7, 0x81, 0x72, 0x4e, 0xbe, 0xe7, 0xf9, 0xb4, 0x54, 0xc3, 0xe0, 0xee, + 0x9e, 0x94, 0xfd, 0xbb, 0x4b, 0x5c, 0xff, 0xc7, 0xe2, 0x1b, 0x52, 0xf9, 0x5f, 0xa2, 0xcf, 0xc1, + 0x50, 0xdd, 0x69, 0x3a, 0x75, 0x1e, 0x30, 0x2d, 0x57, 0xfb, 0x63, 0x54, 0x9a, 0x5d, 0x14, 0x35, + 0xb8, 0x36, 0xe3, 0xe3, 0xf2, 0x2b, 0x65, 0x71, 0x57, 0x0d, 0x86, 0x6a, 0x72, 0x7a, 0x1b, 0x46, + 0x0d, 0x62, 0x0f, 0xf4, 0xea, 0xfb, 0x39, 0x7e, 0x5c, 0xa8, 0x1b, 0xcb, 0x0e, 0x4c, 0xfa, 0xda, + 0x7f, 0xca, 0x1c, 0xa5, 0x38, 0xfd, 0xd1, 0x6e, 0x07, 0x02, 0xe3, 0xa4, 0x9a, 0xe1, 0x65, 0x8a, + 0x0c, 0x6e, 0xa7, 0x6c, 0xff, 0x3d, 0x0b, 0x1e, 0xd2, 0x11, 0x35, 0xd7, 0xd8, 0x6e, 0xfa, 0xe4, + 0x0a, 0x0c, 0x05, 0x4d, 0x12, 0x3a, 0xc9, 0x9d, 0xec, 0x82, 0x1c, 0xf4, 0x1b, 0xa2, 0xfc, 0x60, + 0x7f, 0x66, 0x4a, 0xa7, 0x2e, 0xcb, 0xb1, 0xaa, 0x89, 0x6c, 0x18, 0x60, 0x83, 0x11, 0x09, 0xb7, + 0x65, 0x16, 0x54, 0x8c, 0x3d, 0x77, 0x45, 0x58, 0x40, 0xec, 0x9f, 0xb7, 0xf8, 0xc2, 0xd2, 0xbb, + 0x8e, 0xde, 0x81, 0x89, 0x1d, 0x7a, 0x7d, 0x5b, 0xba, 0xdb, 0x0c, 0xb9, 0x1a, 0x5d, 0x8e, 0xd3, + 0x53, 0xdd, 0xc6, 0x49, 0xfb, 0xc8, 0x85, 0xb2, 0xe8, 0xf3, 0xc4, 0x6a, 0x8a, 0x18, 0x6e, 0x23, + 0x6f, 0xff, 0x59, 0x81, 0xef, 0x44, 0x26, 0xd5, 0x3d, 0x01, 0x83, 0xcd, 0xa0, 0xb1, 0xb8, 0x52, + 0xc1, 0x62, 0x84, 0x14, 0xbb, 0xaa, 0xf2, 0x62, 0x2c, 0xe1, 0xe8, 0x22, 0x00, 0xb9, 0x1b, 0x93, + 0xd0, 0x77, 0x3c, 0xf5, 0x18, 0xaf, 0x84, 0xa7, 0x25, 0x05, 0xc1, 0x1a, 0x16, 0xad, 0xd3, 0x0c, + 0x83, 0x5d, 0xb7, 0xc1, 0x1c, 0x3b, 0x8a, 0x66, 0x9d, 0xaa, 0x82, 0x60, 0x0d, 0x8b, 0x5e, 0x95, + 0x5b, 0x7e, 0xc4, 0x0f, 0x40, 0x67, 0x5d, 0x44, 0xfa, 0x19, 0x4a, 0xae, 0xca, 0x37, 0x75, 0x20, + 0x36, 0x71, 0xd1, 0x3c, 0x0c, 0xc4, 0x0e, 0x7b, 0x62, 0xee, 0xcf, 0x37, 0xd9, 0x59, 0xa3, 0x18, + 0x7a, 0x04, 0x2d, 0x5a, 0x01, 0x8b, 0x8a, 0xe8, 0x0d, 0xc9, 0x82, 0x39, 0x4b, 0x16, 0xa6, 0x57, + 0xb9, 0xcb, 0x56, 0x67, 0xdf, 0x3a, 0x0f, 0x16, 0x26, 0x5d, 0x06, 0x2d, 0xfb, 0xf3, 0x25, 0x80, + 0x44, 0xda, 0x43, 0xef, 0xb6, 0xb1, 0x88, 0xa7, 0x3b, 0xcb, 0x87, 0x47, 0xc7, 0x1f, 0xd0, 0x17, + 0x2c, 0x18, 0x76, 0x3c, 0x2f, 0xa8, 0x3b, 0x31, 0x1b, 0xe5, 0x42, 0x67, 0x16, 0x25, 0xda, 0x9f, + 0x4f, 0x6a, 0xf0, 0x2e, 0x3c, 0x27, 0x5f, 0x8f, 0x35, 0x48, 0xd7, 0x5e, 0xe8, 0x0d, 0xa3, 0x8f, + 0xcb, 0x4b, 0x00, 0x5f, 0x1e, 0xd3, 0xe9, 0x4b, 0x40, 0x89, 0x71, 0x63, 0x4d, 0xfe, 0x47, 0x37, + 0x8d, 0x90, 0x38, 0x7d, 0xf9, 0xde, 0xbf, 0x86, 0xd0, 0xd3, 0x2d, 0x1a, 0x0e, 0xaa, 0xea, 0x26, + 0xe8, 0xfd, 0xf9, 0x2e, 0xf2, 0x9a, 0x74, 0xdd, 0xc5, 0xfc, 0xfc, 0x6d, 0x18, 0x6f, 0x98, 0xc7, + 0xad, 0x58, 0x4d, 0x8f, 0xe7, 0xd1, 0x4d, 0x9d, 0xce, 0xc9, 0x01, 0x9b, 0x02, 0xe0, 0x34, 0x61, + 0x54, 0xe5, 0xce, 0x00, 0x2b, 0xfe, 0x46, 0x20, 0x4c, 0xf8, 0xec, 0xdc, 0xb9, 0xdc, 0x8b, 0x62, + 0xb2, 0x43, 0x31, 0x93, 0x73, 0xf4, 0xba, 0xa8, 0x8b, 0x15, 0x15, 0xf4, 0x2a, 0x0c, 0x30, 0x0f, + 0xad, 0xa8, 0x3c, 0x94, 0xaf, 0x07, 0x34, 0x9d, 0x8b, 0x93, 0x4d, 0xc5, 0xfe, 0x46, 0x58, 0x50, + 0x40, 0x57, 0x64, 0x04, 0x82, 0x68, 0xc5, 0xbf, 0x19, 0x11, 0x16, 0x81, 0xa0, 0xb4, 0xf0, 0xd1, + 0x24, 0xb8, 0x00, 0x2f, 0xcf, 0x8c, 0x95, 0x69, 0xd4, 0xa4, 0xf2, 0x8a, 0xf8, 0x2f, 0x43, 0x70, + 0x96, 0x21, 0xbf, 0x7b, 0x66, 0x98, 0xce, 0x64, 0x38, 0x6f, 0x99, 0x24, 0x70, 0x9a, 0xe6, 0xb1, + 0x1e, 0x9f, 0xd3, 0x3e, 0x4c, 0xa4, 0x37, 0xd6, 0x03, 0x3d, 0xae, 0x7f, 0xd0, 0x07, 0x63, 0xe6, + 0x42, 0x40, 0x73, 0x50, 0x12, 0x44, 0x54, 0x34, 0x32, 0xb5, 0xb6, 0x57, 0x25, 0x00, 0x27, 0x38, + 0x2c, 0x1a, 0x1b, 0xab, 0xae, 0xd9, 0x66, 0x25, 0xd1, 0xd8, 0x14, 0x04, 0x6b, 0x58, 0x54, 0x88, + 0x5e, 0x0f, 0x82, 0x58, 0x1d, 0x05, 0x6a, 0xb5, 0x2c, 0xb0, 0x52, 0x2c, 0xa0, 0xf4, 0x08, 0xd8, + 0x26, 0xa1, 0x4f, 0x3c, 0x53, 0x93, 0xa9, 0x8e, 0x80, 0xab, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, 0x48, + 0x0b, 0x22, 0xb6, 0xfc, 0x84, 0xa8, 0x9e, 0xd8, 0xba, 0xd5, 0xb8, 0x87, 0xa2, 0x84, 0xa3, 0xd7, + 0xe1, 0x21, 0xe5, 0x50, 0x88, 0xb9, 0x66, 0x58, 0xb6, 0x38, 0x60, 0xdc, 0xac, 0x1f, 0x5a, 0xcc, + 0x46, 0xc3, 0x79, 0xf5, 0xd1, 0x2b, 0x30, 0x26, 0x44, 0x60, 0x49, 0x71, 0xd0, 0x34, 0x56, 0xb8, + 0x6a, 0x40, 0x71, 0x0a, 0x1b, 0x55, 0x60, 0x82, 0x96, 0x30, 0x29, 0x54, 0x52, 0xe0, 0x8e, 0x91, + 0xea, 0xac, 0xbf, 0x9a, 0x82, 0xe3, 0xb6, 0x1a, 0x68, 0x1e, 0xc6, 0xb9, 0x8c, 0x42, 0xef, 0x94, + 0x6c, 0x1e, 0x84, 0x65, 0xad, 0xda, 0x08, 0x37, 0x4c, 0x30, 0x4e, 0xe3, 0xa3, 0x4b, 0x30, 0xe2, + 0x84, 0xf5, 0x2d, 0x37, 0x26, 0xf5, 0xb8, 0x15, 0xf2, 0xf8, 0x1e, 0x9a, 0xb5, 0xc7, 0xbc, 0x06, + 0xc3, 0x06, 0xa6, 0xfd, 0x2e, 0x9c, 0xc8, 0x30, 0xca, 0xa7, 0x0b, 0xc7, 0x69, 0xba, 0xf2, 0x9b, + 0x52, 0x56, 0x6b, 0xf3, 0xd5, 0x15, 0xf9, 0x35, 0x1a, 0x16, 0x5d, 0x9d, 0x4c, 0x25, 0xae, 0xc5, + 0xc9, 0x55, 0xab, 0x73, 0x59, 0x02, 0x70, 0x82, 0x63, 0xff, 0x3e, 0x80, 0xa6, 0xd0, 0xe9, 0xc1, + 0x66, 0xe9, 0x12, 0x8c, 0xc8, 0xe0, 0xce, 0x5a, 0x50, 0x51, 0xf5, 0x99, 0x97, 0x35, 0x18, 0x36, + 0x30, 0x69, 0xdf, 0x7c, 0x15, 0x12, 0x35, 0x65, 0x23, 0x97, 0x04, 0x44, 0x4d, 0x70, 0xd0, 0xd3, + 0x30, 0x14, 0x11, 0x6f, 0xe3, 0x9a, 0xeb, 0x6f, 0x8b, 0x85, 0xad, 0xb8, 0x70, 0x4d, 0x94, 0x63, + 0x85, 0x81, 0x16, 0xa0, 0xd8, 0x72, 0x1b, 0x62, 0x29, 0xcb, 0x03, 0xbf, 0x78, 0x73, 0xa5, 0x72, + 0xb0, 0x3f, 0xf3, 0x68, 0x5e, 0xcc, 0x6a, 0x7a, 0xb5, 0x8f, 0x66, 0xe9, 0xf6, 0xa3, 0x95, 0xb3, + 0xde, 0x06, 0x06, 0x0e, 0xf9, 0x36, 0x70, 0x11, 0x40, 0x7c, 0xb5, 0x5c, 0xcb, 0xc5, 0x64, 0xd6, + 0x2e, 0x2b, 0x08, 0xd6, 0xb0, 0x50, 0x04, 0x93, 0xf5, 0x90, 0x38, 0xf2, 0x0e, 0xcd, 0xcd, 0xcb, + 0x87, 0xee, 0x5f, 0x41, 0xb0, 0x98, 0x26, 0x86, 0xdb, 0xe9, 0xa3, 0x00, 0x26, 0x1b, 0xc2, 0x7f, + 0x35, 0x69, 0xb4, 0x74, 0x78, 0x9b, 0x76, 0x66, 0x90, 0x93, 0x26, 0x84, 0xdb, 0x69, 0xa3, 0xb7, + 0x60, 0x5a, 0x16, 0xb6, 0xbb, 0x0c, 0xb3, 0xed, 0x52, 0x5c, 0x38, 0x7b, 0x6f, 0x7f, 0x66, 0xba, + 0x92, 0x8b, 0x85, 0x3b, 0x50, 0x40, 0x18, 0x06, 0xd8, 0x5b, 0x52, 0x54, 0x1e, 0x66, 0xe7, 0xdc, + 0x93, 0xf9, 0xca, 0x00, 0xba, 0xd6, 0x67, 0xd9, 0x3b, 0x94, 0x30, 0xf3, 0x4d, 0x9e, 0xe5, 0x58, + 0x21, 0x16, 0x94, 0xd0, 0x06, 0x0c, 0x3b, 0xbe, 0x1f, 0xc4, 0x0e, 0x17, 0xa1, 0x46, 0xf2, 0x65, + 0x3f, 0x8d, 0xf0, 0x7c, 0x52, 0x83, 0x53, 0x57, 0x96, 0x83, 0x1a, 0x04, 0xeb, 0x84, 0xd1, 0x1d, + 0x18, 0x0f, 0xee, 0x50, 0xe6, 0x28, 0xb5, 0x14, 0x51, 0x79, 0x94, 0xb5, 0xf5, 0x7c, 0x8f, 0x7a, + 0x5a, 0xa3, 0xb2, 0xc6, 0xb5, 0x4c, 0xa2, 0x38, 0xdd, 0x0a, 0x9a, 0x35, 0xb4, 0xd5, 0x63, 0x89, + 0x3d, 0x7b, 0xa2, 0xad, 0xd6, 0x95, 0xd3, 0xcc, 0x05, 0x9d, 0x9b, 0xad, 0xb2, 0xdd, 0x3f, 0x9e, + 0x72, 0x41, 0x4f, 0x40, 0x58, 0xc7, 0x43, 0x5b, 0x30, 0x92, 0x3c, 0x59, 0x85, 0x11, 0x0b, 0x80, + 0x33, 0x7c, 0xf1, 0x62, 0x6f, 0x1f, 0xb7, 0xa2, 0xd5, 0xe4, 0x37, 0x07, 0xbd, 0x04, 0x1b, 0x94, + 0xa7, 0x7f, 0x0a, 0x86, 0xb5, 0x89, 0x3d, 0x8c, 0x55, 0xf6, 0xf4, 0x2b, 0x30, 0x91, 0x9e, 0xba, + 0x43, 0x59, 0x75, 0xff, 0xef, 0x02, 0x8c, 0x67, 0xbc, 0x5c, 0xb1, 0xb8, 0xd7, 0x29, 0x86, 0x9a, + 0x84, 0xb9, 0x36, 0xd9, 0x62, 0xa1, 0x07, 0xb6, 0x28, 0x79, 0x74, 0x31, 0x97, 0x47, 0x0b, 0x56, + 0xd8, 0xf7, 0x7e, 0x58, 0xa1, 0x79, 0xfa, 0xf4, 0xf7, 0x74, 0xfa, 0x1c, 0x01, 0xfb, 0x34, 0x0e, + 0xb0, 0xc1, 0x1e, 0x0e, 0xb0, 0x2f, 0x17, 0x60, 0x22, 0x1d, 0xae, 0xf8, 0x18, 0xde, 0x3b, 0x5e, + 0x35, 0xde, 0x3b, 0xb2, 0xa3, 0xc8, 0xa7, 0x83, 0x28, 0xe7, 0xbd, 0x7d, 0xe0, 0xd4, 0xdb, 0xc7, + 0x93, 0x3d, 0x51, 0xeb, 0xfc, 0x0e, 0xf2, 0xf7, 0x0b, 0x70, 0x32, 0x5d, 0x65, 0xd1, 0x73, 0xdc, + 0x9d, 0x63, 0x18, 0x9b, 0x1b, 0xc6, 0xd8, 0x3c, 0xd3, 0xcb, 0xd7, 0xb0, 0xae, 0xe5, 0x0e, 0xd0, + 0xed, 0xd4, 0x00, 0xcd, 0xf5, 0x4e, 0xb2, 0xf3, 0x28, 0x7d, 0xb7, 0x08, 0x67, 0x33, 0xeb, 0x25, + 0xcf, 0x05, 0xcb, 0xc6, 0x73, 0xc1, 0xc5, 0xd4, 0x73, 0x81, 0xdd, 0xb9, 0xf6, 0xd1, 0xbc, 0x1f, + 0x08, 0xcf, 0x33, 0x16, 0x9c, 0xed, 0x3e, 0xdf, 0x0e, 0x0c, 0xcf, 0x33, 0x45, 0x08, 0x9b, 0x74, + 0x7f, 0x9c, 0xde, 0x0c, 0x7e, 0xdf, 0x82, 0xd3, 0x99, 0x73, 0x73, 0x0c, 0x7a, 0xf5, 0xeb, 0xa6, + 0x5e, 0xfd, 0x89, 0x9e, 0x57, 0x6b, 0x8e, 0xa2, 0xfd, 0x4f, 0x8a, 0x39, 0xdf, 0xc2, 0x34, 0x93, + 0x37, 0x60, 0xd8, 0xa9, 0xd7, 0x49, 0x14, 0xad, 0x06, 0x0d, 0x15, 0xac, 0xec, 0x19, 0x26, 0x6d, + 0x24, 0xc5, 0x07, 0xfb, 0x33, 0xd3, 0x69, 0x12, 0x09, 0x18, 0xeb, 0x14, 0xcc, 0xf8, 0x8a, 0x85, + 0x23, 0x8d, 0xaf, 0x78, 0x11, 0x60, 0x57, 0xe9, 0x2b, 0xd2, 0x6a, 0x4e, 0x4d, 0x93, 0xa1, 0x61, + 0xa1, 0xcf, 0xb0, 0x5b, 0x00, 0x37, 0x06, 0xe2, 0x4b, 0xf1, 0xb9, 0x1e, 0xe7, 0x4a, 0x37, 0x2c, + 0xe2, 0x2e, 0xce, 0x4a, 0x25, 0xac, 0x48, 0xa2, 0x9f, 0x81, 0x89, 0x88, 0x47, 0xd0, 0x58, 0xf4, + 0x9c, 0x88, 0x39, 0xd6, 0x88, 0x55, 0xc8, 0xfc, 0x96, 0x6b, 0x29, 0x18, 0x6e, 0xc3, 0x46, 0xcb, + 0xf2, 0xa3, 0x58, 0xb8, 0x0f, 0xbe, 0x30, 0xcf, 0x27, 0x1f, 0x24, 0xb2, 0x6e, 0x4c, 0xa5, 0x87, + 0x9f, 0x0d, 0xbc, 0x56, 0xd3, 0xfe, 0x72, 0x1f, 0x3c, 0xdc, 0x81, 0x89, 0xa1, 0x79, 0xd3, 0x08, + 0xe0, 0xa9, 0xb4, 0xfe, 0x6f, 0x3a, 0xb3, 0xb2, 0xa1, 0x10, 0x4c, 0xad, 0x95, 0xc2, 0xfb, 0x5e, + 0x2b, 0x5f, 0xb4, 0x34, 0xcd, 0x2c, 0x37, 0x15, 0xfe, 0xd4, 0x21, 0x99, 0xf3, 0x11, 0xaa, 0x6a, + 0x37, 0x32, 0xf4, 0x9d, 0x17, 0x7b, 0xee, 0x4e, 0xcf, 0x0a, 0xd0, 0xe3, 0x7d, 0x32, 0x7a, 0xcf, + 0x82, 0x47, 0x33, 0xfb, 0x6b, 0x18, 0x2d, 0xcd, 0x41, 0xa9, 0x4e, 0x0b, 0x35, 0x67, 0xbd, 0xc4, + 0x65, 0x56, 0x02, 0x70, 0x82, 0x63, 0xd8, 0x26, 0x15, 0xba, 0xda, 0x26, 0xfd, 0x2b, 0x0b, 0xda, + 0x16, 0xf0, 0x31, 0x70, 0xd2, 0x15, 0x93, 0x93, 0x7e, 0xb4, 0x97, 0xb9, 0xcc, 0x61, 0xa2, 0xff, + 0x7e, 0x1c, 0x4e, 0xe5, 0xa4, 0xb5, 0xd8, 0x85, 0xc9, 0xcd, 0x3a, 0x31, 0xdd, 0x20, 0xc5, 0xc7, + 0x64, 0x7a, 0x8c, 0x76, 0xf4, 0x99, 0xe4, 0x17, 0xe2, 0x36, 0x14, 0xdc, 0xde, 0x04, 0x7a, 0xcf, + 0x82, 0x29, 0xe7, 0x4e, 0xd4, 0x96, 0x14, 0x4b, 0xac, 0x99, 0xe7, 0x33, 0xf5, 0xb4, 0x5d, 0x92, + 0x68, 0x31, 0x57, 0xa5, 0xa9, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0xc2, 0x22, 0xbe, 0x24, 0x95, 0xb7, + 0x3b, 0x38, 0xea, 0x66, 0xb9, 0x51, 0x71, 0x9e, 0x2a, 0x21, 0x58, 0xd1, 0x41, 0xb7, 0xa0, 0xb4, + 0x29, 0x7d, 0x1b, 0x05, 0xcf, 0xce, 0x3c, 0x04, 0x33, 0x1d, 0x20, 0xb9, 0xef, 0x88, 0x02, 0xe1, + 0x84, 0x14, 0x7a, 0x05, 0x8a, 0xfe, 0x46, 0xd4, 0x29, 0xaf, 0x47, 0xca, 0x96, 0x8f, 0x7b, 0x5c, + 0x5f, 0x5f, 0xae, 0x61, 0x5a, 0x11, 0x5d, 0x81, 0x62, 0xb8, 0xde, 0x10, 0x4f, 0x0b, 0x99, 0x72, + 0x29, 0x5e, 0xa8, 0x64, 0x2f, 0x12, 0x4e, 0x09, 0x2f, 0x54, 0x30, 0x25, 0x81, 0x96, 0xa1, 0x9f, + 0x39, 0x4d, 0x89, 0x17, 0x84, 0xcc, 0xd8, 0x11, 0x6d, 0x0e, 0x61, 0xdc, 0x19, 0x9b, 0x15, 0x63, + 0x5e, 0x1d, 0xbd, 0x0a, 0x03, 0x75, 0x96, 0xf0, 0x42, 0xa8, 0x7b, 0xb2, 0xe3, 0xa1, 0xb4, 0xa5, + 0xc4, 0xe0, 0xef, 0xa6, 0xbc, 0x1c, 0x0b, 0x0a, 0x68, 0x0d, 0x06, 0xea, 0xa4, 0xb9, 0xb5, 0x11, + 0x09, 0x2d, 0xce, 0xc7, 0x33, 0x69, 0x75, 0xc8, 0xef, 0x22, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, + 0x4f, 0x42, 0x61, 0xa3, 0x2e, 0xfc, 0xa7, 0x32, 0x5f, 0x0e, 0x4c, 0x07, 0xf9, 0x85, 0x81, 0x7b, + 0xfb, 0x33, 0x85, 0xe5, 0x45, 0x5c, 0xd8, 0xa8, 0xa3, 0xeb, 0x30, 0xb8, 0xc1, 0xbd, 0x9c, 0x45, + 0x60, 0xe2, 0xc7, 0xb3, 0x1d, 0xb0, 0xdb, 0x1c, 0xa1, 0xb9, 0xdf, 0x8f, 0x00, 0x60, 0x49, 0x04, + 0xad, 0x01, 0x6c, 0x28, 0x6f, 0x6d, 0x11, 0x99, 0xf8, 0xa3, 0xbd, 0xf8, 0x74, 0x0b, 0x95, 0x86, + 0x2a, 0xc5, 0x1a, 0x1d, 0xf4, 0x59, 0x28, 0x39, 0x32, 0xe1, 0x12, 0x8b, 0x4a, 0x6c, 0x4a, 0x18, + 0xc9, 0xd6, 0xeb, 0x9c, 0x8b, 0x8a, 0xaf, 0x5b, 0x85, 0x84, 0x13, 0xa2, 0x68, 0x1b, 0x46, 0x77, + 0xa3, 0xe6, 0x16, 0x91, 0x5b, 0x95, 0x85, 0x2a, 0xce, 0x39, 0x9a, 0x6e, 0x09, 0x44, 0x37, 0x8c, + 0x5b, 0x8e, 0xd7, 0xc6, 0x5d, 0x98, 0x93, 0xd8, 0x2d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0x41, 0x7f, + 0xa7, 0x15, 0xac, 0xef, 0xc5, 0x44, 0x04, 0x30, 0xce, 0x1c, 0xf4, 0xd7, 0x38, 0x4a, 0xfb, 0xa0, + 0x0b, 0x00, 0x96, 0x44, 0xe8, 0x66, 0x76, 0x64, 0x32, 0x33, 0xa1, 0xb7, 0x79, 0x22, 0x77, 0x78, + 0xda, 0xfa, 0x9b, 0x0c, 0x0a, 0xe3, 0x82, 0x09, 0x29, 0xc6, 0xfd, 0x9a, 0x5b, 0x41, 0x1c, 0xf8, + 0x29, 0xce, 0x3b, 0x99, 0xcf, 0xfd, 0xaa, 0x19, 0xf8, 0xed, 0xdc, 0x2f, 0x0b, 0x0b, 0x67, 0xb6, + 0x85, 0x1a, 0x30, 0xd6, 0x0c, 0xc2, 0xf8, 0x4e, 0x10, 0xca, 0x55, 0x85, 0x3a, 0x5c, 0xe8, 0x0d, + 0x4c, 0xd1, 0x22, 0xb3, 0xf9, 0x36, 0x21, 0x38, 0x45, 0x13, 0x7d, 0x1a, 0x06, 0xa3, 0xba, 0xe3, + 0x91, 0x95, 0x1b, 0xe5, 0x13, 0xf9, 0xc7, 0x4a, 0x8d, 0xa3, 0xe4, 0xac, 0x2e, 0x36, 0x39, 0x02, + 0x05, 0x4b, 0x72, 0x94, 0x0f, 0xb1, 0xa8, 0xf8, 0x2c, 0xf6, 0x72, 0x0e, 0x1f, 0x6a, 0xb3, 0x8b, + 0xe6, 0x7c, 0x88, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x01, 0x21, 0xd7, 0x06, 0x51, 0xf9, 0x64, 0xfe, + 0x1e, 0x10, 0xe2, 0xf0, 0x8d, 0x5a, 0xa7, 0x3d, 0xa0, 0x90, 0x70, 0x42, 0x94, 0xf2, 0x5e, 0xca, + 0x2f, 0x4f, 0xe5, 0xf3, 0xde, 0xdc, 0x6c, 0x5c, 0x9c, 0xf7, 0x52, 0xae, 0x49, 0x49, 0xd8, 0xef, + 0x0d, 0xb6, 0xcb, 0x22, 0xec, 0x26, 0xf4, 0x79, 0xab, 0xcd, 0x4c, 0xe0, 0x13, 0xbd, 0x2a, 0x66, + 0x8e, 0x50, 0x0a, 0x7d, 0xcf, 0x82, 0x53, 0xcd, 0xcc, 0x0f, 0x11, 0x07, 0x7b, 0x6f, 0xfa, 0x1d, + 0xfe, 0xe9, 0x2a, 0x3e, 0x7a, 0x36, 0x1c, 0xe7, 0xb4, 0x94, 0x96, 0xf4, 0x8b, 0xef, 0x5b, 0xd2, + 0x5f, 0x85, 0x21, 0x26, 0x3c, 0x26, 0x01, 0x93, 0x7a, 0x32, 0xb6, 0x63, 0x22, 0xc2, 0xa2, 0xa8, + 0x88, 0x15, 0x09, 0xf4, 0x0b, 0x16, 0x9c, 0x49, 0x77, 0x1d, 0x13, 0x06, 0x16, 0xc1, 0x37, 0xf9, + 0x25, 0x6c, 0x59, 0x7c, 0xff, 0x99, 0x6a, 0x27, 0xe4, 0x83, 0x6e, 0x08, 0xb8, 0x73, 0x63, 0xa8, + 0x92, 0x71, 0x0b, 0x1c, 0x30, 0x5f, 0x11, 0x7b, 0xb8, 0x09, 0x3e, 0x0f, 0x23, 0x3b, 0x41, 0xcb, + 0x97, 0x9e, 0x30, 0xc2, 0xcf, 0x99, 0x69, 0xac, 0x57, 0xb5, 0x72, 0x6c, 0x60, 0xa5, 0xee, 0x8f, + 0x43, 0xf7, 0x7b, 0x7f, 0x3c, 0xde, 0x5b, 0xc9, 0x57, 0xad, 0x0c, 0x71, 0x9a, 0xdf, 0x53, 0x5f, + 0x36, 0xef, 0xa9, 0xe7, 0xd3, 0xf7, 0xd4, 0x36, 0xbd, 0xa4, 0x71, 0x45, 0xed, 0x3d, 0x38, 0x71, + 0xaf, 0x91, 0xa9, 0x6c, 0x0f, 0xce, 0x75, 0x3b, 0x38, 0x98, 0xe1, 0x62, 0x43, 0xbd, 0xe8, 0x27, + 0x86, 0x8b, 0x8d, 0x95, 0x0a, 0x66, 0x90, 0x5e, 0x63, 0x9c, 0xd8, 0xff, 0xdd, 0x82, 0x62, 0x35, + 0x68, 0x1c, 0x83, 0x9e, 0xf5, 0x53, 0x86, 0x9e, 0xf5, 0xe1, 0x9c, 0xb4, 0xad, 0xb9, 0x5a, 0xd5, + 0xa5, 0x94, 0x56, 0xf5, 0x4c, 0x1e, 0x81, 0xce, 0x3a, 0xd4, 0x5f, 0x2d, 0x82, 0x9e, 0x64, 0x16, + 0xfd, 0x9b, 0xfb, 0xb1, 0x80, 0x2f, 0x76, 0xca, 0x3b, 0x2b, 0x28, 0x33, 0x7b, 0x47, 0xe9, 0x5c, + 0xfb, 0x23, 0x66, 0x08, 0x7f, 0x9b, 0xb8, 0x9b, 0x5b, 0x31, 0x69, 0xa4, 0x3f, 0xe7, 0xf8, 0x0c, + 0xe1, 0xff, 0x8b, 0x05, 0xe3, 0xa9, 0xd6, 0x91, 0x97, 0xe5, 0xa9, 0x77, 0x9f, 0xfa, 0xb5, 0xc9, + 0xae, 0xae, 0x7d, 0xb3, 0x00, 0xea, 0x11, 0x4b, 0xea, 0x9e, 0x98, 0x5c, 0xae, 0x5e, 0xb9, 0x22, + 0xac, 0x61, 0xa0, 0x17, 0x60, 0x38, 0x0e, 0x9a, 0x81, 0x17, 0x6c, 0xee, 0x5d, 0x25, 0x32, 0xaa, + 0x8e, 0x7a, 0x6a, 0x5c, 0x4b, 0x40, 0x58, 0xc7, 0xb3, 0x7f, 0xbd, 0x08, 0xe9, 0xc4, 0xc4, 0x3f, + 0x59, 0x93, 0x1f, 0xce, 0x35, 0xf9, 0x5d, 0x0b, 0x26, 0x68, 0xeb, 0xcc, 0x96, 0x4c, 0x1e, 0x87, + 0x2a, 0x49, 0x8a, 0xd5, 0x21, 0x49, 0xca, 0x79, 0xca, 0xbb, 0x1a, 0x41, 0x2b, 0x16, 0xba, 0x2b, + 0x8d, 0x39, 0xd1, 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x84, 0xa1, 0xf0, 0xbf, 0xd3, 0xf1, 0x48, 0x18, + 0x62, 0x01, 0x95, 0x39, 0x54, 0xfa, 0x72, 0x72, 0xa8, 0xb0, 0x80, 0x74, 0xc2, 0x7e, 0x49, 0x08, + 0x26, 0x5a, 0x40, 0x3a, 0x69, 0xd8, 0x94, 0xe0, 0xd8, 0x5f, 0x2f, 0xc2, 0x48, 0x35, 0x68, 0x24, + 0xcf, 0x48, 0xcf, 0x1b, 0xcf, 0x48, 0xe7, 0x52, 0xcf, 0x48, 0x13, 0x3a, 0xee, 0x4f, 0x1e, 0x8d, + 0x3e, 0xa8, 0x47, 0xa3, 0x3f, 0xb7, 0x60, 0xac, 0x1a, 0x34, 0xe8, 0x02, 0xfd, 0x71, 0x5a, 0x8d, + 0x7a, 0xb8, 0xc3, 0x81, 0x0e, 0xe1, 0x0e, 0xff, 0x81, 0x05, 0x83, 0xd5, 0xa0, 0x71, 0x0c, 0x7a, + 0xdd, 0x97, 0x4d, 0xbd, 0xee, 0x43, 0x39, 0x5c, 0x36, 0x47, 0x95, 0xfb, 0x8d, 0x22, 0x8c, 0xd2, + 0x7e, 0x06, 0x9b, 0x72, 0x96, 0x8c, 0x11, 0xb1, 0x7a, 0x18, 0x11, 0x2a, 0xcc, 0x05, 0x9e, 0x17, + 0xdc, 0x49, 0xcf, 0xd8, 0x32, 0x2b, 0xc5, 0x02, 0x8a, 0x9e, 0x86, 0xa1, 0x66, 0x48, 0x76, 0xdd, + 0xa0, 0x15, 0xa5, 0x3d, 0x78, 0xab, 0xa2, 0x1c, 0x2b, 0x0c, 0x2a, 0xff, 0x47, 0xae, 0x5f, 0x27, + 0xd2, 0xa6, 0xa9, 0x8f, 0xd9, 0x34, 0xf1, 0x88, 0xb1, 0x5a, 0x39, 0x36, 0xb0, 0xd0, 0x6d, 0x28, + 0xb1, 0xff, 0x6c, 0xdf, 0x1c, 0x3e, 0x87, 0x89, 0x08, 0xd3, 0x2e, 0x08, 0xe0, 0x84, 0x16, 0xba, + 0x08, 0x10, 0x4b, 0xeb, 0xab, 0x48, 0x38, 0x98, 0x2b, 0x89, 0x52, 0xd9, 0x65, 0x45, 0x58, 0xc3, + 0x42, 0x4f, 0x41, 0x29, 0x76, 0x5c, 0xef, 0x9a, 0xeb, 0x93, 0x48, 0x58, 0xaf, 0x89, 0x28, 0xec, + 0xa2, 0x10, 0x27, 0x70, 0x7a, 0xa2, 0xb3, 0xf0, 0x05, 0x3c, 0x03, 0xd2, 0x10, 0xc3, 0x66, 0x27, + 0xfa, 0x35, 0x55, 0x8a, 0x35, 0x0c, 0xfb, 0x12, 0x9c, 0xac, 0x06, 0x8d, 0x6a, 0x10, 0xc6, 0xcb, + 0x41, 0x78, 0xc7, 0x09, 0x1b, 0x72, 0xfe, 0x66, 0x64, 0x40, 0x70, 0x7a, 0xea, 0xf6, 0x73, 0xfd, + 0x84, 0x11, 0xea, 0xfb, 0x39, 0x76, 0xa6, 0x1f, 0xd2, 0xd5, 0xe8, 0xdf, 0x15, 0x00, 0x55, 0x99, + 0x7d, 0x98, 0x91, 0x85, 0xeb, 0x2d, 0x18, 0x8b, 0xc8, 0x35, 0xd7, 0x6f, 0xdd, 0x95, 0xf7, 0xb4, + 0x0e, 0x7e, 0x5c, 0xb5, 0x25, 0x1d, 0x93, 0x6b, 0x7b, 0xcc, 0x32, 0x9c, 0xa2, 0x46, 0x87, 0x30, + 0x6c, 0xf9, 0xf3, 0xd1, 0xcd, 0x88, 0x84, 0x22, 0x2d, 0x14, 0x1b, 0x42, 0x2c, 0x0b, 0x71, 0x02, + 0xa7, 0x4b, 0x86, 0xfd, 0xb9, 0x1e, 0xf8, 0x38, 0x08, 0x62, 0xb9, 0xc8, 0x58, 0x62, 0x11, 0xad, + 0x1c, 0x1b, 0x58, 0x68, 0x19, 0x50, 0xd4, 0x6a, 0x36, 0x3d, 0xf6, 0xe8, 0xea, 0x78, 0x97, 0xc3, + 0xa0, 0xd5, 0xe4, 0x0f, 0x5e, 0x22, 0x27, 0x47, 0xad, 0x0d, 0x8a, 0x33, 0x6a, 0x50, 0xc6, 0xb0, + 0x11, 0xb1, 0xdf, 0x22, 0x82, 0x01, 0xd7, 0xbb, 0xd6, 0x58, 0x11, 0x96, 0x30, 0xfb, 0x73, 0xec, + 0x30, 0x63, 0xd9, 0x7c, 0xe2, 0x56, 0x48, 0xd0, 0x0e, 0x8c, 0x36, 0xd9, 0x81, 0x15, 0x87, 0x81, + 0xe7, 0x11, 0x29, 0x37, 0xde, 0x9f, 0xad, 0x1a, 0xcf, 0xee, 0xa1, 0x93, 0xc3, 0x26, 0x75, 0xfb, + 0xf3, 0xe3, 0x8c, 0x2f, 0xd5, 0xf8, 0xa5, 0x65, 0x50, 0x58, 0xa0, 0x0b, 0x09, 0x6d, 0x3a, 0x3f, + 0xff, 0x57, 0xc2, 0xe9, 0x85, 0x15, 0x3b, 0x96, 0x75, 0xd1, 0x6b, 0xec, 0xa5, 0x90, 0x33, 0x83, + 0x6e, 0x69, 0x41, 0x39, 0x96, 0xf1, 0x28, 0x28, 0x2a, 0x62, 0x8d, 0x08, 0xba, 0x06, 0xa3, 0x22, + 0xf9, 0x8b, 0x50, 0x60, 0x14, 0x8d, 0xeb, 0xef, 0x28, 0xd6, 0x81, 0x07, 0xe9, 0x02, 0x6c, 0x56, + 0x46, 0x9b, 0x70, 0x46, 0xcb, 0x84, 0x96, 0x61, 0x2f, 0xc9, 0x79, 0xcb, 0xa3, 0xf7, 0xf6, 0x67, + 0xce, 0xac, 0x75, 0x42, 0xc4, 0x9d, 0xe9, 0xa0, 0x1b, 0x70, 0xd2, 0xa9, 0xc7, 0xee, 0x2e, 0xa9, + 0x10, 0xa7, 0xe1, 0xb9, 0x3e, 0x31, 0x43, 0x5a, 0x9c, 0xbe, 0xb7, 0x3f, 0x73, 0x72, 0x3e, 0x0b, + 0x01, 0x67, 0xd7, 0x43, 0x2f, 0x43, 0xa9, 0xe1, 0x47, 0x62, 0x0c, 0x06, 0x8c, 0x24, 0x7f, 0xa5, + 0xca, 0xf5, 0x9a, 0xfa, 0xfe, 0xe4, 0x0f, 0x4e, 0x2a, 0xa0, 0x4d, 0x18, 0xd1, 0xdd, 0xd6, 0x44, + 0x82, 0xc8, 0x67, 0x3a, 0xdc, 0x6d, 0x0d, 0x5f, 0x2f, 0xae, 0xbd, 0x53, 0xd6, 0xc8, 0x86, 0x1b, + 0x98, 0x41, 0x18, 0xbd, 0x0a, 0x28, 0x22, 0xe1, 0xae, 0x5b, 0x27, 0xf3, 0x75, 0x16, 0x52, 0x99, + 0xe9, 0x7c, 0x86, 0x0c, 0xd7, 0x1a, 0x54, 0x6b, 0xc3, 0xc0, 0x19, 0xb5, 0xd0, 0x15, 0xca, 0x51, + 0xf4, 0x52, 0x61, 0x3c, 0x2e, 0xc5, 0xbc, 0x72, 0x85, 0x34, 0x43, 0x52, 0x77, 0x62, 0xd2, 0x30, + 0x29, 0xe2, 0x54, 0x3d, 0x7a, 0xde, 0xa8, 0x4c, 0x15, 0x60, 0x9a, 0x3c, 0xb7, 0x67, 0xab, 0xa0, + 0x37, 0xa4, 0xad, 0x20, 0x8a, 0xaf, 0x93, 0xf8, 0x4e, 0x10, 0x6e, 0x8b, 0x38, 0x74, 0x49, 0x98, + 0xca, 0x04, 0x84, 0x75, 0x3c, 0x2a, 0x11, 0xb1, 0xa7, 0xba, 0x95, 0x0a, 0x7b, 0x43, 0x19, 0x4a, + 0xf6, 0xc9, 0x15, 0x5e, 0x8c, 0x25, 0x5c, 0xa2, 0xae, 0x54, 0x17, 0xd9, 0xcb, 0x48, 0x0a, 0x75, + 0xa5, 0xba, 0x88, 0x25, 0x1c, 0x91, 0xf6, 0x04, 0x8a, 0x63, 0xf9, 0x6f, 0x5a, 0xed, 0x7c, 0xb9, + 0xc7, 0x1c, 0x8a, 0x3e, 0x4c, 0xa8, 0xd4, 0x8d, 0x3c, 0x40, 0x5f, 0x54, 0x1e, 0x67, 0x8b, 0xa4, + 0xf7, 0xe8, 0x7e, 0x4a, 0xa7, 0xb7, 0x92, 0xa2, 0x84, 0xdb, 0x68, 0x1b, 0xa1, 0x52, 0x26, 0xba, + 0x66, 0x1a, 0x99, 0x83, 0x52, 0xd4, 0x5a, 0x6f, 0x04, 0x3b, 0x8e, 0xeb, 0xb3, 0x87, 0x0c, 0x4d, + 0x10, 0xa9, 0x49, 0x00, 0x4e, 0x70, 0xd0, 0x32, 0x0c, 0x39, 0xe2, 0xf2, 0x25, 0x9e, 0x1e, 0x32, + 0x63, 0x27, 0xc8, 0x0b, 0x1a, 0xd7, 0xa7, 0xca, 0x7f, 0x58, 0xd5, 0x45, 0x2f, 0xc1, 0xa8, 0x70, + 0xef, 0x13, 0x96, 0xb9, 0x27, 0x4c, 0x4f, 0x90, 0x9a, 0x0e, 0xc4, 0x26, 0x2e, 0xfa, 0x0c, 0x8c, + 0x51, 0x2a, 0x09, 0x63, 0x2b, 0x4f, 0xf5, 0xc2, 0x11, 0xb5, 0x08, 0xf2, 0x7a, 0x65, 0x9c, 0x22, + 0x86, 0x1a, 0xf0, 0x88, 0xd3, 0x8a, 0x03, 0xa6, 0xf4, 0x34, 0xd7, 0xff, 0x5a, 0xb0, 0x4d, 0x7c, + 0xf6, 0xde, 0x30, 0xb4, 0x70, 0xee, 0xde, 0xfe, 0xcc, 0x23, 0xf3, 0x1d, 0xf0, 0x70, 0x47, 0x2a, + 0xe8, 0x26, 0x0c, 0xc7, 0x81, 0x27, 0x4c, 0xea, 0xa3, 0xf2, 0xa9, 0xfc, 0x50, 0x4f, 0x6b, 0x0a, + 0x4d, 0x57, 0x27, 0xa8, 0xaa, 0x58, 0xa7, 0x83, 0xd6, 0xf8, 0x1e, 0x63, 0x81, 0x49, 0x49, 0x54, + 0x7e, 0x28, 0x7f, 0x60, 0x54, 0xfc, 0x52, 0x73, 0x0b, 0x8a, 0x9a, 0x58, 0x27, 0x83, 0x2e, 0xc3, + 0x64, 0x33, 0x74, 0x03, 0xb6, 0xb0, 0x95, 0xc2, 0xb9, 0x6c, 0x04, 0x01, 0x9c, 0xac, 0xa6, 0x11, + 0x70, 0x7b, 0x1d, 0x74, 0x81, 0x0a, 0xa8, 0xbc, 0xb0, 0x7c, 0x9a, 0x67, 0xa0, 0xe1, 0xc2, 0x29, + 0x2f, 0xc3, 0x0a, 0x3a, 0xfd, 0xd3, 0x30, 0xd9, 0xc6, 0x29, 0x0f, 0x65, 0xde, 0xfc, 0x4f, 0xfb, + 0xa1, 0xa4, 0xd4, 0x81, 0x68, 0xce, 0xd4, 0xf2, 0x9e, 0x4e, 0x6b, 0x79, 0x87, 0xa8, 0xbc, 0xa6, + 0x2b, 0x76, 0xd7, 0x32, 0xf2, 0xf3, 0x9f, 0xcb, 0x61, 0x0d, 0xbd, 0xfb, 0x22, 0x6a, 0xb7, 0xbb, + 0x62, 0xcf, 0xea, 0xe2, 0xbe, 0x8e, 0x17, 0xc6, 0x1e, 0x93, 0x59, 0xd2, 0xab, 0x61, 0x33, 0x68, + 0xac, 0x54, 0xd3, 0xd9, 0xdd, 0xaa, 0xb4, 0x10, 0x73, 0x18, 0x13, 0xee, 0xe9, 0xb1, 0xce, 0x84, + 0xfb, 0xc1, 0xfb, 0x14, 0xee, 0x25, 0x01, 0x9c, 0xd0, 0x42, 0x1e, 0x4c, 0xd6, 0xcd, 0xc4, 0x7c, + 0xca, 0xff, 0xf0, 0xb1, 0xae, 0x29, 0xf2, 0x5a, 0x5a, 0xc6, 0x9e, 0xc5, 0x34, 0x15, 0xdc, 0x4e, + 0x18, 0xbd, 0x04, 0x43, 0xef, 0x04, 0x11, 0x5b, 0x76, 0xe2, 0x6c, 0x93, 0x1e, 0x5f, 0x43, 0xaf, + 0xdd, 0xa8, 0xb1, 0xf2, 0x83, 0xfd, 0x99, 0xe1, 0x6a, 0xd0, 0x90, 0x7f, 0xb1, 0xaa, 0x80, 0xee, + 0xc2, 0x49, 0x83, 0x23, 0xa8, 0xee, 0x42, 0xef, 0xdd, 0x3d, 0x23, 0x9a, 0x3b, 0xb9, 0x92, 0x45, + 0x09, 0x67, 0x37, 0x60, 0x7f, 0x93, 0x2b, 0x3d, 0x85, 0x6a, 0x84, 0x44, 0x2d, 0xef, 0x38, 0xd2, + 0x72, 0x2c, 0x19, 0x5a, 0x9b, 0xfb, 0x56, 0xac, 0xff, 0x9e, 0xc5, 0x14, 0xeb, 0x6b, 0x64, 0xa7, + 0xe9, 0x39, 0xf1, 0x71, 0x18, 0xb5, 0xbf, 0x06, 0x43, 0xb1, 0x68, 0xad, 0x53, 0x26, 0x11, 0xad, + 0x53, 0xec, 0x71, 0x41, 0x1d, 0x88, 0xb2, 0x14, 0x2b, 0x32, 0xf6, 0x3f, 0xe7, 0x33, 0x20, 0x21, + 0xc7, 0xa0, 0x5b, 0xa8, 0x98, 0xba, 0x85, 0x99, 0x2e, 0x5f, 0x90, 0xa3, 0x63, 0xf8, 0x67, 0x66, + 0xbf, 0xd9, 0xdd, 0xe3, 0xc3, 0xfe, 0xa2, 0x63, 0xff, 0x92, 0x05, 0x53, 0x59, 0x46, 0x0a, 0x54, + 0x88, 0xe1, 0x37, 0x1f, 0xf5, 0xc2, 0xa5, 0x46, 0xf0, 0x96, 0x28, 0xc7, 0x0a, 0xa3, 0xe7, 0x68, + 0xfe, 0x87, 0x0b, 0x6f, 0x76, 0x03, 0xcc, 0x1c, 0x8e, 0xe8, 0x15, 0xee, 0xa5, 0x62, 0xa9, 0x24, + 0x8b, 0x87, 0xf3, 0x50, 0xb1, 0xbf, 0x56, 0x80, 0x29, 0xae, 0xa2, 0x9e, 0xdf, 0x0d, 0xdc, 0x46, + 0x35, 0x68, 0x08, 0x9f, 0x9d, 0x37, 0x60, 0xa4, 0xa9, 0x5d, 0x57, 0x3b, 0x05, 0x58, 0xd2, 0xaf, + 0xb5, 0xc9, 0xb5, 0x41, 0x2f, 0xc5, 0x06, 0x2d, 0xd4, 0x80, 0x11, 0xb2, 0xeb, 0xd6, 0x95, 0x9e, + 0xb3, 0x70, 0x68, 0x96, 0xae, 0x5a, 0x59, 0xd2, 0xe8, 0x60, 0x83, 0xea, 0x03, 0xc8, 0xb9, 0x63, + 0x7f, 0xc5, 0x82, 0x87, 0x72, 0xc2, 0x31, 0xd1, 0xe6, 0xee, 0xb0, 0xc7, 0x00, 0x91, 0x10, 0x54, + 0x35, 0xc7, 0x9f, 0x08, 0xb0, 0x80, 0xa2, 0x4f, 0x03, 0x70, 0x15, 0x3f, 0x95, 0xa2, 0xc5, 0xa7, + 0xf7, 0x16, 0xa6, 0x44, 0x8b, 0x65, 0x21, 0xeb, 0x63, 0x8d, 0x96, 0xfd, 0x6b, 0x45, 0xe8, 0xe7, + 0xc9, 0xe7, 0x97, 0x61, 0x70, 0x8b, 0x07, 0x7f, 0xee, 0x25, 0xce, 0x74, 0x72, 0x1d, 0xe1, 0x05, + 0x58, 0x56, 0x46, 0xab, 0x70, 0x42, 0xf8, 0x85, 0x55, 0x88, 0xe7, 0xec, 0xc9, 0x5b, 0x2d, 0x4f, + 0xc4, 0x22, 0x93, 0x04, 0x9c, 0x58, 0x69, 0x47, 0xc1, 0x59, 0xf5, 0xd0, 0x2b, 0x6d, 0x21, 0x1f, + 0x79, 0xd8, 0x6c, 0x25, 0x03, 0x77, 0x09, 0xfb, 0xf8, 0x12, 0x8c, 0x36, 0xdb, 0xee, 0xef, 0x5a, + 0x62, 0x6e, 0xf3, 0xce, 0x6e, 0xe2, 0x32, 0xeb, 0x84, 0x16, 0xb3, 0xc5, 0x58, 0xdb, 0x0a, 0x49, + 0xb4, 0x15, 0x78, 0x0d, 0x91, 0x85, 0x36, 0xb1, 0x4e, 0x48, 0xc1, 0x71, 0x5b, 0x0d, 0x4a, 0x65, + 0xc3, 0x71, 0xbd, 0x56, 0x48, 0x12, 0x2a, 0x03, 0x26, 0x95, 0xe5, 0x14, 0x1c, 0xb7, 0xd5, 0xa0, + 0xeb, 0xe8, 0xa4, 0x48, 0x61, 0x2a, 0xa3, 0x05, 0x28, 0x93, 0x93, 0x41, 0xe9, 0x35, 0xd0, 0x21, + 0x82, 0x8d, 0x78, 0xf2, 0x57, 0x49, 0x50, 0xb5, 0x04, 0x79, 0xc2, 0x5f, 0x40, 0x52, 0xb9, 0x9f, + 0x44, 0x9a, 0x7f, 0x6c, 0xc1, 0x89, 0x0c, 0xd3, 0x36, 0xce, 0xaa, 0x36, 0xdd, 0x28, 0x56, 0xf9, + 0x3f, 0x34, 0x56, 0xc5, 0xcb, 0xb1, 0xc2, 0xa0, 0xfb, 0x81, 0x33, 0xc3, 0x34, 0x03, 0x14, 0xa6, + 0x23, 0x02, 0x7a, 0x38, 0x06, 0x88, 0xce, 0x41, 0x5f, 0x2b, 0x22, 0xa1, 0xcc, 0x40, 0x29, 0xf9, + 0x37, 0xd3, 0x08, 0x32, 0x08, 0x95, 0x28, 0x37, 0x95, 0x32, 0x4e, 0x93, 0x28, 0xb9, 0x3a, 0x8e, + 0xc3, 0xec, 0x2f, 0x15, 0xe1, 0x74, 0xae, 0x99, 0x2a, 0xed, 0xd2, 0x4e, 0xe0, 0xbb, 0x71, 0xa0, + 0x62, 0x0f, 0xf2, 0x50, 0x2b, 0xa4, 0xb9, 0xb5, 0x2a, 0xca, 0xb1, 0xc2, 0x40, 0xe7, 0x65, 0x82, + 0xe2, 0x74, 0x86, 0x93, 0x85, 0x8a, 0x91, 0xa3, 0xb8, 0xd7, 0x54, 0x45, 0x8f, 0x41, 0x5f, 0x33, + 0x50, 0xd9, 0xe3, 0xd5, 0xcc, 0xd2, 0xee, 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x4c, 0x8c, 0x43, + 0xea, 0xe5, 0x02, 0x3b, 0x8d, 0x20, 0xd2, 0x06, 0xe3, 0x09, 0x18, 0xdc, 0x26, 0x7b, 0xa1, 0xeb, + 0x6f, 0xa6, 0xdf, 0x6d, 0xae, 0xf2, 0x62, 0x2c, 0xe1, 0x66, 0xf6, 0xbf, 0xc1, 0x6e, 0xd9, 0xff, + 0x0e, 0x9b, 0x68, 0x68, 0xa8, 0xeb, 0xd1, 0xf6, 0xc5, 0x22, 0x8c, 0xe3, 0x85, 0xca, 0x4f, 0x26, + 0xe2, 0x66, 0xfb, 0x44, 0x1c, 0x75, 0xda, 0xa7, 0xee, 0xb3, 0xf1, 0x0d, 0x0b, 0xc6, 0x59, 0xc0, + 0x65, 0x11, 0x2a, 0xc4, 0x0d, 0xfc, 0x63, 0x10, 0xdd, 0x1e, 0x83, 0xfe, 0x90, 0x36, 0x9a, 0xce, + 0xe5, 0xc2, 0x7a, 0x82, 0x39, 0x0c, 0x3d, 0x02, 0x7d, 0xac, 0x0b, 0x74, 0xf2, 0x46, 0x78, 0xca, + 0x85, 0x8a, 0x13, 0x3b, 0x98, 0x95, 0x32, 0x9f, 0x4d, 0x4c, 0x9a, 0x9e, 0xcb, 0x3b, 0x9d, 0x68, + 0xc0, 0x3f, 0x1c, 0x3e, 0x9b, 0x99, 0x5d, 0x7b, 0x7f, 0x3e, 0x9b, 0xd9, 0x24, 0x3b, 0x5f, 0x8b, + 0xfe, 0x47, 0x01, 0xce, 0x66, 0xd6, 0xeb, 0xd9, 0x67, 0xb3, 0x73, 0xed, 0xa3, 0x79, 0x7e, 0xcf, + 0x7e, 0x15, 0x2f, 0x1e, 0xe3, 0xab, 0x78, 0x5f, 0xaf, 0x92, 0x63, 0x7f, 0x0f, 0xae, 0x94, 0x99, + 0x43, 0xf6, 0x21, 0x71, 0xa5, 0xcc, 0xec, 0x5b, 0xce, 0xb5, 0xee, 0x87, 0x85, 0x9c, 0x6f, 0x61, + 0x17, 0xbc, 0x0b, 0x94, 0xcf, 0x30, 0x60, 0x24, 0x24, 0xe1, 0x11, 0xce, 0x63, 0x78, 0x19, 0x56, + 0x50, 0xe4, 0x6a, 0x4e, 0x89, 0xbc, 0x6b, 0x2f, 0x1d, 0x6a, 0xcb, 0xcc, 0x9a, 0x0f, 0x16, 0x7a, + 0x5c, 0x93, 0xb4, 0x83, 0xe2, 0xaa, 0x76, 0x29, 0x2f, 0xf6, 0x7e, 0x29, 0x1f, 0xc9, 0xbe, 0x90, + 0xa3, 0x79, 0x18, 0xdf, 0x71, 0x7d, 0x96, 0x90, 0xd9, 0x14, 0x45, 0x95, 0x8f, 0xfe, 0xaa, 0x09, + 0xc6, 0x69, 0xfc, 0xe9, 0x97, 0x60, 0xf4, 0xfe, 0xb5, 0x88, 0xdf, 0x2d, 0xc2, 0xc3, 0x1d, 0xb6, + 0x3d, 0xe7, 0xf5, 0xc6, 0x1c, 0x68, 0xbc, 0xbe, 0x6d, 0x1e, 0xaa, 0x30, 0xb5, 0xd1, 0xf2, 0xbc, + 0x3d, 0x66, 0x78, 0x46, 0x1a, 0x12, 0x43, 0xc8, 0x8a, 0x2a, 0x9a, 0xfa, 0x72, 0x06, 0x0e, 0xce, + 0xac, 0x89, 0x5e, 0x05, 0x14, 0xac, 0xb3, 0x08, 0xdf, 0x8d, 0x24, 0x5a, 0x0b, 0x1b, 0xf8, 0x62, + 0xb2, 0x19, 0x6f, 0xb4, 0x61, 0xe0, 0x8c, 0x5a, 0x54, 0xe8, 0xa7, 0xa7, 0xd2, 0x9e, 0xea, 0x56, + 0x4a, 0xe8, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x32, 0x4c, 0x3a, 0xbb, 0x8e, 0xcb, 0xa3, 0xf7, + 0x49, 0x02, 0x5c, 0xea, 0x57, 0xba, 0xbb, 0xf9, 0x34, 0x02, 0x6e, 0xaf, 0x93, 0xf2, 0x8a, 0x1c, + 0xc8, 0xf7, 0x8a, 0xec, 0xcc, 0x17, 0xbb, 0xa9, 0x62, 0xed, 0xff, 0x64, 0xd1, 0xe3, 0x2b, 0x23, + 0x03, 0x30, 0x1d, 0x07, 0xa5, 0x52, 0xd4, 0x1c, 0x14, 0xd5, 0x38, 0x2c, 0xea, 0x40, 0x6c, 0xe2, + 0xf2, 0x05, 0x11, 0x25, 0xf6, 0xf3, 0x86, 0xe8, 0x2e, 0x3c, 0x90, 0x15, 0x06, 0x7a, 0x1d, 0x06, + 0x1b, 0xee, 0xae, 0x1b, 0x05, 0xa1, 0xd8, 0x2c, 0x87, 0xcd, 0x7a, 0xaf, 0xf8, 0x60, 0x85, 0x93, + 0xc1, 0x92, 0x9e, 0xfd, 0xc5, 0x02, 0x8c, 0xca, 0x16, 0x5f, 0x6b, 0x05, 0xb1, 0x73, 0x0c, 0xc7, + 0xf2, 0x65, 0xe3, 0x58, 0xfe, 0x58, 0x27, 0x37, 0x6c, 0xd6, 0xa5, 0xdc, 0xe3, 0xf8, 0x46, 0xea, + 0x38, 0x7e, 0xbc, 0x3b, 0xa9, 0xce, 0xc7, 0xf0, 0xbf, 0xb0, 0x60, 0xd2, 0xc0, 0x3f, 0x86, 0xd3, + 0x60, 0xd9, 0x3c, 0x0d, 0x1e, 0xed, 0xfa, 0x0d, 0x39, 0xa7, 0xc0, 0x57, 0x0b, 0xa9, 0xbe, 0x33, + 0xee, 0xff, 0x0e, 0xf4, 0x6d, 0x39, 0x61, 0xa3, 0x53, 0x0c, 0xda, 0xb6, 0x4a, 0xb3, 0x57, 0x9c, + 0xb0, 0xc1, 0x79, 0xf8, 0xd3, 0x2a, 0x39, 0xa1, 0x13, 0x36, 0xba, 0xba, 0x8b, 0xb0, 0xa6, 0xd0, + 0x25, 0x18, 0x88, 0xea, 0x41, 0x53, 0x99, 0xc3, 0x9e, 0xe3, 0x89, 0x0b, 0x69, 0xc9, 0xc1, 0xfe, + 0x0c, 0x32, 0x9b, 0xa3, 0xc5, 0x58, 0xe0, 0x4f, 0x6f, 0x42, 0x49, 0x35, 0xfd, 0x40, 0x0d, 0xfd, + 0xff, 0xb0, 0x08, 0x27, 0x32, 0xd6, 0x05, 0x8a, 0x8c, 0xd1, 0x7a, 0xb6, 0xc7, 0xe5, 0xf4, 0x3e, + 0xc7, 0x2b, 0x62, 0x37, 0x96, 0x86, 0x98, 0xff, 0x9e, 0x1b, 0xbd, 0x19, 0x91, 0x74, 0xa3, 0xb4, + 0xa8, 0x7b, 0xa3, 0xb4, 0xb1, 0x63, 0x1b, 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x03, 0x9d, 0xd3, 0x3f, + 0x2d, 0xc2, 0x54, 0x56, 0xf4, 0x06, 0xf4, 0x73, 0xa9, 0x8c, 0x36, 0xcf, 0xf7, 0x1a, 0xf7, 0x81, + 0xa7, 0xb9, 0x11, 0xe1, 0xae, 0x66, 0xcd, 0x1c, 0x37, 0x5d, 0x87, 0x59, 0xb4, 0xc9, 0xfc, 0xb7, + 0x42, 0x9e, 0x89, 0x48, 0x6e, 0xf1, 0x4f, 0xf4, 0xdc, 0x01, 0x91, 0xc2, 0x28, 0x4a, 0xf9, 0x6f, + 0xc9, 0xe2, 0xee, 0xfe, 0x5b, 0xb2, 0xe5, 0x69, 0x17, 0x86, 0xb5, 0xaf, 0x79, 0xa0, 0x33, 0xbe, + 0x4d, 0x4f, 0x14, 0xad, 0xdf, 0x0f, 0x74, 0xd6, 0xbf, 0x62, 0x41, 0xca, 0x74, 0x4d, 0xa9, 0xa4, + 0xac, 0x5c, 0x95, 0xd4, 0x39, 0xe8, 0x0b, 0x03, 0x8f, 0xa4, 0x93, 0x9c, 0xe0, 0xc0, 0x23, 0x98, + 0x41, 0x54, 0x26, 0xf2, 0x62, 0x5e, 0x26, 0x72, 0x7a, 0x35, 0xf6, 0xc8, 0x2e, 0x91, 0xda, 0x08, + 0xc5, 0x93, 0xaf, 0xd1, 0x42, 0xcc, 0x61, 0xf6, 0x37, 0xfa, 0xe0, 0x4c, 0x47, 0x0f, 0x48, 0x7a, + 0x65, 0xd9, 0x74, 0x62, 0x72, 0xc7, 0xd9, 0x4b, 0x87, 0x60, 0xbe, 0xcc, 0x8b, 0xb1, 0x84, 0x33, + 0x43, 0x5b, 0x1e, 0xc5, 0x31, 0xa5, 0xc0, 0x13, 0xc1, 0x1b, 0x05, 0xd4, 0x54, 0x1c, 0x15, 0x8f, + 0x42, 0x71, 0x74, 0x11, 0x20, 0x8a, 0xbc, 0x25, 0x9f, 0x4a, 0x60, 0x0d, 0x61, 0xc1, 0x9b, 0x44, + 0xfb, 0xac, 0x5d, 0x13, 0x10, 0xac, 0x61, 0xa1, 0x0a, 0x4c, 0x34, 0xc3, 0x20, 0xe6, 0xfa, 0xd0, + 0x0a, 0xb7, 0x1d, 0xe9, 0x37, 0x9d, 0xcf, 0xaa, 0x29, 0x38, 0x6e, 0xab, 0x81, 0x5e, 0x80, 0x61, + 0xe1, 0x90, 0x56, 0x0d, 0x02, 0x4f, 0xa8, 0x6a, 0x94, 0x25, 0x42, 0x2d, 0x01, 0x61, 0x1d, 0x4f, + 0xab, 0xc6, 0x94, 0xac, 0x83, 0x99, 0xd5, 0xb8, 0xa2, 0x55, 0xc3, 0x4b, 0x45, 0x72, 0x19, 0xea, + 0x29, 0x92, 0x4b, 0xa2, 0xbc, 0x2a, 0xf5, 0xfc, 0xae, 0x04, 0x5d, 0xd5, 0x3d, 0xbf, 0xd1, 0x07, + 0x27, 0xc4, 0xc2, 0x79, 0xd0, 0xcb, 0xe5, 0x01, 0x65, 0x35, 0xff, 0xc9, 0x9a, 0x39, 0xee, 0x35, + 0xf3, 0xcd, 0x22, 0x0c, 0xf0, 0xa9, 0x38, 0x06, 0x19, 0x7e, 0x59, 0x28, 0xfd, 0x3a, 0xc4, 0x30, + 0xe1, 0x7d, 0x99, 0xad, 0x38, 0xb1, 0xc3, 0xcf, 0x2f, 0xc5, 0x46, 0x13, 0xf5, 0x20, 0x9a, 0x35, + 0x18, 0xed, 0x74, 0x4a, 0xab, 0x05, 0x9c, 0x86, 0xc6, 0x76, 0xdf, 0x02, 0x88, 0x58, 0x66, 0x6d, + 0x4a, 0x43, 0x44, 0xc3, 0x79, 0xb2, 0x43, 0xeb, 0x35, 0x85, 0xcc, 0xfb, 0x90, 0x2c, 0x41, 0x05, + 0xc0, 0x1a, 0xc5, 0xe9, 0x17, 0xa1, 0xa4, 0x90, 0xbb, 0xa9, 0x00, 0x46, 0xf4, 0x53, 0xef, 0x53, + 0x30, 0x9e, 0x6a, 0xeb, 0x50, 0x1a, 0x84, 0xdf, 0xb2, 0x60, 0x9c, 0x77, 0x79, 0xc9, 0xdf, 0x15, + 0x9b, 0xfd, 0x5d, 0x98, 0xf2, 0x32, 0x36, 0x9d, 0x98, 0xd1, 0xde, 0x37, 0xa9, 0xd2, 0x18, 0x64, + 0x41, 0x71, 0x66, 0x1b, 0xe8, 0x02, 0x0c, 0x05, 0xec, 0x3c, 0x75, 0x3c, 0xe1, 0x4d, 0x30, 0xc2, + 0xb3, 0x22, 0xf0, 0x32, 0xac, 0xa0, 0xf6, 0xf7, 0x2c, 0x98, 0xe4, 0x3d, 0xbf, 0x4a, 0xf6, 0xd4, + 0xed, 0xf8, 0x83, 0xec, 0xbb, 0x48, 0xfa, 0x50, 0xc8, 0x49, 0xfa, 0xa0, 0x7f, 0x5a, 0xb1, 0xe3, + 0xa7, 0x7d, 0xcd, 0x02, 0xb1, 0x02, 0x8f, 0xe1, 0x1e, 0xf8, 0xd3, 0xe6, 0x3d, 0x70, 0x3a, 0x7f, + 0x51, 0xe7, 0x5c, 0x00, 0xff, 0xdc, 0x82, 0x09, 0x8e, 0x90, 0x3c, 0x44, 0x7e, 0xa0, 0xf3, 0xd0, + 0x4b, 0x26, 0x32, 0x95, 0xfa, 0x39, 0xfb, 0xa3, 0x8c, 0xc9, 0xea, 0xeb, 0x38, 0x59, 0x0d, 0xb9, + 0x81, 0x0e, 0x91, 0x61, 0xef, 0xd0, 0x71, 0x4a, 0xed, 0xff, 0x66, 0x01, 0xe2, 0xcd, 0x18, 0xe7, + 0x32, 0x3d, 0xed, 0x58, 0xa9, 0xa6, 0x09, 0x4a, 0x58, 0x8d, 0x82, 0x60, 0x0d, 0xeb, 0x48, 0x86, + 0x27, 0xf5, 0x9a, 0x5c, 0xec, 0xfe, 0x9a, 0x7c, 0x88, 0x11, 0xfd, 0xeb, 0x7d, 0x90, 0x36, 0x5d, + 0x46, 0xb7, 0x60, 0xa4, 0xee, 0x34, 0x9d, 0x75, 0xd7, 0x73, 0x63, 0x97, 0x44, 0x9d, 0xcc, 0x50, + 0x16, 0x35, 0x3c, 0xf1, 0x4e, 0xa8, 0x95, 0x60, 0x83, 0x0e, 0x9a, 0x05, 0x68, 0x86, 0xee, 0xae, + 0xeb, 0x91, 0x4d, 0x76, 0x15, 0x66, 0xfe, 0x4b, 0xdc, 0xb6, 0x42, 0x96, 0x62, 0x0d, 0x23, 0xc3, + 0xdf, 0xa5, 0xf8, 0xe0, 0xfc, 0x5d, 0xfa, 0x0e, 0xe9, 0xef, 0xd2, 0xdf, 0x93, 0xbf, 0x0b, 0x86, + 0x53, 0xf2, 0xec, 0xa6, 0xff, 0x97, 0x5d, 0x8f, 0x08, 0x81, 0x8d, 0x7b, 0x35, 0x4d, 0xdf, 0xdb, + 0x9f, 0x39, 0x85, 0x33, 0x31, 0x70, 0x4e, 0x4d, 0xf4, 0x69, 0x28, 0x3b, 0x9e, 0x17, 0xdc, 0x51, + 0xa3, 0xb6, 0x14, 0xd5, 0x1d, 0x2f, 0x09, 0xdb, 0x3d, 0xb4, 0xf0, 0xc8, 0xbd, 0xfd, 0x99, 0xf2, + 0x7c, 0x0e, 0x0e, 0xce, 0xad, 0x6d, 0x6f, 0xc3, 0x89, 0x1a, 0x09, 0x65, 0xd2, 0x4e, 0xb5, 0xc5, + 0xd6, 0xa0, 0x14, 0xa6, 0x98, 0x4a, 0x4f, 0x21, 0x34, 0xb4, 0x90, 0x8a, 0x92, 0x89, 0x24, 0x84, + 0xec, 0x3f, 0xb3, 0x60, 0x50, 0x98, 0x43, 0x1f, 0x83, 0x2c, 0x33, 0x6f, 0xe8, 0x23, 0x67, 0xb2, + 0x19, 0x2f, 0xeb, 0x4c, 0xae, 0x26, 0x72, 0x25, 0xa5, 0x89, 0x7c, 0xb4, 0x13, 0x91, 0xce, 0x3a, + 0xc8, 0x5f, 0x2c, 0xc2, 0x98, 0x69, 0x0a, 0x7e, 0x0c, 0x43, 0x70, 0x1d, 0x06, 0x23, 0xe1, 0x77, + 0x50, 0xc8, 0xb7, 0x5f, 0x4d, 0x4f, 0x62, 0x62, 0xe5, 0x22, 0x3c, 0x0d, 0x24, 0x91, 0x4c, 0x87, + 0x86, 0xe2, 0x03, 0x74, 0x68, 0xe8, 0x66, 0x8d, 0xdf, 0x77, 0x14, 0xd6, 0xf8, 0xf6, 0xb7, 0x18, + 0xf3, 0xd7, 0xcb, 0x8f, 0x41, 0x2e, 0xb8, 0x6c, 0x1e, 0x13, 0x76, 0x87, 0x95, 0x25, 0x3a, 0x95, + 0x23, 0x1f, 0xfc, 0x63, 0x0b, 0x86, 0x05, 0xe2, 0x31, 0x74, 0xfb, 0x67, 0xcc, 0x6e, 0x3f, 0xdc, + 0xa1, 0xdb, 0x39, 0xfd, 0xfd, 0xbb, 0x05, 0xd5, 0xdf, 0x6a, 0x10, 0xc6, 0x3d, 0xa5, 0x71, 0x18, + 0xa2, 0xb7, 0xc1, 0xa0, 0x1e, 0x78, 0xe2, 0x30, 0x7f, 0x24, 0x71, 0x6c, 0xe5, 0xe5, 0x07, 0xda, + 0x6f, 0xac, 0xb0, 0x99, 0xdf, 0x65, 0x10, 0xc6, 0xe2, 0x00, 0x4d, 0xfc, 0x2e, 0x83, 0x30, 0xc6, + 0x0c, 0x82, 0x1a, 0x00, 0xb1, 0x13, 0x6e, 0x92, 0x98, 0x96, 0x09, 0x4f, 0xf0, 0xfc, 0x5d, 0xd8, + 0x8a, 0x5d, 0x6f, 0xd6, 0xf5, 0xe3, 0x28, 0x0e, 0x67, 0x57, 0xfc, 0xf8, 0x46, 0xc8, 0xef, 0x06, + 0x9a, 0xa7, 0xaa, 0xa2, 0x85, 0x35, 0xba, 0xd2, 0x55, 0x8a, 0xb5, 0xd1, 0x6f, 0x3e, 0x14, 0x5e, + 0x17, 0xe5, 0x58, 0x61, 0xd8, 0x2f, 0x32, 0x9e, 0xcc, 0x06, 0xe8, 0x70, 0x4e, 0xa4, 0xdf, 0x19, + 0x52, 0x43, 0xcb, 0x5e, 0x09, 0x2a, 0xba, 0xab, 0x6a, 0x67, 0x16, 0x48, 0x1b, 0xd6, 0xdd, 0x02, + 0x12, 0x7f, 0x56, 0xf4, 0xb3, 0x6d, 0xef, 0xc7, 0xcf, 0x74, 0xe1, 0xa5, 0x87, 0x78, 0x31, 0x66, + 0xb1, 0x40, 0x59, 0xcc, 0xc4, 0x95, 0x6a, 0x3a, 0xd1, 0xc6, 0xa2, 0x04, 0xe0, 0x04, 0x07, 0xcd, + 0x89, 0x9b, 0x25, 0xd7, 0xcf, 0x3d, 0x9c, 0xba, 0x59, 0xca, 0xcf, 0xd7, 0xae, 0x96, 0xcf, 0xc2, + 0xb0, 0x4a, 0x5e, 0x56, 0xe5, 0x39, 0xa0, 0x4a, 0x5c, 0x96, 0x5a, 0x4a, 0x8a, 0xb1, 0x8e, 0x83, + 0xd6, 0x60, 0x3c, 0xe2, 0x99, 0xd5, 0xa4, 0xf7, 0x92, 0xd0, 0x1b, 0x3c, 0x29, 0xdf, 0x9d, 0x6b, + 0x26, 0xf8, 0x80, 0x15, 0xf1, 0xcd, 0x2a, 0xfd, 0x9d, 0xd2, 0x24, 0xd0, 0x2b, 0x30, 0xe6, 0xe9, + 0x19, 0xa6, 0xab, 0x42, 0xad, 0xa0, 0xcc, 0x32, 0x8d, 0xfc, 0xd3, 0x55, 0x9c, 0xc2, 0xa6, 0x42, + 0x80, 0x5e, 0x22, 0x82, 0x6a, 0x39, 0xfe, 0x26, 0x89, 0x44, 0xea, 0x25, 0x26, 0x04, 0x5c, 0xcb, + 0xc1, 0xc1, 0xb9, 0xb5, 0xd1, 0x25, 0x18, 0x91, 0x9f, 0xaf, 0x79, 0xf3, 0x25, 0xc6, 0xbf, 0x1a, + 0x0c, 0x1b, 0x98, 0xe8, 0x0e, 0x9c, 0x94, 0xff, 0xd7, 0x42, 0x67, 0x63, 0xc3, 0xad, 0x0b, 0x67, + 0xca, 0x61, 0x46, 0x62, 0x5e, 0x7a, 0x42, 0x2c, 0x65, 0x21, 0x1d, 0xec, 0xcf, 0x9c, 0x13, 0xa3, + 0x96, 0x09, 0x67, 0x93, 0x98, 0x4d, 0x1f, 0xad, 0xc2, 0x89, 0x2d, 0xe2, 0x78, 0xf1, 0xd6, 0xe2, + 0x16, 0xa9, 0x6f, 0xcb, 0x4d, 0xc4, 0x7c, 0x04, 0x35, 0x93, 0xd9, 0x2b, 0xed, 0x28, 0x38, 0xab, + 0x1e, 0x7a, 0x13, 0xca, 0xcd, 0xd6, 0xba, 0xe7, 0x46, 0x5b, 0xd7, 0x83, 0x98, 0x3d, 0x75, 0xab, + 0xdc, 0x5f, 0xc2, 0x99, 0x50, 0xf9, 0x47, 0x56, 0x73, 0xf0, 0x70, 0x2e, 0x05, 0xf4, 0x2e, 0x9c, + 0x4c, 0x2d, 0x06, 0x9e, 0x4e, 0x4e, 0x38, 0x1d, 0x3e, 0x91, 0xbd, 0x9d, 0x32, 0x2a, 0x70, 0x17, + 0xd7, 0x4c, 0x10, 0xce, 0x6e, 0xe2, 0xfd, 0x19, 0x40, 0xbc, 0x43, 0x2b, 0x6b, 0xd2, 0x0d, 0xfa, + 0x2c, 0x8c, 0xe8, 0xab, 0x48, 0x1c, 0x30, 0xe7, 0xbb, 0x65, 0x53, 0x17, 0xb2, 0x91, 0x5a, 0x51, + 0x3a, 0x0c, 0x1b, 0x14, 0x6d, 0x02, 0xd9, 0xdf, 0x87, 0xae, 0xc1, 0x50, 0xdd, 0x73, 0x89, 0x1f, + 0xaf, 0x54, 0x3b, 0x39, 0xc1, 0x2f, 0x0a, 0x1c, 0x31, 0x60, 0x22, 0xa6, 0x1b, 0x2f, 0xc3, 0x8a, + 0x82, 0xfd, 0xbb, 0x05, 0x98, 0xe9, 0x12, 0x20, 0x30, 0xa5, 0x03, 0xb4, 0x7a, 0xd2, 0x01, 0xce, + 0xcb, 0x4c, 0x66, 0xd7, 0x53, 0xf7, 0xcf, 0x54, 0x96, 0xb2, 0xe4, 0x16, 0x9a, 0xc6, 0xef, 0xd9, + 0x6e, 0x52, 0x57, 0x23, 0xf6, 0x75, 0xb5, 0xe8, 0x35, 0x9e, 0x0f, 0xfa, 0x7b, 0x97, 0xe8, 0x73, + 0x55, 0xc1, 0xf6, 0xb7, 0x0a, 0x70, 0x52, 0x0d, 0xe1, 0x8f, 0xef, 0xc0, 0xdd, 0x6c, 0x1f, 0xb8, + 0x23, 0x50, 0xa4, 0xdb, 0x37, 0x60, 0xa0, 0xb6, 0x17, 0xd5, 0x63, 0xaf, 0x07, 0x01, 0xe8, 0x31, + 0x63, 0x83, 0x26, 0xc7, 0x34, 0x4b, 0x46, 0x2a, 0xf6, 0xab, 0xfd, 0x57, 0x2c, 0x18, 0x5f, 0x5b, + 0xac, 0xd6, 0x82, 0xfa, 0x36, 0x89, 0xe7, 0xb9, 0x9a, 0x08, 0x0b, 0xf9, 0xc7, 0xba, 0x4f, 0xb9, + 0x26, 0x4b, 0x62, 0x3a, 0x07, 0x7d, 0x5b, 0x41, 0x14, 0xa7, 0x5f, 0xd9, 0xae, 0x04, 0x51, 0x8c, + 0x19, 0xc4, 0xfe, 0x23, 0x0b, 0xfa, 0x59, 0xfe, 0xcd, 0x6e, 0x79, 0x5a, 0x7b, 0xf9, 0x2e, 0xf4, + 0x02, 0x0c, 0x90, 0x8d, 0x0d, 0x52, 0x8f, 0xc5, 0xac, 0x4a, 0xef, 0xba, 0x81, 0x25, 0x56, 0x4a, + 0x0f, 0x7d, 0xd6, 0x18, 0xff, 0x8b, 0x05, 0x32, 0xba, 0x0d, 0xa5, 0xd8, 0xdd, 0x21, 0xf3, 0x8d, + 0x86, 0x78, 0xa7, 0xb8, 0x0f, 0x67, 0xc6, 0x35, 0x49, 0x00, 0x27, 0xb4, 0xec, 0x2f, 0x15, 0x00, + 0x12, 0x0f, 0xdc, 0x6e, 0x9f, 0xb8, 0xd0, 0x96, 0x8a, 0xf6, 0x7c, 0x46, 0x2a, 0x5a, 0x94, 0x10, + 0xcc, 0x48, 0x44, 0xab, 0x86, 0xa9, 0xd8, 0xd3, 0x30, 0xf5, 0x1d, 0x66, 0x98, 0x16, 0x61, 0x32, + 0xf1, 0x20, 0x36, 0xc3, 0x29, 0xb0, 0xe0, 0xe0, 0x6b, 0x69, 0x20, 0x6e, 0xc7, 0xb7, 0xbf, 0x60, + 0x81, 0x70, 0x37, 0xe8, 0x61, 0x31, 0xbf, 0x21, 0xb3, 0x46, 0x1a, 0x71, 0x46, 0xcf, 0xe5, 0xfb, + 0x5f, 0x88, 0xe8, 0xa2, 0xea, 0xf0, 0x30, 0x62, 0x8a, 0x1a, 0xb4, 0xec, 0x06, 0x08, 0x68, 0x85, + 0x30, 0x25, 0x43, 0xf7, 0xde, 0x5c, 0x04, 0x68, 0x30, 0x5c, 0x2d, 0x0b, 0x9d, 0x62, 0x55, 0x15, + 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x37, 0x0b, 0x30, 0x2c, 0xe3, 0x5a, 0xd2, 0x7b, 0x7c, 0xf7, 0x56, + 0x0e, 0x15, 0xc0, 0x9e, 0xa5, 0x6d, 0xa4, 0x84, 0x55, 0x9c, 0x73, 0x3d, 0x6d, 0xa3, 0x04, 0xe0, + 0x04, 0x07, 0x3d, 0x01, 0x83, 0x51, 0x6b, 0x9d, 0xa1, 0xa7, 0x8c, 0xe8, 0x6b, 0xbc, 0x18, 0x4b, + 0x38, 0xfa, 0x34, 0x4c, 0xf0, 0x7a, 0x61, 0xd0, 0x74, 0x36, 0xb9, 0x06, 0xa9, 0x5f, 0x79, 0xb5, + 0x4d, 0xac, 0xa6, 0x60, 0x07, 0xfb, 0x33, 0x53, 0xe9, 0x32, 0xa6, 0x7b, 0x6c, 0xa3, 0x42, 0xf7, + 0xc5, 0x44, 0xda, 0x61, 0x06, 0x5d, 0x81, 0x01, 0xce, 0xf2, 0x04, 0x0b, 0xea, 0xf0, 0xa2, 0xa4, + 0xb9, 0xd9, 0xb0, 0xd8, 0xde, 0x82, 0x6b, 0x8a, 0xfa, 0xe8, 0x4d, 0x18, 0x6e, 0x04, 0x77, 0xfc, + 0x3b, 0x4e, 0xd8, 0x98, 0xaf, 0xae, 0x88, 0x55, 0x93, 0x29, 0x39, 0x55, 0x12, 0x34, 0xdd, 0x75, + 0x87, 0x69, 0x4f, 0x13, 0x10, 0xd6, 0xc9, 0xa1, 0x35, 0x16, 0x94, 0x89, 0xe7, 0x55, 0xef, 0x64, + 0x75, 0xa6, 0x52, 0xb1, 0x6b, 0x94, 0x47, 0x45, 0xe4, 0x26, 0x91, 0x95, 0x3d, 0x21, 0x64, 0xbf, + 0x77, 0x02, 0x8c, 0xd5, 0x6a, 0x04, 0xb0, 0xb7, 0x8e, 0x28, 0x80, 0x3d, 0x86, 0x21, 0xb2, 0xd3, + 0x8c, 0xf7, 0x2a, 0x6e, 0xd8, 0x29, 0x03, 0xca, 0x92, 0xc0, 0x69, 0xa7, 0x29, 0x21, 0x58, 0xd1, + 0xc9, 0xce, 0x32, 0x50, 0xfc, 0x00, 0xb3, 0x0c, 0xf4, 0x1d, 0x63, 0x96, 0x81, 0xeb, 0x30, 0xb8, + 0xe9, 0xc6, 0x98, 0x34, 0x03, 0x71, 0xdc, 0x67, 0xae, 0x84, 0xcb, 0x1c, 0xa5, 0x3d, 0xee, 0xb5, + 0x00, 0x60, 0x49, 0x04, 0xbd, 0xaa, 0xf6, 0xc0, 0x40, 0xbe, 0xb4, 0xdc, 0xfe, 0xf8, 0x90, 0xb9, + 0x0b, 0x44, 0x56, 0x81, 0xc1, 0xfb, 0xcd, 0x2a, 0xa0, 0x72, 0x01, 0x0c, 0xbd, 0xbf, 0x5c, 0x00, + 0x46, 0xd6, 0x84, 0xd2, 0xd1, 0x65, 0x4d, 0xf8, 0x82, 0x05, 0x27, 0x9b, 0x59, 0x09, 0x44, 0x44, + 0x54, 0xff, 0x17, 0x7a, 0xce, 0x90, 0x62, 0x34, 0xc8, 0xae, 0x4d, 0x99, 0x68, 0x38, 0xbb, 0x39, + 0x3a, 0xd0, 0xe1, 0x7a, 0x43, 0xa4, 0x02, 0x78, 0x2c, 0x27, 0xfd, 0x42, 0x87, 0xa4, 0x0b, 0x0f, + 0x26, 0xfc, 0x7f, 0x92, 0x82, 0x61, 0xf4, 0x7d, 0xa7, 0x60, 0x78, 0x55, 0xa5, 0x60, 0xe8, 0x10, + 0xfa, 0x86, 0x27, 0x58, 0xe8, 0x9a, 0x78, 0x41, 0x4b, 0x9e, 0x30, 0x7e, 0x14, 0xc9, 0x13, 0xde, + 0x32, 0x99, 0x3d, 0x8f, 0xe4, 0xff, 0x54, 0x17, 0x66, 0x6f, 0xd0, 0xed, 0xcc, 0xee, 0x79, 0xa2, + 0x88, 0xc9, 0xfb, 0x4a, 0x14, 0x71, 0x4b, 0x4f, 0xc1, 0x80, 0xba, 0xe4, 0x18, 0xa0, 0x48, 0x3d, + 0x26, 0x5e, 0xb8, 0xa5, 0x1f, 0x41, 0x27, 0xf2, 0xe9, 0xaa, 0x93, 0xa6, 0x9d, 0x6e, 0xd6, 0x21, + 0xd4, 0x9e, 0xd0, 0x61, 0xea, 0x78, 0x12, 0x3a, 0x9c, 0x3c, 0xf2, 0x84, 0x0e, 0xa7, 0x8e, 0x21, + 0xa1, 0xc3, 0x43, 0x1f, 0x68, 0x42, 0x87, 0xf2, 0x03, 0x48, 0xe8, 0x70, 0x3d, 0x49, 0xe8, 0x70, + 0x3a, 0x7f, 0x4a, 0x32, 0xac, 0xd2, 0x72, 0xd2, 0x38, 0xdc, 0x82, 0x52, 0x53, 0xfa, 0x54, 0x97, + 0xa7, 0xf3, 0xa7, 0x24, 0xd3, 0xf1, 0x9a, 0x4f, 0x89, 0x02, 0xe1, 0x84, 0x14, 0xa5, 0x9b, 0xa4, + 0x75, 0x78, 0xb8, 0x83, 0x62, 0x2c, 0x4b, 0xe5, 0x90, 0x9f, 0xcc, 0xc1, 0xfe, 0xab, 0x05, 0x38, + 0xdb, 0x79, 0x5d, 0x27, 0xfa, 0x8a, 0x6a, 0xa2, 0x5f, 0x4f, 0xe9, 0x2b, 0xf8, 0x25, 0x20, 0xc1, + 0xea, 0x39, 0xf0, 0xc4, 0x65, 0x98, 0x54, 0xe6, 0x68, 0x9e, 0x5b, 0xdf, 0xd3, 0xb2, 0xc9, 0x29, + 0xd7, 0x98, 0x5a, 0x1a, 0x01, 0xb7, 0xd7, 0x41, 0xf3, 0x30, 0x6e, 0x14, 0xae, 0x54, 0x84, 0xb0, + 0xaf, 0x14, 0x24, 0x35, 0x13, 0x8c, 0xd3, 0xf8, 0xf6, 0x57, 0x2d, 0x78, 0x28, 0x27, 0x92, 0x72, + 0xcf, 0x71, 0x15, 0x36, 0x60, 0xbc, 0x69, 0x56, 0xed, 0x12, 0x7e, 0xc5, 0x88, 0xd7, 0xac, 0xfa, + 0x9a, 0x02, 0xe0, 0x34, 0xd1, 0x85, 0x0b, 0xdf, 0xfe, 0xfe, 0xd9, 0x8f, 0xfc, 0xc1, 0xf7, 0xcf, + 0x7e, 0xe4, 0x7b, 0xdf, 0x3f, 0xfb, 0x91, 0xbf, 0x78, 0xef, 0xac, 0xf5, 0xed, 0x7b, 0x67, 0xad, + 0x3f, 0xb8, 0x77, 0xd6, 0xfa, 0xde, 0xbd, 0xb3, 0xd6, 0x1f, 0xdf, 0x3b, 0x6b, 0x7d, 0xe9, 0x07, + 0x67, 0x3f, 0xf2, 0x46, 0x61, 0xf7, 0xd9, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x27, 0x25, + 0xe4, 0x89, 0xd7, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index fb2495f4cf2..6538c439cc7 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -533,6 +533,13 @@ message Container { // +patchStrategy=merge repeated VolumeMount volumeMounts = 9; + // volumeDevices is the list of block devices to be used by the container. + // This is an alpha feature and may change in the future. + // +patchMergeKey=devicePath + // +patchStrategy=merge + // +optional + repeated VolumeDevice volumeDevices = 21; + // Periodic probe of container liveness. // Container will be restarted if the probe fails. // Cannot be updated. @@ -2219,6 +2226,12 @@ message PersistentVolumeClaimSpec { // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 // +optional optional string storageClassName = 5; + + // volumeMode defines what type of volume is required by the claim. + // Value of Filesystem is implied when not included in claim spec. + // This is an alpha feature and may change in the future. + // +optional + optional string volumeMode = 6; } // PersistentVolumeClaimStatus is the current status of a persistent volume claim. @@ -2418,6 +2431,12 @@ message PersistentVolumeSpec { // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options // +optional repeated string mountOptions = 7; + + // volumeMode defines if a volume is intended to be used with a formatted filesystem + // or to remain in raw block state. Value of Filesystem is implied when not included in spec. + // This is an alpha feature and may change in the future. + // +optional + optional string volumeMode = 8; } // PersistentVolumeStatus is the current status of a persistent volume. @@ -4205,6 +4224,15 @@ message Volume { optional VolumeSource volumeSource = 2; } +// volumeDevice describes a mapping of a raw block device within a container. +message VolumeDevice { + // name must match the name of a persistentVolumeClaim in the pod + optional string name = 1; + + // devicePath is the path inside of the container that the device will be mapped to. + optional string devicePath = 2; +} + // VolumeMount describes a mounting of a Volume within a container. message VolumeMount { // This must match the Name of a Volume. diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 55443c47e90..a8a22855219 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -289,6 +289,7 @@ var map_Container = map[string]string{ "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", + "volumeDevices": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.", "livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", "readinessProbe": "Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", "lifecycle": "Actions that the management system should take in response to container lifecycle events. Cannot be updated.", @@ -1162,6 +1163,7 @@ var map_PersistentVolumeClaimSpec = map[string]string{ "resources": "Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources", "volumeName": "VolumeName is the binding reference to the PersistentVolume backing this claim.", "storageClassName": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", + "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.", } func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { @@ -1238,6 +1240,7 @@ var map_PersistentVolumeSpec = map[string]string{ "persistentVolumeReclaimPolicy": "What happens to a persistent volume when released from its claim. Valid options are Retain (default) and Recycle. Recycling must be supported by the volume plugin underlying this persistent volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming", "storageClassName": "Name of StorageClass to which this persistent volume belongs. Empty value means that this volume does not belong to any StorageClass.", "mountOptions": "A list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options", + "volumeMode": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec. This is an alpha feature and may change in the future.", } func (PersistentVolumeSpec) SwaggerDoc() map[string]string { @@ -2077,6 +2080,16 @@ func (Volume) SwaggerDoc() map[string]string { return map_Volume } +var map_VolumeDevice = map[string]string{ + "": "volumeDevice describes a mapping of a raw block device within a container.", + "name": "name must match the name of a persistentVolumeClaim in the pod", + "devicePath": "devicePath is the path inside of the container that the device will be mapped to.", +} + +func (VolumeDevice) SwaggerDoc() map[string]string { + return map_VolumeDevice +} + var map_VolumeMount = map[string]string{ "": "VolumeMount describes a mounting of a Volume within a container.", "name": "This must match the Name of a Volume.", diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index cc7f4d85865..7b169d6e5fd 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -706,6 +706,11 @@ func (in *Container) DeepCopyInto(out *Container) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.VolumeDevices != nil { + in, out := &in.VolumeDevices, &out.VolumeDevices + *out = make([]VolumeDevice, len(*in)) + copy(*out, *in) + } if in.LivenessProbe != nil { in, out := &in.LivenessProbe, &out.LivenessProbe if *in == nil { @@ -2871,6 +2876,15 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec **out = **in } } + if in.VolumeMode != nil { + in, out := &in.VolumeMode, &out.VolumeMode + if *in == nil { + *out = nil + } else { + *out = new(PersistentVolumeMode) + **out = **in + } + } return } @@ -3213,6 +3227,15 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.VolumeMode != nil { + in, out := &in.VolumeMode, &out.VolumeMode + if *in == nil { + *out = nil + } else { + *out = new(PersistentVolumeMode) + **out = **in + } + } return } @@ -5322,6 +5345,22 @@ func (in *Volume) DeepCopy() *Volume { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeDevice) DeepCopyInto(out *VolumeDevice) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeDevice. +func (in *VolumeDevice) DeepCopy() *VolumeDevice { + if in == nil { + return nil + } + out := new(VolumeDevice) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VolumeMount) DeepCopyInto(out *VolumeMount) { *out = *in