Merge pull request #130135 from saschagrunert/image-volume-beta

[KEP-4639] Graduate image volume sources to beta
This commit is contained in:
Kubernetes Prow Robot 2025-03-12 18:03:58 -07:00 committed by GitHub
commit 7b6c56e5fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 770 additions and 518 deletions

View File

@ -11919,7 +11919,7 @@
},
"image": {
"$ref": "#/definitions/io.k8s.api.core.v1.ImageVolumeSource",
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
},
"iscsi": {
"$ref": "#/definitions/io.k8s.api.core.v1.ISCSIVolumeSource",

View File

@ -8256,7 +8256,7 @@
"$ref": "#/components/schemas/io.k8s.api.core.v1.ImageVolumeSource"
}
],
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
},
"iscsi": {
"allOf": [

View File

@ -5073,7 +5073,7 @@
"$ref": "#/components/schemas/io.k8s.api.core.v1.ImageVolumeSource"
}
],
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
},
"iscsi": {
"allOf": [

View File

@ -4265,7 +4265,7 @@
"$ref": "#/components/schemas/io.k8s.api.core.v1.ImageVolumeSource"
}
],
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
"description": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type."
},
"iscsi": {
"allOf": [

View File

@ -220,7 +220,7 @@ type VolumeSource struct {
// The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
// The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
// The volume will be mounted read-only (ro) and non-executable files (noexec).
// Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath).
// Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
// The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
// +featureGate=ImageVolume
// +optional

View File

@ -2946,16 +2946,6 @@ func ValidateVolumeMounts(mounts []core.VolumeMount, voldevices map[string]strin
allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must not already exist as a path in volumeDevices"))
}
// Disallow subPath/subPathExpr for image volumes
if v, ok := volumes[mnt.Name]; ok && v.Image != nil {
if len(mnt.SubPath) != 0 {
allErrs = append(allErrs, field.Invalid(idxPath.Child("subPath"), mnt.SubPath, "not allowed in image volume sources"))
}
if len(mnt.SubPathExpr) != 0 {
allErrs = append(allErrs, field.Invalid(idxPath.Child("subPathExpr"), mnt.SubPathExpr, "not allowed in image volume sources"))
}
}
if len(mnt.SubPath) > 0 {
allErrs = append(allErrs, validateLocalDescendingPath(mnt.SubPath, fldPath.Child("subPath"))...)
}

View File

@ -7136,6 +7136,8 @@ func TestValidateVolumeMounts(t *testing.T) {
{Name: "123", MountPath: "/rro-enabled", ReadOnly: true, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyEnabled)},
{Name: "123", MountPath: "/rro-enabled-2", ReadOnly: true, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyEnabled), MountPropagation: ptr.To(core.MountPropagationNone)},
{Name: "image-volume", MountPath: "/image-volume"},
{Name: "image-volume", MountPath: "/image-volume-1", SubPath: "foo"},
{Name: "image-volume", MountPath: "/image-volume-2", SubPathExpr: "$(POD_NAME)"},
}
goodVolumeDevices := []core.VolumeDevice{
{Name: "xyz", DevicePath: "/foofoo"},
@ -7146,23 +7148,22 @@ func TestValidateVolumeMounts(t *testing.T) {
}
errorCases := map[string][]core.VolumeMount{
"empty name": {{Name: "", MountPath: "/foo"}},
"name not found": {{Name: "", MountPath: "/foo"}},
"empty mountpath": {{Name: "abc", MountPath: ""}},
"mountpath collision": {{Name: "foo", MountPath: "/path/a"}, {Name: "bar", MountPath: "/path/a"}},
"absolute subpath": {{Name: "abc", MountPath: "/bar", SubPath: "/baz"}},
"subpath in ..": {{Name: "abc", MountPath: "/bar", SubPath: "../baz"}},
"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"}},
"rro but not ro": {{Name: "123", MountPath: "/rro-bad1", ReadOnly: false, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyEnabled)}},
"rro with incompatible propagation": {{Name: "123", MountPath: "/rro-bad2", ReadOnly: true, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyEnabled), MountPropagation: ptr.To(core.MountPropagationHostToContainer)}},
"rro-if-possible but not ro": {{Name: "123", MountPath: "/rro-bad1", ReadOnly: false, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyIfPossible)}},
"subPath not allowed for image volume sources": {{Name: "image-volume", MountPath: "/image-volume-err-1", SubPath: "/foo"}},
"subPathExpr not allowed for image volume sources": {{Name: "image-volume", MountPath: "/image-volume-err-2", SubPathExpr: "$(POD_NAME)"}},
"empty name": {{Name: "", MountPath: "/foo"}},
"name not found": {{Name: "", MountPath: "/foo"}},
"empty mountpath": {{Name: "abc", MountPath: ""}},
"mountpath collision": {{Name: "foo", MountPath: "/path/a"}, {Name: "bar", MountPath: "/path/a"}},
"absolute subpath": {{Name: "abc", MountPath: "/bar", SubPath: "/baz"}},
"subpath in ..": {{Name: "abc", MountPath: "/bar", SubPath: "../baz"}},
"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"}},
"rro but not ro": {{Name: "123", MountPath: "/rro-bad1", ReadOnly: false, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyEnabled)}},
"rro with incompatible propagation": {{Name: "123", MountPath: "/rro-bad2", ReadOnly: true, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyEnabled), MountPropagation: ptr.To(core.MountPropagationHostToContainer)}},
"rro-if-possible but not ro": {{Name: "123", MountPath: "/rro-bad1", ReadOnly: false, RecursiveReadOnly: ptr.To(core.RecursiveReadOnlyIfPossible)}},
"subPath for image volume sources should be relative": {{Name: "image-volume", MountPath: "/image-volume-err-1", SubPath: "/foo"}},
}
badVolumeDevice := []core.VolumeDevice{
{Name: "xyz", DevicePath: "/mnt/exists"},

View File

@ -385,6 +385,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
ImageVolume: {
{Version: version.MustParse("1.31"), Default: false, PreRelease: featuregate.Alpha},
{Version: version.MustParse("1.33"), Default: false, PreRelease: featuregate.Beta},
},
InPlacePodVerticalScaling: {

View File

@ -32699,7 +32699,7 @@ func schema_k8sio_api_core_v1_Volume(ref common.ReferenceCallback) common.OpenAP
},
"image": {
SchemaProps: spec.SchemaProps{
Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
Ref: ref("k8s.io/api/core/v1.ImageVolumeSource"),
},
},
@ -33144,7 +33144,7 @@ func schema_k8sio_api_core_v1_VolumeSource(ref common.ReferenceCallback) common.
},
"image": {
SchemaProps: spec.SchemaProps{
Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
Description: "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
Ref: ref("k8s.io/api/core/v1.ImageVolumeSource"),
},
},

View File

@ -472,6 +472,9 @@ type Mount struct {
Propagation runtimeapi.MountPropagation
// Image is set if an OCI volume as image ID or digest should get mounted (special case).
Image *runtimeapi.ImageSpec
// ImageSubPath is set if an image volume sub path should get mounted. This
// field is only required if the above Image is set.
ImageSubPath string
}
// ImageVolumes is a map of image specs by volume name.

View File

@ -284,13 +284,34 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
}
var (
hostPath string
image *runtimeapi.ImageSpec
err error
hostPath string
image *runtimeapi.ImageSpec
imageSubPath string
err error
)
subPath := mount.SubPath
if mount.SubPathExpr != "" {
subPath, err = kubecontainer.ExpandContainerVolumeMounts(mount, expandEnvs)
if err != nil {
return nil, cleanupAction, err
}
}
if subPath != "" {
if utilfs.IsAbs(subPath) {
return nil, cleanupAction, fmt.Errorf("error SubPath `%s` must not be an absolute path", subPath)
}
if err := volumevalidation.ValidatePathNoBacksteps(subPath); err != nil {
return nil, cleanupAction, fmt.Errorf("unable to provision SubPath `%s`: %w", subPath, err)
}
}
if imageVolumes != nil && utilfeature.DefaultFeatureGate.Enabled(features.ImageVolume) {
image = imageVolumes[mount.Name]
imageSubPath = subPath
}
if image == nil {
@ -299,25 +320,7 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
return nil, cleanupAction, err
}
subPath := mount.SubPath
if mount.SubPathExpr != "" {
subPath, err = kubecontainer.ExpandContainerVolumeMounts(mount, expandEnvs)
if err != nil {
return nil, cleanupAction, err
}
}
if subPath != "" {
if utilfs.IsAbs(subPath) {
return nil, cleanupAction, fmt.Errorf("error SubPath `%s` must not be an absolute path", subPath)
}
err = volumevalidation.ValidatePathNoBacksteps(subPath)
if err != nil {
return nil, cleanupAction, fmt.Errorf("unable to provision SubPath `%s`: %w", subPath, err)
}
volumePath := hostPath
hostPath = filepath.Join(volumePath, subPath)
@ -386,6 +389,7 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
ContainerPath: containerPath,
HostPath: hostPath,
Image: image,
ImageSubPath: imageSubPath,
ReadOnly: mount.ReadOnly || mustMountRO,
RecursiveReadOnly: rro,
SELinuxRelabel: relabelVolume,

View File

@ -455,6 +455,7 @@ func (m *kubeGenericRuntimeManager) makeMounts(opts *kubecontainer.RunContainerO
Propagation: v.Propagation,
RecursiveReadOnly: v.RecursiveReadOnly,
Image: v.Image,
ImageSubPath: v.ImageSubPath,
}
volumeMounts = append(volumeMounts, mount)
@ -680,6 +681,7 @@ func toKubeContainerStatus(status *runtimeapi.ContainerStatus, runtimeName strin
SELinuxRelabel: mount.SelinuxRelabel,
Propagation: mount.Propagation,
Image: mount.Image,
ImageSubPath: mount.ImageSubPath,
})
}
return cStatus

View File

@ -23,6 +23,7 @@ import (
"os"
"path/filepath"
"sort"
"strings"
"time"
cadvisorapi "github.com/google/cadvisor/info/v1"
@ -1297,7 +1298,9 @@ func (m *kubeGenericRuntimeManager) SyncPod(ctx context.Context, pod *v1.Pod, po
}
// NOTE (aramase) podIPs are populated for single stack and dual stack clusters. Send only podIPs.
if msg, err := m.startContainer(ctx, podSandboxID, podSandboxConfig, spec, pod, podStatus, pullSecrets, podIP, podIPs, imageVolumes); err != nil {
msg, err = m.startContainer(ctx, podSandboxID, podSandboxConfig, spec, pod, podStatus, pullSecrets, podIP, podIPs, imageVolumes)
incrementImageVolumeMetrics(err, msg, spec.container, imageVolumes)
if err != nil {
// startContainer() returns well-defined error codes that have reasonable cardinality for metrics and are
// useful to cluster administrators to distinguish "server errors" from "user errors".
metrics.StartedContainersErrorsTotal.WithLabelValues(metricLabel, err.Error()).Inc()
@ -1374,6 +1377,27 @@ func (m *kubeGenericRuntimeManager) SyncPod(ctx context.Context, pod *v1.Pod, po
return
}
// incrementImageVolumeMetrics increments the image volume mount metrics
// depending on the provided error and the usage of the image volume mount
// within the container.
func incrementImageVolumeMetrics(err error, msg string, container *v1.Container, imageVolumes kubecontainer.ImageVolumes) {
if !utilfeature.DefaultFeatureGate.Enabled(features.ImageVolume) {
return
}
metrics.ImageVolumeRequestedTotal.Add(float64(len(imageVolumes)))
for _, m := range container.VolumeMounts {
if _, exists := imageVolumes[m.Name]; exists {
if errors.Is(err, ErrCreateContainer) && strings.HasPrefix(msg, crierror.ErrImageVolumeMountFailed.Error()) {
metrics.ImageVolumeMountedErrorsTotal.Inc()
} else {
metrics.ImageVolumeMountedSucceedTotal.Inc()
}
}
}
}
// imageVolumePulls are the pull results for each image volume name.
type imageVolumePulls = map[string]imageVolumePullResult

View File

@ -24,6 +24,7 @@ import (
"reflect"
goruntime "runtime"
"sort"
"strings"
"testing"
"time"
@ -43,8 +44,10 @@ import (
utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/client-go/util/flowcontrol"
featuregatetesting "k8s.io/component-base/featuregate/testing"
"k8s.io/component-base/metrics/testutil"
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
apitest "k8s.io/cri-api/pkg/apis/testing"
crierror "k8s.io/cri-api/pkg/errors"
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
"k8s.io/kubernetes/pkg/credentialprovider"
"k8s.io/kubernetes/pkg/features"
@ -53,6 +56,7 @@ import (
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
imagetypes "k8s.io/kubernetes/pkg/kubelet/images"
"k8s.io/kubernetes/pkg/kubelet/metrics"
proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results"
kubelettypes "k8s.io/kubernetes/pkg/kubelet/types"
"k8s.io/utils/ptr"
@ -3372,3 +3376,124 @@ func TestDoPodResizeAction(t *testing.T) {
})
}
}
func TestIncrementImageVolumeMetrics(t *testing.T) {
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ImageVolume, true)
metrics.Register()
testCases := map[string]struct {
err error
msg string
volumeMounts []v1.VolumeMount
imageVolumes kubecontainer.ImageVolumes
wants string
}{
"without error": {
volumeMounts: []v1.VolumeMount{
{Name: "mount1"},
{Name: "mount2"},
},
imageVolumes: kubecontainer.ImageVolumes{
"mount1": {Image: "image1"},
"mount2": {Image: "image2"},
"mount3": {Image: "image3"},
},
wants: `
# HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
# TYPE kubelet_image_volume_mounted_errors_total counter
kubelet_image_volume_mounted_errors_total 0
# HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
# TYPE kubelet_image_volume_mounted_succeed_total counter
kubelet_image_volume_mounted_succeed_total 2
# HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
# TYPE kubelet_image_volume_requested_total counter
kubelet_image_volume_requested_total 3
`,
},
"with error": {
err: ErrCreateContainer,
msg: crierror.ErrImageVolumeMountFailed.Error(),
volumeMounts: []v1.VolumeMount{
{Name: "mount1"},
{Name: "mount2"},
},
imageVolumes: kubecontainer.ImageVolumes{
"mount1": {Image: "image1"},
"mount2": {Image: "image2"},
"mount3": {Image: "image3"},
},
wants: `
# HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
# TYPE kubelet_image_volume_mounted_errors_total counter
kubelet_image_volume_mounted_errors_total 2
# HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
# TYPE kubelet_image_volume_mounted_succeed_total counter
kubelet_image_volume_mounted_succeed_total 0
# HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
# TYPE kubelet_image_volume_requested_total counter
kubelet_image_volume_requested_total 3
`,
},
"with unknown CRI error from message": {
err: ErrCreateContainer,
msg: "",
volumeMounts: []v1.VolumeMount{
{Name: "mount1"},
{Name: "mount2"},
},
imageVolumes: kubecontainer.ImageVolumes{
"mount1": {Image: "image1"},
"mount2": {Image: "image2"},
"mount3": {Image: "image3"},
},
wants: `
# HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
# TYPE kubelet_image_volume_mounted_errors_total counter
kubelet_image_volume_mounted_errors_total 0
# HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
# TYPE kubelet_image_volume_mounted_succeed_total counter
kubelet_image_volume_mounted_succeed_total 2
# HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
# TYPE kubelet_image_volume_requested_total counter
kubelet_image_volume_requested_total 3
`,
},
"without used volume": {
volumeMounts: []v1.VolumeMount{
{Name: "mount1"},
},
imageVolumes: kubecontainer.ImageVolumes{},
wants: `
# HELP kubelet_image_volume_mounted_errors_total [ALPHA] Number of failed image volume mounts.
# TYPE kubelet_image_volume_mounted_errors_total counter
kubelet_image_volume_mounted_errors_total 0
# HELP kubelet_image_volume_mounted_succeed_total [ALPHA] Number of successful image volume mounts.
# TYPE kubelet_image_volume_mounted_succeed_total counter
kubelet_image_volume_mounted_succeed_total 0
# HELP kubelet_image_volume_requested_total [ALPHA] Number of requested image volumes.
# TYPE kubelet_image_volume_requested_total counter
kubelet_image_volume_requested_total 0
`,
},
}
// Run tests.
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
metrics.ImageVolumeRequestedTotal.Reset()
metrics.ImageVolumeMountedErrorsTotal.Reset()
metrics.ImageVolumeMountedSucceedTotal.Reset()
// Call the function.
incrementImageVolumeMetrics(tc.err, tc.msg, &v1.Container{VolumeMounts: tc.volumeMounts}, tc.imageVolumes)
if err := testutil.GatherAndCompare(metrics.GetGather(), strings.NewReader(tc.wants),
"kubelet_"+metrics.ImageVolumeRequestedTotalKey,
"kubelet_"+metrics.ImageVolumeMountedSucceedTotalKey,
"kubelet_"+metrics.ImageVolumeMountedErrorsTotalKey,
); err != nil {
t.Error(err)
}
})
}
}

View File

@ -153,6 +153,11 @@ const (
// Metrics to track kubelet admission rejections.
AdmissionRejectionsTotalKey = "admission_rejections_total"
// Image Volume metrics
ImageVolumeRequestedTotalKey = "image_volume_requested_total"
ImageVolumeMountedSucceedTotalKey = "image_volume_mounted_succeed_total"
ImageVolumeMountedErrorsTotalKey = "image_volume_mounted_errors_total"
)
type imageSizeBucket struct {
@ -1020,6 +1025,36 @@ var (
},
[]string{"reason"},
)
// ImageVolumeRequestedTotal trakcs the number of requested image volumes.
ImageVolumeRequestedTotal = metrics.NewCounter(
&metrics.CounterOpts{
Subsystem: KubeletSubsystem,
Name: ImageVolumeRequestedTotalKey,
Help: "Number of requested image volumes.",
StabilityLevel: metrics.ALPHA,
},
)
// ImageVolumeMountedSucceedTotal tracks the number of successful image volume mounts.
ImageVolumeMountedSucceedTotal = metrics.NewCounter(
&metrics.CounterOpts{
Subsystem: KubeletSubsystem,
Name: ImageVolumeMountedSucceedTotalKey,
Help: "Number of successful image volume mounts.",
StabilityLevel: metrics.ALPHA,
},
)
// ImageVolumeMountedErrorsTotal tracks the number of failed image volume mounts.
ImageVolumeMountedErrorsTotal = metrics.NewCounter(
&metrics.CounterOpts{
Subsystem: KubeletSubsystem,
Name: ImageVolumeMountedErrorsTotalKey,
Help: "Number of failed image volume mounts.",
StabilityLevel: metrics.ALPHA,
},
)
)
var registerMetrics sync.Once
@ -1120,6 +1155,12 @@ func Register(collectors ...metrics.StableCollector) {
}
legacyregistry.MustRegister(AdmissionRejectionsTotal)
if utilfeature.DefaultFeatureGate.Enabled(features.ImageVolume) {
legacyregistry.MustRegister(ImageVolumeRequestedTotal)
legacyregistry.MustRegister(ImageVolumeMountedSucceedTotal)
legacyregistry.MustRegister(ImageVolumeMountedErrorsTotal)
}
})
}

View File

@ -6875,7 +6875,7 @@ message VolumeSource {
// The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
// The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
// The volume will be mounted read-only (ro) and non-executable files (noexec).
// Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath).
// Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
// The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
// +featureGate=ImageVolume
// +optional

View File

@ -217,7 +217,7 @@ type VolumeSource struct {
// The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
// The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
// The volume will be mounted read-only (ro) and non-executable files (noexec).
// Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath).
// Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
// The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
// +featureGate=ImageVolume
// +optional

View File

@ -2762,7 +2762,7 @@ var map_VolumeSource = map[string]string{
"storageos": "storageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. Deprecated: StorageOS is deprecated and the in-tree storageos type is no longer supported.",
"csi": "csi (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers.",
"ephemeral": "ephemeral represents a volume that is handled by a cluster storage driver. The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed.\n\nUse this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity\n tracking are needed,\nc) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through\n a PersistentVolumeClaim (see EphemeralVolumeSource for more\n information on the connection between this volume type\n and PersistentVolumeClaim).\n\nUse PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod.\n\nUse CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information.\n\nA pod can use both types of ephemeral volumes and persistent volumes at the same time.",
"image": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath). The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
"image": "image represents an OCI object (a container image or artifact) pulled and mounted on the kubelet's host machine. The volume is resolved at pod startup depending on which PullPolicy value is provided:\n\n- Always: the kubelet always attempts to pull the reference. Container creation will fail If the pull fails. - Never: the kubelet never pulls the reference and only uses a local image or artifact. Container creation will fail if the reference isn't present. - IfNotPresent: the kubelet pulls if the reference isn't already present on disk. Container creation will fail if the reference isn't present and the pull fails.\n\nThe volume gets re-resolved if the pod gets deleted and recreated, which means that new remote content will become available on pod recreation. A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message. The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field. The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images. The volume will be mounted read-only (ro) and non-executable files (noexec). Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33. The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.",
}
func (VolumeSource) SwaggerDoc() map[string]string {

View File

@ -663,15 +663,21 @@ type Mount struct {
RecursiveReadOnly bool `protobuf:"varint,8,opt,name=recursive_read_only,json=recursiveReadOnly,proto3" json:"recursive_read_only,omitempty"`
// Mount an image reference (image ID, with or without digest), which is a
// special use case for image volume mounts. If this field is set, then
// host_path should be unset. All OCI mounts are per feature definition
// readonly. The kubelet does an PullImage RPC and evaluates the returned
// host_path should be unset. All image mounts are per feature definition
// readonly (noexec). The kubelet does an PullImage RPC and evaluates the returned
// PullImageResponse.image_ref value, which is then set to the
// ImageSpec.image field. Runtimes are expected to mount the image as
// required.
// Introduced in the OCI Volume Source KEP: https://kep.k8s.io/4639
Image *ImageSpec `protobuf:"bytes,9,opt,name=image,proto3" json:"image,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"`
// Introduced in the Image Volume Source KEP: https://kep.k8s.io/4639
Image *ImageSpec `protobuf:"bytes,9,opt,name=image,proto3" json:"image,omitempty"`
// Specific image sub path to be used from inside the image instead of its
// root, only necessary if the above image field is set. If the sub path is
// not empty and does not exist in the image, then runtimes should fail and
// return an error.
// Introduced in the Image Volume Source KEP beta graduation: https://kep.k8s.io/4639
ImageSubPath string `protobuf:"bytes,10,opt,name=image_sub_path,json=imageSubPath,proto3" json:"image_sub_path,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Mount) Reset() { *m = Mount{} }
@ -769,6 +775,13 @@ func (m *Mount) GetImage() *ImageSpec {
return nil
}
func (m *Mount) GetImageSubPath() string {
if m != nil {
return m.ImageSubPath
}
return ""
}
// IDMapping describes host to container ID mappings for a pod sandbox.
type IDMapping struct {
// HostId is the id on the host.
@ -10519,13 +10532,13 @@ func init() {
func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) }
var fileDescriptor_00212fb1f9d3bf1c = []byte{
// 7180 bytes of a gzipped FileDescriptorProto
// 7202 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7d, 0x5d, 0x6c, 0x1c, 0xc9,
0x75, 0x2e, 0x7b, 0x66, 0x48, 0xce, 0x1c, 0x72, 0xc8, 0x61, 0x89, 0x22, 0xa9, 0x91, 0x44, 0x49,
0xbd, 0x7f, 0x92, 0x76, 0xf5, 0xb3, 0x5a, 0xed, 0xae, 0xa4, 0xd5, 0xee, 0x6a, 0x44, 0x52, 0xd2,
0xac, 0x45, 0x72, 0xdc, 0x43, 0xae, 0xbd, 0xeb, 0x0b, 0xf7, 0x6d, 0x4d, 0x17, 0x87, 0xbd, 0x9a,
0xe9, 0x6e, 0x77, 0xf7, 0x48, 0xa2, 0x1f, 0x2e, 0xee, 0xd3, 0xc5, 0x8d, 0x9f, 0x0c, 0x24, 0x46,
0x10, 0x23, 0x88, 0xe1, 0x00, 0xf9, 0x79, 0x4b, 0x62, 0x20, 0x8e, 0x83, 0x04, 0x08, 0x10, 0x24,
0x10, 0x23, 0x48, 0xe0, 0x00, 0xf9, 0x79, 0x4b, 0x62, 0x20, 0x8e, 0x83, 0x04, 0x08, 0x10, 0xc4,
0x86, 0x13, 0x20, 0x40, 0x1e, 0x12, 0xc0, 0x6f, 0xb1, 0x37, 0x01, 0x02, 0xe4, 0xd9, 0x0f, 0x79,
0x8a, 0x83, 0xfa, 0xeb, 0xee, 0xea, 0x9f, 0x99, 0x21, 0x77, 0xb3, 0xbb, 0x7e, 0xe2, 0x74, 0xd5,
0x39, 0xa7, 0xaa, 0x4e, 0x9d, 0x3a, 0x75, 0xaa, 0xea, 0xab, 0x22, 0x54, 0x0c, 0xd7, 0xba, 0xec,
@ -10533,7 +10546,7 @@ var fileDescriptor_00212fb1f9d3bf1c = []byte{
0xad, 0x60, 0x7f, 0xf0, 0xe8, 0x72, 0xc7, 0xe9, 0x5f, 0xe9, 0x3a, 0x5d, 0xe7, 0x0a, 0x25, 0x79,
0x34, 0xd8, 0xa3, 0x5f, 0xf4, 0x83, 0xfe, 0x62, 0xac, 0xea, 0x45, 0x98, 0x7b, 0x1f, 0x7b, 0xbe,
0xe5, 0xd8, 0x1a, 0xfe, 0xc6, 0x00, 0xfb, 0x01, 0x5a, 0x81, 0xe9, 0x27, 0x2c, 0x65, 0x45, 0x39,
0xab, 0x9c, 0xaf, 0x68, 0xe2, 0x53, 0xfd, 0x03, 0x05, 0xe6, 0x43, 0x62, 0xdf, 0x75, 0x6c, 0x1f,
0xab, 0x9c, 0xaf, 0x68, 0xe2, 0x53, 0xfd, 0x43, 0x05, 0xe6, 0x43, 0x62, 0xdf, 0x75, 0x6c, 0x1f,
0xe7, 0x53, 0xa3, 0x73, 0x30, 0xcb, 0xab, 0xa5, 0xdb, 0x46, 0x1f, 0xaf, 0x14, 0x68, 0xf6, 0x0c,
0x4f, 0xdb, 0x32, 0xfa, 0x18, 0xbd, 0x04, 0xf3, 0x82, 0x44, 0x08, 0x29, 0x52, 0xaa, 0x39, 0x9e,
0xcc, 0x4b, 0x43, 0x97, 0xe1, 0x98, 0x20, 0x34, 0x5c, 0x2b, 0x24, 0x2e, 0x51, 0xe2, 0x05, 0x9e,
@ -10545,7 +10558,7 @@ var fileDescriptor_00212fb1f9d3bf1c = []byte{
0x5b, 0xbc, 0x1c, 0x75, 0xc8, 0xe5, 0x16, 0xcf, 0xd3, 0x42, 0x2a, 0xf4, 0x02, 0xcc, 0x75, 0x1c,
0x3b, 0x30, 0x2c, 0x1b, 0x7b, 0xba, 0xeb, 0x78, 0x01, 0x55, 0xce, 0xa4, 0x56, 0x0d, 0x53, 0x89,
0x7c, 0x74, 0x12, 0x2a, 0xfb, 0x8e, 0x1f, 0x30, 0x8a, 0x22, 0xa5, 0x28, 0x93, 0x04, 0x9a, 0xb9,
0x0c, 0xd3, 0x34, 0xd3, 0x72, 0xb9, 0x1a, 0xa6, 0xc8, 0x67, 0xd3, 0x55, 0xbf, 0x57, 0x84, 0xc9,
0x0c, 0xd3, 0x34, 0xd3, 0x72, 0xb9, 0x1a, 0xa6, 0xc8, 0x67, 0xd3, 0x55, 0x7f, 0x54, 0x84, 0xc9,
0x4d, 0x67, 0x60, 0x07, 0x89, 0x62, 0x8c, 0x60, 0x9f, 0x77, 0x51, 0xac, 0x18, 0x23, 0xd8, 0x8f,
0x8a, 0x21, 0x14, 0xac, 0x97, 0x58, 0x31, 0x24, 0xb3, 0x0e, 0x65, 0x0f, 0x1b, 0xa6, 0x63, 0xf7,
0x0e, 0x68, 0x15, 0xca, 0x5a, 0xf8, 0x4d, 0xba, 0xcf, 0xc7, 0x3d, 0xcb, 0x1e, 0x3c, 0xd3, 0x3d,
@ -10556,419 +10569,421 @@ var fileDescriptor_00212fb1f9d3bf1c = []byte{
0x30, 0x76, 0x63, 0x8c, 0xd3, 0x43, 0x19, 0x63, 0x94, 0xd4, 0xe0, 0x70, 0x67, 0xe0, 0xf9, 0xd6,
0x13, 0xac, 0x93, 0x06, 0xeb, 0x54, 0x03, 0x65, 0xda, 0xbc, 0x85, 0x30, 0x4b, 0xc3, 0x86, 0xb9,
0x4d, 0x54, 0xf1, 0x32, 0x4c, 0x5a, 0x7d, 0xa3, 0x8b, 0x57, 0x2a, 0x67, 0x95, 0x54, 0x11, 0x24,
0xa3, 0xed, 0xe2, 0x8e, 0xc6, 0x68, 0x54, 0x1d, 0x2a, 0x61, 0xb1, 0x51, 0x3f, 0x9a, 0xb4, 0x77,
0xaa, 0xbc, 0x1f, 0x4d, 0x32, 0x7e, 0xa2, 0xde, 0xb3, 0x4c, 0xda, 0x33, 0x55, 0x6d, 0x26, 0x4c,
0x6b, 0x9a, 0x68, 0x09, 0xa6, 0x7a, 0xd8, 0xee, 0x06, 0xfb, 0xb4, 0x6b, 0xaa, 0x1a, 0xff, 0x52,
0x7f, 0x43, 0x81, 0xea, 0xae, 0x8f, 0x3d, 0x32, 0xc8, 0x7c, 0xd7, 0xe8, 0x60, 0x74, 0x09, 0x4a,
0x7d, 0xc7, 0xc4, 0xdc, 0x3e, 0x4f, 0xc4, 0xab, 0x17, 0x12, 0x6d, 0x3a, 0x26, 0xd6, 0x28, 0x19,
0xba, 0x00, 0xa5, 0x81, 0x65, 0xb2, 0x41, 0x91, 0xab, 0x30, 0x4a, 0x42, 0x48, 0xbb, 0x84, 0xb4,
0x38, 0x94, 0x94, 0x90, 0xa8, 0xbf, 0x54, 0x60, 0x3e, 0x2c, 0x6d, 0x9b, 0x8e, 0x26, 0xf4, 0x1a,
0x4c, 0xdb, 0x38, 0x78, 0xea, 0x78, 0x8f, 0x47, 0xd7, 0x4d, 0x50, 0xa2, 0x97, 0xa1, 0xe8, 0x72,
0x8d, 0x0c, 0x65, 0x20, 0x54, 0x84, 0xd8, 0x72, 0x3b, 0x54, 0x43, 0xc3, 0x89, 0x2d, 0xb7, 0x43,
0xc6, 0x42, 0x60, 0x78, 0x5d, 0x4c, 0xfb, 0x83, 0x8d, 0xab, 0x32, 0x4b, 0x68, 0x9a, 0xe8, 0x0e,
0xcc, 0x0d, 0x7c, 0xec, 0xd9, 0xbe, 0x2e, 0x3c, 0xc3, 0x24, 0xed, 0x6d, 0x49, 0xa8, 0xa4, 0x77,
0xad, 0xca, 0x18, 0xb6, 0xb9, 0xeb, 0x50, 0x01, 0x9a, 0x76, 0xf0, 0xc6, 0xf5, 0xf7, 0x8d, 0xde,
0x00, 0xa3, 0x45, 0x98, 0x7c, 0x42, 0x7e, 0xd0, 0x96, 0x17, 0x35, 0xf6, 0xa1, 0x7e, 0x7f, 0x12,
0x4e, 0x3e, 0x24, 0xa3, 0xa7, 0x6d, 0xd8, 0xe6, 0x23, 0xe7, 0x59, 0x9b, 0x18, 0x9b, 0x15, 0x1c,
0xac, 0x39, 0x76, 0x80, 0x9f, 0x05, 0xe8, 0x01, 0x2c, 0xd8, 0x42, 0x7e, 0x58, 0x11, 0x85, 0x56,
0xe4, 0x64, 0x66, 0xeb, 0x58, 0xe1, 0x5a, 0xcd, 0x96, 0x13, 0x7c, 0x74, 0x37, 0x1a, 0xbf, 0x42,
0x4e, 0x21, 0xdd, 0xa0, 0xf6, 0x06, 0xad, 0x0d, 0x97, 0x22, 0x86, 0xb6, 0x90, 0xf1, 0x06, 0x10,
0x8f, 0xae, 0x1b, 0xbe, 0x4e, 0x5a, 0x4a, 0xb5, 0x3c, 0x73, 0x6d, 0x49, 0xb2, 0x82, 0xb0, 0xc1,
0x5a, 0xc5, 0x1b, 0xd8, 0x0d, 0x9f, 0x68, 0x08, 0xdd, 0xa0, 0xb3, 0x03, 0xe1, 0xeb, 0x7a, 0xce,
0xc0, 0xa5, 0x23, 0x2b, 0x9f, 0x11, 0x28, 0xe3, 0x7d, 0x42, 0x49, 0x27, 0x0d, 0xee, 0x81, 0x74,
0xcf, 0x71, 0x82, 0x3d, 0x5f, 0x78, 0x1d, 0x91, 0xac, 0xd1, 0x54, 0x74, 0x05, 0x8e, 0xf9, 0x03,
0xd7, 0xed, 0xe1, 0x3e, 0xb6, 0x03, 0xa3, 0xc7, 0x0a, 0x22, 0x7d, 0x56, 0x3c, 0x5f, 0xd4, 0x50,
0x3c, 0x8b, 0x0a, 0xf6, 0xd1, 0x23, 0xa8, 0x67, 0x30, 0xe8, 0xae, 0xd3, 0xb3, 0x3a, 0x07, 0x2b,
0x33, 0xd4, 0x80, 0x9e, 0x97, 0x54, 0x93, 0x92, 0xd1, 0xa2, 0xb4, 0xda, 0x8a, 0x9f, 0x93, 0x83,
0x56, 0x01, 0x5c, 0xcf, 0x7a, 0x62, 0xf5, 0x70, 0x17, 0x9b, 0x2b, 0x53, 0xb4, 0xe2, 0xb1, 0x14,
0xf4, 0x3a, 0x99, 0xac, 0x3a, 0x1d, 0xa7, 0xef, 0x72, 0x57, 0x22, 0xf5, 0xa9, 0xb0, 0x85, 0x96,
0xe7, 0xec, 0x59, 0x3d, 0xac, 0x09, 0x5a, 0xf4, 0x26, 0x94, 0x0d, 0xd7, 0x35, 0xbc, 0xbe, 0xe3,
0xad, 0xc0, 0x68, 0xbe, 0x90, 0x18, 0x5d, 0x87, 0x45, 0x2e, 0x43, 0x77, 0x59, 0x26, 0x9b, 0x07,
0xa6, 0x89, 0xed, 0xdf, 0x2d, 0xac, 0x28, 0x1a, 0xe2, 0xf9, 0x9c, 0x97, 0xcc, 0x0a, 0xea, 0xdf,
0x28, 0x30, 0x9f, 0x90, 0x89, 0xde, 0x83, 0x59, 0x21, 0x21, 0x38, 0x70, 0x85, 0xab, 0x79, 0x69,
0x48, 0x35, 0x2e, 0xf3, 0xbf, 0x3b, 0x07, 0x2e, 0xa6, 0x0e, 0x5f, 0x7c, 0xa0, 0xe7, 0xa0, 0xda,
0x73, 0x3a, 0x46, 0x8f, 0x7a, 0x46, 0x0f, 0xef, 0xf1, 0x69, 0x69, 0x36, 0x4c, 0xd4, 0xf0, 0x9e,
0x7a, 0x07, 0x66, 0x62, 0x02, 0x10, 0x82, 0x39, 0x8d, 0x15, 0xb5, 0x8e, 0xf7, 0x8c, 0x41, 0x2f,
0xa8, 0x4d, 0xa0, 0x39, 0x80, 0x5d, 0xbb, 0x43, 0xc2, 0x00, 0x1b, 0x9b, 0x35, 0x05, 0x55, 0xa1,
0xf2, 0x50, 0x88, 0xa8, 0x15, 0xd4, 0xef, 0x16, 0xe1, 0x38, 0x35, 0xee, 0x96, 0x63, 0xf2, 0xd1,
0xc6, 0x63, 0x86, 0xe7, 0xa0, 0xda, 0xa1, 0xdd, 0xaf, 0xbb, 0x86, 0x87, 0xed, 0x80, 0xcf, 0x9c,
0xb3, 0x2c, 0xb1, 0x45, 0xd3, 0x90, 0x06, 0x35, 0x9f, 0xb7, 0x48, 0xef, 0xb0, 0xd1, 0xc9, 0x07,
0x90, 0xd4, 0xea, 0x21, 0x83, 0x59, 0x9b, 0xf7, 0x53, 0xa3, 0x7b, 0xda, 0x3f, 0xf0, 0x3b, 0x41,
0x4f, 0x78, 0xd4, 0xcb, 0x29, 0x51, 0xc9, 0xca, 0x5e, 0x6e, 0x33, 0x86, 0x0d, 0x3b, 0xf0, 0x0e,
0x34, 0xc1, 0x8e, 0xde, 0x85, 0xb2, 0xf3, 0x04, 0x7b, 0xfb, 0xd8, 0x60, 0x9e, 0x6c, 0xe6, 0xda,
0x73, 0x29, 0x51, 0x6b, 0x62, 0x32, 0xd1, 0xb0, 0xef, 0x0c, 0xbc, 0x0e, 0xf6, 0xb5, 0x90, 0x09,
0x35, 0xa0, 0xe2, 0x89, 0x64, 0xee, 0xe9, 0xc6, 0x92, 0x10, 0x71, 0xd5, 0x6f, 0xc1, 0x6c, 0xbc,
0x72, 0xa8, 0x06, 0xc5, 0xc7, 0xf8, 0x80, 0x2b, 0x93, 0xfc, 0x8c, 0x7c, 0x20, 0xeb, 0x61, 0xf6,
0x71, 0xab, 0x70, 0x43, 0x51, 0x3d, 0x40, 0x51, 0x4b, 0x37, 0x71, 0x60, 0x98, 0x46, 0x60, 0x20,
0x04, 0x25, 0x1a, 0x4d, 0x32, 0x11, 0xf4, 0x37, 0x91, 0x3a, 0xe0, 0xd3, 0x41, 0x45, 0x23, 0x3f,
0xd1, 0x29, 0xa8, 0x84, 0xde, 0x8e, 0x87, 0x94, 0x51, 0x02, 0x09, 0xed, 0x8c, 0x20, 0xc0, 0x7d,
0x37, 0xa0, 0x8a, 0xa9, 0x6a, 0xe2, 0x53, 0xfd, 0xb5, 0x49, 0xa8, 0xa5, 0x6c, 0xe1, 0x16, 0x94,
0xfb, 0xbc, 0x78, 0xee, 0x67, 0x57, 0xa5, 0xf8, 0x2e, 0x55, 0x49, 0x2d, 0xa4, 0x27, 0xe1, 0x13,
0xb1, 0xb5, 0x58, 0x00, 0x1c, 0x7e, 0x33, 0x23, 0xef, 0xea, 0xa6, 0xe5, 0xe1, 0x4e, 0xe0, 0x78,
0x07, 0xbc, 0xa2, 0xb3, 0x3d, 0xa7, 0xbb, 0x2e, 0xd2, 0xd0, 0x75, 0x00, 0xd3, 0xf6, 0x75, 0x6a,
0xc3, 0x5d, 0xde, 0x8f, 0xd2, 0x24, 0x1b, 0xc6, 0xb9, 0x5a, 0xc5, 0xb4, 0x7d, 0x5e, 0xe5, 0xdb,
0x50, 0x25, 0x41, 0xa3, 0xde, 0x17, 0x91, 0xcf, 0x24, 0xb5, 0xa5, 0x65, 0xb9, 0xde, 0x61, 0x08,
0xab, 0xcd, 0xba, 0xd1, 0x87, 0x8f, 0xee, 0xc0, 0x14, 0x8d, 0xdb, 0x44, 0xa4, 0x75, 0x3e, 0xbb,
0xb9, 0xdc, 0xfa, 0x1e, 0x52, 0x52, 0x66, 0x7c, 0x9c, 0x0f, 0x6d, 0xc3, 0x8c, 0x61, 0xdb, 0x4e,
0x60, 0xb0, 0x59, 0x85, 0xc5, 0x5d, 0x97, 0x86, 0x8a, 0x69, 0x44, 0xf4, 0x4c, 0x56, 0x5c, 0x02,
0x7a, 0x13, 0x26, 0xe9, 0xb4, 0xc3, 0xe7, 0x89, 0x73, 0x23, 0x07, 0x85, 0xc6, 0xe8, 0xd1, 0xdb,
0x30, 0xfd, 0xd4, 0xb2, 0x4d, 0xe7, 0xa9, 0xcf, 0xfd, 0xa9, 0x64, 0xc2, 0x5f, 0x61, 0x59, 0x29,
0x66, 0xc1, 0x53, 0xbf, 0x09, 0x33, 0xb1, 0xf6, 0x1d, 0xc6, 0x7e, 0xeb, 0xef, 0x40, 0x2d, 0xd9,
0xa6, 0x43, 0xd9, 0xff, 0x00, 0x16, 0xb5, 0x81, 0x1d, 0x55, 0x4d, 0xac, 0xcf, 0xae, 0xc3, 0x14,
0xb7, 0x06, 0x66, 0x8c, 0xa7, 0x86, 0xa9, 0x55, 0xe3, 0xb4, 0xf1, 0xa5, 0xd6, 0xbe, 0x61, 0x9b,
0x3d, 0xec, 0xf1, 0x12, 0xc5, 0x52, 0xeb, 0x01, 0x4b, 0x55, 0xdf, 0x86, 0xe3, 0x89, 0x62, 0xf9,
0x4a, 0xef, 0x79, 0x98, 0x73, 0x1d, 0x53, 0xf7, 0x59, 0xb2, 0x88, 0x57, 0x2b, 0xc4, 0x76, 0x04,
0x6d, 0xd3, 0x24, 0xec, 0xed, 0xc0, 0x71, 0xd3, 0xd5, 0x1e, 0x8f, 0x7d, 0x05, 0x96, 0x92, 0xec,
0xac, 0x78, 0xf5, 0x5d, 0x58, 0xd6, 0x70, 0xdf, 0x79, 0x82, 0x8f, 0x2a, 0xba, 0x0e, 0x2b, 0x69,
0x01, 0x5c, 0xf8, 0x07, 0xb0, 0x1c, 0xa5, 0xb6, 0x03, 0x23, 0x18, 0xf8, 0x87, 0x12, 0xce, 0x97,
0xc1, 0x8f, 0x1c, 0x9f, 0x75, 0x64, 0x59, 0x13, 0x9f, 0xea, 0x32, 0x4c, 0xb6, 0x1c, 0xb3, 0xd9,
0x42, 0x73, 0x50, 0xb0, 0x5c, 0xce, 0x5c, 0xb0, 0x5c, 0xb5, 0x13, 0x2f, 0x73, 0x8b, 0x45, 0xb6,
0xac, 0xe8, 0x24, 0x29, 0xba, 0x01, 0x73, 0x86, 0x69, 0x5a, 0xc4, 0x90, 0x8c, 0x9e, 0x6e, 0xb9,
0x22, 0x30, 0x5f, 0x48, 0x74, 0x7d, 0xb3, 0xa5, 0x55, 0x23, 0xc2, 0xa6, 0xeb, 0xab, 0x77, 0xa1,
0x12, 0x2d, 0x02, 0x5e, 0x8f, 0x96, 0xb4, 0x85, 0xd1, 0xf1, 0x62, 0xb8, 0xde, 0xdd, 0x4a, 0x4d,
0x92, 0xbc, 0x9a, 0xaf, 0x03, 0x84, 0x4e, 0x55, 0x84, 0xa0, 0xc7, 0x33, 0x45, 0x6a, 0x31, 0x42,
0xf5, 0x5f, 0x4a, 0x71, 0x27, 0x1b, 0x6b, 0xb2, 0x19, 0x36, 0xd9, 0x94, 0x9c, 0x6e, 0xe1, 0x90,
0x4e, 0xf7, 0x55, 0x98, 0xf4, 0x03, 0x23, 0xc0, 0x3c, 0xe6, 0x3f, 0x99, 0xcd, 0x48, 0x0a, 0xc6,
0x1a, 0xa3, 0x44, 0xa7, 0x01, 0x3a, 0x1e, 0x36, 0x02, 0x6c, 0xea, 0x06, 0x9b, 0x15, 0x8a, 0x5a,
0x85, 0xa7, 0x34, 0x02, 0xe2, 0x45, 0xc4, 0x2a, 0x25, 0x63, 0x22, 0xcc, 0xe9, 0xc6, 0x68, 0xbd,
0x12, 0x7a, 0xaf, 0xa9, 0x91, 0xde, 0x8b, 0xb3, 0x72, 0xef, 0x15, 0x79, 0xe2, 0xe9, 0x61, 0x9e,
0x98, 0x31, 0x8d, 0xe3, 0x89, 0xcb, 0xc3, 0x3c, 0x31, 0x17, 0x33, 0xdc, 0x13, 0x67, 0x38, 0x92,
0x4a, 0x96, 0x23, 0xf9, 0x3c, 0x5d, 0xe7, 0x9f, 0x17, 0x60, 0x25, 0x3d, 0x9e, 0xb9, 0x1f, 0xbb,
0x0e, 0x53, 0x3e, 0x4d, 0x19, 0xee, 0x3f, 0x39, 0x17, 0xa7, 0x45, 0x77, 0xa1, 0x64, 0xd9, 0x7b,
0x0e, 0x1f, 0x78, 0x97, 0x87, 0xf2, 0xf0, 0x92, 0x2e, 0x37, 0xed, 0x3d, 0x87, 0x69, 0x90, 0xf2,
0xa2, 0x87, 0x70, 0x2c, 0x5c, 0xbd, 0xfb, 0x3a, 0x13, 0x8c, 0x45, 0x9c, 0x27, 0x59, 0x69, 0x18,
0x55, 0x71, 0x89, 0x28, 0xe2, 0x6b, 0x73, 0x36, 0x12, 0xe3, 0x10, 0x72, 0x3f, 0x30, 0xfa, 0xae,
0xb0, 0xd8, 0x30, 0xa1, 0xfe, 0x26, 0x54, 0xc2, 0xe2, 0x0f, 0xa5, 0xbb, 0x26, 0x2c, 0x26, 0xc6,
0x08, 0x5b, 0xac, 0x86, 0x83, 0x4a, 0x19, 0x77, 0x50, 0xa9, 0xbf, 0x50, 0xe2, 0x03, 0xfd, 0x9e,
0xd5, 0x0b, 0xb0, 0x97, 0x1a, 0xe8, 0x6f, 0x08, 0xb9, 0x6c, 0x94, 0x9f, 0x1d, 0x22, 0x97, 0xad,
0x05, 0xf9, 0x88, 0x7d, 0x1f, 0xe6, 0xa8, 0x89, 0xeb, 0x3e, 0xee, 0xd1, 0x58, 0x89, 0xeb, 0xf1,
0x4a, 0xb6, 0x00, 0x56, 0x3a, 0x1b, 0x22, 0x6d, 0xce, 0xc1, 0xfa, 0xa6, 0xda, 0x8b, 0xa7, 0xd5,
0xef, 0x00, 0x4a, 0x13, 0x1d, 0x4a, 0x83, 0x9b, 0xc4, 0x5f, 0xfa, 0x41, 0xe6, 0xcc, 0xbd, 0x47,
0xab, 0x31, 0xdc, 0xf2, 0x58, 0x55, 0x35, 0x4e, 0xab, 0xfe, 0x73, 0x11, 0x20, 0xca, 0xfc, 0x82,
0x3b, 0xca, 0x5b, 0xa1, 0xc3, 0x62, 0x11, 0xa7, 0x9a, 0x2d, 0x32, 0xd3, 0x55, 0x35, 0x65, 0x57,
0xc5, 0x62, 0xcf, 0x97, 0x72, 0x04, 0x1c, 0xda, 0x49, 0x4d, 0x7f, 0xd1, 0x9c, 0xd4, 0x3d, 0x58,
0x4a, 0x9a, 0x09, 0xf7, 0x50, 0xaf, 0xc0, 0xa4, 0x15, 0xe0, 0x3e, 0xdb, 0xae, 0x4e, 0x6c, 0x8a,
0xc4, 0xc8, 0x19, 0x91, 0xfa, 0x0e, 0x2c, 0xc9, 0x7d, 0x75, 0xb8, 0xd0, 0x45, 0x7d, 0x98, 0x8c,
0x7d, 0x22, 0x57, 0xc9, 0xed, 0x23, 0x73, 0x7b, 0x29, 0xc9, 0xc3, 0x28, 0xd5, 0x1f, 0x2b, 0x70,
0x3c, 0x91, 0x95, 0x33, 0xf0, 0xbf, 0x96, 0x1a, 0xc0, 0xcc, 0xb7, 0x5e, 0x1f, 0x52, 0xca, 0x67,
0x38, 0x8a, 0xbf, 0x02, 0x75, 0xb9, 0x7b, 0x24, 0xd5, 0xde, 0x4c, 0x0c, 0xe5, 0x73, 0x23, 0x2b,
0x1d, 0x8e, 0xe7, 0x16, 0x9c, 0xcc, 0x14, 0x9c, 0xd6, 0x79, 0x71, 0x4c, 0x9d, 0xff, 0x67, 0x21,
0xee, 0xb3, 0x1b, 0x41, 0xe0, 0x59, 0x8f, 0x06, 0x01, 0xfe, 0x74, 0x83, 0xaa, 0xf5, 0x70, 0x64,
0x33, 0x3f, 0xfb, 0x4a, 0x36, 0x67, 0x54, 0x7a, 0xe6, 0x18, 0x6f, 0xcb, 0x63, 0xbc, 0x44, 0x45,
0xbd, 0x3a, 0x52, 0xd4, 0xd0, 0xd1, 0xfe, 0x79, 0x0e, 0xe2, 0xbf, 0x53, 0x60, 0x3e, 0xd1, 0x2b,
0xe8, 0x0e, 0x80, 0x11, 0x56, 0x9d, 0xdb, 0xc7, 0xd9, 0x51, 0x4d, 0xd4, 0x62, 0x3c, 0x64, 0x4e,
0x64, 0xf1, 0x62, 0xc6, 0x9c, 0x98, 0x11, 0x2f, 0x86, 0xe1, 0xe2, 0xed, 0x68, 0xb1, 0xcb, 0x36,
0x62, 0xd5, 0xa1, 0x8b, 0x5d, 0xc6, 0x2b, 0x58, 0xd4, 0x5f, 0x2f, 0xc0, 0x62, 0x96, 0x74, 0xf4,
0x22, 0x14, 0x3b, 0xee, 0x80, 0xb7, 0x44, 0x3a, 0xdb, 0x5a, 0x73, 0x07, 0xbb, 0xbe, 0xd1, 0xc5,
0x1a, 0x21, 0x40, 0x57, 0x60, 0xaa, 0x8f, 0xfb, 0x8e, 0x77, 0xc0, 0xeb, 0x2d, 0x6d, 0x37, 0x6c,
0xd2, 0x1c, 0x46, 0xcd, 0xc9, 0xd0, 0xb5, 0x28, 0xac, 0x66, 0xf5, 0x5d, 0x91, 0x56, 0x0f, 0x2c,
0x8b, 0xb1, 0x84, 0xb1, 0xf4, 0x35, 0x98, 0x76, 0x3d, 0xa7, 0x83, 0x7d, 0x9f, 0xef, 0x86, 0xac,
0x24, 0x0e, 0xdb, 0x48, 0x16, 0xe7, 0xe1, 0x84, 0xe8, 0x16, 0x40, 0x14, 0x40, 0xf1, 0x99, 0xa9,
0x9e, 0x1b, 0x6f, 0xf9, 0x5a, 0x8c, 0x5a, 0xfd, 0x51, 0x01, 0x96, 0xb2, 0x35, 0x87, 0x2e, 0xc5,
0xf5, 0x72, 0x32, 0x43, 0xd5, 0xb2, 0x7a, 0xde, 0x48, 0xa8, 0x67, 0x35, 0x83, 0x23, 0x4b, 0x4b,
0x37, 0x93, 0x5a, 0x3a, 0x93, 0xc1, 0x98, 0xad, 0xac, 0x9b, 0x49, 0x65, 0x65, 0xb1, 0x66, 0xeb,
0xac, 0x91, 0xa1, 0xb3, 0x73, 0x59, 0x6d, 0xcc, 0x57, 0xdd, 0x5f, 0x29, 0x30, 0x1b, 0xaf, 0x97,
0x1c, 0xb2, 0x2a, 0x89, 0x90, 0x15, 0x6d, 0xc1, 0x82, 0xc9, 0x76, 0x6e, 0x75, 0xcb, 0x0e, 0xb0,
0xb7, 0x67, 0x74, 0x44, 0x54, 0x78, 0x2e, 0xc3, 0x2e, 0x9a, 0x82, 0x86, 0x55, 0xbc, 0xc6, 0x79,
0xc3, 0x64, 0xd2, 0x82, 0x50, 0x8e, 0xf0, 0x5a, 0x63, 0x08, 0x8a, 0x31, 0xa9, 0xff, 0xa4, 0xc0,
0xb1, 0x0c, 0x05, 0x8f, 0x68, 0xc8, 0x6e, 0x7e, 0x43, 0xce, 0xe7, 0x77, 0xdd, 0xc8, 0xf6, 0x3c,
0xc8, 0x68, 0xcf, 0xf8, 0xf2, 0xe2, 0xcd, 0xfa, 0xa5, 0x02, 0xc7, 0x33, 0xa9, 0x32, 0xb7, 0x57,
0xaf, 0x41, 0xd9, 0x7b, 0xa6, 0x3f, 0x3a, 0x08, 0xb0, 0x9f, 0x35, 0xb0, 0x77, 0x63, 0xe7, 0x34,
0xd3, 0xde, 0xb3, 0xbb, 0x84, 0x0e, 0x5d, 0x87, 0x8a, 0xf7, 0x4c, 0xc7, 0x9e, 0xe7, 0x78, 0xc2,
0x17, 0xe5, 0x32, 0x95, 0xbd, 0x67, 0x1b, 0x94, 0x90, 0x94, 0x14, 0x88, 0x92, 0x4a, 0x23, 0x4a,
0x0a, 0xa2, 0x92, 0x82, 0xb0, 0xa4, 0xc9, 0x11, 0x25, 0x05, 0xbc, 0x24, 0xf5, 0x0f, 0x0b, 0x70,
0x6a, 0x98, 0xba, 0x3e, 0x35, 0x45, 0x6c, 0x00, 0xf2, 0x9e, 0xe9, 0xae, 0xd1, 0x79, 0x8c, 0x03,
0x5f, 0x37, 0x3d, 0xc7, 0x75, 0xb1, 0x39, 0x4a, 0x23, 0x35, 0xef, 0x59, 0x8b, 0x71, 0xac, 0x33,
0x86, 0x23, 0x69, 0x66, 0x03, 0x50, 0x90, 0x2e, 0x7a, 0x84, 0x8a, 0x6a, 0x41, 0xa2, 0x68, 0xf5,
0x23, 0x98, 0x8d, 0x7b, 0x88, 0x11, 0xb6, 0x7f, 0x1b, 0xaa, 0xdc, 0x83, 0xe8, 0x1d, 0x67, 0x60,
0x07, 0xa3, 0x14, 0x35, 0xcb, 0xa9, 0xd7, 0x08, 0xb1, 0xfa, 0x8d, 0x70, 0xb8, 0x7d, 0x66, 0x45,
0xfe, 0xbf, 0x02, 0x54, 0xc2, 0x13, 0x7a, 0x32, 0xd3, 0xb3, 0x73, 0x7c, 0xd6, 0xef, 0xec, 0x03,
0x3d, 0x90, 0xa3, 0x16, 0x16, 0xa7, 0xbe, 0x98, 0x79, 0xc6, 0x3f, 0x62, 0x61, 0x72, 0x15, 0x16,
0x07, 0x3e, 0xf6, 0x74, 0xdf, 0xc5, 0x1d, 0x6b, 0xcf, 0xc2, 0xa6, 0xce, 0x8a, 0x43, 0xb4, 0x38,
0x44, 0xf2, 0xda, 0x22, 0x8b, 0xca, 0xcc, 0x5a, 0xca, 0x1c, 0xcb, 0x5c, 0xca, 0x7c, 0xd2, 0x50,
0xe6, 0x1a, 0x94, 0xbf, 0x84, 0x0f, 0xd8, 0x62, 0x7f, 0x4c, 0x3e, 0xf5, 0x3b, 0x25, 0x58, 0xce,
0x39, 0x06, 0xa2, 0x2b, 0x45, 0x77, 0xa0, 0xbb, 0xd8, 0xb3, 0x1c, 0x53, 0xf4, 0x5a, 0xc7, 0x1d,
0xb4, 0x68, 0x02, 0x3a, 0x09, 0xe4, 0x43, 0xff, 0xc6, 0xc0, 0xe1, 0xc1, 0x68, 0x51, 0x2b, 0x77,
0xdc, 0xc1, 0x97, 0xc9, 0xb7, 0xe0, 0xf5, 0xf7, 0x0d, 0x0f, 0x33, 0xff, 0xc1, 0x78, 0xdb, 0x34,
0x01, 0xbd, 0x0a, 0xc7, 0xd9, 0xdc, 0xa8, 0xf7, 0xac, 0xbe, 0x45, 0xbc, 0x6c, 0x6c, 0x68, 0x14,
0x35, 0xc4, 0x32, 0x1f, 0x92, 0xbc, 0xa6, 0xcd, 0x06, 0x83, 0x0a, 0x55, 0xc7, 0xe9, 0xeb, 0x7e,
0xc7, 0xf1, 0xb0, 0x6e, 0x98, 0x1f, 0xd1, 0x71, 0x50, 0xd4, 0x66, 0x1c, 0xa7, 0xdf, 0x26, 0x69,
0x0d, 0xf3, 0x23, 0x74, 0x06, 0x66, 0x3a, 0xee, 0xc0, 0xc7, 0x81, 0x4e, 0xfe, 0xd0, 0xcd, 0xba,
0x8a, 0x06, 0x2c, 0x69, 0xcd, 0x1d, 0xf8, 0x31, 0x82, 0x3e, 0x59, 0x9e, 0x4d, 0xc7, 0x09, 0x36,
0x71, 0x9f, 0x9e, 0xa8, 0xef, 0x0f, 0xba, 0xd8, 0x35, 0xba, 0x98, 0x55, 0x4d, 0xec, 0xb8, 0x49,
0x27, 0xea, 0x0f, 0x38, 0x09, 0xad, 0xa0, 0x36, 0xb7, 0x1f, 0xff, 0xf4, 0xd1, 0x7b, 0x30, 0x3d,
0xb0, 0xa9, 0x01, 0xac, 0x54, 0x28, 0xef, 0xd5, 0x31, 0x0e, 0xdd, 0x2e, 0xef, 0x32, 0x16, 0x7e,
0x06, 0xc8, 0x05, 0xa0, 0x5b, 0x50, 0xe7, 0x8a, 0xf2, 0x9f, 0x1a, 0x6e, 0x52, 0x5b, 0x40, 0x55,
0xb0, 0xc4, 0x28, 0xda, 0x4f, 0x0d, 0x37, 0xae, 0xb1, 0xfa, 0x2d, 0x98, 0x8d, 0x0b, 0x3d, 0x94,
0x2d, 0xdd, 0x85, 0xaa, 0xd4, 0x48, 0xd2, 0xdb, 0x54, 0x29, 0xbe, 0xf5, 0x4d, 0x31, 0xb6, 0xca,
0x24, 0xa1, 0x6d, 0x7d, 0x93, 0xe2, 0x20, 0x68, 0xcd, 0xa8, 0x9c, 0x92, 0xc6, 0x3e, 0x54, 0x03,
0xaa, 0x12, 0xf4, 0x80, 0xb8, 0x64, 0x8a, 0x31, 0xe0, 0x2e, 0x99, 0xfc, 0x26, 0x69, 0x9e, 0xd3,
0x13, 0x35, 0xa0, 0xbf, 0x49, 0x1a, 0x3d, 0x80, 0x66, 0xc7, 0x69, 0xf4, 0x37, 0x2d, 0x02, 0x3f,
0xe1, 0x00, 0xa5, 0x8a, 0xc6, 0x3e, 0xd4, 0xdf, 0x51, 0x00, 0xd6, 0x0c, 0xd7, 0x78, 0x64, 0xf5,
0xac, 0xe0, 0x00, 0x5d, 0x80, 0x9a, 0x61, 0x9a, 0x7a, 0x47, 0xa4, 0x58, 0x58, 0x20, 0xc6, 0xe6,
0x0d, 0xd3, 0x5c, 0x8b, 0x25, 0xa3, 0x97, 0x61, 0x81, 0x38, 0x54, 0x99, 0x96, 0x41, 0xc8, 0x6a,
0x24, 0x43, 0x22, 0xbe, 0x01, 0x2b, 0x44, 0xae, 0xd1, 0x7f, 0x64, 0x61, 0x3b, 0x90, 0x79, 0x18,
0xb6, 0x6c, 0xc9, 0x30, 0xcd, 0x06, 0xcb, 0x8e, 0x73, 0xaa, 0xbf, 0x3b, 0x0d, 0xa7, 0xe5, 0x1e,
0x4f, 0xa2, 0x41, 0x6e, 0xc1, 0x6c, 0xa2, 0xbe, 0x29, 0x1c, 0x45, 0xd4, 0x42, 0x4d, 0xa2, 0x4d,
0x60, 0x11, 0x0a, 0x29, 0x2c, 0x42, 0x26, 0xd2, 0xa4, 0xf8, 0x29, 0x21, 0x4d, 0x4a, 0x9f, 0x10,
0x69, 0x32, 0x79, 0x54, 0xa4, 0xc9, 0xec, 0xd8, 0x48, 0x93, 0x17, 0xa9, 0xeb, 0x15, 0x25, 0xd2,
0x70, 0x80, 0xf9, 0x84, 0x6a, 0x28, 0xdd, 0x16, 0x30, 0xc6, 0x04, 0x22, 0x65, 0xfa, 0x30, 0x88,
0x94, 0xf2, 0x11, 0x11, 0x29, 0x0b, 0x9f, 0x0a, 0x22, 0xe5, 0x2c, 0xcc, 0xda, 0x8e, 0x6e, 0xe3,
0xa7, 0x3a, 0xe9, 0x7a, 0x9f, 0xe2, 0x5c, 0xca, 0x1a, 0xd8, 0xce, 0x16, 0x7e, 0xda, 0x22, 0x29,
0xe8, 0x1c, 0xcc, 0xf6, 0x0d, 0xff, 0x31, 0x36, 0x29, 0x34, 0xc4, 0x5f, 0xa9, 0x52, 0x9b, 0x9d,
0x61, 0x69, 0x2d, 0x92, 0x84, 0x5e, 0x80, 0xb0, 0xad, 0x9c, 0x68, 0x8e, 0x12, 0x55, 0x45, 0x2a,
0x23, 0x8b, 0xa1, 0x5b, 0xe6, 0x8f, 0x88, 0x6e, 0xa9, 0x1d, 0x06, 0xdd, 0x72, 0x09, 0x6a, 0xe2,
0xb7, 0x80, 0xb7, 0xb0, 0xd3, 0x0a, 0x8a, 0x6c, 0x99, 0x17, 0x79, 0x02, 0xc2, 0x92, 0x07, 0x86,
0x81, 0xa1, 0x60, 0x98, 0x3f, 0x52, 0xf8, 0xba, 0x39, 0x1c, 0xa4, 0xfc, 0x14, 0x5e, 0x02, 0x50,
0x28, 0x47, 0x01, 0x50, 0xa0, 0x9d, 0x5c, 0x88, 0xc9, 0x85, 0x7c, 0x49, 0xa3, 0x40, 0x26, 0xaa,
0x05, 0x48, 0xe6, 0xa0, 0x03, 0x85, 0xc3, 0x28, 0xd8, 0x4c, 0x4d, 0x61, 0x14, 0x35, 0x28, 0x76,
0x39, 0xb0, 0xa2, 0xa8, 0x91, 0x9f, 0x79, 0x16, 0x5c, 0xcc, 0xb3, 0x60, 0x75, 0x33, 0x5c, 0x3d,
0x7f, 0x1a, 0xc8, 0x3f, 0xf5, 0xdf, 0x14, 0x38, 0xcd, 0xe5, 0xe5, 0xc0, 0xe3, 0x32, 0x06, 0xad,
0x92, 0x33, 0x68, 0x3b, 0x1e, 0x36, 0xb1, 0x1d, 0x58, 0x46, 0x8f, 0xc6, 0x63, 0xe2, 0x40, 0x3c,
0x4a, 0xa6, 0x21, 0xe1, 0x39, 0x98, 0x65, 0xf0, 0x58, 0xbe, 0x90, 0x66, 0x28, 0xd8, 0x19, 0x8a,
0x90, 0xe5, 0x6b, 0xe5, 0xed, 0x2c, 0x47, 0x59, 0xca, 0xdd, 0x81, 0x19, 0xe9, 0x2f, 0x55, 0x07,
0x96, 0x73, 0xa0, 0x09, 0x99, 0x16, 0xa1, 0xa4, 0x2d, 0x62, 0xa8, 0x92, 0xd2, 0x16, 0xf1, 0x1d,
0x05, 0xce, 0xa4, 0x16, 0xf4, 0x9f, 0xbf, 0x66, 0xd5, 0x3f, 0x55, 0x42, 0xfb, 0x49, 0x8e, 0xae,
0xb5, 0xf4, 0xe8, 0x7a, 0x61, 0xd8, 0xfe, 0x44, 0xe6, 0xf8, 0x7a, 0x3f, 0x77, 0x7c, 0xbd, 0x3c,
0x74, 0xaf, 0x63, 0x94, 0x3e, 0x7f, 0xbf, 0x00, 0x27, 0x72, 0x2b, 0x90, 0x08, 0x6f, 0x95, 0x64,
0x78, 0xcb, 0x43, 0xe3, 0x68, 0x31, 0xc3, 0x42, 0x63, 0xba, 0x5e, 0xe1, 0x31, 0xa8, 0xde, 0x37,
0x9e, 0x59, 0xfd, 0x41, 0x9f, 0xc7, 0xc6, 0x44, 0xdc, 0x26, 0x4b, 0x39, 0x4a, 0x70, 0x7c, 0x05,
0x16, 0xd9, 0xbc, 0x45, 0xe3, 0xb3, 0x88, 0x83, 0xc5, 0xc8, 0x0b, 0x2c, 0x8f, 0x84, 0x6a, 0x82,
0xe1, 0x01, 0x54, 0x8d, 0xbd, 0x3d, 0xcb, 0xa6, 0x6a, 0x63, 0xb1, 0x72, 0x31, 0x07, 0x5b, 0xb3,
0xe6, 0x0e, 0xa8, 0x2b, 0x68, 0x70, 0x7a, 0x6d, 0x56, 0x70, 0x92, 0x90, 0x5a, 0xfd, 0x72, 0x68,
0xe9, 0x49, 0x42, 0x74, 0x02, 0xca, 0xac, 0xa5, 0x3e, 0xf3, 0x10, 0x25, 0x6d, 0x9a, 0x36, 0xd3,
0x7f, 0x2c, 0x34, 0xc4, 0x26, 0x74, 0x06, 0x8c, 0x26, 0xb4, 0x94, 0x5f, 0x6d, 0xc0, 0x42, 0xa8,
0xf3, 0xa1, 0xb8, 0xb1, 0x18, 0x0e, 0xac, 0x20, 0xe3, 0xc0, 0x6c, 0x98, 0x5a, 0xc7, 0x4f, 0xac,
0x0e, 0xfe, 0x54, 0x30, 0xf4, 0x67, 0x61, 0xc6, 0xc5, 0x5e, 0xdf, 0xf2, 0xfd, 0x30, 0x82, 0xaa,
0x68, 0xf1, 0x24, 0xf5, 0x0c, 0x54, 0xd6, 0xd6, 0x9b, 0xbc, 0xc8, 0x8c, 0xaa, 0xaa, 0xff, 0x3e,
0x05, 0xf3, 0xc9, 0x01, 0x70, 0x33, 0x85, 0x4b, 0x3b, 0x9d, 0xb9, 0xa7, 0x99, 0xb1, 0x99, 0x1f,
0xc2, 0xd5, 0x0b, 0xa3, 0xe1, 0xea, 0x44, 0x4d, 0x1d, 0xa7, 0xdf, 0x37, 0x6c, 0x53, 0xdc, 0x84,
0xe0, 0x9f, 0xa4, 0xa6, 0x86, 0xd7, 0x65, 0xdb, 0xf8, 0x15, 0x8d, 0xfe, 0x26, 0xf6, 0x49, 0x3c,
0xb5, 0x65, 0x53, 0x64, 0x1b, 0x35, 0xa1, 0x8a, 0x06, 0x3c, 0x69, 0xdd, 0xf2, 0xd0, 0x79, 0x28,
0x61, 0xfb, 0x89, 0x30, 0x19, 0x69, 0x3b, 0x59, 0xac, 0x3f, 0x35, 0x4a, 0x81, 0x2e, 0xc0, 0x54,
0x9f, 0xd8, 0xbc, 0x40, 0x3f, 0x2c, 0xa4, 0x6e, 0x0c, 0x68, 0x9c, 0x00, 0xbd, 0x02, 0xd3, 0x26,
0xd5, 0x9e, 0x58, 0x70, 0x21, 0x09, 0x23, 0x47, 0xb3, 0x34, 0x41, 0x82, 0xde, 0x0d, 0xcf, 0x32,
0x2a, 0xe9, 0x43, 0xc6, 0x84, 0x9a, 0x33, 0x8f, 0x31, 0xb6, 0xe4, 0x0d, 0x01, 0x48, 0x9f, 0x88,
0x24, 0xa5, 0x0c, 0xdf, 0x16, 0x38, 0x01, 0xe5, 0x9e, 0xd3, 0x65, 0xd6, 0x33, 0xc3, 0xae, 0xd1,
0xf4, 0x9c, 0x2e, 0x35, 0x9e, 0x45, 0x98, 0xf4, 0x03, 0xd3, 0xb2, 0x69, 0xdc, 0x5a, 0xd6, 0xd8,
0x07, 0xf1, 0x20, 0xf4, 0x87, 0xee, 0xd8, 0x1d, 0xbc, 0x52, 0xa5, 0x59, 0x15, 0x9a, 0xb2, 0x6d,
0x77, 0xe8, 0xfa, 0x3d, 0x08, 0x0e, 0x56, 0xe6, 0x68, 0x3a, 0xf9, 0x19, 0x1d, 0x29, 0xcc, 0xe7,
0x1c, 0x29, 0x24, 0x2a, 0x9c, 0x71, 0xa4, 0x50, 0xcb, 0x9d, 0xd0, 0x92, 0xbc, 0x82, 0x85, 0xc4,
0xec, 0x6b, 0xeb, 0x4d, 0x5d, 0x74, 0xcd, 0x42, 0xfa, 0x8e, 0x40, 0x68, 0xf6, 0x1a, 0x84, 0x3f,
0x3f, 0xd7, 0x13, 0x9d, 0x1f, 0x29, 0xb0, 0xb4, 0x46, 0xcf, 0xb3, 0x63, 0x8e, 0xfb, 0x30, 0x50,
0xb0, 0xd7, 0x42, 0x7c, 0x5e, 0x06, 0xc8, 0x2a, 0xa9, 0x29, 0x01, 0xcf, 0x5b, 0x83, 0x39, 0x21,
0x96, 0x33, 0x17, 0xc7, 0x00, 0xf7, 0x55, 0xfd, 0xf8, 0xa7, 0x7a, 0x1b, 0x96, 0x53, 0x35, 0xe7,
0xa7, 0x8a, 0xc9, 0xcb, 0x24, 0xac, 0xe2, 0xf1, 0xcb, 0x24, 0xea, 0x2d, 0x38, 0xde, 0x0e, 0x0c,
0x2f, 0x48, 0x35, 0x7b, 0x0c, 0x5e, 0x0a, 0xdb, 0x93, 0x79, 0x39, 0xb2, 0xae, 0x0d, 0x8b, 0xed,
0xc0, 0x71, 0x8f, 0x20, 0x94, 0xf8, 0x1d, 0xd2, 0x72, 0x67, 0x20, 0x26, 0x41, 0xf1, 0xa9, 0x2e,
0x33, 0x90, 0x61, 0xba, 0xb4, 0xb7, 0x60, 0x89, 0x61, 0xfc, 0x8e, 0xd2, 0x88, 0x13, 0x02, 0x61,
0x98, 0x96, 0x7b, 0x1f, 0x8e, 0x49, 0xe7, 0x1c, 0x1c, 0x13, 0x73, 0x55, 0xc6, 0xc4, 0xe4, 0x1f,
0x29, 0x85, 0x90, 0x98, 0xdf, 0x2c, 0xc4, 0xfc, 0x78, 0xce, 0xc1, 0xf8, 0xeb, 0x32, 0x22, 0xe6,
0x4c, 0xbe, 0x54, 0x09, 0x10, 0x93, 0xb6, 0xce, 0x62, 0x86, 0x75, 0xee, 0xa6, 0x4e, 0xdd, 0x4b,
0x69, 0x44, 0x53, 0xa2, 0x86, 0x9f, 0xc9, 0x79, 0xfb, 0x43, 0x86, 0x9a, 0x09, 0x8b, 0x0e, 0x8f,
0xda, 0x5f, 0x4b, 0x1c, 0xb5, 0x9f, 0x1c, 0x52, 0xd3, 0xf0, 0x90, 0xfd, 0x07, 0x25, 0xa8, 0x84,
0x79, 0x29, 0x0d, 0xa7, 0x55, 0x55, 0xc8, 0x50, 0x55, 0x7c, 0x7e, 0x2d, 0x1e, 0x71, 0x7e, 0x2d,
0x8d, 0x31, 0xbf, 0x9e, 0x84, 0x0a, 0xfd, 0x41, 0x2f, 0x3a, 0xb0, 0xf9, 0xb2, 0x4c, 0x13, 0x34,
0xbc, 0x17, 0x99, 0xd8, 0xd4, 0x98, 0x26, 0x96, 0x40, 0xe8, 0x4c, 0x27, 0x11, 0x3a, 0x37, 0xc3,
0xb9, 0xaf, 0x9c, 0x3e, 0x11, 0x0b, 0x25, 0x66, 0xce, 0x7a, 0x89, 0x6d, 0xf0, 0x4a, 0x7a, 0x1b,
0x3c, 0xe2, 0x1f, 0x39, 0xdf, 0xb1, 0x26, 0x5b, 0x26, 0x5b, 0x5c, 0x6b, 0xd3, 0xf4, 0xbb, 0x69,
0x7e, 0x9e, 0xae, 0x7f, 0x9b, 0x21, 0x72, 0xe2, 0x26, 0xc8, 0xdd, 0xe7, 0xeb, 0xd2, 0x61, 0xa8,
0x92, 0x31, 0x8d, 0x85, 0x2e, 0x23, 0x7e, 0x00, 0xba, 0x0b, 0x4b, 0x49, 0x24, 0xdf, 0xa1, 0xdc,
0x5f, 0x0e, 0xa4, 0xf8, 0x67, 0xf1, 0x60, 0x30, 0x07, 0x3f, 0x7b, 0x33, 0x05, 0xf5, 0x18, 0xdb,
0x78, 0xaf, 0xca, 0xa8, 0xb0, 0x43, 0x9b, 0x5c, 0x0a, 0x14, 0x46, 0x83, 0x15, 0xc3, 0xe3, 0xd9,
0x6c, 0x51, 0x51, 0xe1, 0x29, 0x0d, 0xba, 0xa2, 0x21, 0x11, 0xbf, 0xbf, 0xcf, 0xf2, 0xa7, 0xd8,
0x8a, 0x46, 0x24, 0x35, 0xe8, 0xe6, 0x31, 0x7e, 0x66, 0x05, 0x7a, 0xc7, 0x31, 0x31, 0x35, 0xe8,
0x49, 0xad, 0x4c, 0x12, 0xd6, 0x1c, 0x13, 0x47, 0x43, 0xad, 0x7c, 0xd8, 0xa1, 0x56, 0x49, 0x0c,
0xb5, 0x25, 0x98, 0xf2, 0xb0, 0xe1, 0x3b, 0x36, 0x37, 0x49, 0xfe, 0x45, 0x3a, 0xa2, 0x8f, 0x7d,
0x9f, 0x94, 0xc1, 0x63, 0x33, 0xfe, 0x19, 0x8b, 0x23, 0x67, 0x87, 0xc4, 0x91, 0x43, 0xd0, 0xb9,
0x89, 0x38, 0xb2, 0x3a, 0x24, 0x8e, 0x1c, 0x0b, 0x9c, 0x1b, 0x45, 0xcc, 0x73, 0xa3, 0x22, 0xe6,
0x78, 0xc8, 0x39, 0x2f, 0x87, 0x9c, 0xb7, 0xe3, 0x2b, 0xeb, 0x5a, 0x1a, 0xab, 0x30, 0x7c, 0x49,
0x1d, 0x1f, 0xdb, 0x0b, 0xd2, 0xd8, 0x46, 0x97, 0xf8, 0x0e, 0x3e, 0x4a, 0xef, 0xfd, 0x4a, 0x5b,
0x51, 0x6c, 0x73, 0xff, 0xf3, 0x74, 0x05, 0x7f, 0xaf, 0xc0, 0x72, 0x6a, 0xe8, 0x72, 0x67, 0xf0,
0x5a, 0x02, 0x40, 0x3c, 0x14, 0xb9, 0x2b, 0xf0, 0xc3, 0x0d, 0x09, 0x3f, 0x7c, 0x69, 0x18, 0x4b,
0x0e, 0x7c, 0xf8, 0xe8, 0x90, 0xde, 0x6f, 0x2b, 0x80, 0x32, 0x76, 0x21, 0x6e, 0x8a, 0x25, 0xc1,
0x21, 0xb6, 0x26, 0xf9, 0xaa, 0xe0, 0xdd, 0x68, 0x55, 0x50, 0x38, 0xcc, 0xce, 0x4b, 0x88, 0x35,
0xda, 0x80, 0xaa, 0xbc, 0xf9, 0x78, 0x5d, 0xae, 0xcc, 0x6a, 0x7e, 0x65, 0xa8, 0x81, 0x30, 0x62,
0xf5, 0x67, 0x05, 0x38, 0xb3, 0xeb, 0x9a, 0x89, 0x90, 0x97, 0x17, 0x36, 0xbe, 0xab, 0xbd, 0x29,
0xe3, 0xad, 0x8e, 0xa8, 0x89, 0xe2, 0x51, 0x34, 0x81, 0xbe, 0x9e, 0x85, 0x88, 0xbb, 0x2d, 0x9d,
0x5d, 0x0f, 0x6f, 0xe0, 0x08, 0x70, 0xdc, 0x27, 0x1d, 0x09, 0x2a, 0x9c, 0xcd, 0xaf, 0x00, 0x0f,
0x8f, 0xff, 0x37, 0xcc, 0x6f, 0x3c, 0xc3, 0x9d, 0xf6, 0x81, 0xdd, 0x39, 0x84, 0xd6, 0x6b, 0x50,
0xec, 0xf4, 0x4d, 0x7e, 0x6a, 0x46, 0x7e, 0xc6, 0x23, 0xfe, 0xa2, 0x1c, 0xf1, 0xeb, 0x50, 0x8b,
0x4a, 0xe0, 0xe3, 0x70, 0x89, 0x8c, 0x43, 0x93, 0x10, 0x13, 0xe1, 0xb3, 0x1a, 0xff, 0xe2, 0xe9,
0xd8, 0x63, 0x37, 0x9c, 0x58, 0x3a, 0xf6, 0x3c, 0x79, 0x1a, 0x29, 0xca, 0xd3, 0x88, 0xfa, 0x5d,
0x05, 0x66, 0x48, 0x09, 0x9f, 0xa8, 0xfe, 0x7c, 0xd9, 0x5d, 0x8c, 0x96, 0xdd, 0xe1, 0xea, 0xbd,
0x14, 0x5f, 0xbd, 0x47, 0x35, 0x9f, 0xa4, 0xc9, 0xe9, 0x9a, 0x4f, 0x85, 0xe9, 0xd8, 0xf3, 0xd4,
0xb3, 0x30, 0xcb, 0xea, 0xc6, 0x5b, 0x5e, 0x83, 0xe2, 0xc0, 0xeb, 0x89, 0xfe, 0x1b, 0x78, 0x3d,
0xf5, 0x5b, 0x0a, 0x54, 0x1b, 0x41, 0x60, 0x74, 0xf6, 0x0f, 0xd1, 0x80, 0xb0, 0x72, 0x85, 0x78,
0xe5, 0xd2, 0x8d, 0x88, 0xaa, 0x5b, 0xca, 0xa9, 0xee, 0xa4, 0x54, 0x5d, 0x15, 0xe6, 0x44, 0x5d,
0x72, 0x2b, 0xbc, 0x05, 0xa8, 0xe5, 0x78, 0xc1, 0x3d, 0xc7, 0x7b, 0x6a, 0x78, 0xe6, 0xe1, 0x56,
0xd8, 0x08, 0x4a, 0xfc, 0xd1, 0x8c, 0xe2, 0xf9, 0x49, 0x8d, 0xfe, 0x56, 0x5f, 0x82, 0x63, 0x92,
0xbc, 0xdc, 0x82, 0x6f, 0xc1, 0x0c, 0x0d, 0x0b, 0xf8, 0xe2, 0xeb, 0xe5, 0x38, 0xe0, 0x63, 0xd4,
0xc3, 0x0d, 0xeb, 0xb0, 0x40, 0x02, 0x44, 0x9a, 0x1e, 0xfa, 0x97, 0x2b, 0x89, 0xf5, 0xc9, 0x72,
0x4a, 0x44, 0x62, 0x6d, 0xf2, 0x0b, 0x05, 0x26, 0x19, 0xb6, 0x23, 0x19, 0xb4, 0x9d, 0x24, 0x13,
0xaf, 0xeb, 0xe8, 0x81, 0xd1, 0x0d, 0x1f, 0x24, 0x21, 0x09, 0x3b, 0x46, 0x97, 0x9e, 0xc2, 0xd1,
0x4c, 0xd3, 0xea, 0x62, 0x3f, 0x10, 0x27, 0xc7, 0x33, 0x24, 0x6d, 0x9d, 0x25, 0x11, 0xc5, 0xd0,
0x03, 0xf6, 0x12, 0xdd, 0x2d, 0xa5, 0xbf, 0xd1, 0x79, 0x76, 0xaa, 0x33, 0xfc, 0xb8, 0x94, 0x9e,
0xf6, 0xd4, 0xa1, 0x9c, 0x38, 0xe7, 0x0c, 0xbf, 0xd1, 0x05, 0x28, 0xd1, 0x8d, 0xfc, 0xe9, 0x61,
0x5a, 0xa2, 0x24, 0xc4, 0x2a, 0x5c, 0xcb, 0xb6, 0xb1, 0xc9, 0x5f, 0xcb, 0xe0, 0x5f, 0xea, 0xbb,
0x80, 0xe2, 0xca, 0xe3, 0x1d, 0x74, 0x01, 0xa6, 0xa8, 0x6e, 0x45, 0x54, 0xbd, 0x90, 0x12, 0xad,
0x71, 0x02, 0xf5, 0x6b, 0x80, 0x58, 0x59, 0x52, 0x24, 0x7d, 0x98, 0x0e, 0x1c, 0x12, 0x53, 0xff,
0x50, 0x81, 0x63, 0x92, 0x74, 0x5e, 0xbf, 0x97, 0x64, 0xf1, 0x19, 0xd5, 0xe3, 0xa2, 0xdf, 0x96,
0x26, 0xf8, 0x0b, 0xe9, 0x6a, 0xfc, 0x0f, 0x4d, 0xee, 0xff, 0xa0, 0x00, 0x34, 0x06, 0xc1, 0x3e,
0xdf, 0x14, 0x8e, 0x77, 0xa2, 0x92, 0xe8, 0xc4, 0x3a, 0x94, 0x5d, 0xc3, 0xf7, 0x9f, 0x3a, 0x9e,
0x58, 0xf0, 0x86, 0xdf, 0x74, 0x2b, 0x77, 0xc0, 0x1f, 0x12, 0xa9, 0x68, 0xf4, 0x37, 0x7a, 0x01,
0xe6, 0xd8, 0x4b, 0x39, 0xba, 0x61, 0x9a, 0x9e, 0x00, 0x91, 0x56, 0xb4, 0x2a, 0x4b, 0x6d, 0xb0,
0x44, 0x42, 0x66, 0xd1, 0x63, 0x9d, 0xe0, 0x40, 0x0f, 0x9c, 0xc7, 0xd8, 0xe6, 0x8b, 0xd8, 0xaa,
0x48, 0xdd, 0x21, 0x89, 0xec, 0x88, 0xb8, 0x6b, 0xf9, 0x81, 0x27, 0xc8, 0xc4, 0x61, 0x3a, 0x4f,
0xa5, 0x64, 0xea, 0x1f, 0x2b, 0x50, 0x6b, 0x0d, 0x7a, 0x3d, 0xa6, 0xdc, 0xa3, 0x74, 0xf2, 0x45,
0xde, 0x94, 0x42, 0xda, 0xe4, 0x23, 0x45, 0xf1, 0x26, 0x7e, 0x2a, 0xfb, 0x6e, 0x57, 0x61, 0x21,
0x56, 0x63, 0x6e, 0x38, 0xd2, 0x52, 0x43, 0x91, 0x97, 0x1a, 0x6a, 0x03, 0x10, 0xdb, 0x6a, 0x3a,
0x72, 0x2b, 0xd5, 0xe3, 0x70, 0x4c, 0x12, 0xc1, 0xa7, 0xe2, 0x8b, 0x50, 0xe5, 0x80, 0x46, 0x6e,
0x10, 0x27, 0xa0, 0x4c, 0x5c, 0x6a, 0xc7, 0x32, 0x05, 0x72, 0x66, 0xda, 0x75, 0xcc, 0x35, 0xcb,
0xf4, 0xd4, 0x2f, 0x43, 0x95, 0xbf, 0x98, 0xc0, 0x69, 0xef, 0xc0, 0x1c, 0x3f, 0x68, 0xd5, 0xa5,
0x2b, 0xc6, 0x27, 0x32, 0x50, 0xb3, 0x42, 0x15, 0x76, 0xfc, 0x53, 0xfd, 0x3a, 0xd4, 0x59, 0xb4,
0x20, 0x09, 0x16, 0x0d, 0xbc, 0x03, 0x02, 0xb4, 0x36, 0x44, 0xbe, 0xcc, 0x59, 0xf5, 0xe2, 0x9f,
0xea, 0x69, 0x38, 0x99, 0x29, 0x9f, 0xb7, 0xde, 0x85, 0x5a, 0x94, 0xc1, 0xee, 0xc1, 0x86, 0x70,
0x20, 0x25, 0x06, 0x07, 0x5a, 0x0a, 0x43, 0xf8, 0x82, 0x98, 0xb9, 0x68, 0x94, 0x1e, 0x2d, 0x01,
0x8b, 0x79, 0x4b, 0xc0, 0x92, 0xb4, 0x04, 0x54, 0x37, 0x43, 0x1d, 0xf2, 0x85, 0xf8, 0x6d, 0xba,
0x55, 0xc0, 0xca, 0x16, 0x4e, 0xed, 0x54, 0x76, 0xfb, 0x18, 0x91, 0x16, 0xa3, 0x57, 0x2f, 0x40,
0x55, 0x76, 0x6f, 0x31, 0x8f, 0xa5, 0xc8, 0x1e, 0xeb, 0xff, 0xc0, 0x92, 0x26, 0x21, 0x00, 0xef,
0x61, 0x23, 0x18, 0x78, 0xd8, 0x47, 0x6f, 0x41, 0x3d, 0xe3, 0xf1, 0x22, 0x9d, 0xaf, 0x0c, 0x99,
0x98, 0xe5, 0xd4, 0x1b, 0x46, 0x9b, 0x6c, 0x5d, 0xf8, 0x12, 0xcc, 0x53, 0x84, 0x62, 0xec, 0x66,
0x2f, 0xd3, 0x11, 0x7d, 0xfb, 0x66, 0x2b, 0xba, 0xc6, 0x6b, 0x86, 0xef, 0x6d, 0xf0, 0xf2, 0x33,
0xcf, 0xd8, 0xde, 0x81, 0xf2, 0x1e, 0xaf, 0x17, 0x1f, 0x90, 0x6a, 0x86, 0x32, 0x12, 0x2d, 0xd0,
0x42, 0x1e, 0x75, 0x1b, 0xe6, 0x39, 0x4d, 0xd8, 0xbc, 0xdb, 0x43, 0x41, 0x31, 0xac, 0x79, 0xb9,
0x70, 0x17, 0xf5, 0x87, 0x05, 0x98, 0x4b, 0xf8, 0xf8, 0x57, 0x13, 0x0b, 0xba, 0x2c, 0x73, 0x4c,
0x2c, 0xe7, 0x6e, 0x48, 0xde, 0x5e, 0x86, 0xe0, 0x0c, 0xbf, 0x04, 0xba, 0x01, 0xb5, 0x04, 0x9e,
0x53, 0x60, 0xb9, 0xeb, 0xf9, 0x8a, 0xd1, 0xe6, 0x65, 0xb0, 0xa7, 0x8f, 0xde, 0x8c, 0xe9, 0xb5,
0x94, 0x5e, 0x86, 0x26, 0x74, 0x16, 0x29, 0xf4, 0xe8, 0x13, 0xcd, 0x22, 0x9f, 0x7e, 0xef, 0xf9,
0x84, 0x9f, 0xdb, 0xa7, 0xfa, 0x1c, 0xcc, 0xec, 0xe6, 0x3d, 0x69, 0x54, 0x12, 0x30, 0xd1, 0x37,
0x60, 0xf1, 0x9e, 0xd5, 0xc3, 0xfe, 0x81, 0x1f, 0xe0, 0x7e, 0x93, 0xce, 0x0a, 0x7b, 0x16, 0xf6,
0xd0, 0x2a, 0x00, 0x35, 0x4a, 0xd7, 0xb1, 0xc2, 0x27, 0x56, 0x62, 0x29, 0xea, 0x4f, 0x15, 0x98,
0x8f, 0x18, 0xc7, 0xc1, 0x02, 0xbf, 0x0e, 0x93, 0x7b, 0xbe, 0xd8, 0xd0, 0x4d, 0x1c, 0x73, 0x65,
0x55, 0x41, 0x2b, 0xed, 0xf9, 0x4d, 0x13, 0xbd, 0x01, 0x30, 0xf0, 0xb1, 0xc9, 0x8f, 0xbd, 0x47,
0xa0, 0xb3, 0x2b, 0x84, 0x94, 0x9d, 0x83, 0xdf, 0x80, 0x19, 0xcb, 0x76, 0x4c, 0x4c, 0x21, 0x11,
0xe6, 0x28, 0x64, 0x36, 0x30, 0xda, 0x5d, 0x1f, 0x9b, 0xea, 0xef, 0x45, 0xc0, 0x86, 0x2f, 0x72,
0x0b, 0xd5, 0x3f, 0x11, 0x71, 0x91, 0xe8, 0x76, 0x3e, 0x66, 0x1e, 0xc0, 0x02, 0x9b, 0xde, 0xf6,
0xc2, 0x32, 0x33, 0xaf, 0xac, 0x25, 0x1a, 0xa7, 0xd5, 0x2c, 0x1e, 0x11, 0x0b, 0x26, 0xd4, 0x82,
0xe3, 0xd1, 0x42, 0x25, 0x2e, 0xad, 0x30, 0x5a, 0xda, 0x62, 0x27, 0xb6, 0xff, 0x2f, 0x18, 0xd5,
0x5b, 0x70, 0x3c, 0x71, 0x2b, 0x65, 0xfc, 0x43, 0xa0, 0xf7, 0x12, 0x5b, 0xb6, 0x91, 0x97, 0xb8,
0x2a, 0x5f, 0x86, 0x1c, 0x76, 0x7f, 0x88, 0xdf, 0xcb, 0xdb, 0x85, 0x13, 0xd2, 0x7e, 0xb2, 0x54,
0x97, 0x1b, 0x89, 0x65, 0xc3, 0xd9, 0x7c, 0x79, 0x89, 0xf5, 0xc3, 0x7f, 0x28, 0xb0, 0x98, 0x45,
0x70, 0xc4, 0x63, 0x8e, 0x0f, 0x73, 0x2e, 0x52, 0xbf, 0x36, 0xaa, 0x42, 0x9f, 0xc9, 0xb1, 0xd0,
0x16, 0xbb, 0x86, 0x39, 0xba, 0x4f, 0x8a, 0xe3, 0xf5, 0xc9, 0x2f, 0x0a, 0xb1, 0xa3, 0xbc, 0x21,
0x57, 0x25, 0x3f, 0xc1, 0xfe, 0xf9, 0x5a, 0xe2, 0xa6, 0xe4, 0xcb, 0x99, 0x8c, 0x23, 0x2e, 0x4a,
0x6a, 0x59, 0xdb, 0x42, 0x57, 0x47, 0x49, 0xfa, 0xc2, 0xde, 0x93, 0xfc, 0xad, 0x02, 0xcc, 0xc9,
0x1d, 0x82, 0xde, 0xcd, 0xb8, 0x26, 0x79, 0x66, 0x44, 0x03, 0xa5, 0x5b, 0x92, 0xfc, 0x5a, 0x62,
0x61, 0xfc, 0x6b, 0x89, 0xc5, 0xf1, 0xae, 0x25, 0xde, 0x85, 0xb9, 0xa7, 0x9e, 0x15, 0x18, 0x8f,
0x7a, 0x58, 0xef, 0x19, 0x07, 0xd8, 0xcb, 0x9a, 0x61, 0x93, 0xae, 0xa8, 0x2a, 0x58, 0x1e, 0x12,
0x0e, 0xba, 0x60, 0x7e, 0x6a, 0xb8, 0x7c, 0xdd, 0x2d, 0x85, 0xf2, 0xed, 0xa7, 0x86, 0xcb, 0x78,
0x28, 0x89, 0xfa, 0xad, 0x02, 0x1c, 0xcf, 0xbc, 0x4c, 0xf7, 0xc9, 0x55, 0x74, 0x29, 0xae, 0xa2,
0xc3, 0xdc, 0x50, 0x2c, 0x1e, 0xea, 0x86, 0x62, 0x33, 0x47, 0x61, 0x59, 0x58, 0x91, 0xe1, 0x7a,
0x53, 0xff, 0x42, 0x81, 0xb2, 0xa8, 0xd4, 0xc8, 0xfb, 0x82, 0xcb, 0x03, 0x42, 0xa6, 0xd3, 0x3b,
0x1d, 0xb6, 0x61, 0x3b, 0xba, 0x8f, 0x49, 0x2c, 0x3d, 0xf2, 0x76, 0xd6, 0x22, 0xe5, 0x5b, 0x73,
0x3c, 0xbc, 0x65, 0xd8, 0x4e, 0x9b, 0x31, 0xa1, 0x06, 0xd4, 0x98, 0x3c, 0x2a, 0x8a, 0x08, 0x1d,
0x39, 0x51, 0xce, 0x51, 0x06, 0x22, 0x84, 0x08, 0xf3, 0xd5, 0xbf, 0x56, 0x60, 0x3e, 0xa1, 0xd9,
0x5f, 0xbd, 0x46, 0x7c, 0xbf, 0x08, 0x33, 0xb1, 0x5e, 0x1e, 0xd1, 0x80, 0x35, 0x58, 0x10, 0x78,
0x2f, 0x1f, 0x07, 0xe3, 0xdd, 0x8e, 0x9b, 0xe7, 0x1c, 0x6d, 0x1c, 0xb0, 0x38, 0xea, 0x0e, 0xcc,
0x1b, 0x4f, 0x0c, 0xab, 0x47, 0x2d, 0x68, 0xac, 0x10, 0x65, 0x2e, 0xa4, 0x0f, 0x23, 0x31, 0xd6,
0xee, 0xb1, 0xee, 0xc8, 0x01, 0xa5, 0x8d, 0xae, 0x2a, 0xfa, 0x7e, 0x0c, 0xf1, 0x38, 0xf4, 0xaa,
0xa2, 0xef, 0x87, 0xe5, 0xd1, 0x0b, 0x2d, 0xf4, 0x8e, 0xa6, 0xcf, 0x1f, 0xf6, 0xc9, 0x2f, 0x8f,
0xd0, 0xde, 0xa3, 0xa4, 0x44, 0x61, 0x7d, 0xe3, 0x23, 0xc7, 0xd3, 0xe3, 0xfc, 0xd3, 0x23, 0x14,
0x46, 0x39, 0x5a, 0xa1, 0x10, 0xf5, 0xcf, 0x14, 0xa8, 0x84, 0x7e, 0x64, 0x44, 0x0f, 0x35, 0x61,
0x91, 0xde, 0xfe, 0x49, 0x6a, 0x78, 0x44, 0x27, 0x21, 0xc2, 0xd4, 0x90, 0xb5, 0xdc, 0x80, 0x1a,
0x15, 0x15, 0x57, 0xf5, 0xa8, 0x8e, 0xf2, 0x45, 0x35, 0x59, 0x40, 0xf9, 0x97, 0x05, 0x40, 0x69,
0x57, 0xf2, 0x2b, 0x63, 0x64, 0xf1, 0x4e, 0x2b, 0x8d, 0xdf, 0xe9, 0xf7, 0xe1, 0x58, 0xc7, 0xe9,
0xf7, 0x2d, 0x7a, 0x73, 0xcc, 0xf1, 0x0e, 0xc6, 0x33, 0xb7, 0x05, 0xc6, 0xc3, 0xf4, 0xc4, 0xd4,
0xf7, 0x0e, 0x9c, 0xd0, 0xb0, 0xe3, 0x62, 0x3b, 0x74, 0xfd, 0x0f, 0x9d, 0xee, 0x21, 0xe2, 0xdb,
0x53, 0x50, 0xcf, 0xe2, 0xe7, 0xfb, 0x27, 0x03, 0xa8, 0xaf, 0xed, 0xe3, 0xce, 0x63, 0xba, 0xfc,
0x3a, 0x0a, 0x66, 0xab, 0x0e, 0xe5, 0x9e, 0xd3, 0x61, 0xcf, 0x3c, 0xf3, 0x2d, 0x46, 0xf1, 0x3d,
0xe4, 0x74, 0xe7, 0x34, 0x9c, 0xcc, 0x2c, 0x96, 0xd7, 0x0a, 0x41, 0xed, 0x3e, 0x0e, 0x36, 0x9e,
0x60, 0x3b, 0x0c, 0x9f, 0xd5, 0x1f, 0x17, 0x62, 0x81, 0x3a, 0xcd, 0x3a, 0x04, 0xd6, 0x0d, 0xb5,
0x20, 0x5a, 0x39, 0xe8, 0x98, 0x70, 0xb3, 0x37, 0x4b, 0xd9, 0x8b, 0xc2, 0xd9, 0x87, 0xdd, 0xb4,
0x10, 0xfa, 0x54, 0x69, 0xf4, 0x1a, 0x53, 0x98, 0x96, 0x80, 0x40, 0x14, 0x93, 0x10, 0x88, 0xf7,
0x00, 0xc5, 0x43, 0x71, 0xbe, 0xdd, 0x50, 0x1a, 0xe3, 0x01, 0xaa, 0x9a, 0x9b, 0x7c, 0x2a, 0x2d,
0xe7, 0x19, 0xa9, 0xc9, 0x23, 0x3d, 0x23, 0xa5, 0xae, 0xc2, 0x29, 0x12, 0x60, 0x6f, 0xe2, 0xc0,
0xb3, 0x3a, 0xeb, 0xd8, 0xef, 0x78, 0x96, 0x1b, 0x38, 0x21, 0xfc, 0x4a, 0xd5, 0xe1, 0x74, 0x4e,
0x3e, 0x57, 0xf7, 0x3b, 0x30, 0x63, 0x46, 0xc9, 0x59, 0x3b, 0x5e, 0x49, 0x5e, 0x2d, 0xce, 0xa0,
0x7e, 0x00, 0xb5, 0x24, 0x41, 0xe6, 0x4e, 0x12, 0x82, 0xd2, 0x3e, 0xee, 0xb9, 0xe2, 0xaa, 0x1f,
0xf9, 0x4d, 0xb4, 0xce, 0xd6, 0x2e, 0x8f, 0xf1, 0x81, 0x38, 0x11, 0xa9, 0xd0, 0x94, 0x2f, 0xe1,
0x83, 0xb0, 0x6d, 0xd2, 0xbb, 0x26, 0x9e, 0xd5, 0x49, 0xb6, 0x2d, 0x23, 0x3f, 0x6a, 0x1b, 0xe9,
0xb6, 0x3e, 0x4b, 0xe6, 0x6d, 0x3b, 0x9d, 0xfb, 0x66, 0x0a, 0xe5, 0x05, 0xd7, 0x31, 0xf9, 0x6f,
0xf5, 0x07, 0x0a, 0x2c, 0xa4, 0x28, 0xc6, 0x3c, 0xe5, 0x7a, 0x05, 0xa6, 0x45, 0xb9, 0x85, 0x34,
0xa4, 0x99, 0xc9, 0xd2, 0x04, 0x09, 0x6a, 0xc2, 0x42, 0x64, 0xd1, 0x82, 0xaf, 0x98, 0xee, 0x8b,
0xf8, 0xc2, 0x85, 0x56, 0xb7, 0xd6, 0x49, 0xa4, 0xa8, 0x1d, 0xa8, 0x25, 0xa9, 0xc6, 0x19, 0x53,
0x87, 0xaa, 0xaf, 0xfa, 0xb7, 0x0a, 0x4c, 0xb1, 0xb4, 0xcc, 0xce, 0x96, 0xa6, 0x83, 0x42, 0x72,
0x3a, 0x78, 0x13, 0x66, 0x98, 0x1c, 0x3d, 0xbc, 0xe8, 0x39, 0x27, 0x6f, 0xf4, 0x33, 0xd1, 0x74,
0xb4, 0x42, 0x3f, 0xfc, 0x4d, 0x9a, 0xc1, 0xec, 0x85, 0xae, 0x4c, 0x04, 0x70, 0x7d, 0x86, 0xa6,
0x51, 0x97, 0x4b, 0x42, 0x66, 0xbe, 0x86, 0x19, 0xe1, 0x9b, 0xf9, 0xd6, 0xd6, 0x12, 0x7d, 0xa5,
0x33, 0xb5, 0xd5, 0xad, 0xee, 0xd0, 0x67, 0x34, 0xd3, 0x5b, 0xd4, 0xe8, 0x2d, 0x19, 0xe8, 0xf0,
0x42, 0x0a, 0x6b, 0x20, 0xb1, 0x0d, 0x3c, 0xf6, 0x1c, 0x3e, 0xc7, 0x3b, 0x7c, 0x08, 0x27, 0x72,
0x69, 0xd0, 0xdb, 0xe1, 0x9b, 0xc5, 0xa6, 0x67, 0x3d, 0xe1, 0x1b, 0x0b, 0x73, 0xf2, 0xfb, 0x28,
0x6b, 0x94, 0x60, 0x9d, 0xe6, 0x8b, 0xd7, 0x8c, 0xd9, 0xd7, 0xc5, 0x17, 0xa1, 0x2c, 0xfe, 0x55,
0x01, 0x9a, 0x86, 0xe2, 0xce, 0x5a, 0xab, 0x36, 0x41, 0x7e, 0xec, 0xae, 0xb7, 0x6a, 0x0a, 0x2a,
0x43, 0xa9, 0xbd, 0xb6, 0xd3, 0xaa, 0x15, 0x2e, 0xf6, 0xa1, 0x96, 0x7c, 0xad, 0x1f, 0x2d, 0xc3,
0xb1, 0x96, 0xb6, 0xdd, 0x6a, 0xdc, 0x6f, 0xec, 0x34, 0xb7, 0xb7, 0xf4, 0x96, 0xd6, 0x7c, 0xbf,
0xb1, 0xb3, 0x51, 0x9b, 0x40, 0xe7, 0xe0, 0x74, 0x3c, 0xe3, 0xc1, 0x76, 0x7b, 0x47, 0xdf, 0xd9,
0xd6, 0xd7, 0xb6, 0xb7, 0x76, 0x1a, 0xcd, 0xad, 0x0d, 0xad, 0xa6, 0xa0, 0xd3, 0x70, 0x22, 0x4e,
0x72, 0xb7, 0xb9, 0xde, 0xd4, 0x36, 0xd6, 0xc8, 0xef, 0xc6, 0xc3, 0x5a, 0xe1, 0xe2, 0xdb, 0x50,
0x95, 0xee, 0x82, 0x91, 0x2a, 0xb5, 0xb6, 0xd7, 0x6b, 0x13, 0xa8, 0x0a, 0x95, 0xb8, 0x9c, 0x32,
0x94, 0xb6, 0xb6, 0xd7, 0x37, 0x6a, 0x05, 0x04, 0x30, 0xb5, 0xd3, 0xd0, 0xee, 0x6f, 0xec, 0xd4,
0x8a, 0x17, 0x5f, 0x85, 0x95, 0xbc, 0x3b, 0x91, 0xa8, 0x02, 0x93, 0x9b, 0xd8, 0xeb, 0xe2, 0xda,
0x04, 0x61, 0x69, 0x13, 0x2b, 0x09, 0x6a, 0xca, 0xc5, 0x5b, 0xc9, 0x27, 0x7d, 0x30, 0x5a, 0x80,
0x6a, 0xbb, 0xb1, 0xb5, 0x7e, 0x77, 0xfb, 0xab, 0xba, 0xb6, 0xd1, 0x58, 0xff, 0xa0, 0x36, 0x81,
0x16, 0xa1, 0x26, 0x92, 0xb6, 0xb6, 0x77, 0x58, 0xaa, 0x72, 0xf1, 0x71, 0x62, 0x99, 0x8b, 0xd1,
0x71, 0x58, 0x08, 0x6b, 0xa9, 0xaf, 0x69, 0x1b, 0x8d, 0x9d, 0x0d, 0x52, 0x79, 0x29, 0x59, 0xdb,
0xdd, 0xda, 0x6a, 0x6e, 0xdd, 0xaf, 0x29, 0x44, 0x6a, 0x94, 0xbc, 0xf1, 0xd5, 0x26, 0x21, 0x2e,
0xc8, 0xc4, 0xbb, 0x5b, 0x5f, 0xda, 0xda, 0xfe, 0xca, 0x56, 0xad, 0x78, 0xf1, 0xff, 0xc7, 0x71,
0x3d, 0xd1, 0x54, 0x74, 0x12, 0x96, 0x53, 0x25, 0xea, 0x1b, 0xef, 0x6f, 0x6c, 0xed, 0xd4, 0x26,
0xe4, 0xcc, 0xf6, 0x4e, 0x43, 0x8b, 0x32, 0x95, 0x64, 0xe6, 0x76, 0xab, 0x15, 0x66, 0x16, 0xe4,
0xcc, 0xf5, 0x8d, 0x87, 0x1b, 0x11, 0x67, 0xf1, 0xe2, 0xf3, 0x00, 0xd1, 0x90, 0x43, 0x33, 0x30,
0xbd, 0xb6, 0xbd, 0xbb, 0xb5, 0xb3, 0xa1, 0xd5, 0x26, 0x88, 0x96, 0xef, 0x37, 0x76, 0xef, 0x6f,
0xd4, 0x94, 0x8b, 0x17, 0x60, 0x36, 0x6e, 0x80, 0x84, 0xae, 0xfd, 0x41, 0x7b, 0x67, 0x63, 0x93,
0x68, 0x64, 0x16, 0xca, 0x6b, 0xf7, 0xb5, 0xed, 0xdd, 0xd6, 0xbd, 0x76, 0x4d, 0xb9, 0xf6, 0x5f,
0x8b, 0xe1, 0xf1, 0x42, 0x1b, 0x7b, 0xf4, 0x5e, 0xcc, 0x3a, 0x4c, 0x8b, 0xff, 0x07, 0x22, 0x6d,
0xf4, 0xc8, 0xff, 0xbf, 0xa4, 0x7e, 0x32, 0x33, 0x8f, 0x87, 0x12, 0x13, 0xe8, 0x7d, 0x7a, 0x60,
0x13, 0x7b, 0x50, 0xef, 0x6c, 0x62, 0xdf, 0x3c, 0xf5, 0x6e, 0x5f, 0xfd, 0xdc, 0x10, 0x8a, 0x50,
0xee, 0x07, 0x30, 0x27, 0xbf, 0x5c, 0x8b, 0xce, 0xc9, 0xa7, 0x02, 0x19, 0x8f, 0xe2, 0xd6, 0xd5,
0x61, 0x24, 0xa1, 0x68, 0x1d, 0x6a, 0xc9, 0x97, 0x6b, 0x91, 0x84, 0x51, 0xca, 0x79, 0x18, 0xb7,
0xfe, 0xfc, 0x70, 0xa2, 0x78, 0x01, 0xa9, 0x07, 0x59, 0x9f, 0x1b, 0xfe, 0xc4, 0x65, 0x46, 0x01,
0x79, 0xef, 0x60, 0x32, 0xe5, 0xc8, 0x13, 0x2d, 0x4a, 0xbc, 0x81, 0x9a, 0xf1, 0x5c, 0xa2, 0xac,
0x9c, 0xec, 0xa7, 0xf2, 0xd4, 0x09, 0xf4, 0xbf, 0x60, 0x3e, 0x71, 0xe9, 0x01, 0x49, 0x8c, 0xd9,
0x77, 0x39, 0xea, 0xcf, 0x0d, 0xa5, 0x91, 0x7b, 0x35, 0x7e, 0xb1, 0x21, 0xd9, 0xab, 0x19, 0x17,
0x26, 0x92, 0xbd, 0x9a, 0x79, 0x2f, 0x82, 0x1a, 0xa2, 0x74, 0x89, 0x41, 0x36, 0xc4, 0xac, 0x4b,
0x13, 0xf5, 0x73, 0x43, 0x28, 0xe2, 0x0a, 0x49, 0x5c, 0x63, 0x90, 0x15, 0x92, 0x7d, 0x41, 0xa2,
0xfe, 0xdc, 0x50, 0x9a, 0x64, 0x4f, 0x46, 0x18, 0xe9, 0x74, 0x4f, 0xa6, 0x20, 0xfc, 0xe9, 0x9e,
0x4c, 0x43, 0xac, 0x79, 0x4f, 0x26, 0x50, 0xcd, 0xea, 0x50, 0x9c, 0x64, 0x56, 0x4f, 0x66, 0x63,
0x29, 0xd5, 0x09, 0xf4, 0x14, 0x56, 0xf2, 0x70, 0x6c, 0xe8, 0xe5, 0x43, 0xc0, 0xed, 0xea, 0xaf,
0x8c, 0x47, 0x1c, 0x16, 0x8c, 0x01, 0xa5, 0x57, 0x5c, 0xe8, 0x05, 0x59, 0xdd, 0x39, 0x2b, 0xba,
0xfa, 0x8b, 0xa3, 0xc8, 0xc2, 0x62, 0xee, 0x43, 0x59, 0x20, 0xe4, 0x90, 0xe4, 0x02, 0x13, 0xc8,
0xbc, 0xfa, 0xa9, 0xec, 0xcc, 0x50, 0xd0, 0x5b, 0x50, 0x22, 0xa9, 0x68, 0x39, 0x49, 0x27, 0x04,
0xac, 0xa4, 0x33, 0x42, 0xe6, 0x06, 0x4c, 0x31, 0xe8, 0x17, 0x92, 0x0e, 0x51, 0x25, 0x68, 0x5a,
0xbd, 0x9e, 0x95, 0x15, 0x8a, 0x68, 0xb1, 0xff, 0xae, 0xc4, 0x91, 0x5c, 0x68, 0x35, 0xf9, 0x66,
0xbd, 0x0c, 0x19, 0xab, 0x9f, 0xc9, 0xcd, 0x8f, 0xdb, 0x6c, 0x62, 0x63, 0xf5, 0xdc, 0x90, 0x83,
0x82, 0x2c, 0x9b, 0xcd, 0x3e, 0x7e, 0x60, 0x9d, 0x9b, 0x3e, 0x9e, 0x40, 0x2f, 0xe4, 0xda, 0xbb,
0x54, 0xc4, 0x8b, 0xa3, 0xc8, 0xe2, 0x43, 0x23, 0xf9, 0xf8, 0x9c, 0x3a, 0xec, 0x61, 0xc8, 0xac,
0xa1, 0x91, 0xf3, 0xe0, 0xa4, 0x3a, 0x81, 0xf6, 0xe1, 0x58, 0xc6, 0x8b, 0x94, 0xe8, 0xc5, 0x7c,
0xff, 0x2b, 0x95, 0xf2, 0xd2, 0x48, 0xba, 0x78, 0x49, 0x19, 0xf0, 0x0d, 0xb9, 0xa4, 0x7c, 0xfc,
0x88, 0x5c, 0xd2, 0x30, 0x1c, 0x08, 0x35, 0x44, 0xee, 0x43, 0x4e, 0x64, 0x1d, 0xce, 0x67, 0x18,
0x62, 0xca, 0x63, 0xec, 0xc3, 0xb1, 0x8c, 0x5d, 0x09, 0xb9, 0xb2, 0xf9, 0xbb, 0x25, 0x72, 0x65,
0x87, 0x6d, 0x6f, 0x4c, 0xa0, 0x0f, 0x01, 0xdd, 0xc7, 0x81, 0x1c, 0xca, 0xf9, 0x48, 0x1a, 0xa8,
0xc9, 0x0d, 0x90, 0x1c, 0xfb, 0x94, 0x76, 0x42, 0xd4, 0x89, 0xab, 0x0a, 0xb2, 0xd9, 0xbd, 0xaa,
0xd4, 0xfa, 0x1d, 0x9d, 0x4f, 0x76, 0x5b, 0xde, 0x16, 0x40, 0xfd, 0xc2, 0x18, 0x94, 0x61, 0x5b,
0xec, 0xe4, 0xeb, 0xc7, 0x62, 0x09, 0x79, 0x3e, 0xdf, 0x4c, 0xe4, 0x65, 0x79, 0xba, 0xbc, 0xdc,
0x05, 0x7a, 0x18, 0xcf, 0xc5, 0x8c, 0xe9, 0x6c, 0x3e, 0x98, 0x28, 0x27, 0x9e, 0xcb, 0x32, 0xa0,
0x6b, 0xdf, 0x2b, 0xc2, 0x2c, 0x03, 0x5d, 0xf1, 0xf0, 0x73, 0x13, 0x20, 0xc2, 0x2f, 0xa2, 0xd3,
0xc9, 0x3a, 0x4a, 0xa0, 0xd0, 0xfa, 0x6a, 0x5e, 0x76, 0xdc, 0xcd, 0xc5, 0x70, 0x81, 0xb2, 0x9b,
0x4b, 0xc3, 0x1c, 0x65, 0x37, 0x97, 0x01, 0x28, 0x54, 0x27, 0xd0, 0x7b, 0x50, 0x09, 0x61, 0x68,
0xb2, 0xf1, 0x24, 0xf1, 0x74, 0xf5, 0xd3, 0x39, 0xb9, 0xf1, 0xda, 0xc5, 0xd0, 0x65, 0x72, 0xed,
0xd2, 0xc8, 0x35, 0xb9, 0x76, 0x59, 0xb0, 0xb4, 0xa8, 0xbd, 0x0c, 0x47, 0x90, 0xd1, 0x5e, 0x09,
0x57, 0x92, 0xd1, 0x5e, 0x19, 0x80, 0xa0, 0x4e, 0xdc, 0xbd, 0xf3, 0x93, 0x9f, 0xaf, 0x2a, 0x3f,
0xfd, 0xf9, 0xea, 0xc4, 0xff, 0xfd, 0x78, 0x55, 0xf9, 0xc9, 0xc7, 0xab, 0xca, 0x3f, 0x7e, 0xbc,
0xaa, 0xfc, 0xec, 0xe3, 0x55, 0xe5, 0xdb, 0xff, 0xba, 0x3a, 0xf1, 0xa1, 0xfa, 0xf8, 0x86, 0x7f,
0xd9, 0x72, 0xae, 0x74, 0x3c, 0xeb, 0x92, 0xe1, 0x5a, 0x57, 0xdc, 0xc7, 0xdd, 0x2b, 0x86, 0x6b,
0xf9, 0x57, 0xb8, 0xdc, 0x2b, 0x4f, 0x5e, 0x7d, 0x34, 0x45, 0xff, 0x23, 0xdf, 0x6b, 0xff, 0x1d,
0x00, 0x00, 0xff, 0xff, 0xc7, 0xd9, 0x11, 0x7e, 0x4b, 0x71, 0x00, 0x00,
0xa3, 0xed, 0xe2, 0x8e, 0xc6, 0x68, 0xd0, 0xf3, 0x30, 0x47, 0x7f, 0xe8, 0xfe, 0xe0, 0x11, 0xd3,
0x3a, 0x50, 0xad, 0xcf, 0xd2, 0xd4, 0xf6, 0xe0, 0x11, 0xd1, 0xbc, 0xaa, 0x43, 0x25, 0xac, 0x5c,
0xd4, 0xdb, 0x26, 0xed, 0xc3, 0x2a, 0xef, 0x6d, 0x93, 0x8c, 0xb2, 0xa8, 0x8f, 0x2d, 0x93, 0xf6,
0x5f, 0x55, 0x9b, 0x09, 0xd3, 0x9a, 0x26, 0x5a, 0x82, 0xa9, 0x1e, 0xb6, 0xbb, 0xc1, 0x3e, 0xed,
0xc0, 0xaa, 0xc6, 0xbf, 0xd4, 0xdf, 0x50, 0xa0, 0xba, 0xeb, 0x63, 0x8f, 0x0c, 0x45, 0xdf, 0x35,
0x3a, 0x18, 0x5d, 0x82, 0x52, 0xdf, 0x31, 0x31, 0xb7, 0xe2, 0x13, 0xf1, 0x46, 0x84, 0x44, 0x9b,
0x8e, 0x89, 0x35, 0x4a, 0x86, 0x2e, 0x40, 0x69, 0x60, 0x99, 0x6c, 0xe8, 0xe4, 0xaa, 0x95, 0x92,
0x10, 0xd2, 0x2e, 0x21, 0x2d, 0x0e, 0x25, 0x25, 0x24, 0xea, 0x2f, 0x15, 0x98, 0x0f, 0x4b, 0xdb,
0xa6, 0x63, 0x0e, 0xbd, 0x06, 0xd3, 0x36, 0x0e, 0x9e, 0x3a, 0xde, 0xe3, 0xd1, 0x75, 0x13, 0x94,
0xe8, 0x65, 0x28, 0xba, 0x5c, 0x23, 0x43, 0x19, 0x08, 0x15, 0x21, 0xb6, 0xdc, 0x0e, 0xd5, 0xd0,
0x70, 0x62, 0xcb, 0xed, 0x90, 0x11, 0x13, 0x18, 0x5e, 0x17, 0xd3, 0xfe, 0x60, 0xa3, 0xaf, 0xcc,
0x12, 0x9a, 0x26, 0xba, 0x03, 0x73, 0x03, 0x1f, 0x7b, 0xb6, 0xaf, 0x0b, 0xff, 0x31, 0x49, 0x6d,
0x42, 0x12, 0x2a, 0xe9, 0x5d, 0xab, 0x32, 0x86, 0x6d, 0xee, 0x60, 0x54, 0x80, 0xa6, 0x1d, 0xbc,
0x71, 0xfd, 0x7d, 0xa3, 0x37, 0xc0, 0x68, 0x11, 0x26, 0x9f, 0x90, 0x1f, 0xb4, 0xe5, 0x45, 0x8d,
0x7d, 0xa8, 0xdf, 0x9b, 0x84, 0x93, 0x0f, 0xc9, 0x18, 0x6b, 0x1b, 0xb6, 0xf9, 0xc8, 0x79, 0xd6,
0x26, 0x26, 0x69, 0x05, 0x07, 0x6b, 0x8e, 0x1d, 0xe0, 0x67, 0x01, 0x7a, 0x00, 0x0b, 0xb6, 0x90,
0x1f, 0x56, 0x44, 0xa1, 0x15, 0x39, 0x99, 0xd9, 0x3a, 0x56, 0xb8, 0x56, 0xb3, 0xe5, 0x04, 0x1f,
0xdd, 0x8d, 0x46, 0xb9, 0x90, 0x53, 0x48, 0x37, 0xa8, 0xbd, 0x41, 0x6b, 0xc3, 0xa5, 0x08, 0x07,
0x20, 0x64, 0xbc, 0x01, 0xc4, 0xef, 0xeb, 0x86, 0xaf, 0x93, 0x96, 0x52, 0x2d, 0xcf, 0x5c, 0x5b,
0x92, 0xac, 0x20, 0x6c, 0xb0, 0x56, 0xf1, 0x06, 0x76, 0xc3, 0x27, 0x1a, 0x42, 0x37, 0xe8, 0x1c,
0x42, 0xf8, 0xba, 0x9e, 0x33, 0x70, 0xe9, 0xf8, 0xcb, 0x67, 0x04, 0xca, 0x78, 0x9f, 0x50, 0xd2,
0xa9, 0x85, 0xfb, 0x29, 0xdd, 0x73, 0x9c, 0x60, 0xcf, 0x17, 0xbe, 0x49, 0x24, 0x6b, 0x34, 0x15,
0x5d, 0x81, 0x63, 0xfe, 0xc0, 0x75, 0x7b, 0xb8, 0x8f, 0xed, 0xc0, 0xe8, 0xb1, 0x82, 0x48, 0x9f,
0x15, 0xcf, 0x17, 0x35, 0x14, 0xcf, 0xa2, 0x82, 0x7d, 0xf4, 0x08, 0xea, 0x19, 0x0c, 0xba, 0xeb,
0xf4, 0xac, 0xce, 0xc1, 0xca, 0x0c, 0x35, 0xa0, 0xe7, 0x25, 0xd5, 0xa4, 0x64, 0xb4, 0x28, 0xad,
0xb6, 0xe2, 0xe7, 0xe4, 0xa0, 0x55, 0x00, 0xd7, 0xb3, 0x9e, 0x58, 0x3d, 0xdc, 0xc5, 0xe6, 0xca,
0x14, 0xad, 0x78, 0x2c, 0x05, 0xbd, 0x4e, 0xa6, 0xb4, 0x4e, 0xc7, 0xe9, 0xbb, 0xdc, 0xe1, 0x48,
0x7d, 0x2a, 0x6c, 0xa1, 0xe5, 0x39, 0x7b, 0x56, 0x0f, 0x6b, 0x82, 0x16, 0xbd, 0x09, 0x65, 0xc3,
0x75, 0x0d, 0xaf, 0xef, 0x78, 0xd4, 0xe5, 0x8c, 0xe0, 0x0b, 0x89, 0xd1, 0x75, 0x58, 0xe4, 0x32,
0x74, 0x97, 0x65, 0x32, 0xbf, 0x35, 0x4d, 0x6c, 0xff, 0x6e, 0x61, 0x45, 0xd1, 0x10, 0xcf, 0xe7,
0xbc, 0xd4, 0x83, 0xfd, 0xad, 0x02, 0xf3, 0x09, 0x99, 0xe8, 0x3d, 0x98, 0x15, 0x12, 0x82, 0x03,
0x57, 0xb8, 0x9a, 0x97, 0x86, 0x54, 0xe3, 0x32, 0xff, 0xbb, 0x73, 0xe0, 0x62, 0x3a, 0x2d, 0x88,
0x0f, 0xf4, 0x1c, 0x54, 0x7b, 0x4e, 0xc7, 0xe8, 0x51, 0xcf, 0xe8, 0xe1, 0x3d, 0x3e, 0x79, 0xcd,
0x86, 0x89, 0x1a, 0xde, 0x53, 0xef, 0xc0, 0x4c, 0x4c, 0x00, 0x42, 0x30, 0xa7, 0xb1, 0xa2, 0xd6,
0xf1, 0x9e, 0x31, 0xe8, 0x05, 0xb5, 0x09, 0x34, 0x07, 0xb0, 0x6b, 0x77, 0x48, 0xb0, 0x60, 0x63,
0xb3, 0xa6, 0xa0, 0x2a, 0x54, 0x1e, 0x0a, 0x11, 0xb5, 0x82, 0xfa, 0xdd, 0x22, 0x1c, 0xa7, 0xc6,
0xdd, 0x72, 0x4c, 0x3e, 0xda, 0x78, 0x64, 0xf1, 0x1c, 0x54, 0x3b, 0xb4, 0xfb, 0x75, 0xd7, 0xf0,
0xb0, 0x1d, 0xf0, 0xf9, 0x75, 0x96, 0x25, 0xb6, 0x68, 0x1a, 0xd2, 0xa0, 0xe6, 0xf3, 0x16, 0xe9,
0x1d, 0x36, 0x3a, 0xf9, 0x00, 0x92, 0x5a, 0x3d, 0x64, 0x30, 0x6b, 0xf3, 0x7e, 0x6a, 0x74, 0x4f,
0xfb, 0x07, 0x7e, 0x27, 0xe8, 0x09, 0x8f, 0x7a, 0x39, 0x25, 0x2a, 0x59, 0xd9, 0xcb, 0x6d, 0xc6,
0xb0, 0x61, 0x07, 0xde, 0x81, 0x26, 0xd8, 0xd1, 0xbb, 0x50, 0x76, 0x9e, 0x60, 0x6f, 0x1f, 0x1b,
0xcc, 0x93, 0xcd, 0x5c, 0x7b, 0x2e, 0x25, 0x6a, 0x4d, 0x4c, 0x26, 0x1a, 0xf6, 0x9d, 0x81, 0xd7,
0xc1, 0xbe, 0x16, 0x32, 0xa1, 0x06, 0x54, 0x3c, 0x91, 0xcc, 0x3d, 0xdd, 0x58, 0x12, 0x22, 0xae,
0xfa, 0x2d, 0x98, 0x8d, 0x57, 0x0e, 0xd5, 0xa0, 0xf8, 0x18, 0x1f, 0x70, 0x65, 0x92, 0x9f, 0x91,
0x0f, 0x64, 0x3d, 0xcc, 0x3e, 0x6e, 0x15, 0x6e, 0x28, 0xaa, 0x07, 0x28, 0x6a, 0xe9, 0x26, 0x0e,
0x0c, 0xd3, 0x08, 0x0c, 0x84, 0xa0, 0x44, 0x63, 0x4e, 0x26, 0x82, 0xfe, 0x26, 0x52, 0x07, 0x7c,
0x3a, 0xa8, 0x68, 0xe4, 0x27, 0x3a, 0x05, 0x95, 0xd0, 0xdb, 0xf1, 0xc0, 0x33, 0x4a, 0x20, 0x01,
0xa0, 0x11, 0x04, 0xb8, 0xef, 0x06, 0x54, 0x31, 0x55, 0x4d, 0x7c, 0xaa, 0xbf, 0x36, 0x09, 0xb5,
0x94, 0x2d, 0xdc, 0x82, 0x72, 0x9f, 0x17, 0xcf, 0xfd, 0xec, 0xaa, 0x14, 0x05, 0xa6, 0x2a, 0xa9,
0x85, 0xf4, 0x24, 0xc8, 0x22, 0xb6, 0x16, 0x0b, 0x93, 0xc3, 0x6f, 0x66, 0xe4, 0x5d, 0xdd, 0xb4,
0x3c, 0xdc, 0x09, 0x1c, 0xef, 0x80, 0x57, 0x74, 0xb6, 0xe7, 0x74, 0xd7, 0x45, 0x1a, 0xba, 0x0e,
0x60, 0xda, 0xbe, 0x4e, 0x6d, 0xb8, 0xcb, 0xfb, 0x51, 0x9a, 0x64, 0xc3, 0x68, 0x58, 0xab, 0x98,
0xb6, 0xcf, 0xab, 0x7c, 0x1b, 0xaa, 0x24, 0xb4, 0xd4, 0xfb, 0x22, 0x3e, 0x9a, 0xa4, 0xb6, 0xb4,
0x2c, 0xd7, 0x3b, 0x0c, 0x74, 0xb5, 0x59, 0x37, 0xfa, 0xf0, 0xd1, 0x1d, 0x98, 0xa2, 0xd1, 0x9d,
0x88, 0xc7, 0xce, 0x67, 0x37, 0x97, 0x5b, 0xdf, 0x43, 0x4a, 0xca, 0x8c, 0x8f, 0xf3, 0xa1, 0x6d,
0x98, 0x31, 0x6c, 0xdb, 0x09, 0x0c, 0x36, 0xab, 0xb0, 0xe8, 0xec, 0xd2, 0x50, 0x31, 0x8d, 0x88,
0x9e, 0xc9, 0x8a, 0x4b, 0x40, 0x6f, 0xc2, 0x24, 0x9d, 0x76, 0xf8, 0x3c, 0x71, 0x6e, 0xe4, 0xa0,
0xd0, 0x18, 0x3d, 0x7a, 0x1b, 0xa6, 0x9f, 0x5a, 0xb6, 0xe9, 0x3c, 0xf5, 0xb9, 0x3f, 0x95, 0x4c,
0xf8, 0x2b, 0x2c, 0x2b, 0xc5, 0x2c, 0x78, 0xea, 0x37, 0x61, 0x26, 0xd6, 0xbe, 0xc3, 0xd8, 0x6f,
0xfd, 0x1d, 0xa8, 0x25, 0xdb, 0x74, 0x28, 0xfb, 0x1f, 0xc0, 0xa2, 0x36, 0xb0, 0xa3, 0xaa, 0x89,
0x55, 0xdc, 0x75, 0x98, 0xe2, 0xd6, 0xc0, 0x8c, 0xf1, 0xd4, 0x30, 0xb5, 0x6a, 0x9c, 0x36, 0xbe,
0x20, 0xdb, 0x37, 0x6c, 0xb3, 0x87, 0x3d, 0x5e, 0xa2, 0x58, 0x90, 0x3d, 0x60, 0xa9, 0xea, 0xdb,
0x70, 0x3c, 0x51, 0x2c, 0x5f, 0x0f, 0x3e, 0x0f, 0x73, 0xae, 0x63, 0xea, 0x3e, 0x4b, 0x16, 0xf1,
0x6a, 0x85, 0xd8, 0x8e, 0xa0, 0x6d, 0x9a, 0x84, 0xbd, 0x1d, 0x38, 0x6e, 0xba, 0xda, 0xe3, 0xb1,
0xaf, 0xc0, 0x52, 0x92, 0x9d, 0x15, 0xaf, 0xbe, 0x0b, 0xcb, 0x1a, 0xee, 0x3b, 0x4f, 0xf0, 0x51,
0x45, 0xd7, 0x61, 0x25, 0x2d, 0x80, 0x0b, 0xff, 0x00, 0x96, 0xa3, 0xd4, 0x76, 0x60, 0x04, 0x03,
0xff, 0x50, 0xc2, 0xf9, 0x62, 0xf9, 0x91, 0xe3, 0xb3, 0x8e, 0x2c, 0x6b, 0xe2, 0x53, 0x5d, 0x86,
0xc9, 0x96, 0x63, 0x36, 0x5b, 0x68, 0x0e, 0x0a, 0x96, 0xcb, 0x99, 0x0b, 0x96, 0xab, 0x76, 0xe2,
0x65, 0x6e, 0xb1, 0xc8, 0x96, 0x15, 0x9d, 0x24, 0x45, 0x37, 0x60, 0xce, 0x30, 0x4d, 0x8b, 0x18,
0x92, 0xd1, 0xd3, 0x2d, 0x57, 0x04, 0xe6, 0x0b, 0x89, 0xae, 0x6f, 0xb6, 0xb4, 0x6a, 0x44, 0xd8,
0x74, 0x7d, 0xf5, 0x2e, 0x54, 0xa2, 0x45, 0xc0, 0xeb, 0xd1, 0xc2, 0xb7, 0x30, 0x3a, 0x5e, 0x0c,
0x57, 0xc5, 0x5b, 0xa9, 0x49, 0x92, 0x57, 0xf3, 0x75, 0x80, 0xd0, 0xa9, 0x8a, 0x10, 0xf4, 0x78,
0xa6, 0x48, 0x2d, 0x46, 0xa8, 0xfe, 0x4b, 0x29, 0xee, 0x64, 0x63, 0x4d, 0x36, 0xc3, 0x26, 0x9b,
0x92, 0xd3, 0x2d, 0x1c, 0xd2, 0xe9, 0xbe, 0x0a, 0x93, 0x7e, 0x60, 0x04, 0x98, 0xc7, 0xfc, 0x27,
0xb3, 0x19, 0x49, 0xc1, 0x58, 0x63, 0x94, 0xe8, 0x34, 0x40, 0xc7, 0xc3, 0x46, 0x80, 0x4d, 0xdd,
0x60, 0xb3, 0x42, 0x51, 0xab, 0xf0, 0x94, 0x46, 0x40, 0xbc, 0x88, 0x58, 0xa5, 0x64, 0x4c, 0x84,
0x39, 0xdd, 0x18, 0xad, 0x57, 0x42, 0xef, 0x35, 0x35, 0xd2, 0x7b, 0x71, 0x56, 0xee, 0xbd, 0x22,
0x4f, 0x3c, 0x3d, 0xcc, 0x13, 0x33, 0xa6, 0x71, 0x3c, 0x71, 0x79, 0x98, 0x27, 0xe6, 0x62, 0x86,
0x7b, 0xe2, 0x0c, 0x47, 0x52, 0xc9, 0x72, 0x24, 0x9f, 0xa7, 0xeb, 0xfc, 0x8b, 0x02, 0xac, 0xa4,
0xc7, 0x33, 0xf7, 0x63, 0xd7, 0x61, 0xca, 0xa7, 0x29, 0xc3, 0xfd, 0x27, 0xe7, 0xe2, 0xb4, 0xe8,
0x2e, 0x94, 0x2c, 0x7b, 0xcf, 0xe1, 0x03, 0xef, 0xf2, 0x50, 0x1e, 0x5e, 0xd2, 0xe5, 0xa6, 0xbd,
0xe7, 0x30, 0x0d, 0x52, 0x5e, 0xf4, 0x10, 0x8e, 0x85, 0xab, 0x77, 0x5f, 0x67, 0x82, 0xb1, 0x88,
0xf3, 0x24, 0x2b, 0x0d, 0xa3, 0x2a, 0x2e, 0x11, 0x45, 0x7c, 0x6d, 0xce, 0x46, 0x62, 0x1c, 0x42,
0xee, 0x07, 0x46, 0xdf, 0x15, 0x16, 0x1b, 0x26, 0xd4, 0xdf, 0x84, 0x4a, 0x58, 0xfc, 0xa1, 0x74,
0xd7, 0x84, 0xc5, 0xc4, 0x18, 0x61, 0x8b, 0xd5, 0x70, 0x50, 0x29, 0xe3, 0x0e, 0x2a, 0xf5, 0x17,
0x4a, 0x7c, 0xa0, 0xdf, 0xb3, 0x7a, 0x01, 0xf6, 0x52, 0x03, 0xfd, 0x0d, 0x21, 0x97, 0x8d, 0xf2,
0xb3, 0x43, 0xe4, 0xb2, 0xb5, 0x20, 0x1f, 0xb1, 0xef, 0xc3, 0x1c, 0x35, 0x71, 0xdd, 0xc7, 0x3d,
0x1a, 0x2b, 0x71, 0x3d, 0x5e, 0xc9, 0x16, 0xc0, 0x4a, 0x67, 0x43, 0xa4, 0xcd, 0x39, 0x58, 0xdf,
0x54, 0x7b, 0xf1, 0xb4, 0xfa, 0x1d, 0x40, 0x69, 0xa2, 0x43, 0x69, 0x70, 0x93, 0xf8, 0x4b, 0x3f,
0xc8, 0x9c, 0xb9, 0xf7, 0x68, 0x35, 0x86, 0x5b, 0x1e, 0xab, 0xaa, 0xc6, 0x69, 0xd5, 0x7f, 0x2e,
0x02, 0x44, 0x99, 0x5f, 0x70, 0x47, 0x79, 0x2b, 0x74, 0x58, 0x2c, 0xe2, 0x54, 0xb3, 0x45, 0x66,
0xba, 0xaa, 0xa6, 0xec, 0xaa, 0x58, 0xec, 0xf9, 0x52, 0x8e, 0x80, 0x43, 0x3b, 0xa9, 0xe9, 0x2f,
0x9a, 0x93, 0xba, 0x07, 0x4b, 0x49, 0x33, 0xe1, 0x1e, 0xea, 0x15, 0x98, 0xb4, 0x02, 0xdc, 0x67,
0x9b, 0xda, 0x89, 0x4d, 0x91, 0x18, 0x39, 0x23, 0x52, 0xdf, 0x81, 0x25, 0xb9, 0xaf, 0x0e, 0x17,
0xba, 0xa8, 0x0f, 0x93, 0xb1, 0x4f, 0xe4, 0x2a, 0xb9, 0x7d, 0x64, 0x6e, 0x2f, 0x25, 0x79, 0x18,
0xa5, 0xfa, 0x63, 0x05, 0x8e, 0x27, 0xb2, 0x72, 0x06, 0xfe, 0xd7, 0x52, 0x03, 0x98, 0xf9, 0xd6,
0xeb, 0x43, 0x4a, 0xf9, 0x0c, 0x47, 0xf1, 0x57, 0xa0, 0x2e, 0x77, 0x8f, 0xa4, 0xda, 0x9b, 0x89,
0xa1, 0x7c, 0x6e, 0x64, 0xa5, 0xc3, 0xf1, 0xdc, 0x82, 0x93, 0x99, 0x82, 0xd3, 0x3a, 0x2f, 0x8e,
0xa9, 0xf3, 0xff, 0x2c, 0xc4, 0x7d, 0x76, 0x23, 0x08, 0x3c, 0xeb, 0xd1, 0x20, 0xc0, 0x9f, 0x6e,
0x50, 0xb5, 0x1e, 0x8e, 0x6c, 0xe6, 0x67, 0x5f, 0xc9, 0xe6, 0x8c, 0x4a, 0xcf, 0x1c, 0xe3, 0x6d,
0x79, 0x8c, 0x97, 0xa8, 0xa8, 0x57, 0x47, 0x8a, 0x1a, 0x3a, 0xda, 0x3f, 0xcf, 0x41, 0xfc, 0x77,
0x0a, 0xcc, 0x27, 0x7a, 0x05, 0xdd, 0x01, 0x30, 0xc2, 0xaa, 0x73, 0xfb, 0x38, 0x3b, 0xaa, 0x89,
0x5a, 0x8c, 0x87, 0xcc, 0x89, 0x2c, 0x5e, 0xcc, 0x98, 0x13, 0x33, 0xe2, 0xc5, 0x30, 0x5c, 0xbc,
0x1d, 0x2d, 0x76, 0xd9, 0x46, 0xac, 0x3a, 0x74, 0xb1, 0xcb, 0x78, 0x05, 0x8b, 0xfa, 0xeb, 0x05,
0x58, 0xcc, 0x92, 0x8e, 0x5e, 0x84, 0x62, 0xc7, 0x1d, 0xf0, 0x96, 0x48, 0x27, 0x60, 0x6b, 0xee,
0x60, 0xd7, 0x37, 0xba, 0x58, 0x23, 0x04, 0xe8, 0x0a, 0x4c, 0xf5, 0x71, 0xdf, 0xf1, 0x0e, 0x78,
0xbd, 0xa5, 0xed, 0x86, 0x4d, 0x9a, 0xc3, 0xa8, 0x39, 0x19, 0xba, 0x16, 0x85, 0xd5, 0xac, 0xbe,
0x2b, 0xd2, 0xea, 0x81, 0x65, 0x31, 0x96, 0x30, 0x96, 0xbe, 0x06, 0xd3, 0xae, 0xe7, 0x74, 0xb0,
0xef, 0xf3, 0xdd, 0x90, 0x95, 0xc4, 0x91, 0x1c, 0xc9, 0xe2, 0x3c, 0x9c, 0x10, 0xdd, 0x02, 0x88,
0x02, 0x28, 0x3e, 0x33, 0xd5, 0x73, 0xe3, 0x2d, 0x5f, 0x8b, 0x51, 0xab, 0x3f, 0x2c, 0xc0, 0x52,
0xb6, 0xe6, 0xd0, 0xa5, 0xb8, 0x5e, 0x4e, 0x66, 0xa8, 0x5a, 0x56, 0xcf, 0x1b, 0x09, 0xf5, 0xac,
0x66, 0x70, 0x64, 0x69, 0xe9, 0x66, 0x52, 0x4b, 0x67, 0x32, 0x18, 0xb3, 0x95, 0x75, 0x33, 0xa9,
0xac, 0x2c, 0xd6, 0x6c, 0x9d, 0x35, 0x32, 0x74, 0x76, 0x2e, 0xab, 0x8d, 0xf9, 0xaa, 0xfb, 0x6b,
0x05, 0x66, 0xe3, 0xf5, 0x92, 0x43, 0x56, 0x25, 0x11, 0xb2, 0xa2, 0x2d, 0x58, 0x30, 0xd9, 0xce,
0xad, 0x6e, 0xd9, 0x01, 0xf6, 0xf6, 0x8c, 0x8e, 0x88, 0x0a, 0xcf, 0x65, 0xd8, 0x45, 0x53, 0xd0,
0xb0, 0x8a, 0xd7, 0x38, 0x6f, 0x98, 0x4c, 0x5a, 0x10, 0xca, 0x11, 0x5e, 0x6b, 0x0c, 0x41, 0x31,
0x26, 0xf5, 0x9f, 0x14, 0x38, 0x96, 0xa1, 0xe0, 0x11, 0x0d, 0xd9, 0xcd, 0x6f, 0xc8, 0xf9, 0xfc,
0xae, 0x1b, 0xd9, 0x9e, 0x07, 0x19, 0xed, 0x19, 0x5f, 0x5e, 0xbc, 0x59, 0xbf, 0x54, 0xe0, 0x78,
0x26, 0x55, 0xe6, 0xf6, 0xea, 0x35, 0x28, 0x7b, 0xcf, 0xf4, 0x47, 0x07, 0x01, 0xf6, 0xb3, 0x06,
0xf6, 0x6e, 0xec, 0x9c, 0x66, 0xda, 0x7b, 0x76, 0x97, 0xd0, 0xa1, 0xeb, 0x50, 0xf1, 0x9e, 0xe9,
0xd8, 0xf3, 0x1c, 0x4f, 0xf8, 0xa2, 0x5c, 0xa6, 0xb2, 0xf7, 0x6c, 0x83, 0x12, 0x92, 0x92, 0x02,
0x51, 0x52, 0x69, 0x44, 0x49, 0x41, 0x54, 0x52, 0x10, 0x96, 0x34, 0x39, 0xa2, 0xa4, 0x80, 0x97,
0xa4, 0xfe, 0x51, 0x01, 0x4e, 0x0d, 0x53, 0xd7, 0xa7, 0xa6, 0x88, 0x0d, 0x40, 0xde, 0x33, 0xdd,
0x35, 0x3a, 0x8f, 0x71, 0xe0, 0xeb, 0xa6, 0xe7, 0xb8, 0x2e, 0x36, 0x47, 0x69, 0xa4, 0xe6, 0x3d,
0x6b, 0x31, 0x8e, 0x75, 0xc6, 0x70, 0x24, 0xcd, 0x6c, 0x00, 0x0a, 0xd2, 0x45, 0x8f, 0x50, 0x51,
0x2d, 0x48, 0x14, 0xad, 0x7e, 0x04, 0xb3, 0x71, 0x0f, 0x31, 0xc2, 0xf6, 0x6f, 0x43, 0x95, 0x7b,
0x10, 0xbd, 0xe3, 0x0c, 0xec, 0x60, 0x94, 0xa2, 0x66, 0x39, 0xf5, 0x1a, 0x21, 0x56, 0xbf, 0x11,
0x0e, 0xb7, 0xcf, 0xac, 0xc8, 0xff, 0x57, 0x80, 0x4a, 0x78, 0x8e, 0x4f, 0x66, 0x7a, 0x76, 0xda,
0xcf, 0xfa, 0x9d, 0x1f, 0xeb, 0x3f, 0x90, 0xa3, 0x16, 0x16, 0xa7, 0xbe, 0x98, 0x89, 0x04, 0x18,
0xb1, 0x30, 0xb9, 0x0a, 0x8b, 0x03, 0x1f, 0x7b, 0xba, 0xef, 0xe2, 0x8e, 0xb5, 0x67, 0x61, 0x53,
0x67, 0xc5, 0x21, 0x5a, 0x1c, 0x22, 0x79, 0x6d, 0x91, 0x45, 0x65, 0x66, 0x2d, 0x65, 0x8e, 0x65,
0x2e, 0x65, 0x3e, 0x69, 0x28, 0x73, 0x0d, 0xca, 0x5f, 0xc2, 0x07, 0x6c, 0xb1, 0x3f, 0x26, 0x9f,
0xfa, 0x9d, 0x12, 0x2c, 0xe7, 0x1c, 0x03, 0xd1, 0x95, 0xa2, 0x3b, 0xd0, 0x5d, 0xec, 0x59, 0x8e,
0x29, 0x7a, 0xad, 0xe3, 0x0e, 0x5a, 0x34, 0x01, 0x9d, 0x04, 0xf2, 0xa1, 0x7f, 0x63, 0xe0, 0xf0,
0x60, 0xb4, 0xa8, 0x95, 0x3b, 0xee, 0xe0, 0xcb, 0xe4, 0x5b, 0xf0, 0xfa, 0xfb, 0x86, 0x87, 0x99,
0xff, 0x60, 0xbc, 0x6d, 0x9a, 0x80, 0x5e, 0x85, 0xe3, 0x6c, 0x6e, 0xd4, 0x7b, 0x56, 0xdf, 0x22,
0x5e, 0x36, 0x36, 0x34, 0x8a, 0x1a, 0x62, 0x99, 0x0f, 0x49, 0x5e, 0xd3, 0x66, 0x83, 0x41, 0x85,
0xaa, 0xe3, 0xf4, 0x75, 0xbf, 0xe3, 0x78, 0x58, 0x37, 0xcc, 0x8f, 0xe8, 0x38, 0x28, 0x6a, 0x33,
0x8e, 0xd3, 0x6f, 0x93, 0xb4, 0x86, 0xf9, 0x11, 0x3a, 0x03, 0x33, 0x1d, 0x77, 0xe0, 0xe3, 0x40,
0x27, 0x7f, 0xe8, 0x66, 0x5d, 0x45, 0x03, 0x96, 0xb4, 0xe6, 0x0e, 0xfc, 0x18, 0x41, 0x9f, 0x2c,
0xcf, 0xa6, 0xe3, 0x04, 0x9b, 0xb8, 0x4f, 0x4f, 0xd4, 0xf7, 0x07, 0x5d, 0xec, 0x1a, 0x5d, 0xcc,
0xaa, 0x26, 0x76, 0xdc, 0xa4, 0x13, 0xf5, 0x07, 0x9c, 0x84, 0x56, 0x50, 0x9b, 0xdb, 0x8f, 0x7f,
0xfa, 0xe8, 0x3d, 0x98, 0x1e, 0xd8, 0xd4, 0x00, 0x56, 0x2a, 0x94, 0xf7, 0xea, 0x18, 0x87, 0x6e,
0x97, 0x77, 0x19, 0x0b, 0x3f, 0x03, 0xe4, 0x02, 0xd0, 0x2d, 0xa8, 0x73, 0x45, 0xf9, 0x4f, 0x0d,
0x37, 0xa9, 0x2d, 0xa0, 0x2a, 0x58, 0x62, 0x14, 0xed, 0xa7, 0x86, 0x1b, 0xd7, 0x58, 0xfd, 0x16,
0xcc, 0xc6, 0x85, 0x1e, 0xca, 0x96, 0xee, 0x42, 0x55, 0x6a, 0x24, 0xe9, 0x6d, 0xaa, 0x14, 0xdf,
0xfa, 0xa6, 0x18, 0x5b, 0x65, 0x92, 0xd0, 0xb6, 0xbe, 0x49, 0x71, 0x10, 0xb4, 0x66, 0x54, 0x4e,
0x49, 0x63, 0x1f, 0xaa, 0x01, 0x55, 0x09, 0x7a, 0x40, 0x5c, 0x32, 0xc5, 0x18, 0x70, 0x97, 0x4c,
0x7e, 0x93, 0x34, 0xcf, 0xe9, 0x89, 0x1a, 0xd0, 0xdf, 0x24, 0x8d, 0x1e, 0x40, 0xb3, 0xe3, 0x34,
0xfa, 0x9b, 0x16, 0x81, 0x9f, 0x70, 0x18, 0x53, 0x45, 0x63, 0x1f, 0xea, 0xef, 0x28, 0x00, 0x6b,
0x86, 0x6b, 0x3c, 0xb2, 0x7a, 0x56, 0x70, 0x80, 0x2e, 0x40, 0xcd, 0x30, 0x4d, 0xbd, 0x23, 0x52,
0x2c, 0x2c, 0x70, 0x65, 0xf3, 0x86, 0x69, 0xae, 0xc5, 0x92, 0xd1, 0xcb, 0xb0, 0x40, 0x1c, 0xaa,
0x4c, 0xcb, 0x80, 0x66, 0x35, 0x92, 0x21, 0x11, 0xdf, 0x80, 0x15, 0x22, 0xd7, 0xe8, 0x3f, 0xb2,
0xb0, 0x1d, 0xc8, 0x3c, 0x0c, 0x81, 0xb6, 0x64, 0x98, 0x66, 0x83, 0x65, 0xc7, 0x39, 0xd5, 0xdf,
0x9b, 0x86, 0xd3, 0x72, 0x8f, 0x27, 0xd1, 0x20, 0xb7, 0x60, 0x36, 0x51, 0xdf, 0x14, 0x8e, 0x22,
0x6a, 0xa1, 0x26, 0xd1, 0x26, 0xb0, 0x08, 0x85, 0x14, 0x16, 0x21, 0x13, 0x69, 0x52, 0xfc, 0x94,
0x90, 0x26, 0xa5, 0x4f, 0x88, 0x34, 0x99, 0x3c, 0x2a, 0xd2, 0x64, 0x76, 0x6c, 0xa4, 0xc9, 0x8b,
0xd4, 0xf5, 0x8a, 0x12, 0x69, 0x38, 0xc0, 0x7c, 0x42, 0x35, 0x94, 0x6e, 0x0b, 0xb0, 0x63, 0x02,
0x91, 0x32, 0x7d, 0x18, 0x44, 0x4a, 0xf9, 0x88, 0x88, 0x94, 0x85, 0x4f, 0x05, 0x91, 0x72, 0x16,
0x66, 0x6d, 0x47, 0xb7, 0xf1, 0x53, 0x9d, 0x74, 0xbd, 0x4f, 0x71, 0x2e, 0x65, 0x0d, 0x6c, 0x67,
0x0b, 0x3f, 0x6d, 0x91, 0x14, 0x74, 0x0e, 0x66, 0xfb, 0x86, 0xff, 0x18, 0x9b, 0x14, 0x1a, 0xe2,
0xaf, 0x54, 0xa9, 0xcd, 0xce, 0xb0, 0xb4, 0x16, 0x49, 0x42, 0x2f, 0x40, 0xd8, 0x56, 0x4e, 0x34,
0x47, 0x89, 0xaa, 0x22, 0x95, 0x91, 0xc5, 0xd0, 0x2d, 0xf3, 0x47, 0x44, 0xb7, 0xd4, 0x0e, 0x83,
0x6e, 0xb9, 0x04, 0x35, 0xf1, 0x5b, 0xc0, 0x5b, 0xd8, 0x69, 0x05, 0x45, 0xb6, 0xcc, 0x8b, 0x3c,
0x01, 0x61, 0xc9, 0x03, 0xc3, 0xc0, 0x50, 0x30, 0xcc, 0x1f, 0x2b, 0x7c, 0xdd, 0x1c, 0x0e, 0x52,
0x7e, 0x0a, 0x2f, 0x01, 0x28, 0x94, 0xa3, 0x00, 0x28, 0xd0, 0x4e, 0x2e, 0xc4, 0xe4, 0x42, 0xbe,
0xa4, 0x51, 0x20, 0x13, 0xd5, 0x02, 0x24, 0x73, 0xd0, 0x81, 0xc2, 0x61, 0x14, 0x6c, 0xa6, 0xa6,
0x30, 0x8a, 0x1a, 0x14, 0xbb, 0x1c, 0x58, 0x51, 0xd4, 0xc8, 0xcf, 0x3c, 0x0b, 0x2e, 0xe6, 0x59,
0xb0, 0xba, 0x19, 0xae, 0x9e, 0x3f, 0x0d, 0xe4, 0x9f, 0xfa, 0x6f, 0x0a, 0x9c, 0xe6, 0xf2, 0x72,
0xe0, 0x71, 0x19, 0x83, 0x56, 0xc9, 0x19, 0xb4, 0x1d, 0x0f, 0x9b, 0xd8, 0x0e, 0x2c, 0xa3, 0x47,
0xe3, 0x31, 0x71, 0x20, 0x1e, 0x25, 0xd3, 0x90, 0xf0, 0x1c, 0xcc, 0x32, 0x10, 0x2d, 0x5f, 0x48,
0x33, 0xac, 0xec, 0x0c, 0xc5, 0xd1, 0xf2, 0xb5, 0xf2, 0x76, 0x96, 0xa3, 0x2c, 0xe5, 0xee, 0xc0,
0x8c, 0xf4, 0x97, 0xaa, 0x03, 0xcb, 0x39, 0xd0, 0x84, 0x4c, 0x8b, 0x50, 0xd2, 0x16, 0x31, 0x54,
0x49, 0x69, 0x8b, 0xf8, 0x8e, 0x02, 0x67, 0x52, 0x0b, 0xfa, 0xcf, 0x5f, 0xb3, 0xea, 0x9f, 0x29,
0xa1, 0xfd, 0x24, 0x47, 0xd7, 0x5a, 0x7a, 0x74, 0xbd, 0x30, 0x6c, 0x7f, 0x22, 0x73, 0x7c, 0xbd,
0x9f, 0x3b, 0xbe, 0x5e, 0x1e, 0xba, 0xd7, 0x31, 0x4a, 0x9f, 0x7f, 0x50, 0x80, 0x13, 0xb9, 0x15,
0x48, 0x84, 0xb7, 0x4a, 0x32, 0xbc, 0xe5, 0xa1, 0x71, 0xb4, 0x98, 0x61, 0xa1, 0x31, 0x5d, 0xaf,
0xf0, 0x18, 0x54, 0xef, 0x1b, 0xcf, 0xac, 0xfe, 0xa0, 0xcf, 0x63, 0x63, 0x22, 0x6e, 0x93, 0xa5,
0x1c, 0x25, 0x38, 0xbe, 0x02, 0x8b, 0x6c, 0xde, 0xa2, 0xf1, 0x59, 0xc4, 0xc1, 0x62, 0xe4, 0x05,
0x96, 0x47, 0x42, 0x35, 0xc1, 0xf0, 0x00, 0xaa, 0xc6, 0xde, 0x9e, 0x65, 0x53, 0xb5, 0xb1, 0x58,
0xb9, 0x98, 0x83, 0xad, 0x59, 0x73, 0x07, 0xd4, 0x15, 0x34, 0x38, 0xbd, 0x36, 0x2b, 0x38, 0x49,
0x48, 0xad, 0x7e, 0x39, 0xb4, 0xf4, 0x24, 0x21, 0x3a, 0x01, 0x65, 0xd6, 0x52, 0x9f, 0x79, 0x88,
0x92, 0x36, 0x4d, 0x9b, 0xe9, 0x3f, 0x16, 0x1a, 0x62, 0x13, 0x3a, 0x03, 0x46, 0x13, 0x5a, 0xca,
0xaf, 0x36, 0x60, 0x21, 0xd4, 0xf9, 0x50, 0xdc, 0x58, 0x0c, 0x07, 0x56, 0x90, 0x71, 0x60, 0x36,
0x4c, 0xad, 0xe3, 0x27, 0x56, 0x07, 0x7f, 0x2a, 0x48, 0xfb, 0xb3, 0x30, 0xe3, 0x62, 0xaf, 0x6f,
0xf9, 0x7e, 0x18, 0x41, 0x55, 0xb4, 0x78, 0x92, 0x7a, 0x06, 0x2a, 0x6b, 0xeb, 0x4d, 0x5e, 0x64,
0x46, 0x55, 0xd5, 0x7f, 0x9f, 0x82, 0xf9, 0xe4, 0x00, 0xb8, 0x99, 0xc2, 0xa5, 0x9d, 0xce, 0xdc,
0xd3, 0xcc, 0xd8, 0xcc, 0x0f, 0x41, 0xed, 0x85, 0x31, 0x40, 0xed, 0x2b, 0x30, 0xdd, 0x71, 0xfa,
0x7d, 0xc3, 0x36, 0xc5, 0x7d, 0x09, 0xfe, 0x49, 0x6a, 0x6a, 0x78, 0x5d, 0xb6, 0x8d, 0x5f, 0xd1,
0xe8, 0x6f, 0x62, 0x9f, 0xc4, 0x53, 0x5b, 0x36, 0x45, 0xb6, 0x51, 0x13, 0xaa, 0x68, 0xc0, 0x93,
0xd6, 0x2d, 0x0f, 0x9d, 0x87, 0x12, 0xb6, 0x9f, 0x08, 0x93, 0x91, 0xb6, 0x93, 0xc5, 0xfa, 0x53,
0xa3, 0x14, 0xe8, 0x02, 0x4c, 0xf5, 0x89, 0xcd, 0x0b, 0xf4, 0xc3, 0x42, 0xea, 0x5e, 0x81, 0xc6,
0x09, 0xd0, 0x2b, 0x30, 0x6d, 0x52, 0xed, 0x89, 0x05, 0x17, 0x92, 0x30, 0x72, 0x34, 0x4b, 0x13,
0x24, 0xe8, 0xdd, 0xf0, 0x2c, 0xa3, 0x92, 0x3e, 0x64, 0x4c, 0xa8, 0x39, 0xf3, 0x18, 0x63, 0x4b,
0xde, 0x10, 0x80, 0xf4, 0x89, 0x48, 0x52, 0xca, 0xf0, 0x6d, 0x81, 0x13, 0x50, 0xee, 0x39, 0x5d,
0x66, 0x3d, 0x33, 0xec, 0xb2, 0x4d, 0xcf, 0xe9, 0x52, 0xe3, 0x59, 0x84, 0x49, 0x3f, 0x30, 0x2d,
0x9b, 0xc6, 0xad, 0x65, 0x8d, 0x7d, 0x10, 0x0f, 0x42, 0x7f, 0xe8, 0x8e, 0xdd, 0xc1, 0x2b, 0x55,
0x9a, 0x55, 0xa1, 0x29, 0xdb, 0x76, 0x87, 0xae, 0xdf, 0x83, 0xe0, 0x60, 0x65, 0x8e, 0xa6, 0x93,
0x9f, 0xd1, 0x91, 0xc2, 0x7c, 0xce, 0x91, 0x42, 0xa2, 0xc2, 0x19, 0x47, 0x0a, 0xb5, 0xdc, 0x09,
0x2d, 0xc9, 0x2b, 0x58, 0x48, 0xcc, 0xbe, 0xb6, 0xde, 0xd4, 0x45, 0xd7, 0x2c, 0xa4, 0xef, 0x08,
0x84, 0x66, 0xaf, 0x41, 0xf8, 0xf3, 0x73, 0x3d, 0xd1, 0xf9, 0xa1, 0x02, 0x4b, 0x6b, 0xf4, 0x3c,
0x3b, 0xe6, 0xb8, 0x0f, 0x03, 0x05, 0x7b, 0x2d, 0xc4, 0xe7, 0x65, 0x80, 0xac, 0x92, 0x9a, 0x12,
0xf0, 0xbc, 0x35, 0x98, 0x13, 0x62, 0x39, 0x73, 0x71, 0x0c, 0x70, 0x5f, 0xd5, 0x8f, 0x7f, 0xaa,
0xb7, 0x61, 0x39, 0x55, 0x73, 0x7e, 0xaa, 0x98, 0xbc, 0x4c, 0xc2, 0x2a, 0x1e, 0xbf, 0x4c, 0xa2,
0xde, 0x82, 0xe3, 0xed, 0xc0, 0xf0, 0x82, 0x54, 0xb3, 0xc7, 0xe0, 0xa5, 0xb0, 0x3d, 0x99, 0x97,
0x23, 0xeb, 0xda, 0xb0, 0xd8, 0x0e, 0x1c, 0xf7, 0x08, 0x42, 0x89, 0xdf, 0x21, 0x2d, 0x77, 0x06,
0x62, 0x12, 0x14, 0x9f, 0xea, 0x32, 0x03, 0x19, 0xa6, 0x4b, 0x7b, 0x0b, 0x96, 0x18, 0xc6, 0xef,
0x28, 0x8d, 0x38, 0x21, 0x10, 0x86, 0x69, 0xb9, 0xf7, 0xe1, 0x98, 0x74, 0xce, 0xc1, 0x31, 0x31,
0x57, 0x65, 0x4c, 0x4c, 0xfe, 0x91, 0x52, 0x08, 0x89, 0xf9, 0xcd, 0x42, 0xcc, 0x8f, 0xe7, 0x1c,
0x8c, 0xbf, 0x2e, 0x23, 0x62, 0xce, 0xe4, 0x4b, 0x95, 0x00, 0x31, 0x69, 0xeb, 0x2c, 0x66, 0x58,
0xe7, 0x6e, 0xea, 0xd4, 0xbd, 0x94, 0x46, 0x34, 0x25, 0x6a, 0xf8, 0x99, 0x9c, 0xb7, 0x3f, 0x64,
0xa8, 0x99, 0xb0, 0xe8, 0xf0, 0xa8, 0xfd, 0xb5, 0xc4, 0x51, 0xfb, 0xc9, 0x21, 0x35, 0x0d, 0x0f,
0xd9, 0xbf, 0x5f, 0x82, 0x4a, 0x98, 0x97, 0xd2, 0x70, 0x5a, 0x55, 0x85, 0x0c, 0x55, 0xc5, 0xe7,
0xd7, 0xe2, 0x11, 0xe7, 0xd7, 0xd2, 0x18, 0xf3, 0xeb, 0x49, 0xa8, 0xb0, 0x4b, 0x63, 0x1e, 0xde,
0xe3, 0xf3, 0x65, 0x99, 0x26, 0x68, 0x78, 0x2f, 0x32, 0xb1, 0xa9, 0x31, 0x4d, 0x2c, 0x81, 0xd0,
0x99, 0x4e, 0x22, 0x74, 0x6e, 0x86, 0x73, 0x5f, 0x39, 0x7d, 0x22, 0x16, 0x4a, 0xcc, 0x9c, 0xf5,
0x12, 0xdb, 0xe0, 0x95, 0xf4, 0x36, 0x78, 0xc4, 0x3f, 0x72, 0xbe, 0x63, 0x4d, 0xb6, 0x4c, 0x7e,
0x43, 0x6e, 0x9a, 0x7e, 0x37, 0xcd, 0xcf, 0xd3, 0xf5, 0x6f, 0x33, 0x44, 0x4e, 0xdc, 0x04, 0xb9,
0xfb, 0x7c, 0x5d, 0x3a, 0x0c, 0x55, 0x32, 0xa6, 0xb1, 0xd0, 0x65, 0xc4, 0x0f, 0x40, 0x77, 0x61,
0x29, 0x89, 0xe4, 0x3b, 0x94, 0xfb, 0xcb, 0x81, 0x14, 0xff, 0x2c, 0x1e, 0x0c, 0xe6, 0xe0, 0x67,
0x6f, 0xa6, 0xa0, 0x1e, 0x63, 0x1b, 0xef, 0x55, 0x19, 0x15, 0x76, 0x68, 0x93, 0x4b, 0x81, 0xc2,
0x68, 0xb0, 0x62, 0x78, 0x3c, 0x9b, 0x2d, 0x2a, 0x2a, 0x3c, 0xa5, 0x41, 0x57, 0x34, 0x24, 0xe2,
0xf7, 0xf7, 0x59, 0xfe, 0x14, 0x5b, 0xd1, 0x88, 0xa4, 0x06, 0xdd, 0x3c, 0xc6, 0xcf, 0xac, 0x40,
0xef, 0x38, 0x26, 0xa6, 0x06, 0x3d, 0xa9, 0x95, 0x49, 0xc2, 0x9a, 0x63, 0xe2, 0x68, 0xa8, 0x95,
0x0f, 0x3b, 0xd4, 0x2a, 0x89, 0xa1, 0xb6, 0x04, 0x53, 0x1e, 0x36, 0x7c, 0xc7, 0xe6, 0x26, 0xc9,
0xbf, 0x48, 0x47, 0xf4, 0xb1, 0xef, 0x93, 0x32, 0x78, 0x6c, 0xc6, 0x3f, 0x63, 0x71, 0xe4, 0xec,
0x90, 0x38, 0x72, 0x08, 0x3a, 0x37, 0x11, 0x47, 0x56, 0x87, 0xc4, 0x91, 0x63, 0x81, 0x73, 0xa3,
0x88, 0x79, 0x6e, 0x54, 0xc4, 0x1c, 0x0f, 0x39, 0xe7, 0xe5, 0x90, 0xf3, 0x76, 0x7c, 0x65, 0x5d,
0x4b, 0x63, 0x15, 0x86, 0x2f, 0xa9, 0xe3, 0x63, 0x7b, 0x41, 0x1a, 0xdb, 0xe8, 0x12, 0xdf, 0xc1,
0x47, 0xe9, 0xbd, 0x5f, 0x69, 0x2b, 0x8a, 0x6d, 0xee, 0x7f, 0x9e, 0xae, 0xe0, 0xef, 0x15, 0x58,
0x4e, 0x0d, 0x5d, 0xee, 0x0c, 0x5e, 0x4b, 0x00, 0x88, 0x87, 0x22, 0x77, 0x05, 0x7e, 0xb8, 0x21,
0xe1, 0x87, 0x2f, 0x0d, 0x63, 0xc9, 0x81, 0x0f, 0x1f, 0x1d, 0xd2, 0xfb, 0x6d, 0x05, 0x50, 0xc6,
0x2e, 0xc4, 0x4d, 0xb1, 0x24, 0x38, 0xc4, 0xd6, 0x24, 0x5f, 0x15, 0xbc, 0x1b, 0xad, 0x0a, 0x0a,
0x87, 0xd9, 0x79, 0x09, 0xb1, 0x46, 0x1b, 0x50, 0x95, 0x37, 0x1f, 0xaf, 0xcb, 0x95, 0x59, 0xcd,
0xaf, 0x0c, 0x35, 0x10, 0x46, 0xac, 0xfe, 0xac, 0x00, 0x67, 0x76, 0x5d, 0x33, 0x11, 0xf2, 0xf2,
0xc2, 0xc6, 0x77, 0xb5, 0x37, 0x65, 0xbc, 0xd5, 0x11, 0x35, 0x51, 0x3c, 0x8a, 0x26, 0xd0, 0xd7,
0xb3, 0x10, 0x71, 0xb7, 0xa5, 0xb3, 0xeb, 0xe1, 0x0d, 0x1c, 0x01, 0x8e, 0xfb, 0xa4, 0x23, 0x41,
0x85, 0xb3, 0xf9, 0x15, 0xe0, 0xe1, 0xf1, 0xff, 0x86, 0xf9, 0x8d, 0x67, 0xb8, 0xd3, 0x3e, 0xb0,
0x3b, 0x87, 0xd0, 0x7a, 0x0d, 0x8a, 0x9d, 0xbe, 0xc9, 0x4f, 0xcd, 0xc8, 0xcf, 0x78, 0xc4, 0x5f,
0x94, 0x23, 0x7e, 0x1d, 0x6a, 0x51, 0x09, 0x7c, 0x1c, 0x2e, 0x91, 0x71, 0x68, 0x12, 0x62, 0x22,
0x7c, 0x56, 0xe3, 0x5f, 0x3c, 0x1d, 0x7b, 0xec, 0x86, 0x13, 0x4b, 0xc7, 0x9e, 0x27, 0x4f, 0x23,
0x45, 0x79, 0x1a, 0x51, 0xbf, 0xab, 0xc0, 0x0c, 0x29, 0xe1, 0x13, 0xd5, 0x9f, 0x2f, 0xbb, 0x8b,
0xd1, 0xb2, 0x3b, 0x5c, 0xbd, 0x97, 0xe2, 0xab, 0xf7, 0xa8, 0xe6, 0x93, 0x34, 0x39, 0x5d, 0xf3,
0xa9, 0x30, 0x1d, 0x7b, 0x9e, 0x7a, 0x16, 0x66, 0x59, 0xdd, 0x78, 0xcb, 0x6b, 0x50, 0x1c, 0x78,
0x3d, 0xd1, 0x7f, 0x03, 0xaf, 0xa7, 0x7e, 0x4b, 0x81, 0x6a, 0x23, 0x08, 0x8c, 0xce, 0xfe, 0x21,
0x1a, 0x10, 0x56, 0xae, 0x10, 0xaf, 0x5c, 0xba, 0x11, 0x51, 0x75, 0x4b, 0x39, 0xd5, 0x9d, 0x94,
0xaa, 0xab, 0xc2, 0x9c, 0xa8, 0x4b, 0x6e, 0x85, 0xb7, 0x00, 0xb5, 0x1c, 0x2f, 0xb8, 0xe7, 0x78,
0x4f, 0x0d, 0xcf, 0x3c, 0xdc, 0x0a, 0x1b, 0x41, 0x89, 0x3f, 0xad, 0x51, 0x3c, 0x3f, 0xa9, 0xd1,
0xdf, 0xea, 0x4b, 0x70, 0x4c, 0x92, 0x97, 0x5b, 0xf0, 0x2d, 0x98, 0xa1, 0x61, 0x01, 0x5f, 0x7c,
0xbd, 0x1c, 0x07, 0x7c, 0x8c, 0x08, 0x1f, 0xd4, 0x75, 0x58, 0x20, 0x01, 0x22, 0x4d, 0x0f, 0xfd,
0xcb, 0x95, 0xc4, 0xfa, 0x64, 0x39, 0x25, 0x22, 0xb1, 0x36, 0xf9, 0x85, 0x02, 0x93, 0x0c, 0xdb,
0x91, 0x0c, 0xda, 0x4e, 0x92, 0x89, 0xd7, 0x75, 0xf4, 0xc0, 0xe8, 0x86, 0xcf, 0x96, 0x90, 0x84,
0x1d, 0xa3, 0x4b, 0x4f, 0xe1, 0x68, 0xa6, 0x69, 0x75, 0xb1, 0x1f, 0x88, 0x93, 0xe3, 0x19, 0x92,
0xb6, 0xce, 0x92, 0x88, 0x62, 0xe8, 0x01, 0x7b, 0x89, 0xee, 0x96, 0xd2, 0xdf, 0xe8, 0x3c, 0x3b,
0xd5, 0x19, 0x7e, 0x5c, 0x4a, 0x4f, 0x7b, 0xea, 0x50, 0x4e, 0x9c, 0x73, 0x86, 0xdf, 0xe8, 0x02,
0x94, 0xe8, 0x46, 0xfe, 0xf4, 0x30, 0x2d, 0x51, 0x12, 0x62, 0x15, 0xae, 0x65, 0xdb, 0xd8, 0xe4,
0x6f, 0x6a, 0xf0, 0x2f, 0xf5, 0x5d, 0x40, 0x71, 0xe5, 0xf1, 0x0e, 0xba, 0x00, 0x53, 0x54, 0xb7,
0x22, 0xaa, 0x5e, 0x48, 0x89, 0xd6, 0x38, 0x81, 0xfa, 0x35, 0x40, 0xac, 0x2c, 0x29, 0x92, 0x3e,
0x4c, 0x07, 0x0e, 0x89, 0xa9, 0x7f, 0xa0, 0xc0, 0x31, 0x49, 0x3a, 0xaf, 0xdf, 0x4b, 0xb2, 0xf8,
0x8c, 0xea, 0x71, 0xd1, 0x6f, 0x4b, 0x13, 0xfc, 0x85, 0x74, 0x35, 0xfe, 0x87, 0x26, 0xf7, 0x7f,
0x50, 0x00, 0x1a, 0x83, 0x60, 0x9f, 0x6f, 0x0a, 0xc7, 0x3b, 0x51, 0x49, 0x74, 0x62, 0x1d, 0xca,
0xae, 0xe1, 0xfb, 0x4f, 0x1d, 0x4f, 0x2c, 0x78, 0xc3, 0x6f, 0xba, 0x95, 0x3b, 0xe0, 0x0f, 0x89,
0x54, 0x34, 0xfa, 0x1b, 0xbd, 0x00, 0x73, 0xec, 0x3d, 0x1d, 0xdd, 0x30, 0x4d, 0x4f, 0x80, 0x48,
0x2b, 0x5a, 0x95, 0xa5, 0x36, 0x58, 0x22, 0x21, 0xb3, 0xe8, 0xb1, 0x4e, 0x70, 0xa0, 0x07, 0xce,
0x63, 0x6c, 0xf3, 0x45, 0x6c, 0x55, 0xa4, 0xee, 0x90, 0x44, 0x76, 0x44, 0xdc, 0xb5, 0xfc, 0xc0,
0x13, 0x64, 0xe2, 0x30, 0x9d, 0xa7, 0x52, 0x32, 0xf5, 0x4f, 0x14, 0xa8, 0xb5, 0x06, 0xbd, 0x1e,
0x53, 0xee, 0x51, 0x3a, 0xf9, 0x22, 0x6f, 0x4a, 0x21, 0x6d, 0xf2, 0x91, 0xa2, 0x78, 0x13, 0x3f,
0x95, 0x7d, 0xb7, 0xab, 0xb0, 0x10, 0xab, 0x31, 0x37, 0x1c, 0x69, 0xa9, 0xa1, 0xc8, 0x4b, 0x0d,
0xb5, 0x01, 0x88, 0x6d, 0x35, 0x1d, 0xb9, 0x95, 0xea, 0x71, 0x38, 0x26, 0x89, 0xe0, 0x53, 0xf1,
0x45, 0xa8, 0x72, 0x40, 0x23, 0x37, 0x88, 0x13, 0x50, 0x26, 0x2e, 0xb5, 0x63, 0x99, 0x02, 0x39,
0x33, 0xed, 0x3a, 0xe6, 0x9a, 0x65, 0x7a, 0xea, 0x97, 0xa1, 0xca, 0x5f, 0x4c, 0xe0, 0xb4, 0x77,
0x60, 0x8e, 0x1f, 0xb4, 0xea, 0xd2, 0x15, 0xe3, 0x13, 0x19, 0xa8, 0x59, 0xa1, 0x0a, 0x3b, 0xfe,
0xa9, 0x7e, 0x1d, 0xea, 0x2c, 0x5a, 0x90, 0x04, 0x8b, 0x06, 0xde, 0x01, 0x01, 0x5a, 0x1b, 0x22,
0x5f, 0xe6, 0xac, 0x7a, 0xf1, 0x4f, 0xf5, 0x34, 0x9c, 0xcc, 0x94, 0xcf, 0x5b, 0xef, 0x42, 0x2d,
0xca, 0x60, 0xf7, 0x60, 0x43, 0x38, 0x90, 0x12, 0x83, 0x03, 0x2d, 0x85, 0x21, 0x7c, 0x41, 0xcc,
0x5c, 0x34, 0x4a, 0x8f, 0x96, 0x80, 0xc5, 0xbc, 0x25, 0x60, 0x49, 0x5a, 0x02, 0xaa, 0x9b, 0xa1,
0x0e, 0xf9, 0x42, 0xfc, 0x36, 0xdd, 0x2a, 0x60, 0x65, 0x0b, 0xa7, 0x76, 0x2a, 0xbb, 0x7d, 0x8c,
0x48, 0x8b, 0xd1, 0xab, 0x17, 0xa0, 0x2a, 0xbb, 0xb7, 0x98, 0xc7, 0x52, 0x64, 0x8f, 0xf5, 0x7f,
0x60, 0x49, 0x93, 0x10, 0x80, 0xf7, 0xb0, 0x11, 0x0c, 0x3c, 0xec, 0xa3, 0xb7, 0xa0, 0x9e, 0xf1,
0xc4, 0x91, 0xce, 0x57, 0x86, 0x4c, 0xcc, 0x72, 0xea, 0xa5, 0xa3, 0x4d, 0xb6, 0x2e, 0x7c, 0x09,
0xe6, 0x29, 0x42, 0x31, 0x76, 0xb3, 0x97, 0xe9, 0x88, 0xbe, 0x7d, 0xb3, 0x15, 0x5d, 0xe3, 0x35,
0xc3, 0xf7, 0x36, 0x78, 0xf9, 0x99, 0x67, 0x6c, 0xef, 0x40, 0x79, 0x8f, 0xd7, 0x8b, 0x0f, 0x48,
0x35, 0x43, 0x19, 0x89, 0x16, 0x68, 0x21, 0x8f, 0xba, 0x0d, 0xf3, 0x9c, 0x26, 0x6c, 0xde, 0xed,
0xa1, 0xa0, 0x18, 0xd6, 0xbc, 0x5c, 0xb8, 0x8b, 0xfa, 0x83, 0x02, 0xcc, 0x25, 0x7c, 0xfc, 0xab,
0x89, 0x05, 0x5d, 0x96, 0x39, 0x26, 0x96, 0x73, 0x37, 0x24, 0x6f, 0x2f, 0x43, 0x70, 0x86, 0x5f,
0x02, 0xdd, 0x80, 0x5a, 0x02, 0xcf, 0x29, 0xb0, 0xdc, 0xf5, 0x7c, 0xc5, 0x68, 0xf3, 0x32, 0xd8,
0xd3, 0x47, 0x6f, 0xc6, 0xf4, 0x5a, 0x4a, 0x2f, 0x43, 0x13, 0x3a, 0x8b, 0x14, 0x7a, 0xf4, 0x89,
0x66, 0x91, 0x4f, 0xbf, 0xf7, 0x7c, 0xc2, 0xcf, 0xed, 0x53, 0x7d, 0x0e, 0x66, 0x76, 0xf3, 0x9e,
0x34, 0x2a, 0x09, 0x98, 0xe8, 0x1b, 0xb0, 0x78, 0xcf, 0xea, 0x61, 0xff, 0xc0, 0x0f, 0x70, 0xbf,
0x49, 0x67, 0x85, 0x3d, 0x0b, 0x7b, 0x68, 0x15, 0x80, 0x1a, 0xa5, 0xeb, 0x58, 0xe1, 0x13, 0x2b,
0xb1, 0x14, 0xf5, 0xa7, 0x0a, 0xcc, 0x47, 0x8c, 0xe3, 0x60, 0x81, 0x5f, 0x87, 0xc9, 0x3d, 0x5f,
0x6c, 0xe8, 0x26, 0x8e, 0xb9, 0xb2, 0xaa, 0xa0, 0x95, 0xf6, 0xfc, 0xa6, 0x89, 0xde, 0x00, 0x18,
0xf8, 0xd8, 0xe4, 0xc7, 0xde, 0x23, 0xd0, 0xd9, 0x15, 0x42, 0xca, 0xce, 0xc1, 0x6f, 0xc0, 0x8c,
0x65, 0x3b, 0x26, 0xa6, 0x90, 0x08, 0x73, 0x14, 0x32, 0x1b, 0x18, 0xed, 0xae, 0x8f, 0x4d, 0xf5,
0xf7, 0x23, 0x60, 0xc3, 0x17, 0xb9, 0x85, 0xea, 0x9f, 0x8a, 0xb8, 0x48, 0x74, 0x3b, 0x1f, 0x33,
0x0f, 0x60, 0x81, 0x4d, 0x6f, 0x7b, 0x61, 0x99, 0x99, 0x57, 0xd6, 0x12, 0x8d, 0xd3, 0x6a, 0x16,
0x8f, 0x88, 0x05, 0x13, 0x6a, 0xc1, 0xf1, 0x68, 0xa1, 0x12, 0x97, 0x56, 0x18, 0x2d, 0x6d, 0xb1,
0x13, 0xdb, 0xff, 0x17, 0x8c, 0xea, 0x2d, 0x38, 0x9e, 0xb8, 0x95, 0x32, 0xfe, 0x21, 0xd0, 0x7b,
0x89, 0x2d, 0xdb, 0xc8, 0x4b, 0x5c, 0x95, 0x2f, 0x43, 0x0e, 0xbb, 0x3f, 0xc4, 0xef, 0xe5, 0xed,
0xc2, 0x09, 0x69, 0x3f, 0x59, 0xaa, 0xcb, 0x8d, 0xc4, 0xb2, 0xe1, 0x6c, 0xbe, 0xbc, 0xc4, 0xfa,
0xe1, 0x3f, 0x14, 0x58, 0xcc, 0x22, 0x38, 0xe2, 0x31, 0xc7, 0x87, 0x39, 0x17, 0xa9, 0x5f, 0x1b,
0x55, 0xa1, 0xcf, 0xe4, 0x58, 0x68, 0x8b, 0x5d, 0xc3, 0x1c, 0xdd, 0x27, 0xc5, 0xf1, 0xfa, 0xe4,
0x17, 0x85, 0xd8, 0x51, 0xde, 0x90, 0xab, 0x92, 0x9f, 0x60, 0xff, 0x7c, 0x2d, 0x71, 0x53, 0xf2,
0xe5, 0x4c, 0xc6, 0x11, 0x17, 0x25, 0xb5, 0xac, 0x6d, 0xa1, 0xab, 0xa3, 0x24, 0x7d, 0x61, 0xef,
0x49, 0xfe, 0x56, 0x01, 0xe6, 0xe4, 0x0e, 0x41, 0xef, 0x66, 0x5c, 0x93, 0x3c, 0x33, 0xa2, 0x81,
0xd2, 0x2d, 0x49, 0x7e, 0x2d, 0xb1, 0x30, 0xfe, 0xb5, 0xc4, 0xe2, 0x78, 0xd7, 0x12, 0xef, 0xc2,
0xdc, 0x53, 0xcf, 0x0a, 0x8c, 0x47, 0x3d, 0xac, 0xf7, 0x8c, 0x03, 0xec, 0x65, 0xcd, 0xb0, 0x49,
0x57, 0x54, 0x15, 0x2c, 0x0f, 0x09, 0x07, 0x5d, 0x30, 0x3f, 0x35, 0x5c, 0xbe, 0xee, 0x96, 0x42,
0xf9, 0xf6, 0x53, 0xc3, 0x65, 0x3c, 0x94, 0x44, 0xfd, 0x56, 0x01, 0x8e, 0x67, 0x5e, 0xa6, 0xfb,
0xe4, 0x2a, 0xba, 0x14, 0x57, 0xd1, 0x61, 0x6e, 0x28, 0x16, 0x0f, 0x75, 0x43, 0xb1, 0x99, 0xa3,
0xb0, 0x2c, 0xac, 0xc8, 0x70, 0xbd, 0xa9, 0x7f, 0xa9, 0x40, 0x59, 0x54, 0x6a, 0xe4, 0x7d, 0xc1,
0xe5, 0x01, 0x21, 0xd3, 0xe9, 0x9d, 0x0e, 0xdb, 0xb0, 0x1d, 0xdd, 0xc7, 0x24, 0x96, 0x1e, 0x79,
0x3b, 0x6b, 0x91, 0xf2, 0xad, 0x39, 0x1e, 0xde, 0x32, 0x6c, 0xa7, 0xcd, 0x98, 0x50, 0x03, 0x6a,
0x4c, 0x1e, 0x15, 0x45, 0x84, 0x8e, 0x9c, 0x28, 0xe7, 0x28, 0x03, 0x11, 0x42, 0x84, 0xf9, 0xea,
0xdf, 0x28, 0x30, 0x9f, 0xd0, 0xec, 0xaf, 0x5e, 0x23, 0xbe, 0x57, 0x84, 0x99, 0x58, 0x2f, 0x8f,
0x68, 0xc0, 0x1a, 0x2c, 0x08, 0xbc, 0x97, 0x8f, 0x83, 0xf1, 0x6e, 0xc7, 0xcd, 0x73, 0x8e, 0x36,
0x0e, 0x58, 0x1c, 0x75, 0x07, 0xe6, 0x8d, 0x27, 0x86, 0xd5, 0xa3, 0x16, 0x34, 0x56, 0x88, 0x32,
0x17, 0xd2, 0x87, 0x91, 0x18, 0x6b, 0xf7, 0x58, 0x77, 0xe4, 0x80, 0xd2, 0x46, 0x57, 0x15, 0x7d,
0x3f, 0x86, 0x78, 0x1c, 0x7a, 0x55, 0xd1, 0xf7, 0xc3, 0xf2, 0xe8, 0x85, 0x16, 0x7a, 0x47, 0xd3,
0xe7, 0x0f, 0xfb, 0xe4, 0x97, 0x47, 0x68, 0xef, 0x51, 0x52, 0xa2, 0xb0, 0xbe, 0xf1, 0x91, 0xe3,
0xe9, 0x71, 0xfe, 0xe9, 0x11, 0x0a, 0xa3, 0x1c, 0xad, 0x50, 0x88, 0xfa, 0xe7, 0x0a, 0x54, 0x42,
0x3f, 0x32, 0xa2, 0x87, 0x9a, 0xb0, 0x48, 0x6f, 0xff, 0x24, 0x35, 0x3c, 0xa2, 0x93, 0x10, 0x61,
0x6a, 0xc8, 0x5a, 0x6e, 0x40, 0x8d, 0x8a, 0x8a, 0xab, 0x7a, 0x54, 0x47, 0xf9, 0xa2, 0x9a, 0x2c,
0xa0, 0xfc, 0xab, 0x02, 0xa0, 0xb4, 0x2b, 0xf9, 0x95, 0x31, 0xb2, 0x78, 0xa7, 0x95, 0xc6, 0xef,
0xf4, 0xfb, 0x70, 0xac, 0xe3, 0xf4, 0xfb, 0x16, 0xbd, 0x39, 0xe6, 0x78, 0x07, 0xe3, 0x99, 0xdb,
0x02, 0xe3, 0x61, 0x7a, 0x62, 0xea, 0x7b, 0x07, 0x4e, 0x68, 0xd8, 0x71, 0xb1, 0x1d, 0xba, 0xfe,
0x87, 0x4e, 0xf7, 0x10, 0xf1, 0xed, 0x29, 0xa8, 0x67, 0xf1, 0xf3, 0xfd, 0x93, 0x01, 0xd4, 0xd7,
0xf6, 0x71, 0xe7, 0x31, 0x5d, 0x7e, 0x1d, 0x05, 0xb3, 0x55, 0x87, 0x72, 0xcf, 0xe9, 0xb0, 0xc7,
0xa0, 0xf9, 0x16, 0xa3, 0xf8, 0x1e, 0x72, 0xba, 0x73, 0x1a, 0x4e, 0x66, 0x16, 0xcb, 0x6b, 0x85,
0xa0, 0x76, 0x1f, 0x07, 0x1b, 0x4f, 0xb0, 0x1d, 0x86, 0xcf, 0xea, 0x8f, 0x0b, 0xb1, 0x40, 0x9d,
0x66, 0x1d, 0x02, 0xeb, 0x86, 0x5a, 0x10, 0xad, 0x1c, 0x74, 0x4c, 0xb8, 0xd9, 0x9b, 0xa5, 0xec,
0x45, 0xe1, 0xec, 0xc3, 0x6e, 0x5a, 0x08, 0x7d, 0xaa, 0x34, 0x7a, 0x8d, 0x29, 0x4c, 0x4b, 0x40,
0x20, 0x8a, 0x49, 0x08, 0xc4, 0x7b, 0x80, 0xe2, 0xa1, 0x38, 0xdf, 0x6e, 0x28, 0x8d, 0xf1, 0x00,
0x55, 0xcd, 0x4d, 0x3e, 0x95, 0x96, 0xf3, 0x8c, 0xd4, 0xe4, 0x91, 0x9e, 0x91, 0x52, 0x57, 0xe1,
0x14, 0x09, 0xb0, 0x37, 0x71, 0xe0, 0x59, 0x9d, 0x75, 0xec, 0x77, 0x3c, 0xcb, 0x0d, 0x9c, 0x10,
0x7e, 0xa5, 0xea, 0x70, 0x3a, 0x27, 0x9f, 0xab, 0xfb, 0x1d, 0x98, 0x31, 0xa3, 0xe4, 0xac, 0x1d,
0xaf, 0x24, 0xaf, 0x16, 0x67, 0x50, 0x3f, 0x80, 0x5a, 0x92, 0x20, 0x73, 0x27, 0x09, 0x41, 0x69,
0x1f, 0xf7, 0x5c, 0x71, 0xd5, 0x8f, 0xfc, 0x26, 0x5a, 0x67, 0x6b, 0x97, 0xc7, 0xf8, 0x40, 0x9c,
0x88, 0x54, 0x68, 0xca, 0x97, 0xf0, 0x41, 0xd8, 0x36, 0xe9, 0x5d, 0x13, 0xcf, 0xea, 0x24, 0xdb,
0x96, 0x91, 0x1f, 0xb5, 0x8d, 0x74, 0x5b, 0x9f, 0x25, 0xf3, 0xb6, 0x9d, 0xce, 0x7d, 0x33, 0x85,
0xf2, 0x82, 0xeb, 0x98, 0xfc, 0xb7, 0xfa, 0x7d, 0x05, 0x16, 0x52, 0x14, 0x63, 0x9e, 0x72, 0xbd,
0x02, 0xd3, 0xa2, 0xdc, 0x42, 0x1a, 0xd2, 0xcc, 0x64, 0x69, 0x82, 0x04, 0x35, 0x61, 0x21, 0xb2,
0x68, 0xc1, 0x57, 0x4c, 0xf7, 0x45, 0x7c, 0xe1, 0x42, 0xab, 0x5b, 0xeb, 0x24, 0x52, 0xd4, 0x0e,
0xd4, 0x92, 0x54, 0xe3, 0x8c, 0xa9, 0x43, 0xd5, 0x57, 0xfd, 0x91, 0x02, 0x53, 0x2c, 0x2d, 0xb3,
0xb3, 0xa5, 0xe9, 0xa0, 0x90, 0x9c, 0x0e, 0xde, 0x84, 0x19, 0x26, 0x47, 0x0f, 0x2f, 0x7a, 0xce,
0xc9, 0x1b, 0xfd, 0x4c, 0x34, 0x1d, 0xad, 0xd0, 0x0f, 0x7f, 0x93, 0x66, 0x30, 0x7b, 0xa1, 0x2b,
0x13, 0x01, 0x5c, 0x9f, 0xa1, 0x69, 0xd4, 0xe5, 0x92, 0x90, 0x99, 0xaf, 0x61, 0x46, 0xf8, 0x66,
0xbe, 0xb5, 0xb5, 0x44, 0x5f, 0xe9, 0x4c, 0x6d, 0x75, 0xab, 0x3b, 0xf4, 0x19, 0xcd, 0xf4, 0x16,
0x35, 0x7a, 0x4b, 0x06, 0x3a, 0xbc, 0x90, 0xc2, 0x1a, 0x48, 0x6c, 0x03, 0x8f, 0x3d, 0x9a, 0xcf,
0xf1, 0x0e, 0x1f, 0xc2, 0x89, 0x5c, 0x1a, 0xf4, 0x76, 0xf8, 0x66, 0xb1, 0xe9, 0x59, 0x4f, 0xf8,
0xc6, 0xc2, 0x9c, 0xfc, 0x3e, 0xca, 0x1a, 0x25, 0x58, 0xa7, 0xf9, 0xe2, 0x35, 0x63, 0xf6, 0x75,
0xf1, 0x45, 0x28, 0x8b, 0x7f, 0x68, 0x80, 0xa6, 0xa1, 0xb8, 0xb3, 0xd6, 0xaa, 0x4d, 0x90, 0x1f,
0xbb, 0xeb, 0xad, 0x9a, 0x82, 0xca, 0x50, 0x6a, 0xaf, 0xed, 0xb4, 0x6a, 0x85, 0x8b, 0x7d, 0xa8,
0x25, 0xdf, 0xf4, 0x47, 0xcb, 0x70, 0xac, 0xa5, 0x6d, 0xb7, 0x1a, 0xf7, 0x1b, 0x3b, 0xcd, 0xed,
0x2d, 0xbd, 0xa5, 0x35, 0xdf, 0x6f, 0xec, 0x6c, 0xd4, 0x26, 0xd0, 0x39, 0x38, 0x1d, 0xcf, 0x78,
0xb0, 0xdd, 0xde, 0xd1, 0x77, 0xb6, 0xf5, 0xb5, 0xed, 0xad, 0x9d, 0x46, 0x73, 0x6b, 0x43, 0xab,
0x29, 0xe8, 0x34, 0x9c, 0x88, 0x93, 0xdc, 0x6d, 0xae, 0x37, 0xb5, 0x8d, 0x35, 0xf2, 0xbb, 0xf1,
0xb0, 0x56, 0xb8, 0xf8, 0x36, 0x54, 0xa5, 0xbb, 0x60, 0xa4, 0x4a, 0xad, 0xed, 0xf5, 0xda, 0x04,
0xaa, 0x42, 0x25, 0x2e, 0xa7, 0x0c, 0xa5, 0xad, 0xed, 0xf5, 0x8d, 0x5a, 0x01, 0x01, 0x4c, 0xed,
0x34, 0xb4, 0xfb, 0x1b, 0x3b, 0xb5, 0xe2, 0xc5, 0x57, 0x61, 0x25, 0xef, 0x4e, 0x24, 0xaa, 0xc0,
0xe4, 0x26, 0xf6, 0xba, 0xb8, 0x36, 0x41, 0x58, 0xda, 0xc4, 0x4a, 0x82, 0x9a, 0x72, 0xf1, 0x56,
0xf2, 0x49, 0x1f, 0x8c, 0x16, 0xa0, 0xda, 0x6e, 0x6c, 0xad, 0xdf, 0xdd, 0xfe, 0xaa, 0xae, 0x6d,
0x34, 0xd6, 0x3f, 0xa8, 0x4d, 0xa0, 0x45, 0xa8, 0x89, 0xa4, 0xad, 0xed, 0x1d, 0x96, 0xaa, 0x5c,
0x7c, 0x9c, 0x58, 0xe6, 0x62, 0x74, 0x1c, 0x16, 0xc2, 0x5a, 0xea, 0x6b, 0xda, 0x46, 0x63, 0x67,
0x83, 0x54, 0x5e, 0x4a, 0xd6, 0x76, 0xb7, 0xb6, 0x9a, 0x5b, 0xf7, 0x6b, 0x0a, 0x91, 0x1a, 0x25,
0x6f, 0x7c, 0xb5, 0x49, 0x88, 0x0b, 0x32, 0xf1, 0xee, 0xd6, 0x97, 0xb6, 0xb6, 0xbf, 0xb2, 0x55,
0x2b, 0x5e, 0xfc, 0xff, 0x71, 0x5c, 0x4f, 0x34, 0x15, 0x9d, 0x84, 0xe5, 0x54, 0x89, 0xfa, 0xc6,
0xfb, 0x1b, 0x5b, 0x3b, 0xb5, 0x09, 0x39, 0xb3, 0xbd, 0xd3, 0xd0, 0xa2, 0x4c, 0x25, 0x99, 0xb9,
0xdd, 0x6a, 0x85, 0x99, 0x05, 0x39, 0x73, 0x7d, 0xe3, 0xe1, 0x46, 0xc4, 0x59, 0xbc, 0xf8, 0x3c,
0x40, 0x34, 0xe4, 0xd0, 0x0c, 0x4c, 0xaf, 0x6d, 0xef, 0x6e, 0xed, 0x6c, 0x68, 0xb5, 0x09, 0xa2,
0xe5, 0xfb, 0x8d, 0xdd, 0xfb, 0x1b, 0x35, 0xe5, 0xe2, 0x05, 0x98, 0x8d, 0x1b, 0x20, 0xa1, 0x6b,
0x7f, 0xd0, 0xde, 0xd9, 0xd8, 0x24, 0x1a, 0x99, 0x85, 0xf2, 0xda, 0x7d, 0x6d, 0x7b, 0xb7, 0x75,
0xaf, 0x5d, 0x53, 0xae, 0xfd, 0xd7, 0x62, 0x78, 0xbc, 0xd0, 0xc6, 0x1e, 0xbd, 0x17, 0xb3, 0x0e,
0xd3, 0xe2, 0xbf, 0x86, 0x48, 0x1b, 0x3d, 0xf2, 0x7f, 0x39, 0xa9, 0x9f, 0xcc, 0xcc, 0xe3, 0xa1,
0xc4, 0x04, 0x7a, 0x9f, 0x1e, 0xd8, 0xc4, 0x1e, 0xd4, 0x3b, 0x9b, 0xd8, 0x37, 0x4f, 0xbd, 0xdb,
0x57, 0x3f, 0x37, 0x84, 0x22, 0x94, 0xfb, 0x01, 0xcc, 0xc9, 0x2f, 0xd7, 0xa2, 0x73, 0xf2, 0xa9,
0x40, 0xc6, 0xa3, 0xb8, 0x75, 0x75, 0x18, 0x49, 0x28, 0x5a, 0x87, 0x5a, 0xf2, 0xe5, 0x5a, 0x24,
0x61, 0x94, 0x72, 0x1e, 0xc6, 0xad, 0x3f, 0x3f, 0x9c, 0x28, 0x5e, 0x40, 0xea, 0x41, 0xd6, 0xe7,
0x86, 0x3f, 0x71, 0x99, 0x51, 0x40, 0xde, 0x3b, 0x98, 0x4c, 0x39, 0xf2, 0x44, 0x8b, 0x12, 0x6f,
0xa0, 0x66, 0x3c, 0x97, 0x28, 0x2b, 0x27, 0xfb, 0xa9, 0x3c, 0x75, 0x02, 0xfd, 0x2f, 0x98, 0x4f,
0x5c, 0x7a, 0x40, 0x12, 0x63, 0xf6, 0x5d, 0x8e, 0xfa, 0x73, 0x43, 0x69, 0xe4, 0x5e, 0x8d, 0x5f,
0x6c, 0x48, 0xf6, 0x6a, 0xc6, 0x85, 0x89, 0x64, 0xaf, 0x66, 0xde, 0x8b, 0xa0, 0x86, 0x28, 0x5d,
0x62, 0x90, 0x0d, 0x31, 0xeb, 0xd2, 0x44, 0xfd, 0xdc, 0x10, 0x8a, 0xb8, 0x42, 0x12, 0xd7, 0x18,
0x64, 0x85, 0x64, 0x5f, 0x90, 0xa8, 0x3f, 0x37, 0x94, 0x26, 0xd9, 0x93, 0x11, 0x46, 0x3a, 0xdd,
0x93, 0x29, 0x08, 0x7f, 0xba, 0x27, 0xd3, 0x10, 0x6b, 0xde, 0x93, 0x09, 0x54, 0xb3, 0x3a, 0x14,
0x27, 0x99, 0xd5, 0x93, 0xd9, 0x58, 0x4a, 0x75, 0x02, 0x3d, 0x85, 0x95, 0x3c, 0x1c, 0x1b, 0x7a,
0xf9, 0x10, 0x70, 0xbb, 0xfa, 0x2b, 0xe3, 0x11, 0x87, 0x05, 0x63, 0x40, 0xe9, 0x15, 0x17, 0x7a,
0x41, 0x56, 0x77, 0xce, 0x8a, 0xae, 0xfe, 0xe2, 0x28, 0xb2, 0xb0, 0x98, 0xfb, 0x50, 0x16, 0x08,
0x39, 0x24, 0xb9, 0xc0, 0x04, 0x32, 0xaf, 0x7e, 0x2a, 0x3b, 0x33, 0x14, 0xf4, 0x16, 0x94, 0x48,
0x2a, 0x5a, 0x4e, 0xd2, 0x09, 0x01, 0x2b, 0xe9, 0x8c, 0x90, 0xb9, 0x01, 0x53, 0x0c, 0xfa, 0x85,
0xa4, 0x43, 0x54, 0x09, 0x9a, 0x56, 0xaf, 0x67, 0x65, 0x85, 0x22, 0x5a, 0xec, 0x7f, 0x30, 0x71,
0x24, 0x17, 0x5a, 0x4d, 0xbe, 0x59, 0x2f, 0x43, 0xc6, 0xea, 0x67, 0x72, 0xf3, 0xe3, 0x36, 0x9b,
0xd8, 0x58, 0x3d, 0x37, 0xe4, 0xa0, 0x20, 0xcb, 0x66, 0xb3, 0x8f, 0x1f, 0x58, 0xe7, 0xa6, 0x8f,
0x27, 0xd0, 0x0b, 0xb9, 0xf6, 0x2e, 0x15, 0xf1, 0xe2, 0x28, 0xb2, 0xf8, 0xd0, 0x48, 0x3e, 0x3e,
0xa7, 0x0e, 0x7b, 0x18, 0x32, 0x6b, 0x68, 0xe4, 0x3c, 0x38, 0xa9, 0x4e, 0xa0, 0x7d, 0x38, 0x96,
0xf1, 0x22, 0x25, 0x7a, 0x31, 0xdf, 0xff, 0x4a, 0xa5, 0xbc, 0x34, 0x92, 0x2e, 0x5e, 0x52, 0x06,
0x7c, 0x43, 0x2e, 0x29, 0x1f, 0x3f, 0x22, 0x97, 0x34, 0x0c, 0x07, 0x42, 0x0d, 0x91, 0xfb, 0x90,
0x13, 0x59, 0x87, 0xf3, 0x19, 0x86, 0x98, 0xf2, 0x18, 0xfb, 0x70, 0x2c, 0x63, 0x57, 0x42, 0xae,
0x6c, 0xfe, 0x6e, 0x89, 0x5c, 0xd9, 0x61, 0xdb, 0x1b, 0x13, 0xe8, 0x43, 0x40, 0xf7, 0x71, 0x20,
0x87, 0x72, 0x3e, 0x92, 0x06, 0x6a, 0x72, 0x03, 0x24, 0xc7, 0x3e, 0xa5, 0x9d, 0x10, 0x75, 0xe2,
0xaa, 0x82, 0x6c, 0x76, 0xaf, 0x2a, 0xb5, 0x7e, 0x47, 0xe7, 0x93, 0xdd, 0x96, 0xb7, 0x05, 0x50,
0xbf, 0x30, 0x06, 0x65, 0xd8, 0x16, 0x3b, 0xf9, 0xfa, 0xb1, 0x58, 0x42, 0x9e, 0xcf, 0x37, 0x13,
0x79, 0x59, 0x9e, 0x2e, 0x2f, 0x77, 0x81, 0x1e, 0xc6, 0x73, 0x31, 0x63, 0x3a, 0x9b, 0x0f, 0x26,
0xca, 0x89, 0xe7, 0xb2, 0x0c, 0xe8, 0xda, 0xef, 0x16, 0x61, 0x96, 0x81, 0xae, 0x78, 0xf8, 0xb9,
0x09, 0x10, 0xe1, 0x17, 0xd1, 0xe9, 0x64, 0x1d, 0x25, 0x50, 0x68, 0x7d, 0x35, 0x2f, 0x3b, 0xee,
0xe6, 0x62, 0xb8, 0x40, 0xd9, 0xcd, 0xa5, 0x61, 0x8e, 0xb2, 0x9b, 0xcb, 0x00, 0x14, 0xaa, 0x13,
0xe8, 0x3d, 0xa8, 0x84, 0x30, 0x34, 0xd9, 0x78, 0x92, 0x78, 0xba, 0xfa, 0xe9, 0x9c, 0xdc, 0x78,
0xed, 0x62, 0xe8, 0x32, 0xb9, 0x76, 0x69, 0xe4, 0x9a, 0x5c, 0xbb, 0x2c, 0x58, 0x5a, 0xd4, 0x5e,
0x86, 0x23, 0xc8, 0x68, 0xaf, 0x84, 0x2b, 0xc9, 0x68, 0xaf, 0x0c, 0x40, 0x50, 0x27, 0xee, 0xde,
0xf9, 0xc9, 0xcf, 0x57, 0x95, 0x9f, 0xfe, 0x7c, 0x75, 0xe2, 0xff, 0x7e, 0xbc, 0xaa, 0xfc, 0xe4,
0xe3, 0x55, 0xe5, 0x1f, 0x3f, 0x5e, 0x55, 0x7e, 0xf6, 0xf1, 0xaa, 0xf2, 0xed, 0x7f, 0x5d, 0x9d,
0xf8, 0x50, 0x7d, 0x7c, 0xc3, 0xbf, 0x6c, 0x39, 0x57, 0x3a, 0x9e, 0x75, 0xc9, 0x70, 0xad, 0x2b,
0xee, 0xe3, 0xee, 0x15, 0xc3, 0xb5, 0xfc, 0x2b, 0x5c, 0xee, 0x95, 0x27, 0xaf, 0x3e, 0x9a, 0xa2,
0xff, 0xb7, 0xef, 0xb5, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x26, 0x3f, 0x1c, 0xf6, 0x71, 0x71,
0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -12651,6 +12666,13 @@ func (m *Mount) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.ImageSubPath) > 0 {
i -= len(m.ImageSubPath)
copy(dAtA[i:], m.ImageSubPath)
i = encodeVarintApi(dAtA, i, uint64(len(m.ImageSubPath)))
i--
dAtA[i] = 0x52
}
if m.Image != nil {
{
size, err := m.Image.MarshalToSizedBuffer(dAtA[:i])
@ -20428,6 +20450,10 @@ func (m *Mount) Size() (n int) {
l = m.Image.Size()
n += 1 + l + sovApi(uint64(l))
}
l = len(m.ImageSubPath)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
return n
}
@ -23604,6 +23630,7 @@ func (this *Mount) String() string {
`GidMappings:` + repeatedStringForGidMappings + `,`,
`RecursiveReadOnly:` + fmt.Sprintf("%v", this.RecursiveReadOnly) + `,`,
`Image:` + strings.Replace(this.Image.String(), "ImageSpec", "ImageSpec", 1) + `,`,
`ImageSubPath:` + fmt.Sprintf("%v", this.ImageSubPath) + `,`,
`}`,
}, "")
return s
@ -26615,6 +26642,38 @@ func (m *Mount) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 10:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ImageSubPath", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
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 ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthApi
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ImageSubPath = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])

View File

@ -257,13 +257,19 @@ message Mount {
bool recursive_read_only = 8;
// Mount an image reference (image ID, with or without digest), which is a
// special use case for image volume mounts. If this field is set, then
// host_path should be unset. All OCI mounts are per feature definition
// readonly. The kubelet does an PullImage RPC and evaluates the returned
// host_path should be unset. All image mounts are per feature definition
// readonly (noexec). The kubelet does an PullImage RPC and evaluates the returned
// PullImageResponse.image_ref value, which is then set to the
// ImageSpec.image field. Runtimes are expected to mount the image as
// required.
// Introduced in the OCI Volume Source KEP: https://kep.k8s.io/4639
// Introduced in the Image Volume Source KEP: https://kep.k8s.io/4639
ImageSpec image = 9;
// Specific image sub path to be used from inside the image instead of its
// root, only necessary if the above image field is set. If the sub path is
// not empty and does not exist in the image, then runtimes should fail and
// return an error.
// Introduced in the Image Volume Source KEP beta graduation: https://kep.k8s.io/4639
string image_sub_path = 10;
}
// IDMapping describes host to container ID mappings for a pod sandbox.

View File

@ -32,6 +32,9 @@ var (
// ErrRROUnsupported - Unable to enforce recursive readonly mounts
ErrRROUnsupported = errors.New("RROUnsupported")
// ErrImageVolumeMountFailed - Unable to mount an image volume.
ErrImageVolumeMountFailed = errors.New("ImageVolumeMountFailed")
)
// IsNotFound returns a boolean indicating whether the error

View File

@ -35,6 +35,7 @@ import (
e2enode "k8s.io/kubernetes/test/e2e/framework/node"
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
imageutils "k8s.io/kubernetes/test/utils/image"
admissionapi "k8s.io/pod-security-admission/api"
)
@ -44,10 +45,11 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
f := framework.NewDefaultFramework("image-volume-test")
f.NamespacePodSecurityLevel = admissionapi.LevelPrivileged
volumeImage := imageutils.GetE2EImage(imageutils.Kitten)
const (
podName = "test-pod"
containerName = "test-container"
validImageRef = "quay.io/crio/artifact:v1"
invalidImageRef = "localhost/invalid"
volumeName = "volume"
volumePathPrefix = "/volume"
@ -90,6 +92,17 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
}
verifyFileContents := func(podName, volumePath string) {
ginkgo.By(fmt.Sprintf("Verifying the volume mount contents for path: %s", volumePath))
firstFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePath, "data.json"))
gomega.Expect(firstFileContents).To(gomega.ContainSubstring("kitten.jpg"))
secondFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePath, "etc", "os-release"))
gomega.Expect(secondFileContents).To(gomega.ContainSubstring("Alpine Linux"))
}
f.It("should succeed with pod and pull policy of Always", func(ctx context.Context) {
var selinuxOptions *v1.SELinuxOptions
if selinux.GetEnabled() {
@ -105,7 +118,7 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
createPod(ctx,
podName,
"",
[]v1.Volume{{Name: volumeName, VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: validImageRef, PullPolicy: v1.PullAlways}}}},
[]v1.Volume{{Name: volumeName, VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: volumeImage, PullPolicy: v1.PullAlways}}}},
[]v1.VolumeMount{{Name: volumeName, MountPath: volumePathPrefix}},
selinuxOptions,
)
@ -114,13 +127,7 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
err := e2epod.WaitForPodNameRunningInNamespace(ctx, f.ClientSet, podName, f.Namespace.Name)
framework.ExpectNoError(err, "Failed to await for the pod to be running: (%s/%s)", f.Namespace.Name, podName)
ginkgo.By(fmt.Sprintf("Verifying the volume mount contents for path: %s", volumePathPrefix))
firstFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePathPrefix, "dir", "file"))
gomega.Expect(firstFileContents).To(gomega.Equal("1"))
secondFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePathPrefix, "file"))
gomega.Expect(secondFileContents).To(gomega.Equal("2"))
verifyFileContents(podName, volumePathPrefix)
})
f.It("should succeed with pod and multiple volumes", func(ctx context.Context) {
@ -139,8 +146,8 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
podName,
"",
[]v1.Volume{
{Name: volumeName + "-0", VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: validImageRef}}},
{Name: volumeName + "-1", VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: validImageRef}}},
{Name: volumeName + "-0", VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: volumeImage}}},
{Name: volumeName + "-1", VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: volumeImage}}},
},
[]v1.VolumeMount{
{Name: volumeName + "-0", MountPath: volumePathPrefix + "-0"},
@ -155,13 +162,7 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
for i := range 2 {
volumePath := fmt.Sprintf("%s-%d", volumePathPrefix, i)
ginkgo.By(fmt.Sprintf("Verifying the volume mount contents for path: %s", volumePath))
firstFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePath, "dir", "file"))
gomega.Expect(firstFileContents).To(gomega.Equal("1"))
secondFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePath, "file"))
gomega.Expect(secondFileContents).To(gomega.Equal("2"))
verifyFileContents(podName, volumePath)
}
})
@ -254,7 +255,7 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
createPod(ctx,
podName,
node.Name,
[]v1.Volume{{Name: volumeName, VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: validImageRef}}}},
[]v1.Volume{{Name: volumeName, VolumeSource: v1.VolumeSource{Image: &v1.ImageVolumeSource{Reference: volumeImage}}}},
[]v1.VolumeMount{{Name: volumeName, MountPath: volumePathPrefix}},
selinuxOptions,
)
@ -263,13 +264,7 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
err := e2epod.WaitForPodNameRunningInNamespace(ctx, f.ClientSet, podName, f.Namespace.Name)
framework.ExpectNoError(err, "Failed to await for the pod to be running: (%s/%s)", f.Namespace.Name, podName)
ginkgo.By(fmt.Sprintf("Verifying the volume mount contents for path: %s", volumePathPrefix))
firstFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePathPrefix, "dir", "file"))
gomega.Expect(firstFileContents).To(gomega.Equal("1"))
secondFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePathPrefix, "file"))
gomega.Expect(secondFileContents).To(gomega.Equal("2"))
verifyFileContents(podName, volumePathPrefix)
}
podName := baseName + "-0"
@ -277,12 +272,6 @@ var _ = SIGDescribe("ImageVolume", feature.ImageVolume, func() {
err = e2epod.WaitForPodNameRunningInNamespace(ctx, f.ClientSet, podName, f.Namespace.Name)
framework.ExpectNoError(err, "Failed to await for the pod to be running: (%s/%s)", f.Namespace.Name, podName)
ginkgo.By(fmt.Sprintf("Verifying the volume mount contents for path: %s", volumePathPrefix))
firstFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePathPrefix, "dir", "file"))
gomega.Expect(firstFileContents).To(gomega.Equal("1"))
secondFileContents := e2epod.ExecCommandInContainer(f, podName, containerName, "/bin/cat", filepath.Join(volumePathPrefix, "file"))
gomega.Expect(secondFileContents).To(gomega.Equal("2"))
verifyFileContents(podName, volumePathPrefix)
})
})

View File

@ -524,6 +524,10 @@
lockToDefault: false
preRelease: Alpha
version: "1.31"
- default: false
lockToDefault: false
preRelease: Beta
version: "1.33"
- name: InPlacePodVerticalScaling
versionedSpecs:
- default: false