diff --git a/api/discovery/aggregated_v2beta1.json b/api/discovery/aggregated_v2beta1.json index eed250c6730..2a8836294d8 100644 --- a/api/discovery/aggregated_v2beta1.json +++ b/api/discovery/aggregated_v2beta1.json @@ -1156,6 +1156,35 @@ } ], "version": "v1" + }, + { + "freshness": "Current", + "resources": [ + { + "resource": "volumeattributesclasses", + "responseKind": { + "group": "", + "kind": "VolumeAttributesClass", + "version": "" + }, + "scope": "Cluster", + "shortNames": [ + "vac" + ], + "singularResource": "volumeattributesclass", + "verbs": [ + "create", + "delete", + "deletecollection", + "get", + "list", + "patch", + "update", + "watch" + ] + } + ], + "version": "v1alpha1" } ] }, diff --git a/api/discovery/apis.json b/api/discovery/apis.json index bc1529aa95a..2819acce89b 100644 --- a/api/discovery/apis.json +++ b/api/discovery/apis.json @@ -174,6 +174,10 @@ { "groupVersion": "storage.k8s.io/v1", "version": "v1" + }, + { + "groupVersion": "storage.k8s.io/v1alpha1", + "version": "v1alpha1" } ] }, diff --git a/api/discovery/apis__storage.k8s.io.json b/api/discovery/apis__storage.k8s.io.json index 5b098bdb643..0a1b2841fcf 100644 --- a/api/discovery/apis__storage.k8s.io.json +++ b/api/discovery/apis__storage.k8s.io.json @@ -10,6 +10,10 @@ { "groupVersion": "storage.k8s.io/v1", "version": "v1" + }, + { + "groupVersion": "storage.k8s.io/v1alpha1", + "version": "v1alpha1" } ] } diff --git a/api/discovery/apis__storage.k8s.io__v1alpha1.json b/api/discovery/apis__storage.k8s.io__v1alpha1.json new file mode 100644 index 00000000000..6a857a754a9 --- /dev/null +++ b/api/discovery/apis__storage.k8s.io__v1alpha1.json @@ -0,0 +1,27 @@ +{ + "apiVersion": "v1", + "groupVersion": "storage.k8s.io/v1alpha1", + "kind": "APIResourceList", + "resources": [ + { + "kind": "VolumeAttributesClass", + "name": "volumeattributesclasses", + "namespaced": false, + "shortNames": [ + "vac" + ], + "singularName": "volumeattributesclass", + "storageVersionHash": "HPC8kMG1ukQ=", + "verbs": [ + "create", + "delete", + "deletecollection", + "get", + "list", + "patch", + "update", + "watch" + ] + } + ] +} diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 726fe23ab2c..b6a132f39a0 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -7212,6 +7212,23 @@ ], "type": "object" }, + "io.k8s.api.core.v1.ModifyVolumeStatus": { + "description": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation", + "properties": { + "status": { + "description": "status is the status of the ControllerModifyVolume operation. It can be in any of following states:\n - Pending\n Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as\n the specified VolumeAttributesClass not existing.\n - InProgress\n InProgress indicates that the volume is being modified.\n - Infeasible\n Infeasible indicates that the request has been rejected as invalid by the CSI driver. To\n\t resolve the error, a valid VolumeAttributesClass needs to be specified.\nNote: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately.", + "type": "string" + }, + "targetVolumeAttributesClassName": { + "description": "targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, "io.k8s.api.core.v1.NFSVolumeSource": { "description": "Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.", "properties": { @@ -7993,6 +8010,10 @@ "description": "storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "type": "string" }, + "volumeAttributesClassName": { + "description": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", "type": "string" @@ -8045,6 +8066,14 @@ "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" }, + "currentVolumeAttributesClassName": { + "description": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is an alpha field and requires enabling VolumeAttributesClass feature.", + "type": "string" + }, + "modifyVolumeStatus": { + "$ref": "#/definitions/io.k8s.api.core.v1.ModifyVolumeStatus", + "description": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is an alpha field and requires enabling VolumeAttributesClass feature." + }, "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" @@ -8246,6 +8275,10 @@ "$ref": "#/definitions/io.k8s.api.core.v1.StorageOSPersistentVolumeSource", "description": "storageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://examples.k8s.io/volumes/storageos/README.md" }, + "volumeAttributesClassName": { + "description": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is an alpha field and requires enabling VolumeAttributesClass feature.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", "type": "string" @@ -15675,6 +15708,80 @@ }, "type": "object" }, + "io.k8s.api.storage.v1alpha1.VolumeAttributesClass": { + "description": "VolumeAttributesClass represents a specification of mutable volume attributes defined by the CSI driver. The class can be specified during dynamic provisioning of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "driverName": { + "description": "Name of the CSI driver This field is immutable.", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "parameters": { + "additionalProperties": { + "type": "string" + }, + "description": "parameters hold volume attributes defined by the CSI driver. These values are opaque to the Kubernetes and are passed directly to the CSI driver. The underlying storage provider supports changing these attributes on an existing volume, however the parameters field itself is immutable. To invoke a volume update, a new VolumeAttributesClass should be created with new parameters, and the PersistentVolumeClaim should be updated to reference the new VolumeAttributesClass.\n\nThis field is required and must contain at least one key/value pair. The keys cannot be empty, and the maximum number of parameters is 512, with a cumulative max size of 256K. If the CSI driver rejects invalid parameters, the target PersistentVolumeClaim will be set to an \"Infeasible\" state in the modifyVolumeStatus field.", + "type": "object" + } + }, + "required": [ + "driverName" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + ] + }, + "io.k8s.api.storage.v1alpha1.VolumeAttributesClassList": { + "description": "VolumeAttributesClassList is a collection of VolumeAttributesClass objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of VolumeAttributesClass objects.", + "items": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta", + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClassList", + "version": "v1alpha1" + } + ] + }, "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceColumnDefinition": { "description": "CustomResourceColumnDefinition specifies a column for server side printing.", "properties": { @@ -76276,6 +76383,674 @@ } ] }, + "/apis/storage.k8s.io/v1alpha1/": { + "get": { + "consumes": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "description": "get available resources", + "operationId": "getStorageV1alpha1APIResources", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ] + } + }, + "/apis/storage.k8s.io/v1alpha1/volumeattributesclasses": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete collection of VolumeAttributesClass", + "operationId": "deleteStorageV1alpha1CollectionVolumeAttributesClass", + "parameters": [ + { + "$ref": "#/parameters/body-2Y1dVQaQ" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "$ref": "#/parameters/orphanDependents-uRB25kX5" + }, + { + "$ref": "#/parameters/propagationPolicy-6jk3prlO" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "list or watch objects of kind VolumeAttributesClass", + "operationId": "listStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + }, + { + "$ref": "#/parameters/watch-XNNPZGbK" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClassList" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "$ref": "#/parameters/pretty-tJGM1-ng" + } + ], + "post": { + "consumes": [ + "*/*" + ], + "description": "create a VolumeAttributesClass", + "operationId": "createStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldManager-Qy4HdaTW" + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + } + }, + "/apis/storage.k8s.io/v1alpha1/volumeattributesclasses/{name}": { + "delete": { + "consumes": [ + "*/*" + ], + "description": "delete a VolumeAttributesClass", + "operationId": "deleteStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "$ref": "#/parameters/body-2Y1dVQaQ" + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/gracePeriodSeconds--K5HaBOS" + }, + { + "$ref": "#/parameters/orphanDependents-uRB25kX5" + }, + { + "$ref": "#/parameters/propagationPolicy-6jk3prlO" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "202": { + "description": "Accepted", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "get": { + "consumes": [ + "*/*" + ], + "description": "read the specified VolumeAttributesClass", + "operationId": "readStorageV1alpha1VolumeAttributesClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "name of the VolumeAttributesClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/pretty-tJGM1-ng" + } + ], + "patch": { + "consumes": [ + "application/json-patch+json", + "application/merge-patch+json", + "application/strategic-merge-patch+json", + "application/apply-patch+yaml" + ], + "description": "partially update the specified VolumeAttributesClass", + "operationId": "patchStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "$ref": "#/parameters/body-78PwaGsr" + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldManager-7c6nTn1T" + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/force-tOGGb0Yi" + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "put": { + "consumes": [ + "*/*" + ], + "description": "replace the specified VolumeAttributesClass", + "operationId": "replaceStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/fieldManager-Qy4HdaTW" + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "type": "string", + "uniqueItems": true + } + ], + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + } + }, + "/apis/storage.k8s.io/v1alpha1/watch/volumeattributesclasses": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch individual changes to a list of VolumeAttributesClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1alpha1VolumeAttributesClassList", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "$ref": "#/parameters/pretty-tJGM1-ng" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + }, + { + "$ref": "#/parameters/watch-XNNPZGbK" + } + ] + }, + "/apis/storage.k8s.io/v1alpha1/watch/volumeattributesclasses/{name}": { + "get": { + "consumes": [ + "*/*" + ], + "description": "watch changes to an object of kind VolumeAttributesClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1alpha1VolumeAttributesClass", + "produces": [ + "application/json", + "application/yaml", + "application/vnd.kubernetes.protobuf", + "application/json;stream=watch", + "application/vnd.kubernetes.protobuf;stream=watch" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "401": { + "description": "Unauthorized" + } + }, + "schemes": [ + "https" + ], + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "$ref": "#/parameters/allowWatchBookmarks-HC2hJt-J" + }, + { + "$ref": "#/parameters/continue-QfD61s0i" + }, + { + "$ref": "#/parameters/fieldSelector-xIcQKXFG" + }, + { + "$ref": "#/parameters/labelSelector-5Zw57w4C" + }, + { + "$ref": "#/parameters/limit-1NfNmdNH" + }, + { + "description": "name of the VolumeAttributesClass", + "in": "path", + "name": "name", + "required": true, + "type": "string", + "uniqueItems": true + }, + { + "$ref": "#/parameters/pretty-tJGM1-ng" + }, + { + "$ref": "#/parameters/resourceVersion-5WAnf1kx" + }, + { + "$ref": "#/parameters/resourceVersionMatch-t8XhRHeC" + }, + { + "$ref": "#/parameters/sendInitialEvents-rLXlEK_k" + }, + { + "$ref": "#/parameters/timeoutSeconds-yvYezaOC" + }, + { + "$ref": "#/parameters/watch-XNNPZGbK" + } + ] + }, "/logs/": { "get": { "operationId": "logFileListHandler", diff --git a/api/openapi-spec/v3/api__v1_openapi.json b/api/openapi-spec/v3/api__v1_openapi.json index 8b15c184107..fc02fc6fb7d 100644 --- a/api/openapi-spec/v3/api__v1_openapi.json +++ b/api/openapi-spec/v3/api__v1_openapi.json @@ -3138,6 +3138,24 @@ ], "type": "object" }, + "io.k8s.api.core.v1.ModifyVolumeStatus": { + "description": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation", + "properties": { + "status": { + "default": "", + "description": "status is the status of the ControllerModifyVolume operation. It can be in any of following states:\n - Pending\n Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as\n the specified VolumeAttributesClass not existing.\n - InProgress\n InProgress indicates that the volume is being modified.\n - Infeasible\n Infeasible indicates that the request has been rejected as invalid by the CSI driver. To\n\t resolve the error, a valid VolumeAttributesClass needs to be specified.\nNote: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately.", + "type": "string" + }, + "targetVolumeAttributesClassName": { + "description": "targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, "io.k8s.api.core.v1.NFSVolumeSource": { "description": "Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.", "properties": { @@ -4163,6 +4181,10 @@ "description": "storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "type": "string" }, + "volumeAttributesClassName": { + "description": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", "type": "string" @@ -4222,6 +4244,18 @@ "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" }, + "currentVolumeAttributesClassName": { + "description": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is an alpha field and requires enabling VolumeAttributesClass feature.", + "type": "string" + }, + "modifyVolumeStatus": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.core.v1.ModifyVolumeStatus" + } + ], + "description": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is an alpha field and requires enabling VolumeAttributesClass feature." + }, "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" @@ -4538,6 +4572,10 @@ ], "description": "storageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://examples.k8s.io/volumes/storageos/README.md" }, + "volumeAttributesClassName": { + "description": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is an alpha field and requires enabling VolumeAttributesClass feature.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", "type": "string" diff --git a/api/openapi-spec/v3/apis__apps__v1_openapi.json b/api/openapi-spec/v3/apis__apps__v1_openapi.json index e43cb4f7baa..b90ba634016 100644 --- a/api/openapi-spec/v3/apis__apps__v1_openapi.json +++ b/api/openapi-spec/v3/apis__apps__v1_openapi.json @@ -2783,6 +2783,24 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "io.k8s.api.core.v1.ModifyVolumeStatus": { + "description": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation", + "properties": { + "status": { + "default": "", + "description": "status is the status of the ControllerModifyVolume operation. It can be in any of following states:\n - Pending\n Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as\n the specified VolumeAttributesClass not existing.\n - InProgress\n InProgress indicates that the volume is being modified.\n - Infeasible\n Infeasible indicates that the request has been rejected as invalid by the CSI driver. To\n\t resolve the error, a valid VolumeAttributesClass needs to be specified.\nNote: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately.", + "type": "string" + }, + "targetVolumeAttributesClassName": { + "description": "targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, "io.k8s.api.core.v1.NFSVolumeSource": { "description": "Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.", "properties": { @@ -3071,6 +3089,10 @@ "description": "storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "type": "string" }, + "volumeAttributesClassName": { + "description": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", "type": "string" @@ -3130,6 +3152,18 @@ "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge" }, + "currentVolumeAttributesClassName": { + "description": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is an alpha field and requires enabling VolumeAttributesClass feature.", + "type": "string" + }, + "modifyVolumeStatus": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.core.v1.ModifyVolumeStatus" + } + ], + "description": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is an alpha field and requires enabling VolumeAttributesClass feature." + }, "phase": { "description": "phase represents the current phase of PersistentVolumeClaim.", "type": "string" diff --git a/api/openapi-spec/v3/apis__batch__v1_openapi.json b/api/openapi-spec/v3/apis__batch__v1_openapi.json index 54334ff4ce2..8d7d8467998 100644 --- a/api/openapi-spec/v3/apis__batch__v1_openapi.json +++ b/api/openapi-spec/v3/apis__batch__v1_openapi.json @@ -2333,6 +2333,10 @@ "description": "storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "type": "string" }, + "volumeAttributesClassName": { + "description": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", "type": "string" diff --git a/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json b/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json index fdc92662c47..02ea235f055 100644 --- a/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json +++ b/api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json @@ -843,6 +843,10 @@ ], "description": "storageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod More info: https://examples.k8s.io/volumes/storageos/README.md" }, + "volumeAttributesClassName": { + "description": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is an alpha field and requires enabling VolumeAttributesClass feature.", + "type": "string" + }, "volumeMode": { "description": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", "type": "string" diff --git a/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json b/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json new file mode 100644 index 00000000000..a9fc204a662 --- /dev/null +++ b/api/openapi-spec/v3/apis__storage.k8s.io__v1alpha1_openapi.json @@ -0,0 +1,2390 @@ +{ + "components": { + "schemas": { + "io.k8s.api.storage.v1alpha1.VolumeAttributesClass": { + "description": "VolumeAttributesClass represents a specification of mutable volume attributes defined by the CSI driver. The class can be specified during dynamic provisioning of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "driverName": { + "default": "", + "description": "Name of the CSI driver This field is immutable.", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + } + ], + "default": {}, + "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "parameters": { + "additionalProperties": { + "default": "", + "type": "string" + }, + "description": "parameters hold volume attributes defined by the CSI driver. These values are opaque to the Kubernetes and are passed directly to the CSI driver. The underlying storage provider supports changing these attributes on an existing volume, however the parameters field itself is immutable. To invoke a volume update, a new VolumeAttributesClass should be created with new parameters, and the PersistentVolumeClaim should be updated to reference the new VolumeAttributesClass.\n\nThis field is required and must contain at least one key/value pair. The keys cannot be empty, and the maximum number of parameters is 512, with a cumulative max size of 256K. If the CSI driver rejects invalid parameters, the target PersistentVolumeClaim will be set to an \"Infeasible\" state in the modifyVolumeStatus field.", + "type": "object" + } + }, + "required": [ + "driverName" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + ] + }, + "io.k8s.api.storage.v1alpha1.VolumeAttributesClassList": { + "description": "VolumeAttributesClassList is a collection of VolumeAttributesClass objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "description": "items is the list of VolumeAttributesClass objects.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + ], + "default": {} + }, + "type": "array" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + ], + "default": {}, + "description": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + } + }, + "required": [ + "items" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClassList", + "version": "v1alpha1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIResource": { + "description": "APIResource specifies the name of a resource and whether it is namespaced.", + "properties": { + "categories": { + "description": "categories is a list of the grouped resources this resource belongs to (e.g. 'all')", + "items": { + "default": "", + "type": "string" + }, + "type": "array" + }, + "group": { + "description": "group is the preferred group of the resource. Empty implies the group of the containing resource list. For subresources, this may have a different value, for example: Scale\".", + "type": "string" + }, + "kind": { + "default": "", + "description": "kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')", + "type": "string" + }, + "name": { + "default": "", + "description": "name is the plural name of the resource.", + "type": "string" + }, + "namespaced": { + "default": false, + "description": "namespaced indicates if a resource is namespaced or not.", + "type": "boolean" + }, + "shortNames": { + "description": "shortNames is a list of suggested short names of the resource.", + "items": { + "default": "", + "type": "string" + }, + "type": "array" + }, + "singularName": { + "default": "", + "description": "singularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface.", + "type": "string" + }, + "storageVersionHash": { + "description": "The hash value of the storage version, the version this resource is converted to when written to the data store. Value must be treated as opaque by clients. Only equality comparison on the value is valid. This is an alpha feature and may change or be removed in the future. The field is populated by the apiserver only if the StorageVersionHash feature gate is enabled. This field will remain optional even if it graduates.", + "type": "string" + }, + "verbs": { + "description": "verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)", + "items": { + "default": "", + "type": "string" + }, + "type": "array" + }, + "version": { + "description": "version is the preferred version of the resource. Empty implies the version of the containing resource list For subresources, this may have a different value, for example: v1 (while inside a v1beta1 version of the core resource's group)\".", + "type": "string" + } + }, + "required": [ + "name", + "singularName", + "namespaced", + "kind", + "verbs" + ], + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList": { + "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "groupVersion": { + "default": "", + "description": "groupVersion is the group and version this APIResourceList is for.", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "resources": { + "description": "resources contains the name of the resources and if they are namespaced.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.APIResource" + } + ], + "default": {} + }, + "type": "array" + } + }, + "required": [ + "groupVersion", + "resources" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "APIResourceList", + "version": "v1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions": { + "description": "DeleteOptions may be provided when deleting an API object.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "dryRun": { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "items": { + "default": "", + "type": "string" + }, + "type": "array" + }, + "gracePeriodSeconds": { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "format": "int64", + "type": "integer" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "orphanDependents": { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "type": "boolean" + }, + "preconditions": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions" + } + ], + "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned." + }, + "propagationPolicy": { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "type": "string" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "apps", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "DeleteOptions", + "version": "v1beta2" + }, + { + "group": "authentication.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "authentication.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "authentication.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v2" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v2beta1" + }, + { + "group": "autoscaling", + "kind": "DeleteOptions", + "version": "v2beta2" + }, + { + "group": "batch", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "batch", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "certificates.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "certificates.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "certificates.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "coordination.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "coordination.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "discovery.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "discovery.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "events.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "events.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "extensions", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta2" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta3" + }, + { + "group": "imagepolicy.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "internal.apiserver.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "networking.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "networking.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "networking.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "node.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "node.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "node.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "policy", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "policy", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "resource.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha2" + }, + { + "group": "scheduling.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "scheduling.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "scheduling.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + }, + { + "group": "storage.k8s.io", + "kind": "DeleteOptions", + "version": "v1" + }, + { + "group": "storage.k8s.io", + "kind": "DeleteOptions", + "version": "v1alpha1" + }, + { + "group": "storage.k8s.io", + "kind": "DeleteOptions", + "version": "v1beta1" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1": { + "description": "FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format.\n\nEach key is either a '.' representing the field itself, and will always map to an empty set, or a string representing a sub-field or item. The string will follow one of these four formats: 'f:', where is the name of a field in a struct, or key in a map 'v:', where is the exact json formatted value of a list item 'i:', where is position of a item in a list 'k:', where is a map of a list item's key fields to their unique values If a key maps to an empty Fields value, the field that key represents is part of the set.\n\nThe exact format is defined in sigs.k8s.io/structured-merge-diff", + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta": { + "description": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.", + "properties": { + "continue": { + "description": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.", + "type": "string" + }, + "remainingItemCount": { + "description": "remainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and the field will be left unset and omitted during serialization. If the list is complete (either because it is not chunking or because this is the last chunk), then there are no more remaining items and this field will be left unset and omitted during serialization. Servers older than v1.15 do not set this field. The intended use of the remainingItemCount is *estimating* the size of a collection. Clients should not rely on the remainingItemCount to be set or to be exact.", + "format": "int64", + "type": "integer" + }, + "resourceVersion": { + "description": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency", + "type": "string" + }, + "selfLink": { + "description": "Deprecated: selfLink is a legacy read-only field that is no longer populated by the system.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry": { + "description": "ManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource that the fieldset applies to.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the version of this resource that this field set applies to. The format is \"group/version\" just like the top-level APIVersion field. It is necessary to track the version of a field set because it cannot be automatically converted.", + "type": "string" + }, + "fieldsType": { + "description": "FieldsType is the discriminator for the different fields format and version. There is currently only one possible value: \"FieldsV1\"", + "type": "string" + }, + "fieldsV1": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1" + } + ], + "description": "FieldsV1 holds the first JSON version format as described in the \"FieldsV1\" type." + }, + "manager": { + "description": "Manager is an identifier of the workflow managing these fields.", + "type": "string" + }, + "operation": { + "description": "Operation is the type of operation which lead to this ManagedFieldsEntry being created. The only valid values for this field are 'Apply' and 'Update'.", + "type": "string" + }, + "subresource": { + "description": "Subresource is the name of the subresource used to update that object, or empty string if the object was updated through the main resource. The value of this field is used to distinguish between managers, even if they share the same name. For example, a status update will be distinct from a regular update using the same manager name. Note that the APIVersion field is not related to the Subresource field and it always corresponds to the version of the main resource.", + "type": "string" + }, + "time": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + } + ], + "description": "Time is the timestamp of when the ManagedFields entry was added. The timestamp will also be updated if a field is added, the manager changes any of the owned fields value or removes a field. The timestamp does not update when a field is removed from the entry because another manager took it over." + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta": { + "description": "ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.", + "properties": { + "annotations": { + "additionalProperties": { + "default": "", + "type": "string" + }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "type": "object" + }, + "creationTimestamp": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + } + ], + "description": "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "deletionGracePeriodSeconds": { + "description": "Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.", + "format": "int64", + "type": "integer" + }, + "deletionTimestamp": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + } + ], + "description": "DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field, once the finalizers list is empty. As long as the finalizers list contains items, deletion is blocked. Once the deletionTimestamp is set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.\n\nPopulated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + }, + "finalizers": { + "description": "Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed. Finalizers may be processed and removed in any order. Order is NOT enforced because it introduces significant risk of stuck finalizers. finalizers is a shared field, any actor with permission can reorder it. If the finalizer list is processed in order, then this can lead to a situation in which the component responsible for the first finalizer in the list is waiting for a signal (field value, external system, or other) produced by a component responsible for a finalizer later in the list, resulting in a deadlock. Without enforced ordering finalizers are free to order amongst themselves and are not vulnerable to ordering changes in the list.", + "items": { + "default": "", + "type": "string" + }, + "type": "array", + "x-kubernetes-patch-strategy": "merge" + }, + "generateName": { + "description": "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will return a 409.\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency", + "type": "string" + }, + "generation": { + "description": "A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.", + "format": "int64", + "type": "integer" + }, + "labels": { + "additionalProperties": { + "default": "", + "type": "string" + }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "type": "object" + }, + "managedFields": { + "description": "ManagedFields maps workflow-id and version to the set of fields that are managed by that workflow. This is mostly for internal housekeeping, and users typically shouldn't need to set or understand this field. A workflow can be the user's name, a controller's name, or the name of a specific apply path like \"ci-cd\". The set of fields is always in the version that the workflow used when modifying the object.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry" + } + ], + "default": {} + }, + "type": "array" + }, + "name": { + "description": "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names", + "type": "string" + }, + "namespace": { + "description": "Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces", + "type": "string" + }, + "ownerReferences": { + "description": "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference" + } + ], + "default": {} + }, + "type": "array", + "x-kubernetes-patch-merge-key": "uid", + "x-kubernetes-patch-strategy": "merge" + }, + "resourceVersion": { + "description": "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency", + "type": "string" + }, + "selfLink": { + "description": "Deprecated: selfLink is a legacy read-only field that is no longer populated by the system.", + "type": "string" + }, + "uid": { + "description": "UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference": { + "description": "OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field.", + "properties": { + "apiVersion": { + "default": "", + "description": "API version of the referent.", + "type": "string" + }, + "blockOwnerDeletion": { + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion for how the garbage collector interacts with this field and enforces the foreground deletion. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.", + "type": "boolean" + }, + "controller": { + "description": "If true, this reference points to the managing controller.", + "type": "boolean" + }, + "kind": { + "default": "", + "description": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names", + "type": "string" + }, + "uid": { + "default": "", + "description": "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids", + "type": "string" + } + }, + "required": [ + "apiVersion", + "kind", + "name", + "uid" + ], + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Patch": { + "description": "Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.", + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions": { + "description": "Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.", + "properties": { + "resourceVersion": { + "description": "Specifies the target ResourceVersion", + "type": "string" + }, + "uid": { + "description": "Specifies the target UID.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Status": { + "description": "Status is a return value for calls that don't return other objects.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "code": { + "description": "Suggested HTTP return code for this status, 0 if not set.", + "format": "int32", + "type": "integer" + }, + "details": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails" + } + ], + "description": "Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type." + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "message": { + "description": "A human-readable description of the status of this operation.", + "type": "string" + }, + "metadata": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + ], + "default": {}, + "description": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" + }, + "reason": { + "description": "A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.", + "type": "string" + }, + "status": { + "description": "Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", + "type": "string" + } + }, + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "Status", + "version": "v1" + }, + { + "group": "resource.k8s.io", + "kind": "Status", + "version": "v1alpha2" + } + ] + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.StatusCause": { + "description": "StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.", + "properties": { + "field": { + "description": "The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"", + "type": "string" + }, + "message": { + "description": "A human-readable description of the cause of the error. This field may be presented as-is to a reader.", + "type": "string" + }, + "reason": { + "description": "A machine-readable description of the cause of the error. If this value is empty there is no information available.", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails": { + "description": "StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.", + "properties": { + "causes": { + "description": "The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.StatusCause" + } + ], + "default": {} + }, + "type": "array" + }, + "group": { + "description": "The group attribute of the resource associated with the status StatusReason.", + "type": "string" + }, + "kind": { + "description": "The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "description": "The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).", + "type": "string" + }, + "retryAfterSeconds": { + "description": "If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.", + "format": "int32", + "type": "integer" + }, + "uid": { + "description": "UID of the resource. (when there is a single resource which can be described). More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids", + "type": "string" + } + }, + "type": "object" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.Time": { + "description": "Time is a wrapper around time.Time which supports correct marshaling to YAML and JSON. Wrappers are provided for many of the factory methods that the time package offers.", + "format": "date-time", + "type": "string" + }, + "io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent": { + "description": "Event represents a single event to a watched resource.", + "properties": { + "object": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension" + } + ], + "description": "Object is:\n * If Type is Added or Modified: the new state of the object.\n * If Type is Deleted: the state of the object immediately before deletion.\n * If Type is Error: *Status is recommended; other types may make sense\n depending on context." + }, + "type": { + "default": "", + "type": "string" + } + }, + "required": [ + "type", + "object" + ], + "type": "object", + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "admission.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "admissionregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "apiextensions.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "apiregistration.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "apps", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "apps", + "kind": "WatchEvent", + "version": "v1beta2" + }, + { + "group": "authentication.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "authentication.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "authentication.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v2" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v2beta1" + }, + { + "group": "autoscaling", + "kind": "WatchEvent", + "version": "v2beta2" + }, + { + "group": "batch", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "batch", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "certificates.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "certificates.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "certificates.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "coordination.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "coordination.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "discovery.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "discovery.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "events.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "events.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "extensions", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1beta2" + }, + { + "group": "flowcontrol.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1beta3" + }, + { + "group": "imagepolicy.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "internal.apiserver.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "networking.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "networking.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "networking.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "node.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "node.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "node.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "policy", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "policy", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "rbac.authorization.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "resource.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha2" + }, + { + "group": "scheduling.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "scheduling.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "scheduling.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + }, + { + "group": "storage.k8s.io", + "kind": "WatchEvent", + "version": "v1" + }, + { + "group": "storage.k8s.io", + "kind": "WatchEvent", + "version": "v1alpha1" + }, + { + "group": "storage.k8s.io", + "kind": "WatchEvent", + "version": "v1beta1" + } + ] + }, + "io.k8s.apimachinery.pkg.runtime.RawExtension": { + "description": "RawExtension is used to hold extensions in external versions.\n\nTo use this, make a field which has RawExtension as its type in your external, versioned struct, and Object in your internal struct. You also need to register your various plugin types.\n\n// Internal package:\n\n\ttype MyAPIObject struct {\n\t\truntime.TypeMeta `json:\",inline\"`\n\t\tMyPlugin runtime.Object `json:\"myPlugin\"`\n\t}\n\n\ttype PluginA struct {\n\t\tAOption string `json:\"aOption\"`\n\t}\n\n// External package:\n\n\ttype MyAPIObject struct {\n\t\truntime.TypeMeta `json:\",inline\"`\n\t\tMyPlugin runtime.RawExtension `json:\"myPlugin\"`\n\t}\n\n\ttype PluginA struct {\n\t\tAOption string `json:\"aOption\"`\n\t}\n\n// On the wire, the JSON will look something like this:\n\n\t{\n\t\t\"kind\":\"MyAPIObject\",\n\t\t\"apiVersion\":\"v1\",\n\t\t\"myPlugin\": {\n\t\t\t\"kind\":\"PluginA\",\n\t\t\t\"aOption\":\"foo\",\n\t\t},\n\t}\n\nSo what happens? Decode first uses json or yaml to unmarshal the serialized data into your external MyAPIObject. That causes the raw JSON to be stored, but not unpacked. The next step is to copy (using pkg/conversion) into the internal struct. The runtime package's DefaultScheme has conversion functions installed which will unpack the JSON stored in RawExtension, turning it into the correct object type, and storing it in the Object. (TODO: In the case where the object is of an unknown type, a runtime.Unknown object will be created and stored.)", + "type": "object" + } + }, + "securitySchemes": { + "BearerToken": { + "description": "Bearer Token authentication", + "in": "header", + "name": "authorization", + "type": "apiKey" + } + } + }, + "info": { + "title": "Kubernetes", + "version": "unversioned" + }, + "openapi": "3.0.0", + "paths": { + "/apis/storage.k8s.io/v1alpha1/": { + "get": { + "description": "get available resources", + "operationId": "getStorageV1alpha1APIResources", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.APIResourceList" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ] + } + }, + "/apis/storage.k8s.io/v1alpha1/volumeattributesclasses": { + "delete": { + "description": "delete collection of VolumeAttributesClass", + "operationId": "deleteStorageV1alpha1CollectionVolumeAttributesClass", + "parameters": [ + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Status" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "deletecollection", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "get": { + "description": "list or watch objects of kind VolumeAttributesClass", + "operationId": "listStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClassList" + } + }, + "application/json;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClassList" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClassList" + } + }, + "application/vnd.kubernetes.protobuf;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClassList" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClassList" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "list", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "post": { + "description": "create a VolumeAttributesClass", + "operationId": "createStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "OK" + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "Created" + }, + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "Accepted" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "post", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + } + }, + "/apis/storage.k8s.io/v1alpha1/volumeattributesclasses/{name}": { + "delete": { + "description": "delete a VolumeAttributesClass", + "operationId": "deleteStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", + "in": "query", + "name": "gracePeriodSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "in": "query", + "name": "orphanDependents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "in": "query", + "name": "propagationPolicy", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "OK" + }, + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "Accepted" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "delete", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "get": { + "description": "read the specified VolumeAttributesClass", + "operationId": "readStorageV1alpha1VolumeAttributesClass", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "get", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "name of the VolumeAttributesClass", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "patch": { + "description": "partially update the specified VolumeAttributesClass", + "operationId": "patchStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch).", + "in": "query", + "name": "fieldManager", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "Force is going to \"force\" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests.", + "in": "query", + "name": "force", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "application/apply-patch+yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + "application/json-patch+json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + "application/merge-patch+json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + }, + "application/strategic-merge-patch+json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Patch" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "OK" + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "Created" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "patch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "put": { + "description": "replace the specified VolumeAttributesClass", + "operationId": "replaceStorageV1alpha1VolumeAttributesClass", + "parameters": [ + { + "description": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "in": "query", + "name": "dryRun", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint.", + "in": "query", + "name": "fieldManager", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered.", + "in": "query", + "name": "fieldValidation", + "schema": { + "type": "string", + "uniqueItems": true + } + } + ], + "requestBody": { + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "OK" + }, + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.api.storage.v1alpha1.VolumeAttributesClass" + } + } + }, + "description": "Created" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "put", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + } + }, + "/apis/storage.k8s.io/v1alpha1/watch/volumeattributesclasses": { + "get": { + "description": "watch individual changes to a list of VolumeAttributesClass. deprecated: use the 'watch' parameter with a list operation instead.", + "operationId": "watchStorageV1alpha1VolumeAttributesClassList", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/json;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "watchlist", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ] + }, + "/apis/storage.k8s.io/v1alpha1/watch/volumeattributesclasses/{name}": { + "get": { + "description": "watch changes to an object of kind VolumeAttributesClass. deprecated: use the 'watch' parameter with a list operation instead, filtered to a single item with the 'fieldSelector' parameter.", + "operationId": "watchStorageV1alpha1VolumeAttributesClass", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/json;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/vnd.kubernetes.protobuf;stream=watch": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.WatchEvent" + } + } + }, + "description": "OK" + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "storage_v1alpha1" + ], + "x-kubernetes-action": "watch", + "x-kubernetes-group-version-kind": { + "group": "storage.k8s.io", + "kind": "VolumeAttributesClass", + "version": "v1alpha1" + } + }, + "parameters": [ + { + "description": "allowWatchBookmarks requests watch events with type \"BOOKMARK\". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored.", + "in": "query", + "name": "allowWatchBookmarks", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "in": "query", + "name": "continue", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", + "in": "query", + "name": "fieldSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", + "in": "query", + "name": "labelSelector", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "name of the VolumeAttributesClass", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget).", + "in": "query", + "name": "pretty", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersion", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details.\n\nDefaults to unset", + "in": "query", + "name": "resourceVersionMatch", + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "description": "`sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic \"Bookmark\" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `\"k8s.io/initial-events-end\": \"true\"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched.\n\nWhen `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan\n is interpreted as \"data at least as new as the provided `resourceVersion`\"\n and the bookmark event is send when the state is synced\n to a `resourceVersion` at least as fresh as the one provided by the ListOptions.\n If `resourceVersion` is unset, this is interpreted as \"consistent read\" and the\n bookmark event is send when the state is synced at least to the moment\n when request started being processed.\n- `resourceVersionMatch` set to any other value or unset\n Invalid error is returned.\n\nDefaults to true if `resourceVersion=\"\"` or `resourceVersion=\"0\"` (for backward compatibility reasons) and to false otherwise.", + "in": "query", + "name": "sendInitialEvents", + "schema": { + "type": "boolean", + "uniqueItems": true + } + }, + { + "description": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", + "in": "query", + "name": "timeoutSeconds", + "schema": { + "type": "integer", + "uniqueItems": true + } + }, + { + "description": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", + "in": "query", + "name": "watch", + "schema": { + "type": "boolean", + "uniqueItems": true + } + } + ] + } + } +} diff --git a/pkg/api/persistentvolume/util.go b/pkg/api/persistentvolume/util.go index 1e34c995102..ef1f83481e6 100644 --- a/pkg/api/persistentvolume/util.go +++ b/pkg/api/persistentvolume/util.go @@ -39,6 +39,11 @@ func DropDisabledSpecFields(pvSpec *api.PersistentVolumeSpec, oldPVSpec *api.Per pvSpec.CSI.NodeExpandSecretRef = nil } } + if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) { + if oldPVSpec == nil || oldPVSpec.VolumeAttributesClassName == nil { + pvSpec.VolumeAttributesClassName = nil + } + } } // DropDisabledStatusFields removes disabled fields from the pv status. diff --git a/pkg/api/persistentvolume/util_test.go b/pkg/api/persistentvolume/util_test.go index e3f450282da..dec285103ab 100644 --- a/pkg/api/persistentvolume/util_test.go +++ b/pkg/api/persistentvolume/util_test.go @@ -28,6 +28,7 @@ import ( featuregatetesting "k8s.io/component-base/featuregate/testing" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/features" + "k8s.io/utils/ptr" ) func TestDropDisabledFields(t *testing.T) { @@ -35,6 +36,7 @@ func TestDropDisabledFields(t *testing.T) { Name: "expansion-secret", Namespace: "default", } + vacName := ptr.To("vac") tests := map[string]struct { oldSpec *api.PersistentVolumeSpec @@ -42,6 +44,7 @@ func TestDropDisabledFields(t *testing.T) { expectOldSpec *api.PersistentVolumeSpec expectNewSpec *api.PersistentVolumeSpec csiExpansionEnabled bool + vacEnabled bool }{ "disabled csi expansion clears secrets": { csiExpansionEnabled: false, @@ -85,11 +88,54 @@ func TestDropDisabledFields(t *testing.T) { oldSpec: specWithCSISecrets(nil), expectOldSpec: specWithCSISecrets(nil), }, + "disabled vac clears volume attributes class name": { + vacEnabled: false, + newSpec: specWithVACName(vacName), + expectNewSpec: specWithVACName(nil), + oldSpec: nil, + expectOldSpec: nil, + }, + "enabled vac preserve volume attributes class name": { + vacEnabled: true, + newSpec: specWithVACName(vacName), + expectNewSpec: specWithVACName(vacName), + oldSpec: nil, + expectOldSpec: nil, + }, + "enabled vac preserve volume attributes class name when both old and new have it": { + vacEnabled: true, + newSpec: specWithVACName(vacName), + expectNewSpec: specWithVACName(vacName), + oldSpec: specWithVACName(vacName), + expectOldSpec: specWithVACName(vacName), + }, + "disabled vac old pv had volume attributes class name": { + vacEnabled: false, + newSpec: specWithVACName(vacName), + expectNewSpec: specWithVACName(vacName), + oldSpec: specWithVACName(vacName), + expectOldSpec: specWithVACName(vacName), + }, + "enabled vac preserves volume attributes class name when old pv did not had it": { + vacEnabled: true, + newSpec: specWithVACName(vacName), + expectNewSpec: specWithVACName(vacName), + oldSpec: specWithVACName(nil), + expectOldSpec: specWithVACName(nil), + }, + "disabled vac neither new pv nor old pv had volume attributes class name": { + vacEnabled: false, + newSpec: specWithVACName(nil), + expectNewSpec: specWithVACName(nil), + oldSpec: specWithVACName(nil), + expectOldSpec: specWithVACName(nil), + }, } for name, tc := range tests { t.Run(name, func(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSINodeExpandSecret, tc.csiExpansionEnabled)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, tc.vacEnabled)() DropDisabledSpecFields(tc.newSpec, tc.oldSpec) if !reflect.DeepEqual(tc.newSpec, tc.expectNewSpec) { @@ -118,6 +164,22 @@ func specWithCSISecrets(secret *api.SecretReference) *api.PersistentVolumeSpec { return pvSpec } +func specWithVACName(vacName *string) *api.PersistentVolumeSpec { + pvSpec := &api.PersistentVolumeSpec{ + PersistentVolumeSource: api.PersistentVolumeSource{ + CSI: &api.CSIPersistentVolumeSource{ + Driver: "com.google.gcepd", + VolumeHandle: "foobar", + }, + }, + } + + if vacName != nil { + pvSpec.VolumeAttributesClassName = vacName + } + return pvSpec +} + func TestWarnings(t *testing.T) { testcases := []struct { name string diff --git a/pkg/api/persistentvolumeclaim/util.go b/pkg/api/persistentvolumeclaim/util.go index ee7f0f02957..ebfce578d99 100644 --- a/pkg/api/persistentvolumeclaim/util.go +++ b/pkg/api/persistentvolumeclaim/util.go @@ -35,6 +35,14 @@ const ( // DropDisabledFields removes disabled fields from the pvc spec. // This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pvc spec. func DropDisabledFields(pvcSpec, oldPVCSpec *core.PersistentVolumeClaimSpec) { + // Drop the contents of the volumeAttributesClassName if the VolumeAttributesClass + // feature gate is disabled. + if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) { + if oldPVCSpec == nil || oldPVCSpec.VolumeAttributesClassName == nil { + pvcSpec.VolumeAttributesClassName = nil + } + } + // Drop the contents of the dataSourceRef field if the AnyVolumeDataSource // feature gate is disabled. if !utilfeature.DefaultFeatureGate.Enabled(features.AnyVolumeDataSource) { @@ -91,6 +99,15 @@ func EnforceDataSourceBackwardsCompatibility(pvcSpec, oldPVCSpec *core.Persisten } func DropDisabledFieldsFromStatus(pvc, oldPVC *core.PersistentVolumeClaim) { + if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) { + if oldPVC == nil || oldPVC.Status.CurrentVolumeAttributesClassName == nil { + pvc.Status.CurrentVolumeAttributesClassName = nil + } + if oldPVC == nil || oldPVC.Status.ModifyVolumeStatus == nil { + pvc.Status.ModifyVolumeStatus = nil + } + } + if !utilfeature.DefaultFeatureGate.Enabled(features.RecoverVolumeExpansionFailure) { if !helper.ClaimContainsAllocatedResources(oldPVC) { pvc.Status.AllocatedResources = nil diff --git a/pkg/api/persistentvolumeclaim/util_test.go b/pkg/api/persistentvolumeclaim/util_test.go index 60574eb10d3..c0cbb23f3e5 100644 --- a/pkg/api/persistentvolumeclaim/util_test.go +++ b/pkg/api/persistentvolumeclaim/util_test.go @@ -23,11 +23,12 @@ import ( "github.com/google/go-cmp/cmp" "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/util/sets" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/sets" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" + "k8s.io/utils/ptr" + "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/features" ) @@ -384,82 +385,217 @@ func TestDataSourceRef(t *testing.T) { } } +func TestDropDisabledVolumeAttributesClass(t *testing.T) { + vacName := ptr.To("foo") + + var tests = map[string]struct { + spec core.PersistentVolumeClaimSpec + oldSpec core.PersistentVolumeClaimSpec + vacEnabled bool + wantVAC *string + }{ + "vac disabled with empty vac": { + spec: core.PersistentVolumeClaimSpec{}, + }, + "vac disabled with vac": { + spec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + }, + "vac enabled with empty vac": { + spec: core.PersistentVolumeClaimSpec{}, + vacEnabled: true, + }, + "vac enabled with vac": { + spec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + vacEnabled: true, + wantVAC: vacName, + }, + "vac disabled with vac when vac doesn't exists in oldSpec": { + spec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + oldSpec: core.PersistentVolumeClaimSpec{}, + }, + "vac disabled with vac when vac exists in oldSpec": { + spec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + oldSpec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + vacEnabled: false, + wantVAC: vacName, + }, + "vac enabled with vac when vac doesn't exists in oldSpec": { + spec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + oldSpec: core.PersistentVolumeClaimSpec{}, + vacEnabled: true, + wantVAC: vacName, + }, + "vac enable with vac when vac exists in oldSpec": { + spec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + oldSpec: core.PersistentVolumeClaimSpec{VolumeAttributesClassName: vacName}, + vacEnabled: true, + wantVAC: vacName, + }, + } + + for testName, test := range tests { + t.Run(testName, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, test.vacEnabled)() + DropDisabledFields(&test.spec, &test.oldSpec) + if test.spec.VolumeAttributesClassName != test.wantVAC { + t.Errorf("expected vac was not met, test: %s, vacEnabled: %v, spec: %+v, expected VAC: %+v", + testName, test.vacEnabled, test.spec, test.wantVAC) + } + }) + } +} + func TestDropDisabledFieldsFromStatus(t *testing.T) { tests := []struct { - name string - feature bool - pvc *core.PersistentVolumeClaim - oldPVC *core.PersistentVolumeClaim - expected *core.PersistentVolumeClaim + name string + enableRecoverVolumeExpansionFailure bool + enableVolumeAttributesClass bool + pvc *core.PersistentVolumeClaim + oldPVC *core.PersistentVolumeClaim + expected *core.PersistentVolumeClaim }{ { - name: "for:newPVC=hasAllocatedResource,oldPVC=doesnot,featuregate=false; should drop field", - feature: false, - pvc: withAllocatedResource("5G"), - oldPVC: getPVC(), - expected: getPVC(), + name: "for:newPVC=hasAllocatedResource,oldPVC=doesnot,featuregate=false; should drop field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withAllocatedResource("5G"), + oldPVC: getPVC(), + expected: getPVC(), }, { - name: "for:newPVC=hasAllocatedResource,oldPVC=doesnot,featuregate=true; should keep field", - feature: true, - pvc: withAllocatedResource("5G"), - oldPVC: getPVC(), - expected: withAllocatedResource("5G"), + name: "for:newPVC=hasAllocatedResource,oldPVC=doesnot,featuregate=RecoverVolumeExpansionFailure=true; should keep field", + enableRecoverVolumeExpansionFailure: true, + enableVolumeAttributesClass: false, + pvc: withAllocatedResource("5G"), + oldPVC: getPVC(), + expected: withAllocatedResource("5G"), }, { - name: "for:newPVC=hasAllocatedResource,oldPVC=hasAllocatedResource,featuregate=true; should keep field", - feature: true, - pvc: withAllocatedResource("5G"), - oldPVC: withAllocatedResource("5G"), - expected: withAllocatedResource("5G"), + name: "for:newPVC=hasAllocatedResource,oldPVC=hasAllocatedResource,featuregate=RecoverVolumeExpansionFailure=true; should keep field", + enableRecoverVolumeExpansionFailure: true, + enableVolumeAttributesClass: false, + pvc: withAllocatedResource("5G"), + oldPVC: withAllocatedResource("5G"), + expected: withAllocatedResource("5G"), }, { - name: "for:newPVC=hasAllocatedResource,oldPVC=hasAllocatedResource,featuregate=false; should keep field", - feature: false, - pvc: withAllocatedResource("10G"), - oldPVC: withAllocatedResource("5G"), - expected: withAllocatedResource("10G"), + name: "for:newPVC=hasAllocatedResource,oldPVC=hasAllocatedResource,featuregate=false; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withAllocatedResource("10G"), + oldPVC: withAllocatedResource("5G"), + expected: withAllocatedResource("10G"), }, { - name: "for:newPVC=hasAllocatedResource,oldPVC=nil,featuregate=false; should drop field", - feature: false, - pvc: withAllocatedResource("5G"), - oldPVC: nil, - expected: getPVC(), + name: "for:newPVC=hasAllocatedResource,oldPVC=nil,featuregate=false; should drop field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withAllocatedResource("5G"), + oldPVC: nil, + expected: getPVC(), }, { - name: "for:newPVC=hasResizeStatus,oldPVC=nil, featuregate=false should drop field", - feature: false, - pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), - oldPVC: nil, - expected: getPVC(), + name: "for:newPVC=hasResizeStatus,oldPVC=nil, featuregate=false should drop field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + oldPVC: nil, + expected: getPVC(), }, { - name: "for:newPVC=hasResizeStatus,oldPVC=doesnot,featuregate=true; should keep field", - feature: true, - pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), - oldPVC: getPVC(), - expected: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + name: "for:newPVC=hasResizeStatus,oldPVC=doesnot,featuregate=RecoverVolumeExpansionFailure=true; should keep field", + enableRecoverVolumeExpansionFailure: true, + enableVolumeAttributesClass: false, + pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + oldPVC: getPVC(), + expected: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), }, { - name: "for:newPVC=hasResizeStatus,oldPVC=hasResizeStatus,featuregate=true; should keep field", - feature: true, - pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), - oldPVC: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), - expected: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + name: "for:newPVC=hasResizeStatus,oldPVC=hasResizeStatus,featuregate=RecoverVolumeExpansionFailure=true; should keep field", + enableRecoverVolumeExpansionFailure: true, + enableVolumeAttributesClass: false, + pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + oldPVC: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + expected: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), }, { - name: "for:newPVC=hasResizeStatus,oldPVC=hasResizeStatus,featuregate=false; should keep field", - feature: false, - pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), - oldPVC: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), - expected: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + name: "for:newPVC=hasResizeStatus,oldPVC=hasResizeStatus,featuregate=false; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + oldPVC: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + expected: withResizeStatus(core.PersistentVolumeClaimNodeResizeFailed), + }, + { + name: "for:newPVC=hasVolumeAttributeClass,oldPVC=nil, featuregate=false should drop field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withVolumeAttributesClassName("foo"), + oldPVC: nil, + expected: getPVC(), + }, + { + name: "for:newPVC=hasVolumeAttributeClass,oldPVC=doesnot,featuregate=VolumeAttributesClass=true; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: true, + pvc: withVolumeAttributesClassName("foo"), + oldPVC: getPVC(), + expected: withVolumeAttributesClassName("foo"), + }, + { + name: "for:newPVC=hasVolumeAttributeClass,oldPVC=hasVolumeAttributeClass,featuregate=VolumeAttributesClass=true; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: true, + pvc: withVolumeAttributesClassName("foo"), + oldPVC: withVolumeAttributesClassName("foo"), + expected: withVolumeAttributesClassName("foo"), + }, + { + name: "for:newPVC=hasVolumeAttributeClass,oldPVC=hasVolumeAttributeClass,featuregate=false; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withVolumeAttributesClassName("foo"), + oldPVC: withVolumeAttributesClassName("foo"), + expected: withVolumeAttributesClassName("foo"), + }, + { + name: "for:newPVC=hasVolumeAttributesModifyStatus,oldPVC=nil, featuregate=false should drop field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + oldPVC: nil, + expected: getPVC(), + }, + { + name: "for:newPVC=hasVolumeAttributesModifyStatus,oldPVC=doesnot,featuregate=VolumeAttributesClass=true; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: true, + pvc: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + oldPVC: getPVC(), + expected: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + }, + { + name: "for:newPVC=hasVolumeAttributesModifyStatus,oldPVC=hasVolumeAttributesModifyStatus,featuregate=VolumeAttributesClass=true; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: true, + pvc: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + oldPVC: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + expected: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + }, + { + name: "for:newPVC=hasVolumeAttributesModifyStatus,oldPVC=hasVolumeAttributesModifyStatus,featuregate=false; should keep field", + enableRecoverVolumeExpansionFailure: false, + enableVolumeAttributesClass: false, + pvc: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + oldPVC: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), + expected: withVolumeAttributesModifyStatus("bar", core.PersistentVolumeClaimModifyVolumePending), }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RecoverVolumeExpansionFailure, test.feature)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RecoverVolumeExpansionFailure, test.enableRecoverVolumeExpansionFailure)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, test.enableVolumeAttributesClass)() DropDisabledFieldsFromStatus(test.pvc, test.oldPVC) @@ -494,6 +630,25 @@ func withResizeStatus(status core.ClaimResourceStatus) *core.PersistentVolumeCla } } +func withVolumeAttributesClassName(vacName string) *core.PersistentVolumeClaim { + return &core.PersistentVolumeClaim{ + Status: core.PersistentVolumeClaimStatus{ + CurrentVolumeAttributesClassName: &vacName, + }, + } +} + +func withVolumeAttributesModifyStatus(target string, status core.PersistentVolumeClaimModifyVolumeStatus) *core.PersistentVolumeClaim { + return &core.PersistentVolumeClaim{ + Status: core.PersistentVolumeClaimStatus{ + ModifyVolumeStatus: &core.ModifyVolumeStatus{ + TargetVolumeAttributesClassName: target, + Status: status, + }, + }, + } +} + func TestWarnings(t *testing.T) { testcases := []struct { name string diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index 10df2c82bfc..3e74fe31d32 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -335,6 +335,16 @@ type PersistentVolumeSpec struct { // This field influences the scheduling of pods that use this volume. // +optional NodeAffinity *VolumeNodeAffinity + // Name of VolumeAttributesClass to which this persistent volume belongs. Empty value + // is not allowed. When this field is not set, it indicates that this volume does not belong to any + // VolumeAttributesClass. This field is mutable and can be changed by the CSI driver + // after a volume has been updated successfully to a new class. + // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound + // PersistentVolumeClaims during the binding process. + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + VolumeAttributesClassName *string } // VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from. @@ -488,6 +498,21 @@ type PersistentVolumeClaimSpec struct { // (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. // +optional DataSourceRef *TypedObjectReference + // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. + // If specified, the CSI driver will create or update the volume with the attributes defined + // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, + // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass + // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. + // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass + // will be set by the persistentvolume controller if it exists. + // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be + // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource + // exists. + // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass + // (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled. + // +featureGate=VolumeAttributesClass + // +optional + VolumeAttributesClassName *string } type TypedObjectReference struct { @@ -518,6 +543,11 @@ const ( PersistentVolumeClaimResizing PersistentVolumeClaimConditionType = "Resizing" // PersistentVolumeClaimFileSystemResizePending - controller resize is finished and a file system resize is pending on node PersistentVolumeClaimFileSystemResizePending PersistentVolumeClaimConditionType = "FileSystemResizePending" + + // Applying the target VolumeAttributesClass encountered an error + PersistentVolumeClaimVolumeModifyVolumeError PersistentVolumeClaimConditionType = "ModifyVolumeError" + // Volume is being modified + PersistentVolumeClaimVolumeModifyingVolume PersistentVolumeClaimConditionType = "ModifyingVolume" ) // +enum @@ -544,6 +574,38 @@ const ( PersistentVolumeClaimNodeResizeFailed ClaimResourceStatus = "NodeResizeFailed" ) +// +enum +// New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately +type PersistentVolumeClaimModifyVolumeStatus string + +const ( + // Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as + // the specified VolumeAttributesClass not existing + PersistentVolumeClaimModifyVolumePending PersistentVolumeClaimModifyVolumeStatus = "Pending" + // InProgress indicates that the volume is being modified + PersistentVolumeClaimModifyVolumeInProgress PersistentVolumeClaimModifyVolumeStatus = "InProgress" + // Infeasible indicates that the request has been rejected as invalid by the CSI driver. To + // resolve the error, a valid VolumeAttributesClass needs to be specified + PersistentVolumeClaimModifyVolumeInfeasible PersistentVolumeClaimModifyVolumeStatus = "Infeasible" +) + +// ModifyVolumeStatus represents the status object of ControllerModifyVolume operation +type ModifyVolumeStatus struct { + // targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled + TargetVolumeAttributesClassName string + // status is the status of the ControllerModifyVolume operation. It can be in any of following states: + // - Pending + // Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as + // the specified VolumeAttributesClass not existing. + // - InProgress + // InProgress indicates that the volume is being modified. + // - Infeasible + // Infeasible indicates that the request has been rejected as invalid by the CSI driver. To + // resolve the error, a valid VolumeAttributesClass needs to be specified. + // Note: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately. + Status PersistentVolumeClaimModifyVolumeStatus +} + // PersistentVolumeClaimCondition represents the current condition of PV claim type PersistentVolumeClaimCondition struct { Type PersistentVolumeClaimConditionType @@ -635,6 +697,18 @@ type PersistentVolumeClaimStatus struct { // +mapType=granular // +optional AllocatedResourceStatuses map[ResourceName]ClaimResourceStatus + // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. + // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + CurrentVolumeAttributesClassName *string + // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. + // When this is unset, there is no ModifyVolume operation being attempted. + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + ModifyVolumeStatus *ModifyVolumeStatus } // PersistentVolumeAccessMode defines various access modes for PV. diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index f5eeabb4e67..053a82f4d04 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -882,6 +882,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1.ModifyVolumeStatus)(nil), (*core.ModifyVolumeStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ModifyVolumeStatus_To_core_ModifyVolumeStatus(a.(*v1.ModifyVolumeStatus), b.(*core.ModifyVolumeStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ModifyVolumeStatus)(nil), (*v1.ModifyVolumeStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ModifyVolumeStatus_To_v1_ModifyVolumeStatus(a.(*core.ModifyVolumeStatus), b.(*v1.ModifyVolumeStatus), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1.NFSVolumeSource)(nil), (*core.NFSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1_NFSVolumeSource_To_core_NFSVolumeSource(a.(*v1.NFSVolumeSource), b.(*core.NFSVolumeSource), scope) }); err != nil { @@ -4575,6 +4585,28 @@ func Convert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in *core.LocalVolume return autoConvert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in, out, s) } +func autoConvert_v1_ModifyVolumeStatus_To_core_ModifyVolumeStatus(in *v1.ModifyVolumeStatus, out *core.ModifyVolumeStatus, s conversion.Scope) error { + out.TargetVolumeAttributesClassName = in.TargetVolumeAttributesClassName + out.Status = core.PersistentVolumeClaimModifyVolumeStatus(in.Status) + return nil +} + +// Convert_v1_ModifyVolumeStatus_To_core_ModifyVolumeStatus is an autogenerated conversion function. +func Convert_v1_ModifyVolumeStatus_To_core_ModifyVolumeStatus(in *v1.ModifyVolumeStatus, out *core.ModifyVolumeStatus, s conversion.Scope) error { + return autoConvert_v1_ModifyVolumeStatus_To_core_ModifyVolumeStatus(in, out, s) +} + +func autoConvert_core_ModifyVolumeStatus_To_v1_ModifyVolumeStatus(in *core.ModifyVolumeStatus, out *v1.ModifyVolumeStatus, s conversion.Scope) error { + out.TargetVolumeAttributesClassName = in.TargetVolumeAttributesClassName + out.Status = v1.PersistentVolumeClaimModifyVolumeStatus(in.Status) + return nil +} + +// Convert_core_ModifyVolumeStatus_To_v1_ModifyVolumeStatus is an autogenerated conversion function. +func Convert_core_ModifyVolumeStatus_To_v1_ModifyVolumeStatus(in *core.ModifyVolumeStatus, out *v1.ModifyVolumeStatus, s conversion.Scope) error { + return autoConvert_core_ModifyVolumeStatus_To_v1_ModifyVolumeStatus(in, out, s) +} + func autoConvert_v1_NFSVolumeSource_To_core_NFSVolumeSource(in *v1.NFSVolumeSource, out *core.NFSVolumeSource, s conversion.Scope) error { out.Server = in.Server out.Path = in.Path @@ -5353,6 +5385,7 @@ func autoConvert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec( out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) out.DataSource = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.DataSource)) out.DataSourceRef = (*core.TypedObjectReference)(unsafe.Pointer(in.DataSourceRef)) + out.VolumeAttributesClassName = (*string)(unsafe.Pointer(in.VolumeAttributesClassName)) return nil } @@ -5372,6 +5405,7 @@ func autoConvert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec( out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) out.DataSource = (*v1.TypedLocalObjectReference)(unsafe.Pointer(in.DataSource)) out.DataSourceRef = (*v1.TypedObjectReference)(unsafe.Pointer(in.DataSourceRef)) + out.VolumeAttributesClassName = (*string)(unsafe.Pointer(in.VolumeAttributesClassName)) return nil } @@ -5387,6 +5421,8 @@ func autoConvert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimSta out.Conditions = *(*[]core.PersistentVolumeClaimCondition)(unsafe.Pointer(&in.Conditions)) out.AllocatedResources = *(*core.ResourceList)(unsafe.Pointer(&in.AllocatedResources)) out.AllocatedResourceStatuses = *(*map[core.ResourceName]core.ClaimResourceStatus)(unsafe.Pointer(&in.AllocatedResourceStatuses)) + out.CurrentVolumeAttributesClassName = (*string)(unsafe.Pointer(in.CurrentVolumeAttributesClassName)) + out.ModifyVolumeStatus = (*core.ModifyVolumeStatus)(unsafe.Pointer(in.ModifyVolumeStatus)) return nil } @@ -5402,6 +5438,8 @@ func autoConvert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimSta out.Conditions = *(*[]v1.PersistentVolumeClaimCondition)(unsafe.Pointer(&in.Conditions)) out.AllocatedResources = *(*v1.ResourceList)(unsafe.Pointer(&in.AllocatedResources)) out.AllocatedResourceStatuses = *(*map[v1.ResourceName]v1.ClaimResourceStatus)(unsafe.Pointer(&in.AllocatedResourceStatuses)) + out.CurrentVolumeAttributesClassName = (*string)(unsafe.Pointer(in.CurrentVolumeAttributesClassName)) + out.ModifyVolumeStatus = (*v1.ModifyVolumeStatus)(unsafe.Pointer(in.ModifyVolumeStatus)) return nil } @@ -5574,6 +5612,7 @@ func autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.Per out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) out.NodeAffinity = (*core.VolumeNodeAffinity)(unsafe.Pointer(in.NodeAffinity)) + out.VolumeAttributesClassName = (*string)(unsafe.Pointer(in.VolumeAttributesClassName)) return nil } @@ -5589,6 +5628,7 @@ func autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.P out.MountOptions = *(*[]string)(unsafe.Pointer(&in.MountOptions)) out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) out.NodeAffinity = (*v1.VolumeNodeAffinity)(unsafe.Pointer(in.NodeAffinity)) + out.VolumeAttributesClassName = (*string)(unsafe.Pointer(in.VolumeAttributesClassName)) return nil } diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 2ba64b8230a..30749fc3dc3 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -1665,6 +1665,8 @@ var allowedTemplateObjectMetaFields = map[string]bool{ // PersistentVolumeSpecValidationOptions contains the different settings for PeristentVolume validation type PersistentVolumeSpecValidationOptions struct { + // Allow users to modify the class of volume attributes + EnableVolumeAttributesClass bool } // ValidatePersistentVolumeName checks that a name is appropriate for a @@ -1685,7 +1687,13 @@ var supportedReclaimPolicy = sets.New( var supportedVolumeModes = sets.New(core.PersistentVolumeBlock, core.PersistentVolumeFilesystem) func ValidationOptionsForPersistentVolume(pv, oldPv *core.PersistentVolume) PersistentVolumeSpecValidationOptions { - return PersistentVolumeSpecValidationOptions{} + opts := PersistentVolumeSpecValidationOptions{ + EnableVolumeAttributesClass: utilfeature.DefaultMutableFeatureGate.Enabled(features.VolumeAttributesClass), + } + if oldPv != nil && oldPv.Spec.VolumeAttributesClassName != nil { + opts.EnableVolumeAttributesClass = true + } + return opts } func ValidatePersistentVolumeSpec(pvSpec *core.PersistentVolumeSpec, pvName string, validateInlinePersistentVolumeSpec bool, fldPath *field.Path, opts PersistentVolumeSpecValidationOptions) field.ErrorList { @@ -1970,6 +1978,18 @@ func ValidatePersistentVolumeSpec(pvSpec *core.PersistentVolumeSpec, pvName stri } } } + if pvSpec.VolumeAttributesClassName != nil && opts.EnableVolumeAttributesClass { + if len(*pvSpec.VolumeAttributesClassName) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("volumeAttributesClassName"), "an empty string is disallowed")) + } else { + for _, msg := range ValidateClassName(*pvSpec.VolumeAttributesClassName, false) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("volumeAttributesClassName"), *pvSpec.VolumeAttributesClassName, msg)) + } + } + if pvSpec.CSI == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("csi"), "has to be specified when using volumeAttributesClassName")) + } + } return allErrs } @@ -2004,6 +2024,17 @@ func ValidatePersistentVolumeUpdate(newPv, oldPv *core.PersistentVolume, opts Pe allErrs = append(allErrs, validatePvNodeAffinity(newPv.Spec.NodeAffinity, oldPv.Spec.NodeAffinity, field.NewPath("nodeAffinity"))...) } + if !apiequality.Semantic.DeepEqual(oldPv.Spec.VolumeAttributesClassName, newPv.Spec.VolumeAttributesClassName) { + if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeAttributesClassName"), "update is forbidden when the VolumeAttributesClass feature gate is disabled")) + } + if opts.EnableVolumeAttributesClass { + if oldPv.Spec.VolumeAttributesClassName != nil && newPv.Spec.VolumeAttributesClassName == nil { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeAttributesClassName"), "update from non-nil value to nil is forbidden")) + } + } + } + return allErrs } @@ -2023,12 +2054,15 @@ type PersistentVolumeClaimSpecValidationOptions struct { AllowInvalidLabelValueInSelector bool // Allow to validate the API group of the data source and data source reference AllowInvalidAPIGroupInDataSourceOrRef bool + // Allow users to modify the class of volume attributes + EnableVolumeAttributesClass bool } func ValidationOptionsForPersistentVolumeClaim(pvc, oldPvc *core.PersistentVolumeClaim) PersistentVolumeClaimSpecValidationOptions { opts := PersistentVolumeClaimSpecValidationOptions{ EnableRecoverFromExpansionFailure: utilfeature.DefaultFeatureGate.Enabled(features.RecoverVolumeExpansionFailure), AllowInvalidLabelValueInSelector: false, + EnableVolumeAttributesClass: utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass), } if oldPvc == nil { // If there's no old PVC, use the options based solely on feature enablement @@ -2038,6 +2072,11 @@ func ValidationOptionsForPersistentVolumeClaim(pvc, oldPvc *core.PersistentVolum // If the old object had an invalid API group in the data source or data source reference, continue to allow it in the new object opts.AllowInvalidAPIGroupInDataSourceOrRef = allowInvalidAPIGroupInDataSourceOrRef(&oldPvc.Spec) + if oldPvc.Spec.VolumeAttributesClassName != nil { + // If the old object had a volume attributes class, continue to validate it in the new object. + opts.EnableVolumeAttributesClass = true + } + labelSelectorValidationOpts := unversionedvalidation.LabelSelectorValidationOptions{ AllowInvalidLabelValueInSelector: opts.AllowInvalidLabelValueInSelector, } @@ -2056,6 +2095,7 @@ func ValidationOptionsForPersistentVolumeClaim(pvc, oldPvc *core.PersistentVolum func ValidationOptionsForPersistentVolumeClaimTemplate(claimTemplate, oldClaimTemplate *core.PersistentVolumeClaimTemplate) PersistentVolumeClaimSpecValidationOptions { opts := PersistentVolumeClaimSpecValidationOptions{ AllowInvalidLabelValueInSelector: false, + EnableVolumeAttributesClass: utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass), } if oldClaimTemplate == nil { // If there's no old PVC template, use the options based solely on feature enablement @@ -2211,6 +2251,11 @@ func ValidatePersistentVolumeClaimSpec(spec *core.PersistentVolumeClaimSpec, fld "must match dataSourceRef")) } } + if spec.VolumeAttributesClassName != nil && len(*spec.VolumeAttributesClassName) > 0 && opts.EnableVolumeAttributesClass { + for _, msg := range ValidateClassName(*spec.VolumeAttributesClassName, false) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("volumeAttributesClassName"), *spec.VolumeAttributesClassName, msg)) + } + } return allErrs } @@ -2254,6 +2299,8 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl if newPvc.Status.Phase == core.ClaimBound && newPvcClone.Spec.Resources.Requests != nil { newPvcClone.Spec.Resources.Requests["storage"] = oldPvc.Spec.Resources.Requests["storage"] // +k8s:verify-mutation:reason=clone } + // lets make sure volume attributes class name is same. + newPvcClone.Spec.VolumeAttributesClassName = oldPvcClone.Spec.VolumeAttributesClassName // +k8s:verify-mutation:reason=clone oldSize := oldPvc.Spec.Resources.Requests["storage"] newSize := newPvc.Spec.Resources.Requests["storage"] @@ -2261,7 +2308,7 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl if !apiequality.Semantic.DeepEqual(newPvcClone.Spec, oldPvcClone.Spec) { specDiff := cmp.Diff(oldPvcClone.Spec, newPvcClone.Spec) - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), fmt.Sprintf("spec is immutable after creation except resources.requests for bound claims\n%v", specDiff))) + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), fmt.Sprintf("spec is immutable after creation except resources.requests and volumeAttributesClassName for bound claims\n%v", specDiff))) } if newSize.Cmp(oldSize) < 0 { if !opts.EnableRecoverFromExpansionFailure { @@ -2278,6 +2325,21 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *core.PersistentVolumeCl allErrs = append(allErrs, ValidateImmutableField(newPvc.Spec.VolumeMode, oldPvc.Spec.VolumeMode, field.NewPath("volumeMode"))...) + if !apiequality.Semantic.DeepEqual(oldPvc.Spec.VolumeAttributesClassName, newPvc.Spec.VolumeAttributesClassName) { + if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeAttributesClassName"), "update is forbidden when the VolumeAttributesClass feature gate is disabled")) + } + if opts.EnableVolumeAttributesClass { + if oldPvc.Spec.VolumeAttributesClassName != nil { + if newPvc.Spec.VolumeAttributesClassName == nil { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeAttributesClassName"), "update from non-nil value to nil is forbidden")) + } else if len(*newPvc.Spec.VolumeAttributesClassName) == 0 { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeAttributesClassName"), "update from non-nil value to an empty string is forbidden")) + } + } + } + } + return allErrs } diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index f9fc352638c..f8dff44fb52 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -46,6 +46,7 @@ import ( "k8s.io/kubernetes/pkg/capabilities" "k8s.io/kubernetes/pkg/features" utilpointer "k8s.io/utils/pointer" + "k8s.io/utils/ptr" ) const ( @@ -109,8 +110,9 @@ func TestValidatePersistentVolumes(t *testing.T) { validMode := core.PersistentVolumeFilesystem invalidMode := core.PersistentVolumeMode("fakeVolumeMode") scenarios := map[string]struct { - isExpectedFailure bool - volume *core.PersistentVolume + isExpectedFailure bool + enableVolumeAttributesClass bool + volume *core.PersistentVolume }{ "good-volume": { isExpectedFailure: false, @@ -478,10 +480,84 @@ func TestValidatePersistentVolumes(t *testing.T) { }, }), }, + "invalid-volume-attributes-class-name": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + volume: testVolume("invalid-volume-attributes-class-name", "", core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(core.HostPathDirectory)), + }, + }, + StorageClassName: "invalid", + VolumeAttributesClassName: ptr.To("-invalid-"), + }), + }, + "invalid-empty-volume-attributes-class-name": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + volume: testVolume("invalid-empty-volume-attributes-class-name", "", core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(core.HostPathDirectory)), + }, + }, + StorageClassName: "invalid", + VolumeAttributesClassName: ptr.To(""), + }), + }, + "volume-with-good-volume-attributes-class-and-matched-volume-resource-when-feature-gate-is-on": { + isExpectedFailure: false, + enableVolumeAttributesClass: true, + volume: testVolume("foo", "", core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + CSI: &core.CSIPersistentVolumeSource{ + Driver: "test-driver", + VolumeHandle: "test-123", + }, + }, + StorageClassName: "valid", + VolumeAttributesClassName: ptr.To("valid"), + }), + }, + "volume-with-good-volume-attributes-class-and-mismatched-volume-resource-when-feature-gate-is-on": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + volume: testVolume("foo", "", core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: "/foo", + Type: newHostPathType(string(core.HostPathDirectory)), + }, + }, + StorageClassName: "valid", + VolumeAttributesClassName: ptr.To("valid"), + }), + }, } for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, scenario.enableVolumeAttributesClass)() + opts := ValidationOptionsForPersistentVolume(scenario.volume, nil) errs := ValidatePersistentVolume(scenario.volume, opts) if len(errs) == 0 && scenario.isExpectedFailure { @@ -882,17 +958,48 @@ func TestValidatePersistentVolumeSourceUpdate(t *testing.T) { func TestValidationOptionsForPersistentVolume(t *testing.T) { tests := map[string]struct { - oldPv *core.PersistentVolume - expectValidationOpts PersistentVolumeSpecValidationOptions + oldPv *core.PersistentVolume + enableVolumeAttributesClass bool + expectValidationOpts PersistentVolumeSpecValidationOptions }{ "nil old pv": { oldPv: nil, expectValidationOpts: PersistentVolumeSpecValidationOptions{}, }, + "nil old pv and feature-gate VolumeAttrributesClass is on": { + oldPv: nil, + enableVolumeAttributesClass: true, + expectValidationOpts: PersistentVolumeSpecValidationOptions{EnableVolumeAttributesClass: true}, + }, + "nil old pv and feature-gate VolumeAttrributesClass is off": { + oldPv: nil, + enableVolumeAttributesClass: false, + expectValidationOpts: PersistentVolumeSpecValidationOptions{EnableVolumeAttributesClass: false}, + }, + "old pv has volumeAttributesClass and feature-gate VolumeAttrributesClass is on": { + oldPv: &core.PersistentVolume{ + Spec: core.PersistentVolumeSpec{ + VolumeAttributesClassName: ptr.To("foo"), + }, + }, + enableVolumeAttributesClass: true, + expectValidationOpts: PersistentVolumeSpecValidationOptions{EnableVolumeAttributesClass: true}, + }, + "old pv has volumeAttributesClass and feature-gate VolumeAttrributesClass is off": { + oldPv: &core.PersistentVolume{ + Spec: core.PersistentVolumeSpec{ + VolumeAttributesClassName: ptr.To("foo"), + }, + }, + enableVolumeAttributesClass: false, + expectValidationOpts: PersistentVolumeSpecValidationOptions{EnableVolumeAttributesClass: true}, + }, } for name, tc := range tests { t.Run(name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, tc.enableVolumeAttributesClass)() + opts := ValidationOptionsForPersistentVolume(nil, tc.oldPv) if opts != tc.expectValidationOpts { t.Errorf("Expected opts: %+v, received: %+v", opts, tc.expectValidationOpts) @@ -919,6 +1026,14 @@ func getCSIVolumeWithSecret(pv *core.PersistentVolume, secret *core.SecretRefere return pvCopy } +func pvcWithVolumeAttributesClassName(vacName *string) *core.PersistentVolumeClaim { + return &core.PersistentVolumeClaim{ + Spec: core.PersistentVolumeClaimSpec{ + VolumeAttributesClassName: vacName, + }, + } +} + func pvcWithDataSource(dataSource *core.TypedLocalObjectReference) *core.PersistentVolumeClaim { return &core.PersistentVolumeClaim{ Spec: core.PersistentVolumeClaimSpec{ @@ -934,6 +1049,14 @@ func pvcWithDataSourceRef(ref *core.TypedObjectReference) *core.PersistentVolume } } +func pvcTemplateWithVolumeAttributesClassName(vacName *string) *core.PersistentVolumeClaimTemplate { + return &core.PersistentVolumeClaimTemplate{ + Spec: core.PersistentVolumeClaimSpec{ + VolumeAttributesClassName: vacName, + }, + } +} + func testLocalVolume(path string, affinity *core.VolumeNodeAffinity) core.PersistentVolumeSpec { return core.PersistentVolumeSpec{ Capacity: core.ResourceList{ @@ -1001,6 +1124,24 @@ func TestValidateLocalVolumes(t *testing.T) { } } +func testVolumeWithVolumeAttributesClass(vacName *string) *core.PersistentVolume { + return testVolume("test-volume-with-volume-attributes-class", "", + core.PersistentVolumeSpec{ + Capacity: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + PersistentVolumeSource: core.PersistentVolumeSource{ + CSI: &core.CSIPersistentVolumeSource{ + Driver: "test-driver", + VolumeHandle: "test-123", + }, + }, + StorageClassName: "test-storage-class", + VolumeAttributesClassName: vacName, + }) +} + func testVolumeWithNodeAffinity(affinity *core.VolumeNodeAffinity) *core.PersistentVolume { return testVolume("test-affinity-volume", "", core.PersistentVolumeSpec{ @@ -1341,6 +1482,115 @@ func TestValidateVolumeNodeAffinityUpdate(t *testing.T) { } } +func TestValidatePeristentVolumeAttributesClassUpdate(t *testing.T) { + scenarios := map[string]struct { + isExpectedFailure bool + enableVolumeAttributesClass bool + oldPV *core.PersistentVolume + newPV *core.PersistentVolume + }{ + "nil-nothing-changed": { + isExpectedFailure: false, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(nil), + newPV: testVolumeWithVolumeAttributesClass(nil), + }, + "vac-nothing-changed": { + isExpectedFailure: false, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + }, + "vac-changed": { + isExpectedFailure: false, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("bar")), + }, + "nil-to-string": { + isExpectedFailure: false, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(nil), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + }, + "nil-to-empty-string": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(nil), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("")), + }, + "string-to-nil": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(nil), + }, + "string-to-empty-string": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("")), + }, + "vac-nothing-changed-when-feature-gate-is-off": { + isExpectedFailure: false, + enableVolumeAttributesClass: false, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + }, + "vac-changed-when-feature-gate-is-off": { + isExpectedFailure: true, + enableVolumeAttributesClass: false, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("bar")), + }, + "nil-to-string-when-feature-gate-is-off": { + isExpectedFailure: true, + enableVolumeAttributesClass: false, + oldPV: testVolumeWithVolumeAttributesClass(nil), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + }, + "nil-to-empty-string-when-feature-gate-is-off": { + isExpectedFailure: true, + enableVolumeAttributesClass: false, + oldPV: testVolumeWithVolumeAttributesClass(nil), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("")), + }, + "string-to-nil-when-feature-gate-is-off": { + isExpectedFailure: true, + enableVolumeAttributesClass: false, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(nil), + }, + "string-to-empty-string-when-feature-gate-is-off": { + isExpectedFailure: true, + enableVolumeAttributesClass: false, + oldPV: testVolumeWithVolumeAttributesClass(ptr.To("foo")), + newPV: testVolumeWithVolumeAttributesClass(ptr.To("")), + }, + } + + for name, scenario := range scenarios { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, scenario.enableVolumeAttributesClass)() + + originalNewPV := scenario.newPV.DeepCopy() + originalOldPV := scenario.oldPV.DeepCopy() + opts := ValidationOptionsForPersistentVolume(scenario.newPV, scenario.oldPV) + errs := ValidatePersistentVolumeUpdate(scenario.newPV, scenario.oldPV, opts) + if len(errs) == 0 && scenario.isExpectedFailure { + t.Errorf("Unexpected success for scenario: %s", name) + } + if len(errs) > 0 && !scenario.isExpectedFailure { + t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) + } + if diff := cmp.Diff(originalNewPV, scenario.newPV); len(diff) > 0 { + t.Errorf("newPV was modified: %s", diff) + } + if diff := cmp.Diff(originalOldPV, scenario.oldPV); len(diff) > 0 { + t.Errorf("oldPV was modified: %s", diff) + } + } +} + func testVolumeClaim(name string, namespace string, spec core.PersistentVolumeClaimSpec) *core.PersistentVolumeClaim { return &core.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, @@ -1516,8 +1766,9 @@ func testValidatePVC(t *testing.T, ephemeral bool) { ten := int64(10) scenarios := map[string]struct { - isExpectedFailure bool - claim *core.PersistentVolumeClaim + isExpectedFailure bool + enableVolumeAttributesClass bool + claim *core.PersistentVolumeClaim }{ "good-claim": { isExpectedFailure: false, @@ -1894,10 +2145,34 @@ func testValidatePVC(t *testing.T, ephemeral bool) { }, }), }, + "invalid-volume-attributes-class-name": { + isExpectedFailure: true, + enableVolumeAttributesClass: true, + claim: testVolumeClaim(goodName, goodNS, core.PersistentVolumeClaimSpec{ + Selector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "key2", + Operator: "Exists", + }}, + }, + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + core.ReadOnlyMany, + }, + Resources: core.VolumeResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + VolumeAttributesClassName: &invalidClassName, + }), + }, } for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, scenario.enableVolumeAttributesClass)() + var errs field.ErrorList if ephemeral { volumes := []core.Volume{{ @@ -2422,11 +2697,68 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { }, }) + validClaimNilVolumeAttributesClass := testVolumeClaimWithStatus("foo", "ns", core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + core.ReadOnlyMany, + }, + Resources: core.VolumeResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + }, core.PersistentVolumeClaimStatus{ + Phase: core.ClaimBound, + }) + validClaimEmptyVolumeAttributesClass := testVolumeClaimWithStatus("foo", "ns", core.PersistentVolumeClaimSpec{ + VolumeAttributesClassName: utilpointer.String(""), + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + core.ReadOnlyMany, + }, + Resources: core.VolumeResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + }, core.PersistentVolumeClaimStatus{ + Phase: core.ClaimBound, + }) + validClaimVolumeAttributesClass1 := testVolumeClaimWithStatus("foo", "ns", core.PersistentVolumeClaimSpec{ + VolumeAttributesClassName: utilpointer.String("vac1"), + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + core.ReadOnlyMany, + }, + Resources: core.VolumeResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + }, core.PersistentVolumeClaimStatus{ + Phase: core.ClaimBound, + }) + validClaimVolumeAttributesClass2 := testVolumeClaimWithStatus("foo", "ns", core.PersistentVolumeClaimSpec{ + VolumeAttributesClassName: utilpointer.String("vac2"), + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadWriteOnce, + core.ReadOnlyMany, + }, + Resources: core.VolumeResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + }, core.PersistentVolumeClaimStatus{ + Phase: core.ClaimBound, + }) + scenarios := map[string]struct { - isExpectedFailure bool - oldClaim *core.PersistentVolumeClaim - newClaim *core.PersistentVolumeClaim - enableRecoverFromExpansion bool + isExpectedFailure bool + oldClaim *core.PersistentVolumeClaim + newClaim *core.PersistentVolumeClaim + enableRecoverFromExpansion bool + enableVolumeAttributesClass bool }{ "valid-update-volumeName-only": { isExpectedFailure: false, @@ -2636,11 +2968,61 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { newClaim: invalidClaimDataSourceRefAPIGroup, isExpectedFailure: false, }, + "valid-update-volume-attributes-class-from-nil": { + oldClaim: validClaimNilVolumeAttributesClass, + newClaim: validClaimVolumeAttributesClass1, + enableVolumeAttributesClass: true, + isExpectedFailure: false, + }, + "valid-update-volume-attributes-class-from-empty": { + oldClaim: validClaimEmptyVolumeAttributesClass, + newClaim: validClaimVolumeAttributesClass1, + enableVolumeAttributesClass: true, + isExpectedFailure: false, + }, + "valid-update-volume-attributes-class": { + oldClaim: validClaimVolumeAttributesClass1, + newClaim: validClaimVolumeAttributesClass2, + enableVolumeAttributesClass: true, + isExpectedFailure: false, + }, + "invalid-update-volume-attributes-class": { + oldClaim: validClaimVolumeAttributesClass1, + newClaim: validClaimNilVolumeAttributesClass, + enableVolumeAttributesClass: true, + isExpectedFailure: true, + }, + "invalid-update-volume-attributes-class-to-nil": { + oldClaim: validClaimVolumeAttributesClass1, + newClaim: validClaimNilVolumeAttributesClass, + enableVolumeAttributesClass: true, + isExpectedFailure: true, + }, + "invalid-update-volume-attributes-class-to-empty": { + oldClaim: validClaimVolumeAttributesClass1, + newClaim: validClaimEmptyVolumeAttributesClass, + enableVolumeAttributesClass: true, + isExpectedFailure: true, + }, + "invalid-update-volume-attributes-class-to-nil-without-featuregate-enabled": { + oldClaim: validClaimVolumeAttributesClass1, + newClaim: validClaimNilVolumeAttributesClass, + enableVolumeAttributesClass: false, + isExpectedFailure: true, + }, + "invalid-update-volume-attributes-class-without-featuregate-enabled": { + oldClaim: validClaimVolumeAttributesClass1, + newClaim: validClaimVolumeAttributesClass2, + enableVolumeAttributesClass: false, + isExpectedFailure: true, + }, } for name, scenario := range scenarios { t.Run(name, func(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RecoverVolumeExpansionFailure, scenario.enableRecoverFromExpansion)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, scenario.enableVolumeAttributesClass)() + scenario.oldClaim.ResourceVersion = "1" scenario.newClaim.ResourceVersion = "1" opts := ValidationOptionsForPersistentVolumeClaim(scenario.newClaim, scenario.oldClaim) @@ -2659,13 +3041,15 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) { invaildAPIGroup := "^invalid" tests := map[string]struct { - oldPvc *core.PersistentVolumeClaim - expectValidationOpts PersistentVolumeClaimSpecValidationOptions + oldPvc *core.PersistentVolumeClaim + enableVolumeAttributesClass bool + expectValidationOpts PersistentVolumeClaimSpecValidationOptions }{ "nil pv": { oldPvc: nil, expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ EnableRecoverFromExpansionFailure: false, + EnableVolumeAttributesClass: false, }, }, "invaild apiGroup in dataSource allowed because the old pvc is used": { @@ -2680,10 +3064,28 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) { AllowInvalidAPIGroupInDataSourceOrRef: true, }, }, + "volume attributes class allowed because feature enable": { + oldPvc: pvcWithVolumeAttributesClassName(utilpointer.String("foo")), + enableVolumeAttributesClass: true, + expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ + EnableRecoverFromExpansionFailure: false, + EnableVolumeAttributesClass: true, + }, + }, + "volume attributes class validated because used and feature disabled": { + oldPvc: pvcWithVolumeAttributesClassName(utilpointer.String("foo")), + enableVolumeAttributesClass: false, + expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ + EnableRecoverFromExpansionFailure: false, + EnableVolumeAttributesClass: true, + }, + }, } for name, tc := range tests { t.Run(name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, tc.enableVolumeAttributesClass)() + opts := ValidationOptionsForPersistentVolumeClaim(nil, tc.oldPvc) if opts != tc.expectValidationOpts { t.Errorf("Expected opts: %+v, received: %+v", tc.expectValidationOpts, opts) @@ -2694,17 +3096,27 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) { func TestValidationOptionsForPersistentVolumeClaimTemplate(t *testing.T) { tests := map[string]struct { - oldPvcTemplate *core.PersistentVolumeClaimTemplate - expectValidationOpts PersistentVolumeClaimSpecValidationOptions + oldPvcTemplate *core.PersistentVolumeClaimTemplate + enableVolumeAttributesClass bool + expectValidationOpts PersistentVolumeClaimSpecValidationOptions }{ "nil pv": { oldPvcTemplate: nil, expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{}, }, + "volume attributes class allowed because feature enable": { + oldPvcTemplate: pvcTemplateWithVolumeAttributesClassName(utilpointer.String("foo")), + enableVolumeAttributesClass: true, + expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ + EnableVolumeAttributesClass: true, + }, + }, } for name, tc := range tests { t.Run(name, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, tc.enableVolumeAttributesClass)() + opts := ValidationOptionsForPersistentVolumeClaimTemplate(nil, tc.oldPvcTemplate) if opts != tc.expectValidationOpts { t.Errorf("Expected opts: %+v, received: %+v", opts, tc.expectValidationOpts) @@ -22178,6 +22590,71 @@ func TestCrossNamespaceSource(t *testing.T) { } } +func pvcSpecWithVolumeAttributesClassName(vacName *string) *core.PersistentVolumeClaimSpec { + scName := "csi-plugin" + spec := core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{ + core.ReadOnlyMany, + }, + Resources: core.VolumeResourceRequirements{ + Requests: core.ResourceList{ + core.ResourceName(core.ResourceStorage): resource.MustParse("10G"), + }, + }, + StorageClassName: &scName, + VolumeAttributesClassName: vacName, + } + return &spec +} + +func TestVolumeAttributesClass(t *testing.T) { + testCases := []struct { + testName string + expectedFail bool + enableVolumeAttributesClass bool + claimSpec *core.PersistentVolumeClaimSpec + }{ + { + testName: "Feature gate enabled and valid no volumeAttributesClassName specified", + expectedFail: false, + enableVolumeAttributesClass: true, + claimSpec: pvcSpecWithVolumeAttributesClassName(nil), + }, + { + testName: "Feature gate enabled and an empty volumeAttributesClassName specified", + expectedFail: false, + enableVolumeAttributesClass: true, + claimSpec: pvcSpecWithVolumeAttributesClassName(utilpointer.String("")), + }, + { + testName: "Feature gate enabled and valid volumeAttributesClassName specified", + expectedFail: false, + enableVolumeAttributesClass: true, + claimSpec: pvcSpecWithVolumeAttributesClassName(utilpointer.String("foo")), + }, + { + testName: "Feature gate enabled and invalid volumeAttributesClassName specified", + expectedFail: true, + enableVolumeAttributesClass: true, + claimSpec: pvcSpecWithVolumeAttributesClassName(utilpointer.String("-invalid-")), + }, + } + for _, tc := range testCases { + opts := PersistentVolumeClaimSpecValidationOptions{ + EnableVolumeAttributesClass: tc.enableVolumeAttributesClass, + } + if tc.expectedFail { + if errs := ValidatePersistentVolumeClaimSpec(tc.claimSpec, field.NewPath("spec"), opts); len(errs) == 0 { + t.Errorf("%s: expected failure: %v", tc.testName, errs) + } + } else { + if errs := ValidatePersistentVolumeClaimSpec(tc.claimSpec, field.NewPath("spec"), opts); len(errs) != 0 { + t.Errorf("%s: expected success: %v", tc.testName, errs) + } + } + } +} + func TestValidateTopologySpreadConstraints(t *testing.T) { fieldPath := field.NewPath("field") subFldPath0 := fieldPath.Index(0) diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index 01b597f46e2..2112f576633 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -2320,6 +2320,22 @@ func (in *LocalVolumeSource) DeepCopy() *LocalVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ModifyVolumeStatus) DeepCopyInto(out *ModifyVolumeStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModifyVolumeStatus. +func (in *ModifyVolumeStatus) DeepCopy() *ModifyVolumeStatus { + if in == nil { + return nil + } + out := new(ModifyVolumeStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NFSVolumeSource) DeepCopyInto(out *NFSVolumeSource) { *out = *in @@ -3068,6 +3084,11 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec *out = new(TypedObjectReference) (*in).DeepCopyInto(*out) } + if in.VolumeAttributesClassName != nil { + in, out := &in.VolumeAttributesClassName, &out.VolumeAttributesClassName + *out = new(string) + **out = **in + } return } @@ -3117,6 +3138,16 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val } } + if in.CurrentVolumeAttributesClassName != nil { + in, out := &in.CurrentVolumeAttributesClassName, &out.CurrentVolumeAttributesClassName + *out = new(string) + **out = **in + } + if in.ModifyVolumeStatus != nil { + in, out := &in.ModifyVolumeStatus, &out.ModifyVolumeStatus + *out = new(ModifyVolumeStatus) + **out = **in + } return } @@ -3359,6 +3390,11 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { *out = new(VolumeNodeAffinity) (*in).DeepCopyInto(*out) } + if in.VolumeAttributesClassName != nil { + in, out := &in.VolumeAttributesClassName, &out.VolumeAttributesClassName + *out = new(string) + **out = **in + } return } diff --git a/pkg/apis/storage/register.go b/pkg/apis/storage/register.go index bf59e88cd1e..64094c87f3f 100644 --- a/pkg/apis/storage/register.go +++ b/pkg/apis/storage/register.go @@ -54,6 +54,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &CSIDriverList{}, &CSIStorageCapacity{}, &CSIStorageCapacityList{}, + &VolumeAttributesClass{}, + &VolumeAttributesClassList{}, ) return nil } diff --git a/pkg/apis/storage/types.go b/pkg/apis/storage/types.go index a700544c47c..db1c77783a8 100644 --- a/pkg/apis/storage/types.go +++ b/pkg/apis/storage/types.go @@ -672,3 +672,53 @@ type CSIStorageCapacityList struct { // Items is the list of CSIStorageCapacity objects. Items []CSIStorageCapacity } + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VolumeAttributesClass represents a specification of mutable volume attributes +// defined by the CSI driver. The class can be specified during dynamic provisioning +// of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning. +type VolumeAttributesClass struct { + metav1.TypeMeta + + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta + + // Name of the CSI driver + // This field is immutable. + DriverName string + + // parameters hold volume attributes defined by the CSI driver. These values + // are opaque to the Kubernetes and are passed directly to the CSI driver. + // The underlying storage provider supports changing these attributes on an + // existing volume, however the parameters field itself is immutable. To + // invoke a volume update, a new VolumeAttributesClass should be created with + // new parameters, and the PersistentVolumeClaim should be updated to reference + // the new VolumeAttributesClass. + // + // This field is required and must contain at least one key/value pair. + // The keys cannot be empty, and the maximum number of parameters is 512, with + // a cumulative max size of 256K. If the CSI driver rejects invalid parameters, + // the target PersistentVolumeClaim will be set to an "Infeasible" state in the + // modifyVolumeStatus field. + Parameters map[string]string +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VolumeAttributesClassList is a collection of VolumeAttributesClass objects. +type VolumeAttributesClassList struct { + metav1.TypeMeta + + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta + + // items is the list of VolumeAttributesClass objects. + // +listType=map + // +listMapKey=name + Items []VolumeAttributesClass +} diff --git a/pkg/apis/storage/util/helpers.go b/pkg/apis/storage/util/helpers.go index 5d1fa8839b4..796e90579b5 100644 --- a/pkg/apis/storage/util/helpers.go +++ b/pkg/apis/storage/util/helpers.go @@ -26,6 +26,9 @@ const IsDefaultStorageClassAnnotation = "storageclass.kubernetes.io/is-default-c // TODO: remove Beta when no longer used const BetaIsDefaultStorageClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" +// AlphaIsDefaultVolumeAttributesClassAnnotation is the alpha version of IsDefaultVolumeAttributesClassAnnotation. +const AlphaIsDefaultVolumeAttributesClassAnnotation = "volumeattributesclass.alpha.kubernetes.io/is-default-class" + // IsDefaultAnnotation returns a boolean if // the annotation is set // TODO: remove Beta when no longer needed @@ -39,3 +42,9 @@ func IsDefaultAnnotation(obj metav1.ObjectMeta) bool { return false } + +// IsDefaultAnnotationForVolumeAttributesClass returns a boolean if +// the annotation is set +func IsDefaultAnnotationForVolumeAttributesClass(obj metav1.ObjectMeta) bool { + return obj.Annotations[AlphaIsDefaultVolumeAttributesClassAnnotation] == "true" +} diff --git a/pkg/apis/storage/v1alpha1/zz_generated.conversion.go b/pkg/apis/storage/v1alpha1/zz_generated.conversion.go index 5dad2b61829..4dbf0fdcd7b 100644 --- a/pkg/apis/storage/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/storage/v1alpha1/zz_generated.conversion.go @@ -112,6 +112,26 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1alpha1.VolumeAttributesClass)(nil), (*storage.VolumeAttributesClass)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_VolumeAttributesClass_To_storage_VolumeAttributesClass(a.(*v1alpha1.VolumeAttributesClass), b.(*storage.VolumeAttributesClass), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*storage.VolumeAttributesClass)(nil), (*v1alpha1.VolumeAttributesClass)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_storage_VolumeAttributesClass_To_v1alpha1_VolumeAttributesClass(a.(*storage.VolumeAttributesClass), b.(*v1alpha1.VolumeAttributesClass), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1alpha1.VolumeAttributesClassList)(nil), (*storage.VolumeAttributesClassList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_VolumeAttributesClassList_To_storage_VolumeAttributesClassList(a.(*v1alpha1.VolumeAttributesClassList), b.(*storage.VolumeAttributesClassList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*storage.VolumeAttributesClassList)(nil), (*v1alpha1.VolumeAttributesClassList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_storage_VolumeAttributesClassList_To_v1alpha1_VolumeAttributesClassList(a.(*storage.VolumeAttributesClassList), b.(*v1alpha1.VolumeAttributesClassList), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1alpha1.VolumeError)(nil), (*storage.VolumeError)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_VolumeError_To_storage_VolumeError(a.(*v1alpha1.VolumeError), b.(*storage.VolumeError), scope) }); err != nil { @@ -341,6 +361,52 @@ func Convert_storage_VolumeAttachmentStatus_To_v1alpha1_VolumeAttachmentStatus(i return autoConvert_storage_VolumeAttachmentStatus_To_v1alpha1_VolumeAttachmentStatus(in, out, s) } +func autoConvert_v1alpha1_VolumeAttributesClass_To_storage_VolumeAttributesClass(in *v1alpha1.VolumeAttributesClass, out *storage.VolumeAttributesClass, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.DriverName = in.DriverName + out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) + return nil +} + +// Convert_v1alpha1_VolumeAttributesClass_To_storage_VolumeAttributesClass is an autogenerated conversion function. +func Convert_v1alpha1_VolumeAttributesClass_To_storage_VolumeAttributesClass(in *v1alpha1.VolumeAttributesClass, out *storage.VolumeAttributesClass, s conversion.Scope) error { + return autoConvert_v1alpha1_VolumeAttributesClass_To_storage_VolumeAttributesClass(in, out, s) +} + +func autoConvert_storage_VolumeAttributesClass_To_v1alpha1_VolumeAttributesClass(in *storage.VolumeAttributesClass, out *v1alpha1.VolumeAttributesClass, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + out.DriverName = in.DriverName + out.Parameters = *(*map[string]string)(unsafe.Pointer(&in.Parameters)) + return nil +} + +// Convert_storage_VolumeAttributesClass_To_v1alpha1_VolumeAttributesClass is an autogenerated conversion function. +func Convert_storage_VolumeAttributesClass_To_v1alpha1_VolumeAttributesClass(in *storage.VolumeAttributesClass, out *v1alpha1.VolumeAttributesClass, s conversion.Scope) error { + return autoConvert_storage_VolumeAttributesClass_To_v1alpha1_VolumeAttributesClass(in, out, s) +} + +func autoConvert_v1alpha1_VolumeAttributesClassList_To_storage_VolumeAttributesClassList(in *v1alpha1.VolumeAttributesClassList, out *storage.VolumeAttributesClassList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]storage.VolumeAttributesClass)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1alpha1_VolumeAttributesClassList_To_storage_VolumeAttributesClassList is an autogenerated conversion function. +func Convert_v1alpha1_VolumeAttributesClassList_To_storage_VolumeAttributesClassList(in *v1alpha1.VolumeAttributesClassList, out *storage.VolumeAttributesClassList, s conversion.Scope) error { + return autoConvert_v1alpha1_VolumeAttributesClassList_To_storage_VolumeAttributesClassList(in, out, s) +} + +func autoConvert_storage_VolumeAttributesClassList_To_v1alpha1_VolumeAttributesClassList(in *storage.VolumeAttributesClassList, out *v1alpha1.VolumeAttributesClassList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]v1alpha1.VolumeAttributesClass)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_storage_VolumeAttributesClassList_To_v1alpha1_VolumeAttributesClassList is an autogenerated conversion function. +func Convert_storage_VolumeAttributesClassList_To_v1alpha1_VolumeAttributesClassList(in *storage.VolumeAttributesClassList, out *v1alpha1.VolumeAttributesClassList, s conversion.Scope) error { + return autoConvert_storage_VolumeAttributesClassList_To_v1alpha1_VolumeAttributesClassList(in, out, s) +} + func autoConvert_v1alpha1_VolumeError_To_storage_VolumeError(in *v1alpha1.VolumeError, out *storage.VolumeError, s conversion.Scope) error { out.Time = in.Time out.Message = in.Message diff --git a/pkg/apis/storage/validation/validation.go b/pkg/apis/storage/validation/validation.go index 5c28131580e..5d37874cee2 100644 --- a/pkg/apis/storage/validation/validation.go +++ b/pkg/apis/storage/validation/validation.go @@ -55,7 +55,7 @@ type CSINodeValidationOptions struct { func ValidateStorageClass(storageClass *storage.StorageClass) field.ErrorList { allErrs := apivalidation.ValidateObjectMeta(&storageClass.ObjectMeta, false, apivalidation.ValidateClassName, field.NewPath("metadata")) allErrs = append(allErrs, validateProvisioner(storageClass.Provisioner, field.NewPath("provisioner"))...) - allErrs = append(allErrs, validateParameters(storageClass.Parameters, field.NewPath("parameters"))...) + allErrs = append(allErrs, validateParameters(storageClass.Parameters, true, field.NewPath("parameters"))...) allErrs = append(allErrs, validateReclaimPolicy(storageClass.ReclaimPolicy, field.NewPath("reclaimPolicy"))...) allErrs = append(allErrs, validateVolumeBindingMode(storageClass.VolumeBindingMode, field.NewPath("volumeBindingMode"))...) allErrs = append(allErrs, validateAllowedTopologies(storageClass.AllowedTopologies, field.NewPath("allowedTopologies"))...) @@ -95,7 +95,7 @@ func validateProvisioner(provisioner string, fldPath *field.Path) field.ErrorLis } // validateParameters tests that keys are qualified names and that provisionerParameter are < 256kB. -func validateParameters(params map[string]string, fldPath *field.Path) field.ErrorList { +func validateParameters(params map[string]string, allowEmpty bool, fldPath *field.Path) field.ErrorList { var totalSize int64 allErrs := field.ErrorList{} @@ -114,6 +114,10 @@ func validateParameters(params map[string]string, fldPath *field.Path) field.Err if totalSize > maxProvisionerParameterSize { allErrs = append(allErrs, field.TooLong(fldPath, "", maxProvisionerParameterSize)) } + + if !allowEmpty && len(params) == 0 { + allErrs = append(allErrs, field.Required(fldPath, "must contain at least one key/value pair")) + } return allErrs } @@ -578,3 +582,23 @@ func ValidateCSIStorageCapacityUpdate(capacity, oldCapacity *storage.CSIStorageC return allErrs } + +// ValidateVolumeAttributesClass validates a VolumeAttributesClass. +func ValidateVolumeAttributesClass(volumeAttributesClass *storage.VolumeAttributesClass) field.ErrorList { + allErrs := apivalidation.ValidateObjectMeta(&volumeAttributesClass.ObjectMeta, false, apivalidation.ValidateClassName, field.NewPath("metadata")) + allErrs = append(allErrs, validateProvisioner(volumeAttributesClass.DriverName, field.NewPath("driverName"))...) + allErrs = append(allErrs, validateParameters(volumeAttributesClass.Parameters, false, field.NewPath("parameters"))...) + return allErrs +} + +// ValidateVolumeAttributesClassUpdate tests if an update to VolumeAttributesClass is valid. +func ValidateVolumeAttributesClassUpdate(volumeAttributesClass, oldVolumeAttributesClass *storage.VolumeAttributesClass) field.ErrorList { + allErrs := apivalidation.ValidateObjectMetaUpdate(&volumeAttributesClass.ObjectMeta, &oldVolumeAttributesClass.ObjectMeta, field.NewPath("metadata")) + if volumeAttributesClass.DriverName != oldVolumeAttributesClass.DriverName { + allErrs = append(allErrs, field.Forbidden(field.NewPath("driverName"), "updates to driverName are forbidden.")) + } + if !reflect.DeepEqual(oldVolumeAttributesClass.Parameters, volumeAttributesClass.Parameters) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("parameters"), "updates to parameters are forbidden.")) + } + return allErrs +} diff --git a/pkg/apis/storage/validation/validation_test.go b/pkg/apis/storage/validation/validation_test.go index 1b9ec692a8e..a9dcb770b71 100644 --- a/pkg/apis/storage/validation/validation_test.go +++ b/pkg/apis/storage/validation/validation_test.go @@ -2163,3 +2163,178 @@ func TestCSIDriverValidationSELinuxMountEnabledDisabled(t *testing.T) { }) } } + +func TestValidateVolumeAttributesClass(t *testing.T) { + successCases := []storage.VolumeAttributesClass{ + { + // driverName without a slash + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "foo", + Parameters: map[string]string{ + "foo-parameter": "free-form-string", + }, + }, + { + // some parameters + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "kubernetes.io/foo-parameter": "free/form/string", + "foo-parameter": "free-form-string", + "foo-parameter2": "{\"embedded\": \"json\", \"with\": {\"structures\":\"inside\"}}", + "foo-parameter3": "", + }, + }} + + // Success cases are expected to pass validation. + for testName, v := range successCases { + if errs := ValidateVolumeAttributesClass(&v); len(errs) != 0 { + t.Errorf("Expected success for %d, got %v", testName, errs) + } + } + + // generate a map longer than maxParameterSize + longParameters := make(map[string]string) + totalSize := 0 + for totalSize < maxProvisionerParameterSize { + k := fmt.Sprintf("param/%d", totalSize) + v := fmt.Sprintf("value-%d", totalSize) + longParameters[k] = v + totalSize = totalSize + len(k) + len(v) + } + + errorCases := map[string]storage.VolumeAttributesClass{ + "namespace is present": { + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "foo-parameter": "free-form-string", + }, + }, + "invalid driverName": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "kubernetes.io/invalid/foo", + Parameters: map[string]string{ + "foo-parameter": "free-form-string", + }, + }, + "invalid driverName with invalid chars": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "^/ ", + Parameters: map[string]string{ + "foo-parameter": "free-form-string", + }, + }, + "empty parameters": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{}, + }, + "nil parameters": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "kubernetes.io/foo", + }, + "invalid empty parameter name": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "": "value", + }, + }, + "driverName: Required value": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "", + Parameters: map[string]string{ + "foo-parameter": "free-form-string", + }, + }, + "driverName: whitespace": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: " ", + Parameters: map[string]string{ + "foo-parameter": "free-form-string", + }, + }, + "too long parameters": { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + DriverName: "kubernetes.io/foo", + Parameters: longParameters, + }, + } + + // Error cases are not expected to pass validation. + for testName, v := range errorCases { + if errs := ValidateVolumeAttributesClass(&v); len(errs) == 0 { + t.Errorf("Expected failure for test: %s", testName) + } + } +} + +func TestValidateVolumeAttributesClassUpdate(t *testing.T) { + cases := map[string]struct { + oldClass *storage.VolumeAttributesClass + newClass *storage.VolumeAttributesClass + shouldSucceed bool + }{ + "invalid driverName update": { + oldClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + }, + newClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/bar", + }, + shouldSucceed: false, + }, + "invalid parameter update which changes values": { + oldClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "foo": "bar1", + }, + }, + newClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "foo": "bar2", + }, + }, + shouldSucceed: false, + }, + "invalid parameter update which add new item": { + oldClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{}, + }, + newClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "foo": "bar", + }, + }, + shouldSucceed: false, + }, + "invalid parameter update which remove a item": { + oldClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{ + "foo": "bar", + }, + }, + newClass: &storage.VolumeAttributesClass{ + DriverName: "kubernetes.io/foo", + Parameters: map[string]string{}, + }, + shouldSucceed: false, + }, + } + + for testName, testCase := range cases { + errs := ValidateVolumeAttributesClassUpdate(testCase.newClass, testCase.oldClass) + if testCase.shouldSucceed && len(errs) != 0 { + t.Errorf("Expected success for %v, got %v", testName, errs) + } + if !testCase.shouldSucceed && len(errs) == 0 { + t.Errorf("Expected failure for %v, got success", testName) + } + } +} diff --git a/pkg/apis/storage/zz_generated.deepcopy.go b/pkg/apis/storage/zz_generated.deepcopy.go index 661df7a349e..9b812e627b9 100644 --- a/pkg/apis/storage/zz_generated.deepcopy.go +++ b/pkg/apis/storage/zz_generated.deepcopy.go @@ -579,6 +579,72 @@ func (in *VolumeAttachmentStatus) DeepCopy() *VolumeAttachmentStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeAttributesClass) DeepCopyInto(out *VolumeAttributesClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeAttributesClass. +func (in *VolumeAttributesClass) DeepCopy() *VolumeAttributesClass { + if in == nil { + return nil + } + out := new(VolumeAttributesClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeAttributesClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeAttributesClassList) DeepCopyInto(out *VolumeAttributesClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]VolumeAttributesClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeAttributesClassList. +func (in *VolumeAttributesClassList) DeepCopy() *VolumeAttributesClassList { + if in == nil { + return nil + } + out := new(VolumeAttributesClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeAttributesClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VolumeError) DeepCopyInto(out *VolumeError) { *out = *in diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index bdef9689174..66ae0eeed03 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -868,6 +868,13 @@ const ( // Enables user namespace support for stateless pods. UserNamespacesSupport featuregate.Feature = "UserNamespacesSupport" + // owner: @mattcarry, @sunnylovestiramisu + // kep: https://kep.k8s.io/3751 + // alpha: v1.29 + // + // Enables user specified volume attributes for persistent volumes, like iops and throughput. + VolumeAttributesClass featuregate.Feature = "VolumeAttributesClass" + // owner: @cofyc // alpha: v1.21 VolumeCapacityPriority featuregate.Feature = "VolumeCapacityPriority" @@ -1170,6 +1177,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS UnknownVersionInteroperabilityProxy: {Default: false, PreRelease: featuregate.Alpha}, + VolumeAttributesClass: {Default: false, PreRelease: featuregate.Alpha}, + VolumeCapacityPriority: {Default: false, PreRelease: featuregate.Alpha}, UserNamespacesSupport: {Default: false, PreRelease: featuregate.Alpha}, diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index c65aac2b0d9..e4677084a91 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -440,6 +440,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/core/v1.LoadBalancerStatus": schema_k8sio_api_core_v1_LoadBalancerStatus(ref), "k8s.io/api/core/v1.LocalObjectReference": schema_k8sio_api_core_v1_LocalObjectReference(ref), "k8s.io/api/core/v1.LocalVolumeSource": schema_k8sio_api_core_v1_LocalVolumeSource(ref), + "k8s.io/api/core/v1.ModifyVolumeStatus": schema_k8sio_api_core_v1_ModifyVolumeStatus(ref), "k8s.io/api/core/v1.NFSVolumeSource": schema_k8sio_api_core_v1_NFSVolumeSource(ref), "k8s.io/api/core/v1.Namespace": schema_k8sio_api_core_v1_Namespace(ref), "k8s.io/api/core/v1.NamespaceCondition": schema_k8sio_api_core_v1_NamespaceCondition(ref), @@ -893,6 +894,8 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/storage/v1alpha1.VolumeAttachmentSource": schema_k8sio_api_storage_v1alpha1_VolumeAttachmentSource(ref), "k8s.io/api/storage/v1alpha1.VolumeAttachmentSpec": schema_k8sio_api_storage_v1alpha1_VolumeAttachmentSpec(ref), "k8s.io/api/storage/v1alpha1.VolumeAttachmentStatus": schema_k8sio_api_storage_v1alpha1_VolumeAttachmentStatus(ref), + "k8s.io/api/storage/v1alpha1.VolumeAttributesClass": schema_k8sio_api_storage_v1alpha1_VolumeAttributesClass(ref), + "k8s.io/api/storage/v1alpha1.VolumeAttributesClassList": schema_k8sio_api_storage_v1alpha1_VolumeAttributesClassList(ref), "k8s.io/api/storage/v1alpha1.VolumeError": schema_k8sio_api_storage_v1alpha1_VolumeError(ref), "k8s.io/api/storage/v1beta1.CSIDriver": schema_k8sio_api_storage_v1beta1_CSIDriver(ref), "k8s.io/api/storage/v1beta1.CSIDriverList": schema_k8sio_api_storage_v1beta1_CSIDriverList(ref), @@ -21801,6 +21804,36 @@ func schema_k8sio_api_core_v1_LocalVolumeSource(ref common.ReferenceCallback) co } } +func schema_k8sio_api_core_v1_ModifyVolumeStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "targetVolumeAttributesClassName": { + SchemaProps: spec.SchemaProps{ + Description: "targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled", + Type: []string{"string"}, + Format: "", + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Description: "status is the status of the ControllerModifyVolume operation. It can be in any of following states:\n - Pending\n Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as\n the specified VolumeAttributesClass not existing.\n - InProgress\n InProgress indicates that the volume is being modified.\n - Infeasible\n Infeasible indicates that the request has been rejected as invalid by the CSI driver. To\n\t resolve the error, a valid VolumeAttributesClass needs to be specified.\nNote: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately.\n\nPossible enum values:\n - `\"InProgress\"` InProgress indicates that the volume is being modified\n - `\"Infeasible\"` Infeasible indicates that the request has been rejected as invalid by the CSI driver. To resolve the error, a valid VolumeAttributesClass needs to be specified\n - `\"Pending\"` Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as the specified VolumeAttributesClass not existing", + Default: "", + Type: []string{"string"}, + Format: "", + Enum: []interface{}{"InProgress", "Infeasible", "Pending"}, + }, + }, + }, + Required: []string{"status"}, + }, + }, + } +} + func schema_k8sio_api_core_v1_NFSVolumeSource(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -23267,6 +23300,13 @@ func schema_k8sio_api_core_v1_PersistentVolumeClaimSpec(ref common.ReferenceCall Ref: ref("k8s.io/api/core/v1.TypedObjectReference"), }, }, + "volumeAttributesClassName": { + SchemaProps: spec.SchemaProps{ + Description: "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -23374,11 +23414,24 @@ func schema_k8sio_api_core_v1_PersistentVolumeClaimStatus(ref common.ReferenceCa }, }, }, + "currentVolumeAttributesClassName": { + SchemaProps: spec.SchemaProps{ + Description: "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is an alpha field and requires enabling VolumeAttributesClass feature.", + Type: []string{"string"}, + Format: "", + }, + }, + "modifyVolumeStatus": { + SchemaProps: spec.SchemaProps{ + Description: "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is an alpha field and requires enabling VolumeAttributesClass feature.", + Ref: ref("k8s.io/api/core/v1.ModifyVolumeStatus"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.PersistentVolumeClaimCondition", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, + "k8s.io/api/core/v1.ModifyVolumeStatus", "k8s.io/api/core/v1.PersistentVolumeClaimCondition", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, } } @@ -23862,6 +23915,13 @@ func schema_k8sio_api_core_v1_PersistentVolumeSpec(ref common.ReferenceCallback) Ref: ref("k8s.io/api/core/v1.VolumeNodeAffinity"), }, }, + "volumeAttributesClassName": { + SchemaProps: spec.SchemaProps{ + Description: "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is an alpha field and requires enabling VolumeAttributesClass feature.", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -44510,6 +44570,118 @@ func schema_k8sio_api_storage_v1alpha1_VolumeAttachmentStatus(ref common.Referen } } +func schema_k8sio_api_storage_v1alpha1_VolumeAttributesClass(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "VolumeAttributesClass represents a specification of mutable volume attributes defined by the CSI driver. The class can be specified during dynamic provisioning of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "driverName": { + SchemaProps: spec.SchemaProps{ + Description: "Name of the CSI driver This field is immutable.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "parameters": { + SchemaProps: spec.SchemaProps{ + Description: "parameters hold volume attributes defined by the CSI driver. These values are opaque to the Kubernetes and are passed directly to the CSI driver. The underlying storage provider supports changing these attributes on an existing volume, however the parameters field itself is immutable. To invoke a volume update, a new VolumeAttributesClass should be created with new parameters, and the PersistentVolumeClaim should be updated to reference the new VolumeAttributesClass.\n\nThis field is required and must contain at least one key/value pair. The keys cannot be empty, and the maximum number of parameters is 512, with a cumulative max size of 256K. If the CSI driver rejects invalid parameters, the target PersistentVolumeClaim will be set to an \"Infeasible\" state in the modifyVolumeStatus field.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + Required: []string{"driverName"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_k8sio_api_storage_v1alpha1_VolumeAttributesClassList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "VolumeAttributesClassList is a collection of VolumeAttributesClass objects.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Description: "items is the list of VolumeAttributesClass objects.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/api/storage/v1alpha1.VolumeAttributesClass"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/storage/v1alpha1.VolumeAttributesClass", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + func schema_k8sio_api_storage_v1alpha1_VolumeError(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/kubeapiserver/default_storage_factory_builder.go b/pkg/kubeapiserver/default_storage_factory_builder.go index b8cd6413cef..dd5c477dcf3 100644 --- a/pkg/kubeapiserver/default_storage_factory_builder.go +++ b/pkg/kubeapiserver/default_storage_factory_builder.go @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/networking" "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/apis/storage" ) // SpecialDefaultResourcePrefixes are prefixes compiled into Kubernetes. @@ -73,6 +74,7 @@ func NewStorageFactoryConfig() *StorageFactoryConfig { admissionregistration.Resource("validatingadmissionpolicybindings").WithVersion("v1beta1"), networking.Resource("ipaddresses").WithVersion("v1alpha1"), certificates.Resource("clustertrustbundles").WithVersion("v1alpha1"), + storage.Resource("volumeattributesclasses").WithVersion("v1alpha1"), } return &StorageFactoryConfig{ diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index 3a17d322e48..2c951d0d1b3 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -43,6 +43,7 @@ import ( resourcev1alpha2 "k8s.io/api/resource/v1alpha2" schedulingv1 "k8s.io/api/scheduling/v1" storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -305,6 +306,7 @@ func AddHandlers(h printers.PrintHandler) { {Name: "Status", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["phase"]}, {Name: "Claim", Type: "string", Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["claimRef"]}, {Name: "StorageClass", Type: "string", Description: "StorageClass of the pv"}, + {Name: "VolumeAttributesClass", Type: "string", Description: "VolumeAttributesClass of the pv"}, {Name: "Reason", Type: "string", Description: apiv1.PersistentVolumeStatus{}.SwaggerDoc()["reason"]}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, {Name: "VolumeMode", Type: "string", Priority: 1, Description: apiv1.PersistentVolumeSpec{}.SwaggerDoc()["volumeMode"]}, @@ -319,6 +321,7 @@ func AddHandlers(h printers.PrintHandler) { {Name: "Capacity", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["capacity"]}, {Name: "Access Modes", Type: "string", Description: apiv1.PersistentVolumeClaimStatus{}.SwaggerDoc()["accessModes"]}, {Name: "StorageClass", Type: "string", Description: "StorageClass of the pvc"}, + {Name: "VolumeAttributesClass", Type: "string", Description: "VolumeAttributesClass of the pvc"}, {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, {Name: "VolumeMode", Type: "string", Priority: 1, Description: apiv1.PersistentVolumeClaimSpec{}.SwaggerDoc()["volumeMode"]}, } @@ -435,6 +438,15 @@ func AddHandlers(h printers.PrintHandler) { _ = h.TableHandler(storageClassColumnDefinitions, printStorageClass) _ = h.TableHandler(storageClassColumnDefinitions, printStorageClassList) + volumeAttributesClassColumnDefinitions := []metav1.TableColumnDefinition{ + {Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]}, + {Name: "DriverName", Type: "string", Description: storagev1alpha1.VolumeAttributesClass{}.SwaggerDoc()["driverName"]}, + {Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]}, + } + + _ = h.TableHandler(volumeAttributesClassColumnDefinitions, printVolumeAttributesClass) + _ = h.TableHandler(volumeAttributesClassColumnDefinitions, printVolumeAttributesClassList) + statusColumnDefinitions := []metav1.TableColumnDefinition{ {Name: "Status", Type: "string", Description: metav1.Status{}.SwaggerDoc()["status"]}, {Name: "Reason", Type: "string", Description: metav1.Status{}.SwaggerDoc()["reason"]}, @@ -1882,8 +1894,13 @@ func printPersistentVolume(obj *api.PersistentVolume, options printers.GenerateO volumeMode = string(*obj.Spec.VolumeMode) } + volumeAttributeClass := "" + if obj.Spec.VolumeAttributesClassName != nil { + volumeAttributeClass = *obj.Spec.VolumeAttributesClassName + } + row.Cells = append(row.Cells, obj.Name, aSize, modesStr, reclaimPolicyStr, - string(phase), claimRefUID, helper.GetPersistentVolumeClass(obj), + string(phase), claimRefUID, helper.GetPersistentVolumeClass(obj), volumeAttributeClass, obj.Status.Reason, translateTimestampSince(obj.CreationTimestamp), volumeMode) return []metav1.TableRow{row}, nil } @@ -1910,10 +1927,16 @@ func printPersistentVolumeClaim(obj *api.PersistentVolumeClaim, options printers phase = "Terminating" } + volumeAttributeClass := "" storage := obj.Spec.Resources.Requests[api.ResourceStorage] capacity := "" accessModes := "" volumeMode := "" + + if obj.Spec.VolumeAttributesClassName != nil { + volumeAttributeClass = *obj.Spec.VolumeAttributesClassName + } + if obj.Spec.VolumeName != "" { accessModes = helper.GetAccessModesAsString(obj.Status.AccessModes) storage = obj.Status.Capacity[api.ResourceStorage] @@ -1925,7 +1948,7 @@ func printPersistentVolumeClaim(obj *api.PersistentVolumeClaim, options printers } row.Cells = append(row.Cells, obj.Name, string(phase), obj.Spec.VolumeName, capacity, accessModes, - helper.GetPersistentVolumeClaimClass(obj), translateTimestampSince(obj.CreationTimestamp), volumeMode) + helper.GetPersistentVolumeClaimClass(obj), volumeAttributeClass, translateTimestampSince(obj.CreationTimestamp), volumeMode) return []metav1.TableRow{row}, nil } @@ -2434,6 +2457,33 @@ func printStorageClassList(list *storage.StorageClassList, options printers.Gene return rows, nil } +func printVolumeAttributesClass(obj *storage.VolumeAttributesClass, options printers.GenerateOptions) ([]metav1.TableRow, error) { + row := metav1.TableRow{ + Object: runtime.RawExtension{Object: obj}, + } + + name := obj.Name + if storageutil.IsDefaultAnnotationForVolumeAttributesClass(obj.ObjectMeta) { + name += " (default)" + } + + row.Cells = append(row.Cells, name, obj.DriverName, translateTimestampSince(obj.CreationTimestamp)) + + return []metav1.TableRow{row}, nil +} + +func printVolumeAttributesClassList(list *storage.VolumeAttributesClassList, options printers.GenerateOptions) ([]metav1.TableRow, error) { + rows := make([]metav1.TableRow, 0, len(list.Items)) + for i := range list.Items { + r, err := printVolumeAttributesClass(&list.Items[i], options) + if err != nil { + return nil, err + } + rows = append(rows, r...) + } + return rows, nil +} + func printLease(obj *coordination.Lease, options printers.GenerateOptions) ([]metav1.TableRow, error) { row := metav1.TableRow{ Object: runtime.RawExtension{Object: obj}, diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 397d66aa141..e429ea08f62 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -4711,6 +4711,7 @@ func TestPrintStatefulSet(t *testing.T) { func TestPrintPersistentVolume(t *testing.T) { myScn := "my-scn" + myVacn := "my-vacn" claimRef := api.ObjectReference{ Name: "test", @@ -4737,7 +4738,7 @@ func TestPrintPersistentVolume(t *testing.T) { Phase: api.VolumeBound, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test1", "4Gi", "ROX", "", "Bound", "default/test", "", "", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test1", "4Gi", "ROX", "", "Bound", "default/test", "", "", "", "", ""}}}, }, { // Test failed @@ -4756,7 +4757,7 @@ func TestPrintPersistentVolume(t *testing.T) { Phase: api.VolumeFailed, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test2", "4Gi", "ROX", "", "Failed", "default/test", "", "", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test2", "4Gi", "ROX", "", "Failed", "default/test", "", "", "", "", ""}}}, }, { // Test pending @@ -4775,7 +4776,7 @@ func TestPrintPersistentVolume(t *testing.T) { Phase: api.VolumePending, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test3", "10Gi", "RWX", "", "Pending", "default/test", "", "", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test3", "10Gi", "RWX", "", "Pending", "default/test", "", "", "", "", ""}}}, }, { // Test pending, storageClass @@ -4795,7 +4796,28 @@ func TestPrintPersistentVolume(t *testing.T) { Phase: api.VolumePending, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test4", "10Gi", "RWO", "", "Pending", "default/test", "my-scn", "", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test4", "10Gi", "RWO", "", "Pending", "default/test", "my-scn", "", "", "", ""}}}, + }, + { + // Test pending, storageClass, volumeAttributesClass + pv: api.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test4", + }, + Spec: api.PersistentVolumeSpec{ + ClaimRef: &claimRef, + StorageClassName: myScn, + VolumeAttributesClassName: &myVacn, + AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, + Capacity: map[api.ResourceName]resource.Quantity{ + api.ResourceStorage: resource.MustParse("10Gi"), + }, + }, + Status: api.PersistentVolumeStatus{ + Phase: api.VolumePending, + }, + }, + expected: []metav1.TableRow{{Cells: []interface{}{"test4", "10Gi", "RWO", "", "Pending", "default/test", "my-scn", "my-vacn", "", "", ""}}}, }, { // Test available @@ -4815,7 +4837,7 @@ func TestPrintPersistentVolume(t *testing.T) { Phase: api.VolumeAvailable, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test5", "10Gi", "RWO", "", "Available", "default/test", "my-scn", "", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test5", "10Gi", "RWO", "", "Available", "default/test", "my-scn", "", "", "", ""}}}, }, { // Test released @@ -4835,7 +4857,7 @@ func TestPrintPersistentVolume(t *testing.T) { Phase: api.VolumeReleased, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test6", "10Gi", "RWO", "", "Released", "default/test", "my-scn", "", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test6", "10Gi", "RWO", "", "Released", "default/test", "my-scn", "", "", "", ""}}}, }, } @@ -4855,6 +4877,7 @@ func TestPrintPersistentVolume(t *testing.T) { func TestPrintPersistentVolumeClaim(t *testing.T) { volumeMode := api.PersistentVolumeFilesystem + myVacn := "my-vacn" myScn := "my-scn" tests := []struct { pvc api.PersistentVolumeClaim @@ -4878,7 +4901,7 @@ func TestPrintPersistentVolumeClaim(t *testing.T) { }, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test1", "Bound", "my-volume", "4Gi", "ROX", "", "", "Filesystem"}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test1", "Bound", "my-volume", "4Gi", "ROX", "", "", "", "Filesystem"}}}, }, { // Test name, num of containers, restarts, container ready status @@ -4897,7 +4920,7 @@ func TestPrintPersistentVolumeClaim(t *testing.T) { }, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test2", "Lost", "", "", "", "", "", "Filesystem"}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test2", "Lost", "", "", "", "", "", "", "Filesystem"}}}, }, { // Test name, num of containers, restarts, container ready status @@ -4917,7 +4940,7 @@ func TestPrintPersistentVolumeClaim(t *testing.T) { }, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test3", "Pending", "my-volume", "10Gi", "RWX", "", "", "Filesystem"}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test3", "Pending", "my-volume", "10Gi", "RWX", "", "", "", "Filesystem"}}}, }, { // Test name, num of containers, restarts, container ready status @@ -4938,7 +4961,7 @@ func TestPrintPersistentVolumeClaim(t *testing.T) { }, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test4", "Pending", "my-volume", "10Gi", "RWO", "my-scn", "", "Filesystem"}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test4", "Pending", "my-volume", "10Gi", "RWO", "my-scn", "", "", "Filesystem"}}}, }, { // Test name, num of containers, restarts, container ready status @@ -4958,7 +4981,28 @@ func TestPrintPersistentVolumeClaim(t *testing.T) { }, }, }, - expected: []metav1.TableRow{{Cells: []interface{}{"test5", "Pending", "my-volume", "10Gi", "RWO", "my-scn", "", ""}}}, + expected: []metav1.TableRow{{Cells: []interface{}{"test5", "Pending", "my-volume", "10Gi", "RWO", "my-scn", "", "", ""}}}, + }, + { + // Test name, num of containers, restarts, container ready status + pvc: api.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test5", + }, + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "my-volume", + StorageClassName: &myScn, + VolumeAttributesClassName: &myVacn, + }, + Status: api.PersistentVolumeClaimStatus{ + Phase: api.ClaimPending, + AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, + Capacity: map[api.ResourceName]resource.Quantity{ + api.ResourceStorage: resource.MustParse("10Gi"), + }, + }, + }, + expected: []metav1.TableRow{{Cells: []interface{}{"test5", "Pending", "my-volume", "10Gi", "RWO", "my-scn", "my-vacn", "", ""}}}, }, } @@ -5346,6 +5390,51 @@ func TestPrintStorageClass(t *testing.T) { } } +func TestPrintVolumeAttributesClass(t *testing.T) { + tests := []struct { + vac storage.VolumeAttributesClass + expected []metav1.TableRow + }{ + { + vac: storage.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "vac1", + CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)}, + }, + DriverName: "fake", + }, + expected: []metav1.TableRow{{Cells: []interface{}{"vac1", "fake", "0s"}}}, + }, + { + vac: storage.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "vac2", + CreationTimestamp: metav1.Time{Time: time.Now().Add(-3e11)}, + }, + DriverName: "fake", + Parameters: map[string]string{ + "iops": "500", + "throughput": "50MiB/s", + }, + }, + expected: []metav1.TableRow{{Cells: []interface{}{"vac2", "fake", "5m"}}}, + }, + } + + for i, test := range tests { + rows, err := printVolumeAttributesClass(&test.vac, printers.GenerateOptions{}) + if err != nil { + t.Fatal(err) + } + for i := range rows { + rows[i].Object.Object = nil + } + if !reflect.DeepEqual(test.expected, rows) { + t.Errorf("%d mismatch: %s", i, cmp.Diff(test.expected, rows)) + } + } +} + func TestPrintLease(t *testing.T) { holder1 := "holder1" holder2 := "holder2" diff --git a/pkg/registry/storage/rest/storage_storage.go b/pkg/registry/storage/rest/storage_storage.go index 207c6f1b320..30af516bd7c 100644 --- a/pkg/registry/storage/rest/storage_storage.go +++ b/pkg/registry/storage/rest/storage_storage.go @@ -31,6 +31,7 @@ import ( csistoragecapacitystore "k8s.io/kubernetes/pkg/registry/storage/csistoragecapacity/storage" storageclassstore "k8s.io/kubernetes/pkg/registry/storage/storageclass/storage" volumeattachmentstore "k8s.io/kubernetes/pkg/registry/storage/volumeattachment/storage" + volumeattributesclassstore "k8s.io/kubernetes/pkg/registry/storage/volumeattributesclass/storage" ) type RESTStorageProvider struct { @@ -72,6 +73,15 @@ func (p RESTStorageProvider) v1alpha1Storage(apiResourceConfigSource serverstora storage[resource] = csiStorageStorage.CSIStorageCapacity } + // register volumeattributesclasses + if resource := "volumeattributesclasses"; apiResourceConfigSource.ResourceEnabled(storageapiv1alpha1.SchemeGroupVersion.WithResource(resource)) { + volumeAttributesClassStorage, err := volumeattributesclassstore.NewREST(restOptionsGetter) + if err != nil { + return storage, err + } + storage[resource] = volumeAttributesClassStorage + } + return storage, nil } diff --git a/pkg/registry/storage/volumeattributesclass/doc.go b/pkg/registry/storage/volumeattributesclass/doc.go new file mode 100644 index 00000000000..f61b471931e --- /dev/null +++ b/pkg/registry/storage/volumeattributesclass/doc.go @@ -0,0 +1,19 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package volumeattributesclass provides Registry interface and its REST +// implementation for storing volumeattributesclass api objects. +package volumeattributesclass diff --git a/pkg/registry/storage/volumeattributesclass/storage/storage.go b/pkg/registry/storage/volumeattributesclass/storage/storage.go new file mode 100644 index 00000000000..1f7dae091bc --- /dev/null +++ b/pkg/registry/storage/volumeattributesclass/storage/storage.go @@ -0,0 +1,65 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/registry/generic" + genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" + "k8s.io/apiserver/pkg/registry/rest" + storageapi "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" + "k8s.io/kubernetes/pkg/registry/storage/volumeattributesclass" +) + +// REST implements a RESTStorage for volume attributes classes. +type REST struct { + *genericregistry.Store +} + +// NewREST returns a RESTStorage object that will work against storage classes. +func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) { + store := &genericregistry.Store{ + NewFunc: func() runtime.Object { return &storageapi.VolumeAttributesClass{} }, + NewListFunc: func() runtime.Object { return &storageapi.VolumeAttributesClassList{} }, + DefaultQualifiedResource: storageapi.Resource("volumeattributesclasses"), + SingularQualifiedResource: storageapi.Resource("volumeattributesclass"), + + CreateStrategy: volumeattributesclass.Strategy, + UpdateStrategy: volumeattributesclass.Strategy, + DeleteStrategy: volumeattributesclass.Strategy, + ReturnDeletedObject: true, + + TableConvertor: printerstorage.TableConvertor{TableGenerator: printers.NewTableGenerator().With(printersinternal.AddHandlers)}, + } + options := &generic.StoreOptions{RESTOptions: optsGetter} + if err := store.CompleteWithOptions(options); err != nil { + return nil, err + } + + return &REST{store}, nil +} + +// Implement ShortNamesProvider +var _ rest.ShortNamesProvider = &REST{} + +// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource. +func (r *REST) ShortNames() []string { + return []string{"vac"} +} diff --git a/pkg/registry/storage/volumeattributesclass/storage/storage_test.go b/pkg/registry/storage/volumeattributesclass/storage/storage_test.go new file mode 100644 index 00000000000..d50664dd0a5 --- /dev/null +++ b/pkg/registry/storage/volumeattributesclass/storage/storage_test.go @@ -0,0 +1,148 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/registry/generic" + genericregistrytest "k8s.io/apiserver/pkg/registry/generic/testing" + etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing" + storageapi "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/registry/registrytest" +) + +func newStorage(t *testing.T) (*REST, *etcd3testing.EtcdTestServer) { + etcdStorage, server := registrytest.NewEtcdStorageForResource(t, storageapi.SchemeGroupVersion.WithResource("volumeattributesclasses").GroupResource()) + restOptions := generic.RESTOptions{ + StorageConfig: etcdStorage, + Decorator: generic.UndecoratedStorage, + DeleteCollectionWorkers: 1, + ResourcePrefix: "volumeattributesclasses", + } + volumeAttributesClassStorage, err := NewREST(restOptions) + if err != nil { + t.Fatalf("unexpected error from REST storage: %v", err) + } + return volumeAttributesClassStorage, server +} + +func validNewVolumeAttributesClass(name string) *storageapi.VolumeAttributesClass { + return &storageapi.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + DriverName: "fake", + Parameters: map[string]string{ + "foo": "bar", + }, + } +} + +func TestCreate(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := genericregistrytest.New(t, storage.Store).ClusterScope() + volumeAttributesClass := validNewVolumeAttributesClass("foo") + volumeAttributesClass.ObjectMeta = metav1.ObjectMeta{GenerateName: "foo"} + test.TestCreate( + // valid + volumeAttributesClass, + // invalid + &storageapi.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"}, + Parameters: map[string]string{"foo": "bar"}, + }, + ) +} + +func TestUpdate(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := genericregistrytest.New(t, storage.Store).ClusterScope() + test.TestUpdate( + // valid + validNewVolumeAttributesClass("foo"), + // updateFunc + func(obj runtime.Object) runtime.Object { + object := obj.(*storageapi.VolumeAttributesClass) + object.Parameters = map[string]string{"foo": "bar"} + return object + }, + // invalid update + func(obj runtime.Object) runtime.Object { + object := obj.(*storageapi.VolumeAttributesClass) + object.Parameters = map[string]string{"faz": "bar"} + return object + }, + ) + +} + +func TestDelete(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := genericregistrytest.New(t, storage.Store).ClusterScope().ReturnDeletedObject() + test.TestDelete(validNewVolumeAttributesClass("foo")) +} + +func TestGet(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := genericregistrytest.New(t, storage.Store).ClusterScope() + test.TestGet(validNewVolumeAttributesClass("foo")) +} + +func TestList(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := genericregistrytest.New(t, storage.Store).ClusterScope() + test.TestList(validNewVolumeAttributesClass("foo")) +} + +func TestWatch(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := genericregistrytest.New(t, storage.Store).ClusterScope() + test.TestWatch( + validNewVolumeAttributesClass("foo"), + // matching labels + []labels.Set{}, + // not matching labels + []labels.Set{ + {"foo": "bar"}, + }, + // matching fields + []fields.Set{ + {"metadata.name": "foo"}, + }, + // not matching fields + []fields.Set{ + {"metadata.name": "bar"}, + }, + ) +} diff --git a/pkg/registry/storage/volumeattributesclass/strategy.go b/pkg/registry/storage/volumeattributesclass/strategy.go new file mode 100644 index 00000000000..d816c2599e1 --- /dev/null +++ b/pkg/registry/storage/volumeattributesclass/strategy.go @@ -0,0 +1,82 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package volumeattributesclass + +import ( + "context" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/apiserver/pkg/storage/names" + "k8s.io/kubernetes/pkg/api/legacyscheme" + "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/apis/storage/validation" +) + +// volumeAttributesClassStrategy implements behavior for VolumeAttributesClassStrategy objects +type volumeAttributesClassStrategy struct { + runtime.ObjectTyper + names.NameGenerator +} + +// Strategy is the default logic that applies when creating and updating +// VolumeAttributesClass objects via the REST API. +var Strategy = volumeAttributesClassStrategy{legacyscheme.Scheme, names.SimpleNameGenerator} + +func (volumeAttributesClassStrategy) NamespaceScoped() bool { + return false +} + +// ResetBeforeCreate clears the Status field which is not allowed to be set by end users on creation. +func (volumeAttributesClassStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { +} + +func (volumeAttributesClassStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { + volumeAttributesClass := obj.(*storage.VolumeAttributesClass) + return validation.ValidateVolumeAttributesClass(volumeAttributesClass) +} + +// WarningsOnCreate returns warnings for the creation of the given object. +func (volumeAttributesClassStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string { + return nil +} + +// Canonicalize normalizes the object after validation. +func (volumeAttributesClassStrategy) Canonicalize(obj runtime.Object) { +} + +func (volumeAttributesClassStrategy) AllowCreateOnUpdate() bool { + return false +} + +// PrepareForUpdate sets the Status fields which is not allowed to be set by an end user updating a PV +func (volumeAttributesClassStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { +} + +func (volumeAttributesClassStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { + errorList := validation.ValidateVolumeAttributesClass(obj.(*storage.VolumeAttributesClass)) + return append(errorList, validation.ValidateVolumeAttributesClassUpdate(obj.(*storage.VolumeAttributesClass), old.(*storage.VolumeAttributesClass))...) +} + +// WarningsOnUpdate returns warnings for the given update. +func (volumeAttributesClassStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string { + return nil +} + +func (volumeAttributesClassStrategy) AllowUnconditionalUpdate() bool { + return true +} diff --git a/pkg/registry/storage/volumeattributesclass/strategy_test.go b/pkg/registry/storage/volumeattributesclass/strategy_test.go new file mode 100644 index 00000000000..1a6fb1915a1 --- /dev/null +++ b/pkg/registry/storage/volumeattributesclass/strategy_test.go @@ -0,0 +1,70 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package volumeattributesclass + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/apis/storage" +) + +func TestVolumeAttributesClassStrategy(t *testing.T) { + ctx := genericapirequest.NewDefaultContext() + if Strategy.NamespaceScoped() { + t.Errorf("VolumeAttributesClassStrategy must not be namespace scoped") + } + if Strategy.AllowCreateOnUpdate() { + t.Errorf("VolumeAttributesClassStrategy should not allow create on update") + } + + class := &storage.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "valid-class", + }, + DriverName: "fake", + Parameters: map[string]string{ + "foo": "bar", + }, + } + + Strategy.PrepareForCreate(ctx, class) + + errs := Strategy.Validate(ctx, class) + if len(errs) != 0 { + t.Errorf("unexpected error validating %v", errs) + } + + newClass := &storage.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "valid-class-2", + ResourceVersion: "4", + }, + DriverName: "fake", + Parameters: map[string]string{ + "foo": "bar", + }, + } + + Strategy.PrepareForUpdate(ctx, newClass, class) + + errs = Strategy.ValidateUpdate(ctx, newClass, class) + if len(errs) == 0 { + t.Errorf("Expected a validation error") + } +} diff --git a/pkg/volume/util/volumeattributesclass.go b/pkg/volume/util/volumeattributesclass.go new file mode 100644 index 00000000000..06d551691f1 --- /dev/null +++ b/pkg/volume/util/volumeattributesclass.go @@ -0,0 +1,72 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "sort" + + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + storagev1alpha1listers "k8s.io/client-go/listers/storage/v1alpha1" + "k8s.io/klog/v2" +) + +const ( + // AlphaIsDefaultVolumeAttributesClassAnnotation is the alpha version of IsDefaultVolumeAttributesClassAnnotation. + AlphaIsDefaultVolumeAttributesClassAnnotation = "volumeattributesclass.alpha.kubernetes.io/is-default-class" +) + +// GetDefaultVolumeAttributesClass returns the default VolumeAttributesClass from the store, or nil. +func GetDefaultVolumeAttributesClass(lister storagev1alpha1listers.VolumeAttributesClassLister, driverName string) (*storagev1alpha1.VolumeAttributesClass, error) { + list, err := lister.List(labels.Everything()) + if err != nil { + return nil, err + } + + defaultClasses := []*storagev1alpha1.VolumeAttributesClass{} + for _, class := range list { + if IsDefaultVolumeAttributesClassAnnotation(class.ObjectMeta) && class.DriverName == driverName { + defaultClasses = append(defaultClasses, class) + klog.V(4).Infof("GetDefaultVolumeAttributesClass added: %s", class.Name) + } + } + + if len(defaultClasses) == 0 { + return nil, nil + } + + // Primary sort by creation timestamp, newest first + // Secondary sort by class name, ascending order + sort.Slice(defaultClasses, func(i, j int) bool { + if defaultClasses[i].CreationTimestamp.UnixNano() == defaultClasses[j].CreationTimestamp.UnixNano() { + return defaultClasses[i].Name < defaultClasses[j].Name + } + return defaultClasses[i].CreationTimestamp.UnixNano() > defaultClasses[j].CreationTimestamp.UnixNano() + }) + if len(defaultClasses) > 1 { + klog.V(4).Infof("%d default VolumeAttributesClass were found, choosing: %s", len(defaultClasses), defaultClasses[0].Name) + } + + return defaultClasses[0], nil +} + +// IsDefaultVolumeAttributesClassAnnotation returns a boolean if the default +// volume attributes class annotation is set +func IsDefaultVolumeAttributesClassAnnotation(obj metav1.ObjectMeta) bool { + return obj.Annotations[AlphaIsDefaultVolumeAttributesClassAnnotation] == "true" +} diff --git a/pkg/volume/util/volumeattributesclass_test.go b/pkg/volume/util/volumeattributesclass_test.go new file mode 100644 index 00000000000..31429d32f60 --- /dev/null +++ b/pkg/volume/util/volumeattributesclass_test.go @@ -0,0 +1,224 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "testing" + "time" + + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/informers" + "k8s.io/kubernetes/pkg/controller" +) + +func TestGetDefaultVolumeAttributesClass(t *testing.T) { + var ( + t1 = time.Now() + t2 = time.Now().Add(1 * time.Hour) + ) + + dirverName1 := "my-driver1" + vac1 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac1", + Annotations: map[string]string{ + "a": "b", + }, + }, + DriverName: dirverName1, + } + vac2 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac2", + Annotations: map[string]string{ + "a": "b", + }, + }, + DriverName: dirverName1, + } + vac3 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac3", + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "true", + }, + CreationTimestamp: metav1.Time{Time: t1}, + }, + DriverName: dirverName1, + } + vac4 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac4", + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "true", + }, + CreationTimestamp: metav1.Time{Time: t2}, + }, + DriverName: dirverName1, + } + vac5 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac5", + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "true", + }, + CreationTimestamp: metav1.Time{Time: t2}, + }, + DriverName: dirverName1, + } + + dirverName2 := "my-driver2" + vac6 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac6", + Annotations: map[string]string{ + "a": "b", + }, + }, + DriverName: dirverName2, + } + vac7 := &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-vac7", + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "true", + }, + }, + DriverName: dirverName2, + } + + testCases := []struct { + name string + driverName string + classes []*storagev1alpha1.VolumeAttributesClass + expect *storagev1alpha1.VolumeAttributesClass + }{ + { + name: "no volume attributes class", + driverName: dirverName1, + }, + { + name: "no default volume attributes class", + driverName: dirverName1, + classes: []*storagev1alpha1.VolumeAttributesClass{vac1, vac2, vac6}, + expect: nil, + }, + { + name: "no default volume attributes class for the driverName1", + driverName: dirverName1, + classes: []*storagev1alpha1.VolumeAttributesClass{vac1, vac2, vac6, vac7}, + expect: nil, + }, + { + name: "one default volume attributes class for the driverName1", + driverName: dirverName1, + classes: []*storagev1alpha1.VolumeAttributesClass{vac1, vac2, vac3, vac6, vac7}, + expect: vac3, + }, + { + name: "two default volume attributes class with different creation timestamp for the driverName1", + driverName: dirverName1, + classes: []*storagev1alpha1.VolumeAttributesClass{vac3, vac4, vac6, vac7}, + expect: vac4, + }, + { + name: "two default volume attributes class with same creation timestamp for the driverName1", + driverName: dirverName1, + classes: []*storagev1alpha1.VolumeAttributesClass{vac4, vac5, vac6, vac7}, + expect: vac4, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc()) + for _, c := range tc.classes { + err := informerFactory.Storage().V1alpha1().VolumeAttributesClasses().Informer().GetStore().Add(c) + if err != nil { + t.Errorf("Expected no error, got %v", err) + return + } + } + lister := informerFactory.Storage().V1alpha1().VolumeAttributesClasses().Lister() + actual, err := GetDefaultVolumeAttributesClass(lister, tc.driverName) + if err != nil { + t.Errorf("Expected no error, got %v", err) + return + } + if tc.expect != actual { + t.Errorf("Expected %v, got %v", tc.expect, actual) + } + }) + } +} + +func TestIsDefaultVolumeAttributesClassAnnotation(t *testing.T) { + testCases := []struct { + name string + class *storagev1alpha1.VolumeAttributesClass + expect bool + }{ + { + name: "no annotation", + class: &storagev1alpha1.VolumeAttributesClass{}, + expect: false, + }, + { + name: "annotation is not boolean", + class: &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "not-boolean", + }, + }, + }, + expect: false, + }, + { + name: "annotation is false", + class: &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "false", + }, + }, + }, + expect: false, + }, + { + name: "annotation is true", + class: &storagev1alpha1.VolumeAttributesClass{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + AlphaIsDefaultVolumeAttributesClassAnnotation: "true", + }, + }, + }, + expect: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + actual := IsDefaultVolumeAttributesClassAnnotation(tc.class.ObjectMeta) + if tc.expect != actual { + t.Errorf("Expected %v, got %v", tc.expect, actual) + } + }) + } +} diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 7cded1c22d7..46d188d6136 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -2429,10 +2429,38 @@ func (m *LocalVolumeSource) XXX_DiscardUnknown() { var xxx_messageInfo_LocalVolumeSource proto.InternalMessageInfo +func (m *ModifyVolumeStatus) Reset() { *m = ModifyVolumeStatus{} } +func (*ModifyVolumeStatus) ProtoMessage() {} +func (*ModifyVolumeStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_83c10c24ec417dc9, []int{85} +} +func (m *ModifyVolumeStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ModifyVolumeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ModifyVolumeStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_ModifyVolumeStatus.Merge(m, src) +} +func (m *ModifyVolumeStatus) XXX_Size() int { + return m.Size() +} +func (m *ModifyVolumeStatus) XXX_DiscardUnknown() { + xxx_messageInfo_ModifyVolumeStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_ModifyVolumeStatus proto.InternalMessageInfo + func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} func (*NFSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{85} + return fileDescriptor_83c10c24ec417dc9, []int{86} } func (m *NFSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2460,7 +2488,7 @@ var xxx_messageInfo_NFSVolumeSource proto.InternalMessageInfo func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{86} + return fileDescriptor_83c10c24ec417dc9, []int{87} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2488,7 +2516,7 @@ var xxx_messageInfo_Namespace proto.InternalMessageInfo func (m *NamespaceCondition) Reset() { *m = NamespaceCondition{} } func (*NamespaceCondition) ProtoMessage() {} func (*NamespaceCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{87} + return fileDescriptor_83c10c24ec417dc9, []int{88} } func (m *NamespaceCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2516,7 +2544,7 @@ var xxx_messageInfo_NamespaceCondition proto.InternalMessageInfo func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} func (*NamespaceList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{88} + return fileDescriptor_83c10c24ec417dc9, []int{89} } func (m *NamespaceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2544,7 +2572,7 @@ var xxx_messageInfo_NamespaceList proto.InternalMessageInfo func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{89} + return fileDescriptor_83c10c24ec417dc9, []int{90} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2572,7 +2600,7 @@ var xxx_messageInfo_NamespaceSpec proto.InternalMessageInfo func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} func (*NamespaceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{90} + return fileDescriptor_83c10c24ec417dc9, []int{91} } func (m *NamespaceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2600,7 +2628,7 @@ var xxx_messageInfo_NamespaceStatus proto.InternalMessageInfo func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} func (*Node) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{91} + return fileDescriptor_83c10c24ec417dc9, []int{92} } func (m *Node) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2628,7 +2656,7 @@ var xxx_messageInfo_Node proto.InternalMessageInfo func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{92} + return fileDescriptor_83c10c24ec417dc9, []int{93} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2684,7 @@ var xxx_messageInfo_NodeAddress proto.InternalMessageInfo func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} func (*NodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{93} + return fileDescriptor_83c10c24ec417dc9, []int{94} } func (m *NodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2684,7 +2712,7 @@ var xxx_messageInfo_NodeAffinity proto.InternalMessageInfo func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} func (*NodeCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{94} + return fileDescriptor_83c10c24ec417dc9, []int{95} } func (m *NodeCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2712,7 +2740,7 @@ var xxx_messageInfo_NodeCondition proto.InternalMessageInfo func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} func (*NodeConfigSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{95} + return fileDescriptor_83c10c24ec417dc9, []int{96} } func (m *NodeConfigSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2768,7 @@ var xxx_messageInfo_NodeConfigSource proto.InternalMessageInfo func (m *NodeConfigStatus) Reset() { *m = NodeConfigStatus{} } func (*NodeConfigStatus) ProtoMessage() {} func (*NodeConfigStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{96} + return fileDescriptor_83c10c24ec417dc9, []int{97} } func (m *NodeConfigStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2796,7 @@ var xxx_messageInfo_NodeConfigStatus proto.InternalMessageInfo func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{97} + return fileDescriptor_83c10c24ec417dc9, []int{98} } func (m *NodeDaemonEndpoints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2796,7 +2824,7 @@ var xxx_messageInfo_NodeDaemonEndpoints proto.InternalMessageInfo func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} func (*NodeList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{98} + return fileDescriptor_83c10c24ec417dc9, []int{99} } func (m *NodeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2824,7 +2852,7 @@ var xxx_messageInfo_NodeList proto.InternalMessageInfo func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} func (*NodeProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{99} + return fileDescriptor_83c10c24ec417dc9, []int{100} } func (m *NodeProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2852,7 +2880,7 @@ var xxx_messageInfo_NodeProxyOptions proto.InternalMessageInfo func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} func (*NodeResources) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{100} + return fileDescriptor_83c10c24ec417dc9, []int{101} } func (m *NodeResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2880,7 +2908,7 @@ var xxx_messageInfo_NodeResources proto.InternalMessageInfo func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} func (*NodeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{101} + return fileDescriptor_83c10c24ec417dc9, []int{102} } func (m *NodeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2908,7 +2936,7 @@ var xxx_messageInfo_NodeSelector proto.InternalMessageInfo func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{102} + return fileDescriptor_83c10c24ec417dc9, []int{103} } func (m *NodeSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2936,7 +2964,7 @@ var xxx_messageInfo_NodeSelectorRequirement proto.InternalMessageInfo func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{103} + return fileDescriptor_83c10c24ec417dc9, []int{104} } func (m *NodeSelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2964,7 +2992,7 @@ var xxx_messageInfo_NodeSelectorTerm proto.InternalMessageInfo func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} func (*NodeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{104} + return fileDescriptor_83c10c24ec417dc9, []int{105} } func (m *NodeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2992,7 +3020,7 @@ var xxx_messageInfo_NodeSpec proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{105} + return fileDescriptor_83c10c24ec417dc9, []int{106} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3020,7 +3048,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} func (*NodeSystemInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{106} + return fileDescriptor_83c10c24ec417dc9, []int{107} } func (m *NodeSystemInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3048,7 +3076,7 @@ var xxx_messageInfo_NodeSystemInfo proto.InternalMessageInfo func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{107} + return fileDescriptor_83c10c24ec417dc9, []int{108} } func (m *ObjectFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3076,7 +3104,7 @@ var xxx_messageInfo_ObjectFieldSelector proto.InternalMessageInfo func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} func (*ObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{108} + return fileDescriptor_83c10c24ec417dc9, []int{109} } func (m *ObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3104,7 +3132,7 @@ var xxx_messageInfo_ObjectReference proto.InternalMessageInfo func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} func (*PersistentVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{109} + return fileDescriptor_83c10c24ec417dc9, []int{110} } func (m *PersistentVolume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3132,7 +3160,7 @@ var xxx_messageInfo_PersistentVolume proto.InternalMessageInfo func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{110} + return fileDescriptor_83c10c24ec417dc9, []int{111} } func (m *PersistentVolumeClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3160,7 +3188,7 @@ var xxx_messageInfo_PersistentVolumeClaim proto.InternalMessageInfo func (m *PersistentVolumeClaimCondition) Reset() { *m = PersistentVolumeClaimCondition{} } func (*PersistentVolumeClaimCondition) ProtoMessage() {} func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{111} + return fileDescriptor_83c10c24ec417dc9, []int{112} } func (m *PersistentVolumeClaimCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3188,7 +3216,7 @@ var xxx_messageInfo_PersistentVolumeClaimCondition proto.InternalMessageInfo func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{112} + return fileDescriptor_83c10c24ec417dc9, []int{113} } func (m *PersistentVolumeClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3216,7 +3244,7 @@ var xxx_messageInfo_PersistentVolumeClaimList proto.InternalMessageInfo func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{113} + return fileDescriptor_83c10c24ec417dc9, []int{114} } func (m *PersistentVolumeClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3244,7 +3272,7 @@ var xxx_messageInfo_PersistentVolumeClaimSpec proto.InternalMessageInfo func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{114} + return fileDescriptor_83c10c24ec417dc9, []int{115} } func (m *PersistentVolumeClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3272,7 +3300,7 @@ var xxx_messageInfo_PersistentVolumeClaimStatus proto.InternalMessageInfo func (m *PersistentVolumeClaimTemplate) Reset() { *m = PersistentVolumeClaimTemplate{} } func (*PersistentVolumeClaimTemplate) ProtoMessage() {} func (*PersistentVolumeClaimTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{115} + return fileDescriptor_83c10c24ec417dc9, []int{116} } func (m *PersistentVolumeClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3328,7 @@ var xxx_messageInfo_PersistentVolumeClaimTemplate proto.InternalMessageInfo func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{116} + return fileDescriptor_83c10c24ec417dc9, []int{117} } func (m *PersistentVolumeClaimVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3328,7 +3356,7 @@ var xxx_messageInfo_PersistentVolumeClaimVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} func (*PersistentVolumeList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{117} + return fileDescriptor_83c10c24ec417dc9, []int{118} } func (m *PersistentVolumeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3356,7 +3384,7 @@ var xxx_messageInfo_PersistentVolumeList proto.InternalMessageInfo func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{118} + return fileDescriptor_83c10c24ec417dc9, []int{119} } func (m *PersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3412,7 @@ var xxx_messageInfo_PersistentVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{119} + return fileDescriptor_83c10c24ec417dc9, []int{120} } func (m *PersistentVolumeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3412,7 +3440,7 @@ var xxx_messageInfo_PersistentVolumeSpec proto.InternalMessageInfo func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{120} + return fileDescriptor_83c10c24ec417dc9, []int{121} } func (m *PersistentVolumeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3440,7 +3468,7 @@ var xxx_messageInfo_PersistentVolumeStatus proto.InternalMessageInfo func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{121} + return fileDescriptor_83c10c24ec417dc9, []int{122} } func (m *PhotonPersistentDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3468,7 +3496,7 @@ var xxx_messageInfo_PhotonPersistentDiskVolumeSource proto.InternalMessageInfo func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} func (*Pod) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{122} + return fileDescriptor_83c10c24ec417dc9, []int{123} } func (m *Pod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3496,7 +3524,7 @@ var xxx_messageInfo_Pod proto.InternalMessageInfo func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} func (*PodAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{123} + return fileDescriptor_83c10c24ec417dc9, []int{124} } func (m *PodAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3524,7 +3552,7 @@ var xxx_messageInfo_PodAffinity proto.InternalMessageInfo func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} func (*PodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{124} + return fileDescriptor_83c10c24ec417dc9, []int{125} } func (m *PodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3552,7 +3580,7 @@ var xxx_messageInfo_PodAffinityTerm proto.InternalMessageInfo func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} func (*PodAntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{125} + return fileDescriptor_83c10c24ec417dc9, []int{126} } func (m *PodAntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3580,7 +3608,7 @@ var xxx_messageInfo_PodAntiAffinity proto.InternalMessageInfo func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} func (*PodAttachOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{126} + return fileDescriptor_83c10c24ec417dc9, []int{127} } func (m *PodAttachOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3608,7 +3636,7 @@ var xxx_messageInfo_PodAttachOptions proto.InternalMessageInfo func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} func (*PodCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{127} + return fileDescriptor_83c10c24ec417dc9, []int{128} } func (m *PodCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3636,7 +3664,7 @@ var xxx_messageInfo_PodCondition proto.InternalMessageInfo func (m *PodDNSConfig) Reset() { *m = PodDNSConfig{} } func (*PodDNSConfig) ProtoMessage() {} func (*PodDNSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{128} + return fileDescriptor_83c10c24ec417dc9, []int{129} } func (m *PodDNSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3664,7 +3692,7 @@ var xxx_messageInfo_PodDNSConfig proto.InternalMessageInfo func (m *PodDNSConfigOption) Reset() { *m = PodDNSConfigOption{} } func (*PodDNSConfigOption) ProtoMessage() {} func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{129} + return fileDescriptor_83c10c24ec417dc9, []int{130} } func (m *PodDNSConfigOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3692,7 +3720,7 @@ var xxx_messageInfo_PodDNSConfigOption proto.InternalMessageInfo func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} func (*PodExecOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{130} + return fileDescriptor_83c10c24ec417dc9, []int{131} } func (m *PodExecOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3720,7 +3748,7 @@ var xxx_messageInfo_PodExecOptions proto.InternalMessageInfo func (m *PodIP) Reset() { *m = PodIP{} } func (*PodIP) ProtoMessage() {} func (*PodIP) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{131} + return fileDescriptor_83c10c24ec417dc9, []int{132} } func (m *PodIP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3748,7 +3776,7 @@ var xxx_messageInfo_PodIP proto.InternalMessageInfo func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} func (*PodList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{132} + return fileDescriptor_83c10c24ec417dc9, []int{133} } func (m *PodList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3776,7 +3804,7 @@ var xxx_messageInfo_PodList proto.InternalMessageInfo func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} func (*PodLogOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{133} + return fileDescriptor_83c10c24ec417dc9, []int{134} } func (m *PodLogOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3804,7 +3832,7 @@ var xxx_messageInfo_PodLogOptions proto.InternalMessageInfo func (m *PodOS) Reset() { *m = PodOS{} } func (*PodOS) ProtoMessage() {} func (*PodOS) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{134} + return fileDescriptor_83c10c24ec417dc9, []int{135} } func (m *PodOS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3832,7 +3860,7 @@ var xxx_messageInfo_PodOS proto.InternalMessageInfo func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{135} + return fileDescriptor_83c10c24ec417dc9, []int{136} } func (m *PodPortForwardOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3860,7 +3888,7 @@ var xxx_messageInfo_PodPortForwardOptions proto.InternalMessageInfo func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} func (*PodProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{136} + return fileDescriptor_83c10c24ec417dc9, []int{137} } func (m *PodProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3888,7 +3916,7 @@ var xxx_messageInfo_PodProxyOptions proto.InternalMessageInfo func (m *PodReadinessGate) Reset() { *m = PodReadinessGate{} } func (*PodReadinessGate) ProtoMessage() {} func (*PodReadinessGate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{137} + return fileDescriptor_83c10c24ec417dc9, []int{138} } func (m *PodReadinessGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3916,7 +3944,7 @@ var xxx_messageInfo_PodReadinessGate proto.InternalMessageInfo func (m *PodResourceClaim) Reset() { *m = PodResourceClaim{} } func (*PodResourceClaim) ProtoMessage() {} func (*PodResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{138} + return fileDescriptor_83c10c24ec417dc9, []int{139} } func (m *PodResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3944,7 +3972,7 @@ var xxx_messageInfo_PodResourceClaim proto.InternalMessageInfo func (m *PodResourceClaimStatus) Reset() { *m = PodResourceClaimStatus{} } func (*PodResourceClaimStatus) ProtoMessage() {} func (*PodResourceClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{139} + return fileDescriptor_83c10c24ec417dc9, []int{140} } func (m *PodResourceClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3972,7 +4000,7 @@ var xxx_messageInfo_PodResourceClaimStatus proto.InternalMessageInfo func (m *PodSchedulingGate) Reset() { *m = PodSchedulingGate{} } func (*PodSchedulingGate) ProtoMessage() {} func (*PodSchedulingGate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{140} + return fileDescriptor_83c10c24ec417dc9, []int{141} } func (m *PodSchedulingGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4000,7 +4028,7 @@ var xxx_messageInfo_PodSchedulingGate proto.InternalMessageInfo func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} func (*PodSecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{141} + return fileDescriptor_83c10c24ec417dc9, []int{142} } func (m *PodSecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4028,7 +4056,7 @@ var xxx_messageInfo_PodSecurityContext proto.InternalMessageInfo func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} func (*PodSignature) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{142} + return fileDescriptor_83c10c24ec417dc9, []int{143} } func (m *PodSignature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4056,7 +4084,7 @@ var xxx_messageInfo_PodSignature proto.InternalMessageInfo func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} func (*PodSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{143} + return fileDescriptor_83c10c24ec417dc9, []int{144} } func (m *PodSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4084,7 +4112,7 @@ var xxx_messageInfo_PodSpec proto.InternalMessageInfo func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} func (*PodStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{144} + return fileDescriptor_83c10c24ec417dc9, []int{145} } func (m *PodStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4112,7 +4140,7 @@ var xxx_messageInfo_PodStatus proto.InternalMessageInfo func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} func (*PodStatusResult) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{145} + return fileDescriptor_83c10c24ec417dc9, []int{146} } func (m *PodStatusResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4140,7 +4168,7 @@ var xxx_messageInfo_PodStatusResult proto.InternalMessageInfo func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} func (*PodTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{146} + return fileDescriptor_83c10c24ec417dc9, []int{147} } func (m *PodTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4168,7 +4196,7 @@ var xxx_messageInfo_PodTemplate proto.InternalMessageInfo func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} func (*PodTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{147} + return fileDescriptor_83c10c24ec417dc9, []int{148} } func (m *PodTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4196,7 +4224,7 @@ var xxx_messageInfo_PodTemplateList proto.InternalMessageInfo func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} func (*PodTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{148} + return fileDescriptor_83c10c24ec417dc9, []int{149} } func (m *PodTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4224,7 +4252,7 @@ var xxx_messageInfo_PodTemplateSpec proto.InternalMessageInfo func (m *PortStatus) Reset() { *m = PortStatus{} } func (*PortStatus) ProtoMessage() {} func (*PortStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{149} + return fileDescriptor_83c10c24ec417dc9, []int{150} } func (m *PortStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4252,7 +4280,7 @@ var xxx_messageInfo_PortStatus proto.InternalMessageInfo func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{150} + return fileDescriptor_83c10c24ec417dc9, []int{151} } func (m *PortworxVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4280,7 +4308,7 @@ var xxx_messageInfo_PortworxVolumeSource proto.InternalMessageInfo func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} func (*Preconditions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{151} + return fileDescriptor_83c10c24ec417dc9, []int{152} } func (m *Preconditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4308,7 +4336,7 @@ var xxx_messageInfo_Preconditions proto.InternalMessageInfo func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{152} + return fileDescriptor_83c10c24ec417dc9, []int{153} } func (m *PreferAvoidPodsEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4336,7 +4364,7 @@ var xxx_messageInfo_PreferAvoidPodsEntry proto.InternalMessageInfo func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{153} + return fileDescriptor_83c10c24ec417dc9, []int{154} } func (m *PreferredSchedulingTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4364,7 +4392,7 @@ var xxx_messageInfo_PreferredSchedulingTerm proto.InternalMessageInfo func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} func (*Probe) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{154} + return fileDescriptor_83c10c24ec417dc9, []int{155} } func (m *Probe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4392,7 +4420,7 @@ var xxx_messageInfo_Probe proto.InternalMessageInfo func (m *ProbeHandler) Reset() { *m = ProbeHandler{} } func (*ProbeHandler) ProtoMessage() {} func (*ProbeHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{155} + return fileDescriptor_83c10c24ec417dc9, []int{156} } func (m *ProbeHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4420,7 +4448,7 @@ var xxx_messageInfo_ProbeHandler proto.InternalMessageInfo func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{156} + return fileDescriptor_83c10c24ec417dc9, []int{157} } func (m *ProjectedVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4448,7 +4476,7 @@ var xxx_messageInfo_ProjectedVolumeSource proto.InternalMessageInfo func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{157} + return fileDescriptor_83c10c24ec417dc9, []int{158} } func (m *QuobyteVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4476,7 +4504,7 @@ var xxx_messageInfo_QuobyteVolumeSource proto.InternalMessageInfo func (m *RBDPersistentVolumeSource) Reset() { *m = RBDPersistentVolumeSource{} } func (*RBDPersistentVolumeSource) ProtoMessage() {} func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{158} + return fileDescriptor_83c10c24ec417dc9, []int{159} } func (m *RBDPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4504,7 +4532,7 @@ var xxx_messageInfo_RBDPersistentVolumeSource proto.InternalMessageInfo func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} func (*RBDVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{159} + return fileDescriptor_83c10c24ec417dc9, []int{160} } func (m *RBDVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4532,7 +4560,7 @@ var xxx_messageInfo_RBDVolumeSource proto.InternalMessageInfo func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} func (*RangeAllocation) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{160} + return fileDescriptor_83c10c24ec417dc9, []int{161} } func (m *RangeAllocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4560,7 +4588,7 @@ var xxx_messageInfo_RangeAllocation proto.InternalMessageInfo func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} func (*ReplicationController) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{161} + return fileDescriptor_83c10c24ec417dc9, []int{162} } func (m *ReplicationController) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4588,7 +4616,7 @@ var xxx_messageInfo_ReplicationController proto.InternalMessageInfo func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{162} + return fileDescriptor_83c10c24ec417dc9, []int{163} } func (m *ReplicationControllerCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4616,7 +4644,7 @@ var xxx_messageInfo_ReplicationControllerCondition proto.InternalMessageInfo func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{163} + return fileDescriptor_83c10c24ec417dc9, []int{164} } func (m *ReplicationControllerList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4644,7 +4672,7 @@ var xxx_messageInfo_ReplicationControllerList proto.InternalMessageInfo func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{164} + return fileDescriptor_83c10c24ec417dc9, []int{165} } func (m *ReplicationControllerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4672,7 +4700,7 @@ var xxx_messageInfo_ReplicationControllerSpec proto.InternalMessageInfo func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{165} + return fileDescriptor_83c10c24ec417dc9, []int{166} } func (m *ReplicationControllerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4700,7 +4728,7 @@ var xxx_messageInfo_ReplicationControllerStatus proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{166} + return fileDescriptor_83c10c24ec417dc9, []int{167} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4728,7 +4756,7 @@ var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{167} + return fileDescriptor_83c10c24ec417dc9, []int{168} } func (m *ResourceFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4756,7 +4784,7 @@ var xxx_messageInfo_ResourceFieldSelector proto.InternalMessageInfo func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} func (*ResourceQuota) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{168} + return fileDescriptor_83c10c24ec417dc9, []int{169} } func (m *ResourceQuota) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4784,7 +4812,7 @@ var xxx_messageInfo_ResourceQuota proto.InternalMessageInfo func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} func (*ResourceQuotaList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{169} + return fileDescriptor_83c10c24ec417dc9, []int{170} } func (m *ResourceQuotaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4812,7 +4840,7 @@ var xxx_messageInfo_ResourceQuotaList proto.InternalMessageInfo func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{170} + return fileDescriptor_83c10c24ec417dc9, []int{171} } func (m *ResourceQuotaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4840,7 +4868,7 @@ var xxx_messageInfo_ResourceQuotaSpec proto.InternalMessageInfo func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{171} + return fileDescriptor_83c10c24ec417dc9, []int{172} } func (m *ResourceQuotaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4868,7 +4896,7 @@ var xxx_messageInfo_ResourceQuotaStatus proto.InternalMessageInfo func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} func (*ResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{172} + return fileDescriptor_83c10c24ec417dc9, []int{173} } func (m *ResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4896,7 +4924,7 @@ var xxx_messageInfo_ResourceRequirements proto.InternalMessageInfo func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} func (*SELinuxOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{173} + return fileDescriptor_83c10c24ec417dc9, []int{174} } func (m *SELinuxOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4924,7 +4952,7 @@ var xxx_messageInfo_SELinuxOptions proto.InternalMessageInfo func (m *ScaleIOPersistentVolumeSource) Reset() { *m = ScaleIOPersistentVolumeSource{} } func (*ScaleIOPersistentVolumeSource) ProtoMessage() {} func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{174} + return fileDescriptor_83c10c24ec417dc9, []int{175} } func (m *ScaleIOPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4952,7 +4980,7 @@ var xxx_messageInfo_ScaleIOPersistentVolumeSource proto.InternalMessageInfo func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{175} + return fileDescriptor_83c10c24ec417dc9, []int{176} } func (m *ScaleIOVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4980,7 +5008,7 @@ var xxx_messageInfo_ScaleIOVolumeSource proto.InternalMessageInfo func (m *ScopeSelector) Reset() { *m = ScopeSelector{} } func (*ScopeSelector) ProtoMessage() {} func (*ScopeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{176} + return fileDescriptor_83c10c24ec417dc9, []int{177} } func (m *ScopeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5008,7 +5036,7 @@ var xxx_messageInfo_ScopeSelector proto.InternalMessageInfo func (m *ScopedResourceSelectorRequirement) Reset() { *m = ScopedResourceSelectorRequirement{} } func (*ScopedResourceSelectorRequirement) ProtoMessage() {} func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{177} + return fileDescriptor_83c10c24ec417dc9, []int{178} } func (m *ScopedResourceSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5036,7 +5064,7 @@ var xxx_messageInfo_ScopedResourceSelectorRequirement proto.InternalMessageInfo func (m *SeccompProfile) Reset() { *m = SeccompProfile{} } func (*SeccompProfile) ProtoMessage() {} func (*SeccompProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{178} + return fileDescriptor_83c10c24ec417dc9, []int{179} } func (m *SeccompProfile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5064,7 +5092,7 @@ var xxx_messageInfo_SeccompProfile proto.InternalMessageInfo func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{179} + return fileDescriptor_83c10c24ec417dc9, []int{180} } func (m *Secret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5092,7 +5120,7 @@ var xxx_messageInfo_Secret proto.InternalMessageInfo func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} func (*SecretEnvSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{180} + return fileDescriptor_83c10c24ec417dc9, []int{181} } func (m *SecretEnvSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5120,7 +5148,7 @@ var xxx_messageInfo_SecretEnvSource proto.InternalMessageInfo func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} func (*SecretKeySelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{181} + return fileDescriptor_83c10c24ec417dc9, []int{182} } func (m *SecretKeySelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5148,7 +5176,7 @@ var xxx_messageInfo_SecretKeySelector proto.InternalMessageInfo func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} func (*SecretList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{182} + return fileDescriptor_83c10c24ec417dc9, []int{183} } func (m *SecretList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5176,7 +5204,7 @@ var xxx_messageInfo_SecretList proto.InternalMessageInfo func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} func (*SecretProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{183} + return fileDescriptor_83c10c24ec417dc9, []int{184} } func (m *SecretProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5204,7 +5232,7 @@ var xxx_messageInfo_SecretProjection proto.InternalMessageInfo func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} func (*SecretReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{184} + return fileDescriptor_83c10c24ec417dc9, []int{185} } func (m *SecretReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5232,7 +5260,7 @@ var xxx_messageInfo_SecretReference proto.InternalMessageInfo func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} func (*SecretVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{185} + return fileDescriptor_83c10c24ec417dc9, []int{186} } func (m *SecretVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5260,7 +5288,7 @@ var xxx_messageInfo_SecretVolumeSource proto.InternalMessageInfo func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} func (*SecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{186} + return fileDescriptor_83c10c24ec417dc9, []int{187} } func (m *SecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5288,7 +5316,7 @@ var xxx_messageInfo_SecurityContext proto.InternalMessageInfo func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} func (*SerializedReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{187} + return fileDescriptor_83c10c24ec417dc9, []int{188} } func (m *SerializedReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5316,7 +5344,7 @@ var xxx_messageInfo_SerializedReference proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{188} + return fileDescriptor_83c10c24ec417dc9, []int{189} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5344,7 +5372,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} func (*ServiceAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{189} + return fileDescriptor_83c10c24ec417dc9, []int{190} } func (m *ServiceAccount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5372,7 +5400,7 @@ var xxx_messageInfo_ServiceAccount proto.InternalMessageInfo func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} func (*ServiceAccountList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{190} + return fileDescriptor_83c10c24ec417dc9, []int{191} } func (m *ServiceAccountList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5400,7 +5428,7 @@ var xxx_messageInfo_ServiceAccountList proto.InternalMessageInfo func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } func (*ServiceAccountTokenProjection) ProtoMessage() {} func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{191} + return fileDescriptor_83c10c24ec417dc9, []int{192} } func (m *ServiceAccountTokenProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5428,7 +5456,7 @@ var xxx_messageInfo_ServiceAccountTokenProjection proto.InternalMessageInfo func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} func (*ServiceList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{192} + return fileDescriptor_83c10c24ec417dc9, []int{193} } func (m *ServiceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5456,7 +5484,7 @@ var xxx_messageInfo_ServiceList proto.InternalMessageInfo func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} func (*ServicePort) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{193} + return fileDescriptor_83c10c24ec417dc9, []int{194} } func (m *ServicePort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5484,7 +5512,7 @@ var xxx_messageInfo_ServicePort proto.InternalMessageInfo func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{194} + return fileDescriptor_83c10c24ec417dc9, []int{195} } func (m *ServiceProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5512,7 +5540,7 @@ var xxx_messageInfo_ServiceProxyOptions proto.InternalMessageInfo func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} func (*ServiceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{195} + return fileDescriptor_83c10c24ec417dc9, []int{196} } func (m *ServiceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5540,7 +5568,7 @@ var xxx_messageInfo_ServiceSpec proto.InternalMessageInfo func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} func (*ServiceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{196} + return fileDescriptor_83c10c24ec417dc9, []int{197} } func (m *ServiceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5568,7 +5596,7 @@ var xxx_messageInfo_ServiceStatus proto.InternalMessageInfo func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{197} + return fileDescriptor_83c10c24ec417dc9, []int{198} } func (m *SessionAffinityConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5596,7 +5624,7 @@ var xxx_messageInfo_SessionAffinityConfig proto.InternalMessageInfo func (m *SleepAction) Reset() { *m = SleepAction{} } func (*SleepAction) ProtoMessage() {} func (*SleepAction) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{198} + return fileDescriptor_83c10c24ec417dc9, []int{199} } func (m *SleepAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5624,7 +5652,7 @@ var xxx_messageInfo_SleepAction proto.InternalMessageInfo func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{199} + return fileDescriptor_83c10c24ec417dc9, []int{200} } func (m *StorageOSPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5652,7 +5680,7 @@ var xxx_messageInfo_StorageOSPersistentVolumeSource proto.InternalMessageInfo func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{200} + return fileDescriptor_83c10c24ec417dc9, []int{201} } func (m *StorageOSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5680,7 +5708,7 @@ var xxx_messageInfo_StorageOSVolumeSource proto.InternalMessageInfo func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} func (*Sysctl) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{201} + return fileDescriptor_83c10c24ec417dc9, []int{202} } func (m *Sysctl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5708,7 +5736,7 @@ var xxx_messageInfo_Sysctl proto.InternalMessageInfo func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} func (*TCPSocketAction) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{202} + return fileDescriptor_83c10c24ec417dc9, []int{203} } func (m *TCPSocketAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5736,7 +5764,7 @@ var xxx_messageInfo_TCPSocketAction proto.InternalMessageInfo func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} func (*Taint) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{203} + return fileDescriptor_83c10c24ec417dc9, []int{204} } func (m *Taint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5764,7 +5792,7 @@ var xxx_messageInfo_Taint proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{204} + return fileDescriptor_83c10c24ec417dc9, []int{205} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5792,7 +5820,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelectorLabelRequirement{} } func (*TopologySelectorLabelRequirement) ProtoMessage() {} func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{205} + return fileDescriptor_83c10c24ec417dc9, []int{206} } func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5820,7 +5848,7 @@ var xxx_messageInfo_TopologySelectorLabelRequirement proto.InternalMessageInfo func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} } func (*TopologySelectorTerm) ProtoMessage() {} func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{206} + return fileDescriptor_83c10c24ec417dc9, []int{207} } func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5848,7 +5876,7 @@ var xxx_messageInfo_TopologySelectorTerm proto.InternalMessageInfo func (m *TopologySpreadConstraint) Reset() { *m = TopologySpreadConstraint{} } func (*TopologySpreadConstraint) ProtoMessage() {} func (*TopologySpreadConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{207} + return fileDescriptor_83c10c24ec417dc9, []int{208} } func (m *TopologySpreadConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5876,7 +5904,7 @@ var xxx_messageInfo_TopologySpreadConstraint proto.InternalMessageInfo func (m *TypedLocalObjectReference) Reset() { *m = TypedLocalObjectReference{} } func (*TypedLocalObjectReference) ProtoMessage() {} func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{208} + return fileDescriptor_83c10c24ec417dc9, []int{209} } func (m *TypedLocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5904,7 +5932,7 @@ var xxx_messageInfo_TypedLocalObjectReference proto.InternalMessageInfo func (m *TypedObjectReference) Reset() { *m = TypedObjectReference{} } func (*TypedObjectReference) ProtoMessage() {} func (*TypedObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{209} + return fileDescriptor_83c10c24ec417dc9, []int{210} } func (m *TypedObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5932,7 +5960,7 @@ var xxx_messageInfo_TypedObjectReference proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{210} + return fileDescriptor_83c10c24ec417dc9, []int{211} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5960,7 +5988,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} func (*VolumeDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{211} + return fileDescriptor_83c10c24ec417dc9, []int{212} } func (m *VolumeDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5988,7 +6016,7 @@ var xxx_messageInfo_VolumeDevice proto.InternalMessageInfo func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} func (*VolumeMount) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{212} + return fileDescriptor_83c10c24ec417dc9, []int{213} } func (m *VolumeMount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6016,7 +6044,7 @@ var xxx_messageInfo_VolumeMount proto.InternalMessageInfo func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{213} + return fileDescriptor_83c10c24ec417dc9, []int{214} } func (m *VolumeNodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6044,7 +6072,7 @@ var xxx_messageInfo_VolumeNodeAffinity proto.InternalMessageInfo func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} func (*VolumeProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{214} + return fileDescriptor_83c10c24ec417dc9, []int{215} } func (m *VolumeProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6072,7 +6100,7 @@ var xxx_messageInfo_VolumeProjection proto.InternalMessageInfo func (m *VolumeResourceRequirements) Reset() { *m = VolumeResourceRequirements{} } func (*VolumeResourceRequirements) ProtoMessage() {} func (*VolumeResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{215} + return fileDescriptor_83c10c24ec417dc9, []int{216} } func (m *VolumeResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6100,7 +6128,7 @@ var xxx_messageInfo_VolumeResourceRequirements proto.InternalMessageInfo func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} func (*VolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{216} + return fileDescriptor_83c10c24ec417dc9, []int{217} } func (m *VolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6128,7 +6156,7 @@ var xxx_messageInfo_VolumeSource proto.InternalMessageInfo func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{217} + return fileDescriptor_83c10c24ec417dc9, []int{218} } func (m *VsphereVirtualDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6156,7 +6184,7 @@ var xxx_messageInfo_VsphereVirtualDiskVolumeSource proto.InternalMessageInfo func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{218} + return fileDescriptor_83c10c24ec417dc9, []int{219} } func (m *WeightedPodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6184,7 +6212,7 @@ var xxx_messageInfo_WeightedPodAffinityTerm proto.InternalMessageInfo func (m *WindowsSecurityContextOptions) Reset() { *m = WindowsSecurityContextOptions{} } func (*WindowsSecurityContextOptions) ProtoMessage() {} func (*WindowsSecurityContextOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{219} + return fileDescriptor_83c10c24ec417dc9, []int{220} } func (m *WindowsSecurityContextOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6307,6 +6335,7 @@ func init() { proto.RegisterType((*LoadBalancerStatus)(nil), "k8s.io.api.core.v1.LoadBalancerStatus") proto.RegisterType((*LocalObjectReference)(nil), "k8s.io.api.core.v1.LocalObjectReference") proto.RegisterType((*LocalVolumeSource)(nil), "k8s.io.api.core.v1.LocalVolumeSource") + proto.RegisterType((*ModifyVolumeStatus)(nil), "k8s.io.api.core.v1.ModifyVolumeStatus") proto.RegisterType((*NFSVolumeSource)(nil), "k8s.io.api.core.v1.NFSVolumeSource") proto.RegisterType((*Namespace)(nil), "k8s.io.api.core.v1.Namespace") proto.RegisterType((*NamespaceCondition)(nil), "k8s.io.api.core.v1.NamespaceCondition") @@ -6469,959 +6498,967 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 15230 bytes of a gzipped FileDescriptorProto + // 15357 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x1c, 0xc9, 0x75, 0x18, 0xcc, 0xea, 0x9e, 0xab, 0xdf, 0xdc, 0x39, 0x00, 0x76, 0x30, 0x0b, 0xa0, 0xb1, 0xb5, - 0xbb, 0x58, 0xec, 0x35, 0x20, 0xf6, 0x20, 0x97, 0xbb, 0xcb, 0x15, 0xe7, 0x04, 0x7a, 0x81, 0x19, - 0xf4, 0x66, 0x0f, 0x00, 0x72, 0xb9, 0xe4, 0xc7, 0x42, 0x77, 0xce, 0x4c, 0x71, 0x7a, 0xaa, 0x7a, - 0xab, 0xaa, 0x07, 0x18, 0x7c, 0x64, 0x48, 0xa2, 0x3e, 0x51, 0x22, 0xa5, 0xef, 0x0b, 0xc6, 0x17, - 0xfa, 0x8e, 0xa0, 0x14, 0x8a, 0x2f, 0x24, 0x7d, 0x96, 0x64, 0x4a, 0xb2, 0x69, 0xca, 0x92, 0x2c, - 0xea, 0xf2, 0x15, 0x96, 0x1c, 0x0e, 0x59, 0x56, 0x84, 0x45, 0x45, 0x28, 0x3c, 0x12, 0x21, 0x47, - 0xc8, 0xfa, 0x61, 0x49, 0x3e, 0x7e, 0xd8, 0x63, 0xd9, 0x72, 0xe4, 0x59, 0x99, 0x75, 0x74, 0xf7, - 0x60, 0x07, 0xc3, 0x25, 0x63, 0xff, 0x75, 0xbf, 0xf7, 0xf2, 0x65, 0x56, 0x9e, 0x2f, 0xdf, 0x7b, - 0xf9, 0x1e, 0xbc, 0xb2, 0xf5, 0x52, 0x38, 0xeb, 0xfa, 0x17, 0xb6, 0xda, 0xb7, 0x48, 0xe0, 0x91, - 0x88, 0x84, 0x17, 0x76, 0x88, 0xd7, 0xf0, 0x83, 0x0b, 0x02, 0xe1, 0xb4, 0xdc, 0x0b, 0x75, 0x3f, - 0x20, 0x17, 0x76, 0x2e, 0x5e, 0xd8, 0x20, 0x1e, 0x09, 0x9c, 0x88, 0x34, 0x66, 0x5b, 0x81, 0x1f, - 0xf9, 0x08, 0x71, 0x9a, 0x59, 0xa7, 0xe5, 0xce, 0x52, 0x9a, 0xd9, 0x9d, 0x8b, 0x33, 0xcf, 0x6e, - 0xb8, 0xd1, 0x66, 0xfb, 0xd6, 0x6c, 0xdd, 0xdf, 0xbe, 0xb0, 0xe1, 0x6f, 0xf8, 0x17, 0x18, 0xe9, - 0xad, 0xf6, 0x3a, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc5, 0xcc, 0x0b, 0x71, 0x35, 0xdb, 0x4e, - 0x7d, 0xd3, 0xf5, 0x48, 0xb0, 0x7b, 0xa1, 0xb5, 0xb5, 0xc1, 0xea, 0x0d, 0x48, 0xe8, 0xb7, 0x83, - 0x3a, 0x49, 0x56, 0xdc, 0xb1, 0x54, 0x78, 0x61, 0x9b, 0x44, 0x4e, 0x46, 0x73, 0x67, 0x2e, 0xe4, - 0x95, 0x0a, 0xda, 0x5e, 0xe4, 0x6e, 0xa7, 0xab, 0xf9, 0x40, 0xb7, 0x02, 0x61, 0x7d, 0x93, 0x6c, - 0x3b, 0xa9, 0x72, 0xcf, 0xe7, 0x95, 0x6b, 0x47, 0x6e, 0xf3, 0x82, 0xeb, 0x45, 0x61, 0x14, 0x24, - 0x0b, 0xd9, 0xdf, 0xb0, 0xe0, 0xec, 0xdc, 0xcd, 0xda, 0x52, 0xd3, 0x09, 0x23, 0xb7, 0x3e, 0xdf, - 0xf4, 0xeb, 0x5b, 0xb5, 0xc8, 0x0f, 0xc8, 0x0d, 0xbf, 0xd9, 0xde, 0x26, 0x35, 0xd6, 0x11, 0xe8, - 0x19, 0x18, 0xda, 0x61, 0xff, 0x2b, 0x8b, 0xd3, 0xd6, 0x59, 0xeb, 0x7c, 0x69, 0x7e, 0xe2, 0xb7, - 0xf7, 0xca, 0xef, 0xbb, 0xb7, 0x57, 0x1e, 0xba, 0x21, 0xe0, 0x58, 0x51, 0xa0, 0x73, 0x30, 0xb0, - 0x1e, 0xae, 0xed, 0xb6, 0xc8, 0x74, 0x81, 0xd1, 0x8e, 0x09, 0xda, 0x81, 0xe5, 0x1a, 0x85, 0x62, - 0x81, 0x45, 0x17, 0xa0, 0xd4, 0x72, 0x82, 0xc8, 0x8d, 0x5c, 0xdf, 0x9b, 0x2e, 0x9e, 0xb5, 0xce, - 0xf7, 0xcf, 0x4f, 0x0a, 0xd2, 0x52, 0x55, 0x22, 0x70, 0x4c, 0x43, 0x9b, 0x11, 0x10, 0xa7, 0x71, - 0xcd, 0x6b, 0xee, 0x4e, 0xf7, 0x9d, 0xb5, 0xce, 0x0f, 0xc5, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, - 0xfd, 0xe5, 0x02, 0x0c, 0xcd, 0xad, 0xaf, 0xbb, 0x9e, 0x1b, 0xed, 0xa2, 0x1b, 0x30, 0xe2, 0xf9, - 0x0d, 0x22, 0xff, 0xb3, 0xaf, 0x18, 0x7e, 0xee, 0xec, 0x6c, 0x7a, 0x2a, 0xcd, 0xae, 0x6a, 0x74, - 0xf3, 0x13, 0xf7, 0xf6, 0xca, 0x23, 0x3a, 0x04, 0x1b, 0x7c, 0x10, 0x86, 0xe1, 0x96, 0xdf, 0x50, - 0x6c, 0x0b, 0x8c, 0x6d, 0x39, 0x8b, 0x6d, 0x35, 0x26, 0x9b, 0x1f, 0xbf, 0xb7, 0x57, 0x1e, 0xd6, - 0x00, 0x58, 0x67, 0x82, 0x6e, 0xc1, 0x38, 0xfd, 0xeb, 0x45, 0xae, 0xe2, 0x5b, 0x64, 0x7c, 0x1f, - 0xcd, 0xe3, 0xab, 0x91, 0xce, 0x4f, 0xdd, 0xdb, 0x2b, 0x8f, 0x27, 0x80, 0x38, 0xc9, 0xd0, 0xbe, - 0x0b, 0x63, 0x73, 0x51, 0xe4, 0xd4, 0x37, 0x49, 0x83, 0x8f, 0x20, 0x7a, 0x01, 0xfa, 0x3c, 0x67, - 0x9b, 0x88, 0xf1, 0x3d, 0x2b, 0x3a, 0xb6, 0x6f, 0xd5, 0xd9, 0x26, 0xfb, 0x7b, 0xe5, 0x89, 0xeb, - 0x9e, 0xfb, 0x76, 0x5b, 0xcc, 0x0a, 0x0a, 0xc3, 0x8c, 0x1a, 0x3d, 0x07, 0xd0, 0x20, 0x3b, 0x6e, - 0x9d, 0x54, 0x9d, 0x68, 0x53, 0x8c, 0x37, 0x12, 0x65, 0x61, 0x51, 0x61, 0xb0, 0x46, 0x65, 0xdf, - 0x81, 0xd2, 0xdc, 0x8e, 0xef, 0x36, 0xaa, 0x7e, 0x23, 0x44, 0x5b, 0x30, 0xde, 0x0a, 0xc8, 0x3a, - 0x09, 0x14, 0x68, 0xda, 0x3a, 0x5b, 0x3c, 0x3f, 0xfc, 0xdc, 0xf9, 0xcc, 0x8f, 0x35, 0x49, 0x97, - 0xbc, 0x28, 0xd8, 0x9d, 0x7f, 0x48, 0xd4, 0x37, 0x9e, 0xc0, 0xe2, 0x24, 0x67, 0xfb, 0x9f, 0x14, - 0xe0, 0xf8, 0xdc, 0xdd, 0x76, 0x40, 0x16, 0xdd, 0x70, 0x2b, 0x39, 0xc3, 0x1b, 0x6e, 0xb8, 0xb5, - 0x1a, 0xf7, 0x80, 0x9a, 0x5a, 0x8b, 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x16, 0x06, 0xe9, 0xef, 0xeb, - 0xb8, 0x22, 0x3e, 0x79, 0x4a, 0x10, 0x0f, 0x2f, 0x3a, 0x91, 0xb3, 0xc8, 0x51, 0x58, 0xd2, 0xa0, - 0x15, 0x18, 0xae, 0xb3, 0x05, 0xb9, 0xb1, 0xe2, 0x37, 0x08, 0x1b, 0xcc, 0xd2, 0xfc, 0xd3, 0x94, - 0x7c, 0x21, 0x06, 0xef, 0xef, 0x95, 0xa7, 0x79, 0xdb, 0x04, 0x0b, 0x0d, 0x87, 0xf5, 0xf2, 0xc8, - 0x56, 0xeb, 0xab, 0x8f, 0x71, 0x82, 0x8c, 0xb5, 0x75, 0x5e, 0x5b, 0x2a, 0xfd, 0x6c, 0xa9, 0x8c, - 0x64, 0x2f, 0x13, 0x74, 0x11, 0xfa, 0xb6, 0x5c, 0xaf, 0x31, 0x3d, 0xc0, 0x78, 0x9d, 0xa6, 0x63, - 0x7e, 0xc5, 0xf5, 0x1a, 0xfb, 0x7b, 0xe5, 0x49, 0xa3, 0x39, 0x14, 0x88, 0x19, 0xa9, 0xfd, 0x9f, - 0x2c, 0x28, 0x33, 0xdc, 0xb2, 0xdb, 0x24, 0x55, 0x12, 0x84, 0x6e, 0x18, 0x11, 0x2f, 0x32, 0x3a, - 0xf4, 0x39, 0x80, 0x90, 0xd4, 0x03, 0x12, 0x69, 0x5d, 0xaa, 0x26, 0x46, 0x4d, 0x61, 0xb0, 0x46, - 0x45, 0x37, 0x84, 0x70, 0xd3, 0x09, 0xd8, 0xfc, 0x12, 0x1d, 0xab, 0x36, 0x84, 0x9a, 0x44, 0xe0, - 0x98, 0xc6, 0xd8, 0x10, 0x8a, 0xdd, 0x36, 0x04, 0xf4, 0x61, 0x18, 0x8f, 0x2b, 0x0b, 0x5b, 0x4e, - 0x5d, 0x76, 0x20, 0x5b, 0x32, 0x35, 0x13, 0x85, 0x93, 0xb4, 0xf6, 0xdf, 0xb6, 0xc4, 0xe4, 0xa1, - 0x5f, 0xfd, 0x2e, 0xff, 0x56, 0xfb, 0x57, 0x2c, 0x18, 0x9c, 0x77, 0xbd, 0x86, 0xeb, 0x6d, 0xa0, - 0x4f, 0xc1, 0x10, 0x3d, 0x9b, 0x1a, 0x4e, 0xe4, 0x88, 0x7d, 0xef, 0xfd, 0xda, 0xda, 0x52, 0x47, - 0xc5, 0x6c, 0x6b, 0x6b, 0x83, 0x02, 0xc2, 0x59, 0x4a, 0x4d, 0x57, 0xdb, 0xb5, 0x5b, 0x9f, 0x26, - 0xf5, 0x68, 0x85, 0x44, 0x4e, 0xfc, 0x39, 0x31, 0x0c, 0x2b, 0xae, 0xe8, 0x0a, 0x0c, 0x44, 0x4e, - 0xb0, 0x41, 0x22, 0xb1, 0x01, 0x66, 0x6e, 0x54, 0xbc, 0x24, 0xa6, 0x2b, 0x92, 0x78, 0x75, 0x12, - 0x1f, 0x0b, 0x6b, 0xac, 0x28, 0x16, 0x2c, 0xec, 0xff, 0x3e, 0x08, 0x27, 0x17, 0x6a, 0x95, 0x9c, - 0x79, 0x75, 0x0e, 0x06, 0x1a, 0x81, 0xbb, 0x43, 0x02, 0xd1, 0xcf, 0x8a, 0xcb, 0x22, 0x83, 0x62, - 0x81, 0x45, 0x2f, 0xc1, 0x08, 0x3f, 0x90, 0x2e, 0x3b, 0x5e, 0xa3, 0x29, 0xbb, 0xf8, 0x98, 0xa0, - 0x1e, 0xb9, 0xa1, 0xe1, 0xb0, 0x41, 0x79, 0xc0, 0x49, 0x75, 0x2e, 0xb1, 0x18, 0xf3, 0x0e, 0xbb, - 0x2f, 0x58, 0x30, 0xc1, 0xab, 0x99, 0x8b, 0xa2, 0xc0, 0xbd, 0xd5, 0x8e, 0x48, 0x38, 0xdd, 0xcf, - 0x76, 0xba, 0x85, 0xac, 0xde, 0xca, 0xed, 0x81, 0xd9, 0x1b, 0x09, 0x2e, 0x7c, 0x13, 0x9c, 0x16, - 0xf5, 0x4e, 0x24, 0xd1, 0x38, 0x55, 0x2d, 0xfa, 0x3e, 0x0b, 0x66, 0xea, 0xbe, 0x17, 0x05, 0x7e, - 0xb3, 0x49, 0x82, 0x6a, 0xfb, 0x56, 0xd3, 0x0d, 0x37, 0xf9, 0x3c, 0xc5, 0x64, 0x9d, 0xed, 0x04, - 0x39, 0x63, 0xa8, 0x88, 0xc4, 0x18, 0x9e, 0xb9, 0xb7, 0x57, 0x9e, 0x59, 0xc8, 0x65, 0x85, 0x3b, - 0x54, 0x83, 0xb6, 0x00, 0xd1, 0xa3, 0xb4, 0x16, 0x39, 0x1b, 0x24, 0xae, 0x7c, 0xb0, 0xf7, 0xca, - 0x4f, 0xdc, 0xdb, 0x2b, 0xa3, 0xd5, 0x14, 0x0b, 0x9c, 0xc1, 0x16, 0xbd, 0x0d, 0xc7, 0x28, 0x34, - 0xf5, 0xad, 0x43, 0xbd, 0x57, 0x37, 0x7d, 0x6f, 0xaf, 0x7c, 0x6c, 0x35, 0x83, 0x09, 0xce, 0x64, - 0x8d, 0xbe, 0xc7, 0x82, 0x93, 0xf1, 0xe7, 0x2f, 0xdd, 0x69, 0x39, 0x5e, 0x23, 0xae, 0xb8, 0xd4, - 0x7b, 0xc5, 0x74, 0x4f, 0x3e, 0xb9, 0x90, 0xc7, 0x09, 0xe7, 0x57, 0x82, 0x3c, 0x98, 0xa2, 0x4d, - 0x4b, 0xd6, 0x0d, 0xbd, 0xd7, 0xfd, 0xd0, 0xbd, 0xbd, 0xf2, 0xd4, 0x6a, 0x9a, 0x07, 0xce, 0x62, - 0x3c, 0xb3, 0x00, 0xc7, 0x33, 0x67, 0x27, 0x9a, 0x80, 0xe2, 0x16, 0xe1, 0x52, 0x57, 0x09, 0xd3, - 0x9f, 0xe8, 0x18, 0xf4, 0xef, 0x38, 0xcd, 0xb6, 0x58, 0x98, 0x98, 0xff, 0x79, 0xb9, 0xf0, 0x92, - 0x65, 0xff, 0xd3, 0x22, 0x8c, 0x2f, 0xd4, 0x2a, 0xf7, 0xb5, 0xea, 0xf5, 0x63, 0xaf, 0xd0, 0xf1, - 0xd8, 0x8b, 0x0f, 0xd1, 0x62, 0xee, 0x21, 0xfa, 0xdd, 0x19, 0x4b, 0xb6, 0x8f, 0x2d, 0xd9, 0x0f, - 0xe5, 0x2c, 0xd9, 0x43, 0x5e, 0xa8, 0x3b, 0x39, 0xb3, 0xb6, 0x9f, 0x0d, 0x60, 0xa6, 0x84, 0x74, - 0xd5, 0xaf, 0x3b, 0xcd, 0xe4, 0x56, 0x7b, 0xc0, 0xa9, 0x7b, 0x38, 0xe3, 0x58, 0x87, 0x91, 0x05, - 0xa7, 0xe5, 0xdc, 0x72, 0x9b, 0x6e, 0xe4, 0x92, 0x10, 0x3d, 0x01, 0x45, 0xa7, 0xd1, 0x60, 0xd2, - 0x5d, 0x69, 0xfe, 0xf8, 0xbd, 0xbd, 0x72, 0x71, 0xae, 0x41, 0xc5, 0x0c, 0x50, 0x54, 0xbb, 0x98, - 0x52, 0xa0, 0xa7, 0xa0, 0xaf, 0x11, 0xf8, 0xad, 0xe9, 0x02, 0xa3, 0xa4, 0xab, 0xbc, 0x6f, 0x31, - 0xf0, 0x5b, 0x09, 0x52, 0x46, 0x63, 0xff, 0x56, 0x01, 0x4e, 0x2d, 0x90, 0xd6, 0xe6, 0x72, 0x2d, - 0xe7, 0xbc, 0x38, 0x0f, 0x43, 0xdb, 0xbe, 0xe7, 0x46, 0x7e, 0x10, 0x8a, 0xaa, 0xd9, 0x8c, 0x58, - 0x11, 0x30, 0xac, 0xb0, 0xe8, 0x2c, 0xf4, 0xb5, 0x62, 0x21, 0x76, 0x44, 0x0a, 0xc0, 0x4c, 0x7c, - 0x65, 0x18, 0x4a, 0xd1, 0x0e, 0x49, 0x20, 0x66, 0x8c, 0xa2, 0xb8, 0x1e, 0x92, 0x00, 0x33, 0x4c, - 0x2c, 0x09, 0x50, 0x19, 0x41, 0x9c, 0x08, 0x09, 0x49, 0x80, 0x62, 0xb0, 0x46, 0x85, 0xaa, 0x50, - 0x0a, 0x13, 0x23, 0xdb, 0xd3, 0xd2, 0x1c, 0x65, 0xa2, 0x82, 0x1a, 0xc9, 0x98, 0x89, 0x71, 0x82, - 0x0d, 0x74, 0x15, 0x15, 0xbe, 0x5e, 0x00, 0xc4, 0xbb, 0xf0, 0xdb, 0xac, 0xe3, 0xae, 0xa7, 0x3b, - 0xae, 0xf7, 0x25, 0x71, 0x58, 0xbd, 0xf7, 0x9f, 0x2d, 0x38, 0xb5, 0xe0, 0x7a, 0x0d, 0x12, 0xe4, - 0x4c, 0xc0, 0x07, 0x73, 0x77, 0x3e, 0x98, 0x90, 0x62, 0x4c, 0xb1, 0xbe, 0x43, 0x98, 0x62, 0xf6, - 0x5f, 0x5a, 0x80, 0xf8, 0x67, 0xbf, 0xeb, 0x3e, 0xf6, 0x7a, 0xfa, 0x63, 0x0f, 0x61, 0x5a, 0xd8, - 0x7f, 0xc7, 0x82, 0xe1, 0x85, 0xa6, 0xe3, 0x6e, 0x8b, 0x4f, 0x5d, 0x80, 0x49, 0xa9, 0x28, 0x62, - 0x60, 0x4d, 0xf6, 0xa7, 0x9b, 0xdb, 0x24, 0x4e, 0x22, 0x71, 0x9a, 0x1e, 0x7d, 0x1c, 0x4e, 0x1a, - 0xc0, 0x35, 0xb2, 0xdd, 0x6a, 0x3a, 0x91, 0x7e, 0x2b, 0x60, 0xa7, 0x3f, 0xce, 0x23, 0xc2, 0xf9, - 0xe5, 0xed, 0xab, 0x30, 0xb6, 0xd0, 0x74, 0x89, 0x17, 0x55, 0xaa, 0x0b, 0xbe, 0xb7, 0xee, 0x6e, - 0xa0, 0x97, 0x61, 0x2c, 0x72, 0xb7, 0x89, 0xdf, 0x8e, 0x6a, 0xa4, 0xee, 0x7b, 0xec, 0xae, 0x6d, - 0x9d, 0xef, 0x9f, 0x47, 0xf7, 0xf6, 0xca, 0x63, 0x6b, 0x06, 0x06, 0x27, 0x28, 0xed, 0x3f, 0xa2, - 0x23, 0xee, 0x6f, 0xb7, 0x7c, 0x8f, 0x78, 0xd1, 0x82, 0xef, 0x35, 0xb8, 0x4e, 0xe6, 0x65, 0xe8, - 0x8b, 0xe8, 0x08, 0xf2, 0x2f, 0x3f, 0x27, 0x97, 0x36, 0x1d, 0xb7, 0xfd, 0xbd, 0xf2, 0x89, 0x74, - 0x09, 0x36, 0xb2, 0xac, 0x0c, 0xfa, 0x10, 0x0c, 0x84, 0x91, 0x13, 0xb5, 0x43, 0xf1, 0xa9, 0x8f, - 0xc8, 0xf1, 0xaf, 0x31, 0xe8, 0xfe, 0x5e, 0x79, 0x5c, 0x15, 0xe3, 0x20, 0x2c, 0x0a, 0xa0, 0x27, - 0x61, 0x70, 0x9b, 0x84, 0xa1, 0xb3, 0x21, 0xcf, 0xef, 0x71, 0x51, 0x76, 0x70, 0x85, 0x83, 0xb1, - 0xc4, 0xa3, 0x47, 0xa1, 0x9f, 0x04, 0x81, 0x1f, 0x88, 0x5d, 0x65, 0x54, 0x10, 0xf6, 0x2f, 0x51, - 0x20, 0xe6, 0x38, 0xfb, 0x5f, 0x5a, 0x30, 0xae, 0xda, 0xca, 0xeb, 0x3a, 0x82, 0x7b, 0xd3, 0x9b, - 0x00, 0x75, 0xf9, 0x81, 0x21, 0x3b, 0xef, 0x86, 0x9f, 0x3b, 0x97, 0x29, 0x5a, 0xa4, 0xba, 0x31, - 0xe6, 0xac, 0x40, 0x21, 0xd6, 0xb8, 0xd9, 0xbf, 0x6e, 0xc1, 0x54, 0xe2, 0x8b, 0xae, 0xba, 0x61, - 0x84, 0xde, 0x4a, 0x7d, 0xd5, 0x6c, 0x6f, 0x5f, 0x45, 0x4b, 0xb3, 0x6f, 0x52, 0x8b, 0x4f, 0x42, - 0xb4, 0x2f, 0xba, 0x0c, 0xfd, 0x6e, 0x44, 0xb6, 0xe5, 0xc7, 0x3c, 0xda, 0xf1, 0x63, 0x78, 0xab, - 0xe2, 0x11, 0xa9, 0xd0, 0x92, 0x98, 0x33, 0xb0, 0x7f, 0xab, 0x08, 0x25, 0x3e, 0x6d, 0x57, 0x9c, - 0xd6, 0x11, 0x8c, 0xc5, 0xd3, 0x50, 0x72, 0xb7, 0xb7, 0xdb, 0x91, 0x73, 0x4b, 0x1c, 0x40, 0x43, - 0x7c, 0x33, 0xa8, 0x48, 0x20, 0x8e, 0xf1, 0xa8, 0x02, 0x7d, 0xac, 0x29, 0xfc, 0x2b, 0x9f, 0xc8, - 0xfe, 0x4a, 0xd1, 0xf6, 0xd9, 0x45, 0x27, 0x72, 0xb8, 0xec, 0xa7, 0x4e, 0x3e, 0x0a, 0xc2, 0x8c, - 0x05, 0x72, 0x00, 0x6e, 0xb9, 0x9e, 0x13, 0xec, 0x52, 0xd8, 0x74, 0x91, 0x31, 0x7c, 0xb6, 0x33, - 0xc3, 0x79, 0x45, 0xcf, 0xd9, 0xaa, 0x0f, 0x8b, 0x11, 0x58, 0x63, 0x3a, 0xf3, 0x41, 0x28, 0x29, - 0xe2, 0x83, 0x88, 0x70, 0x33, 0x1f, 0x86, 0xf1, 0x44, 0x5d, 0xdd, 0x8a, 0x8f, 0xe8, 0x12, 0xe0, - 0xaf, 0xb2, 0x2d, 0x43, 0xb4, 0x7a, 0xc9, 0xdb, 0x11, 0x3b, 0xe7, 0x5d, 0x38, 0xd6, 0xcc, 0xd8, - 0x7b, 0xc5, 0xb8, 0xf6, 0xbe, 0x57, 0x9f, 0x12, 0x9f, 0x7d, 0x2c, 0x0b, 0x8b, 0x33, 0xeb, 0xa0, - 0x52, 0x8d, 0xdf, 0xa2, 0x0b, 0xc4, 0x69, 0xea, 0x17, 0x84, 0x6b, 0x02, 0x86, 0x15, 0x96, 0xee, - 0x77, 0xc7, 0x54, 0xe3, 0xaf, 0x90, 0xdd, 0x1a, 0x69, 0x92, 0x7a, 0xe4, 0x07, 0xdf, 0xd2, 0xe6, - 0x9f, 0xe6, 0xbd, 0xcf, 0xb7, 0xcb, 0x61, 0xc1, 0xa0, 0x78, 0x85, 0xec, 0xf2, 0xa1, 0xd0, 0xbf, - 0xae, 0xd8, 0xf1, 0xeb, 0xbe, 0x6a, 0xc1, 0xa8, 0xfa, 0xba, 0x23, 0xd8, 0x17, 0xe6, 0xcd, 0x7d, - 0xe1, 0x74, 0xc7, 0x09, 0x9e, 0xb3, 0x23, 0x7c, 0xbd, 0x00, 0x27, 0x15, 0x0d, 0xbd, 0xcd, 0xf0, - 0x3f, 0x62, 0x56, 0x5d, 0x80, 0x92, 0xa7, 0xf4, 0x7a, 0x96, 0xa9, 0x50, 0x8b, 0xb5, 0x7a, 0x31, - 0x0d, 0x15, 0x4a, 0xbd, 0xf8, 0x98, 0x1d, 0xd1, 0x15, 0xde, 0x42, 0xb9, 0x3d, 0x0f, 0xc5, 0xb6, - 0xdb, 0x10, 0x07, 0xcc, 0xfb, 0x65, 0x6f, 0x5f, 0xaf, 0x2c, 0xee, 0xef, 0x95, 0x1f, 0xc9, 0x33, - 0xb6, 0xd0, 0x93, 0x2d, 0x9c, 0xbd, 0x5e, 0x59, 0xc4, 0xb4, 0x30, 0x9a, 0x83, 0x71, 0x79, 0x42, - 0xdf, 0xa0, 0x02, 0xa2, 0xef, 0x89, 0x73, 0x48, 0x69, 0xad, 0xb1, 0x89, 0xc6, 0x49, 0x7a, 0xb4, - 0x08, 0x13, 0x5b, 0xed, 0x5b, 0xa4, 0x49, 0x22, 0xfe, 0xc1, 0x57, 0x08, 0xd7, 0xe9, 0x96, 0xe2, - 0xbb, 0xe4, 0x95, 0x04, 0x1e, 0xa7, 0x4a, 0xd8, 0x7f, 0xc3, 0xce, 0x03, 0xd1, 0x7b, 0xd5, 0xc0, - 0xa7, 0x13, 0x8b, 0x72, 0xff, 0x56, 0x4e, 0xe7, 0x5e, 0x66, 0xc5, 0x15, 0xb2, 0xbb, 0xe6, 0xd3, - 0xbb, 0x44, 0xf6, 0xac, 0x30, 0xe6, 0x7c, 0x5f, 0xc7, 0x39, 0xff, 0x8b, 0x05, 0x38, 0xae, 0x7a, - 0xc0, 0x10, 0x5b, 0xbf, 0xdd, 0xfb, 0xe0, 0x22, 0x0c, 0x37, 0xc8, 0xba, 0xd3, 0x6e, 0x46, 0xca, - 0xc0, 0xd0, 0xcf, 0x8d, 0x4c, 0x8b, 0x31, 0x18, 0xeb, 0x34, 0x07, 0xe8, 0xb6, 0x9f, 0x1f, 0x65, - 0x07, 0x71, 0xe4, 0xd0, 0x39, 0xae, 0x56, 0x8d, 0x95, 0xbb, 0x6a, 0x1e, 0x85, 0x7e, 0x77, 0x9b, - 0x0a, 0x66, 0x05, 0x53, 0xde, 0xaa, 0x50, 0x20, 0xe6, 0x38, 0xf4, 0x38, 0x0c, 0xd6, 0xfd, 0xed, - 0x6d, 0xc7, 0x6b, 0xb0, 0x23, 0xaf, 0x34, 0x3f, 0x4c, 0x65, 0xb7, 0x05, 0x0e, 0xc2, 0x12, 0x87, - 0x4e, 0x41, 0x9f, 0x13, 0x6c, 0x70, 0xad, 0x4b, 0x69, 0x7e, 0x88, 0xd6, 0x34, 0x17, 0x6c, 0x84, - 0x98, 0x41, 0xe9, 0xa5, 0xf1, 0xb6, 0x1f, 0x6c, 0xb9, 0xde, 0xc6, 0xa2, 0x1b, 0x88, 0x25, 0xa1, - 0xce, 0xc2, 0x9b, 0x0a, 0x83, 0x35, 0x2a, 0xb4, 0x0c, 0xfd, 0x2d, 0x3f, 0x88, 0xc2, 0xe9, 0x01, - 0xd6, 0xdd, 0x8f, 0xe4, 0x6c, 0x44, 0xfc, 0x6b, 0xab, 0x7e, 0x10, 0xc5, 0x1f, 0x40, 0xff, 0x85, - 0x98, 0x17, 0x47, 0x57, 0x61, 0x90, 0x78, 0x3b, 0xcb, 0x81, 0xbf, 0x3d, 0x3d, 0x95, 0xcf, 0x69, - 0x89, 0x93, 0xf0, 0x69, 0x16, 0xcb, 0xa8, 0x02, 0x8c, 0x25, 0x0b, 0xf4, 0x21, 0x28, 0x12, 0x6f, - 0x67, 0x7a, 0x90, 0x71, 0x9a, 0xc9, 0xe1, 0x74, 0xc3, 0x09, 0xe2, 0x3d, 0x7f, 0xc9, 0xdb, 0xc1, - 0xb4, 0x0c, 0xfa, 0x18, 0x94, 0xe4, 0x86, 0x11, 0x0a, 0x75, 0x66, 0xe6, 0x84, 0x95, 0xdb, 0x0c, - 0x26, 0x6f, 0xb7, 0xdd, 0x80, 0x6c, 0x13, 0x2f, 0x0a, 0xe3, 0x1d, 0x52, 0x62, 0x43, 0x1c, 0x73, - 0x43, 0x75, 0x18, 0x09, 0x48, 0xe8, 0xde, 0x25, 0x55, 0xbf, 0xe9, 0xd6, 0x77, 0xa7, 0x1f, 0x62, - 0xcd, 0x7b, 0xb2, 0x63, 0x97, 0x61, 0xad, 0x40, 0xac, 0x6e, 0xd7, 0xa1, 0xd8, 0x60, 0x8a, 0xde, - 0x80, 0xd1, 0x80, 0x84, 0x91, 0x13, 0x44, 0xa2, 0x96, 0x69, 0x65, 0x1e, 0x1b, 0xc5, 0x3a, 0x82, - 0x5f, 0x27, 0xe2, 0x6a, 0x62, 0x0c, 0x36, 0x39, 0xa0, 0x8f, 0x49, 0xdd, 0xff, 0x8a, 0xdf, 0xf6, - 0xa2, 0x70, 0xba, 0xc4, 0xda, 0x9d, 0x69, 0x95, 0xbd, 0x11, 0xd3, 0x25, 0x8d, 0x03, 0xbc, 0x30, - 0x36, 0x58, 0xa1, 0x4f, 0xc0, 0x28, 0xff, 0xcf, 0x6d, 0x9b, 0xe1, 0xf4, 0x71, 0xc6, 0xfb, 0x6c, - 0x3e, 0x6f, 0x4e, 0x38, 0x7f, 0x5c, 0x30, 0x1f, 0xd5, 0xa1, 0x21, 0x36, 0xb9, 0x21, 0x0c, 0xa3, - 0x4d, 0x77, 0x87, 0x78, 0x24, 0x0c, 0xab, 0x81, 0x7f, 0x8b, 0x08, 0x55, 0xed, 0xc9, 0x6c, 0x5b, - 0xa8, 0x7f, 0x8b, 0xcc, 0x4f, 0x52, 0x9e, 0x57, 0xf5, 0x32, 0xd8, 0x64, 0x81, 0xae, 0xc3, 0x18, - 0xbd, 0x1b, 0xbb, 0x31, 0xd3, 0xe1, 0x6e, 0x4c, 0xd9, 0x7d, 0x10, 0x1b, 0x85, 0x70, 0x82, 0x09, - 0xba, 0x06, 0x23, 0xac, 0xcf, 0xdb, 0x2d, 0xce, 0xf4, 0x44, 0x37, 0xa6, 0xcc, 0x94, 0x5e, 0xd3, - 0x8a, 0x60, 0x83, 0x01, 0x7a, 0x1d, 0x4a, 0x4d, 0x77, 0x9d, 0xd4, 0x77, 0xeb, 0x4d, 0x32, 0x3d, - 0xc2, 0xb8, 0x65, 0x6e, 0x86, 0x57, 0x25, 0x11, 0x97, 0xcf, 0xd5, 0x5f, 0x1c, 0x17, 0x47, 0x37, - 0xe0, 0x44, 0x44, 0x82, 0x6d, 0xd7, 0x73, 0xe8, 0x26, 0x26, 0xae, 0x84, 0xcc, 0x44, 0x3d, 0xca, - 0x66, 0xd7, 0x19, 0x31, 0x1a, 0x27, 0xd6, 0x32, 0xa9, 0x70, 0x4e, 0x69, 0x74, 0x07, 0xa6, 0x33, - 0x30, 0x7c, 0xde, 0x1e, 0x63, 0x9c, 0x5f, 0x15, 0x9c, 0xa7, 0xd7, 0x72, 0xe8, 0xf6, 0x3b, 0xe0, - 0x70, 0x2e, 0x77, 0x74, 0x0d, 0xc6, 0xd9, 0xce, 0x59, 0x6d, 0x37, 0x9b, 0xa2, 0xc2, 0x31, 0x56, - 0xe1, 0xe3, 0x52, 0x8e, 0xa8, 0x98, 0xe8, 0xfd, 0xbd, 0x32, 0xc4, 0xff, 0x70, 0xb2, 0x34, 0xba, - 0xc5, 0xac, 0xa1, 0xed, 0xc0, 0x8d, 0x76, 0xe9, 0xaa, 0x22, 0x77, 0xa2, 0xe9, 0xf1, 0x8e, 0x9a, - 0x21, 0x9d, 0x54, 0x99, 0x4c, 0x75, 0x20, 0x4e, 0x32, 0xa4, 0x47, 0x41, 0x18, 0x35, 0x5c, 0x6f, - 0x7a, 0x82, 0xdf, 0xa7, 0xe4, 0x4e, 0x5a, 0xa3, 0x40, 0xcc, 0x71, 0xcc, 0x12, 0x4a, 0x7f, 0x5c, - 0xa3, 0x27, 0xee, 0x24, 0x23, 0x8c, 0x2d, 0xa1, 0x12, 0x81, 0x63, 0x1a, 0x2a, 0x04, 0x47, 0xd1, - 0xee, 0x34, 0x62, 0xa4, 0x6a, 0x43, 0x5c, 0x5b, 0xfb, 0x18, 0xa6, 0x70, 0xfb, 0x16, 0x8c, 0xa9, - 0x6d, 0x82, 0xf5, 0x09, 0x2a, 0x43, 0x3f, 0x13, 0xfb, 0x84, 0x1e, 0xb3, 0x44, 0x9b, 0xc0, 0x44, - 0x42, 0xcc, 0xe1, 0xac, 0x09, 0xee, 0x5d, 0x32, 0xbf, 0x1b, 0x11, 0xae, 0x8b, 0x28, 0x6a, 0x4d, - 0x90, 0x08, 0x1c, 0xd3, 0xd8, 0xff, 0x83, 0x8b, 0xcf, 0xf1, 0x29, 0xd1, 0xc3, 0xb9, 0xf8, 0x0c, - 0x0c, 0x6d, 0xfa, 0x61, 0x44, 0xa9, 0x59, 0x1d, 0xfd, 0xb1, 0xc0, 0x7c, 0x59, 0xc0, 0xb1, 0xa2, - 0x40, 0xaf, 0xc0, 0x68, 0x5d, 0xaf, 0x40, 0x1c, 0xea, 0x6a, 0x1b, 0x31, 0x6a, 0xc7, 0x26, 0x2d, - 0x7a, 0x09, 0x86, 0x98, 0x77, 0x4f, 0xdd, 0x6f, 0x0a, 0x69, 0x53, 0x4a, 0x26, 0x43, 0x55, 0x01, - 0xdf, 0xd7, 0x7e, 0x63, 0x45, 0x8d, 0xce, 0xc1, 0x00, 0x6d, 0x42, 0xa5, 0x2a, 0x8e, 0x53, 0xa5, - 0x92, 0xbb, 0xcc, 0xa0, 0x58, 0x60, 0xed, 0x5f, 0xb7, 0x98, 0x2c, 0x95, 0xde, 0xf3, 0xd1, 0x65, - 0x76, 0x68, 0xb0, 0x13, 0x44, 0x53, 0x89, 0x3d, 0xa6, 0x9d, 0x04, 0x0a, 0xb7, 0x9f, 0xf8, 0x8f, - 0x8d, 0x92, 0xe8, 0xcd, 0xe4, 0xc9, 0xc0, 0x05, 0x8a, 0x17, 0x64, 0x17, 0x24, 0x4f, 0x87, 0x87, - 0xe3, 0x23, 0x8e, 0xb6, 0xa7, 0xd3, 0x11, 0x61, 0xff, 0x9f, 0x05, 0x6d, 0x96, 0xd4, 0x22, 0x27, - 0x22, 0xa8, 0x0a, 0x83, 0xb7, 0x1d, 0x37, 0x72, 0xbd, 0x0d, 0x21, 0xf7, 0x75, 0x3e, 0xe8, 0x58, - 0xa1, 0x9b, 0xbc, 0x00, 0x97, 0x5e, 0xc4, 0x1f, 0x2c, 0xd9, 0x50, 0x8e, 0x41, 0xdb, 0xf3, 0x28, - 0xc7, 0x42, 0xaf, 0x1c, 0x31, 0x2f, 0xc0, 0x39, 0x8a, 0x3f, 0x58, 0xb2, 0x41, 0x6f, 0x01, 0xc8, - 0x1d, 0x82, 0x34, 0x84, 0x57, 0xd0, 0x33, 0xdd, 0x99, 0xae, 0xa9, 0x32, 0xf3, 0x63, 0x54, 0x36, - 0x8a, 0xff, 0x63, 0x8d, 0x9f, 0x1d, 0x69, 0x63, 0xaa, 0x37, 0x06, 0x7d, 0x9c, 0x2e, 0x51, 0x27, - 0x88, 0x48, 0x63, 0x2e, 0x12, 0x9d, 0xf3, 0x54, 0x6f, 0x97, 0xc3, 0x35, 0x77, 0x9b, 0xe8, 0xcb, - 0x59, 0x30, 0xc1, 0x31, 0x3f, 0xfb, 0x97, 0x8b, 0x30, 0x9d, 0xd7, 0x5c, 0xba, 0x68, 0xc8, 0x1d, - 0x37, 0x5a, 0xa0, 0x62, 0xad, 0x65, 0x2e, 0x9a, 0x25, 0x01, 0xc7, 0x8a, 0x82, 0xce, 0xde, 0xd0, - 0xdd, 0x90, 0x77, 0xfb, 0xfe, 0x78, 0xf6, 0xd6, 0x18, 0x14, 0x0b, 0x2c, 0xa5, 0x0b, 0x88, 0x13, - 0x0a, 0xb7, 0x33, 0x6d, 0x96, 0x63, 0x06, 0xc5, 0x02, 0xab, 0x6b, 0x19, 0xfb, 0xba, 0x68, 0x19, - 0x8d, 0x2e, 0xea, 0x3f, 0xdc, 0x2e, 0x42, 0x9f, 0x04, 0x58, 0x77, 0x3d, 0x37, 0xdc, 0x64, 0xdc, - 0x07, 0x0e, 0xcc, 0x5d, 0x09, 0xc5, 0xcb, 0x8a, 0x0b, 0xd6, 0x38, 0xa2, 0x17, 0x61, 0x58, 0x6d, - 0x20, 0x95, 0x45, 0x66, 0x83, 0xd7, 0x7c, 0x9a, 0xe2, 0xdd, 0x74, 0x11, 0xeb, 0x74, 0xf6, 0xa7, - 0x93, 0xf3, 0x45, 0xac, 0x00, 0xad, 0x7f, 0xad, 0x5e, 0xfb, 0xb7, 0xd0, 0xb9, 0x7f, 0xed, 0x6f, - 0x0e, 0xc0, 0xb8, 0x51, 0x59, 0x3b, 0xec, 0x61, 0xcf, 0xbd, 0x44, 0x0f, 0x20, 0x27, 0x22, 0x62, - 0xfd, 0xd9, 0xdd, 0x97, 0x8a, 0x7e, 0x48, 0xd1, 0x15, 0xc0, 0xcb, 0xa3, 0x4f, 0x42, 0xa9, 0xe9, - 0x84, 0x4c, 0x63, 0x49, 0xc4, 0xba, 0xeb, 0x85, 0x59, 0x7c, 0x21, 0x74, 0xc2, 0x48, 0x3b, 0xf5, - 0x39, 0xef, 0x98, 0x25, 0x3d, 0x29, 0xa9, 0x7c, 0x25, 0xfd, 0x1a, 0x55, 0x23, 0xa8, 0x10, 0xb6, - 0x8b, 0x39, 0x0e, 0xbd, 0xc4, 0xb6, 0x56, 0x3a, 0x2b, 0x16, 0xa8, 0x34, 0xca, 0xa6, 0x59, 0xbf, - 0x21, 0x64, 0x2b, 0x1c, 0x36, 0x28, 0xe3, 0x3b, 0xd9, 0x40, 0x87, 0x3b, 0xd9, 0x93, 0x30, 0xc8, - 0x7e, 0xa8, 0x19, 0xa0, 0x46, 0xa3, 0xc2, 0xc1, 0x58, 0xe2, 0x93, 0x13, 0x66, 0xa8, 0xb7, 0x09, - 0x43, 0x6f, 0x7d, 0x62, 0x52, 0x33, 0xff, 0x87, 0x21, 0xbe, 0xcb, 0x89, 0x29, 0x8f, 0x25, 0x0e, - 0xfd, 0xb4, 0x05, 0xc8, 0x69, 0xd2, 0xdb, 0x32, 0x05, 0xab, 0xcb, 0x0d, 0x30, 0x51, 0xfb, 0x95, - 0xae, 0xdd, 0xde, 0x0e, 0x67, 0xe7, 0x52, 0xa5, 0xb9, 0xa6, 0xf4, 0x65, 0xd1, 0x44, 0x94, 0x26, - 0xd0, 0x0f, 0xa3, 0xab, 0x6e, 0x18, 0x7d, 0xee, 0x8f, 0x13, 0x87, 0x53, 0x46, 0x93, 0xd0, 0x75, - 0xfd, 0xf2, 0x35, 0x7c, 0xc0, 0xcb, 0xd7, 0x68, 0xde, 0xc5, 0x6b, 0xa6, 0x0d, 0x0f, 0xe5, 0x7c, - 0x41, 0x86, 0xfe, 0x75, 0x51, 0xd7, 0xbf, 0x76, 0xd1, 0xda, 0xcd, 0xca, 0x3a, 0x66, 0xdf, 0x68, - 0x3b, 0x5e, 0xe4, 0x46, 0xbb, 0xba, 0xbe, 0xf6, 0x29, 0x18, 0x5b, 0x74, 0xc8, 0xb6, 0xef, 0x2d, - 0x79, 0x8d, 0x96, 0xef, 0x7a, 0x11, 0x9a, 0x86, 0x3e, 0x26, 0x7c, 0xf0, 0xad, 0xb7, 0x8f, 0xf6, - 0x1e, 0x66, 0x10, 0x7b, 0x03, 0x8e, 0x2f, 0xfa, 0xb7, 0xbd, 0xdb, 0x4e, 0xd0, 0x98, 0xab, 0x56, - 0x34, 0x7d, 0xd2, 0xaa, 0xd4, 0x67, 0x58, 0xf9, 0xb7, 0x45, 0xad, 0x24, 0xbf, 0x0e, 0x2d, 0xbb, - 0x4d, 0x92, 0xa3, 0xf5, 0xfb, 0x7f, 0x0a, 0x46, 0x4d, 0x31, 0xbd, 0xb2, 0x3b, 0x5b, 0xb9, 0x76, - 0xe7, 0x37, 0x60, 0x68, 0xdd, 0x25, 0xcd, 0x06, 0x26, 0xeb, 0xa2, 0x77, 0x9e, 0xc8, 0xf7, 0x4c, - 0x5b, 0xa6, 0x94, 0x52, 0xcb, 0xcb, 0xb5, 0x21, 0xcb, 0xa2, 0x30, 0x56, 0x6c, 0xd0, 0x16, 0x4c, - 0xc8, 0x3e, 0x94, 0x58, 0xb1, 0x1f, 0x3c, 0xd9, 0x69, 0xe0, 0x4d, 0xe6, 0xc7, 0xee, 0xed, 0x95, - 0x27, 0x70, 0x82, 0x0d, 0x4e, 0x31, 0x46, 0xa7, 0xa0, 0x6f, 0x9b, 0x9e, 0x7c, 0x7d, 0xac, 0xfb, - 0x99, 0xfa, 0x83, 0x69, 0x72, 0x18, 0xd4, 0xfe, 0x31, 0x0b, 0x1e, 0x4a, 0xf5, 0x8c, 0xd0, 0x68, - 0x1d, 0xf2, 0x28, 0x24, 0x35, 0x4c, 0x85, 0xee, 0x1a, 0x26, 0xfb, 0xe7, 0x2c, 0x38, 0xb6, 0xb4, - 0xdd, 0x8a, 0x76, 0x17, 0x5d, 0xd3, 0x48, 0xfc, 0x41, 0x18, 0xd8, 0x26, 0x0d, 0xb7, 0xbd, 0x2d, - 0x46, 0xae, 0x2c, 0x4f, 0x87, 0x15, 0x06, 0xdd, 0xdf, 0x2b, 0x8f, 0xd6, 0x22, 0x3f, 0x70, 0x36, - 0x08, 0x07, 0x60, 0x41, 0xce, 0xce, 0x58, 0xf7, 0x2e, 0xb9, 0xea, 0x6e, 0xbb, 0xd1, 0xfd, 0xcd, - 0x76, 0x61, 0xdf, 0x95, 0x4c, 0x70, 0xcc, 0xcf, 0xfe, 0x86, 0x05, 0xe3, 0x72, 0xde, 0xcf, 0x35, - 0x1a, 0x01, 0x09, 0x43, 0x34, 0x03, 0x05, 0xb7, 0x25, 0x5a, 0x09, 0xa2, 0x95, 0x85, 0x4a, 0x15, - 0x17, 0xdc, 0x96, 0x14, 0xe7, 0xd9, 0x01, 0x54, 0x34, 0x4d, 0xdd, 0x97, 0x05, 0x1c, 0x2b, 0x0a, - 0x74, 0x1e, 0x86, 0x3c, 0xbf, 0xc1, 0x25, 0x62, 0x2e, 0x4a, 0xb0, 0x09, 0xb6, 0x2a, 0x60, 0x58, - 0x61, 0x51, 0x15, 0x4a, 0xdc, 0x11, 0x32, 0x9e, 0xb4, 0x3d, 0xb9, 0x53, 0xb2, 0x2f, 0x5b, 0x93, - 0x25, 0x71, 0xcc, 0xc4, 0xfe, 0x4d, 0x0b, 0x46, 0xe4, 0x97, 0xf5, 0x78, 0x57, 0xa1, 0x4b, 0x2b, - 0xbe, 0xa7, 0xc4, 0x4b, 0x8b, 0xde, 0x35, 0x18, 0xc6, 0xb8, 0x62, 0x14, 0x0f, 0x74, 0xc5, 0xb8, - 0x08, 0xc3, 0x4e, 0xab, 0x55, 0x35, 0xef, 0x27, 0x6c, 0x2a, 0xcd, 0xc5, 0x60, 0xac, 0xd3, 0xd8, - 0x3f, 0x5a, 0x80, 0x31, 0xf9, 0x05, 0xb5, 0xf6, 0xad, 0x90, 0x44, 0x68, 0x0d, 0x4a, 0x0e, 0x1f, - 0x25, 0x22, 0x27, 0xf9, 0xa3, 0xd9, 0x7a, 0x33, 0x63, 0x48, 0x63, 0x41, 0x6b, 0x4e, 0x96, 0xc6, - 0x31, 0x23, 0xd4, 0x84, 0x49, 0xcf, 0x8f, 0xd8, 0xa1, 0xab, 0xf0, 0x9d, 0x4c, 0x99, 0x49, 0xee, - 0x27, 0x05, 0xf7, 0xc9, 0xd5, 0x24, 0x17, 0x9c, 0x66, 0x8c, 0x96, 0xa4, 0x2e, 0xb2, 0x98, 0xaf, - 0x44, 0xd2, 0x07, 0x2e, 0x5b, 0x15, 0x69, 0xff, 0x9a, 0x05, 0x25, 0x49, 0x76, 0x14, 0x56, 0xeb, - 0x15, 0x18, 0x0c, 0xd9, 0x20, 0xc8, 0xae, 0xb1, 0x3b, 0x35, 0x9c, 0x8f, 0x57, 0x2c, 0x4b, 0xf0, - 0xff, 0x21, 0x96, 0x3c, 0x98, 0x29, 0x4a, 0x35, 0xff, 0x5d, 0x62, 0x8a, 0x52, 0xed, 0xc9, 0x39, - 0x94, 0xfe, 0x8c, 0xb5, 0x59, 0xd3, 0xed, 0x52, 0x91, 0xb7, 0x15, 0x90, 0x75, 0xf7, 0x4e, 0x52, - 0xe4, 0xad, 0x32, 0x28, 0x16, 0x58, 0xf4, 0x16, 0x8c, 0xd4, 0xa5, 0x0d, 0x22, 0x5e, 0xe1, 0xe7, - 0x3a, 0xda, 0xc3, 0x94, 0xe9, 0x94, 0xeb, 0xd0, 0x16, 0xb4, 0xf2, 0xd8, 0xe0, 0x66, 0x3a, 0xfa, - 0x14, 0xbb, 0x39, 0xfa, 0xc4, 0x7c, 0xf3, 0xdd, 0x5e, 0x7e, 0xdc, 0x82, 0x01, 0xae, 0x7b, 0xee, - 0x4d, 0xf5, 0xaf, 0x59, 0x92, 0xe3, 0xbe, 0xbb, 0x41, 0x81, 0x42, 0xd2, 0x40, 0x2b, 0x50, 0x62, - 0x3f, 0x98, 0xee, 0xbc, 0x98, 0xff, 0x0e, 0x87, 0xd7, 0xaa, 0x37, 0xf0, 0x86, 0x2c, 0x86, 0x63, - 0x0e, 0xf6, 0x8f, 0x14, 0xe9, 0xee, 0x16, 0x93, 0x1a, 0x87, 0xbe, 0xf5, 0xe0, 0x0e, 0xfd, 0xc2, - 0x83, 0x3a, 0xf4, 0x37, 0x60, 0xbc, 0xae, 0xd9, 0x9d, 0xe3, 0x91, 0x3c, 0xdf, 0x71, 0x92, 0x68, - 0x26, 0x6a, 0xae, 0x9d, 0x5b, 0x30, 0x99, 0xe0, 0x24, 0x57, 0xf4, 0x71, 0x18, 0xe1, 0xe3, 0x2c, - 0x6a, 0xe1, 0xbe, 0x52, 0x8f, 0xe7, 0xcf, 0x17, 0xbd, 0x0a, 0xae, 0xcd, 0xd5, 0x8a, 0x63, 0x83, - 0x99, 0xfd, 0x57, 0x16, 0xa0, 0xa5, 0xd6, 0x26, 0xd9, 0x26, 0x81, 0xd3, 0x8c, 0xcd, 0x47, 0x5f, - 0xb4, 0x60, 0x9a, 0xa4, 0xc0, 0x0b, 0xfe, 0xf6, 0xb6, 0xb8, 0x2c, 0xe6, 0xe8, 0x33, 0x96, 0x72, - 0xca, 0xa8, 0x87, 0x4a, 0xd3, 0x79, 0x14, 0x38, 0xb7, 0x3e, 0xb4, 0x02, 0x53, 0xfc, 0x94, 0x54, - 0x08, 0xcd, 0xef, 0xea, 0x61, 0xc1, 0x78, 0x6a, 0x2d, 0x4d, 0x82, 0xb3, 0xca, 0xd9, 0xbf, 0x36, - 0x0a, 0xb9, 0xad, 0x78, 0xcf, 0x6e, 0xf6, 0x9e, 0xdd, 0xec, 0x3d, 0xbb, 0xd9, 0x7b, 0x76, 0xb3, - 0xf7, 0xec, 0x66, 0xef, 0xd9, 0xcd, 0xde, 0xa5, 0x76, 0xb3, 0xff, 0xcb, 0x82, 0xe3, 0xea, 0xf8, - 0x32, 0x2e, 0xec, 0x9f, 0x81, 0x29, 0xbe, 0xdc, 0x0c, 0x1f, 0x63, 0x71, 0x5c, 0x5f, 0xcc, 0x9c, - 0xb9, 0x09, 0x5f, 0x78, 0xa3, 0x20, 0x7f, 0x54, 0x94, 0x81, 0xc0, 0x59, 0xd5, 0xd8, 0xbf, 0x3c, - 0x04, 0xfd, 0x4b, 0x3b, 0xc4, 0x8b, 0x8e, 0xe0, 0x6a, 0x53, 0x87, 0x31, 0xd7, 0xdb, 0xf1, 0x9b, - 0x3b, 0xa4, 0xc1, 0xf1, 0x07, 0xb9, 0x81, 0x9f, 0x10, 0xac, 0xc7, 0x2a, 0x06, 0x0b, 0x9c, 0x60, - 0xf9, 0x20, 0xac, 0x0f, 0x97, 0x60, 0x80, 0x1f, 0x3e, 0xc2, 0xf4, 0x90, 0xb9, 0x67, 0xb3, 0x4e, - 0x14, 0x47, 0x6a, 0x6c, 0x19, 0xe1, 0x87, 0x9b, 0x28, 0x8e, 0x3e, 0x0d, 0x63, 0xeb, 0x6e, 0x10, - 0x46, 0x6b, 0xee, 0x36, 0x3d, 0x1a, 0xb6, 0x5b, 0xf7, 0x61, 0x6d, 0x50, 0xfd, 0xb0, 0x6c, 0x70, - 0xc2, 0x09, 0xce, 0x68, 0x03, 0x46, 0x9b, 0x8e, 0x5e, 0xd5, 0xe0, 0x81, 0xab, 0x52, 0xa7, 0xc3, - 0x55, 0x9d, 0x11, 0x36, 0xf9, 0xd2, 0xe5, 0x54, 0x67, 0x0a, 0xf3, 0x21, 0xa6, 0xce, 0x50, 0xcb, - 0x89, 0x6b, 0xca, 0x39, 0x8e, 0x0a, 0x68, 0xcc, 0x91, 0xbd, 0x64, 0x0a, 0x68, 0x9a, 0xbb, 0xfa, - 0xa7, 0xa0, 0x44, 0x68, 0x17, 0x52, 0xc6, 0xe2, 0x80, 0xb9, 0xd0, 0x5b, 0x5b, 0x57, 0xdc, 0x7a, - 0xe0, 0x9b, 0x76, 0x9e, 0x25, 0xc9, 0x09, 0xc7, 0x4c, 0xd1, 0x02, 0x0c, 0x84, 0x24, 0x70, 0x95, - 0x2e, 0xb9, 0xc3, 0x30, 0x32, 0x32, 0xfe, 0x6a, 0x8d, 0xff, 0xc6, 0xa2, 0x28, 0x9d, 0x5e, 0x0e, - 0x53, 0xc5, 0xb2, 0xc3, 0x40, 0x9b, 0x5e, 0x73, 0x0c, 0x8a, 0x05, 0x16, 0xbd, 0x0e, 0x83, 0x01, - 0x69, 0x32, 0x43, 0xe2, 0x68, 0xef, 0x93, 0x9c, 0xdb, 0x25, 0x79, 0x39, 0x2c, 0x19, 0xa0, 0x2b, - 0x80, 0x02, 0x42, 0x05, 0x3c, 0xd7, 0xdb, 0x50, 0xee, 0xdd, 0x62, 0xa3, 0x55, 0x82, 0x34, 0x8e, - 0x29, 0xe4, 0x83, 0x45, 0x9c, 0x51, 0x0c, 0x5d, 0x82, 0x49, 0x05, 0xad, 0x78, 0x61, 0xe4, 0xd0, - 0x0d, 0x6e, 0x9c, 0xf1, 0x52, 0xfa, 0x15, 0x9c, 0x24, 0xc0, 0xe9, 0x32, 0xf6, 0xcf, 0x5a, 0xc0, - 0xfb, 0xf9, 0x08, 0xb4, 0x0a, 0xaf, 0x99, 0x5a, 0x85, 0x93, 0xb9, 0x23, 0x97, 0xa3, 0x51, 0xf8, - 0x59, 0x0b, 0x86, 0xb5, 0x91, 0x8d, 0xe7, 0xac, 0xd5, 0x61, 0xce, 0xb6, 0x61, 0x82, 0xce, 0xf4, - 0x6b, 0xb7, 0x42, 0x12, 0xec, 0x90, 0x06, 0x9b, 0x98, 0x85, 0xfb, 0x9b, 0x98, 0xca, 0x95, 0xf4, - 0x6a, 0x82, 0x21, 0x4e, 0x55, 0x61, 0x7f, 0x4a, 0x36, 0x55, 0x79, 0xde, 0xd6, 0xd5, 0x98, 0x27, - 0x3c, 0x6f, 0xd5, 0xa8, 0xe2, 0x98, 0x86, 0x2e, 0xb5, 0x4d, 0x3f, 0x8c, 0x92, 0x9e, 0xb7, 0x97, - 0xfd, 0x30, 0xc2, 0x0c, 0x63, 0x3f, 0x0f, 0xb0, 0x74, 0x87, 0xd4, 0xf9, 0x8c, 0xd5, 0x2f, 0x3d, - 0x56, 0xfe, 0xa5, 0xc7, 0xfe, 0x7d, 0x0b, 0xc6, 0x96, 0x17, 0x8c, 0x93, 0x6b, 0x16, 0x80, 0xdf, - 0xd4, 0x6e, 0xde, 0x5c, 0x95, 0xee, 0x1f, 0xdc, 0x02, 0xae, 0xa0, 0x58, 0xa3, 0x40, 0x27, 0xa1, - 0xd8, 0x6c, 0x7b, 0x42, 0xed, 0x39, 0x48, 0x8f, 0xc7, 0xab, 0x6d, 0x0f, 0x53, 0x98, 0xf6, 0x58, - 0xa9, 0xd8, 0xf3, 0x63, 0xa5, 0xae, 0x41, 0x4a, 0x50, 0x19, 0xfa, 0x6f, 0xdf, 0x76, 0x1b, 0xfc, - 0x29, 0xb8, 0x70, 0x4d, 0xb9, 0x79, 0xb3, 0xb2, 0x18, 0x62, 0x0e, 0xb7, 0xbf, 0x54, 0x84, 0x99, - 0xe5, 0x26, 0xb9, 0xf3, 0x0e, 0x9f, 0xc3, 0xf7, 0xfa, 0xd4, 0xea, 0x60, 0x0a, 0xa4, 0x83, 0x3e, - 0xa7, 0xeb, 0xde, 0x1f, 0xeb, 0x30, 0xc8, 0x1d, 0x4f, 0xe5, 0xe3, 0xf8, 0x4c, 0x73, 0x5f, 0x7e, - 0x87, 0xcc, 0x72, 0x07, 0x56, 0x61, 0xee, 0x53, 0x07, 0xa6, 0x80, 0x62, 0xc9, 0x7c, 0xe6, 0x65, - 0x18, 0xd1, 0x29, 0x0f, 0xf4, 0xb0, 0xf5, 0x7b, 0x8b, 0x30, 0x41, 0x5b, 0xf0, 0x40, 0x07, 0xe2, - 0x7a, 0x7a, 0x20, 0x0e, 0xfb, 0x71, 0x63, 0xf7, 0xd1, 0x78, 0x2b, 0x39, 0x1a, 0x17, 0xf3, 0x46, - 0xe3, 0xa8, 0xc7, 0xe0, 0xfb, 0x2c, 0x98, 0x5a, 0x6e, 0xfa, 0xf5, 0xad, 0xc4, 0x03, 0xc4, 0x17, - 0x61, 0x98, 0x6e, 0xc7, 0xa1, 0x11, 0x8b, 0xc3, 0x88, 0xce, 0x22, 0x50, 0x58, 0xa7, 0xd3, 0x8a, - 0x5d, 0xbf, 0x5e, 0x59, 0xcc, 0x0a, 0xea, 0x22, 0x50, 0x58, 0xa7, 0xb3, 0x7f, 0xd7, 0x82, 0xd3, - 0x97, 0x16, 0x96, 0xe2, 0xa9, 0x98, 0x8a, 0x2b, 0x73, 0x0e, 0x06, 0x5a, 0x0d, 0xad, 0x29, 0xb1, - 0x5a, 0x78, 0x91, 0xb5, 0x42, 0x60, 0xdf, 0x2d, 0x31, 0x93, 0xae, 0x03, 0x5c, 0xc2, 0xd5, 0x05, - 0xb1, 0xef, 0x4a, 0x2b, 0x90, 0x95, 0x6b, 0x05, 0x7a, 0x1c, 0x06, 0xe9, 0xb9, 0xe0, 0xd6, 0x65, - 0xbb, 0xb9, 0x41, 0x9f, 0x83, 0xb0, 0xc4, 0xd9, 0x3f, 0x63, 0xc1, 0xd4, 0x25, 0x37, 0xa2, 0x87, - 0x76, 0x32, 0x70, 0x0a, 0x3d, 0xb5, 0x43, 0x37, 0xf2, 0x83, 0xdd, 0x64, 0xe0, 0x14, 0xac, 0x30, - 0x58, 0xa3, 0xe2, 0x1f, 0xb4, 0xe3, 0xb2, 0x97, 0x14, 0x05, 0xd3, 0xee, 0x86, 0x05, 0x1c, 0x2b, - 0x0a, 0xda, 0x5f, 0x0d, 0x37, 0x60, 0x2a, 0xcb, 0x5d, 0xb1, 0x71, 0xab, 0xfe, 0x5a, 0x94, 0x08, - 0x1c, 0xd3, 0xd8, 0x7f, 0x61, 0x41, 0xf9, 0x52, 0xb3, 0x1d, 0x46, 0x24, 0x58, 0x0f, 0x73, 0x36, - 0xdd, 0xe7, 0xa1, 0x44, 0xa4, 0x81, 0x40, 0x3e, 0xf9, 0x94, 0x82, 0xa8, 0xb2, 0x1c, 0xf0, 0xf8, - 0x2d, 0x8a, 0xae, 0x87, 0x57, 0xd2, 0x07, 0x7b, 0xe6, 0xba, 0x0c, 0x88, 0xe8, 0x75, 0xe9, 0x01, - 0x6d, 0x58, 0x64, 0x8c, 0xa5, 0x14, 0x16, 0x67, 0x94, 0xb0, 0x7f, 0xcc, 0x82, 0xe3, 0xea, 0x83, - 0xdf, 0x75, 0x9f, 0x69, 0x7f, 0xad, 0x00, 0xa3, 0x97, 0xd7, 0xd6, 0xaa, 0x97, 0x48, 0xa4, 0xcd, - 0xca, 0xce, 0x66, 0x7f, 0xac, 0x59, 0x2f, 0x3b, 0xdd, 0x11, 0xdb, 0x91, 0xdb, 0x9c, 0xe5, 0x71, - 0xd1, 0x66, 0x2b, 0x5e, 0x74, 0x2d, 0xa8, 0x45, 0x81, 0xeb, 0x6d, 0x64, 0xce, 0x74, 0x29, 0xb3, - 0x14, 0xf3, 0x64, 0x16, 0xf4, 0x3c, 0x0c, 0xb0, 0xc0, 0x6c, 0x72, 0x10, 0x1e, 0x56, 0x57, 0x2c, - 0x06, 0xdd, 0xdf, 0x2b, 0x97, 0xae, 0xe3, 0x0a, 0xff, 0x83, 0x05, 0x29, 0xba, 0x0e, 0xc3, 0x9b, - 0x51, 0xd4, 0xba, 0x4c, 0x9c, 0x06, 0x09, 0xe4, 0x2e, 0x7b, 0x26, 0x6b, 0x97, 0xa5, 0x9d, 0xc0, - 0xc9, 0xe2, 0x8d, 0x29, 0x86, 0x85, 0x58, 0xe7, 0x63, 0xd7, 0x00, 0x62, 0xdc, 0x21, 0x19, 0x6e, - 0xec, 0x35, 0x28, 0xd1, 0xcf, 0x9d, 0x6b, 0xba, 0x4e, 0x67, 0xd3, 0xf8, 0xd3, 0x50, 0x92, 0x86, - 0xef, 0x50, 0x44, 0x71, 0x60, 0x27, 0x92, 0xb4, 0x8b, 0x87, 0x38, 0xc6, 0xdb, 0x8f, 0x81, 0xf0, - 0x2d, 0xed, 0xc4, 0xd2, 0x5e, 0x87, 0x63, 0xcc, 0x49, 0xd6, 0x89, 0x36, 0x8d, 0x39, 0xda, 0x7d, - 0x32, 0x3c, 0x23, 0xee, 0x75, 0xfc, 0xcb, 0xa6, 0xb5, 0xc7, 0xc9, 0x23, 0x92, 0x63, 0x7c, 0xc7, - 0xb3, 0xff, 0xbc, 0x0f, 0x1e, 0xae, 0xd4, 0xf2, 0xc3, 0x0f, 0xbd, 0x04, 0x23, 0x5c, 0x5c, 0xa4, - 0x53, 0xc3, 0x69, 0x8a, 0x7a, 0x95, 0x06, 0x74, 0x4d, 0xc3, 0x61, 0x83, 0x12, 0x9d, 0x86, 0xa2, - 0xfb, 0xb6, 0x97, 0x7c, 0xba, 0x57, 0x79, 0x63, 0x15, 0x53, 0x38, 0x45, 0x53, 0xc9, 0x93, 0x6f, - 0xe9, 0x0a, 0xad, 0xa4, 0xcf, 0xd7, 0x60, 0xcc, 0x0d, 0xeb, 0xa1, 0x5b, 0xf1, 0xe8, 0x3a, 0xd5, - 0x56, 0xba, 0xd2, 0x39, 0xd0, 0x46, 0x2b, 0x2c, 0x4e, 0x50, 0x6b, 0xe7, 0x4b, 0x7f, 0xcf, 0xd2, - 0x6b, 0xd7, 0xe0, 0x07, 0x74, 0xfb, 0x6f, 0xb1, 0xaf, 0x0b, 0x99, 0x0a, 0x5e, 0x6c, 0xff, 0xfc, - 0x83, 0x43, 0x2c, 0x71, 0xf4, 0x42, 0x57, 0xdf, 0x74, 0x5a, 0x73, 0xed, 0x68, 0x73, 0xd1, 0x0d, - 0xeb, 0xfe, 0x0e, 0x09, 0x76, 0xd9, 0x5d, 0x7c, 0x28, 0xbe, 0xd0, 0x29, 0xc4, 0xc2, 0xe5, 0xb9, - 0x2a, 0xa5, 0xc4, 0xe9, 0x32, 0x68, 0x0e, 0xc6, 0x25, 0xb0, 0x46, 0x42, 0x76, 0x04, 0x0c, 0x33, - 0x36, 0xea, 0x31, 0x9d, 0x00, 0x2b, 0x26, 0x49, 0x7a, 0x53, 0xc0, 0x85, 0xc3, 0x10, 0x70, 0x3f, - 0x08, 0xa3, 0xae, 0xe7, 0x46, 0xae, 0x13, 0xf9, 0xdc, 0x7e, 0xc4, 0xaf, 0xdd, 0x4c, 0xc1, 0x5c, - 0xd1, 0x11, 0xd8, 0xa4, 0xb3, 0xff, 0x6d, 0x1f, 0x4c, 0xb2, 0x61, 0x7b, 0x6f, 0x86, 0x7d, 0x27, - 0xcd, 0xb0, 0xeb, 0xe9, 0x19, 0x76, 0x18, 0x92, 0xfb, 0x7d, 0x4f, 0xb3, 0x4f, 0x43, 0x49, 0xbd, - 0x1f, 0x94, 0x0f, 0x88, 0xad, 0x9c, 0x07, 0xc4, 0xdd, 0x4f, 0x6f, 0xe9, 0x92, 0x56, 0xcc, 0x74, - 0x49, 0xfb, 0x8a, 0x05, 0xb1, 0x61, 0x01, 0xbd, 0x01, 0xa5, 0x96, 0xcf, 0x3c, 0x5c, 0x03, 0xe9, - 0x36, 0xfe, 0x58, 0x47, 0xcb, 0x04, 0x8f, 0xc0, 0x16, 0xf0, 0x5e, 0xa8, 0xca, 0xa2, 0x38, 0xe6, - 0x82, 0xae, 0xc0, 0x60, 0x2b, 0x20, 0xb5, 0x88, 0x85, 0x07, 0xea, 0x9d, 0x21, 0x9f, 0x35, 0xbc, - 0x20, 0x96, 0x1c, 0xec, 0x5f, 0x28, 0xc0, 0x44, 0x92, 0x14, 0xbd, 0x0a, 0x7d, 0xe4, 0x0e, 0xa9, - 0x8b, 0xf6, 0x66, 0x1e, 0xc5, 0xb1, 0x6a, 0x82, 0x77, 0x00, 0xfd, 0x8f, 0x59, 0x29, 0x74, 0x19, - 0x06, 0xe9, 0x39, 0x7c, 0x49, 0x85, 0xc2, 0x7b, 0x24, 0xef, 0x2c, 0x57, 0x02, 0x0d, 0x6f, 0x9c, - 0x00, 0x61, 0x59, 0x9c, 0xf9, 0x81, 0xd5, 0x5b, 0x35, 0x7a, 0xc5, 0x89, 0x3a, 0xdd, 0xc4, 0xd7, - 0x16, 0xaa, 0x9c, 0x48, 0x70, 0xe3, 0x7e, 0x60, 0x12, 0x88, 0x63, 0x26, 0xe8, 0x23, 0xd0, 0x1f, - 0x36, 0x09, 0x69, 0x09, 0x43, 0x7f, 0xa6, 0x72, 0xb1, 0x46, 0x09, 0x04, 0x27, 0xa6, 0x8c, 0x60, - 0x00, 0xcc, 0x0b, 0xda, 0xbf, 0x68, 0x01, 0x70, 0xc7, 0x39, 0xc7, 0xdb, 0x20, 0x47, 0xa0, 0x8f, - 0x5f, 0x84, 0xbe, 0xb0, 0x45, 0xea, 0x9d, 0xdc, 0xb7, 0xe3, 0xf6, 0xd4, 0x5a, 0xa4, 0x1e, 0xcf, - 0x59, 0xfa, 0x0f, 0xb3, 0xd2, 0xf6, 0xf7, 0x03, 0x8c, 0xc5, 0x64, 0x95, 0x88, 0x6c, 0xa3, 0x67, - 0x8d, 0xb0, 0x25, 0x27, 0x13, 0x61, 0x4b, 0x4a, 0x8c, 0x5a, 0x53, 0xfd, 0x7e, 0x1a, 0x8a, 0xdb, - 0xce, 0x1d, 0xa1, 0xdb, 0x7b, 0xba, 0x73, 0x33, 0x28, 0xff, 0xd9, 0x15, 0xe7, 0x0e, 0xbf, 0xfe, - 0x3e, 0x2d, 0xd7, 0xd8, 0x8a, 0x73, 0xa7, 0xab, 0x8b, 0x31, 0xad, 0x84, 0xd5, 0xe5, 0x7a, 0xc2, - 0x27, 0xac, 0xa7, 0xba, 0x5c, 0x2f, 0x59, 0x97, 0xeb, 0xf5, 0x50, 0x97, 0xeb, 0xa1, 0xbb, 0x30, - 0x28, 0x5c, 0x36, 0x45, 0x60, 0xb3, 0x0b, 0x3d, 0xd4, 0x27, 0x3c, 0x3e, 0x79, 0x9d, 0x17, 0xe4, - 0xf5, 0x5e, 0x40, 0xbb, 0xd6, 0x2b, 0x2b, 0x44, 0xff, 0xb7, 0x05, 0x63, 0xe2, 0x37, 0x26, 0x6f, - 0xb7, 0x49, 0x18, 0x09, 0xf1, 0xf7, 0x03, 0xbd, 0xb7, 0x41, 0x14, 0xe4, 0x4d, 0xf9, 0x80, 0x3c, - 0xa9, 0x4c, 0x64, 0xd7, 0x16, 0x25, 0x5a, 0x81, 0x7e, 0xc1, 0x82, 0x63, 0xdb, 0xce, 0x1d, 0x5e, - 0x23, 0x87, 0x61, 0x27, 0x72, 0x7d, 0xe1, 0xfa, 0xf0, 0x6a, 0x6f, 0xc3, 0x9f, 0x2a, 0xce, 0x1b, - 0x29, 0xed, 0x9c, 0xc7, 0xb2, 0x48, 0xba, 0x36, 0x35, 0xb3, 0x5d, 0x33, 0xeb, 0x30, 0x24, 0xe7, - 0xdb, 0x83, 0xf4, 0x0f, 0x67, 0xf5, 0x88, 0xb9, 0xf6, 0x40, 0xeb, 0xf9, 0x34, 0x8c, 0xe8, 0x73, - 0xec, 0x81, 0xd6, 0xf5, 0x36, 0x4c, 0x65, 0xcc, 0xa5, 0x07, 0x5a, 0xe5, 0x6d, 0x38, 0x99, 0x3b, - 0x3f, 0x1e, 0xa8, 0x7f, 0xff, 0xd7, 0x2c, 0x7d, 0x1f, 0x3c, 0x02, 0xa3, 0xc8, 0x82, 0x69, 0x14, - 0x39, 0xd3, 0x79, 0xe5, 0xe4, 0x58, 0x46, 0xde, 0xd2, 0x1b, 0x4d, 0x77, 0x75, 0xf4, 0x3a, 0x0c, - 0x34, 0x29, 0x44, 0x3a, 0xfe, 0xda, 0xdd, 0x57, 0x64, 0x2c, 0x8e, 0x32, 0x78, 0x88, 0x05, 0x07, - 0xfb, 0x57, 0x2c, 0xe8, 0x3b, 0x82, 0x9e, 0xc0, 0x66, 0x4f, 0x3c, 0x9b, 0xcb, 0x5a, 0xc4, 0x78, - 0x9f, 0xc5, 0xce, 0xed, 0xa5, 0x3b, 0x11, 0xf1, 0x42, 0x76, 0xa6, 0x67, 0x76, 0xcc, 0x9e, 0x05, - 0x53, 0x57, 0x7d, 0xa7, 0x31, 0xef, 0x34, 0x1d, 0xaf, 0x4e, 0x82, 0x8a, 0xb7, 0x71, 0x20, 0xaf, - 0xf5, 0x42, 0x57, 0xaf, 0xf5, 0x97, 0x60, 0xc0, 0x6d, 0x69, 0x31, 0xab, 0xcf, 0xd2, 0x0e, 0xac, - 0x54, 0x45, 0xb8, 0x6a, 0x64, 0x54, 0xce, 0xa0, 0x58, 0xd0, 0xd3, 0x91, 0xe7, 0xee, 0x62, 0x7d, - 0xf9, 0x23, 0x4f, 0xa5, 0xf8, 0x64, 0x08, 0x28, 0xc3, 0xb1, 0x79, 0x13, 0x8c, 0x2a, 0xc4, 0xab, - 0x2f, 0x0c, 0x83, 0x2e, 0xff, 0x52, 0x31, 0xfc, 0x4f, 0x64, 0x4b, 0xd7, 0xa9, 0x8e, 0xd1, 0xde, - 0x33, 0x71, 0x00, 0x96, 0x8c, 0xec, 0x97, 0x20, 0x33, 0x64, 0x47, 0x77, 0xcd, 0x89, 0xfd, 0x31, - 0x98, 0x64, 0x25, 0x0f, 0xa8, 0x95, 0xb0, 0x13, 0xfa, 0xde, 0x8c, 0xf0, 0xa3, 0xf6, 0x17, 0x2c, - 0x18, 0x5f, 0x4d, 0x44, 0x65, 0x3c, 0xc7, 0x2c, 0xc4, 0x19, 0x66, 0x86, 0x1a, 0x83, 0x62, 0x81, - 0x3d, 0x74, 0x35, 0xdc, 0xdf, 0x58, 0x10, 0x47, 0xd1, 0x39, 0x02, 0xc1, 0x6f, 0xc1, 0x10, 0xfc, - 0x32, 0x85, 0x68, 0xd5, 0x9c, 0x3c, 0xb9, 0x0f, 0x5d, 0x51, 0xf1, 0xe5, 0x3a, 0xc8, 0xcf, 0x31, - 0x1b, 0x3e, 0x15, 0xc7, 0xcc, 0x20, 0x74, 0x32, 0xe2, 0x9c, 0xfd, 0x07, 0x05, 0x40, 0x8a, 0xb6, - 0xe7, 0xf8, 0x77, 0xe9, 0x12, 0x87, 0x13, 0xff, 0x6e, 0x07, 0x10, 0xf3, 0x71, 0x08, 0x1c, 0x2f, - 0xe4, 0x6c, 0x5d, 0xa1, 0x78, 0x3c, 0x98, 0x03, 0xc5, 0x8c, 0x7c, 0x10, 0x77, 0x35, 0xc5, 0x0d, - 0x67, 0xd4, 0xa0, 0xf9, 0xae, 0xf4, 0xf7, 0xea, 0xbb, 0x32, 0xd0, 0xe5, 0x65, 0xe7, 0x57, 0x2d, - 0x18, 0x55, 0xdd, 0xf4, 0x2e, 0xf1, 0xff, 0x57, 0xed, 0xc9, 0xd9, 0x7a, 0xab, 0x5a, 0x93, 0xd9, - 0x91, 0xf4, 0x5d, 0xec, 0x85, 0xae, 0xd3, 0x74, 0xef, 0x12, 0x15, 0x2f, 0xb5, 0x2c, 0x5e, 0xdc, - 0x0a, 0xe8, 0xfe, 0x5e, 0x79, 0x54, 0xfd, 0xe3, 0xf1, 0xe0, 0xe3, 0x22, 0xf6, 0x4f, 0xd1, 0xc5, - 0x6e, 0x4e, 0x45, 0xf4, 0x22, 0xf4, 0xb7, 0x36, 0x9d, 0x90, 0x24, 0xde, 0x49, 0xf5, 0x57, 0x29, - 0x70, 0x7f, 0xaf, 0x3c, 0xa6, 0x0a, 0x30, 0x08, 0xe6, 0xd4, 0xbd, 0x47, 0x15, 0x4c, 0x4f, 0xce, - 0xae, 0x51, 0x05, 0xff, 0xca, 0x82, 0xbe, 0x55, 0xba, 0xc1, 0x3f, 0xf8, 0x2d, 0xe0, 0x35, 0x63, - 0x0b, 0x38, 0x95, 0x97, 0xaa, 0x23, 0x77, 0xf5, 0x2f, 0x27, 0x56, 0xff, 0x99, 0x5c, 0x0e, 0x9d, - 0x17, 0xfe, 0x36, 0x0c, 0xb3, 0x04, 0x20, 0xe2, 0x4d, 0xd8, 0xf3, 0xc6, 0x82, 0x2f, 0x27, 0x16, - 0xfc, 0xb8, 0x46, 0xaa, 0xad, 0xf4, 0x27, 0x61, 0x50, 0x3c, 0x32, 0x4a, 0x3e, 0x74, 0x16, 0xb4, - 0x58, 0xe2, 0xed, 0x1f, 0x2f, 0x82, 0x91, 0x70, 0x04, 0xfd, 0x9a, 0x05, 0xb3, 0x01, 0x77, 0x3e, - 0x6e, 0x2c, 0xb6, 0x03, 0xd7, 0xdb, 0xa8, 0xd5, 0x37, 0x49, 0xa3, 0xdd, 0x74, 0xbd, 0x8d, 0xca, - 0x86, 0xe7, 0x2b, 0xf0, 0xd2, 0x1d, 0x52, 0x6f, 0x33, 0xc3, 0x60, 0x97, 0xec, 0x26, 0xca, 0x89, - 0xff, 0xb9, 0x7b, 0x7b, 0xe5, 0x59, 0x7c, 0x20, 0xde, 0xf8, 0x80, 0x6d, 0x41, 0xbf, 0x6b, 0xc1, - 0x05, 0x9e, 0x87, 0xa3, 0xf7, 0xf6, 0x77, 0xb8, 0x67, 0x57, 0x25, 0xab, 0x98, 0xc9, 0x1a, 0x09, - 0xb6, 0xe7, 0x3f, 0x28, 0x3a, 0xf4, 0x42, 0xf5, 0x60, 0x75, 0xe1, 0x83, 0x36, 0xce, 0xfe, 0x87, - 0x45, 0x18, 0x15, 0xd1, 0xe7, 0xc4, 0x19, 0xf0, 0xa2, 0x31, 0x25, 0x1e, 0x49, 0x4c, 0x89, 0x49, - 0x83, 0xf8, 0x70, 0xb6, 0xff, 0x10, 0x26, 0xe9, 0xe6, 0x7c, 0x99, 0x38, 0x41, 0x74, 0x8b, 0x38, - 0xdc, 0x25, 0xad, 0x78, 0xe0, 0xdd, 0x5f, 0xe9, 0x46, 0xaf, 0x26, 0x99, 0xe1, 0x34, 0xff, 0xef, - 0xa4, 0x33, 0xc7, 0x83, 0x89, 0x54, 0x00, 0xc1, 0x37, 0xa1, 0xa4, 0x5e, 0xc8, 0x88, 0x4d, 0xa7, - 0x73, 0x1c, 0xce, 0x24, 0x07, 0xae, 0x7a, 0x8b, 0x5f, 0x67, 0xc5, 0xec, 0xec, 0xbf, 0x5b, 0x30, - 0x2a, 0xe4, 0x83, 0xb8, 0x0a, 0x43, 0x4e, 0x18, 0xba, 0x1b, 0x1e, 0x69, 0x74, 0xd2, 0x8e, 0xa6, - 0xaa, 0x61, 0xaf, 0x94, 0xe6, 0x44, 0x49, 0xac, 0x78, 0xa0, 0xcb, 0xdc, 0xf1, 0x6f, 0x87, 0x74, - 0x52, 0x8d, 0xa6, 0xb8, 0x81, 0x74, 0x0d, 0xdc, 0x21, 0x58, 0x94, 0x47, 0x9f, 0xe0, 0x9e, 0x99, - 0x57, 0x3c, 0xff, 0xb6, 0x77, 0xc9, 0xf7, 0x65, 0xa4, 0x91, 0xde, 0x18, 0x4e, 0x4a, 0x7f, 0x4c, - 0x55, 0x1c, 0x9b, 0xdc, 0x7a, 0x8b, 0xc8, 0xfb, 0x19, 0x60, 0x79, 0x07, 0xcc, 0x07, 0xe9, 0x21, - 0x22, 0x30, 0x2e, 0x42, 0x1b, 0x4a, 0x98, 0xe8, 0xbb, 0xcc, 0x4b, 0xa0, 0x59, 0x3a, 0x56, 0xe2, - 0x5f, 0x31, 0x59, 0xe0, 0x24, 0x4f, 0xfb, 0xa7, 0x2d, 0x60, 0x8f, 0x73, 0x8f, 0x40, 0x1e, 0xf9, - 0xb0, 0x29, 0x8f, 0x4c, 0xe7, 0x75, 0x72, 0x8e, 0x28, 0xf2, 0x02, 0x9f, 0x59, 0xd5, 0xc0, 0xbf, - 0xb3, 0x2b, 0xdc, 0x69, 0xba, 0xdf, 0x3f, 0xec, 0xff, 0x66, 0xf1, 0x4d, 0x2c, 0x0e, 0x65, 0xf0, - 0x59, 0x18, 0xaa, 0x3b, 0x2d, 0xa7, 0xce, 0xb3, 0x63, 0xe5, 0xea, 0x02, 0x8d, 0x42, 0xb3, 0x0b, - 0xa2, 0x04, 0xd7, 0x6d, 0xc9, 0x10, 0x99, 0x43, 0x12, 0xdc, 0x55, 0x9f, 0xa5, 0xaa, 0x9c, 0xd9, - 0x82, 0x51, 0x83, 0xd9, 0x03, 0x55, 0x84, 0x7c, 0x96, 0x1f, 0xb1, 0x2a, 0xa4, 0xeb, 0x36, 0x4c, - 0x7a, 0xda, 0x7f, 0x7a, 0xa0, 0xc8, 0xcb, 0xe5, 0x63, 0xdd, 0x0e, 0x51, 0x76, 0xfa, 0x68, 0xef, - 0x7e, 0x13, 0x6c, 0x70, 0x9a, 0xb3, 0xfd, 0x13, 0x16, 0x3c, 0xa4, 0x13, 0x6a, 0x4f, 0x8b, 0xba, - 0x19, 0x68, 0x16, 0x61, 0xc8, 0x6f, 0x91, 0xc0, 0x89, 0xfc, 0x40, 0x9c, 0x1a, 0xe7, 0x65, 0xa7, - 0x5f, 0x13, 0xf0, 0x7d, 0x91, 0xeb, 0x41, 0x72, 0x97, 0x70, 0xac, 0x4a, 0xd2, 0xdb, 0x27, 0xeb, - 0x8c, 0x50, 0x3c, 0x22, 0x63, 0x7b, 0x00, 0xb3, 0xf5, 0x87, 0x58, 0x60, 0xec, 0x3f, 0xb7, 0xf8, - 0xc4, 0xd2, 0x9b, 0x8e, 0xde, 0x86, 0x89, 0x6d, 0x27, 0xaa, 0x6f, 0x2e, 0xdd, 0x69, 0x05, 0xdc, - 0xdc, 0x25, 0xfb, 0xe9, 0xe9, 0x6e, 0xfd, 0xa4, 0x7d, 0x64, 0xec, 0x6c, 0xba, 0x92, 0x60, 0x86, - 0x53, 0xec, 0xd1, 0x2d, 0x18, 0x66, 0x30, 0xf6, 0x3e, 0x32, 0xec, 0x24, 0x1a, 0xe4, 0xd5, 0xa6, - 0xdc, 0x25, 0x56, 0x62, 0x3e, 0x58, 0x67, 0x6a, 0x7f, 0xa5, 0xc8, 0x57, 0x3b, 0x13, 0xe5, 0x9f, - 0x84, 0xc1, 0x96, 0xdf, 0x58, 0xa8, 0x2c, 0x62, 0x31, 0x0a, 0xea, 0x18, 0xa9, 0x72, 0x30, 0x96, - 0x78, 0x74, 0x1e, 0x86, 0xc4, 0x4f, 0x69, 0x9e, 0x64, 0x7b, 0xb3, 0xa0, 0x0b, 0xb1, 0xc2, 0xa2, - 0xe7, 0x00, 0x5a, 0x81, 0xbf, 0xe3, 0x36, 0x58, 0xbc, 0x94, 0xa2, 0xe9, 0xe9, 0x54, 0x55, 0x18, - 0xac, 0x51, 0xa1, 0x57, 0x60, 0xb4, 0xed, 0x85, 0x5c, 0x1c, 0xd1, 0xa2, 0x52, 0x2b, 0x1f, 0x9c, - 0xeb, 0x3a, 0x12, 0x9b, 0xb4, 0x68, 0x0e, 0x06, 0x22, 0x87, 0x79, 0xee, 0xf4, 0xe7, 0x3b, 0x24, - 0xaf, 0x51, 0x0a, 0x3d, 0x11, 0x13, 0x2d, 0x80, 0x45, 0x41, 0xf4, 0xa6, 0x7c, 0xaa, 0xcc, 0x37, - 0x76, 0xf1, 0x12, 0xa0, 0xb7, 0x43, 0x40, 0x7b, 0xa8, 0x2c, 0x5e, 0x18, 0x18, 0xbc, 0xd0, 0xcb, - 0x00, 0xe4, 0x4e, 0x44, 0x02, 0xcf, 0x69, 0x2a, 0x7f, 0x3b, 0x25, 0x17, 0x2c, 0xfa, 0xab, 0x7e, - 0x74, 0x3d, 0x24, 0x4b, 0x8a, 0x02, 0x6b, 0xd4, 0xf6, 0xef, 0x96, 0x00, 0x62, 0xb9, 0x1d, 0xdd, - 0x4d, 0x6d, 0x5c, 0xcf, 0x74, 0x96, 0xf4, 0x0f, 0x6f, 0xd7, 0x42, 0x9f, 0xb7, 0x60, 0x58, 0x84, - 0x85, 0x61, 0x23, 0x54, 0xe8, 0xbc, 0x71, 0x9a, 0xd1, 0x69, 0x68, 0x09, 0xde, 0x84, 0xe7, 0xe5, - 0x0c, 0xd5, 0x30, 0x5d, 0x5b, 0xa1, 0x57, 0x8c, 0xde, 0x2f, 0xaf, 0x8a, 0x45, 0xa3, 0x2b, 0xd5, - 0x55, 0xb1, 0xc4, 0xce, 0x08, 0xfd, 0x96, 0x78, 0xdd, 0xb8, 0x25, 0xf6, 0xe5, 0xbf, 0xc5, 0x34, - 0xc4, 0xd7, 0x6e, 0x17, 0x44, 0x54, 0xd5, 0xe3, 0x32, 0xf4, 0xe7, 0x3f, 0x20, 0xd4, 0xee, 0x49, - 0x5d, 0x62, 0x32, 0x7c, 0x1a, 0xc6, 0x1b, 0xa6, 0x10, 0x20, 0x66, 0xe2, 0x13, 0x79, 0x7c, 0x13, - 0x32, 0x43, 0x7c, 0xec, 0x27, 0x10, 0x38, 0xc9, 0x18, 0x55, 0x79, 0x98, 0x8e, 0x8a, 0xb7, 0xee, - 0x8b, 0xd7, 0x28, 0x76, 0xee, 0x58, 0xee, 0x86, 0x11, 0xd9, 0xa6, 0x94, 0xf1, 0xe9, 0xbe, 0x2a, - 0xca, 0x62, 0xc5, 0x05, 0xbd, 0x0e, 0x03, 0xec, 0x05, 0x59, 0x38, 0x3d, 0x94, 0xaf, 0xab, 0x36, - 0xe3, 0x15, 0xc6, 0x0b, 0x92, 0xfd, 0x0d, 0xb1, 0xe0, 0x80, 0x2e, 0xcb, 0xf7, 0x99, 0x61, 0xc5, - 0xbb, 0x1e, 0x12, 0xf6, 0x3e, 0xb3, 0x34, 0xff, 0x58, 0xfc, 0xf4, 0x92, 0xc3, 0x33, 0xd3, 0x35, - 0x1a, 0x25, 0xa9, 0x14, 0x25, 0xfe, 0xcb, 0x2c, 0x90, 0x22, 0xba, 0x52, 0x66, 0xf3, 0xcc, 0x4c, - 0x91, 0x71, 0x77, 0xde, 0x30, 0x59, 0xe0, 0x24, 0x4f, 0x2a, 0x91, 0xf2, 0x55, 0x2f, 0xde, 0xb3, - 0x74, 0xdb, 0x3b, 0xf8, 0x45, 0x9c, 0x9d, 0x46, 0x1c, 0x82, 0x45, 0xf9, 0x23, 0x15, 0x0f, 0x66, - 0x3c, 0x98, 0x48, 0x2e, 0xd1, 0x07, 0x2a, 0x8e, 0xfc, 0x69, 0x1f, 0x8c, 0x99, 0x53, 0x0a, 0x5d, - 0x80, 0x92, 0x60, 0xa2, 0x32, 0xa9, 0xa8, 0x55, 0xb2, 0x22, 0x11, 0x38, 0xa6, 0x61, 0x09, 0x74, - 0x58, 0x71, 0xcd, 0x81, 0x39, 0x4e, 0xa0, 0xa3, 0x30, 0x58, 0xa3, 0xa2, 0x17, 0xab, 0x5b, 0xbe, - 0x1f, 0xa9, 0x03, 0x49, 0xcd, 0xbb, 0x79, 0x06, 0xc5, 0x02, 0x4b, 0x0f, 0xa2, 0x2d, 0x12, 0x78, - 0xa4, 0x69, 0x46, 0x30, 0x57, 0x07, 0xd1, 0x15, 0x1d, 0x89, 0x4d, 0x5a, 0x7a, 0x9c, 0xfa, 0x21, - 0x9b, 0xc8, 0xe2, 0xfa, 0x16, 0x3b, 0x84, 0xd7, 0xf8, 0xd3, 0x76, 0x89, 0x47, 0x1f, 0x83, 0x87, - 0x54, 0xb4, 0x30, 0xcc, 0xed, 0x20, 0xb2, 0xc6, 0x01, 0x43, 0xdb, 0xf2, 0xd0, 0x42, 0x36, 0x19, - 0xce, 0x2b, 0x8f, 0x5e, 0x83, 0x31, 0x21, 0xe2, 0x4b, 0x8e, 0x83, 0xa6, 0x77, 0xd3, 0x15, 0x03, - 0x8b, 0x13, 0xd4, 0x32, 0x06, 0x3b, 0x93, 0xb2, 0x25, 0x87, 0xa1, 0x74, 0x0c, 0x76, 0x1d, 0x8f, - 0x53, 0x25, 0xd0, 0x1c, 0x8c, 0x73, 0x19, 0xcc, 0xf5, 0x36, 0xf8, 0x98, 0x88, 0xe7, 0x66, 0x6a, - 0x49, 0x5d, 0x33, 0xd1, 0x38, 0x49, 0x8f, 0x5e, 0x82, 0x11, 0x27, 0xa8, 0x6f, 0xba, 0x11, 0xa9, - 0x47, 0xed, 0x80, 0xbf, 0x43, 0xd3, 0xdc, 0xc3, 0xe6, 0x34, 0x1c, 0x36, 0x28, 0xed, 0xbb, 0x30, - 0x95, 0x11, 0xf3, 0x82, 0x4e, 0x1c, 0xa7, 0xe5, 0xca, 0x6f, 0x4a, 0xf8, 0x60, 0xcf, 0x55, 0x2b, - 0xf2, 0x6b, 0x34, 0x2a, 0x3a, 0x3b, 0x59, 0x6c, 0x0c, 0x2d, 0xe9, 0xab, 0x9a, 0x9d, 0xcb, 0x12, - 0x81, 0x63, 0x1a, 0xfb, 0x3f, 0x16, 0x60, 0x3c, 0xc3, 0xb6, 0xc2, 0x12, 0x8f, 0x26, 0x2e, 0x29, - 0x71, 0x9e, 0x51, 0x33, 0xa4, 0x7f, 0xe1, 0x00, 0x21, 0xfd, 0x8b, 0xdd, 0x42, 0xfa, 0xf7, 0xbd, - 0x93, 0x90, 0xfe, 0x66, 0x8f, 0xf5, 0xf7, 0xd4, 0x63, 0x19, 0x69, 0x00, 0x06, 0x0e, 0x98, 0x06, - 0xc0, 0xe8, 0xf4, 0xc1, 0x1e, 0x3a, 0xfd, 0x47, 0x0a, 0x30, 0x91, 0x74, 0x63, 0x3d, 0x02, 0xbd, - 0xed, 0xeb, 0x86, 0xde, 0xf6, 0x7c, 0x2f, 0xcf, 0x83, 0x73, 0x75, 0xb8, 0x38, 0xa1, 0xc3, 0x7d, - 0xaa, 0x27, 0x6e, 0x9d, 0xf5, 0xb9, 0x3f, 0x59, 0x80, 0xe3, 0x99, 0xef, 0x93, 0x8f, 0xa0, 0x6f, - 0xae, 0x19, 0x7d, 0xf3, 0x6c, 0xcf, 0x4f, 0xa7, 0x73, 0x3b, 0xe8, 0x66, 0xa2, 0x83, 0x2e, 0xf4, - 0xce, 0xb2, 0x73, 0x2f, 0x7d, 0xa3, 0x08, 0x67, 0x32, 0xcb, 0xc5, 0x6a, 0xcf, 0x65, 0x43, 0xed, - 0xf9, 0x5c, 0x42, 0xed, 0x69, 0x77, 0x2e, 0x7d, 0x38, 0x7a, 0x50, 0xf1, 0x84, 0x98, 0x05, 0x42, - 0xb8, 0x4f, 0x1d, 0xa8, 0xf1, 0x84, 0x58, 0x31, 0xc2, 0x26, 0xdf, 0xef, 0x24, 0xdd, 0xe7, 0xef, - 0x58, 0x70, 0x32, 0x73, 0x6c, 0x8e, 0x40, 0xd7, 0xb5, 0x6a, 0xea, 0xba, 0x9e, 0xec, 0x79, 0xb6, - 0xe6, 0x28, 0xbf, 0x7e, 0xae, 0x3f, 0xe7, 0x5b, 0xd8, 0x4d, 0xfe, 0x1a, 0x0c, 0x3b, 0xf5, 0x3a, - 0x09, 0xc3, 0x15, 0xbf, 0xa1, 0xa2, 0x7f, 0x3f, 0xcb, 0xee, 0x59, 0x31, 0x78, 0x7f, 0xaf, 0x3c, - 0x93, 0x64, 0x11, 0xa3, 0xb1, 0xce, 0x01, 0x7d, 0x02, 0x86, 0x42, 0x71, 0x6e, 0x8a, 0xb1, 0x7f, - 0xbe, 0xc7, 0xce, 0x71, 0x6e, 0x91, 0xa6, 0x19, 0x66, 0x4a, 0x69, 0x2a, 0x14, 0x4b, 0xf4, 0xbf, - 0xe8, 0x21, 0x69, 0xd2, 0x52, 0x65, 0x22, 0x40, 0xca, 0x7d, 0x04, 0xa6, 0x79, 0x0e, 0x60, 0x47, - 0x5d, 0x09, 0x92, 0x5a, 0x08, 0xed, 0xb2, 0xa0, 0x51, 0xa1, 0x8f, 0xc0, 0x44, 0xc8, 0xa3, 0x31, - 0x2e, 0x34, 0x9d, 0x90, 0xbd, 0xf7, 0x11, 0x73, 0x91, 0x05, 0xb4, 0xaa, 0x25, 0x70, 0x38, 0x45, - 0x8d, 0x96, 0x65, 0xad, 0xcc, 0x93, 0x84, 0x4f, 0xcf, 0x73, 0x71, 0x8d, 0xc2, 0x9b, 0xe4, 0x58, - 0x72, 0x10, 0x58, 0xf7, 0x6b, 0x25, 0xd1, 0x27, 0x00, 0xe8, 0x24, 0x12, 0xda, 0x88, 0xc1, 0xfc, - 0x2d, 0x94, 0xee, 0x2d, 0x8d, 0x4c, 0xf7, 0x6a, 0xf6, 0xf6, 0x77, 0x51, 0x31, 0xc1, 0x1a, 0x43, - 0xe4, 0xc0, 0x68, 0xfc, 0x2f, 0xce, 0x0d, 0x7c, 0x3e, 0xb7, 0x86, 0x24, 0x73, 0xa6, 0xf8, 0x5e, - 0xd4, 0x59, 0x60, 0x93, 0xa3, 0xfd, 0xef, 0x86, 0xe0, 0xe1, 0x0e, 0x9b, 0x31, 0x9a, 0x33, 0x0d, - 0xbe, 0x4f, 0x27, 0x6f, 0xf1, 0x33, 0x99, 0x85, 0x8d, 0x6b, 0x7d, 0x62, 0xce, 0x17, 0xde, 0xf1, - 0x9c, 0xff, 0x21, 0x4b, 0xd3, 0xaf, 0x70, 0xa7, 0xd4, 0x0f, 0x1f, 0xf0, 0x90, 0x39, 0x44, 0x85, - 0xcb, 0x7a, 0x86, 0xd6, 0xe2, 0xb9, 0x9e, 0x9b, 0xd3, 0xbb, 0x1a, 0xe3, 0x6b, 0xd9, 0x21, 0x88, - 0xb9, 0x42, 0xe3, 0xd2, 0x41, 0xbf, 0xff, 0xa8, 0xc2, 0x11, 0xff, 0x81, 0x05, 0x27, 0x53, 0x60, - 0xde, 0x06, 0x12, 0x8a, 0x28, 0x59, 0xab, 0xef, 0xb8, 0xf1, 0x92, 0x21, 0xff, 0x86, 0xcb, 0xe2, - 0x1b, 0x4e, 0xe6, 0xd2, 0x25, 0x9b, 0xfe, 0xc5, 0x3f, 0x2e, 0x4f, 0xb1, 0x0a, 0x4c, 0x42, 0x9c, - 0xdf, 0xf4, 0xa3, 0xbd, 0xfe, 0x7f, 0x6b, 0xa2, 0x2f, 0xcf, 0x5c, 0x85, 0x33, 0x9d, 0xbb, 0xfa, - 0x40, 0x0f, 0xa4, 0x7f, 0xdf, 0x82, 0xd3, 0x1d, 0xa3, 0xf0, 0x7c, 0x1b, 0x4a, 0xbb, 0xf6, 0xe7, - 0x2c, 0x78, 0x24, 0xb3, 0x84, 0xe1, 0x23, 0x77, 0x01, 0x4a, 0xf5, 0x44, 0x46, 0xd6, 0x38, 0x1e, - 0x85, 0xca, 0xc6, 0x1a, 0xd3, 0x18, 0xae, 0x70, 0x85, 0xae, 0xae, 0x70, 0xbf, 0x69, 0x41, 0xea, - 0xac, 0x3a, 0x02, 0xd1, 0xa9, 0x62, 0x8a, 0x4e, 0x8f, 0xf5, 0xd2, 0x9b, 0x39, 0x52, 0xd3, 0x5f, - 0x8e, 0xc3, 0x89, 0x9c, 0xf7, 0x8d, 0x3b, 0x30, 0xb9, 0x51, 0x27, 0xe6, 0x83, 0xf6, 0x4e, 0x81, - 0x9e, 0x3a, 0xbe, 0x7e, 0xe7, 0x89, 0x70, 0x53, 0x24, 0x38, 0x5d, 0x05, 0xfa, 0x9c, 0x05, 0xc7, - 0x9c, 0xdb, 0xe1, 0x12, 0x15, 0x81, 0xdd, 0xfa, 0x7c, 0xd3, 0xaf, 0x6f, 0x51, 0xc9, 0x42, 0x2e, - 0xab, 0x17, 0x32, 0xd5, 0x92, 0x37, 0x6b, 0x29, 0x7a, 0xa3, 0x7a, 0x96, 0xf6, 0x3c, 0x8b, 0x0a, - 0x67, 0xd6, 0x85, 0xb0, 0xc8, 0xd0, 0x42, 0x2f, 0xd8, 0x1d, 0x42, 0x2e, 0x64, 0x3d, 0x44, 0xe5, - 0x32, 0x9d, 0xc4, 0x60, 0xc5, 0x07, 0x7d, 0x0a, 0x4a, 0x1b, 0xf2, 0x75, 0x75, 0x86, 0xcc, 0x18, - 0x77, 0x64, 0xe7, 0x37, 0xe7, 0xdc, 0xb7, 0x40, 0x11, 0xe1, 0x98, 0x29, 0x7a, 0x0d, 0x8a, 0xde, - 0x7a, 0xd8, 0x29, 0x73, 0x78, 0xc2, 0x89, 0x94, 0x07, 0x36, 0x59, 0x5d, 0xae, 0x61, 0x5a, 0x10, - 0x5d, 0x86, 0x62, 0x70, 0xab, 0x21, 0x74, 0xea, 0x99, 0x8b, 0x14, 0xcf, 0x2f, 0xe6, 0xb4, 0x8a, - 0x71, 0xc2, 0xf3, 0x8b, 0x98, 0xb2, 0x40, 0x55, 0xe8, 0x67, 0x8f, 0x02, 0x85, 0x6c, 0x96, 0x79, - 0x17, 0xed, 0xf0, 0xb8, 0x96, 0x3f, 0x38, 0x62, 0x04, 0x98, 0x33, 0x42, 0x6b, 0x30, 0x50, 0x67, - 0x59, 0xa6, 0x85, 0x30, 0xf6, 0xfe, 0x4c, 0xed, 0x79, 0x87, 0xf4, 0xdb, 0x42, 0x99, 0xcc, 0x28, - 0xb0, 0xe0, 0xc5, 0xb8, 0x92, 0xd6, 0xe6, 0x7a, 0xc8, 0xb4, 0x6f, 0x79, 0x5c, 0x3b, 0x64, 0x95, - 0x17, 0x5c, 0x19, 0x05, 0x16, 0xbc, 0xd0, 0xcb, 0x50, 0x58, 0xaf, 0x8b, 0x07, 0x7f, 0x99, 0x6a, - 0x74, 0x33, 0x36, 0xcd, 0xfc, 0xc0, 0xbd, 0xbd, 0x72, 0x61, 0x79, 0x01, 0x17, 0xd6, 0xeb, 0x68, - 0x15, 0x06, 0xd7, 0x79, 0x34, 0x0b, 0xa1, 0x29, 0x7f, 0x22, 0x3b, 0xd0, 0x46, 0x2a, 0xe0, 0x05, - 0x7f, 0x3c, 0x26, 0x10, 0x58, 0x32, 0x61, 0x09, 0x43, 0x54, 0x54, 0x0e, 0x11, 0x14, 0x70, 0xf6, - 0x60, 0x91, 0x54, 0xb8, 0xac, 0x1c, 0xc7, 0xf6, 0xc0, 0x1a, 0x47, 0x3a, 0xab, 0x9d, 0xbb, 0xed, - 0x80, 0x45, 0x8c, 0x17, 0xd1, 0xa3, 0x32, 0x67, 0xf5, 0x9c, 0x24, 0xea, 0x34, 0xab, 0x15, 0x11, - 0x8e, 0x99, 0xa2, 0x2d, 0x18, 0xdd, 0x09, 0x5b, 0x9b, 0x44, 0x2e, 0x69, 0x16, 0x4c, 0x2a, 0x47, - 0xd6, 0xbb, 0x21, 0x08, 0xdd, 0x20, 0x6a, 0x3b, 0xcd, 0xd4, 0x2e, 0xc4, 0xe4, 0xf2, 0x1b, 0x3a, - 0x33, 0x6c, 0xf2, 0xa6, 0xdd, 0xff, 0x76, 0xdb, 0xbf, 0xb5, 0x1b, 0x11, 0x11, 0xcb, 0x2f, 0xb3, - 0xfb, 0xdf, 0xe0, 0x24, 0xe9, 0xee, 0x17, 0x08, 0x2c, 0x99, 0xa0, 0x1b, 0xa2, 0x7b, 0xd8, 0xee, - 0x39, 0x91, 0x1f, 0x28, 0x78, 0x4e, 0x12, 0xe5, 0x74, 0x0a, 0xdb, 0x2d, 0x63, 0x56, 0x6c, 0x97, - 0x6c, 0x6d, 0xfa, 0x91, 0xef, 0x25, 0x76, 0xe8, 0xc9, 0xfc, 0x5d, 0xb2, 0x9a, 0x41, 0x9f, 0xde, - 0x25, 0xb3, 0xa8, 0x70, 0x66, 0x5d, 0xa8, 0x01, 0x63, 0x2d, 0x3f, 0x88, 0x6e, 0xfb, 0x81, 0x9c, - 0x5f, 0xa8, 0x83, 0xa6, 0xcf, 0xa0, 0x14, 0x35, 0xb2, 0x30, 0x99, 0x26, 0x06, 0x27, 0x78, 0xa2, - 0x8f, 0xc2, 0x60, 0x58, 0x77, 0x9a, 0xa4, 0x72, 0x6d, 0x7a, 0x2a, 0xff, 0xf8, 0xa9, 0x71, 0x92, - 0x9c, 0xd9, 0xc5, 0x83, 0x91, 0x70, 0x12, 0x2c, 0xd9, 0xa1, 0x65, 0xe8, 0x67, 0x89, 0x38, 0x59, - 0xe0, 0xc9, 0x9c, 0x78, 0xc7, 0x29, 0x97, 0x7e, 0xbe, 0x37, 0x31, 0x30, 0xe6, 0xc5, 0xe9, 0x1a, - 0x10, 0x57, 0x5d, 0x3f, 0x9c, 0x3e, 0x9e, 0xbf, 0x06, 0xc4, 0x0d, 0xf9, 0x5a, 0xad, 0xd3, 0x1a, - 0x50, 0x44, 0x38, 0x66, 0x4a, 0x77, 0x66, 0xba, 0x9b, 0x9e, 0xe8, 0xe0, 0x8b, 0x96, 0xbb, 0x97, - 0xb2, 0x9d, 0x99, 0xee, 0xa4, 0x94, 0x85, 0xfd, 0x27, 0x83, 0x69, 0x99, 0x85, 0xa9, 0x48, 0xfe, - 0x37, 0x2b, 0x65, 0x3d, 0xff, 0x40, 0xaf, 0x1a, 0xdb, 0x43, 0xbc, 0xd6, 0x7d, 0xce, 0x82, 0x13, - 0xad, 0xcc, 0x0f, 0x11, 0x02, 0x40, 0x6f, 0x8a, 0x5f, 0xfe, 0xe9, 0x2a, 0x48, 0x69, 0x36, 0x1e, - 0xe7, 0xd4, 0x94, 0xbc, 0x3a, 0x17, 0xdf, 0xf1, 0xd5, 0x79, 0x05, 0x86, 0xea, 0xfc, 0x9e, 0x23, - 0x83, 0x6b, 0xf7, 0x14, 0x62, 0x8f, 0x89, 0x12, 0xe2, 0x82, 0xb4, 0x8e, 0x15, 0x0b, 0xf4, 0xc3, - 0x16, 0x9c, 0x4e, 0x36, 0x1d, 0x13, 0x86, 0x16, 0x91, 0x4d, 0xb9, 0x5e, 0x66, 0x59, 0x7c, 0x7f, - 0x4a, 0xfe, 0x37, 0x88, 0xf7, 0xbb, 0x11, 0xe0, 0xce, 0x95, 0xa1, 0xc5, 0x0c, 0xc5, 0xd0, 0x80, - 0x69, 0x12, 0xeb, 0x41, 0x39, 0xf4, 0x02, 0x8c, 0x6c, 0xfb, 0x6d, 0x2f, 0x12, 0xae, 0x6b, 0xc2, - 0x8d, 0x86, 0xb9, 0x8f, 0xac, 0x68, 0x70, 0x6c, 0x50, 0x25, 0x54, 0x4a, 0x43, 0xf7, 0xad, 0x52, - 0x7a, 0x0b, 0x46, 0x3c, 0xcd, 0xd7, 0x5a, 0xc8, 0x03, 0xe7, 0xf2, 0x95, 0x6e, 0xba, 0x67, 0x36, - 0x6f, 0xa5, 0x0e, 0xc1, 0x06, 0xb7, 0xa3, 0xf5, 0x69, 0xfb, 0xf9, 0x42, 0x86, 0x50, 0xcf, 0xd5, - 0x4a, 0xaf, 0x9a, 0x6a, 0xa5, 0x73, 0x49, 0xb5, 0x52, 0xca, 0x1c, 0x62, 0x68, 0x94, 0x7a, 0x4f, - 0xd2, 0xd5, 0x73, 0x64, 0xd3, 0xef, 0xb5, 0xe0, 0x21, 0xa6, 0x5f, 0xa7, 0x15, 0xbc, 0x63, 0x9d, - 0xfa, 0xc3, 0xf7, 0xf6, 0xca, 0x0f, 0x5d, 0xcd, 0x66, 0x87, 0xf3, 0xea, 0xb1, 0x9b, 0x70, 0xb6, - 0xdb, 0xd1, 0xc8, 0xfc, 0x28, 0x1b, 0xca, 0x00, 0x1f, 0xfb, 0x51, 0x36, 0x2a, 0x8b, 0x98, 0x61, - 0x7a, 0x8d, 0xdb, 0x65, 0xff, 0x7b, 0x0b, 0x8a, 0x55, 0xbf, 0x71, 0x04, 0x97, 0xee, 0x0f, 0x1b, - 0x97, 0xee, 0x87, 0xb3, 0x0f, 0xe5, 0x46, 0xae, 0x41, 0x69, 0x29, 0x61, 0x50, 0x3a, 0x9d, 0xc7, - 0xa0, 0xb3, 0xf9, 0xe8, 0xa7, 0x8a, 0x30, 0x5c, 0xf5, 0x1b, 0xea, 0x11, 0xc3, 0x3f, 0xbe, 0x9f, - 0x47, 0x0c, 0xb9, 0x69, 0x57, 0x34, 0xce, 0xcc, 0xfd, 0x52, 0xbe, 0xfc, 0xfe, 0x36, 0x7b, 0xcb, - 0x70, 0x93, 0xb8, 0x1b, 0x9b, 0x11, 0x69, 0x24, 0x3f, 0xe7, 0xe8, 0xde, 0x32, 0x7c, 0xb3, 0x08, - 0xe3, 0x89, 0xda, 0x51, 0x13, 0x46, 0x9b, 0xba, 0xb9, 0x42, 0xcc, 0xd3, 0xfb, 0xb2, 0x74, 0x08, - 0x5f, 0x70, 0x0d, 0x84, 0x4d, 0xe6, 0x68, 0x16, 0x40, 0xd9, 0xef, 0xa5, 0xba, 0x9a, 0xdd, 0x3c, - 0x94, 0x81, 0x3f, 0xc4, 0x1a, 0x05, 0x7a, 0x11, 0x86, 0x23, 0xbf, 0xe5, 0x37, 0xfd, 0x8d, 0xdd, - 0x2b, 0x44, 0x86, 0x74, 0x53, 0x1e, 0x9e, 0x6b, 0x31, 0x0a, 0xeb, 0x74, 0xe8, 0x0e, 0x4c, 0x2a, - 0x26, 0xb5, 0x43, 0x30, 0xe1, 0x30, 0xcd, 0xc6, 0x6a, 0x92, 0x23, 0x4e, 0x57, 0x82, 0x5e, 0x86, - 0x31, 0xe6, 0x6a, 0xca, 0xca, 0x5f, 0x21, 0xbb, 0x32, 0xd4, 0x27, 0x13, 0x82, 0x57, 0x0c, 0x0c, - 0x4e, 0x50, 0xa2, 0x05, 0x98, 0xdc, 0x76, 0xc3, 0x44, 0xf1, 0x01, 0x56, 0x9c, 0x35, 0x60, 0x25, - 0x89, 0xc4, 0x69, 0x7a, 0xfb, 0x67, 0xc4, 0x18, 0x7b, 0x91, 0xfb, 0xde, 0x72, 0x7c, 0x77, 0x2f, - 0xc7, 0x6f, 0x58, 0x30, 0x41, 0x6b, 0x67, 0xfe, 0x73, 0x52, 0xd6, 0x51, 0xc1, 0xe0, 0xad, 0x0e, - 0xc1, 0xe0, 0xcf, 0xd1, 0x6d, 0xbb, 0xe1, 0xb7, 0x23, 0xa1, 0xc0, 0xd4, 0xf6, 0x65, 0x0a, 0xc5, - 0x02, 0x2b, 0xe8, 0x48, 0x10, 0x88, 0x37, 0xbf, 0x3a, 0x1d, 0x09, 0x02, 0x2c, 0xb0, 0x32, 0x56, - 0x7c, 0x5f, 0x76, 0xac, 0x78, 0x1e, 0xf2, 0x57, 0x78, 0x5a, 0x09, 0xa9, 0x53, 0x0b, 0xf9, 0x2b, - 0x5d, 0xb0, 0x62, 0x1a, 0xfb, 0x6b, 0x45, 0x18, 0xa9, 0xfa, 0x8d, 0xd8, 0x79, 0xe0, 0x05, 0xc3, - 0x79, 0xe0, 0x6c, 0xc2, 0x79, 0x60, 0x42, 0xa7, 0x7d, 0xcf, 0x55, 0xe0, 0x5b, 0xe5, 0x2a, 0xf0, - 0x1b, 0x16, 0x1b, 0xb5, 0xc5, 0xd5, 0x1a, 0x77, 0xc7, 0x44, 0x17, 0x61, 0x98, 0xed, 0x70, 0xec, - 0x91, 0xb9, 0xb4, 0xa8, 0xb3, 0xdc, 0x6d, 0xab, 0x31, 0x18, 0xeb, 0x34, 0xe8, 0x3c, 0x0c, 0x85, - 0xc4, 0x09, 0xea, 0x9b, 0x6a, 0x7b, 0x17, 0xe6, 0x6f, 0x0e, 0xc3, 0x0a, 0x8b, 0xde, 0x88, 0xa3, - 0xcd, 0x16, 0xf3, 0x1f, 0xad, 0xea, 0xed, 0xe1, 0x4b, 0x24, 0x3f, 0xc4, 0xac, 0x7d, 0x13, 0x50, - 0x9a, 0xbe, 0x87, 0x78, 0x88, 0x65, 0x33, 0x1e, 0x62, 0x29, 0x15, 0x0b, 0xf1, 0xaf, 0x2d, 0x18, - 0xab, 0xfa, 0x0d, 0xba, 0x74, 0xbf, 0x93, 0xd6, 0xa9, 0x1e, 0x6a, 0x7b, 0xa0, 0x43, 0xa8, 0xed, - 0x47, 0xa1, 0xbf, 0xea, 0x37, 0xba, 0xc4, 0x6c, 0xfc, 0xff, 0x2d, 0x18, 0xac, 0xfa, 0x8d, 0x23, - 0xb0, 0x8d, 0xbc, 0x6a, 0xda, 0x46, 0x1e, 0xca, 0x99, 0x37, 0x39, 0xe6, 0x90, 0xff, 0xaf, 0x0f, - 0x46, 0x69, 0x3b, 0xfd, 0x0d, 0x39, 0x94, 0x46, 0xb7, 0x59, 0x3d, 0x74, 0x1b, 0xbd, 0x06, 0xf8, - 0xcd, 0xa6, 0x7f, 0x3b, 0x39, 0xac, 0xcb, 0x0c, 0x8a, 0x05, 0x16, 0x3d, 0x03, 0x43, 0xad, 0x80, - 0xec, 0xb8, 0xbe, 0x90, 0xaf, 0x35, 0x4b, 0x53, 0x55, 0xc0, 0xb1, 0xa2, 0xa0, 0x77, 0xe3, 0xd0, - 0xf5, 0xa8, 0x2c, 0x51, 0xf7, 0xbd, 0x06, 0x37, 0x1f, 0x14, 0x45, 0x3e, 0x18, 0x0d, 0x8e, 0x0d, - 0x2a, 0x74, 0x13, 0x4a, 0xec, 0x3f, 0xdb, 0x76, 0x0e, 0x9e, 0x89, 0x5a, 0x64, 0xc8, 0x14, 0x0c, - 0x70, 0xcc, 0x0b, 0x3d, 0x07, 0x10, 0xc9, 0x9c, 0x0a, 0xa1, 0x88, 0xdd, 0xa7, 0xee, 0x22, 0x2a, - 0xdb, 0x42, 0x88, 0x35, 0x2a, 0xf4, 0x34, 0x94, 0x22, 0xc7, 0x6d, 0x5e, 0x75, 0x3d, 0x66, 0x80, - 0xa6, 0xed, 0x17, 0x89, 0x2a, 0x05, 0x10, 0xc7, 0x78, 0x2a, 0x0b, 0xb2, 0xa8, 0x2c, 0x3c, 0x0f, - 0xff, 0x10, 0xa3, 0x66, 0xb2, 0xe0, 0x55, 0x05, 0xc5, 0x1a, 0x05, 0xda, 0x84, 0x53, 0xae, 0xc7, - 0x72, 0xa7, 0x90, 0xda, 0x96, 0xdb, 0x5a, 0xbb, 0x5a, 0xbb, 0x41, 0x02, 0x77, 0x7d, 0x77, 0xde, - 0xa9, 0x6f, 0x11, 0x4f, 0xe6, 0x18, 0x96, 0xa9, 0xe7, 0x4f, 0x55, 0x3a, 0xd0, 0xe2, 0x8e, 0x9c, - 0xec, 0xe7, 0xd9, 0x7c, 0xbf, 0x56, 0x43, 0x4f, 0x19, 0x5b, 0xc7, 0x09, 0x7d, 0xeb, 0xd8, 0xdf, - 0x2b, 0x0f, 0x5c, 0xab, 0x69, 0xa1, 0x41, 0x5e, 0x82, 0xe3, 0x55, 0xbf, 0x51, 0xf5, 0x83, 0x68, - 0xd9, 0x0f, 0x6e, 0x3b, 0x41, 0x43, 0x4e, 0xaf, 0xb2, 0x0c, 0x8e, 0x42, 0xf7, 0xcf, 0x7e, 0xbe, - 0xbb, 0x18, 0x81, 0x4f, 0x9e, 0x67, 0x12, 0xdb, 0x01, 0x9f, 0xf4, 0xd5, 0x99, 0xec, 0xa0, 0xb2, - 0x0f, 0x5d, 0x72, 0x22, 0x82, 0xae, 0xc1, 0x68, 0x5d, 0x3f, 0x46, 0x45, 0xf1, 0x27, 0xe5, 0x41, - 0x66, 0x9c, 0xb1, 0x99, 0xe7, 0xae, 0x59, 0xde, 0xfe, 0xac, 0xa8, 0x84, 0x2b, 0x22, 0xb8, 0xdb, - 0x64, 0x2f, 0x69, 0xb8, 0x65, 0x7a, 0x92, 0x42, 0x7e, 0xe8, 0x39, 0x6e, 0xfa, 0xed, 0x98, 0x9e, - 0xc4, 0xfe, 0x6e, 0x38, 0x91, 0xac, 0xbe, 0xe7, 0x5c, 0xe0, 0x0b, 0x30, 0x19, 0xe8, 0x05, 0xb5, - 0x5c, 0x6f, 0xc7, 0x79, 0x4a, 0x89, 0x04, 0x12, 0xa7, 0xe9, 0xed, 0x17, 0x61, 0x92, 0x5e, 0x7e, - 0x95, 0x20, 0xc7, 0x7a, 0xb9, 0x7b, 0x94, 0x98, 0xff, 0xd0, 0xcf, 0x0e, 0xa2, 0x44, 0xe2, 0x1f, - 0xf4, 0x49, 0x18, 0x0b, 0xc9, 0x55, 0xd7, 0x6b, 0xdf, 0x91, 0xea, 0xaf, 0x0e, 0x6f, 0x59, 0x6b, - 0x4b, 0x3a, 0x25, 0xbf, 0x3f, 0x98, 0x30, 0x9c, 0xe0, 0x86, 0xb6, 0x61, 0xec, 0xb6, 0xeb, 0x35, - 0xfc, 0xdb, 0xa1, 0xe4, 0x3f, 0x94, 0xaf, 0x4b, 0xbf, 0xc9, 0x29, 0x13, 0x6d, 0x34, 0xaa, 0xbb, - 0x69, 0x30, 0xc3, 0x09, 0xe6, 0x74, 0xb1, 0x07, 0x6d, 0x6f, 0x2e, 0xbc, 0x1e, 0x12, 0xfe, 0x3a, - 0x51, 0x2c, 0x76, 0x2c, 0x81, 0x38, 0xc6, 0xd3, 0xc5, 0xce, 0xfe, 0x5c, 0x0a, 0xfc, 0x36, 0xcf, - 0x32, 0x23, 0x16, 0x3b, 0x56, 0x50, 0xac, 0x51, 0xd0, 0xcd, 0x90, 0xfd, 0x5b, 0xf5, 0x3d, 0xec, - 0xfb, 0x91, 0xdc, 0x3e, 0x59, 0x96, 0x34, 0x0d, 0x8e, 0x0d, 0x2a, 0xb4, 0x0c, 0x28, 0x6c, 0xb7, - 0x5a, 0x4d, 0xe6, 0x1e, 0xe7, 0x34, 0x19, 0x2b, 0xee, 0x37, 0x54, 0xe4, 0x51, 0xb2, 0x6b, 0x29, - 0x2c, 0xce, 0x28, 0x41, 0xcf, 0xc5, 0x75, 0xd1, 0xd4, 0x7e, 0xd6, 0x54, 0x6e, 0x77, 0xab, 0xf1, - 0x76, 0x4a, 0x1c, 0x5a, 0x82, 0xc1, 0x70, 0x37, 0xac, 0x47, 0xcd, 0xb0, 0x53, 0x4e, 0xba, 0x1a, - 0x23, 0xd1, 0x52, 0xa2, 0xf2, 0x22, 0x58, 0x96, 0x45, 0x75, 0x98, 0x12, 0x1c, 0x17, 0x36, 0x1d, - 0x4f, 0x65, 0xca, 0xe2, 0x6f, 0x05, 0x2e, 0xde, 0xdb, 0x2b, 0x4f, 0x89, 0x9a, 0x75, 0xf4, 0xfe, - 0x5e, 0x99, 0x2e, 0x8e, 0x0c, 0x0c, 0xce, 0xe2, 0xc6, 0x27, 0x5f, 0xbd, 0xee, 0x6f, 0xb7, 0xaa, - 0x81, 0xbf, 0xee, 0x36, 0x49, 0x27, 0xdb, 0x65, 0xcd, 0xa0, 0x14, 0x93, 0xcf, 0x80, 0xe1, 0x04, - 0x37, 0xfb, 0xb3, 0x4c, 0x76, 0xac, 0xb9, 0x1b, 0x9e, 0x13, 0xb5, 0x03, 0x82, 0xb6, 0x61, 0xb4, - 0xc5, 0x76, 0x17, 0x91, 0xfb, 0x45, 0xcc, 0xf5, 0x17, 0x7a, 0xd4, 0x7f, 0xdd, 0x66, 0xd9, 0xeb, - 0x0c, 0x5f, 0xbb, 0xaa, 0xce, 0x0e, 0x9b, 0xdc, 0xed, 0x7f, 0x71, 0x92, 0x49, 0x1f, 0x35, 0xae, - 0xd4, 0x1a, 0x14, 0x4f, 0x93, 0xc4, 0x35, 0x76, 0x26, 0x5f, 0xc3, 0x1b, 0x0f, 0x8b, 0x78, 0xde, - 0x84, 0x65, 0x59, 0xf4, 0x09, 0x18, 0xa3, 0xb7, 0x42, 0x25, 0x01, 0x84, 0xd3, 0xc7, 0xf2, 0x43, - 0xc8, 0x28, 0x2a, 0x3d, 0x2f, 0x94, 0x5e, 0x18, 0x27, 0x98, 0xa1, 0x37, 0x98, 0x6f, 0x9b, 0x64, - 0x5d, 0xe8, 0x85, 0xb5, 0xee, 0xc6, 0x26, 0xd9, 0x6a, 0x4c, 0x50, 0x1b, 0xa6, 0xd2, 0xd9, 0x2f, - 0xc3, 0x69, 0x3b, 0x5f, 0xbc, 0x4e, 0x27, 0xb0, 0x8c, 0x13, 0xf8, 0xa4, 0x71, 0x21, 0xce, 0xe2, - 0x8f, 0xae, 0x26, 0x73, 0x13, 0x16, 0x0d, 0xc5, 0x73, 0x2a, 0x3f, 0xe1, 0x68, 0xc7, 0xb4, 0x84, - 0x1b, 0x70, 0x5a, 0x4b, 0xef, 0x76, 0x29, 0x70, 0x98, 0xf7, 0x88, 0xcb, 0xb6, 0x53, 0x4d, 0x2e, - 0x7a, 0xe4, 0xde, 0x5e, 0xf9, 0xf4, 0x5a, 0x27, 0x42, 0xdc, 0x99, 0x0f, 0xba, 0x06, 0xc7, 0x79, - 0x00, 0x84, 0x45, 0xe2, 0x34, 0x9a, 0xae, 0xa7, 0x04, 0x2f, 0xbe, 0xe4, 0x4f, 0xde, 0xdb, 0x2b, - 0x1f, 0x9f, 0xcb, 0x22, 0xc0, 0xd9, 0xe5, 0xd0, 0xab, 0x50, 0x6a, 0x78, 0xa1, 0xe8, 0x83, 0x01, - 0x23, 0x83, 0x5e, 0x69, 0x71, 0xb5, 0xa6, 0xbe, 0x3f, 0xfe, 0x83, 0xe3, 0x02, 0x68, 0x83, 0x1b, - 0x27, 0x94, 0xba, 0x6a, 0x30, 0x15, 0x3a, 0x2e, 0xa9, 0xd1, 0x35, 0x9e, 0x40, 0x73, 0xab, 0x9c, - 0x7a, 0x19, 0x64, 0xbc, 0x8e, 0x36, 0x18, 0xa3, 0xd7, 0x01, 0x89, 0x4c, 0x0d, 0x73, 0x75, 0x96, - 0x58, 0x88, 0x1d, 0x8d, 0x43, 0xe6, 0xa3, 0xdc, 0x5a, 0x8a, 0x02, 0x67, 0x94, 0x42, 0x97, 0xe9, - 0xae, 0xa2, 0x43, 0xc5, 0xae, 0xa5, 0xf2, 0xb4, 0x2e, 0x92, 0x56, 0x40, 0x98, 0x93, 0x9b, 0xc9, - 0x11, 0x27, 0xca, 0xa1, 0x06, 0x9c, 0x72, 0xda, 0x91, 0xcf, 0xec, 0x3e, 0x26, 0xe9, 0x9a, 0xbf, - 0x45, 0x3c, 0x66, 0x72, 0x1d, 0x62, 0x21, 0xe9, 0x4e, 0xcd, 0x75, 0xa0, 0xc3, 0x1d, 0xb9, 0x50, - 0x89, 0x5c, 0x25, 0x66, 0x07, 0x33, 0x20, 0x5e, 0x46, 0x72, 0xf6, 0x17, 0x61, 0x78, 0xd3, 0x0f, - 0xa3, 0x55, 0x12, 0xdd, 0xf6, 0x83, 0x2d, 0x11, 0x1a, 0x3a, 0x0e, 0xc7, 0x1f, 0xa3, 0xb0, 0x4e, - 0x47, 0xaf, 0xdc, 0xcc, 0x21, 0xa8, 0xb2, 0xc8, 0x7c, 0x31, 0x86, 0xe2, 0x3d, 0xe6, 0x32, 0x07, - 0x63, 0x89, 0x97, 0xa4, 0x95, 0xea, 0x02, 0xf3, 0xab, 0x48, 0x90, 0x56, 0xaa, 0x0b, 0x58, 0xe2, - 0xe9, 0x74, 0x0d, 0x37, 0x9d, 0x80, 0x54, 0x03, 0xbf, 0x4e, 0x42, 0x2d, 0x09, 0xc4, 0xc3, 0x3c, - 0xf0, 0x35, 0x9d, 0xae, 0xb5, 0x2c, 0x02, 0x9c, 0x5d, 0x0e, 0x91, 0x74, 0x6a, 0xc3, 0xb1, 0x7c, - 0x83, 0x58, 0x5a, 0x9e, 0xe9, 0x31, 0xbb, 0xa1, 0x07, 0x13, 0x2a, 0xa9, 0x22, 0x0f, 0x75, 0x1d, - 0x4e, 0x8f, 0xb3, 0xb9, 0xdd, 0x7b, 0x9c, 0x6c, 0x65, 0x62, 0xac, 0x24, 0x38, 0xe1, 0x14, 0x6f, - 0x23, 0xe6, 0xe1, 0x44, 0xd7, 0x98, 0x87, 0x17, 0xa0, 0x14, 0xb6, 0x6f, 0x35, 0xfc, 0x6d, 0xc7, - 0xf5, 0x98, 0x5f, 0x85, 0x76, 0xf7, 0xab, 0x49, 0x04, 0x8e, 0x69, 0xd0, 0x32, 0x0c, 0x39, 0xd2, - 0x7e, 0x88, 0xf2, 0x63, 0x55, 0x29, 0xab, 0x21, 0x0f, 0xdf, 0x22, 0x2d, 0x86, 0xaa, 0x2c, 0x7a, - 0x05, 0x46, 0xc5, 0x03, 0x7e, 0x91, 0x87, 0x78, 0xca, 0x7c, 0x65, 0x59, 0xd3, 0x91, 0xd8, 0xa4, - 0x45, 0xd7, 0x61, 0x38, 0xf2, 0x9b, 0xec, 0xa9, 0x20, 0x15, 0xf3, 0x4e, 0xe4, 0x47, 0x5d, 0x5c, - 0x53, 0x64, 0xba, 0xda, 0x5c, 0x15, 0xc5, 0x3a, 0x1f, 0xb4, 0xc6, 0xe7, 0x3b, 0x4b, 0xf9, 0x40, - 0x42, 0x91, 0xc8, 0xf6, 0x74, 0x9e, 0x53, 0x1c, 0x23, 0x33, 0x97, 0x83, 0x28, 0x89, 0x75, 0x36, - 0xe8, 0x12, 0x4c, 0xb6, 0x02, 0xd7, 0x67, 0x73, 0x42, 0x99, 0x8e, 0xa7, 0xcd, 0x04, 0x6f, 0xd5, - 0x24, 0x01, 0x4e, 0x97, 0x61, 0xf1, 0x17, 0x04, 0x70, 0xfa, 0x24, 0x4f, 0x52, 0xc3, 0xaf, 0xd2, - 0x1c, 0x86, 0x15, 0x16, 0xad, 0xb0, 0x9d, 0x98, 0x6b, 0x81, 0xa6, 0x67, 0xf2, 0xc3, 0x63, 0xe9, - 0xda, 0x22, 0x2e, 0xbc, 0xaa, 0xbf, 0x38, 0xe6, 0x80, 0x1a, 0x5a, 0x6e, 0x58, 0x7a, 0x05, 0x08, - 0xa7, 0x4f, 0x75, 0xf0, 0xca, 0x4c, 0xdc, 0xca, 0x62, 0x81, 0xc0, 0x00, 0x87, 0x38, 0xc1, 0x13, - 0x7d, 0x04, 0x26, 0x44, 0x38, 0xd0, 0xb8, 0x9b, 0x4e, 0xc7, 0x4f, 0x2f, 0x70, 0x02, 0x87, 0x53, - 0xd4, 0x3c, 0x49, 0x8c, 0x73, 0xab, 0x49, 0xc4, 0xd6, 0x77, 0xd5, 0xf5, 0xb6, 0xc2, 0xe9, 0x33, - 0x6c, 0x7f, 0x10, 0x49, 0x62, 0x92, 0x58, 0x9c, 0x51, 0x02, 0xad, 0xc1, 0x44, 0x2b, 0x20, 0x64, - 0x9b, 0x09, 0xfa, 0xe2, 0x3c, 0x2b, 0xf3, 0xf0, 0x23, 0xb4, 0x25, 0xd5, 0x04, 0x6e, 0x3f, 0x03, - 0x86, 0x53, 0x1c, 0xd0, 0x6d, 0x18, 0xf2, 0x77, 0x48, 0xb0, 0x49, 0x9c, 0xc6, 0xf4, 0xd9, 0x0e, - 0x0f, 0x82, 0xc4, 0xe1, 0x76, 0x4d, 0xd0, 0x26, 0xdc, 0x4d, 0x24, 0xb8, 0xbb, 0xbb, 0x89, 0xac, - 0x0c, 0xfd, 0xef, 0x16, 0x9c, 0x94, 0xd6, 0xa1, 0x5a, 0x8b, 0xf6, 0xfa, 0x82, 0xef, 0x85, 0x51, - 0xc0, 0x03, 0x66, 0x3c, 0x92, 0x1f, 0x44, 0x62, 0x2d, 0xa7, 0x90, 0x52, 0x44, 0x9f, 0xcc, 0xa3, - 0x08, 0x71, 0x7e, 0x8d, 0xf4, 0x6a, 0x1a, 0x92, 0x48, 0x6e, 0x46, 0x73, 0xe1, 0xf2, 0x1b, 0x8b, - 0xab, 0xd3, 0x8f, 0xf2, 0x68, 0x1f, 0x74, 0x31, 0xd4, 0x92, 0x48, 0x9c, 0xa6, 0x47, 0x17, 0xa1, - 0xe0, 0x87, 0xd3, 0x8f, 0x75, 0x48, 0x27, 0xec, 0x37, 0xae, 0xd5, 0xb8, 0xdb, 0xe1, 0xb5, 0x1a, - 0x2e, 0xf8, 0xa1, 0x4c, 0xd4, 0x42, 0xef, 0x63, 0xe1, 0xf4, 0xe3, 0x5c, 0x6d, 0x29, 0x13, 0xb5, - 0x30, 0x20, 0x8e, 0xf1, 0x68, 0x13, 0xc6, 0x43, 0xe3, 0xde, 0x1b, 0x4e, 0x9f, 0x63, 0x3d, 0xf5, - 0x78, 0xde, 0xa0, 0x19, 0xd4, 0x5a, 0x06, 0x05, 0x93, 0x0b, 0x4e, 0xb2, 0xe5, 0xab, 0x4b, 0xbb, - 0x79, 0x87, 0xd3, 0x4f, 0x74, 0x59, 0x5d, 0x1a, 0xb1, 0xbe, 0xba, 0x74, 0x1e, 0x38, 0xc1, 0x73, - 0xe6, 0xbb, 0x60, 0x32, 0x25, 0x2e, 0x1d, 0xc4, 0xc5, 0x7e, 0x66, 0x0b, 0x46, 0x8d, 0x29, 0xf9, - 0x40, 0xdd, 0x3b, 0x7e, 0xa7, 0x04, 0x25, 0x65, 0x76, 0x47, 0x17, 0x4c, 0x8f, 0x8e, 0x93, 0x49, - 0x8f, 0x8e, 0xa1, 0xaa, 0xdf, 0x30, 0x9c, 0x38, 0xd6, 0x32, 0x62, 0x42, 0xe6, 0x6d, 0x80, 0xbd, - 0xbf, 0x92, 0xd1, 0x4c, 0x09, 0xc5, 0x9e, 0x5d, 0x43, 0xfa, 0x3a, 0x5a, 0x27, 0x2e, 0xc1, 0xa4, - 0xe7, 0x33, 0x19, 0x9d, 0x34, 0xa4, 0x00, 0xc6, 0xe4, 0xac, 0x92, 0x1e, 0x64, 0x29, 0x41, 0x80, - 0xd3, 0x65, 0x68, 0x85, 0x5c, 0x50, 0x4a, 0x9a, 0x43, 0xb8, 0x1c, 0x85, 0x05, 0x96, 0xde, 0x0d, - 0xf9, 0xaf, 0x70, 0x7a, 0x22, 0xff, 0x6e, 0xc8, 0x0b, 0x25, 0x85, 0xb1, 0x50, 0x0a, 0x63, 0x4c, - 0xfb, 0xdf, 0xf2, 0x1b, 0x95, 0xaa, 0x10, 0xf3, 0xb5, 0x80, 0xc6, 0x8d, 0x4a, 0x15, 0x73, 0x1c, - 0x9a, 0x83, 0x01, 0xf6, 0x23, 0x9c, 0x1e, 0xc9, 0x0f, 0xca, 0xc3, 0x4a, 0x68, 0x89, 0xe2, 0x58, - 0x01, 0x2c, 0x0a, 0x32, 0xed, 0x2e, 0xbd, 0x1b, 0x31, 0xed, 0xee, 0xe0, 0x7d, 0x6a, 0x77, 0x25, - 0x03, 0x1c, 0xf3, 0x42, 0x77, 0xe0, 0xb8, 0x71, 0x1f, 0x55, 0xcf, 0x86, 0x20, 0xdf, 0xf0, 0x9b, - 0x20, 0x9e, 0x3f, 0x2d, 0x1a, 0x7d, 0xbc, 0x92, 0xc5, 0x09, 0x67, 0x57, 0x80, 0x9a, 0x30, 0x59, - 0x4f, 0xd5, 0x3a, 0xd4, 0x7b, 0xad, 0x6a, 0x5e, 0xa4, 0x6b, 0x4c, 0x33, 0x46, 0xaf, 0xc0, 0xd0, - 0xdb, 0x7e, 0xc8, 0x8e, 0x48, 0x71, 0x35, 0x91, 0x51, 0x25, 0x86, 0xde, 0xb8, 0x56, 0x63, 0xf0, - 0xfd, 0xbd, 0xf2, 0x70, 0xd5, 0x6f, 0xc8, 0xbf, 0x58, 0x15, 0x40, 0x3f, 0x60, 0xc1, 0x4c, 0xfa, - 0xc2, 0xab, 0x1a, 0x3d, 0xda, 0x7b, 0xa3, 0x6d, 0x51, 0xe9, 0xcc, 0x52, 0x2e, 0x3b, 0xdc, 0xa1, - 0x2a, 0xf4, 0x21, 0xba, 0x9e, 0x42, 0xf7, 0x2e, 0x11, 0x59, 0x76, 0x1f, 0x89, 0xd7, 0x13, 0x85, - 0xee, 0xef, 0x95, 0xc7, 0xf9, 0xce, 0xe8, 0xde, 0x95, 0xef, 0xab, 0x44, 0x01, 0xf4, 0xdd, 0x70, - 0x3c, 0x48, 0x6b, 0x50, 0x89, 0x14, 0xc2, 0x9f, 0xea, 0x65, 0x97, 0x4d, 0x0e, 0x38, 0xce, 0x62, - 0x88, 0xb3, 0xeb, 0xb1, 0x7f, 0xd5, 0x62, 0xfa, 0x6d, 0xd1, 0x2c, 0x12, 0xb6, 0x9b, 0x47, 0x91, - 0xdb, 0x7b, 0xc9, 0xb0, 0x1d, 0xdf, 0xb7, 0x67, 0xd3, 0x3f, 0xb2, 0x98, 0x67, 0xd3, 0x11, 0x3e, - 0xa3, 0x7a, 0x03, 0x86, 0x22, 0x99, 0x73, 0xbd, 0x43, 0x3a, 0x72, 0xad, 0x51, 0xcc, 0xbb, 0x4b, - 0x5d, 0x72, 0x54, 0x7a, 0x75, 0xc5, 0xc6, 0xfe, 0xfb, 0x7c, 0x04, 0x24, 0xe6, 0x08, 0x4c, 0x74, - 0x8b, 0xa6, 0x89, 0xae, 0xdc, 0xe5, 0x0b, 0x72, 0x4c, 0x75, 0x7f, 0xcf, 0x6c, 0x37, 0x53, 0xee, - 0xbd, 0xdb, 0x5d, 0xea, 0xec, 0x2f, 0x58, 0x00, 0x71, 0xac, 0xfb, 0x1e, 0xb2, 0x6a, 0xbe, 0x44, - 0xaf, 0x35, 0x7e, 0xe4, 0xd7, 0xfd, 0xa6, 0x30, 0x50, 0x9c, 0x8a, 0xad, 0x84, 0x1c, 0xbe, 0xaf, - 0xfd, 0xc6, 0x8a, 0x1a, 0x95, 0x65, 0x64, 0xcd, 0x62, 0x6c, 0xb7, 0x36, 0xa2, 0x6a, 0x7e, 0xd9, - 0x82, 0x63, 0x59, 0x3e, 0xf9, 0xf4, 0x92, 0xcc, 0xd5, 0x9c, 0xca, 0xdd, 0x51, 0x8d, 0xe6, 0x0d, - 0x01, 0xc7, 0x8a, 0xa2, 0xe7, 0x74, 0xa5, 0x07, 0x0b, 0x32, 0x7f, 0x0d, 0x46, 0xab, 0x01, 0xd1, - 0xe4, 0x8b, 0xd7, 0x78, 0xb4, 0x16, 0xde, 0x9e, 0x67, 0x0e, 0x1c, 0xa9, 0xc5, 0xfe, 0x4a, 0x01, - 0x8e, 0x71, 0xa7, 0x9d, 0xb9, 0x1d, 0xdf, 0x6d, 0x54, 0xfd, 0x86, 0x78, 0x49, 0xf9, 0x26, 0x8c, - 0xb4, 0x34, 0xdd, 0x74, 0xa7, 0x80, 0xc9, 0xba, 0x0e, 0x3b, 0xd6, 0xa6, 0xe9, 0x50, 0x6c, 0xf0, - 0x42, 0x0d, 0x18, 0x21, 0x3b, 0x6e, 0x5d, 0x79, 0x7e, 0x14, 0x0e, 0x7c, 0x48, 0xab, 0x5a, 0x96, - 0x34, 0x3e, 0xd8, 0xe0, 0xda, 0xb3, 0xab, 0xad, 0x26, 0xa2, 0xf5, 0x75, 0xf1, 0xf6, 0xf8, 0x51, - 0x0b, 0x1e, 0xca, 0x09, 0xaf, 0x4c, 0xab, 0xbb, 0xcd, 0xdc, 0xa3, 0xc4, 0xb4, 0x55, 0xd5, 0x71, - 0xa7, 0x29, 0x2c, 0xb0, 0xe8, 0xa3, 0x00, 0xdc, 0xe9, 0x89, 0x78, 0xf5, 0xae, 0x71, 0x68, 0x8d, - 0x10, 0x9a, 0x5a, 0x34, 0x44, 0x59, 0x1e, 0x6b, 0xbc, 0xec, 0x2f, 0xf7, 0x41, 0x3f, 0x73, 0xb2, - 0x41, 0x55, 0x18, 0xdc, 0xe4, 0xc9, 0xba, 0x3a, 0x8e, 0x1b, 0xa5, 0x95, 0xf9, 0xbf, 0xe2, 0x71, - 0xd3, 0xa0, 0x58, 0xb2, 0x41, 0x2b, 0x30, 0xc5, 0x73, 0xa6, 0x35, 0x17, 0x49, 0xd3, 0xd9, 0x95, - 0x6a, 0x5f, 0x9e, 0x06, 0x5c, 0xa9, 0xbf, 0x2b, 0x69, 0x12, 0x9c, 0x55, 0x0e, 0xbd, 0x06, 0x63, - 0xf4, 0x1a, 0xee, 0xb7, 0x23, 0xc9, 0x89, 0x67, 0x4b, 0x53, 0x37, 0x93, 0x35, 0x03, 0x8b, 0x13, - 0xd4, 0xe8, 0x15, 0x18, 0x6d, 0xa5, 0x14, 0xdc, 0xfd, 0xb1, 0x26, 0xc8, 0x54, 0x6a, 0x9b, 0xb4, - 0xcc, 0x2d, 0xbf, 0xcd, 0x1e, 0x21, 0xac, 0x6d, 0x06, 0x24, 0xdc, 0xf4, 0x9b, 0x0d, 0x26, 0x01, - 0xf7, 0x6b, 0x6e, 0xf9, 0x09, 0x3c, 0x4e, 0x95, 0xa0, 0x5c, 0xd6, 0x1d, 0xb7, 0xd9, 0x0e, 0x48, - 0xcc, 0x65, 0xc0, 0xe4, 0xb2, 0x9c, 0xc0, 0xe3, 0x54, 0x89, 0xee, 0x9a, 0xfb, 0xc1, 0xc3, 0xd1, - 0xdc, 0xdb, 0x7f, 0xab, 0x00, 0xc6, 0xd0, 0x7e, 0x07, 0x67, 0x71, 0x7b, 0x15, 0xfa, 0x36, 0x82, - 0x56, 0x5d, 0x38, 0x94, 0x65, 0x7e, 0x59, 0x9c, 0xc2, 0x99, 0x7f, 0x19, 0xfd, 0x8f, 0x59, 0x29, - 0xba, 0xc6, 0x8f, 0x57, 0x03, 0x9f, 0x1e, 0x72, 0x32, 0x9e, 0x9f, 0x7a, 0xfd, 0x32, 0x28, 0xa3, - 0x1c, 0x74, 0x88, 0x7c, 0x2b, 0xde, 0x07, 0x70, 0x0e, 0x86, 0xef, 0x55, 0x4d, 0x84, 0x1b, 0x91, - 0x5c, 0xd0, 0x45, 0x18, 0x16, 0x89, 0xb5, 0xd8, 0x23, 0x0d, 0xbe, 0x98, 0x98, 0xaf, 0xd8, 0x62, - 0x0c, 0xc6, 0x3a, 0x8d, 0xfd, 0x83, 0x05, 0x98, 0xca, 0x78, 0x65, 0xc7, 0x8f, 0x91, 0x0d, 0x37, - 0x8c, 0x54, 0x96, 0x68, 0xed, 0x18, 0xe1, 0x70, 0xac, 0x28, 0xe8, 0x5e, 0xc5, 0x0f, 0xaa, 0xe4, - 0xe1, 0x24, 0x5e, 0xb1, 0x08, 0xec, 0x01, 0xf3, 0x2d, 0x9f, 0x85, 0xbe, 0x76, 0x48, 0x64, 0xcc, - 0x6a, 0x75, 0x6c, 0x33, 0xb3, 0x36, 0xc3, 0xd0, 0x2b, 0xe0, 0x86, 0xb2, 0x10, 0x6b, 0x57, 0x40, - 0x6e, 0x23, 0xe6, 0x38, 0xda, 0xb8, 0x88, 0x78, 0x8e, 0x17, 0x89, 0x8b, 0x62, 0x1c, 0x7c, 0x95, - 0x41, 0xb1, 0xc0, 0xda, 0x5f, 0x2a, 0xc2, 0xc9, 0xdc, 0x77, 0xb7, 0xb4, 0xe9, 0xdb, 0xbe, 0xe7, - 0x46, 0xbe, 0x72, 0xc2, 0xe3, 0x01, 0x57, 0x49, 0x6b, 0x73, 0x45, 0xc0, 0xb1, 0xa2, 0x40, 0xe7, - 0xa0, 0x9f, 0x29, 0xc5, 0x53, 0xf9, 0xb2, 0xe7, 0x17, 0x79, 0x04, 0x3e, 0x8e, 0xd6, 0x4e, 0xf5, - 0x62, 0xc7, 0x53, 0xfd, 0x51, 0x2a, 0xc1, 0xf8, 0xcd, 0xe4, 0x81, 0x42, 0x9b, 0xeb, 0xfb, 0x4d, - 0xcc, 0x90, 0xe8, 0x71, 0xd1, 0x5f, 0x09, 0xaf, 0x33, 0xec, 0x34, 0xfc, 0x50, 0xeb, 0xb4, 0x27, - 0x61, 0x70, 0x8b, 0xec, 0x06, 0xae, 0xb7, 0x91, 0xf4, 0x46, 0xbc, 0xc2, 0xc1, 0x58, 0xe2, 0xcd, - 0xd4, 0xad, 0x83, 0x87, 0x91, 0xba, 0x55, 0x9f, 0x01, 0x43, 0x5d, 0xc5, 0x93, 0x1f, 0x2a, 0xc2, - 0x38, 0x9e, 0x5f, 0x7c, 0x6f, 0x20, 0xae, 0xa7, 0x07, 0xe2, 0x30, 0x32, 0x9c, 0x1e, 0x6c, 0x34, - 0x7e, 0xc9, 0x82, 0x71, 0x96, 0xde, 0x4b, 0x04, 0xcd, 0x70, 0x7d, 0xef, 0x08, 0xae, 0x02, 0x8f, - 0x42, 0x7f, 0x40, 0x2b, 0x4d, 0x26, 0xca, 0x66, 0x2d, 0xc1, 0x1c, 0x87, 0x4e, 0x41, 0x1f, 0x6b, - 0x02, 0x1d, 0xbc, 0x11, 0xbe, 0x05, 0x2f, 0x3a, 0x91, 0x83, 0x19, 0x94, 0xc5, 0x9f, 0xc3, 0xa4, - 0xd5, 0x74, 0x79, 0xa3, 0x63, 0x97, 0x85, 0x77, 0x47, 0x44, 0x8e, 0xcc, 0xa6, 0xbd, 0xb3, 0xf8, - 0x73, 0xd9, 0x2c, 0x3b, 0x5f, 0xb3, 0xff, 0xa2, 0x00, 0x67, 0x32, 0xcb, 0xf5, 0x1c, 0x7f, 0xae, - 0x73, 0xe9, 0x07, 0x99, 0x86, 0xa9, 0x78, 0x84, 0xbe, 0xde, 0x7d, 0xbd, 0x4a, 0xff, 0xfd, 0x3d, - 0x84, 0x85, 0xcb, 0xec, 0xb2, 0x77, 0x49, 0x58, 0xb8, 0xcc, 0xb6, 0xe5, 0xa8, 0x09, 0xfe, 0xa6, - 0x90, 0xf3, 0x2d, 0x4c, 0x61, 0x70, 0x9e, 0xee, 0x33, 0x0c, 0x19, 0xca, 0x4b, 0x38, 0xdf, 0x63, - 0x38, 0x0c, 0x2b, 0x2c, 0x9a, 0x83, 0xf1, 0x6d, 0xd7, 0xa3, 0x9b, 0xcf, 0xae, 0x29, 0x8a, 0x2b, - 0x5b, 0xc6, 0x8a, 0x89, 0xc6, 0x49, 0x7a, 0xe4, 0x6a, 0x21, 0xe3, 0xf8, 0xd7, 0xbd, 0x72, 0xa0, - 0x55, 0x37, 0x6b, 0xba, 0x73, 0xa8, 0x5e, 0xcc, 0x08, 0x1f, 0xb7, 0xa2, 0xe9, 0x89, 0x8a, 0xbd, - 0xeb, 0x89, 0x46, 0xb2, 0x75, 0x44, 0x33, 0xaf, 0xc0, 0xe8, 0x7d, 0xdb, 0x46, 0xec, 0x6f, 0x14, - 0xe1, 0xe1, 0x0e, 0xcb, 0x9e, 0xef, 0xf5, 0xc6, 0x18, 0x68, 0x7b, 0x7d, 0x6a, 0x1c, 0xaa, 0x70, - 0x6c, 0xbd, 0xdd, 0x6c, 0xee, 0xb2, 0x47, 0x4d, 0xa4, 0x21, 0x29, 0x84, 0x4c, 0x29, 0x95, 0x23, - 0xc7, 0x96, 0x33, 0x68, 0x70, 0x66, 0x49, 0x7a, 0xc5, 0xa2, 0x27, 0xc9, 0xae, 0x62, 0x95, 0xb8, - 0x62, 0x61, 0x1d, 0x89, 0x4d, 0x5a, 0x74, 0x09, 0x26, 0x9d, 0x1d, 0xc7, 0xe5, 0x71, 0xf7, 0x25, - 0x03, 0x7e, 0xc7, 0x52, 0xba, 0xe8, 0xb9, 0x24, 0x01, 0x4e, 0x97, 0x41, 0xaf, 0x03, 0xf2, 0x6f, - 0xb1, 0x87, 0x12, 0x8d, 0x4b, 0xc4, 0x13, 0x56, 0x77, 0x36, 0x76, 0xc5, 0x78, 0x4b, 0xb8, 0x96, - 0xa2, 0xc0, 0x19, 0xa5, 0x12, 0x91, 0xd1, 0x06, 0xf2, 0x23, 0xa3, 0x75, 0xde, 0x17, 0xbb, 0x66, - 0x00, 0xbb, 0x08, 0xa3, 0x07, 0x74, 0xff, 0xb5, 0xff, 0x8d, 0x05, 0x4a, 0x41, 0x6c, 0x06, 0x1f, - 0x7e, 0x85, 0xf9, 0x27, 0x73, 0xd5, 0xb6, 0x16, 0xae, 0xe9, 0xb8, 0xe6, 0x9f, 0x1c, 0x23, 0xb1, - 0x49, 0xcb, 0xe7, 0x90, 0xe6, 0x57, 0x6c, 0xdc, 0x0a, 0x44, 0x6c, 0x44, 0x45, 0x81, 0x3e, 0x06, - 0x83, 0x0d, 0x77, 0xc7, 0x0d, 0x85, 0x72, 0xec, 0xc0, 0xc6, 0xb8, 0x78, 0xeb, 0x5c, 0xe4, 0x6c, - 0xb0, 0xe4, 0x67, 0xff, 0x50, 0x21, 0xee, 0x93, 0x37, 0xda, 0x7e, 0xe4, 0x1c, 0xc1, 0x49, 0x7e, - 0xc9, 0x38, 0xc9, 0x1f, 0xcf, 0x1e, 0x68, 0xad, 0x49, 0xb9, 0x27, 0xf8, 0xb5, 0xc4, 0x09, 0xfe, - 0x44, 0x77, 0x56, 0x9d, 0x4f, 0xee, 0x7f, 0x60, 0xc1, 0xa4, 0x41, 0x7f, 0x04, 0x07, 0xc8, 0xb2, - 0x79, 0x80, 0x3c, 0xd2, 0xf5, 0x1b, 0x72, 0x0e, 0x8e, 0xef, 0x2f, 0x26, 0xda, 0xce, 0x0e, 0x8c, - 0xb7, 0xa1, 0x6f, 0xd3, 0x09, 0x1a, 0x9d, 0xd2, 0xe2, 0xa4, 0x0a, 0xcd, 0x5e, 0x76, 0x02, 0xe1, - 0xa9, 0xf0, 0x8c, 0xec, 0x75, 0x0a, 0xea, 0xea, 0xa5, 0xc0, 0xaa, 0x42, 0x2f, 0xc1, 0x40, 0x58, - 0xf7, 0x5b, 0xea, 0xcd, 0x14, 0xcb, 0xbc, 0x5a, 0x63, 0x90, 0xfd, 0xbd, 0x32, 0x32, 0xab, 0xa3, - 0x60, 0x2c, 0xe8, 0xd1, 0x9b, 0x30, 0xca, 0x7e, 0x29, 0xb7, 0xc1, 0x62, 0xbe, 0x06, 0xa3, 0xa6, - 0x13, 0x72, 0x9f, 0x5a, 0x03, 0x84, 0x4d, 0x56, 0x33, 0x1b, 0x50, 0x52, 0x9f, 0xf5, 0x40, 0xad, - 0xdd, 0xff, 0xaa, 0x08, 0x53, 0x19, 0x73, 0x0e, 0x85, 0xc6, 0x48, 0x5c, 0xec, 0x71, 0xaa, 0xbe, - 0xc3, 0xb1, 0x08, 0xd9, 0x05, 0xaa, 0x21, 0xe6, 0x56, 0xcf, 0x95, 0x5e, 0x0f, 0x49, 0xb2, 0x52, - 0x0a, 0xea, 0x5e, 0x29, 0xad, 0xec, 0xc8, 0xba, 0x9a, 0x56, 0xa4, 0x5a, 0xfa, 0x40, 0xc7, 0xf4, - 0x37, 0xfa, 0xe0, 0x58, 0x56, 0xcc, 0x5a, 0xf4, 0x99, 0x44, 0x3a, 0xe7, 0x17, 0x3a, 0xf5, 0xb0, - 0x5e, 0x92, 0xe7, 0x78, 0x16, 0x71, 0x28, 0x67, 0xcd, 0x04, 0xcf, 0x5d, 0xbb, 0x59, 0xd4, 0xc9, - 0x22, 0xe0, 0x04, 0x3c, 0x0d, 0xb7, 0xdc, 0x3e, 0x3e, 0xd0, 0x73, 0x03, 0x44, 0xfe, 0xee, 0x30, - 0xe1, 0x92, 0x24, 0xc1, 0xdd, 0x5d, 0x92, 0x64, 0xcd, 0xa8, 0x02, 0x03, 0x75, 0xee, 0xeb, 0x52, - 0xec, 0xbe, 0x85, 0x71, 0x47, 0x17, 0xb5, 0x01, 0x0b, 0x07, 0x17, 0xc1, 0x60, 0xc6, 0x85, 0x61, - 0xad, 0x63, 0x1e, 0xe8, 0xe4, 0xd9, 0xa2, 0x07, 0x9f, 0xd6, 0x05, 0x0f, 0x74, 0x02, 0xfd, 0xa8, - 0x05, 0x89, 0x07, 0x2f, 0x4a, 0x29, 0x67, 0xe5, 0x2a, 0xe5, 0xce, 0x42, 0x5f, 0xe0, 0x37, 0x49, - 0x32, 0x11, 0x32, 0xf6, 0x9b, 0x04, 0x33, 0x0c, 0xa5, 0x88, 0x62, 0x55, 0xcb, 0x88, 0x7e, 0x8d, - 0x14, 0x17, 0xc4, 0x47, 0xa1, 0xbf, 0x49, 0x76, 0x48, 0x33, 0x99, 0xaf, 0xee, 0x2a, 0x05, 0x62, - 0x8e, 0xb3, 0x7f, 0xa9, 0x0f, 0x4e, 0x77, 0x0c, 0x47, 0x45, 0x2f, 0x63, 0x1b, 0x4e, 0x44, 0x6e, - 0x3b, 0xbb, 0xc9, 0xc4, 0x52, 0x97, 0x38, 0x18, 0x4b, 0x3c, 0x7b, 0xfe, 0xc9, 0xf3, 0x43, 0x24, - 0x54, 0x98, 0x22, 0x2d, 0x84, 0xc0, 0x9a, 0x2a, 0xb1, 0xe2, 0x61, 0xa8, 0xc4, 0x9e, 0x03, 0x08, - 0xc3, 0x26, 0x77, 0x0b, 0x6c, 0x88, 0x77, 0xa5, 0x71, 0x1e, 0x91, 0xda, 0x55, 0x81, 0xc1, 0x1a, - 0x15, 0x5a, 0x84, 0x89, 0x56, 0xe0, 0x47, 0x5c, 0x23, 0xbc, 0xc8, 0x3d, 0x67, 0xfb, 0xcd, 0x48, - 0x40, 0xd5, 0x04, 0x1e, 0xa7, 0x4a, 0xa0, 0x17, 0x61, 0x58, 0x44, 0x07, 0xaa, 0xfa, 0x7e, 0x53, - 0x28, 0xa1, 0x94, 0x33, 0x69, 0x2d, 0x46, 0x61, 0x9d, 0x4e, 0x2b, 0xc6, 0xd4, 0xcc, 0x83, 0x99, - 0xc5, 0xb8, 0xaa, 0x59, 0xa3, 0x4b, 0x84, 0xc2, 0x1e, 0xea, 0x29, 0x14, 0x76, 0xac, 0x96, 0x2b, - 0xf5, 0x6c, 0xf5, 0x84, 0xae, 0x8a, 0xac, 0xaf, 0xf6, 0xc1, 0x94, 0x98, 0x38, 0x0f, 0x7a, 0xba, - 0x5c, 0x4f, 0x4f, 0x97, 0xc3, 0x50, 0xdc, 0xbd, 0x37, 0x67, 0x8e, 0x7a, 0xce, 0xfc, 0xb0, 0x05, - 0xa6, 0xa4, 0x86, 0xfe, 0xd7, 0xdc, 0xcc, 0x7c, 0x2f, 0xe6, 0x4a, 0x7e, 0x71, 0x98, 0xe1, 0x77, - 0x96, 0xa3, 0xcf, 0xfe, 0xd7, 0x16, 0x3c, 0xd2, 0x95, 0x23, 0x5a, 0x82, 0x12, 0x13, 0x27, 0xb5, - 0x8b, 0xde, 0x13, 0xca, 0xb3, 0x5e, 0x22, 0x72, 0xa4, 0xdb, 0xb8, 0x24, 0x5a, 0x4a, 0xa5, 0x40, - 0x7c, 0x32, 0x23, 0x05, 0xe2, 0x71, 0xa3, 0x7b, 0xee, 0x33, 0x07, 0xe2, 0x17, 0xe9, 0x89, 0x63, - 0xbc, 0x6a, 0x43, 0x1f, 0x30, 0x94, 0x8e, 0x76, 0x42, 0xe9, 0x88, 0x4c, 0x6a, 0xed, 0x0c, 0xf9, - 0x08, 0x4c, 0xb0, 0xb0, 0x81, 0xec, 0x9d, 0x87, 0x78, 0x6f, 0x57, 0x88, 0x7d, 0xb9, 0xaf, 0x26, - 0x70, 0x38, 0x45, 0x6d, 0xff, 0x59, 0x11, 0x06, 0xf8, 0xf2, 0x3b, 0x82, 0xeb, 0xe5, 0xd3, 0x50, - 0x72, 0xb7, 0xb7, 0xdb, 0x3c, 0xab, 0x5d, 0x7f, 0xec, 0x19, 0x5c, 0x91, 0x40, 0x1c, 0xe3, 0xd1, - 0xb2, 0xd0, 0x77, 0x77, 0x88, 0x4c, 0xcc, 0x1b, 0x3e, 0xbb, 0xe8, 0x44, 0x0e, 0x97, 0x95, 0xd4, - 0x39, 0x1b, 0x6b, 0xc6, 0xd1, 0x27, 0x01, 0xc2, 0x28, 0x70, 0xbd, 0x0d, 0x0a, 0x13, 0xc1, 0xdd, - 0x9f, 0xea, 0xc0, 0xad, 0xa6, 0x88, 0x39, 0xcf, 0x78, 0xcf, 0x51, 0x08, 0xac, 0x71, 0x44, 0xb3, - 0xc6, 0x49, 0x3f, 0x93, 0x18, 0x3b, 0xe0, 0x5c, 0xe3, 0x31, 0x9b, 0xf9, 0x20, 0x94, 0x14, 0xf3, - 0x6e, 0xda, 0xaf, 0x11, 0x5d, 0x2c, 0xfa, 0x30, 0x8c, 0x27, 0xda, 0x76, 0x20, 0xe5, 0xd9, 0x2f, - 0x5b, 0x30, 0xce, 0x1b, 0xb3, 0xe4, 0xed, 0x88, 0xd3, 0xe0, 0x2e, 0x1c, 0x6b, 0x66, 0xec, 0xca, - 0x62, 0xf8, 0x7b, 0xdf, 0xc5, 0x95, 0xb2, 0x2c, 0x0b, 0x8b, 0x33, 0xeb, 0x40, 0xe7, 0xe9, 0x8a, - 0xa3, 0xbb, 0xae, 0xd3, 0x14, 0xf1, 0x0d, 0x46, 0xf8, 0x6a, 0xe3, 0x30, 0xac, 0xb0, 0xf6, 0x1f, - 0x5a, 0x30, 0xc9, 0x5b, 0x7e, 0x85, 0xec, 0xaa, 0xbd, 0xe9, 0x5b, 0xd9, 0x76, 0x91, 0x4f, 0xb5, - 0x90, 0x93, 0x4f, 0x55, 0xff, 0xb4, 0x62, 0xc7, 0x4f, 0xfb, 0x8a, 0x05, 0x62, 0x86, 0x1c, 0x81, - 0x3e, 0xe3, 0xbb, 0x4c, 0x7d, 0xc6, 0x4c, 0xfe, 0x22, 0xc8, 0x51, 0x64, 0xfc, 0xb5, 0x05, 0x13, - 0x9c, 0x20, 0xb6, 0xd5, 0x7f, 0x4b, 0xc7, 0x61, 0xde, 0xfc, 0xa2, 0x4c, 0xe7, 0xcb, 0x2b, 0x64, - 0x77, 0xcd, 0xaf, 0x3a, 0xd1, 0x66, 0xf6, 0x47, 0x19, 0x83, 0xd5, 0xd7, 0x71, 0xb0, 0x1a, 0x72, - 0x01, 0x19, 0xe9, 0xc6, 0xba, 0x04, 0x08, 0x38, 0x68, 0xba, 0x31, 0xfb, 0xcf, 0x2d, 0x40, 0xbc, - 0x1a, 0x43, 0x70, 0xa3, 0xe2, 0x10, 0x83, 0x6a, 0x07, 0x5d, 0xbc, 0x35, 0x29, 0x0c, 0xd6, 0xa8, - 0x0e, 0xa5, 0x7b, 0x12, 0x0e, 0x17, 0xc5, 0xee, 0x0e, 0x17, 0x07, 0xe8, 0xd1, 0x7f, 0x36, 0x00, - 0xc9, 0x97, 0x7d, 0xe8, 0x06, 0x8c, 0xd4, 0x9d, 0x96, 0x73, 0xcb, 0x6d, 0xba, 0x91, 0x4b, 0xc2, - 0x4e, 0xde, 0x58, 0x0b, 0x1a, 0x9d, 0x30, 0x91, 0x6b, 0x10, 0x6c, 0xf0, 0x41, 0xb3, 0x00, 0xad, - 0xc0, 0xdd, 0x71, 0x9b, 0x64, 0x83, 0xa9, 0x5d, 0x58, 0x44, 0x15, 0xee, 0x1a, 0x26, 0xa1, 0x58, - 0xa3, 0xc8, 0x08, 0xa3, 0x50, 0x7c, 0xc0, 0x61, 0x14, 0xe0, 0xc8, 0xc2, 0x28, 0xf4, 0x1d, 0x28, - 0x8c, 0xc2, 0xd0, 0x81, 0xc3, 0x28, 0xf4, 0xf7, 0x14, 0x46, 0x01, 0xc3, 0x09, 0x29, 0x7b, 0xd2, - 0xff, 0xcb, 0x6e, 0x93, 0x88, 0x0b, 0x07, 0x0f, 0x03, 0x33, 0x73, 0x6f, 0xaf, 0x7c, 0x02, 0x67, - 0x52, 0xe0, 0x9c, 0x92, 0xe8, 0xa3, 0x30, 0xed, 0x34, 0x9b, 0xfe, 0x6d, 0x35, 0xa8, 0x4b, 0x61, - 0xdd, 0x69, 0x72, 0x13, 0xc8, 0x20, 0xe3, 0x7a, 0xea, 0xde, 0x5e, 0x79, 0x7a, 0x2e, 0x87, 0x06, - 0xe7, 0x96, 0x46, 0xaf, 0x42, 0xa9, 0x15, 0xf8, 0xf5, 0x15, 0xed, 0xf9, 0xf1, 0x19, 0xda, 0x81, - 0x55, 0x09, 0xdc, 0xdf, 0x2b, 0x8f, 0xaa, 0x3f, 0xec, 0xc0, 0x8f, 0x0b, 0x64, 0xc4, 0x45, 0x18, - 0x3e, 0xd4, 0xb8, 0x08, 0x5b, 0x30, 0x55, 0x23, 0x81, 0xeb, 0x34, 0xdd, 0xbb, 0x54, 0x5e, 0x96, - 0xfb, 0xd3, 0x1a, 0x94, 0x82, 0xc4, 0x8e, 0xdc, 0x53, 0xb4, 0x60, 0x2d, 0xe3, 0x93, 0xdc, 0x81, - 0x63, 0x46, 0xf6, 0x7f, 0xb5, 0x60, 0x50, 0xbc, 0xe4, 0x3b, 0x02, 0xa9, 0x71, 0xce, 0x30, 0x4a, - 0x94, 0xb3, 0x3b, 0x8c, 0x35, 0x26, 0xd7, 0x1c, 0x51, 0x49, 0x98, 0x23, 0x1e, 0xe9, 0xc4, 0xa4, - 0xb3, 0x21, 0xe2, 0xff, 0x2d, 0x52, 0xe9, 0xdd, 0x78, 0x53, 0xfe, 0xe0, 0xbb, 0x60, 0x15, 0x06, - 0x43, 0xf1, 0xa6, 0xb9, 0x90, 0xff, 0x1a, 0x24, 0x39, 0x88, 0xb1, 0x17, 0x9d, 0x78, 0xc5, 0x2c, - 0x99, 0x64, 0x3e, 0x96, 0x2e, 0x3e, 0xc0, 0xc7, 0xd2, 0xdd, 0x5e, 0xdd, 0xf7, 0x1d, 0xc6, 0xab, - 0x7b, 0xfb, 0xeb, 0xec, 0xe4, 0xd4, 0xe1, 0x47, 0x20, 0x54, 0x5d, 0x32, 0xcf, 0x58, 0xbb, 0xc3, - 0xcc, 0x12, 0x8d, 0xca, 0x11, 0xae, 0x7e, 0xd1, 0x82, 0xd3, 0x19, 0x5f, 0xa5, 0x49, 0x5a, 0xcf, - 0xc0, 0x90, 0xd3, 0x6e, 0xb8, 0x6a, 0x2d, 0x6b, 0xa6, 0xc9, 0x39, 0x01, 0xc7, 0x8a, 0x02, 0x2d, - 0xc0, 0x24, 0xb9, 0xd3, 0x72, 0xb9, 0x21, 0x57, 0x77, 0x3e, 0x2e, 0xf2, 0xe7, 0x9f, 0x4b, 0x49, - 0x24, 0x4e, 0xd3, 0xab, 0x00, 0x51, 0xc5, 0xdc, 0x00, 0x51, 0x3f, 0x6f, 0xc1, 0xb0, 0x7a, 0xd5, - 0xfb, 0xc0, 0x7b, 0xfb, 0x23, 0x66, 0x6f, 0x3f, 0xdc, 0xa1, 0xb7, 0x73, 0xba, 0xf9, 0xf7, 0x0b, - 0xaa, 0xbd, 0x55, 0x3f, 0x88, 0x7a, 0x90, 0xe0, 0xee, 0xff, 0xe1, 0xc4, 0x45, 0x18, 0x76, 0x5a, - 0x2d, 0x89, 0x90, 0x1e, 0x70, 0x2c, 0xf6, 0x7b, 0x0c, 0xc6, 0x3a, 0x8d, 0x7a, 0xc7, 0x51, 0xcc, - 0x7d, 0xc7, 0xd1, 0x00, 0x88, 0x9c, 0x60, 0x83, 0x44, 0x14, 0x26, 0x1c, 0x76, 0xf3, 0xf7, 0x9b, - 0x76, 0xe4, 0x36, 0x67, 0x5d, 0x2f, 0x0a, 0xa3, 0x60, 0xb6, 0xe2, 0x45, 0xd7, 0x02, 0x7e, 0x85, - 0xd4, 0x42, 0xac, 0x29, 0x5e, 0x58, 0xe3, 0x2b, 0x23, 0x58, 0xb0, 0x3a, 0xfa, 0x4d, 0x57, 0x8a, - 0x55, 0x01, 0xc7, 0x8a, 0xc2, 0xfe, 0x20, 0x3b, 0x7d, 0x58, 0x9f, 0x1e, 0x2c, 0xbc, 0xd8, 0x4f, - 0x8e, 0xa8, 0xd1, 0x60, 0x46, 0xd1, 0x45, 0x3d, 0x88, 0x59, 0xe7, 0xcd, 0x9e, 0x56, 0xac, 0xbf, - 0x88, 0x8c, 0x23, 0x9d, 0xa1, 0x8f, 0xa7, 0xdc, 0x63, 0x9e, 0xed, 0x72, 0x6a, 0x1c, 0xc0, 0x21, - 0x86, 0x25, 0x82, 0x62, 0x69, 0x72, 0x2a, 0x55, 0xb1, 0x2e, 0xb4, 0x44, 0x50, 0x02, 0x81, 0x63, - 0x1a, 0x2a, 0x4c, 0xa9, 0x3f, 0xe1, 0x34, 0x8a, 0x83, 0x11, 0x2b, 0xea, 0x10, 0x6b, 0x14, 0xe8, - 0x82, 0x50, 0x28, 0x70, 0xbb, 0xc0, 0xc3, 0x09, 0x85, 0x82, 0xec, 0x2e, 0x4d, 0x0b, 0x74, 0x11, - 0x86, 0xc9, 0x9d, 0x88, 0x04, 0x9e, 0xd3, 0xa4, 0x35, 0xf4, 0xc7, 0xf1, 0x33, 0x97, 0x62, 0x30, - 0xd6, 0x69, 0xd0, 0x1a, 0x8c, 0x87, 0x5c, 0xcf, 0xa6, 0xa2, 0xd4, 0x73, 0x7d, 0xe5, 0x53, 0xea, - 0x3d, 0xb5, 0x89, 0xde, 0x67, 0x20, 0xbe, 0x3b, 0xc9, 0x28, 0x13, 0x49, 0x16, 0xe8, 0x35, 0x18, - 0x6b, 0xfa, 0x4e, 0x63, 0xde, 0x69, 0x3a, 0x5e, 0x9d, 0xf5, 0xcf, 0x90, 0x99, 0x0f, 0xfb, 0xaa, - 0x81, 0xc5, 0x09, 0x6a, 0x2a, 0xbc, 0xe9, 0x10, 0x11, 0xa6, 0xcd, 0xf1, 0x36, 0x48, 0x28, 0xd2, - 0xd2, 0x33, 0xe1, 0xed, 0x6a, 0x0e, 0x0d, 0xce, 0x2d, 0x8d, 0x5e, 0x82, 0x11, 0xf9, 0xf9, 0x5a, - 0x50, 0x96, 0xf8, 0x49, 0x8c, 0x86, 0xc3, 0x06, 0x25, 0x0a, 0xe1, 0xb8, 0xfc, 0xbf, 0x16, 0x38, - 0xeb, 0xeb, 0x6e, 0x5d, 0x44, 0x2a, 0xe0, 0xcf, 0x87, 0x3f, 0x2c, 0xdf, 0x2a, 0x2e, 0x65, 0x11, - 0xed, 0xef, 0x95, 0x4f, 0x89, 0x5e, 0xcb, 0xc4, 0xe3, 0x6c, 0xde, 0x68, 0x05, 0xa6, 0x36, 0x89, - 0xd3, 0x8c, 0x36, 0x17, 0x36, 0x49, 0x7d, 0x4b, 0x2e, 0x38, 0x16, 0xe6, 0x45, 0x7b, 0x3a, 0x72, - 0x39, 0x4d, 0x82, 0xb3, 0xca, 0xa1, 0xb7, 0x60, 0xba, 0xd5, 0xbe, 0xd5, 0x74, 0xc3, 0xcd, 0x55, - 0x3f, 0x62, 0x4e, 0x48, 0x73, 0x8d, 0x46, 0x40, 0x42, 0xfe, 0xba, 0x94, 0x1d, 0xbd, 0x32, 0x90, - 0x4e, 0x35, 0x87, 0x0e, 0xe7, 0x72, 0x40, 0x77, 0xe1, 0x78, 0x62, 0x22, 0x88, 0x88, 0x18, 0x63, - 0xf9, 0x39, 0x6a, 0x6a, 0x59, 0x05, 0x44, 0x70, 0x99, 0x2c, 0x14, 0xce, 0xae, 0x02, 0xbd, 0x0c, - 0xe0, 0xb6, 0x96, 0x9d, 0x6d, 0xb7, 0x49, 0xaf, 0x8a, 0x53, 0x6c, 0x8e, 0xd0, 0x6b, 0x03, 0x54, - 0xaa, 0x12, 0x4a, 0xf7, 0x66, 0xf1, 0x6f, 0x17, 0x6b, 0xd4, 0xe8, 0x2a, 0x8c, 0x89, 0x7f, 0xbb, - 0x62, 0x48, 0x79, 0x60, 0x96, 0xc7, 0x58, 0x54, 0xad, 0xaa, 0x8e, 0xd9, 0x4f, 0x41, 0x70, 0xa2, - 0x2c, 0xda, 0x80, 0xd3, 0x32, 0xd3, 0xa0, 0x3e, 0x3f, 0xe5, 0x18, 0x84, 0x2c, 0x31, 0xcc, 0x10, - 0x7f, 0x95, 0x32, 0xd7, 0x89, 0x10, 0x77, 0xe6, 0x43, 0xcf, 0x75, 0x7d, 0x9a, 0xf3, 0x37, 0xc7, - 0xc7, 0xe3, 0x88, 0x83, 0x57, 0x93, 0x48, 0x9c, 0xa6, 0x47, 0x3e, 0x1c, 0x77, 0xbd, 0xac, 0x59, - 0x7d, 0x82, 0x31, 0xfa, 0x10, 0x7f, 0x6e, 0xdd, 0x79, 0x46, 0x67, 0xe2, 0x71, 0x36, 0xdf, 0x77, - 0xe6, 0xf7, 0xf7, 0x07, 0x16, 0x2d, 0xad, 0x49, 0xe7, 0xe8, 0x53, 0x30, 0xa2, 0x7f, 0x94, 0x90, - 0x34, 0xce, 0x65, 0x0b, 0xaf, 0xda, 0x9e, 0xc0, 0x65, 0x7b, 0xb5, 0xee, 0x75, 0x1c, 0x36, 0x38, - 0xa2, 0x7a, 0x46, 0x6c, 0x83, 0x0b, 0xbd, 0x49, 0x32, 0xbd, 0xbb, 0xbd, 0x11, 0xc8, 0x9e, 0xee, - 0xe8, 0x2a, 0x0c, 0xd5, 0x9b, 0x2e, 0xf1, 0xa2, 0x4a, 0xb5, 0x53, 0xf4, 0xc6, 0x05, 0x41, 0x23, - 0xd6, 0x8f, 0xc8, 0xf1, 0xc2, 0x61, 0x58, 0x71, 0xb0, 0x5f, 0x82, 0xe1, 0x5a, 0x93, 0x90, 0x16, - 0x7f, 0xbe, 0x83, 0x9e, 0x64, 0xb7, 0x09, 0x26, 0x0f, 0x5a, 0x4c, 0x1e, 0xd4, 0x2f, 0x0a, 0x4c, - 0x12, 0x94, 0x78, 0xfb, 0xb7, 0x0a, 0x50, 0xee, 0x92, 0x6a, 0x28, 0x61, 0xc0, 0xb2, 0x7a, 0x32, - 0x60, 0xcd, 0xc1, 0x78, 0xfc, 0x4f, 0xd7, 0x8d, 0x29, 0x1f, 0xd8, 0x1b, 0x26, 0x1a, 0x27, 0xe9, - 0x7b, 0x7e, 0xce, 0xa0, 0xdb, 0xc0, 0xfa, 0xba, 0x3e, 0xc8, 0x31, 0x6c, 0xdf, 0xfd, 0xbd, 0x5f, - 0x98, 0x73, 0xed, 0x98, 0xf6, 0xd7, 0x0b, 0x70, 0x5c, 0x75, 0xe1, 0x77, 0x6e, 0xc7, 0x5d, 0x4f, - 0x77, 0xdc, 0x21, 0x58, 0x81, 0xed, 0x6b, 0x30, 0xc0, 0x03, 0x59, 0xf6, 0x20, 0xa8, 0x3f, 0x6a, - 0xc6, 0xd7, 0x56, 0xb2, 0xa1, 0x11, 0x63, 0xfb, 0x07, 0x2c, 0x18, 0x4f, 0xbc, 0x8b, 0x43, 0x58, - 0x7b, 0x3c, 0x7d, 0x3f, 0xc2, 0x74, 0x96, 0x98, 0x7e, 0x16, 0xfa, 0x36, 0xfd, 0x30, 0x4a, 0xba, - 0x88, 0x5c, 0xf6, 0xc3, 0x08, 0x33, 0x8c, 0xfd, 0x47, 0x16, 0xf4, 0xaf, 0x39, 0xae, 0x17, 0x49, - 0x73, 0x82, 0x95, 0x63, 0x4e, 0xe8, 0xe5, 0xbb, 0xd0, 0x8b, 0x30, 0x40, 0xd6, 0xd7, 0x49, 0x3d, - 0x12, 0xa3, 0x2a, 0x83, 0x28, 0x0c, 0x2c, 0x31, 0x28, 0x95, 0x1c, 0x59, 0x65, 0xfc, 0x2f, 0x16, - 0xc4, 0xe8, 0x26, 0x94, 0x22, 0x77, 0x9b, 0xcc, 0x35, 0x1a, 0xc2, 0xc8, 0x7e, 0x1f, 0x91, 0x3f, - 0xd6, 0x24, 0x03, 0x1c, 0xf3, 0xb2, 0xbf, 0x54, 0x00, 0x88, 0x23, 0x80, 0x75, 0xfb, 0xc4, 0xf9, - 0x94, 0xf9, 0xf5, 0x5c, 0x86, 0xf9, 0x15, 0xc5, 0x0c, 0x33, 0x6c, 0xaf, 0xaa, 0x9b, 0x8a, 0x3d, - 0x75, 0x53, 0xdf, 0x41, 0xba, 0x69, 0x01, 0x26, 0xe3, 0x08, 0x66, 0x66, 0x00, 0x47, 0x76, 0xe8, - 0xae, 0x25, 0x91, 0x38, 0x4d, 0x6f, 0x13, 0x38, 0xab, 0x02, 0x39, 0x89, 0xb3, 0x90, 0x79, 0x90, - 0xeb, 0xe6, 0xec, 0x2e, 0xfd, 0x14, 0xdb, 0x97, 0x0b, 0xb9, 0xf6, 0xe5, 0x9f, 0xb0, 0xe0, 0x58, - 0xb2, 0x1e, 0xf6, 0xdc, 0xfa, 0x0b, 0x16, 0x1c, 0x8f, 0xd3, 0x78, 0xa4, 0x6d, 0xfa, 0x2f, 0x74, - 0x0c, 0x4e, 0x95, 0xd3, 0xe2, 0x38, 0x5a, 0xc7, 0x4a, 0x16, 0x6b, 0x9c, 0x5d, 0xa3, 0xfd, 0x5f, - 0xfa, 0x60, 0x3a, 0x2f, 0xaa, 0x15, 0x7b, 0x60, 0xe2, 0xdc, 0xa9, 0x6d, 0x91, 0xdb, 0xc2, 0x8d, - 0x3f, 0x7e, 0x60, 0xc2, 0xc1, 0x58, 0xe2, 0x93, 0x99, 0x5b, 0x0a, 0x3d, 0x66, 0x6e, 0xd9, 0x84, - 0xc9, 0xdb, 0x9b, 0xc4, 0xbb, 0xee, 0x85, 0x4e, 0xe4, 0x86, 0xeb, 0x2e, 0xb3, 0x48, 0xf3, 0x79, - 0x23, 0xd3, 0x67, 0x4f, 0xde, 0x4c, 0x12, 0xec, 0xef, 0x95, 0x4f, 0x1b, 0x80, 0xb8, 0xc9, 0x7c, - 0x23, 0xc1, 0x69, 0xa6, 0xe9, 0xc4, 0x37, 0x7d, 0x0f, 0x38, 0xf1, 0xcd, 0xb6, 0x2b, 0xfc, 0x58, - 0xe4, 0xeb, 0x01, 0x76, 0xd7, 0x5c, 0x51, 0x50, 0xac, 0x51, 0xa0, 0x4f, 0x00, 0xd2, 0x93, 0x8b, - 0x19, 0x41, 0x45, 0x9f, 0xbd, 0xb7, 0x57, 0x46, 0xab, 0x29, 0xec, 0xfe, 0x5e, 0x79, 0x8a, 0x42, - 0x2b, 0x1e, 0xbd, 0xb3, 0xc6, 0x91, 0xd8, 0x32, 0x18, 0xa1, 0x9b, 0x30, 0x41, 0xa1, 0x6c, 0x45, - 0xc9, 0x88, 0xa5, 0xfc, 0x9e, 0xf9, 0xf4, 0xbd, 0xbd, 0xf2, 0xc4, 0x6a, 0x02, 0x97, 0xc7, 0x3a, - 0xc5, 0x24, 0x23, 0xff, 0xcd, 0x50, 0xaf, 0xf9, 0x6f, 0xec, 0x2f, 0x58, 0x70, 0x32, 0x37, 0x99, - 0x3f, 0x3a, 0x0f, 0x43, 0x4e, 0xcb, 0xe5, 0x86, 0x0f, 0x71, 0xd4, 0x30, 0x05, 0x5b, 0xb5, 0xc2, - 0xcd, 0x1e, 0x0a, 0x4b, 0x77, 0xf8, 0x2d, 0xd7, 0x6b, 0x24, 0x77, 0xf8, 0x2b, 0xae, 0xd7, 0xc0, - 0x0c, 0xa3, 0x8e, 0xac, 0x62, 0xee, 0x23, 0x86, 0xaf, 0xd2, 0xb5, 0x9a, 0x91, 0xf6, 0xff, 0x68, - 0x9b, 0x81, 0x9e, 0xd6, 0x8d, 0x94, 0xc2, 0x1f, 0x31, 0xd7, 0x40, 0xf9, 0x79, 0x0b, 0xc4, 0xa3, - 0xe7, 0x1e, 0xce, 0xe4, 0x37, 0x61, 0x64, 0x27, 0x9d, 0x78, 0xf1, 0x6c, 0xfe, 0x2b, 0x70, 0x11, - 0xab, 0x5d, 0x89, 0xe8, 0x46, 0x92, 0x45, 0x83, 0x97, 0xdd, 0x00, 0x81, 0x5d, 0x24, 0xcc, 0x14, - 0xd1, 0xbd, 0x35, 0xcf, 0x01, 0x34, 0x18, 0x2d, 0xcb, 0xc6, 0x5c, 0x30, 0x25, 0xae, 0x45, 0x85, - 0xc1, 0x1a, 0x95, 0xfd, 0xcf, 0x0b, 0x30, 0x2c, 0x13, 0xfd, 0xb5, 0xbd, 0x5e, 0x14, 0x86, 0x07, - 0xca, 0xfc, 0x8d, 0x2e, 0x40, 0x89, 0x69, 0xb4, 0xab, 0xb1, 0x9e, 0x55, 0xe9, 0x93, 0x56, 0x24, - 0x02, 0xc7, 0x34, 0x4c, 0x7c, 0x6f, 0xdf, 0x62, 0xe4, 0x89, 0x27, 0xba, 0x35, 0x0e, 0xc6, 0x12, - 0x8f, 0x3e, 0x0a, 0x13, 0xbc, 0x5c, 0xe0, 0xb7, 0x9c, 0x0d, 0x6e, 0x05, 0xeb, 0x57, 0x71, 0x4f, - 0x26, 0x56, 0x12, 0xb8, 0xfd, 0xbd, 0xf2, 0xb1, 0x24, 0x8c, 0x99, 0x77, 0x53, 0x5c, 0x98, 0xb3, - 0x1b, 0xaf, 0x84, 0xee, 0xea, 0x29, 0x1f, 0xb9, 0x18, 0x85, 0x75, 0x3a, 0xfb, 0x53, 0x80, 0xd2, - 0x29, 0x0f, 0xd1, 0xeb, 0xdc, 0x59, 0xda, 0x0d, 0x48, 0xa3, 0x93, 0xb9, 0x57, 0x8f, 0xee, 0x21, - 0x5f, 0xd7, 0xf1, 0x52, 0x58, 0x95, 0xb7, 0xff, 0x8f, 0x22, 0x4c, 0x24, 0xe3, 0x09, 0xa0, 0xcb, - 0x30, 0xc0, 0x45, 0x4a, 0xc1, 0xbe, 0x83, 0x37, 0x91, 0x16, 0x85, 0x80, 0x1d, 0xae, 0x42, 0x2a, - 0x15, 0xe5, 0xd1, 0x5b, 0x30, 0xdc, 0xf0, 0x6f, 0x7b, 0xb7, 0x9d, 0xa0, 0x31, 0x57, 0xad, 0x88, - 0xe9, 0x9c, 0xa9, 0xe2, 0x58, 0x8c, 0xc9, 0xf4, 0xc8, 0x06, 0xcc, 0x72, 0x1e, 0xa3, 0xb0, 0xce, - 0x0e, 0xad, 0xb1, 0x14, 0x21, 0xeb, 0xee, 0xc6, 0x8a, 0xd3, 0xea, 0xf4, 0x72, 0x66, 0x41, 0x12, - 0x69, 0x9c, 0x47, 0x45, 0x1e, 0x11, 0x8e, 0xc0, 0x31, 0x23, 0xf4, 0x19, 0x98, 0x0a, 0x73, 0x8c, - 0x2e, 0x79, 0x19, 0x70, 0x3b, 0xd9, 0x21, 0xe6, 0x1f, 0xba, 0xb7, 0x57, 0x9e, 0xca, 0x32, 0xcf, - 0x64, 0x55, 0x63, 0x7f, 0xbe, 0x0f, 0x66, 0x64, 0xa6, 0xcf, 0x0c, 0x3f, 0xfd, 0xcf, 0x59, 0x09, - 0x47, 0xfd, 0x97, 0xf3, 0xf7, 0x86, 0x07, 0xe6, 0xae, 0xff, 0xc5, 0xb4, 0xbb, 0xfe, 0xab, 0x07, - 0x6c, 0xc6, 0xa1, 0x39, 0xed, 0x7f, 0xc7, 0x7a, 0xda, 0x7f, 0xf9, 0x18, 0x18, 0xbb, 0xb9, 0x91, - 0x19, 0xdf, 0x3a, 0xa4, 0xcc, 0xf8, 0x18, 0x86, 0xc8, 0x76, 0x2b, 0xda, 0x5d, 0x74, 0x03, 0xd1, - 0xe2, 0x4c, 0x9e, 0x4b, 0x82, 0x26, 0xcd, 0x53, 0x62, 0xb0, 0xe2, 0x83, 0x76, 0x60, 0x72, 0xa3, - 0x4e, 0x12, 0xc9, 0xb1, 0x8b, 0xf9, 0xab, 0xe7, 0xd2, 0xc2, 0x52, 0x87, 0xcc, 0xd8, 0xec, 0xbe, - 0x90, 0x22, 0xc1, 0xe9, 0x2a, 0x58, 0x62, 0x6e, 0xe7, 0x76, 0xb8, 0xd4, 0x74, 0xc2, 0xc8, 0xad, - 0xcf, 0x37, 0xfd, 0xfa, 0x56, 0x2d, 0xf2, 0x03, 0x99, 0xf6, 0x2b, 0x53, 0x5c, 0x9f, 0xbb, 0x59, - 0x4b, 0xd1, 0xa7, 0x13, 0x73, 0x67, 0x51, 0xe1, 0xcc, 0xba, 0xd0, 0x2a, 0x0c, 0x6e, 0xb8, 0x11, - 0x26, 0x2d, 0x5f, 0xdc, 0xea, 0x33, 0x37, 0xa4, 0x4b, 0x9c, 0x24, 0x9d, 0x28, 0x5b, 0x20, 0xb0, - 0x64, 0x82, 0x5e, 0x57, 0x5b, 0xf1, 0x40, 0xbe, 0xce, 0x2e, 0xed, 0xff, 0x94, 0xb9, 0x19, 0xbf, - 0x06, 0x45, 0x6f, 0x3d, 0xec, 0x14, 0xb5, 0x63, 0x75, 0xb9, 0x96, 0x4e, 0x60, 0xbd, 0xba, 0x5c, - 0xc3, 0xb4, 0x20, 0x7b, 0xe0, 0x17, 0xd6, 0x43, 0x57, 0x24, 0x30, 0xc9, 0x7c, 0xef, 0x58, 0xa9, - 0x2d, 0xd4, 0x2a, 0xe9, 0xa4, 0xdd, 0x0c, 0x8c, 0x79, 0x71, 0x74, 0x03, 0x4a, 0x1b, 0xdc, 0x7e, - 0xa3, 0xb2, 0xff, 0x67, 0x1e, 0x09, 0x97, 0x24, 0x51, 0x3a, 0x55, 0xb7, 0x42, 0xe1, 0x98, 0x15, - 0xfa, 0xbc, 0x05, 0xc7, 0x93, 0xe9, 0x92, 0xd9, 0xb3, 0x1c, 0xe1, 0x2a, 0xf4, 0x62, 0x2f, 0xf9, - 0xab, 0x59, 0x01, 0xa3, 0x42, 0xa6, 0x66, 0xcf, 0x24, 0xc3, 0xd9, 0xd5, 0xd1, 0x8e, 0x0e, 0x6e, - 0x35, 0x84, 0xcb, 0x4a, 0x66, 0x47, 0x27, 0x42, 0x98, 0xf0, 0x8e, 0xc6, 0xf3, 0x8b, 0x98, 0x16, - 0x44, 0x6b, 0xa0, 0xe5, 0xf9, 0x67, 0x66, 0x8c, 0x9c, 0x33, 0x78, 0x59, 0x51, 0xc9, 0x9c, 0x3d, - 0x54, 0x32, 0x8b, 0xa1, 0x58, 0xe3, 0x43, 0xa7, 0x52, 0xdd, 0xf5, 0x1a, 0x24, 0x60, 0x46, 0x8c, - 0x9c, 0xa9, 0xb4, 0xc0, 0x28, 0xd2, 0x53, 0x89, 0xc3, 0xb1, 0xe0, 0xc0, 0x78, 0x91, 0xd6, 0xe6, - 0x7a, 0xd8, 0x29, 0x38, 0xfd, 0x02, 0x69, 0x6d, 0x26, 0x26, 0x14, 0xe7, 0xc5, 0xe0, 0x58, 0x70, - 0xa0, 0x4b, 0x66, 0x9d, 0x2e, 0x20, 0x12, 0x74, 0x4a, 0xfc, 0xbf, 0xcc, 0x49, 0xd2, 0x4b, 0x46, - 0x20, 0xb0, 0x64, 0x82, 0x3e, 0x69, 0xca, 0x1c, 0x3c, 0xf5, 0xff, 0xd3, 0x5d, 0x64, 0x0e, 0x83, - 0x6f, 0x67, 0xa9, 0xe3, 0x65, 0x28, 0xac, 0xd7, 0x45, 0xb6, 0xff, 0x4c, 0x35, 0xf3, 0xf2, 0x82, - 0xc1, 0x8d, 0x05, 0x7b, 0x5e, 0x5e, 0xc0, 0x85, 0xf5, 0x3a, 0x9d, 0xfa, 0xce, 0xdd, 0x76, 0x40, - 0x96, 0xdd, 0xa6, 0x4c, 0xd9, 0x9f, 0x39, 0xf5, 0xe7, 0x24, 0x51, 0x7a, 0xea, 0x2b, 0x14, 0x8e, - 0x59, 0x51, 0xbe, 0xb1, 0x24, 0x34, 0x95, 0xcf, 0x57, 0x09, 0x3c, 0x69, 0xbe, 0x99, 0xb2, 0xd0, - 0x16, 0x8c, 0xee, 0x84, 0xad, 0x4d, 0x22, 0x77, 0x45, 0x91, 0xaf, 0x3f, 0xf3, 0x4d, 0xfb, 0x0d, - 0x41, 0xe8, 0x06, 0x51, 0xdb, 0x69, 0xa6, 0x36, 0x72, 0x76, 0x1b, 0xbf, 0xa1, 0x33, 0xc3, 0x26, - 0x6f, 0x3a, 0x11, 0xde, 0xe6, 0x81, 0xa7, 0x44, 0x2a, 0xff, 0xcc, 0x89, 0x90, 0x11, 0x9b, 0x8a, - 0x4f, 0x04, 0x81, 0xc0, 0x92, 0x89, 0xea, 0x6c, 0x76, 0x00, 0x9d, 0xe8, 0xd2, 0xd9, 0xa9, 0xf6, - 0xc6, 0x9d, 0xcd, 0x0e, 0x9c, 0x98, 0x15, 0x3b, 0x68, 0x5a, 0x19, 0x69, 0xab, 0xa7, 0x1f, 0xca, - 0x3f, 0x68, 0xba, 0xa5, 0xb9, 0xe6, 0x07, 0x4d, 0x16, 0x15, 0xce, 0xac, 0x8b, 0x7e, 0x5c, 0x4b, - 0xc6, 0x10, 0x13, 0xc1, 0xf4, 0x9f, 0xcc, 0x09, 0xc1, 0x97, 0x0e, 0x34, 0xc6, 0x3f, 0x4e, 0xa1, - 0x70, 0xcc, 0x0a, 0x35, 0x60, 0xac, 0x65, 0xc4, 0xa6, 0x64, 0x49, 0x01, 0x72, 0xe4, 0x82, 0xac, - 0x28, 0x96, 0x5c, 0xa9, 0x60, 0x62, 0x70, 0x82, 0x27, 0xf3, 0xd0, 0xe2, 0xcf, 0xad, 0x58, 0xce, - 0x80, 0x9c, 0xa1, 0xce, 0x78, 0x91, 0xc5, 0x87, 0x5a, 0x20, 0xb0, 0x64, 0x42, 0x7b, 0x43, 0x3c, - 0x12, 0xf2, 0x43, 0x96, 0x7a, 0x23, 0xcf, 0x90, 0x9a, 0x65, 0x59, 0x90, 0x01, 0x99, 0x05, 0x0a, - 0xc7, 0xac, 0xe8, 0x4e, 0x4e, 0x0f, 0xbc, 0x53, 0xf9, 0x3b, 0x79, 0xf2, 0xb8, 0x63, 0x3b, 0x39, - 0x3d, 0xec, 0x8a, 0xe2, 0xa8, 0x53, 0xf1, 0x83, 0x59, 0xda, 0x80, 0x9c, 0x76, 0xa9, 0x00, 0xc4, - 0xe9, 0x76, 0x29, 0x14, 0x8e, 0x59, 0xd9, 0x3f, 0x58, 0x80, 0x33, 0x9d, 0xd7, 0x5b, 0x6c, 0x2e, - 0xa9, 0xc6, 0x3e, 0x25, 0x09, 0x73, 0x09, 0xbf, 0xbc, 0xc7, 0x54, 0x3d, 0x87, 0x14, 0xbd, 0x04, - 0x93, 0xea, 0x29, 0x57, 0xd3, 0xad, 0xef, 0xae, 0xc6, 0xfa, 0x12, 0x15, 0x7c, 0xa3, 0x96, 0x24, - 0xc0, 0xe9, 0x32, 0x68, 0x0e, 0xc6, 0x0d, 0x60, 0x65, 0x51, 0x5c, 0xd2, 0xe3, 0x40, 0xf5, 0x26, - 0x1a, 0x27, 0xe9, 0xed, 0x9f, 0xb5, 0xe0, 0xa1, 0x9c, 0xac, 0xc1, 0x3d, 0x47, 0xcc, 0x5c, 0x87, - 0xf1, 0x96, 0x59, 0xb4, 0x4b, 0x90, 0x5f, 0x23, 0x37, 0xb1, 0x6a, 0x6b, 0x02, 0x81, 0x93, 0x4c, - 0xed, 0x9f, 0x2e, 0xc0, 0xe9, 0x8e, 0xbe, 0xc9, 0x08, 0xc3, 0x89, 0x8d, 0xed, 0xd0, 0x59, 0x08, - 0x48, 0x83, 0x78, 0x91, 0xeb, 0x34, 0x6b, 0x2d, 0x52, 0xd7, 0x0c, 0x5e, 0xcc, 0xc9, 0xf7, 0xd2, - 0x4a, 0x6d, 0x2e, 0x4d, 0x81, 0x73, 0x4a, 0xa2, 0x65, 0x40, 0x69, 0x8c, 0x18, 0x61, 0x96, 0x80, - 0x22, 0xcd, 0x0f, 0x67, 0x94, 0x40, 0x1f, 0x84, 0x51, 0xe5, 0xf3, 0xac, 0x8d, 0x38, 0xdb, 0xd8, - 0xb1, 0x8e, 0xc0, 0x26, 0x1d, 0xba, 0xc8, 0x33, 0x98, 0x88, 0x5c, 0x37, 0xc2, 0x3a, 0x36, 0x2e, - 0xd3, 0x93, 0x08, 0x30, 0xd6, 0x69, 0xe6, 0x5f, 0xfa, 0xed, 0x6f, 0x9e, 0x79, 0xdf, 0xef, 0x7d, - 0xf3, 0xcc, 0xfb, 0xfe, 0xf0, 0x9b, 0x67, 0xde, 0xf7, 0x3d, 0xf7, 0xce, 0x58, 0xbf, 0x7d, 0xef, - 0x8c, 0xf5, 0x7b, 0xf7, 0xce, 0x58, 0x7f, 0x78, 0xef, 0x8c, 0xf5, 0x27, 0xf7, 0xce, 0x58, 0x5f, - 0xfa, 0xd3, 0x33, 0xef, 0x7b, 0x13, 0xc5, 0x31, 0x68, 0x2f, 0xd0, 0xd1, 0xb9, 0xb0, 0x73, 0xf1, - 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x95, 0x37, 0xa6, 0xd7, 0x16, 0x01, 0x00, + 0xbb, 0x58, 0xec, 0x35, 0x20, 0xf6, 0x20, 0x97, 0xbb, 0xcb, 0x15, 0xe7, 0x04, 0x66, 0x31, 0x33, + 0xe8, 0xcd, 0x1e, 0x00, 0xe4, 0x72, 0xc9, 0x8f, 0x85, 0xee, 0x9c, 0x99, 0xe2, 0x74, 0x57, 0xf5, + 0x56, 0x55, 0x0f, 0x30, 0xf8, 0xc8, 0x90, 0x44, 0x7d, 0xa2, 0x44, 0x4a, 0xdf, 0x17, 0x8c, 0x2f, + 0xf4, 0x1d, 0x41, 0x29, 0x14, 0x0e, 0x49, 0xb6, 0x24, 0xd3, 0x92, 0x4d, 0x53, 0x96, 0x64, 0x51, + 0x97, 0xaf, 0xb0, 0xa4, 0x70, 0xc8, 0xb2, 0x22, 0x2c, 0x2a, 0xac, 0xf0, 0xc8, 0x84, 0x1c, 0xa1, + 0xd0, 0x0f, 0x4b, 0xf2, 0xf1, 0xc3, 0x86, 0x65, 0xcb, 0x91, 0x67, 0x65, 0xd6, 0xd1, 0xdd, 0x83, + 0x1d, 0x0c, 0x97, 0x8c, 0xfd, 0xd7, 0xfd, 0xde, 0xcb, 0x97, 0x59, 0x79, 0xbe, 0x7c, 0xef, 0xe5, + 0x7b, 0xf0, 0xca, 0xce, 0x4b, 0xe1, 0xac, 0xeb, 0x5f, 0xd8, 0x69, 0xdf, 0x24, 0x81, 0x47, 0x22, + 0x12, 0x5e, 0xd8, 0x25, 0x5e, 0xdd, 0x0f, 0x2e, 0x08, 0x84, 0xd3, 0x72, 0x2f, 0xd4, 0xfc, 0x80, + 0x5c, 0xd8, 0xbd, 0x78, 0x61, 0x8b, 0x78, 0x24, 0x70, 0x22, 0x52, 0x9f, 0x6d, 0x05, 0x7e, 0xe4, + 0x23, 0xc4, 0x69, 0x66, 0x9d, 0x96, 0x3b, 0x4b, 0x69, 0x66, 0x77, 0x2f, 0xce, 0x3c, 0xbb, 0xe5, + 0x46, 0xdb, 0xed, 0x9b, 0xb3, 0x35, 0xbf, 0x79, 0x61, 0xcb, 0xdf, 0xf2, 0x2f, 0x30, 0xd2, 0x9b, + 0xed, 0x4d, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, 0x38, 0x8b, 0x99, 0x17, 0xe2, 0x6a, 0x9a, 0x4e, 0x6d, + 0xdb, 0xf5, 0x48, 0xb0, 0x77, 0xa1, 0xb5, 0xb3, 0xc5, 0xea, 0x0d, 0x48, 0xe8, 0xb7, 0x83, 0x1a, + 0x49, 0x56, 0xdc, 0xb1, 0x54, 0x78, 0xa1, 0x49, 0x22, 0x27, 0xa3, 0xb9, 0x33, 0x17, 0xf2, 0x4a, + 0x05, 0x6d, 0x2f, 0x72, 0x9b, 0xe9, 0x6a, 0x3e, 0xd0, 0xad, 0x40, 0x58, 0xdb, 0x26, 0x4d, 0x27, + 0x55, 0xee, 0xf9, 0xbc, 0x72, 0xed, 0xc8, 0x6d, 0x5c, 0x70, 0xbd, 0x28, 0x8c, 0x82, 0x64, 0x21, + 0xfb, 0x1b, 0x16, 0x9c, 0x9d, 0xbb, 0x51, 0x5d, 0x6a, 0x38, 0x61, 0xe4, 0xd6, 0xe6, 0x1b, 0x7e, + 0x6d, 0xa7, 0x1a, 0xf9, 0x01, 0xb9, 0xee, 0x37, 0xda, 0x4d, 0x52, 0x65, 0x1d, 0x81, 0x9e, 0x81, + 0xa1, 0x5d, 0xf6, 0x7f, 0x65, 0x71, 0xda, 0x3a, 0x6b, 0x9d, 0x2f, 0xcd, 0x4f, 0xfc, 0xd6, 0x7e, + 0xf9, 0x7d, 0x77, 0xf7, 0xcb, 0x43, 0xd7, 0x05, 0x1c, 0x2b, 0x0a, 0x74, 0x0e, 0x06, 0x36, 0xc3, + 0x8d, 0xbd, 0x16, 0x99, 0x2e, 0x30, 0xda, 0x31, 0x41, 0x3b, 0xb0, 0x5c, 0xa5, 0x50, 0x2c, 0xb0, + 0xe8, 0x02, 0x94, 0x5a, 0x4e, 0x10, 0xb9, 0x91, 0xeb, 0x7b, 0xd3, 0xc5, 0xb3, 0xd6, 0xf9, 0xfe, + 0xf9, 0x49, 0x41, 0x5a, 0xaa, 0x48, 0x04, 0x8e, 0x69, 0x68, 0x33, 0x02, 0xe2, 0xd4, 0xaf, 0x7a, + 0x8d, 0xbd, 0xe9, 0xbe, 0xb3, 0xd6, 0xf9, 0xa1, 0xb8, 0x19, 0x58, 0xc0, 0xb1, 0xa2, 0xb0, 0xbf, + 0x5c, 0x80, 0xa1, 0xb9, 0xcd, 0x4d, 0xd7, 0x73, 0xa3, 0x3d, 0x74, 0x1d, 0x46, 0x3c, 0xbf, 0x4e, + 0xe4, 0x7f, 0xf6, 0x15, 0xc3, 0xcf, 0x9d, 0x9d, 0x4d, 0x4f, 0xa5, 0xd9, 0x75, 0x8d, 0x6e, 0x7e, + 0xe2, 0xee, 0x7e, 0x79, 0x44, 0x87, 0x60, 0x83, 0x0f, 0xc2, 0x30, 0xdc, 0xf2, 0xeb, 0x8a, 0x6d, + 0x81, 0xb1, 0x2d, 0x67, 0xb1, 0xad, 0xc4, 0x64, 0xf3, 0xe3, 0x77, 0xf7, 0xcb, 0xc3, 0x1a, 0x00, + 0xeb, 0x4c, 0xd0, 0x4d, 0x18, 0xa7, 0x7f, 0xbd, 0xc8, 0x55, 0x7c, 0x8b, 0x8c, 0xef, 0xa3, 0x79, + 0x7c, 0x35, 0xd2, 0xf9, 0xa9, 0xbb, 0xfb, 0xe5, 0xf1, 0x04, 0x10, 0x27, 0x19, 0xda, 0x77, 0x60, + 0x6c, 0x2e, 0x8a, 0x9c, 0xda, 0x36, 0xa9, 0xf3, 0x11, 0x44, 0x2f, 0x40, 0x9f, 0xe7, 0x34, 0x89, + 0x18, 0xdf, 0xb3, 0xa2, 0x63, 0xfb, 0xd6, 0x9d, 0x26, 0xb9, 0xb7, 0x5f, 0x9e, 0xb8, 0xe6, 0xb9, + 0x6f, 0xb7, 0xc5, 0xac, 0xa0, 0x30, 0xcc, 0xa8, 0xd1, 0x73, 0x00, 0x75, 0xb2, 0xeb, 0xd6, 0x48, + 0xc5, 0x89, 0xb6, 0xc5, 0x78, 0x23, 0x51, 0x16, 0x16, 0x15, 0x06, 0x6b, 0x54, 0xf6, 0x6d, 0x28, + 0xcd, 0xed, 0xfa, 0x6e, 0xbd, 0xe2, 0xd7, 0x43, 0xb4, 0x03, 0xe3, 0xad, 0x80, 0x6c, 0x92, 0x40, + 0x81, 0xa6, 0xad, 0xb3, 0xc5, 0xf3, 0xc3, 0xcf, 0x9d, 0xcf, 0xfc, 0x58, 0x93, 0x74, 0xc9, 0x8b, + 0x82, 0xbd, 0xf9, 0x87, 0x44, 0x7d, 0xe3, 0x09, 0x2c, 0x4e, 0x72, 0xb6, 0xff, 0x69, 0x01, 0x8e, + 0xcf, 0xdd, 0x69, 0x07, 0x64, 0xd1, 0x0d, 0x77, 0x92, 0x33, 0xbc, 0xee, 0x86, 0x3b, 0xeb, 0x71, + 0x0f, 0xa8, 0xa9, 0xb5, 0x28, 0xe0, 0x58, 0x51, 0xa0, 0x67, 0x61, 0x90, 0xfe, 0xbe, 0x86, 0x57, + 0xc4, 0x27, 0x4f, 0x09, 0xe2, 0xe1, 0x45, 0x27, 0x72, 0x16, 0x39, 0x0a, 0x4b, 0x1a, 0xb4, 0x06, + 0xc3, 0x35, 0xb6, 0x20, 0xb7, 0xd6, 0xfc, 0x3a, 0x61, 0x83, 0x59, 0x9a, 0x7f, 0x9a, 0x92, 0x2f, + 0xc4, 0xe0, 0x7b, 0xfb, 0xe5, 0x69, 0xde, 0x36, 0xc1, 0x42, 0xc3, 0x61, 0xbd, 0x3c, 0xb2, 0xd5, + 0xfa, 0xea, 0x63, 0x9c, 0x20, 0x63, 0x6d, 0x9d, 0xd7, 0x96, 0x4a, 0x3f, 0x5b, 0x2a, 0x23, 0xd9, + 0xcb, 0x04, 0x5d, 0x84, 0xbe, 0x1d, 0xd7, 0xab, 0x4f, 0x0f, 0x30, 0x5e, 0xa7, 0xe9, 0x98, 0x5f, + 0x71, 0xbd, 0xfa, 0xbd, 0xfd, 0xf2, 0xa4, 0xd1, 0x1c, 0x0a, 0xc4, 0x8c, 0xd4, 0xfe, 0xcf, 0x16, + 0x94, 0x19, 0x6e, 0xd9, 0x6d, 0x90, 0x0a, 0x09, 0x42, 0x37, 0x8c, 0x88, 0x17, 0x19, 0x1d, 0xfa, + 0x1c, 0x40, 0x48, 0x6a, 0x01, 0x89, 0xb4, 0x2e, 0x55, 0x13, 0xa3, 0xaa, 0x30, 0x58, 0xa3, 0xa2, + 0x1b, 0x42, 0xb8, 0xed, 0x04, 0x6c, 0x7e, 0x89, 0x8e, 0x55, 0x1b, 0x42, 0x55, 0x22, 0x70, 0x4c, + 0x63, 0x6c, 0x08, 0xc5, 0x6e, 0x1b, 0x02, 0xfa, 0x30, 0x8c, 0xc7, 0x95, 0x85, 0x2d, 0xa7, 0x26, + 0x3b, 0x90, 0x2d, 0x99, 0xaa, 0x89, 0xc2, 0x49, 0x5a, 0xfb, 0x6f, 0x5b, 0x62, 0xf2, 0xd0, 0xaf, + 0x7e, 0x97, 0x7f, 0xab, 0xfd, 0xcb, 0x16, 0x0c, 0xce, 0xbb, 0x5e, 0xdd, 0xf5, 0xb6, 0xd0, 0xa7, + 0x60, 0x88, 0x9e, 0x4d, 0x75, 0x27, 0x72, 0xc4, 0xbe, 0xf7, 0x7e, 0x6d, 0x6d, 0xa9, 0xa3, 0x62, + 0xb6, 0xb5, 0xb3, 0x45, 0x01, 0xe1, 0x2c, 0xa5, 0xa6, 0xab, 0xed, 0xea, 0xcd, 0x4f, 0x93, 0x5a, + 0xb4, 0x46, 0x22, 0x27, 0xfe, 0x9c, 0x18, 0x86, 0x15, 0x57, 0x74, 0x05, 0x06, 0x22, 0x27, 0xd8, + 0x22, 0x91, 0xd8, 0x00, 0x33, 0x37, 0x2a, 0x5e, 0x12, 0xd3, 0x15, 0x49, 0xbc, 0x1a, 0x89, 0x8f, + 0x85, 0x0d, 0x56, 0x14, 0x0b, 0x16, 0xf6, 0xff, 0x18, 0x84, 0x93, 0x0b, 0xd5, 0x95, 0x9c, 0x79, + 0x75, 0x0e, 0x06, 0xea, 0x81, 0xbb, 0x4b, 0x02, 0xd1, 0xcf, 0x8a, 0xcb, 0x22, 0x83, 0x62, 0x81, + 0x45, 0x2f, 0xc1, 0x08, 0x3f, 0x90, 0x2e, 0x3b, 0x5e, 0xbd, 0x21, 0xbb, 0xf8, 0x98, 0xa0, 0x1e, + 0xb9, 0xae, 0xe1, 0xb0, 0x41, 0x79, 0xc0, 0x49, 0x75, 0x2e, 0xb1, 0x18, 0xf3, 0x0e, 0xbb, 0x2f, + 0x58, 0x30, 0xc1, 0xab, 0x99, 0x8b, 0xa2, 0xc0, 0xbd, 0xd9, 0x8e, 0x48, 0x38, 0xdd, 0xcf, 0x76, + 0xba, 0x85, 0xac, 0xde, 0xca, 0xed, 0x81, 0xd9, 0xeb, 0x09, 0x2e, 0x7c, 0x13, 0x9c, 0x16, 0xf5, + 0x4e, 0x24, 0xd1, 0x38, 0x55, 0x2d, 0xfa, 0x3e, 0x0b, 0x66, 0x6a, 0xbe, 0x17, 0x05, 0x7e, 0xa3, + 0x41, 0x82, 0x4a, 0xfb, 0x66, 0xc3, 0x0d, 0xb7, 0xf9, 0x3c, 0xc5, 0x64, 0x93, 0xed, 0x04, 0x39, + 0x63, 0xa8, 0x88, 0xc4, 0x18, 0x9e, 0xb9, 0xbb, 0x5f, 0x9e, 0x59, 0xc8, 0x65, 0x85, 0x3b, 0x54, + 0x83, 0x76, 0x00, 0xd1, 0xa3, 0xb4, 0x1a, 0x39, 0x5b, 0x24, 0xae, 0x7c, 0xb0, 0xf7, 0xca, 0x4f, + 0xdc, 0xdd, 0x2f, 0xa3, 0xf5, 0x14, 0x0b, 0x9c, 0xc1, 0x16, 0xbd, 0x0d, 0xc7, 0x28, 0x34, 0xf5, + 0xad, 0x43, 0xbd, 0x57, 0x37, 0x7d, 0x77, 0xbf, 0x7c, 0x6c, 0x3d, 0x83, 0x09, 0xce, 0x64, 0x8d, + 0xbe, 0xc7, 0x82, 0x93, 0xf1, 0xe7, 0x2f, 0xdd, 0x6e, 0x39, 0x5e, 0x3d, 0xae, 0xb8, 0xd4, 0x7b, + 0xc5, 0x74, 0x4f, 0x3e, 0xb9, 0x90, 0xc7, 0x09, 0xe7, 0x57, 0x82, 0x3c, 0x98, 0xa2, 0x4d, 0x4b, + 0xd6, 0x0d, 0xbd, 0xd7, 0xfd, 0xd0, 0xdd, 0xfd, 0xf2, 0xd4, 0x7a, 0x9a, 0x07, 0xce, 0x62, 0x3c, + 0xb3, 0x00, 0xc7, 0x33, 0x67, 0x27, 0x9a, 0x80, 0xe2, 0x0e, 0xe1, 0x52, 0x57, 0x09, 0xd3, 0x9f, + 0xe8, 0x18, 0xf4, 0xef, 0x3a, 0x8d, 0xb6, 0x58, 0x98, 0x98, 0xff, 0x79, 0xb9, 0xf0, 0x92, 0x65, + 0xff, 0xb3, 0x22, 0x8c, 0x2f, 0x54, 0x57, 0xee, 0x6b, 0xd5, 0xeb, 0xc7, 0x5e, 0xa1, 0xe3, 0xb1, + 0x17, 0x1f, 0xa2, 0xc5, 0xdc, 0x43, 0xf4, 0xbb, 0x33, 0x96, 0x6c, 0x1f, 0x5b, 0xb2, 0x1f, 0xca, + 0x59, 0xb2, 0x87, 0xbc, 0x50, 0x77, 0x73, 0x66, 0x6d, 0x3f, 0x1b, 0xc0, 0x4c, 0x09, 0x69, 0xd5, + 0xaf, 0x39, 0x8d, 0xe4, 0x56, 0x7b, 0xc0, 0xa9, 0x7b, 0x38, 0xe3, 0x58, 0x83, 0x91, 0x05, 0xa7, + 0xe5, 0xdc, 0x74, 0x1b, 0x6e, 0xe4, 0x92, 0x10, 0x3d, 0x01, 0x45, 0xa7, 0x5e, 0x67, 0xd2, 0x5d, + 0x69, 0xfe, 0xf8, 0xdd, 0xfd, 0x72, 0x71, 0xae, 0x4e, 0xc5, 0x0c, 0x50, 0x54, 0x7b, 0x98, 0x52, + 0xa0, 0xa7, 0xa0, 0xaf, 0x1e, 0xf8, 0xad, 0xe9, 0x02, 0xa3, 0xa4, 0xab, 0xbc, 0x6f, 0x31, 0xf0, + 0x5b, 0x09, 0x52, 0x46, 0x63, 0xff, 0x66, 0x01, 0x4e, 0x2d, 0x90, 0xd6, 0xf6, 0x72, 0x35, 0xe7, + 0xbc, 0x38, 0x0f, 0x43, 0x4d, 0xdf, 0x73, 0x23, 0x3f, 0x08, 0x45, 0xd5, 0x6c, 0x46, 0xac, 0x09, + 0x18, 0x56, 0x58, 0x74, 0x16, 0xfa, 0x5a, 0xb1, 0x10, 0x3b, 0x22, 0x05, 0x60, 0x26, 0xbe, 0x32, + 0x0c, 0xa5, 0x68, 0x87, 0x24, 0x10, 0x33, 0x46, 0x51, 0x5c, 0x0b, 0x49, 0x80, 0x19, 0x26, 0x96, + 0x04, 0xa8, 0x8c, 0x20, 0x4e, 0x84, 0x84, 0x24, 0x40, 0x31, 0x58, 0xa3, 0x42, 0x15, 0x28, 0x85, + 0x89, 0x91, 0xed, 0x69, 0x69, 0x8e, 0x32, 0x51, 0x41, 0x8d, 0x64, 0xcc, 0xc4, 0x38, 0xc1, 0x06, + 0xba, 0x8a, 0x0a, 0x5f, 0x2f, 0x00, 0xe2, 0x5d, 0xf8, 0x6d, 0xd6, 0x71, 0xd7, 0xd2, 0x1d, 0xd7, + 0xfb, 0x92, 0x38, 0xac, 0xde, 0xfb, 0x2f, 0x16, 0x9c, 0x5a, 0x70, 0xbd, 0x3a, 0x09, 0x72, 0x26, + 0xe0, 0x83, 0xb9, 0x3b, 0x1f, 0x4c, 0x48, 0x31, 0xa6, 0x58, 0xdf, 0x21, 0x4c, 0x31, 0xfb, 0x2f, + 0x2c, 0x40, 0xfc, 0xb3, 0xdf, 0x75, 0x1f, 0x7b, 0x2d, 0xfd, 0xb1, 0x87, 0x30, 0x2d, 0xec, 0xbf, + 0x6b, 0xc1, 0xf0, 0x42, 0xc3, 0x71, 0x9b, 0xe2, 0x53, 0x17, 0x60, 0x52, 0x2a, 0x8a, 0x18, 0x58, + 0x93, 0xfd, 0xe9, 0xe6, 0x36, 0x89, 0x93, 0x48, 0x9c, 0xa6, 0x47, 0x1f, 0x87, 0x93, 0x06, 0x70, + 0x83, 0x34, 0x5b, 0x0d, 0x27, 0xd2, 0x6f, 0x05, 0xec, 0xf4, 0xc7, 0x79, 0x44, 0x38, 0xbf, 0xbc, + 0xbd, 0x0a, 0x63, 0x0b, 0x0d, 0x97, 0x78, 0xd1, 0x4a, 0x65, 0xc1, 0xf7, 0x36, 0xdd, 0x2d, 0xf4, + 0x32, 0x8c, 0x45, 0x6e, 0x93, 0xf8, 0xed, 0xa8, 0x4a, 0x6a, 0xbe, 0xc7, 0xee, 0xda, 0xd6, 0xf9, + 0xfe, 0x79, 0x74, 0x77, 0xbf, 0x3c, 0xb6, 0x61, 0x60, 0x70, 0x82, 0xd2, 0xfe, 0x23, 0x3a, 0xe2, + 0x7e, 0xb3, 0xe5, 0x7b, 0xc4, 0x8b, 0x16, 0x7c, 0xaf, 0xce, 0x75, 0x32, 0x2f, 0x43, 0x5f, 0x44, + 0x47, 0x90, 0x7f, 0xf9, 0x39, 0xb9, 0xb4, 0xe9, 0xb8, 0xdd, 0xdb, 0x2f, 0x9f, 0x48, 0x97, 0x60, + 0x23, 0xcb, 0xca, 0xa0, 0x0f, 0xc1, 0x40, 0x18, 0x39, 0x51, 0x3b, 0x14, 0x9f, 0xfa, 0x88, 0x1c, + 0xff, 0x2a, 0x83, 0xde, 0xdb, 0x2f, 0x8f, 0xab, 0x62, 0x1c, 0x84, 0x45, 0x01, 0xf4, 0x24, 0x0c, + 0x36, 0x49, 0x18, 0x3a, 0x5b, 0xf2, 0xfc, 0x1e, 0x17, 0x65, 0x07, 0xd7, 0x38, 0x18, 0x4b, 0x3c, + 0x7a, 0x14, 0xfa, 0x49, 0x10, 0xf8, 0x81, 0xd8, 0x55, 0x46, 0x05, 0x61, 0xff, 0x12, 0x05, 0x62, + 0x8e, 0xb3, 0xff, 0xa5, 0x05, 0xe3, 0xaa, 0xad, 0xbc, 0xae, 0x23, 0xb8, 0x37, 0xbd, 0x09, 0x50, + 0x93, 0x1f, 0x18, 0xb2, 0xf3, 0x6e, 0xf8, 0xb9, 0x73, 0x99, 0xa2, 0x45, 0xaa, 0x1b, 0x63, 0xce, + 0x0a, 0x14, 0x62, 0x8d, 0x9b, 0xfd, 0x6b, 0x16, 0x4c, 0x25, 0xbe, 0x68, 0xd5, 0x0d, 0x23, 0xf4, + 0x56, 0xea, 0xab, 0x66, 0x7b, 0xfb, 0x2a, 0x5a, 0x9a, 0x7d, 0x93, 0x5a, 0x7c, 0x12, 0xa2, 0x7d, + 0xd1, 0x65, 0xe8, 0x77, 0x23, 0xd2, 0x94, 0x1f, 0xf3, 0x68, 0xc7, 0x8f, 0xe1, 0xad, 0x8a, 0x47, + 0x64, 0x85, 0x96, 0xc4, 0x9c, 0x81, 0xfd, 0x9b, 0x45, 0x28, 0xf1, 0x69, 0xbb, 0xe6, 0xb4, 0x8e, + 0x60, 0x2c, 0x9e, 0x86, 0x92, 0xdb, 0x6c, 0xb6, 0x23, 0xe7, 0xa6, 0x38, 0x80, 0x86, 0xf8, 0x66, + 0xb0, 0x22, 0x81, 0x38, 0xc6, 0xa3, 0x15, 0xe8, 0x63, 0x4d, 0xe1, 0x5f, 0xf9, 0x44, 0xf6, 0x57, + 0x8a, 0xb6, 0xcf, 0x2e, 0x3a, 0x91, 0xc3, 0x65, 0x3f, 0x75, 0xf2, 0x51, 0x10, 0x66, 0x2c, 0x90, + 0x03, 0x70, 0xd3, 0xf5, 0x9c, 0x60, 0x8f, 0xc2, 0xa6, 0x8b, 0x8c, 0xe1, 0xb3, 0x9d, 0x19, 0xce, + 0x2b, 0x7a, 0xce, 0x56, 0x7d, 0x58, 0x8c, 0xc0, 0x1a, 0xd3, 0x99, 0x0f, 0x42, 0x49, 0x11, 0x1f, + 0x44, 0x84, 0x9b, 0xf9, 0x30, 0x8c, 0x27, 0xea, 0xea, 0x56, 0x7c, 0x44, 0x97, 0x00, 0x7f, 0x85, + 0x6d, 0x19, 0xa2, 0xd5, 0x4b, 0xde, 0xae, 0xd8, 0x39, 0xef, 0xc0, 0xb1, 0x46, 0xc6, 0xde, 0x2b, + 0xc6, 0xb5, 0xf7, 0xbd, 0xfa, 0x94, 0xf8, 0xec, 0x63, 0x59, 0x58, 0x9c, 0x59, 0x07, 0x95, 0x6a, + 0xfc, 0x16, 0x5d, 0x20, 0x4e, 0x43, 0xbf, 0x20, 0x5c, 0x15, 0x30, 0xac, 0xb0, 0x74, 0xbf, 0x3b, + 0xa6, 0x1a, 0x7f, 0x85, 0xec, 0x55, 0x49, 0x83, 0xd4, 0x22, 0x3f, 0xf8, 0x96, 0x36, 0xff, 0x34, + 0xef, 0x7d, 0xbe, 0x5d, 0x0e, 0x0b, 0x06, 0xc5, 0x2b, 0x64, 0x8f, 0x0f, 0x85, 0xfe, 0x75, 0xc5, + 0x8e, 0x5f, 0xf7, 0x55, 0x0b, 0x46, 0xd5, 0xd7, 0x1d, 0xc1, 0xbe, 0x30, 0x6f, 0xee, 0x0b, 0xa7, + 0x3b, 0x4e, 0xf0, 0x9c, 0x1d, 0xe1, 0xeb, 0x05, 0x38, 0xa9, 0x68, 0xe8, 0x6d, 0x86, 0xff, 0x11, + 0xb3, 0xea, 0x02, 0x94, 0x3c, 0xa5, 0xd7, 0xb3, 0x4c, 0x85, 0x5a, 0xac, 0xd5, 0x8b, 0x69, 0xa8, + 0x50, 0xea, 0xc5, 0xc7, 0xec, 0x88, 0xae, 0xf0, 0x16, 0xca, 0xed, 0x79, 0x28, 0xb6, 0xdd, 0xba, + 0x38, 0x60, 0xde, 0x2f, 0x7b, 0xfb, 0xda, 0xca, 0xe2, 0xbd, 0xfd, 0xf2, 0x23, 0x79, 0xc6, 0x16, + 0x7a, 0xb2, 0x85, 0xb3, 0xd7, 0x56, 0x16, 0x31, 0x2d, 0x8c, 0xe6, 0x60, 0x5c, 0x9e, 0xd0, 0xd7, + 0xa9, 0x80, 0xe8, 0x7b, 0xe2, 0x1c, 0x52, 0x5a, 0x6b, 0x6c, 0xa2, 0x71, 0x92, 0x1e, 0x2d, 0xc2, + 0xc4, 0x4e, 0xfb, 0x26, 0x69, 0x90, 0x88, 0x7f, 0xf0, 0x15, 0xc2, 0x75, 0xba, 0xa5, 0xf8, 0x2e, + 0x79, 0x25, 0x81, 0xc7, 0xa9, 0x12, 0xf6, 0x5f, 0xb3, 0xf3, 0x40, 0xf4, 0x5e, 0x25, 0xf0, 0xe9, + 0xc4, 0xa2, 0xdc, 0xbf, 0x95, 0xd3, 0xb9, 0x97, 0x59, 0x71, 0x85, 0xec, 0x6d, 0xf8, 0xf4, 0x2e, + 0x91, 0x3d, 0x2b, 0x8c, 0x39, 0xdf, 0xd7, 0x71, 0xce, 0xff, 0x42, 0x01, 0x8e, 0xab, 0x1e, 0x30, + 0xc4, 0xd6, 0x6f, 0xf7, 0x3e, 0xb8, 0x08, 0xc3, 0x75, 0xb2, 0xe9, 0xb4, 0x1b, 0x91, 0x32, 0x30, + 0xf4, 0x73, 0x23, 0xd3, 0x62, 0x0c, 0xc6, 0x3a, 0xcd, 0x01, 0xba, 0xed, 0xe7, 0x46, 0xd9, 0x41, + 0x1c, 0x39, 0x74, 0x8e, 0xab, 0x55, 0x63, 0xe5, 0xae, 0x9a, 0x47, 0xa1, 0xdf, 0x6d, 0x52, 0xc1, + 0xac, 0x60, 0xca, 0x5b, 0x2b, 0x14, 0x88, 0x39, 0x0e, 0x3d, 0x0e, 0x83, 0x35, 0xbf, 0xd9, 0x74, + 0xbc, 0x3a, 0x3b, 0xf2, 0x4a, 0xf3, 0xc3, 0x54, 0x76, 0x5b, 0xe0, 0x20, 0x2c, 0x71, 0xe8, 0x14, + 0xf4, 0x39, 0xc1, 0x16, 0xd7, 0xba, 0x94, 0xe6, 0x87, 0x68, 0x4d, 0x73, 0xc1, 0x56, 0x88, 0x19, + 0x94, 0x5e, 0x1a, 0x6f, 0xf9, 0xc1, 0x8e, 0xeb, 0x6d, 0x2d, 0xba, 0x81, 0x58, 0x12, 0xea, 0x2c, + 0xbc, 0xa1, 0x30, 0x58, 0xa3, 0x42, 0xcb, 0xd0, 0xdf, 0xf2, 0x83, 0x28, 0x9c, 0x1e, 0x60, 0xdd, + 0xfd, 0x48, 0xce, 0x46, 0xc4, 0xbf, 0xb6, 0xe2, 0x07, 0x51, 0xfc, 0x01, 0xf4, 0x5f, 0x88, 0x79, + 0x71, 0xb4, 0x0a, 0x83, 0xc4, 0xdb, 0x5d, 0x0e, 0xfc, 0xe6, 0xf4, 0x54, 0x3e, 0xa7, 0x25, 0x4e, + 0xc2, 0xa7, 0x59, 0x2c, 0xa3, 0x0a, 0x30, 0x96, 0x2c, 0xd0, 0x87, 0xa0, 0x48, 0xbc, 0xdd, 0xe9, + 0x41, 0xc6, 0x69, 0x26, 0x87, 0xd3, 0x75, 0x27, 0x88, 0xf7, 0xfc, 0x25, 0x6f, 0x17, 0xd3, 0x32, + 0xe8, 0x63, 0x50, 0x92, 0x1b, 0x46, 0x28, 0xd4, 0x99, 0x99, 0x13, 0x56, 0x6e, 0x33, 0x98, 0xbc, + 0xdd, 0x76, 0x03, 0xd2, 0x24, 0x5e, 0x14, 0xc6, 0x3b, 0xa4, 0xc4, 0x86, 0x38, 0xe6, 0x86, 0x6a, + 0x30, 0x12, 0x90, 0xd0, 0xbd, 0x43, 0x2a, 0x7e, 0xc3, 0xad, 0xed, 0x4d, 0x3f, 0xc4, 0x9a, 0xf7, + 0x64, 0xc7, 0x2e, 0xc3, 0x5a, 0x81, 0x58, 0xdd, 0xae, 0x43, 0xb1, 0xc1, 0x14, 0xbd, 0x01, 0xa3, + 0x01, 0x09, 0x23, 0x27, 0x88, 0x44, 0x2d, 0xd3, 0xca, 0x3c, 0x36, 0x8a, 0x75, 0x04, 0xbf, 0x4e, + 0xc4, 0xd5, 0xc4, 0x18, 0x6c, 0x72, 0x40, 0x1f, 0x93, 0xba, 0xff, 0x35, 0xbf, 0xed, 0x45, 0xe1, + 0x74, 0x89, 0xb5, 0x3b, 0xd3, 0x2a, 0x7b, 0x3d, 0xa6, 0x4b, 0x1a, 0x07, 0x78, 0x61, 0x6c, 0xb0, + 0x42, 0x9f, 0x80, 0x51, 0xfe, 0x9f, 0xdb, 0x36, 0xc3, 0xe9, 0xe3, 0x8c, 0xf7, 0xd9, 0x7c, 0xde, + 0x9c, 0x70, 0xfe, 0xb8, 0x60, 0x3e, 0xaa, 0x43, 0x43, 0x6c, 0x72, 0x43, 0x18, 0x46, 0x1b, 0xee, + 0x2e, 0xf1, 0x48, 0x18, 0x56, 0x02, 0xff, 0x26, 0x11, 0xaa, 0xda, 0x93, 0xd9, 0xb6, 0x50, 0xff, + 0x26, 0x99, 0x9f, 0xa4, 0x3c, 0x57, 0xf5, 0x32, 0xd8, 0x64, 0x81, 0xae, 0xc1, 0x18, 0xbd, 0x1b, + 0xbb, 0x31, 0xd3, 0xe1, 0x6e, 0x4c, 0xd9, 0x7d, 0x10, 0x1b, 0x85, 0x70, 0x82, 0x09, 0xba, 0x0a, + 0x23, 0xac, 0xcf, 0xdb, 0x2d, 0xce, 0xf4, 0x44, 0x37, 0xa6, 0xcc, 0x94, 0x5e, 0xd5, 0x8a, 0x60, + 0x83, 0x01, 0x7a, 0x1d, 0x4a, 0x0d, 0x77, 0x93, 0xd4, 0xf6, 0x6a, 0x0d, 0x32, 0x3d, 0xc2, 0xb8, + 0x65, 0x6e, 0x86, 0xab, 0x92, 0x88, 0xcb, 0xe7, 0xea, 0x2f, 0x8e, 0x8b, 0xa3, 0xeb, 0x70, 0x22, + 0x22, 0x41, 0xd3, 0xf5, 0x1c, 0xba, 0x89, 0x89, 0x2b, 0x21, 0x33, 0x51, 0x8f, 0xb2, 0xd9, 0x75, + 0x46, 0x8c, 0xc6, 0x89, 0x8d, 0x4c, 0x2a, 0x9c, 0x53, 0x1a, 0xdd, 0x86, 0xe9, 0x0c, 0x0c, 0x9f, + 0xb7, 0xc7, 0x18, 0xe7, 0x57, 0x05, 0xe7, 0xe9, 0x8d, 0x1c, 0xba, 0x7b, 0x1d, 0x70, 0x38, 0x97, + 0x3b, 0xba, 0x0a, 0xe3, 0x6c, 0xe7, 0xac, 0xb4, 0x1b, 0x0d, 0x51, 0xe1, 0x18, 0xab, 0xf0, 0x71, + 0x29, 0x47, 0xac, 0x98, 0xe8, 0x7b, 0xfb, 0x65, 0x88, 0xff, 0xe1, 0x64, 0x69, 0x74, 0x93, 0x59, + 0x43, 0xdb, 0x81, 0x1b, 0xed, 0xd1, 0x55, 0x45, 0x6e, 0x47, 0xd3, 0xe3, 0x1d, 0x35, 0x43, 0x3a, + 0xa9, 0x32, 0x99, 0xea, 0x40, 0x9c, 0x64, 0x48, 0x8f, 0x82, 0x30, 0xaa, 0xbb, 0xde, 0xf4, 0x04, + 0xbf, 0x4f, 0xc9, 0x9d, 0xb4, 0x4a, 0x81, 0x98, 0xe3, 0x98, 0x25, 0x94, 0xfe, 0xb8, 0x4a, 0x4f, + 0xdc, 0x49, 0x46, 0x18, 0x5b, 0x42, 0x25, 0x02, 0xc7, 0x34, 0x54, 0x08, 0x8e, 0xa2, 0xbd, 0x69, + 0xc4, 0x48, 0xd5, 0x86, 0xb8, 0xb1, 0xf1, 0x31, 0x4c, 0xe1, 0xf6, 0x4d, 0x18, 0x53, 0xdb, 0x04, + 0xeb, 0x13, 0x54, 0x86, 0x7e, 0x26, 0xf6, 0x09, 0x3d, 0x66, 0x89, 0x36, 0x81, 0x89, 0x84, 0x98, + 0xc3, 0x59, 0x13, 0xdc, 0x3b, 0x64, 0x7e, 0x2f, 0x22, 0x5c, 0x17, 0x51, 0xd4, 0x9a, 0x20, 0x11, + 0x38, 0xa6, 0xb1, 0xff, 0x27, 0x17, 0x9f, 0xe3, 0x53, 0xa2, 0x87, 0x73, 0xf1, 0x19, 0x18, 0xda, + 0xf6, 0xc3, 0x88, 0x52, 0xb3, 0x3a, 0xfa, 0x63, 0x81, 0xf9, 0xb2, 0x80, 0x63, 0x45, 0x81, 0x5e, + 0x81, 0xd1, 0x9a, 0x5e, 0x81, 0x38, 0xd4, 0xd5, 0x36, 0x62, 0xd4, 0x8e, 0x4d, 0x5a, 0xf4, 0x12, + 0x0c, 0x31, 0xef, 0x9e, 0x9a, 0xdf, 0x10, 0xd2, 0xa6, 0x94, 0x4c, 0x86, 0x2a, 0x02, 0x7e, 0x4f, + 0xfb, 0x8d, 0x15, 0x35, 0x3a, 0x07, 0x03, 0xb4, 0x09, 0x2b, 0x15, 0x71, 0x9c, 0x2a, 0x95, 0xdc, + 0x65, 0x06, 0xc5, 0x02, 0x6b, 0xff, 0x9a, 0xc5, 0x64, 0xa9, 0xf4, 0x9e, 0x8f, 0x2e, 0xb3, 0x43, + 0x83, 0x9d, 0x20, 0x9a, 0x4a, 0xec, 0x31, 0xed, 0x24, 0x50, 0xb8, 0x7b, 0x89, 0xff, 0xd8, 0x28, + 0x89, 0xde, 0x4c, 0x9e, 0x0c, 0x5c, 0xa0, 0x78, 0x41, 0x76, 0x41, 0xf2, 0x74, 0x78, 0x38, 0x3e, + 0xe2, 0x68, 0x7b, 0x3a, 0x1d, 0x11, 0xf6, 0xff, 0x5d, 0xd0, 0x66, 0x49, 0x35, 0x72, 0x22, 0x82, + 0x2a, 0x30, 0x78, 0xcb, 0x71, 0x23, 0xd7, 0xdb, 0x12, 0x72, 0x5f, 0xe7, 0x83, 0x8e, 0x15, 0xba, + 0xc1, 0x0b, 0x70, 0xe9, 0x45, 0xfc, 0xc1, 0x92, 0x0d, 0xe5, 0x18, 0xb4, 0x3d, 0x8f, 0x72, 0x2c, + 0xf4, 0xca, 0x11, 0xf3, 0x02, 0x9c, 0xa3, 0xf8, 0x83, 0x25, 0x1b, 0xf4, 0x16, 0x80, 0xdc, 0x21, + 0x48, 0x5d, 0x78, 0x05, 0x3d, 0xd3, 0x9d, 0xe9, 0x86, 0x2a, 0x33, 0x3f, 0x46, 0x65, 0xa3, 0xf8, + 0x3f, 0xd6, 0xf8, 0xd9, 0x91, 0x36, 0xa6, 0x7a, 0x63, 0xd0, 0xc7, 0xe9, 0x12, 0x75, 0x82, 0x88, + 0xd4, 0xe7, 0x22, 0xd1, 0x39, 0x4f, 0xf5, 0x76, 0x39, 0xdc, 0x70, 0x9b, 0x44, 0x5f, 0xce, 0x82, + 0x09, 0x8e, 0xf9, 0xd9, 0xbf, 0x54, 0x84, 0xe9, 0xbc, 0xe6, 0xd2, 0x45, 0x43, 0x6e, 0xbb, 0xd1, + 0x02, 0x15, 0x6b, 0x2d, 0x73, 0xd1, 0x2c, 0x09, 0x38, 0x56, 0x14, 0x74, 0xf6, 0x86, 0xee, 0x96, + 0xbc, 0xdb, 0xf7, 0xc7, 0xb3, 0xb7, 0xca, 0xa0, 0x58, 0x60, 0x29, 0x5d, 0x40, 0x9c, 0x50, 0xb8, + 0x9d, 0x69, 0xb3, 0x1c, 0x33, 0x28, 0x16, 0x58, 0x5d, 0xcb, 0xd8, 0xd7, 0x45, 0xcb, 0x68, 0x74, + 0x51, 0xff, 0xe1, 0x76, 0x11, 0xfa, 0x24, 0xc0, 0xa6, 0xeb, 0xb9, 0xe1, 0x36, 0xe3, 0x3e, 0x70, + 0x60, 0xee, 0x4a, 0x28, 0x5e, 0x56, 0x5c, 0xb0, 0xc6, 0x11, 0xbd, 0x08, 0xc3, 0x6a, 0x03, 0x59, + 0x59, 0x64, 0x36, 0x78, 0xcd, 0xa7, 0x29, 0xde, 0x4d, 0x17, 0xb1, 0x4e, 0x67, 0x7f, 0x3a, 0x39, + 0x5f, 0xc4, 0x0a, 0xd0, 0xfa, 0xd7, 0xea, 0xb5, 0x7f, 0x0b, 0x9d, 0xfb, 0xd7, 0xfe, 0xe6, 0x00, + 0x8c, 0x1b, 0x95, 0xb5, 0xc3, 0x1e, 0xf6, 0xdc, 0x4b, 0xf4, 0x00, 0x72, 0x22, 0x22, 0xd6, 0x9f, + 0xdd, 0x7d, 0xa9, 0xe8, 0x87, 0x14, 0x5d, 0x01, 0xbc, 0x3c, 0xfa, 0x24, 0x94, 0x1a, 0x4e, 0xc8, + 0x34, 0x96, 0x44, 0xac, 0xbb, 0x5e, 0x98, 0xc5, 0x17, 0x42, 0x27, 0x8c, 0xb4, 0x53, 0x9f, 0xf3, + 0x8e, 0x59, 0xd2, 0x93, 0x92, 0xca, 0x57, 0xd2, 0xaf, 0x51, 0x35, 0x82, 0x0a, 0x61, 0x7b, 0x98, + 0xe3, 0xd0, 0x4b, 0x6c, 0x6b, 0xa5, 0xb3, 0x62, 0x81, 0x4a, 0xa3, 0x6c, 0x9a, 0xf5, 0x1b, 0x42, + 0xb6, 0xc2, 0x61, 0x83, 0x32, 0xbe, 0x93, 0x0d, 0x74, 0xb8, 0x93, 0x3d, 0x09, 0x83, 0xec, 0x87, + 0x9a, 0x01, 0x6a, 0x34, 0x56, 0x38, 0x18, 0x4b, 0x7c, 0x72, 0xc2, 0x0c, 0xf5, 0x36, 0x61, 0xe8, + 0xad, 0x4f, 0x4c, 0x6a, 0xe6, 0xff, 0x30, 0xc4, 0x77, 0x39, 0x31, 0xe5, 0xb1, 0xc4, 0xa1, 0x9f, + 0xb6, 0x00, 0x39, 0x0d, 0x7a, 0x5b, 0xa6, 0x60, 0x75, 0xb9, 0x01, 0x26, 0x6a, 0xbf, 0xd2, 0xb5, + 0xdb, 0xdb, 0xe1, 0xec, 0x5c, 0xaa, 0x34, 0xd7, 0x94, 0xbe, 0x2c, 0x9a, 0x88, 0xd2, 0x04, 0xfa, + 0x61, 0xb4, 0xea, 0x86, 0xd1, 0xe7, 0xfe, 0x38, 0x71, 0x38, 0x65, 0x34, 0x09, 0x5d, 0xd3, 0x2f, + 0x5f, 0xc3, 0x07, 0xbc, 0x7c, 0x8d, 0xe6, 0x5d, 0xbc, 0x66, 0xda, 0xf0, 0x50, 0xce, 0x17, 0x64, + 0xe8, 0x5f, 0x17, 0x75, 0xfd, 0x6b, 0x17, 0xad, 0xdd, 0xac, 0xac, 0x63, 0xf6, 0x8d, 0xb6, 0xe3, + 0x45, 0x6e, 0xb4, 0xa7, 0xeb, 0x6b, 0x9f, 0x82, 0xb1, 0x45, 0x87, 0x34, 0x7d, 0x6f, 0xc9, 0xab, + 0xb7, 0x7c, 0xd7, 0x8b, 0xd0, 0x34, 0xf4, 0x31, 0xe1, 0x83, 0x6f, 0xbd, 0x7d, 0xb4, 0xf7, 0x30, + 0x83, 0xd8, 0x5b, 0x70, 0x7c, 0xd1, 0xbf, 0xe5, 0xdd, 0x72, 0x82, 0xfa, 0x5c, 0x65, 0x45, 0xd3, + 0x27, 0xad, 0x4b, 0x7d, 0x86, 0x95, 0x7f, 0x5b, 0xd4, 0x4a, 0xf2, 0xeb, 0xd0, 0xb2, 0xdb, 0x20, + 0x39, 0x5a, 0xbf, 0xff, 0xaf, 0x60, 0xd4, 0x14, 0xd3, 0x2b, 0xbb, 0xb3, 0x95, 0x6b, 0x77, 0x7e, + 0x03, 0x86, 0x36, 0x5d, 0xd2, 0xa8, 0x63, 0xb2, 0x29, 0x7a, 0xe7, 0x89, 0x7c, 0xcf, 0xb4, 0x65, + 0x4a, 0x29, 0xb5, 0xbc, 0x5c, 0x1b, 0xb2, 0x2c, 0x0a, 0x63, 0xc5, 0x06, 0xed, 0xc0, 0x84, 0xec, + 0x43, 0x89, 0x15, 0xfb, 0xc1, 0x93, 0x9d, 0x06, 0xde, 0x64, 0x7e, 0xec, 0xee, 0x7e, 0x79, 0x02, + 0x27, 0xd8, 0xe0, 0x14, 0x63, 0x74, 0x0a, 0xfa, 0x9a, 0xf4, 0xe4, 0xeb, 0x63, 0xdd, 0xcf, 0xd4, + 0x1f, 0x4c, 0x93, 0xc3, 0xa0, 0xf6, 0x8f, 0x59, 0xf0, 0x50, 0xaa, 0x67, 0x84, 0x46, 0xeb, 0x90, + 0x47, 0x21, 0xa9, 0x61, 0x2a, 0x74, 0xd7, 0x30, 0xd9, 0x7f, 0xc7, 0x82, 0x63, 0x4b, 0xcd, 0x56, + 0xb4, 0xb7, 0xe8, 0x9a, 0x46, 0xe2, 0x0f, 0xc2, 0x40, 0x93, 0xd4, 0xdd, 0x76, 0x53, 0x8c, 0x5c, + 0x59, 0x9e, 0x0e, 0x6b, 0x0c, 0x7a, 0x6f, 0xbf, 0x3c, 0x5a, 0x8d, 0xfc, 0xc0, 0xd9, 0x22, 0x1c, + 0x80, 0x05, 0x39, 0x3b, 0x63, 0xdd, 0x3b, 0x64, 0xd5, 0x6d, 0xba, 0xd1, 0xfd, 0xcd, 0x76, 0x61, + 0xdf, 0x95, 0x4c, 0x70, 0xcc, 0xcf, 0xfe, 0x86, 0x05, 0xe3, 0x72, 0xde, 0xcf, 0xd5, 0xeb, 0x01, + 0x09, 0x43, 0x34, 0x03, 0x05, 0xb7, 0x25, 0x5a, 0x09, 0xa2, 0x95, 0x85, 0x95, 0x0a, 0x2e, 0xb8, + 0x2d, 0x29, 0xce, 0xb3, 0x03, 0xa8, 0x68, 0x9a, 0xba, 0x2f, 0x0b, 0x38, 0x56, 0x14, 0xe8, 0x3c, + 0x0c, 0x79, 0x7e, 0x9d, 0x4b, 0xc4, 0x5c, 0x94, 0x60, 0x13, 0x6c, 0x5d, 0xc0, 0xb0, 0xc2, 0xa2, + 0x0a, 0x94, 0xb8, 0x23, 0x64, 0x3c, 0x69, 0x7b, 0x72, 0xa7, 0x64, 0x5f, 0xb6, 0x21, 0x4b, 0xe2, + 0x98, 0x89, 0xfd, 0x1b, 0x16, 0x8c, 0xc8, 0x2f, 0xeb, 0xf1, 0xae, 0x42, 0x97, 0x56, 0x7c, 0x4f, + 0x89, 0x97, 0x16, 0xbd, 0x6b, 0x30, 0x8c, 0x71, 0xc5, 0x28, 0x1e, 0xe8, 0x8a, 0x71, 0x11, 0x86, + 0x9d, 0x56, 0xab, 0x62, 0xde, 0x4f, 0xd8, 0x54, 0x9a, 0x8b, 0xc1, 0x58, 0xa7, 0xb1, 0x7f, 0xb4, + 0x00, 0x63, 0xf2, 0x0b, 0xaa, 0xed, 0x9b, 0x21, 0x89, 0xd0, 0x06, 0x94, 0x1c, 0x3e, 0x4a, 0x44, + 0x4e, 0xf2, 0x47, 0xb3, 0xf5, 0x66, 0xc6, 0x90, 0xc6, 0x82, 0xd6, 0x9c, 0x2c, 0x8d, 0x63, 0x46, + 0xa8, 0x01, 0x93, 0x9e, 0x1f, 0xb1, 0x43, 0x57, 0xe1, 0x3b, 0x99, 0x32, 0x93, 0xdc, 0x4f, 0x0a, + 0xee, 0x93, 0xeb, 0x49, 0x2e, 0x38, 0xcd, 0x18, 0x2d, 0x49, 0x5d, 0x64, 0x31, 0x5f, 0x89, 0xa4, + 0x0f, 0x5c, 0xb6, 0x2a, 0xd2, 0xfe, 0x55, 0x0b, 0x4a, 0x92, 0xec, 0x28, 0xac, 0xd6, 0x6b, 0x30, + 0x18, 0xb2, 0x41, 0x90, 0x5d, 0x63, 0x77, 0x6a, 0x38, 0x1f, 0xaf, 0x58, 0x96, 0xe0, 0xff, 0x43, + 0x2c, 0x79, 0x30, 0x53, 0x94, 0x6a, 0xfe, 0xbb, 0xc4, 0x14, 0xa5, 0xda, 0x93, 0x73, 0x28, 0xfd, + 0x29, 0x6b, 0xb3, 0xa6, 0xdb, 0xa5, 0x22, 0x6f, 0x2b, 0x20, 0x9b, 0xee, 0xed, 0xa4, 0xc8, 0x5b, + 0x61, 0x50, 0x2c, 0xb0, 0xe8, 0x2d, 0x18, 0xa9, 0x49, 0x1b, 0x44, 0xbc, 0xc2, 0xcf, 0x75, 0xb4, + 0x87, 0x29, 0xd3, 0x29, 0xd7, 0xa1, 0x2d, 0x68, 0xe5, 0xb1, 0xc1, 0xcd, 0x74, 0xf4, 0x29, 0x76, + 0x73, 0xf4, 0x89, 0xf9, 0xe6, 0xbb, 0xbd, 0xfc, 0xb8, 0x05, 0x03, 0x5c, 0xf7, 0xdc, 0x9b, 0xea, + 0x5f, 0xb3, 0x24, 0xc7, 0x7d, 0x77, 0x9d, 0x02, 0x85, 0xa4, 0x81, 0xd6, 0xa0, 0xc4, 0x7e, 0x30, + 0xdd, 0x79, 0x31, 0xff, 0x1d, 0x0e, 0xaf, 0x55, 0x6f, 0xe0, 0x75, 0x59, 0x0c, 0xc7, 0x1c, 0xec, + 0x1f, 0x29, 0xd2, 0xdd, 0x2d, 0x26, 0x35, 0x0e, 0x7d, 0xeb, 0xc1, 0x1d, 0xfa, 0x85, 0x07, 0x75, + 0xe8, 0x6f, 0xc1, 0x78, 0x4d, 0xb3, 0x3b, 0xc7, 0x23, 0x79, 0xbe, 0xe3, 0x24, 0xd1, 0x4c, 0xd4, + 0x5c, 0x3b, 0xb7, 0x60, 0x32, 0xc1, 0x49, 0xae, 0xe8, 0xe3, 0x30, 0xc2, 0xc7, 0x59, 0xd4, 0xc2, + 0x7d, 0xa5, 0x1e, 0xcf, 0x9f, 0x2f, 0x7a, 0x15, 0x5c, 0x9b, 0xab, 0x15, 0xc7, 0x06, 0x33, 0xfb, + 0x2f, 0x2d, 0x40, 0x4b, 0xad, 0x6d, 0xd2, 0x24, 0x81, 0xd3, 0x88, 0xcd, 0x47, 0x5f, 0xb4, 0x60, + 0x9a, 0xa4, 0xc0, 0x0b, 0x7e, 0xb3, 0x29, 0x2e, 0x8b, 0x39, 0xfa, 0x8c, 0xa5, 0x9c, 0x32, 0xea, + 0xa1, 0xd2, 0x74, 0x1e, 0x05, 0xce, 0xad, 0x0f, 0xad, 0xc1, 0x14, 0x3f, 0x25, 0x15, 0x42, 0xf3, + 0xbb, 0x7a, 0x58, 0x30, 0x9e, 0xda, 0x48, 0x93, 0xe0, 0xac, 0x72, 0xf6, 0xaf, 0x8e, 0x42, 0x6e, + 0x2b, 0xde, 0xb3, 0x9b, 0xbd, 0x67, 0x37, 0x7b, 0xcf, 0x6e, 0xf6, 0x9e, 0xdd, 0xec, 0x3d, 0xbb, + 0xd9, 0x7b, 0x76, 0xb3, 0x77, 0xa9, 0xdd, 0xec, 0xff, 0xb1, 0xe0, 0xb8, 0x3a, 0xbe, 0x8c, 0x0b, + 0xfb, 0x67, 0x60, 0x8a, 0x2f, 0x37, 0xc3, 0xc7, 0x58, 0x1c, 0xd7, 0x17, 0x33, 0x67, 0x6e, 0xc2, + 0x17, 0xde, 0x28, 0xc8, 0x1f, 0x15, 0x65, 0x20, 0x70, 0x56, 0x35, 0xf6, 0x2f, 0x0d, 0x41, 0xff, + 0xd2, 0x2e, 0xf1, 0xa2, 0x23, 0xb8, 0xda, 0xd4, 0x60, 0xcc, 0xf5, 0x76, 0xfd, 0xc6, 0x2e, 0xa9, + 0x73, 0xfc, 0x41, 0x6e, 0xe0, 0x27, 0x04, 0xeb, 0xb1, 0x15, 0x83, 0x05, 0x4e, 0xb0, 0x7c, 0x10, + 0xd6, 0x87, 0x4b, 0x30, 0xc0, 0x0f, 0x1f, 0x61, 0x7a, 0xc8, 0xdc, 0xb3, 0x59, 0x27, 0x8a, 0x23, + 0x35, 0xb6, 0x8c, 0xf0, 0xc3, 0x4d, 0x14, 0x47, 0x9f, 0x86, 0xb1, 0x4d, 0x37, 0x08, 0xa3, 0x0d, + 0xb7, 0x49, 0x8f, 0x86, 0x66, 0xeb, 0x3e, 0xac, 0x0d, 0xaa, 0x1f, 0x96, 0x0d, 0x4e, 0x38, 0xc1, + 0x19, 0x6d, 0xc1, 0x68, 0xc3, 0xd1, 0xab, 0x1a, 0x3c, 0x70, 0x55, 0xea, 0x74, 0x58, 0xd5, 0x19, + 0x61, 0x93, 0x2f, 0x5d, 0x4e, 0x35, 0xa6, 0x30, 0x1f, 0x62, 0xea, 0x0c, 0xb5, 0x9c, 0xb8, 0xa6, + 0x9c, 0xe3, 0xa8, 0x80, 0xc6, 0x1c, 0xd9, 0x4b, 0xa6, 0x80, 0xa6, 0xb9, 0xab, 0x7f, 0x0a, 0x4a, + 0x84, 0x76, 0x21, 0x65, 0x2c, 0x0e, 0x98, 0x0b, 0xbd, 0xb5, 0x75, 0xcd, 0xad, 0x05, 0xbe, 0x69, + 0xe7, 0x59, 0x92, 0x9c, 0x70, 0xcc, 0x14, 0x2d, 0xc0, 0x40, 0x48, 0x02, 0x57, 0xe9, 0x92, 0x3b, + 0x0c, 0x23, 0x23, 0xe3, 0xaf, 0xd6, 0xf8, 0x6f, 0x2c, 0x8a, 0xd2, 0xe9, 0xe5, 0x30, 0x55, 0x2c, + 0x3b, 0x0c, 0xb4, 0xe9, 0x35, 0xc7, 0xa0, 0x58, 0x60, 0xd1, 0xeb, 0x30, 0x18, 0x90, 0x06, 0x33, + 0x24, 0x8e, 0xf6, 0x3e, 0xc9, 0xb9, 0x5d, 0x92, 0x97, 0xc3, 0x92, 0x01, 0xba, 0x02, 0x28, 0x20, + 0x54, 0xc0, 0x73, 0xbd, 0x2d, 0xe5, 0xde, 0x2d, 0x36, 0x5a, 0x25, 0x48, 0xe3, 0x98, 0x42, 0x3e, + 0x58, 0xc4, 0x19, 0xc5, 0xd0, 0x25, 0x98, 0x54, 0xd0, 0x15, 0x2f, 0x8c, 0x1c, 0xba, 0xc1, 0x8d, + 0x33, 0x5e, 0x4a, 0xbf, 0x82, 0x93, 0x04, 0x38, 0x5d, 0xc6, 0xfe, 0x59, 0x0b, 0x78, 0x3f, 0x1f, + 0x81, 0x56, 0xe1, 0x35, 0x53, 0xab, 0x70, 0x32, 0x77, 0xe4, 0x72, 0x34, 0x0a, 0x3f, 0x6b, 0xc1, + 0xb0, 0x36, 0xb2, 0xf1, 0x9c, 0xb5, 0x3a, 0xcc, 0xd9, 0x36, 0x4c, 0xd0, 0x99, 0x7e, 0xf5, 0x66, + 0x48, 0x82, 0x5d, 0x52, 0x67, 0x13, 0xb3, 0x70, 0x7f, 0x13, 0x53, 0xb9, 0x92, 0xae, 0x26, 0x18, + 0xe2, 0x54, 0x15, 0xf6, 0xa7, 0x64, 0x53, 0x95, 0xe7, 0x6d, 0x4d, 0x8d, 0x79, 0xc2, 0xf3, 0x56, + 0x8d, 0x2a, 0x8e, 0x69, 0xe8, 0x52, 0xdb, 0xf6, 0xc3, 0x28, 0xe9, 0x79, 0x7b, 0xd9, 0x0f, 0x23, + 0xcc, 0x30, 0xf6, 0xf3, 0x00, 0x4b, 0xb7, 0x49, 0x8d, 0xcf, 0x58, 0xfd, 0xd2, 0x63, 0xe5, 0x5f, + 0x7a, 0xec, 0xdf, 0xb7, 0x60, 0x6c, 0x79, 0xc1, 0x38, 0xb9, 0x66, 0x01, 0xf8, 0x4d, 0xed, 0xc6, + 0x8d, 0x75, 0xe9, 0xfe, 0xc1, 0x2d, 0xe0, 0x0a, 0x8a, 0x35, 0x0a, 0x74, 0x12, 0x8a, 0x8d, 0xb6, + 0x27, 0xd4, 0x9e, 0x83, 0xf4, 0x78, 0x5c, 0x6d, 0x7b, 0x98, 0xc2, 0xb4, 0xc7, 0x4a, 0xc5, 0x9e, + 0x1f, 0x2b, 0x75, 0x0d, 0x52, 0x82, 0xca, 0xd0, 0x7f, 0xeb, 0x96, 0x5b, 0xe7, 0x4f, 0xc1, 0x85, + 0x6b, 0xca, 0x8d, 0x1b, 0x2b, 0x8b, 0x21, 0xe6, 0x70, 0xfb, 0x4b, 0x45, 0x98, 0x59, 0x6e, 0x90, + 0xdb, 0xef, 0xf0, 0x39, 0x7c, 0xaf, 0x4f, 0xad, 0x0e, 0xa6, 0x40, 0x3a, 0xe8, 0x73, 0xba, 0xee, + 0xfd, 0xb1, 0x09, 0x83, 0xdc, 0xf1, 0x54, 0x3e, 0x8e, 0xcf, 0x34, 0xf7, 0xe5, 0x77, 0xc8, 0x2c, + 0x77, 0x60, 0x15, 0xe6, 0x3e, 0x75, 0x60, 0x0a, 0x28, 0x96, 0xcc, 0x67, 0x5e, 0x86, 0x11, 0x9d, + 0xf2, 0x40, 0x0f, 0x5b, 0xbf, 0xb7, 0x08, 0x13, 0xb4, 0x05, 0x0f, 0x74, 0x20, 0xae, 0xa5, 0x07, + 0xe2, 0xb0, 0x1f, 0x37, 0x76, 0x1f, 0x8d, 0xb7, 0x92, 0xa3, 0x71, 0x31, 0x6f, 0x34, 0x8e, 0x7a, + 0x0c, 0xbe, 0xcf, 0x82, 0xa9, 0xe5, 0x86, 0x5f, 0xdb, 0x49, 0x3c, 0x40, 0x7c, 0x11, 0x86, 0xe9, + 0x76, 0x1c, 0x1a, 0xb1, 0x38, 0x8c, 0xe8, 0x2c, 0x02, 0x85, 0x75, 0x3a, 0xad, 0xd8, 0xb5, 0x6b, + 0x2b, 0x8b, 0x59, 0x41, 0x5d, 0x04, 0x0a, 0xeb, 0x74, 0xf6, 0xef, 0x5a, 0x70, 0xfa, 0xd2, 0xc2, + 0x52, 0x3c, 0x15, 0x53, 0x71, 0x65, 0xce, 0xc1, 0x40, 0xab, 0xae, 0x35, 0x25, 0x56, 0x0b, 0x2f, + 0xb2, 0x56, 0x08, 0xec, 0xbb, 0x25, 0x66, 0xd2, 0x35, 0x80, 0x4b, 0xb8, 0xb2, 0x20, 0xf6, 0x5d, + 0x69, 0x05, 0xb2, 0x72, 0xad, 0x40, 0x8f, 0xc3, 0x20, 0x3d, 0x17, 0xdc, 0x9a, 0x6c, 0x37, 0x37, + 0xe8, 0x73, 0x10, 0x96, 0x38, 0xfb, 0x67, 0x2c, 0x98, 0xba, 0xe4, 0x46, 0xf4, 0xd0, 0x4e, 0x06, + 0x4e, 0xa1, 0xa7, 0x76, 0xe8, 0x46, 0x7e, 0xb0, 0x97, 0x0c, 0x9c, 0x82, 0x15, 0x06, 0x6b, 0x54, + 0xfc, 0x83, 0x76, 0x5d, 0xf6, 0x92, 0xa2, 0x60, 0xda, 0xdd, 0xb0, 0x80, 0x63, 0x45, 0x41, 0xfb, + 0xab, 0xee, 0x06, 0x4c, 0x65, 0xb9, 0x27, 0x36, 0x6e, 0xd5, 0x5f, 0x8b, 0x12, 0x81, 0x63, 0x1a, + 0xfb, 0xcf, 0x2d, 0x28, 0x5f, 0x6a, 0xb4, 0xc3, 0x88, 0x04, 0x9b, 0x61, 0xce, 0xa6, 0xfb, 0x3c, + 0x94, 0x88, 0x34, 0x10, 0xc8, 0x27, 0x9f, 0x52, 0x10, 0x55, 0x96, 0x03, 0x1e, 0xbf, 0x45, 0xd1, + 0xf5, 0xf0, 0x4a, 0xfa, 0x60, 0xcf, 0x5c, 0x97, 0x01, 0x11, 0xbd, 0x2e, 0x3d, 0xa0, 0x0d, 0x8b, + 0x8c, 0xb1, 0x94, 0xc2, 0xe2, 0x8c, 0x12, 0xf6, 0x8f, 0x59, 0x70, 0x5c, 0x7d, 0xf0, 0xbb, 0xee, + 0x33, 0xed, 0xaf, 0x15, 0x60, 0xf4, 0xf2, 0xc6, 0x46, 0xe5, 0x12, 0x89, 0xb4, 0x59, 0xd9, 0xd9, + 0xec, 0x8f, 0x35, 0xeb, 0x65, 0xa7, 0x3b, 0x62, 0x3b, 0x72, 0x1b, 0xb3, 0x3c, 0x2e, 0xda, 0xec, + 0x8a, 0x17, 0x5d, 0x0d, 0xaa, 0x51, 0xe0, 0x7a, 0x5b, 0x99, 0x33, 0x5d, 0xca, 0x2c, 0xc5, 0x3c, + 0x99, 0x05, 0x3d, 0x0f, 0x03, 0x2c, 0x30, 0x9b, 0x1c, 0x84, 0x87, 0xd5, 0x15, 0x8b, 0x41, 0xef, + 0xed, 0x97, 0x4b, 0xd7, 0xf0, 0x0a, 0xff, 0x83, 0x05, 0x29, 0xba, 0x06, 0xc3, 0xdb, 0x51, 0xd4, + 0xba, 0x4c, 0x9c, 0x3a, 0x09, 0xe4, 0x2e, 0x7b, 0x26, 0x6b, 0x97, 0xa5, 0x9d, 0xc0, 0xc9, 0xe2, + 0x8d, 0x29, 0x86, 0x85, 0x58, 0xe7, 0x63, 0x57, 0x01, 0x62, 0xdc, 0x21, 0x19, 0x6e, 0xec, 0x0d, + 0x28, 0xd1, 0xcf, 0x9d, 0x6b, 0xb8, 0x4e, 0x67, 0xd3, 0xf8, 0xd3, 0x50, 0x92, 0x86, 0xef, 0x50, + 0x44, 0x71, 0x60, 0x27, 0x92, 0xb4, 0x8b, 0x87, 0x38, 0xc6, 0xdb, 0x8f, 0x81, 0xf0, 0x2d, 0xed, + 0xc4, 0xd2, 0xde, 0x84, 0x63, 0xcc, 0x49, 0xd6, 0x89, 0xb6, 0x8d, 0x39, 0xda, 0x7d, 0x32, 0x3c, + 0x23, 0xee, 0x75, 0xfc, 0xcb, 0xa6, 0xb5, 0xc7, 0xc9, 0x23, 0x92, 0x63, 0x7c, 0xc7, 0xb3, 0xff, + 0xac, 0x0f, 0x1e, 0x5e, 0xa9, 0xe6, 0x87, 0x1f, 0x7a, 0x09, 0x46, 0xb8, 0xb8, 0x48, 0xa7, 0x86, + 0xd3, 0x10, 0xf5, 0x2a, 0x0d, 0xe8, 0x86, 0x86, 0xc3, 0x06, 0x25, 0x3a, 0x0d, 0x45, 0xf7, 0x6d, + 0x2f, 0xf9, 0x74, 0x6f, 0xe5, 0x8d, 0x75, 0x4c, 0xe1, 0x14, 0x4d, 0x25, 0x4f, 0xbe, 0xa5, 0x2b, + 0xb4, 0x92, 0x3e, 0x5f, 0x83, 0x31, 0x37, 0xac, 0x85, 0xee, 0x8a, 0x47, 0xd7, 0xa9, 0xb6, 0xd2, + 0x95, 0xce, 0x81, 0x36, 0x5a, 0x61, 0x71, 0x82, 0x5a, 0x3b, 0x5f, 0xfa, 0x7b, 0x96, 0x5e, 0xbb, + 0x06, 0x3f, 0xa0, 0xdb, 0x7f, 0x8b, 0x7d, 0x5d, 0xc8, 0x54, 0xf0, 0x62, 0xfb, 0xe7, 0x1f, 0x1c, + 0x62, 0x89, 0xa3, 0x17, 0xba, 0xda, 0xb6, 0xd3, 0x9a, 0x6b, 0x47, 0xdb, 0x8b, 0x6e, 0x58, 0xf3, + 0x77, 0x49, 0xb0, 0xc7, 0xee, 0xe2, 0x43, 0xf1, 0x85, 0x4e, 0x21, 0x16, 0x2e, 0xcf, 0x55, 0x28, + 0x25, 0x4e, 0x97, 0x41, 0x73, 0x30, 0x2e, 0x81, 0x55, 0x12, 0xb2, 0x23, 0x60, 0x98, 0xb1, 0x51, + 0x8f, 0xe9, 0x04, 0x58, 0x31, 0x49, 0xd2, 0x9b, 0x02, 0x2e, 0x1c, 0x86, 0x80, 0xfb, 0x41, 0x18, + 0x75, 0x3d, 0x37, 0x72, 0x9d, 0xc8, 0xe7, 0xf6, 0x23, 0x7e, 0xed, 0x66, 0x0a, 0xe6, 0x15, 0x1d, + 0x81, 0x4d, 0x3a, 0xfb, 0xdf, 0xf7, 0xc1, 0x24, 0x1b, 0xb6, 0xf7, 0x66, 0xd8, 0x77, 0xd2, 0x0c, + 0xbb, 0x96, 0x9e, 0x61, 0x87, 0x21, 0xb9, 0xdf, 0xf7, 0x34, 0xfb, 0x34, 0x94, 0xd4, 0xfb, 0x41, + 0xf9, 0x80, 0xd8, 0xca, 0x79, 0x40, 0xdc, 0xfd, 0xf4, 0x96, 0x2e, 0x69, 0xc5, 0x4c, 0x97, 0xb4, + 0xaf, 0x58, 0x10, 0x1b, 0x16, 0xd0, 0x1b, 0x50, 0x6a, 0xf9, 0xcc, 0xc3, 0x35, 0x90, 0x6e, 0xe3, + 0x8f, 0x75, 0xb4, 0x4c, 0xf0, 0x08, 0x6c, 0x01, 0xef, 0x85, 0x8a, 0x2c, 0x8a, 0x63, 0x2e, 0xe8, + 0x0a, 0x0c, 0xb6, 0x02, 0x52, 0x8d, 0x58, 0x78, 0xa0, 0xde, 0x19, 0xf2, 0x59, 0xc3, 0x0b, 0x62, + 0xc9, 0xc1, 0xfe, 0xf9, 0x02, 0x4c, 0x24, 0x49, 0xd1, 0xab, 0xd0, 0x47, 0x6e, 0x93, 0x9a, 0x68, + 0x6f, 0xe6, 0x51, 0x1c, 0xab, 0x26, 0x78, 0x07, 0xd0, 0xff, 0x98, 0x95, 0x42, 0x97, 0x61, 0x90, + 0x9e, 0xc3, 0x97, 0x54, 0x28, 0xbc, 0x47, 0xf2, 0xce, 0x72, 0x25, 0xd0, 0xf0, 0xc6, 0x09, 0x10, + 0x96, 0xc5, 0x99, 0x1f, 0x58, 0xad, 0x55, 0xa5, 0x57, 0x9c, 0xa8, 0xd3, 0x4d, 0x7c, 0x63, 0xa1, + 0xc2, 0x89, 0x04, 0x37, 0xee, 0x07, 0x26, 0x81, 0x38, 0x66, 0x82, 0x3e, 0x02, 0xfd, 0x61, 0x83, + 0x90, 0x96, 0x30, 0xf4, 0x67, 0x2a, 0x17, 0xab, 0x94, 0x40, 0x70, 0x62, 0xca, 0x08, 0x06, 0xc0, + 0xbc, 0xa0, 0xfd, 0x0b, 0x16, 0x00, 0x77, 0x9c, 0x73, 0xbc, 0x2d, 0x72, 0x04, 0xfa, 0xf8, 0x45, + 0xe8, 0x0b, 0x5b, 0xa4, 0xd6, 0xc9, 0x7d, 0x3b, 0x6e, 0x4f, 0xb5, 0x45, 0x6a, 0xf1, 0x9c, 0xa5, + 0xff, 0x30, 0x2b, 0x6d, 0x7f, 0x3f, 0xc0, 0x58, 0x4c, 0xb6, 0x12, 0x91, 0x26, 0x7a, 0xd6, 0x08, + 0x5b, 0x72, 0x32, 0x11, 0xb6, 0xa4, 0xc4, 0xa8, 0x35, 0xd5, 0xef, 0xa7, 0xa1, 0xd8, 0x74, 0x6e, + 0x0b, 0xdd, 0xde, 0xd3, 0x9d, 0x9b, 0x41, 0xf9, 0xcf, 0xae, 0x39, 0xb7, 0xf9, 0xf5, 0xf7, 0x69, + 0xb9, 0xc6, 0xd6, 0x9c, 0xdb, 0x5d, 0x5d, 0x8c, 0x69, 0x25, 0xac, 0x2e, 0xd7, 0x13, 0x3e, 0x61, + 0x3d, 0xd5, 0xe5, 0x7a, 0xc9, 0xba, 0x5c, 0xaf, 0x87, 0xba, 0x5c, 0x0f, 0xdd, 0x81, 0x41, 0xe1, + 0xb2, 0x29, 0x02, 0x9b, 0x5d, 0xe8, 0xa1, 0x3e, 0xe1, 0xf1, 0xc9, 0xeb, 0xbc, 0x20, 0xaf, 0xf7, + 0x02, 0xda, 0xb5, 0x5e, 0x59, 0x21, 0xfa, 0x7f, 0x2d, 0x18, 0x13, 0xbf, 0x31, 0x79, 0xbb, 0x4d, + 0xc2, 0x48, 0x88, 0xbf, 0x1f, 0xe8, 0xbd, 0x0d, 0xa2, 0x20, 0x6f, 0xca, 0x07, 0xe4, 0x49, 0x65, + 0x22, 0xbb, 0xb6, 0x28, 0xd1, 0x0a, 0xf4, 0xf3, 0x16, 0x1c, 0x6b, 0x3a, 0xb7, 0x79, 0x8d, 0x1c, + 0x86, 0x9d, 0xc8, 0xf5, 0x85, 0xeb, 0xc3, 0xab, 0xbd, 0x0d, 0x7f, 0xaa, 0x38, 0x6f, 0xa4, 0xb4, + 0x73, 0x1e, 0xcb, 0x22, 0xe9, 0xda, 0xd4, 0xcc, 0x76, 0xcd, 0x6c, 0xc2, 0x90, 0x9c, 0x6f, 0x0f, + 0xd2, 0x3f, 0x9c, 0xd5, 0x23, 0xe6, 0xda, 0x03, 0xad, 0xe7, 0xd3, 0x30, 0xa2, 0xcf, 0xb1, 0x07, + 0x5a, 0xd7, 0xdb, 0x30, 0x95, 0x31, 0x97, 0x1e, 0x68, 0x95, 0xb7, 0xe0, 0x64, 0xee, 0xfc, 0x78, + 0xa0, 0xfe, 0xfd, 0x5f, 0xb3, 0xf4, 0x7d, 0xf0, 0x08, 0x8c, 0x22, 0x0b, 0xa6, 0x51, 0xe4, 0x4c, + 0xe7, 0x95, 0x93, 0x63, 0x19, 0x79, 0x4b, 0x6f, 0x34, 0xdd, 0xd5, 0xd1, 0xeb, 0x30, 0xd0, 0xa0, + 0x10, 0xe9, 0xf8, 0x6b, 0x77, 0x5f, 0x91, 0xb1, 0x38, 0xca, 0xe0, 0x21, 0x16, 0x1c, 0xec, 0x5f, + 0xb6, 0xa0, 0xef, 0x08, 0x7a, 0x02, 0x9b, 0x3d, 0xf1, 0x6c, 0x2e, 0x6b, 0x11, 0xe3, 0x7d, 0x16, + 0x3b, 0xb7, 0x96, 0x6e, 0x47, 0xc4, 0x0b, 0xd9, 0x99, 0x9e, 0xd9, 0x31, 0xfb, 0x16, 0x4c, 0xad, + 0xfa, 0x4e, 0x7d, 0xde, 0x69, 0x38, 0x5e, 0x8d, 0x04, 0x2b, 0xde, 0xd6, 0x81, 0xbc, 0xd6, 0x0b, + 0x5d, 0xbd, 0xd6, 0x5f, 0x82, 0x01, 0xb7, 0xa5, 0xc5, 0xac, 0x3e, 0x4b, 0x3b, 0x70, 0xa5, 0x22, + 0xc2, 0x55, 0x23, 0xa3, 0x72, 0x06, 0xc5, 0x82, 0x9e, 0x8e, 0x3c, 0x77, 0x17, 0xeb, 0xcb, 0x1f, + 0x79, 0x2a, 0xc5, 0x27, 0x43, 0x40, 0x19, 0x8e, 0xcd, 0xdb, 0x60, 0x54, 0x21, 0x5e, 0x7d, 0x61, + 0x18, 0x74, 0xf9, 0x97, 0x8a, 0xe1, 0x7f, 0x22, 0x5b, 0xba, 0x4e, 0x75, 0x8c, 0xf6, 0x9e, 0x89, + 0x03, 0xb0, 0x64, 0x64, 0xbf, 0x04, 0x99, 0x21, 0x3b, 0xba, 0x6b, 0x4e, 0xec, 0x8f, 0xc1, 0x24, + 0x2b, 0x79, 0x40, 0xad, 0x84, 0x9d, 0xd0, 0xf7, 0x66, 0x84, 0x1f, 0xb5, 0xff, 0x8d, 0x05, 0x68, + 0xcd, 0xaf, 0xbb, 0x9b, 0x7b, 0x82, 0x39, 0xff, 0xfe, 0xb7, 0xa1, 0xcc, 0xaf, 0x7d, 0xc9, 0x10, + 0x9d, 0x0b, 0x0d, 0x27, 0x0c, 0x35, 0x5d, 0xf3, 0x13, 0xa2, 0xde, 0xf2, 0x46, 0x67, 0x72, 0xdc, + 0x8d, 0x1f, 0x7a, 0x23, 0x11, 0xa8, 0xed, 0x43, 0xa9, 0x40, 0x6d, 0x4f, 0x64, 0x7a, 0x7c, 0xa4, + 0x5b, 0x2f, 0x03, 0xb8, 0xd9, 0x5f, 0xb0, 0x60, 0x7c, 0x3d, 0x11, 0x72, 0xf2, 0x1c, 0x33, 0x7f, + 0x67, 0xd8, 0x50, 0xaa, 0x0c, 0x8a, 0x05, 0xf6, 0xd0, 0x75, 0x8c, 0x7f, 0x6d, 0x41, 0x1c, 0x22, + 0xe8, 0x08, 0xa4, 0xda, 0x05, 0x43, 0xaa, 0xcd, 0xbc, 0x21, 0xa8, 0xe6, 0xe4, 0x09, 0xb5, 0xe8, + 0x8a, 0x1a, 0x93, 0x0e, 0x97, 0x83, 0x98, 0x0d, 0x5f, 0x67, 0x63, 0xe6, 0xc0, 0xa9, 0xd1, 0xf8, + 0x83, 0x02, 0x20, 0x45, 0xdb, 0x73, 0x70, 0xbf, 0x74, 0x89, 0xc3, 0x09, 0xee, 0xb7, 0x0b, 0x88, + 0x39, 0x70, 0x04, 0x8e, 0x17, 0x72, 0xb6, 0xae, 0xd0, 0xaa, 0x1e, 0xcc, 0x3b, 0x64, 0x46, 0xbe, + 0xf6, 0x5b, 0x4d, 0x71, 0xc3, 0x19, 0x35, 0x68, 0x8e, 0x39, 0xfd, 0xbd, 0x3a, 0xe6, 0x0c, 0x74, + 0x79, 0xb6, 0xfa, 0x55, 0x0b, 0x46, 0x55, 0x37, 0xbd, 0x4b, 0x1e, 0x37, 0xa8, 0xf6, 0xe4, 0x9c, + 0x2b, 0x15, 0xad, 0xc9, 0xec, 0xbc, 0xfd, 0x2e, 0xf6, 0xfc, 0xd8, 0x69, 0xb8, 0x77, 0x88, 0x0a, + 0x06, 0x5b, 0x16, 0xcf, 0x89, 0x05, 0xf4, 0xde, 0x7e, 0x79, 0x54, 0xfd, 0xe3, 0xc1, 0xee, 0xe3, + 0x22, 0xf6, 0x4f, 0xd1, 0xc5, 0x6e, 0x4e, 0x45, 0xf4, 0x22, 0xf4, 0xb7, 0xb6, 0x9d, 0x90, 0x24, + 0x1e, 0x81, 0xf5, 0x57, 0x28, 0xf0, 0xde, 0x7e, 0x79, 0x4c, 0x15, 0x60, 0x10, 0xcc, 0xa9, 0x7b, + 0x0f, 0x99, 0x98, 0x9e, 0x9c, 0x5d, 0x43, 0x26, 0xfe, 0xa5, 0x05, 0x7d, 0xeb, 0xf4, 0xf4, 0x7a, + 0xf0, 0x5b, 0xc0, 0x6b, 0xc6, 0x16, 0x70, 0x2a, 0x2f, 0x0f, 0x49, 0xee, 0xea, 0x5f, 0x4e, 0xac, + 0xfe, 0x33, 0xb9, 0x1c, 0x3a, 0x2f, 0xfc, 0x26, 0x0c, 0xb3, 0xec, 0x26, 0xe2, 0xc1, 0xdb, 0xf3, + 0xc6, 0x82, 0x2f, 0x27, 0x16, 0xfc, 0xb8, 0x46, 0xaa, 0xad, 0xf4, 0x27, 0x61, 0x50, 0xbc, 0xa0, + 0x4a, 0xbe, 0xe2, 0x16, 0xb4, 0x58, 0xe2, 0xed, 0x1f, 0x2f, 0x82, 0x91, 0x4d, 0x05, 0xfd, 0xaa, + 0x05, 0xb3, 0x01, 0xf7, 0xac, 0xae, 0x2f, 0xb6, 0x03, 0xd7, 0xdb, 0xaa, 0xd6, 0xb6, 0x49, 0xbd, + 0xdd, 0x70, 0xbd, 0xad, 0x95, 0x2d, 0xcf, 0x57, 0xe0, 0xa5, 0xdb, 0xa4, 0xd6, 0x66, 0x56, 0xcf, + 0x2e, 0xa9, 0x5b, 0xd4, 0x0b, 0x85, 0xe7, 0xee, 0xee, 0x97, 0x67, 0xf1, 0x81, 0x78, 0xe3, 0x03, + 0xb6, 0x05, 0xfd, 0xae, 0x05, 0x17, 0x78, 0x92, 0x91, 0xde, 0xdb, 0xdf, 0x41, 0x89, 0x50, 0x91, + 0xac, 0x62, 0x26, 0x1b, 0x24, 0x68, 0xce, 0x7f, 0x50, 0x74, 0xe8, 0x85, 0xca, 0xc1, 0xea, 0xc2, + 0x07, 0x6d, 0x9c, 0xfd, 0x8f, 0x8a, 0x30, 0x2a, 0x42, 0xeb, 0x89, 0x33, 0xe0, 0x45, 0x63, 0x4a, + 0x3c, 0x92, 0x98, 0x12, 0x93, 0x06, 0xf1, 0xe1, 0x6c, 0xff, 0x21, 0x4c, 0xd2, 0xcd, 0xf9, 0x32, + 0x71, 0x82, 0xe8, 0x26, 0x71, 0xb8, 0xbf, 0x5d, 0xf1, 0xc0, 0xbb, 0xbf, 0x52, 0xfc, 0xae, 0x26, + 0x99, 0xe1, 0x34, 0xff, 0xef, 0xa4, 0x33, 0xc7, 0x83, 0x89, 0x54, 0x74, 0xc4, 0x37, 0xa1, 0xa4, + 0x9e, 0xff, 0x88, 0x4d, 0xa7, 0x73, 0x90, 0xd1, 0x24, 0x07, 0xae, 0x57, 0x8c, 0x9f, 0x9e, 0xc5, + 0xec, 0xec, 0xbf, 0x57, 0x30, 0x2a, 0xe4, 0x83, 0xb8, 0x0e, 0x43, 0x4e, 0x18, 0xba, 0x5b, 0x1e, + 0xa9, 0x77, 0x52, 0xfd, 0xa6, 0xaa, 0x61, 0x4f, 0xb0, 0xe6, 0x44, 0x49, 0xac, 0x78, 0xa0, 0xcb, + 0xdc, 0xab, 0x71, 0x97, 0x74, 0xd2, 0xfb, 0xa6, 0xb8, 0x81, 0xf4, 0x7b, 0xdc, 0x25, 0x58, 0x94, + 0x47, 0x9f, 0xe0, 0x6e, 0xa7, 0x57, 0x3c, 0xff, 0x96, 0x77, 0xc9, 0xf7, 0x65, 0x18, 0x95, 0xde, + 0x18, 0x4e, 0x4a, 0x67, 0x53, 0x55, 0x1c, 0x9b, 0xdc, 0x7a, 0x0b, 0x37, 0xfc, 0x19, 0x60, 0x49, + 0x15, 0xcc, 0xd7, 0xf6, 0x21, 0x22, 0x30, 0x2e, 0xe2, 0x36, 0x4a, 0x98, 0xe8, 0xbb, 0xcc, 0x1b, + 0xae, 0x59, 0x3a, 0xb6, 0x50, 0x5c, 0x31, 0x59, 0xe0, 0x24, 0x4f, 0xfb, 0xa7, 0x2d, 0x60, 0x2f, + 0x8f, 0x8f, 0x40, 0x1e, 0xf9, 0xb0, 0x29, 0x8f, 0x4c, 0xe7, 0x75, 0x72, 0x8e, 0x28, 0xf2, 0x02, + 0x9f, 0x59, 0x95, 0xc0, 0xbf, 0xbd, 0x27, 0x7c, 0x85, 0xba, 0x5f, 0xae, 0xec, 0xff, 0x6e, 0xf1, + 0x4d, 0x2c, 0x8e, 0xd3, 0xf0, 0x59, 0x18, 0xaa, 0x39, 0x2d, 0xa7, 0xc6, 0x53, 0x7f, 0xe5, 0x2a, + 0x3a, 0x8d, 0x42, 0xb3, 0x0b, 0xa2, 0x04, 0x57, 0xdc, 0xc9, 0xf8, 0x9f, 0x43, 0x12, 0xdc, 0x55, + 0x59, 0xa7, 0xaa, 0x9c, 0xd9, 0x81, 0x51, 0x83, 0xd9, 0x03, 0xd5, 0xf2, 0x7c, 0x96, 0x1f, 0xb1, + 0x2a, 0x5e, 0x6d, 0x13, 0x26, 0x3d, 0xed, 0x3f, 0x3d, 0x50, 0xe4, 0xcd, 0xf9, 0xb1, 0x6e, 0x87, + 0x28, 0x3b, 0x7d, 0xb4, 0x47, 0xcd, 0x09, 0x36, 0x38, 0xcd, 0xd9, 0xfe, 0x09, 0x0b, 0x1e, 0xd2, + 0x09, 0xb5, 0x77, 0x53, 0xdd, 0xac, 0x4f, 0x8b, 0x30, 0xe4, 0xb7, 0x48, 0xe0, 0x44, 0x7e, 0x20, + 0x4e, 0x8d, 0xf3, 0xb2, 0xd3, 0xaf, 0x0a, 0xf8, 0x3d, 0x91, 0xc8, 0x42, 0x72, 0x97, 0x70, 0xac, + 0x4a, 0xd2, 0xab, 0x35, 0xeb, 0x8c, 0x50, 0xbc, 0x90, 0x63, 0x7b, 0x00, 0x73, 0x64, 0x08, 0xb1, + 0xc0, 0xd8, 0x7f, 0x66, 0xf1, 0x89, 0xa5, 0x37, 0x1d, 0xbd, 0x0d, 0x13, 0x4d, 0x27, 0xaa, 0x6d, + 0x2f, 0xdd, 0x6e, 0x05, 0xdc, 0x96, 0x27, 0xfb, 0xe9, 0xe9, 0x6e, 0xfd, 0xa4, 0x7d, 0x64, 0xec, + 0x49, 0xbb, 0x96, 0x60, 0x86, 0x53, 0xec, 0xd1, 0x4d, 0x18, 0x66, 0x30, 0xf6, 0xf8, 0x33, 0xec, + 0x24, 0x1a, 0xe4, 0xd5, 0xa6, 0x7c, 0x41, 0xd6, 0x62, 0x3e, 0x58, 0x67, 0x6a, 0x7f, 0xa5, 0xc8, + 0x57, 0x3b, 0x13, 0xe5, 0x9f, 0x84, 0xc1, 0x96, 0x5f, 0x5f, 0x58, 0x59, 0xc4, 0x62, 0x14, 0xd4, + 0x31, 0x52, 0xe1, 0x60, 0x2c, 0xf1, 0xe8, 0x3c, 0x0c, 0x89, 0x9f, 0xd2, 0xf6, 0xca, 0xf6, 0x66, + 0x41, 0x17, 0x62, 0x85, 0x45, 0xcf, 0x01, 0xb4, 0x02, 0x7f, 0xd7, 0xad, 0xb3, 0x60, 0x30, 0x45, + 0xd3, 0x8d, 0xab, 0xa2, 0x30, 0x58, 0xa3, 0x42, 0xaf, 0xc0, 0x68, 0xdb, 0x0b, 0xb9, 0x38, 0xa2, + 0x85, 0xdc, 0x56, 0x0e, 0x46, 0xd7, 0x74, 0x24, 0x36, 0x69, 0xd1, 0x1c, 0x0c, 0x44, 0x0e, 0x73, + 0x4b, 0xea, 0xcf, 0xf7, 0xb6, 0xde, 0xa0, 0x14, 0x7a, 0x96, 0x29, 0x5a, 0x00, 0x8b, 0x82, 0xe8, + 0x4d, 0xf9, 0x0e, 0x9b, 0x6f, 0xec, 0xe2, 0x99, 0x43, 0x6f, 0x87, 0x80, 0xf6, 0x0a, 0x5b, 0x3c, + 0x9f, 0x30, 0x78, 0xa1, 0x97, 0x01, 0xc8, 0xed, 0x88, 0x04, 0x9e, 0xd3, 0x50, 0xce, 0x84, 0x4a, + 0x2e, 0x58, 0xf4, 0xd7, 0xfd, 0xe8, 0x5a, 0x48, 0x96, 0x14, 0x05, 0xd6, 0xa8, 0xed, 0xdf, 0x2d, + 0x01, 0xc4, 0x72, 0x3b, 0xba, 0x93, 0xda, 0xb8, 0x9e, 0xe9, 0x2c, 0xe9, 0x1f, 0xde, 0xae, 0x85, + 0x3e, 0x6f, 0xc1, 0xb0, 0x88, 0x79, 0xc3, 0x46, 0xa8, 0xd0, 0x79, 0xe3, 0x34, 0x43, 0xef, 0xd0, + 0x12, 0xbc, 0x09, 0xcf, 0xcb, 0x19, 0xaa, 0x61, 0xba, 0xb6, 0x42, 0xaf, 0x18, 0xbd, 0x5f, 0x5e, + 0x15, 0x8b, 0x46, 0x57, 0xaa, 0xab, 0x62, 0x89, 0x9d, 0x11, 0xfa, 0x2d, 0xf1, 0x9a, 0x71, 0x4b, + 0xec, 0xcb, 0x7f, 0x68, 0x6a, 0x88, 0xaf, 0xdd, 0x2e, 0x88, 0xa8, 0xa2, 0x07, 0x9d, 0xe8, 0xcf, + 0x7f, 0x1d, 0xa9, 0xdd, 0x93, 0xba, 0x04, 0x9c, 0xf8, 0x34, 0x8c, 0xd7, 0x4d, 0x21, 0x40, 0xcc, + 0xc4, 0x27, 0xf2, 0xf8, 0x26, 0x64, 0x86, 0xf8, 0xd8, 0x4f, 0x20, 0x70, 0x92, 0x31, 0xaa, 0xf0, + 0x18, 0x24, 0x2b, 0xde, 0xa6, 0x2f, 0x9e, 0xda, 0xd8, 0xb9, 0x63, 0xb9, 0x17, 0x46, 0xa4, 0x49, + 0x29, 0xe3, 0xd3, 0x7d, 0x5d, 0x94, 0xc5, 0x8a, 0x0b, 0x7a, 0x1d, 0x06, 0xd8, 0xf3, 0xb8, 0x70, + 0x7a, 0x28, 0x5f, 0x11, 0x6f, 0x06, 0x63, 0x8c, 0x17, 0x24, 0xfb, 0x1b, 0x62, 0xc1, 0x01, 0x5d, + 0x96, 0x8f, 0x4f, 0xc3, 0x15, 0xef, 0x5a, 0x48, 0xd8, 0xe3, 0xd3, 0xd2, 0xfc, 0x63, 0xf1, 0xbb, + 0x52, 0x0e, 0xcf, 0xcc, 0x45, 0x69, 0x94, 0xa4, 0x52, 0x94, 0xf8, 0x2f, 0x53, 0x5c, 0x8a, 0xd0, + 0x51, 0x99, 0xcd, 0x33, 0xd3, 0x60, 0xc6, 0xdd, 0x79, 0xdd, 0x64, 0x81, 0x93, 0x3c, 0xa9, 0x44, + 0xca, 0x57, 0xbd, 0x78, 0xac, 0xd3, 0x6d, 0xef, 0xe0, 0x17, 0x71, 0x76, 0x1a, 0x71, 0x08, 0x16, + 0xe5, 0x8f, 0x54, 0x3c, 0x98, 0xf1, 0x60, 0x22, 0xb9, 0x44, 0x1f, 0xa8, 0x38, 0xf2, 0x27, 0x7d, + 0x30, 0x66, 0x4e, 0x29, 0x74, 0x01, 0x4a, 0x82, 0x89, 0x4a, 0x13, 0xa3, 0x56, 0xc9, 0x9a, 0x44, + 0xe0, 0x98, 0x86, 0x65, 0x07, 0x62, 0xc5, 0x35, 0xef, 0xec, 0x38, 0x3b, 0x90, 0xc2, 0x60, 0x8d, + 0x8a, 0x5e, 0xac, 0x6e, 0xfa, 0x7e, 0xa4, 0x0e, 0x24, 0x35, 0xef, 0xe6, 0x19, 0x14, 0x0b, 0x2c, + 0x3d, 0x88, 0x76, 0x48, 0xe0, 0x91, 0x86, 0x19, 0x9e, 0x5d, 0x1d, 0x44, 0x57, 0x74, 0x24, 0x36, + 0x69, 0xe9, 0x71, 0xea, 0x87, 0x6c, 0x22, 0x8b, 0xeb, 0x5b, 0xec, 0xed, 0x5e, 0xe5, 0xef, 0xf6, + 0x25, 0x1e, 0x7d, 0x0c, 0x1e, 0x52, 0xa1, 0xd0, 0x30, 0x37, 0xf2, 0xc8, 0x1a, 0x07, 0x0c, 0x6d, + 0xcb, 0x43, 0x0b, 0xd9, 0x64, 0x38, 0xaf, 0x3c, 0x7a, 0x0d, 0xc6, 0x84, 0x88, 0x2f, 0x39, 0x0e, + 0x9a, 0xae, 0x5b, 0x57, 0x0c, 0x2c, 0x4e, 0x50, 0xcb, 0x00, 0xf3, 0x4c, 0xca, 0x96, 0x1c, 0x86, + 0xd2, 0x01, 0xe6, 0x75, 0x3c, 0x4e, 0x95, 0x40, 0x73, 0x30, 0xce, 0x65, 0x30, 0xd7, 0xdb, 0xe2, + 0x63, 0x22, 0xde, 0xd2, 0xa9, 0x25, 0x75, 0xd5, 0x44, 0xe3, 0x24, 0x3d, 0x7a, 0x09, 0x46, 0x9c, + 0xa0, 0xb6, 0xed, 0x46, 0xa4, 0x16, 0xb5, 0x03, 0xfe, 0xc8, 0x4e, 0xf3, 0x7d, 0x9b, 0xd3, 0x70, + 0xd8, 0xa0, 0xb4, 0xef, 0xc0, 0x54, 0x46, 0x40, 0x0f, 0x3a, 0x71, 0x9c, 0x96, 0x2b, 0xbf, 0x29, + 0xe1, 0x60, 0x3e, 0x57, 0x59, 0x91, 0x5f, 0xa3, 0x51, 0xd1, 0xd9, 0xc9, 0x02, 0x7f, 0x68, 0x19, + 0x6d, 0xd5, 0xec, 0x5c, 0x96, 0x08, 0x1c, 0xd3, 0xd8, 0xff, 0xa9, 0x00, 0xe3, 0x19, 0x86, 0x23, + 0x96, 0x55, 0x35, 0x71, 0x49, 0x89, 0x93, 0xa8, 0x9a, 0xf9, 0x0a, 0x0a, 0x07, 0xc8, 0x57, 0x50, + 0xec, 0x96, 0xaf, 0xa0, 0xef, 0x9d, 0xe4, 0x2b, 0x30, 0x7b, 0xac, 0xbf, 0xa7, 0x1e, 0xcb, 0xc8, + 0x71, 0x30, 0x70, 0xc0, 0x1c, 0x07, 0x46, 0xa7, 0x0f, 0xf6, 0xd0, 0xe9, 0x3f, 0x52, 0x80, 0x89, + 0xa4, 0xcd, 0xe9, 0x08, 0xf4, 0xb6, 0xaf, 0x1b, 0x7a, 0xdb, 0xf3, 0xbd, 0xbc, 0x7d, 0xce, 0xd5, + 0xe1, 0xe2, 0x84, 0x0e, 0xf7, 0xa9, 0x9e, 0xb8, 0x75, 0xd6, 0xe7, 0xfe, 0x64, 0x01, 0x8e, 0x67, + 0x9a, 0xe2, 0x8e, 0xa0, 0x6f, 0xae, 0x1a, 0x7d, 0xf3, 0x6c, 0xcf, 0xef, 0xc2, 0x73, 0x3b, 0xe8, + 0x46, 0xa2, 0x83, 0x2e, 0xf4, 0xce, 0xb2, 0x73, 0x2f, 0x7d, 0xa3, 0x08, 0x67, 0x32, 0xcb, 0xc5, + 0x6a, 0xcf, 0x65, 0x43, 0xed, 0xf9, 0x5c, 0x42, 0xed, 0x69, 0x77, 0x2e, 0x7d, 0x38, 0x7a, 0x50, + 0xf1, 0x3e, 0x9a, 0x45, 0x79, 0xb8, 0x4f, 0x1d, 0xa8, 0xf1, 0x3e, 0x5a, 0x31, 0xc2, 0x26, 0xdf, + 0xef, 0x24, 0xdd, 0xe7, 0x6f, 0x5b, 0x70, 0x32, 0x73, 0x6c, 0x8e, 0x40, 0xd7, 0xb5, 0x6e, 0xea, + 0xba, 0x9e, 0xec, 0x79, 0xb6, 0xe6, 0x28, 0xbf, 0xbe, 0x30, 0x90, 0xf3, 0x2d, 0xec, 0x26, 0x7f, + 0x15, 0x86, 0x9d, 0x5a, 0x8d, 0x84, 0xe1, 0x9a, 0x5f, 0x57, 0xa1, 0xcd, 0x9f, 0x65, 0xf7, 0xac, + 0x18, 0x7c, 0x6f, 0xbf, 0x3c, 0x93, 0x64, 0x11, 0xa3, 0xb1, 0xce, 0x01, 0x7d, 0x02, 0x86, 0x42, + 0x71, 0x6e, 0x8a, 0xb1, 0x7f, 0xbe, 0xc7, 0xce, 0x71, 0x6e, 0x92, 0x86, 0x19, 0x43, 0x4b, 0x69, + 0x2a, 0x14, 0x4b, 0xf4, 0xbf, 0xe9, 0xf1, 0x76, 0xd2, 0x52, 0x65, 0x22, 0xfa, 0xcb, 0x7d, 0x44, + 0xdd, 0x79, 0x0e, 0x60, 0x57, 0x5d, 0x09, 0x92, 0x5a, 0x08, 0xed, 0xb2, 0xa0, 0x51, 0xa1, 0x8f, + 0xc0, 0x44, 0xc8, 0x43, 0x4d, 0xc6, 0xce, 0x13, 0x7c, 0x2e, 0xb2, 0x68, 0x5d, 0xd5, 0x04, 0x0e, + 0xa7, 0xa8, 0xd1, 0xb2, 0xac, 0x95, 0xb9, 0xc9, 0xf0, 0xe9, 0x79, 0x2e, 0xae, 0x51, 0xb8, 0xca, + 0x1c, 0x4b, 0x0e, 0x02, 0xeb, 0x7e, 0xad, 0x24, 0xfa, 0x04, 0x00, 0x9d, 0x44, 0x42, 0x1b, 0x31, + 0x98, 0xbf, 0x85, 0xd2, 0xbd, 0xa5, 0x9e, 0xe9, 0x3b, 0xce, 0x1e, 0x36, 0x2f, 0x2a, 0x26, 0x58, + 0x63, 0x88, 0x1c, 0x18, 0x8d, 0xff, 0xc5, 0x89, 0x8f, 0xcf, 0xe7, 0xd6, 0x90, 0x64, 0xce, 0x14, + 0xdf, 0x8b, 0x3a, 0x0b, 0x6c, 0x72, 0x44, 0x1f, 0x87, 0x93, 0xbb, 0xb9, 0x1e, 0x29, 0xa5, 0x38, + 0x97, 0x61, 0xbe, 0x1f, 0x4a, 0x7e, 0x79, 0xfb, 0x77, 0x00, 0x1e, 0xee, 0xb0, 0xd3, 0xa3, 0x39, + 0xd3, 0x9a, 0xfc, 0x74, 0x52, 0x45, 0x30, 0x93, 0x59, 0xd8, 0xd0, 0x19, 0x24, 0x16, 0x54, 0xe1, + 0x1d, 0x2f, 0xa8, 0x1f, 0xb2, 0x34, 0xe5, 0x0d, 0x77, 0xe7, 0xfd, 0xf0, 0x01, 0x4f, 0xb0, 0x43, + 0xd4, 0xe6, 0x6c, 0x66, 0xa8, 0x44, 0x9e, 0xeb, 0xb9, 0x39, 0xbd, 0xeb, 0x48, 0xbe, 0x96, 0x1d, + 0xbc, 0x99, 0x6b, 0x4b, 0x2e, 0x1d, 0xf4, 0xfb, 0x8f, 0x2a, 0x90, 0xf3, 0x1f, 0x58, 0x70, 0x32, + 0x05, 0xe6, 0x6d, 0x20, 0xa1, 0x88, 0x2f, 0xb6, 0xfe, 0x8e, 0x1b, 0x2f, 0x19, 0xf2, 0x6f, 0xb8, + 0x2c, 0xbe, 0xe1, 0x64, 0x2e, 0x5d, 0xb2, 0xe9, 0x5f, 0xfc, 0xe3, 0xf2, 0x14, 0xab, 0xc0, 0x24, + 0xc4, 0xf9, 0x4d, 0x47, 0x2d, 0x38, 0x5b, 0x6b, 0x07, 0x41, 0x3c, 0x59, 0x33, 0x16, 0x27, 0xbf, + 0xeb, 0x3d, 0x76, 0x77, 0xbf, 0x7c, 0x76, 0xa1, 0x0b, 0x2d, 0xee, 0xca, 0x0d, 0x79, 0x80, 0x9a, + 0x29, 0xbf, 0x2f, 0x91, 0xef, 0x3c, 0xd3, 0x53, 0x23, 0xed, 0x25, 0xc6, 0x1f, 0xb0, 0x66, 0x78, + 0x8f, 0x65, 0x70, 0x3e, 0x5a, 0xed, 0xc9, 0xb7, 0x26, 0x32, 0xf7, 0xcc, 0x2a, 0x9c, 0xe9, 0x3c, + 0x99, 0x0e, 0xf4, 0x78, 0xfe, 0xf7, 0x2d, 0x38, 0xdd, 0x31, 0x42, 0xd3, 0xb7, 0xe1, 0x65, 0xc1, + 0xfe, 0x9c, 0x05, 0x8f, 0x64, 0x96, 0x30, 0x5c, 0x0c, 0x2f, 0x40, 0xa9, 0x96, 0xc8, 0xd6, 0x1b, + 0xc7, 0x2a, 0x51, 0x99, 0x7a, 0x63, 0x1a, 0xc3, 0x93, 0xb0, 0xd0, 0xd5, 0x93, 0xf0, 0x37, 0x2c, + 0x48, 0x1d, 0xf5, 0x47, 0x20, 0x79, 0xae, 0x98, 0x92, 0xe7, 0x63, 0xbd, 0xf4, 0x66, 0x8e, 0xd0, + 0xf9, 0x17, 0xe3, 0x70, 0x22, 0xe7, 0xed, 0xeb, 0x2e, 0x4c, 0x6e, 0xd5, 0x88, 0x19, 0xec, 0xa0, + 0x53, 0x10, 0xb0, 0x8e, 0x91, 0x11, 0x78, 0x92, 0xe4, 0x14, 0x09, 0x4e, 0x57, 0x81, 0x3e, 0x67, + 0xc1, 0x31, 0xe7, 0x56, 0xb8, 0x44, 0x6f, 0x10, 0x6e, 0x6d, 0xbe, 0xe1, 0xd7, 0x76, 0xa8, 0x60, + 0x26, 0x97, 0xd5, 0x0b, 0x99, 0x5a, 0xdd, 0x1b, 0xd5, 0x14, 0xbd, 0x51, 0x3d, 0x4b, 0x89, 0x9f, + 0x45, 0x85, 0x33, 0xeb, 0x42, 0x58, 0x64, 0xef, 0x71, 0xa2, 0xed, 0x4e, 0xe1, 0x38, 0xb2, 0x1e, + 0x29, 0x73, 0x91, 0x58, 0x62, 0xb0, 0xe2, 0x83, 0x3e, 0x05, 0xa5, 0x2d, 0xf9, 0xf2, 0x3e, 0x43, + 0xe4, 0x8e, 0x3b, 0xb2, 0x73, 0x3c, 0x02, 0xee, 0x9a, 0xa1, 0x88, 0x70, 0xcc, 0x14, 0xbd, 0x06, + 0x45, 0x6f, 0x33, 0xec, 0x94, 0x55, 0x3e, 0xe1, 0x83, 0xcb, 0x83, 0xde, 0xac, 0x2f, 0x57, 0x31, + 0x2d, 0x88, 0x2e, 0x43, 0x31, 0xb8, 0x59, 0x17, 0x26, 0x89, 0xcc, 0x45, 0x8a, 0xe7, 0x17, 0x73, + 0x5a, 0xc5, 0x38, 0xe1, 0xf9, 0x45, 0x4c, 0x59, 0xa0, 0x0a, 0xf4, 0xb3, 0x07, 0xa3, 0x42, 0xb4, + 0xcd, 0xbc, 0xca, 0x77, 0x78, 0x78, 0xcd, 0x1f, 0xa3, 0x31, 0x02, 0xcc, 0x19, 0xa1, 0x0d, 0x18, + 0xa8, 0xb1, 0x0c, 0xe4, 0x42, 0x96, 0x7d, 0x7f, 0xa6, 0xf1, 0xa1, 0x43, 0x6a, 0x76, 0xa1, 0x8b, + 0x67, 0x14, 0x58, 0xf0, 0x62, 0x5c, 0x49, 0x6b, 0x7b, 0x53, 0x9e, 0x58, 0xd9, 0x5c, 0x59, 0xba, + 0xfc, 0x8e, 0x5c, 0x19, 0x05, 0x16, 0xbc, 0xd0, 0xcb, 0x50, 0xd8, 0xac, 0x89, 0xc7, 0xa0, 0x99, + 0x56, 0x08, 0x33, 0x6e, 0xd1, 0xfc, 0xc0, 0xdd, 0xfd, 0x72, 0x61, 0x79, 0x01, 0x17, 0x36, 0x6b, + 0x68, 0x1d, 0x06, 0x37, 0x79, 0xa4, 0x13, 0x61, 0x68, 0x78, 0x22, 0x3b, 0x08, 0x4b, 0x2a, 0x18, + 0x0a, 0x7f, 0x58, 0x28, 0x10, 0x58, 0x32, 0x61, 0xc9, 0x64, 0x54, 0xc4, 0x16, 0x11, 0x30, 0x72, + 0xf6, 0x60, 0x51, 0x76, 0xf8, 0x55, 0x23, 0x8e, 0xfb, 0x82, 0x35, 0x8e, 0x74, 0x56, 0x3b, 0x77, + 0xda, 0x01, 0xcb, 0x26, 0x20, 0x22, 0x8b, 0x65, 0xce, 0xea, 0x39, 0x49, 0xd4, 0x69, 0x56, 0x2b, + 0x22, 0x1c, 0x33, 0x45, 0x3b, 0x30, 0xba, 0x1b, 0xb6, 0xb6, 0x89, 0x5c, 0xd2, 0x2c, 0xd0, 0x58, + 0x8e, 0x34, 0x7b, 0x5d, 0x10, 0xba, 0x41, 0xd4, 0x76, 0x1a, 0xa9, 0x5d, 0x88, 0x5d, 0x6b, 0xae, + 0xeb, 0xcc, 0xb0, 0xc9, 0x9b, 0x76, 0xff, 0xdb, 0x6d, 0xff, 0xe6, 0x5e, 0x44, 0x44, 0x9c, 0xc7, + 0xcc, 0xee, 0x7f, 0x83, 0x93, 0xa4, 0xbb, 0x5f, 0x20, 0xb0, 0x64, 0x82, 0xae, 0x8b, 0xee, 0x61, + 0xbb, 0xe7, 0x44, 0x7e, 0x10, 0xe9, 0x39, 0x49, 0x94, 0xd3, 0x29, 0x6c, 0xb7, 0x8c, 0x59, 0xb1, + 0x5d, 0xb2, 0xb5, 0xed, 0x47, 0xbe, 0x97, 0xd8, 0xa1, 0x27, 0xf3, 0x77, 0xc9, 0x4a, 0x06, 0x7d, + 0x7a, 0x97, 0xcc, 0xa2, 0xc2, 0x99, 0x75, 0xa1, 0x3a, 0x8c, 0xb5, 0xfc, 0x20, 0xba, 0xe5, 0x07, + 0x72, 0x7e, 0xa1, 0x0e, 0x8a, 0x52, 0x83, 0x52, 0xd4, 0xc8, 0x42, 0xa8, 0x9a, 0x18, 0x9c, 0xe0, + 0x89, 0x3e, 0x0a, 0x83, 0x61, 0xcd, 0x69, 0x90, 0x95, 0xab, 0xd3, 0x53, 0xf9, 0xc7, 0x4f, 0x95, + 0x93, 0xe4, 0xcc, 0x2e, 0x1e, 0xa8, 0x86, 0x93, 0x60, 0xc9, 0x0e, 0x2d, 0x43, 0x3f, 0x4b, 0xd2, + 0xca, 0x82, 0x92, 0xe6, 0xc4, 0xc2, 0x4e, 0x3d, 0xf7, 0xe0, 0x7b, 0x13, 0x03, 0x63, 0x5e, 0x9c, + 0xae, 0x01, 0xa1, 0x29, 0xf0, 0xc3, 0xe9, 0xe3, 0xf9, 0x6b, 0x40, 0x28, 0x18, 0xae, 0x56, 0x3b, + 0xad, 0x01, 0x45, 0x84, 0x63, 0xa6, 0x74, 0x67, 0xa6, 0xbb, 0xe9, 0x89, 0x0e, 0xae, 0x7c, 0xb9, + 0x7b, 0x29, 0xdb, 0x99, 0xe9, 0x4e, 0x4a, 0x59, 0xd8, 0xbf, 0x36, 0x94, 0x96, 0x59, 0x98, 0x86, + 0xe9, 0xff, 0xb0, 0x52, 0xce, 0x07, 0x1f, 0xe8, 0x55, 0xe1, 0x7d, 0x88, 0x17, 0xd7, 0xcf, 0x59, + 0x70, 0xa2, 0x95, 0xf9, 0x21, 0x42, 0x00, 0xe8, 0x4d, 0x6f, 0xce, 0x3f, 0x5d, 0x05, 0xb0, 0xcd, + 0xc6, 0xe3, 0x9c, 0x9a, 0x92, 0xca, 0x81, 0xe2, 0x3b, 0x56, 0x0e, 0xac, 0xc1, 0x50, 0x8d, 0xdf, + 0xe4, 0x64, 0xe0, 0xf5, 0x9e, 0xc2, 0x2f, 0x32, 0x51, 0x42, 0x5c, 0x01, 0x37, 0xb1, 0x62, 0x81, + 0x7e, 0xd8, 0x82, 0xd3, 0xc9, 0xa6, 0x63, 0xc2, 0xd0, 0x22, 0xea, 0x2d, 0x57, 0x6b, 0x2d, 0x8b, + 0xef, 0x4f, 0xc9, 0xff, 0x06, 0xf1, 0xbd, 0x6e, 0x04, 0xb8, 0x73, 0x65, 0x68, 0x31, 0x43, 0xaf, + 0x36, 0x60, 0x5a, 0x14, 0x7b, 0xd0, 0xad, 0xbd, 0x00, 0x23, 0x4d, 0xbf, 0xed, 0x45, 0xc2, 0xf3, + 0x4f, 0x78, 0x21, 0x31, 0xef, 0x9b, 0x35, 0x0d, 0x8e, 0x0d, 0xaa, 0x84, 0x46, 0x6e, 0xe8, 0xbe, + 0x35, 0x72, 0x6f, 0xc1, 0x88, 0xa7, 0xb9, 0xaa, 0x77, 0xba, 0xc1, 0x0a, 0xed, 0xa2, 0x46, 0xcd, + 0x5b, 0xa9, 0x43, 0xb0, 0xc1, 0xad, 0xb3, 0xb6, 0x0c, 0xde, 0x99, 0xb6, 0xec, 0x68, 0xfd, 0x0d, + 0x7f, 0xae, 0x90, 0x71, 0x63, 0xe0, 0x5a, 0xb9, 0x57, 0x4d, 0xad, 0xdc, 0xb9, 0xa4, 0x56, 0x2e, + 0x65, 0xaa, 0x32, 0x14, 0x72, 0xbd, 0x67, 0x87, 0xeb, 0x39, 0xa4, 0xee, 0xf7, 0x5a, 0xf0, 0x10, + 0xb3, 0x7d, 0xd0, 0x0a, 0xde, 0xb1, 0xbd, 0xe3, 0xe1, 0xbb, 0xfb, 0xe5, 0x87, 0x56, 0xb3, 0xd9, + 0xe1, 0xbc, 0x7a, 0xec, 0x06, 0x9c, 0xed, 0x76, 0xee, 0x32, 0x1f, 0xd7, 0xba, 0x72, 0x8e, 0x88, + 0x7d, 0x5c, 0xeb, 0x2b, 0x8b, 0x98, 0x61, 0x7a, 0x0d, 0x18, 0x67, 0xff, 0x07, 0x0b, 0x8a, 0x15, + 0xbf, 0x7e, 0x04, 0x37, 0xfa, 0x0f, 0x1b, 0x37, 0xfa, 0x87, 0xb3, 0x4f, 0xfc, 0x7a, 0xae, 0xb1, + 0x6f, 0x29, 0x61, 0xec, 0x3b, 0x9d, 0xc7, 0xa0, 0xb3, 0x69, 0xef, 0xa7, 0x8a, 0x30, 0x5c, 0xf1, + 0xeb, 0x6a, 0x9d, 0xfd, 0x93, 0xfb, 0x79, 0x60, 0x92, 0x9b, 0xef, 0x47, 0xe3, 0xcc, 0x5c, 0x63, + 0x65, 0xc8, 0x81, 0x6f, 0xb3, 0x77, 0x26, 0x37, 0x88, 0xbb, 0xb5, 0x1d, 0x91, 0x7a, 0xf2, 0x73, + 0x8e, 0xee, 0x9d, 0xc9, 0x37, 0x8b, 0x30, 0x9e, 0xa8, 0x1d, 0x35, 0x60, 0xb4, 0xa1, 0x9b, 0x92, + 0xc4, 0x3c, 0xbd, 0x2f, 0x2b, 0x94, 0xf0, 0xd3, 0xd7, 0x40, 0xd8, 0x64, 0x8e, 0x66, 0x01, 0x94, + 0x6f, 0x85, 0xd4, 0xf6, 0xb3, 0x6b, 0x8d, 0x72, 0xbe, 0x08, 0xb1, 0x46, 0x81, 0x5e, 0x84, 0xe1, + 0xc8, 0x6f, 0xf9, 0x0d, 0x7f, 0x6b, 0xef, 0x0a, 0x91, 0xb1, 0x04, 0x95, 0xf7, 0xed, 0x46, 0x8c, + 0xc2, 0x3a, 0x1d, 0xba, 0x0d, 0x93, 0x8a, 0x49, 0xf5, 0x10, 0xcc, 0x6b, 0x4c, 0x6d, 0xb2, 0x9e, + 0xe4, 0x88, 0xd3, 0x95, 0xa0, 0x97, 0x61, 0x8c, 0xb9, 0x01, 0xb3, 0xf2, 0x57, 0xc8, 0x9e, 0x8c, + 0x31, 0xcb, 0x24, 0xec, 0x35, 0x03, 0x83, 0x13, 0x94, 0x68, 0x01, 0x26, 0x9b, 0x6e, 0x98, 0x28, + 0x3e, 0xc0, 0x8a, 0xb3, 0x06, 0xac, 0x25, 0x91, 0x38, 0x4d, 0x6f, 0xff, 0x8c, 0x18, 0x63, 0x2f, + 0x72, 0xdf, 0x5b, 0x8e, 0xef, 0xee, 0xe5, 0xf8, 0x0d, 0x0b, 0x26, 0x68, 0xed, 0xcc, 0xb7, 0x51, + 0x0a, 0x52, 0x2a, 0x0b, 0x81, 0xd5, 0x21, 0x0b, 0xc1, 0x39, 0xba, 0x6d, 0xd7, 0xfd, 0x76, 0x24, + 0xb4, 0xa3, 0xda, 0xbe, 0x4c, 0xa1, 0x58, 0x60, 0x05, 0x1d, 0x09, 0x02, 0xf1, 0x1e, 0x5b, 0xa7, + 0x23, 0x41, 0x80, 0x05, 0x56, 0x26, 0x29, 0xe8, 0xcb, 0x4e, 0x52, 0xc0, 0x63, 0x4d, 0x0b, 0x2f, + 0x38, 0x21, 0xd2, 0x6a, 0xb1, 0xa6, 0xa5, 0x7b, 0x5c, 0x4c, 0x63, 0x7f, 0xad, 0x08, 0x23, 0x15, + 0xbf, 0x1e, 0x3b, 0x76, 0xbc, 0x60, 0x38, 0x76, 0x9c, 0x4d, 0x38, 0x76, 0x4c, 0xe8, 0xb4, 0xef, + 0xb9, 0x71, 0x7c, 0xab, 0xdc, 0x38, 0x7e, 0xdd, 0x62, 0xa3, 0xb6, 0xb8, 0x5e, 0xe5, 0xae, 0xb2, + 0xe8, 0x22, 0x0c, 0xb3, 0x1d, 0x8e, 0x05, 0x00, 0x90, 0xde, 0x0e, 0x2c, 0x69, 0xe0, 0x7a, 0x0c, + 0xc6, 0x3a, 0x0d, 0x3a, 0x0f, 0x43, 0x21, 0x71, 0x82, 0xda, 0xb6, 0xda, 0xde, 0x85, 0x6b, 0x02, + 0x87, 0x61, 0x85, 0x45, 0x6f, 0xc4, 0x61, 0x8e, 0x8b, 0xf9, 0x0f, 0x8a, 0xf5, 0xf6, 0xf0, 0x25, + 0x92, 0x1f, 0xdb, 0xd8, 0xbe, 0x01, 0x28, 0x4d, 0xdf, 0x43, 0x20, 0xce, 0xb2, 0x19, 0x88, 0xb3, + 0x94, 0x0a, 0xc2, 0xf9, 0x57, 0x16, 0x8c, 0x55, 0xfc, 0x3a, 0x5d, 0xba, 0xdf, 0x49, 0xeb, 0x54, + 0x8f, 0xf1, 0x3e, 0xd0, 0x21, 0xc6, 0xfb, 0xa3, 0xd0, 0x5f, 0xf1, 0xeb, 0x5d, 0x82, 0x85, 0xfe, + 0x4d, 0x0b, 0x06, 0x2b, 0x7e, 0xfd, 0x08, 0x0c, 0x2f, 0xaf, 0x9a, 0x86, 0x97, 0x87, 0x72, 0xe6, + 0x4d, 0x8e, 0xad, 0xe5, 0x6f, 0xf4, 0xc1, 0x28, 0x6d, 0xa7, 0xbf, 0x25, 0x87, 0xd2, 0xe8, 0x36, + 0xab, 0x87, 0x6e, 0xa3, 0xd7, 0x00, 0xbf, 0xd1, 0xf0, 0x6f, 0x25, 0x87, 0x75, 0x99, 0x41, 0xb1, + 0xc0, 0xa2, 0x67, 0x60, 0xa8, 0x15, 0x90, 0x5d, 0xd7, 0x17, 0xf2, 0xb5, 0x66, 0xc6, 0xaa, 0x08, + 0x38, 0x56, 0x14, 0xf4, 0xe2, 0x1d, 0xba, 0x1e, 0x95, 0x25, 0x6a, 0xbe, 0x57, 0xe7, 0xb6, 0x89, + 0xa2, 0x48, 0x44, 0xa4, 0xc1, 0xb1, 0x41, 0x85, 0x6e, 0x40, 0x89, 0xfd, 0x67, 0xdb, 0xce, 0xc1, + 0x53, 0xa0, 0x8b, 0xd4, 0xac, 0x82, 0x01, 0x8e, 0x79, 0xa1, 0xe7, 0x00, 0x22, 0x99, 0xcc, 0x23, + 0x14, 0x41, 0x23, 0xd5, 0x5d, 0x44, 0xa5, 0xf9, 0x08, 0xb1, 0x46, 0x85, 0x9e, 0x86, 0x52, 0xe4, + 0xb8, 0x8d, 0x55, 0xd7, 0x63, 0xf6, 0x7b, 0xda, 0x7e, 0x91, 0x21, 0x55, 0x00, 0x71, 0x8c, 0xa7, + 0xb2, 0x20, 0x0b, 0x07, 0x34, 0xbf, 0x17, 0x89, 0x64, 0x60, 0x45, 0x2e, 0x0b, 0xae, 0x2a, 0x28, + 0xd6, 0x28, 0xd0, 0x36, 0x9c, 0x72, 0x3d, 0x96, 0xb4, 0x87, 0x54, 0x77, 0xdc, 0xd6, 0xc6, 0x6a, + 0xf5, 0x3a, 0x09, 0xdc, 0xcd, 0xbd, 0x79, 0xa7, 0xb6, 0x43, 0x3c, 0x99, 0xdc, 0xfa, 0x31, 0xd1, + 0xc4, 0x53, 0x2b, 0x1d, 0x68, 0x71, 0x47, 0x4e, 0xf6, 0xf3, 0x6c, 0xbe, 0x5f, 0xad, 0xa2, 0xa7, + 0x8c, 0xad, 0xe3, 0x84, 0xbe, 0x75, 0xdc, 0xdb, 0x2f, 0x0f, 0x5c, 0xad, 0x6a, 0x31, 0x69, 0x5e, + 0x82, 0xe3, 0x15, 0xbf, 0x5e, 0xf1, 0x83, 0x68, 0xd9, 0x0f, 0x6e, 0x39, 0x41, 0x5d, 0x4e, 0xaf, + 0xb2, 0x8c, 0xca, 0x43, 0xf7, 0xcf, 0x7e, 0xbe, 0xbb, 0x18, 0x11, 0x77, 0x9e, 0x67, 0x12, 0xdb, + 0x01, 0x9f, 0x5b, 0xd6, 0x98, 0xec, 0xa0, 0xd2, 0x5e, 0x5d, 0x72, 0x22, 0x82, 0xae, 0xc2, 0x68, + 0x4d, 0x3f, 0x46, 0x45, 0xf1, 0x27, 0xe5, 0x41, 0x66, 0x9c, 0xb1, 0x99, 0xe7, 0xae, 0x59, 0xde, + 0xfe, 0xac, 0xa8, 0x84, 0x2b, 0x22, 0xb8, 0x4b, 0x6b, 0x2f, 0xf9, 0xdf, 0x65, 0x5e, 0x9c, 0x42, + 0x7e, 0xcc, 0x43, 0x6e, 0x57, 0xee, 0x98, 0x17, 0xc7, 0xfe, 0x6e, 0x38, 0x91, 0xac, 0xbe, 0xe7, + 0x24, 0xf4, 0x0b, 0x30, 0x19, 0xe8, 0x05, 0xb5, 0x24, 0x83, 0xc7, 0x79, 0x2e, 0x93, 0x04, 0x12, + 0xa7, 0xe9, 0xed, 0x17, 0x61, 0x92, 0x5e, 0x7e, 0x95, 0x20, 0xc7, 0x7a, 0xb9, 0x7b, 0x78, 0xa2, + 0xff, 0xd8, 0xcf, 0x0e, 0xa2, 0x44, 0xc6, 0x29, 0xf4, 0x49, 0x18, 0x0b, 0xc9, 0xaa, 0xeb, 0xb5, + 0x6f, 0x4b, 0xdd, 0x5a, 0x87, 0x77, 0xc6, 0xd5, 0x25, 0x9d, 0x92, 0xdf, 0x1f, 0x4c, 0x18, 0x4e, + 0x70, 0x43, 0x4d, 0x18, 0xbb, 0xe5, 0x7a, 0x75, 0xff, 0x56, 0x28, 0xf9, 0x0f, 0xe5, 0x2b, 0xea, + 0x6f, 0x70, 0xca, 0x44, 0x1b, 0x8d, 0xea, 0x6e, 0x18, 0xcc, 0x70, 0x82, 0x39, 0x5d, 0xec, 0x41, + 0xdb, 0x9b, 0x0b, 0xaf, 0x85, 0x84, 0xbf, 0x1c, 0x15, 0x8b, 0x1d, 0x4b, 0x20, 0x8e, 0xf1, 0x74, + 0xb1, 0xb3, 0x3f, 0x97, 0x02, 0xbf, 0xcd, 0xd3, 0x1b, 0x89, 0xc5, 0x8e, 0x15, 0x14, 0x6b, 0x14, + 0x74, 0x33, 0x64, 0xff, 0xd6, 0x7d, 0x0f, 0xfb, 0x7e, 0x24, 0xb7, 0x4f, 0x96, 0x9e, 0x4f, 0x83, + 0x63, 0x83, 0x0a, 0x2d, 0x03, 0x0a, 0xdb, 0xad, 0x56, 0x83, 0xb9, 0x2e, 0x3a, 0x0d, 0xc6, 0x8a, + 0xbb, 0x5d, 0x15, 0xb9, 0x77, 0x4b, 0x35, 0x85, 0xc5, 0x19, 0x25, 0xe8, 0xb9, 0xb8, 0x29, 0x9a, + 0xda, 0xcf, 0x9a, 0xca, 0x8d, 0x7a, 0x55, 0xde, 0x4e, 0x89, 0x43, 0x4b, 0x30, 0x18, 0xee, 0x85, + 0xb5, 0xa8, 0x11, 0x76, 0x4a, 0x86, 0x58, 0x65, 0x24, 0x5a, 0x2e, 0x5e, 0x5e, 0x04, 0xcb, 0xb2, + 0xa8, 0x06, 0x53, 0x82, 0xe3, 0xc2, 0xb6, 0xe3, 0xa9, 0x14, 0x6d, 0xdc, 0x7b, 0xef, 0xe2, 0xdd, + 0xfd, 0xf2, 0x94, 0xa8, 0x59, 0x47, 0xdf, 0xdb, 0x2f, 0xd3, 0xc5, 0x91, 0x81, 0xc1, 0x59, 0xdc, + 0xf8, 0xe4, 0xab, 0xd5, 0xfc, 0x66, 0xab, 0x12, 0xf8, 0x9b, 0x6e, 0x83, 0x74, 0x32, 0x8c, 0x56, + 0x0d, 0x4a, 0x31, 0xf9, 0x0c, 0x18, 0x4e, 0x70, 0xb3, 0x3f, 0xcb, 0x64, 0xc7, 0xaa, 0xbb, 0xe5, + 0x39, 0x51, 0x3b, 0x20, 0xa8, 0x09, 0xa3, 0x2d, 0xb6, 0xbb, 0x88, 0xa4, 0x43, 0x62, 0xae, 0xbf, + 0xd0, 0xa3, 0xfe, 0xeb, 0x16, 0x4b, 0x9b, 0x68, 0xf8, 0x41, 0x56, 0x74, 0x76, 0xd8, 0xe4, 0x6e, + 0xff, 0x8b, 0x93, 0x4c, 0xfa, 0xa8, 0x72, 0xa5, 0xd6, 0xa0, 0x78, 0x36, 0x26, 0xae, 0xb1, 0x33, + 0xf9, 0xea, 0xe3, 0x78, 0x58, 0xc4, 0xd3, 0x33, 0x2c, 0xcb, 0xa2, 0x4f, 0xc0, 0x18, 0xbd, 0x15, + 0x2a, 0x09, 0x20, 0x9c, 0x3e, 0x96, 0x1f, 0xde, 0x47, 0x51, 0xe9, 0x09, 0xc9, 0xf4, 0xc2, 0x38, + 0xc1, 0x0c, 0xbd, 0xc1, 0x5c, 0x03, 0x25, 0xeb, 0x42, 0x2f, 0xac, 0x75, 0x2f, 0x40, 0xc9, 0x56, + 0x63, 0x82, 0xda, 0x30, 0x95, 0x4e, 0xbb, 0x1a, 0x4e, 0xdb, 0xf9, 0xe2, 0x75, 0x3a, 0x73, 0x6a, + 0x9c, 0x39, 0x2a, 0x8d, 0x0b, 0x71, 0x16, 0x7f, 0xb4, 0x9a, 0x4c, 0x8a, 0x59, 0x34, 0x14, 0xcf, + 0xa9, 0xc4, 0x98, 0xa3, 0x1d, 0xf3, 0x61, 0x6e, 0xc1, 0x69, 0x2d, 0xaf, 0xe0, 0xa5, 0xc0, 0x61, + 0xae, 0x29, 0x2e, 0xdb, 0x4e, 0x35, 0xb9, 0xe8, 0x91, 0xbb, 0xfb, 0xe5, 0xd3, 0x1b, 0x9d, 0x08, + 0x71, 0x67, 0x3e, 0xe8, 0x2a, 0x1c, 0xe7, 0xc1, 0x29, 0x16, 0x89, 0x53, 0x6f, 0xb8, 0x9e, 0x12, + 0xbc, 0xf8, 0x92, 0x3f, 0x79, 0x77, 0xbf, 0x7c, 0x7c, 0x2e, 0x8b, 0x00, 0x67, 0x97, 0x43, 0xaf, + 0x42, 0xa9, 0xee, 0x85, 0xa2, 0x0f, 0x06, 0x8c, 0xd4, 0x8d, 0xa5, 0xc5, 0xf5, 0xaa, 0xfa, 0xfe, + 0xf8, 0x0f, 0x8e, 0x0b, 0xa0, 0x2d, 0x6e, 0xf9, 0x50, 0xea, 0xaa, 0xc1, 0x54, 0xcc, 0xc2, 0xa4, + 0x46, 0xd7, 0x78, 0x9e, 0xce, 0x4d, 0x7e, 0xea, 0xd5, 0x96, 0xf1, 0x72, 0xdd, 0x60, 0x8c, 0x5e, + 0x07, 0x24, 0x52, 0x84, 0xcc, 0xd5, 0x58, 0x46, 0x2b, 0xcd, 0x1d, 0x51, 0xdd, 0x42, 0xab, 0x29, + 0x0a, 0x9c, 0x51, 0x0a, 0x5d, 0xa6, 0xbb, 0x8a, 0x0e, 0x15, 0xbb, 0x96, 0x4a, 0x10, 0xbc, 0x48, + 0x5a, 0x01, 0x61, 0x1e, 0x74, 0x26, 0x47, 0x9c, 0x28, 0x87, 0xea, 0x70, 0xca, 0x69, 0x47, 0x3e, + 0x33, 0x2a, 0x99, 0xa4, 0x1b, 0xfe, 0x0e, 0xf1, 0x98, 0x3d, 0x77, 0x88, 0xc5, 0x42, 0x3c, 0x35, + 0xd7, 0x81, 0x0e, 0x77, 0xe4, 0x42, 0x25, 0x72, 0x99, 0xf3, 0x5f, 0xd8, 0x7b, 0x8c, 0x97, 0xb6, + 0xdc, 0x08, 0x2a, 0x29, 0xd0, 0x8b, 0x30, 0xbc, 0xed, 0x87, 0xd1, 0x3a, 0x89, 0x6e, 0xf9, 0xc1, + 0x8e, 0x88, 0x49, 0x1e, 0xe7, 0x81, 0x88, 0x51, 0x58, 0xa7, 0xa3, 0x57, 0x6e, 0xe6, 0x6d, 0xb4, + 0xb2, 0xc8, 0x1c, 0x3d, 0x86, 0xe2, 0x3d, 0xe6, 0x32, 0x07, 0x63, 0x89, 0x97, 0xa4, 0x2b, 0x95, + 0x05, 0xe6, 0xb4, 0x91, 0x20, 0x5d, 0xa9, 0x2c, 0x60, 0x89, 0xa7, 0xd3, 0x35, 0xdc, 0x76, 0x02, + 0x52, 0x09, 0xfc, 0x1a, 0x09, 0xb5, 0xec, 0x23, 0x0f, 0xf3, 0x88, 0xeb, 0x74, 0xba, 0x56, 0xb3, + 0x08, 0x70, 0x76, 0x39, 0x44, 0xd2, 0x39, 0x35, 0xc7, 0xf2, 0xad, 0x6d, 0x69, 0x79, 0xa6, 0xc7, + 0xb4, 0x9a, 0x1e, 0x4c, 0xa8, 0x6c, 0x9e, 0x3c, 0xc6, 0x7a, 0x38, 0x3d, 0xce, 0xe6, 0x76, 0xef, + 0x01, 0xda, 0x95, 0xfd, 0x72, 0x25, 0xc1, 0x09, 0xa7, 0x78, 0x1b, 0xc1, 0x36, 0x27, 0xba, 0x06, + 0xdb, 0xbc, 0x00, 0xa5, 0xb0, 0x7d, 0xb3, 0xee, 0x37, 0x1d, 0xd7, 0x63, 0x4e, 0x1b, 0xda, 0xdd, + 0xaf, 0x2a, 0x11, 0x38, 0xa6, 0x41, 0xcb, 0x30, 0xe4, 0x48, 0xe3, 0x24, 0xca, 0x8f, 0x23, 0xa6, + 0x4c, 0x92, 0x3c, 0xb4, 0x8e, 0x34, 0x47, 0xaa, 0xb2, 0xe8, 0x15, 0x18, 0x15, 0xc1, 0x15, 0x44, + 0x02, 0xec, 0x29, 0xf3, 0x05, 0x6c, 0x55, 0x47, 0x62, 0x93, 0x16, 0x5d, 0x83, 0xe1, 0xc8, 0x6f, + 0xb0, 0x67, 0x9c, 0x54, 0xcc, 0x3b, 0x91, 0x1f, 0xee, 0x73, 0x43, 0x91, 0xe9, 0x6a, 0x73, 0x55, + 0x14, 0xeb, 0x7c, 0xd0, 0x06, 0x9f, 0xef, 0x2c, 0xd7, 0x08, 0x09, 0x45, 0x06, 0xe5, 0xd3, 0x79, + 0x1e, 0x77, 0x8c, 0xcc, 0x5c, 0x0e, 0xa2, 0x24, 0xd6, 0xd9, 0xa0, 0x4b, 0x30, 0xd9, 0x0a, 0x5c, + 0x9f, 0xcd, 0x09, 0x65, 0x6c, 0x9d, 0x36, 0x33, 0x0b, 0x56, 0x92, 0x04, 0x38, 0x5d, 0x86, 0xc5, + 0xc6, 0x10, 0xc0, 0xe9, 0x93, 0x3c, 0x3b, 0x12, 0xbf, 0x4a, 0x73, 0x18, 0x56, 0x58, 0xb4, 0xc6, + 0x76, 0x62, 0xae, 0x05, 0x9a, 0x9e, 0xc9, 0x0f, 0x5d, 0xa6, 0x6b, 0x8b, 0xb8, 0xf0, 0xaa, 0xfe, + 0xe2, 0x98, 0x03, 0xaa, 0x6b, 0x49, 0x89, 0xe9, 0x15, 0x20, 0x9c, 0x3e, 0xd5, 0xc1, 0xe5, 0x33, + 0x71, 0x2b, 0x8b, 0x05, 0x02, 0x03, 0x1c, 0xe2, 0x04, 0x4f, 0xf4, 0x11, 0x98, 0x10, 0x71, 0x68, + 0xe3, 0x6e, 0x3a, 0x1d, 0x3f, 0x8b, 0xc1, 0x09, 0x1c, 0x4e, 0x51, 0xf3, 0xec, 0x44, 0xce, 0xcd, + 0x06, 0x11, 0x5b, 0xdf, 0xaa, 0xeb, 0xed, 0x84, 0xd3, 0x67, 0xd8, 0xfe, 0x20, 0xb2, 0x13, 0x25, + 0xb1, 0x38, 0xa3, 0x04, 0xda, 0x80, 0x89, 0x56, 0x40, 0x48, 0x93, 0x09, 0xfa, 0xe2, 0x3c, 0x2b, + 0xf3, 0xd0, 0x30, 0xb4, 0x25, 0x95, 0x04, 0xee, 0x5e, 0x06, 0x0c, 0xa7, 0x38, 0xa0, 0x5b, 0x30, + 0xe4, 0xef, 0x92, 0x60, 0x9b, 0x38, 0xf5, 0xe9, 0xb3, 0x1d, 0x1e, 0x6b, 0x89, 0xc3, 0xed, 0xaa, + 0xa0, 0x4d, 0xf8, 0xb2, 0x48, 0x70, 0x77, 0x5f, 0x16, 0x59, 0x19, 0xfa, 0x3f, 0x2d, 0x38, 0x29, + 0xad, 0x43, 0xd5, 0x16, 0xed, 0xf5, 0x05, 0xdf, 0x0b, 0xa3, 0x80, 0x07, 0x33, 0x79, 0x24, 0x3f, + 0xc0, 0xc7, 0x46, 0x4e, 0x21, 0xa5, 0x88, 0x3e, 0x99, 0x47, 0x11, 0xe2, 0xfc, 0x1a, 0xe9, 0xd5, + 0x34, 0x24, 0x91, 0xdc, 0x8c, 0xe6, 0xc2, 0xe5, 0x37, 0x16, 0xd7, 0xa7, 0x1f, 0xe5, 0x91, 0x58, + 0xe8, 0x62, 0xa8, 0x26, 0x91, 0x38, 0x4d, 0x8f, 0x2e, 0x42, 0xc1, 0x0f, 0xa7, 0x1f, 0xeb, 0x90, + 0xc7, 0xda, 0xaf, 0x5f, 0xad, 0x72, 0x9f, 0xc6, 0xab, 0x55, 0x5c, 0xf0, 0x43, 0x99, 0x21, 0x88, + 0xde, 0xc7, 0xc2, 0xe9, 0xc7, 0xb9, 0xda, 0x52, 0x66, 0x08, 0x62, 0x40, 0x1c, 0xe3, 0xd1, 0x36, + 0x8c, 0x87, 0xc6, 0xbd, 0x37, 0x9c, 0x3e, 0xc7, 0x7a, 0xea, 0xf1, 0xbc, 0x41, 0x33, 0xa8, 0xb5, + 0xd4, 0x1d, 0x26, 0x17, 0x9c, 0x64, 0xcb, 0x57, 0x97, 0x76, 0xf3, 0x0e, 0xa7, 0x9f, 0xe8, 0xb2, + 0xba, 0x34, 0x62, 0x7d, 0x75, 0xe9, 0x3c, 0x70, 0x82, 0xe7, 0xcc, 0x77, 0xc1, 0x64, 0x4a, 0x5c, + 0x3a, 0x88, 0xff, 0xfe, 0xcc, 0x0e, 0x8c, 0x1a, 0x53, 0xf2, 0x81, 0xba, 0x77, 0xfc, 0x76, 0x09, + 0x4a, 0xca, 0xec, 0x8e, 0x2e, 0x98, 0x1e, 0x1d, 0x27, 0x93, 0x1e, 0x1d, 0x43, 0x15, 0xbf, 0x6e, + 0x38, 0x71, 0x6c, 0x64, 0xc4, 0xeb, 0xcc, 0xdb, 0x00, 0x7b, 0x7f, 0x64, 0xa4, 0x99, 0x12, 0x8a, + 0x3d, 0xbb, 0x86, 0xf4, 0x75, 0xb4, 0x4e, 0x5c, 0x82, 0x49, 0xcf, 0x67, 0x32, 0x3a, 0xa9, 0x4b, + 0x01, 0x8c, 0xc9, 0x59, 0x25, 0x3d, 0x00, 0x56, 0x82, 0x00, 0xa7, 0xcb, 0xd0, 0x0a, 0xb9, 0xa0, + 0x94, 0x34, 0x87, 0x70, 0x39, 0x0a, 0x0b, 0x2c, 0xbd, 0x1b, 0xf2, 0x5f, 0xe1, 0xf4, 0x44, 0xfe, + 0xdd, 0x90, 0x17, 0x4a, 0x0a, 0x63, 0xa1, 0x14, 0xc6, 0x98, 0xf6, 0xbf, 0xe5, 0xd7, 0x57, 0x2a, + 0x42, 0xcc, 0xd7, 0x22, 0x69, 0xd7, 0x57, 0x2a, 0x98, 0xe3, 0xd0, 0x1c, 0x0c, 0xb0, 0x1f, 0xe1, + 0xf4, 0x48, 0x7e, 0xc0, 0x24, 0x56, 0x42, 0xcb, 0x50, 0xc8, 0x0a, 0x60, 0x51, 0x90, 0x69, 0x77, + 0xe9, 0xdd, 0x88, 0x69, 0x77, 0x07, 0xef, 0x53, 0xbb, 0x2b, 0x19, 0xe0, 0x98, 0x17, 0xba, 0x0d, + 0xc7, 0x8d, 0xfb, 0xa8, 0x7a, 0x75, 0x05, 0xf9, 0x86, 0xdf, 0x04, 0xf1, 0xfc, 0x69, 0xd1, 0xe8, + 0xe3, 0x2b, 0x59, 0x9c, 0x70, 0x76, 0x05, 0xa8, 0x01, 0x93, 0xb5, 0x54, 0xad, 0x43, 0xbd, 0xd7, + 0xaa, 0xe6, 0x45, 0xba, 0xc6, 0x34, 0x63, 0xf4, 0x0a, 0x0c, 0xbd, 0xed, 0x73, 0x27, 0x2d, 0x71, + 0x35, 0x91, 0x11, 0x3f, 0x86, 0xde, 0xb8, 0x5a, 0x65, 0xf0, 0x7b, 0xfb, 0xe5, 0xe1, 0x8a, 0x5f, + 0x97, 0x7f, 0xb1, 0x2a, 0x80, 0x7e, 0xc0, 0x82, 0x99, 0xf4, 0x85, 0x57, 0x35, 0x7a, 0xb4, 0xf7, + 0x46, 0xdb, 0xa2, 0xd2, 0x99, 0xa5, 0x5c, 0x76, 0xb8, 0x43, 0x55, 0xe8, 0x43, 0x74, 0x3d, 0x85, + 0xee, 0x1d, 0x22, 0xd2, 0x3b, 0x3f, 0x12, 0xaf, 0x27, 0x0a, 0xbd, 0xb7, 0x5f, 0x1e, 0xe7, 0x3b, + 0xa3, 0x7b, 0x47, 0xc5, 0xfc, 0xe6, 0x05, 0xd0, 0x77, 0xc3, 0xf1, 0x20, 0xad, 0x41, 0x25, 0x52, + 0x08, 0x7f, 0xaa, 0x97, 0x5d, 0x36, 0x39, 0xe0, 0x38, 0x8b, 0x21, 0xce, 0xae, 0xc7, 0xfe, 0x15, + 0x8b, 0xe9, 0xb7, 0x45, 0xb3, 0x48, 0xd8, 0x6e, 0x1c, 0x45, 0x52, 0xf9, 0x25, 0xc3, 0x76, 0x7c, + 0xdf, 0x9e, 0x4d, 0xff, 0xd8, 0x62, 0x9e, 0x4d, 0x47, 0xf8, 0x46, 0xeb, 0x0d, 0x18, 0x8a, 0x64, + 0xb2, 0xff, 0x0e, 0x79, 0xf0, 0xb5, 0x46, 0x31, 0xef, 0x2e, 0x75, 0xc9, 0x51, 0x79, 0xfd, 0x15, + 0x1b, 0xfb, 0x1f, 0xf0, 0x11, 0x90, 0x98, 0x23, 0x30, 0xd1, 0x2d, 0x9a, 0x26, 0xba, 0x72, 0x97, + 0x2f, 0xc8, 0x31, 0xd5, 0xfd, 0x7d, 0xb3, 0xdd, 0x4c, 0xb9, 0xf7, 0x6e, 0x77, 0xa9, 0xb3, 0xbf, + 0x60, 0x01, 0xc4, 0x49, 0x16, 0x7a, 0x48, 0xe7, 0xfa, 0x12, 0xbd, 0xd6, 0xf8, 0x91, 0x5f, 0xf3, + 0x1b, 0xc2, 0x40, 0x71, 0x2a, 0xb6, 0x12, 0x72, 0xf8, 0x3d, 0xed, 0x37, 0x56, 0xd4, 0xa8, 0x2c, + 0xa3, 0x9e, 0x16, 0x63, 0xbb, 0xb5, 0x11, 0xf1, 0xf4, 0xcb, 0x16, 0x1c, 0xcb, 0x72, 0xf8, 0xa7, + 0x97, 0x64, 0xae, 0xe6, 0x54, 0xee, 0x8e, 0x6a, 0x34, 0xaf, 0x0b, 0x38, 0x56, 0x14, 0x3d, 0xe7, + 0xc9, 0x3d, 0x58, 0x02, 0x80, 0xab, 0x30, 0x5a, 0x09, 0x88, 0x26, 0x5f, 0xbc, 0xc6, 0x23, 0xe9, + 0xf0, 0xf6, 0x3c, 0x73, 0xe0, 0x28, 0x3a, 0xf6, 0x57, 0x0a, 0x70, 0x8c, 0x3b, 0xed, 0xcc, 0xed, + 0xfa, 0x6e, 0xbd, 0xe2, 0xd7, 0xc5, 0x33, 0xcd, 0x37, 0x61, 0xa4, 0xa5, 0xe9, 0xa6, 0x3b, 0x05, + 0xb3, 0xd6, 0x75, 0xd8, 0xb1, 0x36, 0x4d, 0x87, 0x62, 0x83, 0x17, 0xaa, 0xc3, 0x08, 0xd9, 0x75, + 0x6b, 0xca, 0xf3, 0xa3, 0x70, 0xe0, 0x43, 0x5a, 0xd5, 0xb2, 0xa4, 0xf1, 0xc1, 0x06, 0xd7, 0x9e, + 0x5d, 0x6d, 0x35, 0x11, 0xad, 0xaf, 0x8b, 0xb7, 0xc7, 0x8f, 0x5a, 0xf0, 0x50, 0x4e, 0xe8, 0x6b, + 0x5a, 0xdd, 0x2d, 0xe6, 0x1e, 0x25, 0xa6, 0xad, 0xaa, 0x8e, 0x3b, 0x4d, 0x61, 0x81, 0x45, 0x1f, + 0x05, 0xe0, 0x4e, 0x4f, 0xc4, 0xab, 0x75, 0x8d, 0x11, 0x6c, 0x84, 0x37, 0xd5, 0x22, 0x55, 0xca, + 0xf2, 0x58, 0xe3, 0x65, 0x7f, 0xb9, 0x0f, 0xfa, 0x99, 0x93, 0x0d, 0xaa, 0xc0, 0xe0, 0x36, 0xcf, + 0x12, 0xd7, 0x71, 0xdc, 0x28, 0xad, 0x4c, 0x3c, 0x17, 0x8f, 0x9b, 0x06, 0xc5, 0x92, 0x0d, 0x5a, + 0x83, 0x29, 0x9e, 0xac, 0xaf, 0xb1, 0x48, 0x1a, 0xce, 0x9e, 0x54, 0xfb, 0xf2, 0xfc, 0xf3, 0x4a, + 0xfd, 0xbd, 0x92, 0x26, 0xc1, 0x59, 0xe5, 0xd0, 0x6b, 0x30, 0x46, 0xaf, 0xe1, 0x7e, 0x3b, 0x92, + 0x9c, 0x78, 0x9a, 0x3e, 0x75, 0x33, 0xd9, 0x30, 0xb0, 0x38, 0x41, 0x8d, 0x5e, 0x81, 0xd1, 0x56, + 0x4a, 0xc1, 0xdd, 0x1f, 0x6b, 0x82, 0x4c, 0xa5, 0xb6, 0x49, 0xcb, 0x7c, 0xfe, 0xdb, 0xec, 0x85, + 0xc3, 0xc6, 0x76, 0x40, 0xc2, 0x6d, 0xbf, 0x51, 0x67, 0x12, 0x70, 0xbf, 0xe6, 0xf3, 0x9f, 0xc0, + 0xe3, 0x54, 0x09, 0xca, 0x65, 0xd3, 0x71, 0x1b, 0xed, 0x80, 0xc4, 0x5c, 0x06, 0x4c, 0x2e, 0xcb, + 0x09, 0x3c, 0x4e, 0x95, 0xe8, 0xae, 0xb9, 0x1f, 0x3c, 0x1c, 0xcd, 0xbd, 0xfd, 0xb7, 0x0a, 0x60, + 0x0c, 0xed, 0x77, 0x70, 0xfa, 0xc0, 0x57, 0xa1, 0x6f, 0x2b, 0x68, 0xd5, 0x84, 0x43, 0x59, 0xe6, + 0x97, 0xc5, 0xb9, 0xc3, 0xf9, 0x97, 0xd1, 0xff, 0x98, 0x95, 0xa2, 0x6b, 0xfc, 0x78, 0x25, 0xf0, + 0xe9, 0x21, 0x27, 0x63, 0x2d, 0xaa, 0xa7, 0x35, 0x83, 0x32, 0x48, 0x44, 0x87, 0xa8, 0xc4, 0xe2, + 0x7d, 0x00, 0xe7, 0x60, 0xf8, 0x5e, 0x55, 0x45, 0x28, 0x18, 0xc9, 0x05, 0x5d, 0x84, 0x61, 0x91, + 0xd1, 0x8d, 0xbd, 0x00, 0xe1, 0x8b, 0x89, 0xf9, 0x8a, 0x2d, 0xc6, 0x60, 0xac, 0xd3, 0xd8, 0x3f, + 0x58, 0x80, 0xa9, 0x8c, 0x27, 0x7c, 0xfc, 0x18, 0xd9, 0x72, 0xc3, 0x48, 0xa5, 0x27, 0xd7, 0x8e, + 0x11, 0x0e, 0xc7, 0x8a, 0x82, 0xee, 0x55, 0xfc, 0xa0, 0x4a, 0x1e, 0x4e, 0xe2, 0x89, 0x8c, 0xc0, + 0x1e, 0x30, 0xd1, 0xf7, 0x59, 0xe8, 0x6b, 0x87, 0x44, 0xc6, 0x13, 0x57, 0xc7, 0x36, 0x33, 0x6b, + 0x33, 0x0c, 0xbd, 0x02, 0x6e, 0x29, 0x0b, 0xb1, 0x76, 0x05, 0xe4, 0x36, 0x62, 0x8e, 0xa3, 0x8d, + 0x8b, 0x88, 0xe7, 0x78, 0x91, 0xb8, 0x28, 0xc6, 0x81, 0x71, 0x19, 0x14, 0x0b, 0xac, 0xfd, 0xa5, + 0x22, 0x9c, 0xcc, 0x7d, 0xd4, 0x4b, 0x9b, 0xde, 0xf4, 0x3d, 0x37, 0xf2, 0x95, 0x13, 0x1e, 0x0f, + 0x86, 0x4b, 0x5a, 0xdb, 0x6b, 0x02, 0x8e, 0x15, 0x05, 0x3a, 0x07, 0xfd, 0x4c, 0x29, 0x9e, 0x4a, + 0xd4, 0x3e, 0xbf, 0xc8, 0xa3, 0x23, 0x72, 0xb4, 0x76, 0xaa, 0x17, 0x3b, 0x9e, 0xea, 0x8f, 0x52, + 0x09, 0xc6, 0x6f, 0x24, 0x0f, 0x14, 0xda, 0x5c, 0xdf, 0x6f, 0x60, 0x86, 0x44, 0x8f, 0x8b, 0xfe, + 0x4a, 0x78, 0x9d, 0x61, 0xa7, 0xee, 0x87, 0x5a, 0xa7, 0x3d, 0x09, 0x83, 0x3b, 0x64, 0x2f, 0x70, + 0xbd, 0xad, 0xa4, 0x37, 0xe2, 0x15, 0x0e, 0xc6, 0x12, 0x6f, 0xe6, 0x0c, 0x1e, 0x3c, 0x8c, 0x9c, + 0xc1, 0xfa, 0x0c, 0x18, 0xea, 0x2a, 0x9e, 0xfc, 0x50, 0x11, 0xc6, 0xf1, 0xfc, 0xe2, 0x7b, 0x03, + 0x71, 0x2d, 0x3d, 0x10, 0x87, 0x91, 0x5a, 0xf7, 0x60, 0xa3, 0xf1, 0x8b, 0x16, 0x8c, 0xb3, 0xbc, + 0x72, 0x22, 0x22, 0x87, 0xeb, 0x7b, 0x47, 0x70, 0x15, 0x78, 0x14, 0xfa, 0x03, 0x5a, 0x69, 0x32, + 0x43, 0x3b, 0x6b, 0x09, 0xe6, 0x38, 0x74, 0x0a, 0xfa, 0x58, 0x13, 0xe8, 0xe0, 0x8d, 0xf0, 0x2d, + 0x78, 0xd1, 0x89, 0x1c, 0xcc, 0xa0, 0x2c, 0x36, 0x20, 0x26, 0xad, 0x86, 0xcb, 0x1b, 0x1d, 0xbb, + 0x2c, 0xbc, 0x3b, 0xc2, 0x7d, 0x64, 0x36, 0xed, 0x9d, 0xc5, 0x06, 0xcc, 0x66, 0xd9, 0xf9, 0x9a, + 0xfd, 0xe7, 0x05, 0x38, 0x93, 0x59, 0xae, 0xe7, 0xd8, 0x80, 0x9d, 0x4b, 0x3f, 0xc8, 0x14, 0x59, + 0xc5, 0x23, 0xf4, 0xf5, 0xee, 0xeb, 0x55, 0xfa, 0xef, 0xef, 0x21, 0x64, 0x5f, 0x66, 0x97, 0xbd, + 0x4b, 0x42, 0xf6, 0x65, 0xb6, 0x2d, 0x47, 0x4d, 0xf0, 0xd7, 0x85, 0x9c, 0x6f, 0x61, 0x0a, 0x83, + 0xf3, 0x74, 0x9f, 0x61, 0xc8, 0x50, 0x5e, 0xc2, 0xf9, 0x1e, 0xc3, 0x61, 0x58, 0x61, 0xd1, 0x1c, + 0x8c, 0x37, 0x5d, 0x8f, 0x6e, 0x3e, 0x7b, 0xa6, 0x28, 0xae, 0x6c, 0x19, 0x6b, 0x26, 0x1a, 0x27, + 0xe9, 0x91, 0xab, 0x85, 0xf3, 0xe3, 0x5f, 0xf7, 0xca, 0x81, 0x56, 0xdd, 0xac, 0xe9, 0xce, 0xa1, + 0x7a, 0x31, 0x23, 0xb4, 0xdf, 0x9a, 0xa6, 0x27, 0x2a, 0xf6, 0xae, 0x27, 0x1a, 0xc9, 0xd6, 0x11, + 0xcd, 0xbc, 0x02, 0xa3, 0xf7, 0x6d, 0x1b, 0xb1, 0xbf, 0x51, 0x84, 0x87, 0x3b, 0x2c, 0x7b, 0xbe, + 0xd7, 0x1b, 0x63, 0xa0, 0xed, 0xf5, 0xa9, 0x71, 0xa8, 0xc0, 0xb1, 0xcd, 0x76, 0xa3, 0xb1, 0xc7, + 0x1e, 0x35, 0x91, 0xba, 0xa4, 0x10, 0x32, 0xa5, 0x54, 0x8e, 0x1c, 0x5b, 0xce, 0xa0, 0xc1, 0x99, + 0x25, 0xe9, 0x15, 0x8b, 0x9e, 0x24, 0x7b, 0x8a, 0x55, 0xe2, 0x8a, 0x85, 0x75, 0x24, 0x36, 0x69, + 0xd1, 0x25, 0x98, 0x74, 0x76, 0x1d, 0x97, 0xe7, 0x44, 0x90, 0x0c, 0xf8, 0x1d, 0x4b, 0xe9, 0xa2, + 0xe7, 0x92, 0x04, 0x38, 0x5d, 0x06, 0xbd, 0x0e, 0xc8, 0xbf, 0xc9, 0x1e, 0x4a, 0xd4, 0x2f, 0x11, + 0x4f, 0x58, 0xdd, 0xd9, 0xd8, 0x15, 0xe3, 0x2d, 0xe1, 0x6a, 0x8a, 0x02, 0x67, 0x94, 0x4a, 0x04, + 0x96, 0x1b, 0xc8, 0x0f, 0x2c, 0xd7, 0x79, 0x5f, 0xec, 0x9a, 0x9d, 0xed, 0x22, 0x8c, 0x1e, 0xd0, + 0xfd, 0xd7, 0xfe, 0xb7, 0x16, 0x28, 0x05, 0xb1, 0x19, 0x18, 0xfa, 0x15, 0xe6, 0x9f, 0xcc, 0x55, + 0xdb, 0x5a, 0x2c, 0xa8, 0xe3, 0x9a, 0x7f, 0x72, 0x8c, 0xc4, 0x26, 0x2d, 0x9f, 0x43, 0x9a, 0x5f, + 0xb1, 0x71, 0x2b, 0x10, 0x71, 0x2b, 0x15, 0x05, 0xfa, 0x18, 0x0c, 0xd6, 0xdd, 0x5d, 0x37, 0x14, + 0xca, 0xb1, 0x03, 0x1b, 0xe3, 0xe2, 0xad, 0x73, 0x91, 0xb3, 0xc1, 0x92, 0x9f, 0xfd, 0x43, 0x85, + 0xb8, 0x4f, 0xde, 0x68, 0xfb, 0x91, 0x73, 0x04, 0x27, 0xf9, 0x25, 0xe3, 0x24, 0x7f, 0x3c, 0x7b, + 0xa0, 0xb5, 0x26, 0xe5, 0x9e, 0xe0, 0x57, 0x13, 0x27, 0xf8, 0x13, 0xdd, 0x59, 0x75, 0x3e, 0xb9, + 0xff, 0xa1, 0x05, 0x93, 0x06, 0xfd, 0x11, 0x1c, 0x20, 0xcb, 0xe6, 0x01, 0xf2, 0x48, 0xd7, 0x6f, + 0xc8, 0x39, 0x38, 0xbe, 0xbf, 0x98, 0x68, 0x3b, 0x3b, 0x30, 0xde, 0x86, 0xbe, 0x6d, 0x27, 0xa8, + 0x77, 0x4a, 0x59, 0x94, 0x2a, 0x34, 0x7b, 0xd9, 0x09, 0x84, 0xa7, 0xc2, 0x33, 0xb2, 0xd7, 0x29, + 0xa8, 0xab, 0x97, 0x02, 0xab, 0x0a, 0xbd, 0x04, 0x03, 0x61, 0xcd, 0x6f, 0xa9, 0x37, 0x53, 0x2c, + 0xe5, 0x6f, 0x95, 0x41, 0xee, 0xed, 0x97, 0x91, 0x59, 0x1d, 0x05, 0x63, 0x41, 0x8f, 0xde, 0x84, + 0x51, 0xf6, 0x4b, 0xb9, 0x0d, 0x16, 0xf3, 0x35, 0x18, 0x55, 0x9d, 0x90, 0xfb, 0xd4, 0x1a, 0x20, + 0x6c, 0xb2, 0x9a, 0xd9, 0x82, 0x92, 0xfa, 0xac, 0x07, 0x6a, 0xed, 0xfe, 0x57, 0x45, 0x98, 0xca, + 0x98, 0x73, 0x28, 0x34, 0x46, 0xe2, 0x62, 0x8f, 0x53, 0xf5, 0x1d, 0x8e, 0x45, 0xc8, 0x2e, 0x50, + 0x75, 0x31, 0xb7, 0x7a, 0xae, 0xf4, 0x5a, 0x48, 0x92, 0x95, 0x52, 0x50, 0xf7, 0x4a, 0x69, 0x65, + 0x47, 0xd6, 0xd5, 0xb4, 0x22, 0xd5, 0xd2, 0x07, 0x3a, 0xa6, 0xbf, 0xde, 0x07, 0xc7, 0xb2, 0xe2, + 0x09, 0xa3, 0xcf, 0x24, 0xf2, 0x88, 0xbf, 0xd0, 0xa9, 0x87, 0xf5, 0x92, 0x3c, 0xb9, 0xb8, 0x08, + 0xe3, 0x39, 0x6b, 0x66, 0x16, 0xef, 0xda, 0xcd, 0xa2, 0x4e, 0x16, 0x5e, 0x27, 0xe0, 0xf9, 0xdf, + 0xe5, 0xf6, 0xf1, 0x81, 0x9e, 0x1b, 0x20, 0x12, 0xc7, 0x87, 0x09, 0x97, 0x24, 0x09, 0xee, 0xee, + 0x92, 0x24, 0x6b, 0x46, 0x2b, 0x30, 0x50, 0xe3, 0xbe, 0x2e, 0xc5, 0xee, 0x5b, 0x18, 0x77, 0x74, + 0x51, 0x1b, 0xb0, 0x70, 0x70, 0x11, 0x0c, 0x66, 0x5c, 0x18, 0xd6, 0x3a, 0xe6, 0x81, 0x4e, 0x9e, + 0x1d, 0x7a, 0xf0, 0x69, 0x5d, 0xf0, 0x40, 0x27, 0xd0, 0x8f, 0x5a, 0x90, 0x78, 0xf0, 0xa2, 0x94, + 0x72, 0x56, 0xae, 0x52, 0xee, 0x2c, 0xf4, 0x05, 0x7e, 0x83, 0x24, 0x93, 0x54, 0x63, 0xbf, 0x41, + 0x30, 0xc3, 0x50, 0x8a, 0x28, 0x56, 0xb5, 0x8c, 0xe8, 0xd7, 0x48, 0x71, 0x41, 0x7c, 0x14, 0xfa, + 0x1b, 0x64, 0x97, 0x34, 0x92, 0xb9, 0x04, 0x57, 0x29, 0x10, 0x73, 0x9c, 0xfd, 0x8b, 0x7d, 0x70, + 0xba, 0x63, 0xac, 0x2b, 0x7a, 0x19, 0xdb, 0x72, 0x22, 0x72, 0xcb, 0xd9, 0x4b, 0x26, 0xfd, 0xba, + 0xc4, 0xc1, 0x58, 0xe2, 0xd9, 0xf3, 0x4f, 0x9e, 0xbb, 0x23, 0xa1, 0xc2, 0x14, 0x29, 0x3b, 0x04, + 0xd6, 0x54, 0x89, 0x15, 0x0f, 0x43, 0x25, 0xf6, 0x1c, 0x40, 0x18, 0x36, 0xb8, 0x5b, 0x60, 0x5d, + 0xbc, 0x2b, 0x8d, 0x73, 0xbc, 0x54, 0x57, 0x05, 0x06, 0x6b, 0x54, 0x68, 0x11, 0x26, 0x5a, 0x81, + 0x1f, 0x71, 0x8d, 0xf0, 0x22, 0xf7, 0x9c, 0xed, 0x37, 0xc3, 0x0c, 0x55, 0x12, 0x78, 0x9c, 0x2a, + 0x81, 0x5e, 0x84, 0x61, 0x11, 0x7a, 0xa8, 0xe2, 0xfb, 0x0d, 0xa1, 0x84, 0x52, 0xce, 0xa4, 0xd5, + 0x18, 0x85, 0x75, 0x3a, 0xad, 0x18, 0x53, 0x33, 0x0f, 0x66, 0x16, 0xe3, 0xaa, 0x66, 0x8d, 0x2e, + 0x11, 0xa6, 0x7c, 0xa8, 0xa7, 0x30, 0xe5, 0xb1, 0x5a, 0xae, 0xd4, 0xb3, 0xd5, 0x13, 0xba, 0x2a, + 0xb2, 0xbe, 0xda, 0x07, 0x53, 0x62, 0xe2, 0x3c, 0xe8, 0xe9, 0x72, 0x2d, 0x3d, 0x5d, 0x0e, 0x43, + 0x71, 0xf7, 0xde, 0x9c, 0x39, 0xea, 0x39, 0xf3, 0xc3, 0x16, 0x98, 0x92, 0x1a, 0xfa, 0xdf, 0x73, + 0xb3, 0x26, 0xbe, 0x98, 0x2b, 0xf9, 0xc5, 0x31, 0x8c, 0xdf, 0x59, 0xfe, 0x44, 0xfb, 0x5f, 0x5b, + 0xf0, 0x48, 0x57, 0x8e, 0x68, 0x09, 0x4a, 0x4c, 0x9c, 0xd4, 0x2e, 0x7a, 0x4f, 0x28, 0xcf, 0x7a, + 0x89, 0xc8, 0x91, 0x6e, 0xe3, 0x92, 0x68, 0x29, 0x95, 0x9e, 0xf2, 0xc9, 0x8c, 0xf4, 0x94, 0xc7, + 0x8d, 0xee, 0xb9, 0xcf, 0xfc, 0x94, 0x5f, 0xa4, 0x27, 0x8e, 0xf1, 0xaa, 0x0d, 0x7d, 0xc0, 0x50, + 0x3a, 0xda, 0x09, 0xa5, 0x23, 0x32, 0xa9, 0xb5, 0x33, 0xe4, 0x23, 0x30, 0xc1, 0x62, 0x12, 0xb2, + 0x77, 0x1e, 0xe2, 0xbd, 0x5d, 0x21, 0xf6, 0xe5, 0x5e, 0x4d, 0xe0, 0x70, 0x8a, 0xda, 0xfe, 0xd3, + 0x22, 0x0c, 0xf0, 0xe5, 0x77, 0x04, 0xd7, 0xcb, 0xa7, 0xa1, 0xe4, 0x36, 0x9b, 0x6d, 0x9e, 0x71, + 0xb0, 0x3f, 0xf6, 0x0c, 0x5e, 0x91, 0x40, 0x1c, 0xe3, 0xd1, 0xb2, 0xd0, 0x77, 0x77, 0x08, 0x7b, + 0xcc, 0x1b, 0x3e, 0xbb, 0xe8, 0x44, 0x0e, 0x97, 0x95, 0xd4, 0x39, 0x1b, 0x6b, 0xc6, 0xd1, 0x27, + 0x01, 0xc2, 0x28, 0x70, 0xbd, 0x2d, 0x0a, 0x13, 0xb1, 0xf1, 0x9f, 0xea, 0xc0, 0xad, 0xaa, 0x88, + 0x39, 0xcf, 0x78, 0xcf, 0x51, 0x08, 0xac, 0x71, 0x44, 0xb3, 0xc6, 0x49, 0x3f, 0x93, 0x18, 0x3b, + 0xe0, 0x5c, 0xe3, 0x31, 0x9b, 0xf9, 0x20, 0x94, 0x14, 0xf3, 0x6e, 0xda, 0xaf, 0x11, 0x5d, 0x2c, + 0xfa, 0x30, 0x8c, 0x27, 0xda, 0x76, 0x20, 0xe5, 0xd9, 0x2f, 0x59, 0x30, 0xce, 0x1b, 0xb3, 0xe4, + 0xed, 0x8a, 0xd3, 0xe0, 0x0e, 0x1c, 0x6b, 0x64, 0xec, 0xca, 0x62, 0xf8, 0x7b, 0xdf, 0xc5, 0x95, + 0xb2, 0x2c, 0x0b, 0x8b, 0x33, 0xeb, 0x40, 0xe7, 0xe9, 0x8a, 0xa3, 0xbb, 0xae, 0xd3, 0x10, 0xf1, + 0x0d, 0x46, 0xf8, 0x6a, 0xe3, 0x30, 0xac, 0xb0, 0xf6, 0x1f, 0x5a, 0x30, 0xc9, 0x5b, 0x7e, 0x85, + 0xec, 0xa9, 0xbd, 0xe9, 0x5b, 0xd9, 0x76, 0x91, 0xeb, 0xb6, 0x90, 0x93, 0xeb, 0x56, 0xff, 0xb4, + 0x62, 0xc7, 0x4f, 0xfb, 0x8a, 0x05, 0x62, 0x86, 0x1c, 0x81, 0x3e, 0xe3, 0xbb, 0x4c, 0x7d, 0xc6, + 0x4c, 0xfe, 0x22, 0xc8, 0x51, 0x64, 0xfc, 0x95, 0x05, 0x13, 0x9c, 0x20, 0xb6, 0xd5, 0x7f, 0x4b, + 0xc7, 0x61, 0xde, 0xfc, 0xa2, 0x4c, 0xe7, 0xcb, 0x2b, 0x64, 0x6f, 0xc3, 0xaf, 0x38, 0xd1, 0x76, + 0xf6, 0x47, 0x19, 0x83, 0xd5, 0xd7, 0x71, 0xb0, 0xea, 0x72, 0x01, 0x19, 0xa9, 0xe0, 0xba, 0x04, + 0x08, 0x38, 0x68, 0x2a, 0x38, 0xfb, 0xcf, 0x2c, 0x40, 0xbc, 0x1a, 0x43, 0x70, 0xa3, 0xe2, 0x10, + 0x83, 0x6a, 0x07, 0x5d, 0xbc, 0x35, 0x29, 0x0c, 0xd6, 0xa8, 0x0e, 0xa5, 0x7b, 0x12, 0x0e, 0x17, + 0xc5, 0xee, 0x0e, 0x17, 0x07, 0xe8, 0xd1, 0x7f, 0x3e, 0x00, 0xc9, 0x97, 0x7d, 0xe8, 0x3a, 0x8c, + 0xd4, 0x9c, 0x96, 0x73, 0xd3, 0x6d, 0xb8, 0x91, 0x4b, 0xc2, 0x4e, 0xde, 0x58, 0x0b, 0x1a, 0x9d, + 0x30, 0x91, 0x6b, 0x10, 0x6c, 0xf0, 0x41, 0xb3, 0x00, 0xad, 0xc0, 0xdd, 0x75, 0x1b, 0x64, 0x8b, + 0xa9, 0x5d, 0x58, 0x44, 0x15, 0xee, 0x1a, 0x26, 0xa1, 0x58, 0xa3, 0xc8, 0x08, 0xa3, 0x50, 0x7c, + 0xc0, 0x61, 0x14, 0xe0, 0xc8, 0xc2, 0x28, 0xf4, 0x1d, 0x28, 0x8c, 0xc2, 0xd0, 0x81, 0xc3, 0x28, + 0xf4, 0xf7, 0x14, 0x46, 0x01, 0xc3, 0x09, 0x29, 0x7b, 0xd2, 0xff, 0xcb, 0x6e, 0x83, 0x88, 0x0b, + 0x07, 0x0f, 0x03, 0x33, 0x73, 0x77, 0xbf, 0x7c, 0x02, 0x67, 0x52, 0xe0, 0x9c, 0x92, 0xe8, 0xa3, + 0x30, 0xed, 0x34, 0x1a, 0xfe, 0x2d, 0x35, 0xa8, 0x4b, 0x61, 0xcd, 0x69, 0x70, 0x13, 0xc8, 0x20, + 0xe3, 0x7a, 0xea, 0xee, 0x7e, 0x79, 0x7a, 0x2e, 0x87, 0x06, 0xe7, 0x96, 0x46, 0xaf, 0x42, 0xa9, + 0x15, 0xf8, 0xb5, 0x35, 0xed, 0xf9, 0xf1, 0x19, 0xda, 0x81, 0x15, 0x09, 0xbc, 0xb7, 0x5f, 0x1e, + 0x55, 0x7f, 0xd8, 0x81, 0x1f, 0x17, 0xc8, 0x88, 0x8b, 0x30, 0x7c, 0xa8, 0x71, 0x11, 0x76, 0x60, + 0xaa, 0x4a, 0x02, 0xd7, 0x69, 0xb8, 0x77, 0xa8, 0xbc, 0x2c, 0xf7, 0xa7, 0x0d, 0x28, 0x05, 0x89, + 0x1d, 0xb9, 0xa7, 0x50, 0xc4, 0x5a, 0x36, 0x2e, 0xb9, 0x03, 0xc7, 0x8c, 0xec, 0xff, 0x66, 0xc1, + 0xa0, 0x78, 0xc9, 0x77, 0x04, 0x52, 0xe3, 0x9c, 0x61, 0x94, 0x28, 0x67, 0x77, 0x18, 0x6b, 0x4c, + 0xae, 0x39, 0x62, 0x25, 0x61, 0x8e, 0x78, 0xa4, 0x13, 0x93, 0xce, 0x86, 0x88, 0xff, 0xbf, 0x48, + 0xa5, 0x77, 0xe3, 0x4d, 0xf9, 0x83, 0xef, 0x82, 0x75, 0x18, 0x0c, 0xc5, 0x9b, 0xe6, 0x42, 0xfe, + 0x6b, 0x90, 0xe4, 0x20, 0xc6, 0x5e, 0x74, 0xe2, 0x15, 0xb3, 0x64, 0x92, 0xf9, 0x58, 0xba, 0xf8, + 0x00, 0x1f, 0x4b, 0x77, 0x7b, 0x75, 0xdf, 0x77, 0x18, 0xaf, 0xee, 0xed, 0xaf, 0xb3, 0x93, 0x53, + 0x87, 0x1f, 0x81, 0x50, 0x75, 0xc9, 0x3c, 0x63, 0xed, 0x0e, 0x33, 0x4b, 0x34, 0x2a, 0x47, 0xb8, + 0xfa, 0x05, 0x0b, 0x4e, 0x67, 0x7c, 0x95, 0x26, 0x69, 0x3d, 0x03, 0x43, 0x4e, 0xbb, 0xee, 0xaa, + 0xb5, 0xac, 0x99, 0x26, 0xe7, 0x04, 0x1c, 0x2b, 0x0a, 0xb4, 0x00, 0x93, 0xe4, 0x76, 0xcb, 0xe5, + 0x86, 0x5c, 0xdd, 0xf9, 0xb8, 0xc8, 0x9f, 0x7f, 0x2e, 0x25, 0x91, 0x38, 0x4d, 0xaf, 0x02, 0x44, + 0x15, 0x73, 0x03, 0x44, 0xfd, 0x9c, 0x05, 0xc3, 0xea, 0x55, 0xef, 0x03, 0xef, 0xed, 0x8f, 0x98, + 0xbd, 0xfd, 0x70, 0x87, 0xde, 0xce, 0xe9, 0xe6, 0xdf, 0x2f, 0xa8, 0xf6, 0x56, 0xfc, 0x20, 0xea, + 0x41, 0x82, 0xbb, 0xff, 0x87, 0x13, 0x17, 0x61, 0xd8, 0x69, 0xb5, 0x24, 0x42, 0x7a, 0xc0, 0xb1, + 0xc0, 0xf2, 0x31, 0x18, 0xeb, 0x34, 0xea, 0x1d, 0x47, 0x31, 0xf7, 0x1d, 0x47, 0x1d, 0x20, 0x72, + 0x82, 0x2d, 0x12, 0x51, 0x98, 0x70, 0xd8, 0xcd, 0xdf, 0x6f, 0xda, 0x91, 0xdb, 0x98, 0x75, 0xbd, + 0x28, 0x8c, 0x82, 0xd9, 0x15, 0x2f, 0xba, 0x1a, 0xf0, 0x2b, 0xa4, 0x16, 0x62, 0x4d, 0xf1, 0xc2, + 0x1a, 0x5f, 0x19, 0xc1, 0x82, 0xd5, 0xd1, 0x6f, 0xba, 0x52, 0xac, 0x0b, 0x38, 0x56, 0x14, 0xf6, + 0x07, 0xd9, 0xe9, 0xc3, 0xfa, 0xf4, 0x60, 0xe1, 0xc5, 0x7e, 0x72, 0x44, 0x8d, 0x06, 0x33, 0x8a, + 0x2e, 0xea, 0x41, 0xcc, 0x3a, 0x6f, 0xf6, 0xb4, 0x62, 0xfd, 0x45, 0x64, 0x1c, 0xe9, 0x0c, 0x7d, + 0x3c, 0xe5, 0x1e, 0xf3, 0x6c, 0x97, 0x53, 0xe3, 0x00, 0x0e, 0x31, 0x2c, 0xcb, 0x14, 0xcb, 0xc1, + 0xb3, 0x52, 0x11, 0xeb, 0x42, 0xcb, 0x32, 0x25, 0x10, 0x38, 0xa6, 0xa1, 0xc2, 0x94, 0xfa, 0x13, + 0x4e, 0xa3, 0x38, 0x18, 0xb1, 0xa2, 0x0e, 0xb1, 0x46, 0x81, 0x2e, 0x08, 0x85, 0x02, 0xb7, 0x0b, + 0x3c, 0x9c, 0x50, 0x28, 0xc8, 0xee, 0xd2, 0xb4, 0x40, 0x17, 0x61, 0x98, 0xdc, 0x8e, 0x48, 0xe0, + 0x39, 0x0d, 0x5a, 0x43, 0x7f, 0x1c, 0x3f, 0x73, 0x29, 0x06, 0x63, 0x9d, 0x06, 0x6d, 0xc0, 0x78, + 0xc8, 0xf5, 0x6c, 0x2a, 0x04, 0x3e, 0xd7, 0x57, 0x3e, 0xa5, 0xde, 0x53, 0x9b, 0xe8, 0x7b, 0x0c, + 0xc4, 0x77, 0x27, 0x19, 0x65, 0x22, 0xc9, 0x02, 0xbd, 0x06, 0x63, 0x0d, 0xdf, 0xa9, 0xcf, 0x3b, + 0x0d, 0xc7, 0xab, 0xb1, 0xfe, 0x19, 0x32, 0x73, 0x95, 0xaf, 0x1a, 0x58, 0x9c, 0xa0, 0xa6, 0xc2, + 0x9b, 0x0e, 0x11, 0x61, 0xda, 0x1c, 0x6f, 0x8b, 0x84, 0xd3, 0x25, 0xf6, 0x55, 0x4c, 0x78, 0x5b, + 0xcd, 0xa1, 0xc1, 0xb9, 0xa5, 0xd1, 0x4b, 0x30, 0x22, 0x3f, 0x5f, 0x0b, 0xca, 0x12, 0x3f, 0x89, + 0xd1, 0x70, 0xd8, 0xa0, 0x44, 0x21, 0x1c, 0x97, 0xff, 0x37, 0x02, 0x67, 0x73, 0xd3, 0xad, 0x89, + 0x48, 0x05, 0xfc, 0xf9, 0xf0, 0x87, 0xe5, 0x5b, 0xc5, 0xa5, 0x2c, 0xa2, 0x7b, 0xfb, 0xe5, 0x53, + 0xa2, 0xd7, 0x32, 0xf1, 0x38, 0x9b, 0x37, 0x5a, 0x83, 0xa9, 0x6d, 0xe2, 0x34, 0xa2, 0xed, 0x85, + 0x6d, 0x52, 0xdb, 0x91, 0x0b, 0x8e, 0x85, 0x79, 0xd1, 0x9e, 0x8e, 0x5c, 0x4e, 0x93, 0xe0, 0xac, + 0x72, 0xe8, 0x2d, 0x98, 0x6e, 0xb5, 0x6f, 0x36, 0xdc, 0x70, 0x7b, 0xdd, 0x8f, 0x98, 0x13, 0xd2, + 0x5c, 0xbd, 0x1e, 0x90, 0x90, 0xbf, 0x2e, 0x65, 0x47, 0xaf, 0x0c, 0xa4, 0x53, 0xc9, 0xa1, 0xc3, + 0xb9, 0x1c, 0xd0, 0x1d, 0x38, 0x9e, 0x98, 0x08, 0x22, 0x22, 0xc6, 0x58, 0x7e, 0x02, 0x9c, 0x6a, + 0x56, 0x01, 0x11, 0x5c, 0x26, 0x0b, 0x85, 0xb3, 0xab, 0x40, 0x2f, 0x03, 0xb8, 0xad, 0x65, 0xa7, + 0xe9, 0x36, 0xe8, 0x55, 0x71, 0x8a, 0xcd, 0x11, 0x7a, 0x6d, 0x80, 0x95, 0x8a, 0x84, 0xd2, 0xbd, + 0x59, 0xfc, 0xdb, 0xc3, 0x1a, 0x35, 0x5a, 0x85, 0x31, 0xf1, 0x6f, 0x4f, 0x0c, 0xe9, 0xa4, 0xca, + 0x95, 0x38, 0x26, 0x4b, 0xa8, 0x71, 0x4c, 0x40, 0x70, 0xa2, 0x2c, 0xda, 0x82, 0xd3, 0x32, 0x51, + 0xa3, 0x3e, 0x3f, 0xe5, 0x18, 0x84, 0x2c, 0xeb, 0xcc, 0x10, 0x7f, 0x95, 0x32, 0xd7, 0x89, 0x10, + 0x77, 0xe6, 0x43, 0xcf, 0x75, 0x7d, 0x9a, 0xf3, 0x37, 0xc7, 0xc7, 0xe3, 0x88, 0x83, 0xab, 0x49, + 0x24, 0x4e, 0xd3, 0x23, 0x1f, 0x8e, 0xbb, 0x5e, 0xd6, 0xac, 0x3e, 0xc1, 0x18, 0x7d, 0x88, 0x3f, + 0xb7, 0xee, 0x3c, 0xa3, 0x33, 0xf1, 0x38, 0x9b, 0xef, 0x3b, 0xf3, 0xfb, 0xfb, 0x03, 0x8b, 0x96, + 0xd6, 0xa4, 0x73, 0xf4, 0x29, 0x18, 0xd1, 0x3f, 0x4a, 0x48, 0x1a, 0xe7, 0xb2, 0x85, 0x57, 0x6d, + 0x4f, 0xe0, 0xb2, 0xbd, 0x5a, 0xf7, 0x3a, 0x0e, 0x1b, 0x1c, 0x51, 0x2d, 0x23, 0xb6, 0xc1, 0x85, + 0xde, 0x24, 0x99, 0xde, 0xdd, 0xde, 0x08, 0x64, 0x4f, 0x77, 0xb4, 0x0a, 0x43, 0xb5, 0x86, 0x4b, + 0xbc, 0x68, 0xa5, 0xd2, 0x29, 0x7a, 0xe3, 0x82, 0xa0, 0x11, 0xeb, 0x47, 0x24, 0x90, 0xe1, 0x30, + 0xac, 0x38, 0xd8, 0x2f, 0xc1, 0x70, 0xb5, 0x41, 0x48, 0x8b, 0x3f, 0xdf, 0x41, 0x4f, 0xb2, 0xdb, + 0x04, 0x93, 0x07, 0x2d, 0x26, 0x0f, 0xea, 0x17, 0x05, 0x26, 0x09, 0x4a, 0xbc, 0xfd, 0x9b, 0x05, + 0x28, 0x77, 0xc9, 0x63, 0x94, 0x30, 0x60, 0x59, 0x3d, 0x19, 0xb0, 0xe6, 0x60, 0x3c, 0xfe, 0xa7, + 0xeb, 0xc6, 0x94, 0x0f, 0xec, 0x75, 0x13, 0x8d, 0x93, 0xf4, 0x3d, 0x3f, 0x67, 0xd0, 0x6d, 0x60, + 0x7d, 0x5d, 0x1f, 0xe4, 0x18, 0xb6, 0xef, 0xfe, 0xde, 0x2f, 0xcc, 0xb9, 0x76, 0x4c, 0xfb, 0xeb, + 0x05, 0x38, 0xae, 0xba, 0xf0, 0x3b, 0xb7, 0xe3, 0xae, 0xa5, 0x3b, 0xee, 0x10, 0xac, 0xc0, 0xf6, + 0x55, 0x18, 0xe0, 0x81, 0x2c, 0x7b, 0x10, 0xd4, 0x1f, 0x35, 0xe3, 0x6b, 0x2b, 0xd9, 0xd0, 0x88, + 0xb1, 0xfd, 0x03, 0x16, 0x8c, 0x27, 0xde, 0xc5, 0x21, 0xac, 0x3d, 0x9e, 0xbe, 0x1f, 0x61, 0x3a, + 0x4b, 0x4c, 0x3f, 0x0b, 0x7d, 0xdb, 0x7e, 0x18, 0x25, 0x5d, 0x44, 0x2e, 0xfb, 0x61, 0x84, 0x19, + 0xc6, 0xfe, 0x23, 0x0b, 0xfa, 0x37, 0x1c, 0xd7, 0x8b, 0xa4, 0x39, 0xc1, 0xca, 0x31, 0x27, 0xf4, + 0xf2, 0x5d, 0xe8, 0x45, 0x18, 0x20, 0x9b, 0x9b, 0xa4, 0x16, 0x89, 0x51, 0x95, 0x41, 0x14, 0x06, + 0x96, 0x18, 0x94, 0x4a, 0x8e, 0xac, 0x32, 0xfe, 0x17, 0x0b, 0x62, 0x74, 0x03, 0x4a, 0x91, 0xdb, + 0x24, 0x73, 0xf5, 0xba, 0x30, 0xb2, 0xdf, 0x47, 0xe4, 0x8f, 0x0d, 0xc9, 0x00, 0xc7, 0xbc, 0xec, + 0x2f, 0x15, 0x00, 0xe2, 0x08, 0x60, 0xdd, 0x3e, 0x71, 0x3e, 0x65, 0x7e, 0x3d, 0x97, 0x61, 0x7e, + 0x45, 0x31, 0xc3, 0x0c, 0xdb, 0xab, 0xea, 0xa6, 0x62, 0x4f, 0xdd, 0xd4, 0x77, 0x90, 0x6e, 0x5a, + 0x80, 0xc9, 0x38, 0x82, 0x99, 0x19, 0xc0, 0x91, 0x1d, 0xba, 0x1b, 0x49, 0x24, 0x4e, 0xd3, 0xdb, + 0x04, 0xce, 0xaa, 0x40, 0x4e, 0xe2, 0x2c, 0x64, 0x1e, 0xe4, 0xba, 0x39, 0xbb, 0x4b, 0x3f, 0xc5, + 0xf6, 0xe5, 0x42, 0xae, 0x7d, 0xf9, 0x27, 0x2c, 0x38, 0x96, 0xac, 0x87, 0x3d, 0xb7, 0xfe, 0x82, + 0x05, 0xc7, 0xe3, 0x34, 0x1e, 0x69, 0x9b, 0xfe, 0x0b, 0x1d, 0x83, 0x53, 0xe5, 0xb4, 0x38, 0x8e, + 0xd6, 0xb1, 0x96, 0xc5, 0x1a, 0x67, 0xd7, 0x68, 0xff, 0xd7, 0x3e, 0x98, 0xce, 0x8b, 0x6a, 0xc5, + 0x1e, 0x98, 0x38, 0xb7, 0xab, 0x3b, 0xe4, 0x96, 0x70, 0xe3, 0x8f, 0x1f, 0x98, 0x70, 0x30, 0x96, + 0xf8, 0x64, 0xe6, 0x96, 0x42, 0x8f, 0x99, 0x5b, 0xb6, 0x61, 0xf2, 0xd6, 0x36, 0xf1, 0xae, 0x79, + 0xa1, 0x13, 0xb9, 0xe1, 0xa6, 0xcb, 0x2c, 0xd2, 0x7c, 0xde, 0xc8, 0xec, 0xe3, 0x93, 0x37, 0x92, + 0x04, 0xf7, 0xf6, 0xcb, 0xa7, 0x0d, 0x40, 0xdc, 0x64, 0xbe, 0x91, 0xe0, 0x34, 0xd3, 0x74, 0xe2, + 0x9b, 0xbe, 0x07, 0x9c, 0xf8, 0xa6, 0xe9, 0x0a, 0x3f, 0x16, 0xf9, 0x7a, 0x80, 0xdd, 0x35, 0xd7, + 0x14, 0x14, 0x6b, 0x14, 0xe8, 0x13, 0x80, 0xf4, 0xcc, 0x65, 0x46, 0x50, 0xd1, 0x67, 0xef, 0xee, + 0x97, 0xd1, 0x7a, 0x0a, 0x7b, 0x6f, 0xbf, 0x3c, 0x45, 0xa1, 0x2b, 0x1e, 0xbd, 0xb3, 0xc6, 0x91, + 0xd8, 0x32, 0x18, 0xa1, 0x1b, 0x30, 0x41, 0xa1, 0x6c, 0x45, 0xc9, 0x88, 0xa5, 0xfc, 0x9e, 0xf9, + 0xf4, 0xdd, 0xfd, 0xf2, 0xc4, 0x7a, 0x02, 0x97, 0xc7, 0x3a, 0xc5, 0x24, 0x23, 0xff, 0xcd, 0x50, + 0xaf, 0xf9, 0x6f, 0xec, 0x2f, 0x58, 0x70, 0x92, 0x1e, 0x70, 0xf5, 0xd5, 0x1c, 0xb3, 0xb4, 0xd3, + 0x72, 0xb9, 0xe1, 0x43, 0x1c, 0x35, 0x4c, 0xc1, 0x56, 0x59, 0xe1, 0x66, 0x0f, 0x85, 0xa5, 0x3b, + 0xfc, 0x8e, 0xeb, 0xd5, 0x93, 0x3b, 0xfc, 0x15, 0xd7, 0xab, 0x63, 0x86, 0x51, 0x47, 0x56, 0x31, + 0xf7, 0x11, 0xc3, 0x57, 0xe9, 0x5a, 0xa5, 0x6d, 0xf9, 0x96, 0x36, 0x03, 0x3d, 0xad, 0x1b, 0x29, + 0x85, 0x3f, 0x62, 0xae, 0x81, 0xf2, 0xf3, 0x16, 0x88, 0x47, 0xcf, 0x3d, 0x9c, 0xc9, 0x6f, 0xc2, + 0xc8, 0x6e, 0x3a, 0xab, 0xe3, 0xd9, 0xfc, 0x57, 0xe0, 0x22, 0x56, 0xbb, 0x12, 0xd1, 0x8d, 0x0c, + 0x8e, 0x06, 0x2f, 0xbb, 0x0e, 0x02, 0xbb, 0x48, 0x98, 0x29, 0xa2, 0x7b, 0x6b, 0x9e, 0x03, 0xa8, + 0x33, 0x5a, 0x96, 0xea, 0xb9, 0x60, 0x4a, 0x5c, 0x8b, 0x0a, 0x83, 0x35, 0x2a, 0xfb, 0x77, 0x0a, + 0x30, 0x2c, 0xb3, 0x08, 0xb6, 0xbd, 0x5e, 0x14, 0x86, 0x07, 0x4a, 0x2b, 0x8e, 0x2e, 0x40, 0x89, + 0x69, 0xb4, 0x2b, 0xb1, 0x9e, 0x55, 0xe9, 0x93, 0xd6, 0x24, 0x02, 0xc7, 0x34, 0x4c, 0x7c, 0x6f, + 0xdf, 0x64, 0xe4, 0x89, 0x27, 0xba, 0x55, 0x0e, 0xc6, 0x12, 0x8f, 0x3e, 0x0a, 0x13, 0xbc, 0x5c, + 0xe0, 0xb7, 0x9c, 0x2d, 0x6e, 0x05, 0xeb, 0x57, 0x71, 0x4f, 0x26, 0xd6, 0x12, 0xb8, 0x7b, 0xfb, + 0xe5, 0x63, 0x49, 0x18, 0x33, 0xef, 0xa6, 0xb8, 0x30, 0x67, 0x37, 0x5e, 0x09, 0xdd, 0xd5, 0x53, + 0x3e, 0x72, 0x31, 0x0a, 0xeb, 0x74, 0xf6, 0xa7, 0x00, 0xa5, 0xf3, 0x29, 0xa2, 0xd7, 0xb9, 0xb3, + 0xb4, 0x1b, 0x90, 0x7a, 0x27, 0x73, 0xaf, 0x1e, 0xdd, 0x43, 0xbe, 0xae, 0xe3, 0xa5, 0xb0, 0x2a, + 0x6f, 0xff, 0x5f, 0x45, 0x98, 0x48, 0xc6, 0x13, 0x40, 0x97, 0x61, 0x80, 0x8b, 0x94, 0x82, 0x7d, + 0x07, 0x6f, 0x22, 0x2d, 0x0a, 0x01, 0x3b, 0x5c, 0x85, 0x54, 0x2a, 0xca, 0xa3, 0xb7, 0x60, 0xb8, + 0xee, 0xdf, 0xf2, 0x6e, 0x39, 0x41, 0x7d, 0xae, 0xb2, 0x22, 0xa6, 0x73, 0xa6, 0x8a, 0x63, 0x31, + 0x26, 0xd3, 0x23, 0x1b, 0x30, 0xcb, 0x79, 0x8c, 0xc2, 0x3a, 0x3b, 0xb4, 0xc1, 0x52, 0x84, 0x6c, + 0xba, 0x5b, 0x6b, 0x4e, 0xab, 0xd3, 0xcb, 0x99, 0x05, 0x49, 0xa4, 0x71, 0x1e, 0x15, 0x79, 0x44, + 0x38, 0x02, 0xc7, 0x8c, 0xd0, 0x67, 0x60, 0x2a, 0xcc, 0x31, 0xba, 0xe4, 0xa5, 0xd7, 0xed, 0x64, + 0x87, 0x98, 0x7f, 0xe8, 0xee, 0x7e, 0x79, 0x2a, 0xcb, 0x3c, 0x93, 0x55, 0x8d, 0xfd, 0xf9, 0x3e, + 0x98, 0x91, 0x69, 0x44, 0x33, 0xfc, 0xf4, 0x3f, 0x67, 0x25, 0x1c, 0xf5, 0x5f, 0xce, 0xdf, 0x1b, + 0x1e, 0x98, 0xbb, 0xfe, 0x17, 0xd3, 0xee, 0xfa, 0xaf, 0x1e, 0xb0, 0x19, 0x87, 0xe6, 0xb4, 0xff, + 0x1d, 0xeb, 0x69, 0xff, 0xe5, 0x63, 0x60, 0xec, 0xe6, 0x46, 0xda, 0x7d, 0xeb, 0x90, 0xd2, 0xee, + 0x63, 0x18, 0x22, 0xcd, 0x56, 0xb4, 0xb7, 0xe8, 0x06, 0xa2, 0xc5, 0x99, 0x3c, 0x97, 0x04, 0x4d, + 0x9a, 0xa7, 0xc4, 0x60, 0xc5, 0x07, 0xed, 0xc2, 0xe4, 0x56, 0x8d, 0x24, 0x32, 0x6f, 0x17, 0xf3, + 0x57, 0xcf, 0xa5, 0x85, 0xa5, 0x0e, 0x69, 0xb7, 0xd9, 0x7d, 0x21, 0x45, 0x82, 0xd3, 0x55, 0xb0, + 0xac, 0xdf, 0xce, 0xad, 0x70, 0xa9, 0xe1, 0x84, 0x91, 0x5b, 0x9b, 0x6f, 0xf8, 0xb5, 0x9d, 0x6a, + 0xe4, 0x07, 0x32, 0xed, 0x57, 0xa6, 0xb8, 0x3e, 0x77, 0xa3, 0x9a, 0xa2, 0x4f, 0x67, 0xfd, 0xce, + 0xa2, 0xc2, 0x99, 0x75, 0xa1, 0x75, 0x18, 0xdc, 0x72, 0x23, 0x4c, 0x5a, 0xbe, 0xb8, 0xd5, 0x67, + 0x6e, 0x48, 0x97, 0x38, 0x49, 0x3a, 0x0b, 0xb7, 0x40, 0x60, 0xc9, 0x04, 0xbd, 0xae, 0xb6, 0xe2, + 0x81, 0x7c, 0x9d, 0x5d, 0xda, 0xff, 0x29, 0x73, 0x33, 0x7e, 0x0d, 0x8a, 0xde, 0x66, 0xd8, 0x29, + 0x6a, 0xc7, 0xfa, 0x72, 0x35, 0x9d, 0x1d, 0x7b, 0x7d, 0xb9, 0x8a, 0x69, 0x41, 0xf6, 0xc0, 0x2f, + 0xac, 0x85, 0xae, 0x48, 0x60, 0x92, 0xf9, 0xde, 0x71, 0xa5, 0xba, 0x50, 0x5d, 0x49, 0x67, 0x04, + 0x67, 0x60, 0xcc, 0x8b, 0xa3, 0xeb, 0x50, 0xda, 0xe2, 0xf6, 0x9b, 0xcd, 0x50, 0xa4, 0x12, 0xce, + 0x3c, 0x12, 0x2e, 0x49, 0xa2, 0x74, 0x1e, 0x70, 0x85, 0xc2, 0x31, 0x2b, 0xf4, 0x79, 0x0b, 0x8e, + 0x27, 0x73, 0x31, 0xb3, 0x67, 0x39, 0xc2, 0x55, 0xe8, 0xc5, 0x5e, 0x92, 0x63, 0xb3, 0x02, 0x46, + 0x85, 0x4c, 0xcd, 0x9e, 0x49, 0x86, 0xb3, 0xab, 0xa3, 0x1d, 0x1d, 0xdc, 0xac, 0x0b, 0x97, 0x95, + 0xcc, 0x8e, 0x4e, 0x84, 0x30, 0xe1, 0x1d, 0x8d, 0xe7, 0x17, 0x31, 0x2d, 0x88, 0x36, 0x00, 0x36, + 0x1b, 0x44, 0xa6, 0x8d, 0x1f, 0xc9, 0x3f, 0x83, 0x97, 0x15, 0x95, 0xcc, 0xd9, 0x43, 0x25, 0xb3, + 0x18, 0x8a, 0x35, 0x3e, 0x74, 0x2a, 0xd5, 0x5c, 0xaf, 0x4e, 0x02, 0x66, 0xc4, 0xc8, 0x99, 0x4a, + 0x0b, 0x8c, 0x22, 0x3d, 0x95, 0x38, 0x1c, 0x0b, 0x0e, 0x8c, 0x17, 0x69, 0x6d, 0x6f, 0x86, 0x9d, + 0x82, 0xd3, 0x2f, 0x90, 0xd6, 0x76, 0x62, 0x42, 0x71, 0x5e, 0x0c, 0x8e, 0x05, 0x07, 0xba, 0x64, + 0x36, 0xe9, 0x02, 0x22, 0xc1, 0xf4, 0x78, 0xfe, 0x92, 0x59, 0xe6, 0x24, 0xe9, 0x25, 0x23, 0x10, + 0x58, 0x32, 0x41, 0x9f, 0x34, 0x65, 0x8e, 0x09, 0xc6, 0xf3, 0xe9, 0x2e, 0x32, 0x87, 0xc1, 0xb7, + 0xb3, 0xd4, 0xf1, 0x32, 0x14, 0x36, 0x6b, 0xcc, 0xf8, 0x91, 0xa3, 0x66, 0x5e, 0x5e, 0x30, 0xb8, + 0xb1, 0x60, 0xcf, 0xcb, 0x0b, 0xb8, 0xb0, 0x59, 0xa3, 0x53, 0xdf, 0xb9, 0xd3, 0x0e, 0xc8, 0xb2, + 0xdb, 0x20, 0x22, 0x50, 0x7d, 0xe6, 0xd4, 0x9f, 0x93, 0x44, 0xe9, 0xa9, 0xaf, 0x50, 0x38, 0x66, + 0x45, 0xf9, 0xc6, 0x92, 0xd0, 0x54, 0x3e, 0x5f, 0x25, 0xf0, 0xa4, 0xf9, 0x66, 0xca, 0x42, 0x3b, + 0x30, 0xba, 0x1b, 0xb6, 0xb6, 0x89, 0xdc, 0x15, 0x99, 0x59, 0x26, 0xe7, 0x4d, 0xfb, 0x75, 0x41, + 0xe8, 0x06, 0x51, 0xdb, 0x69, 0xa4, 0x36, 0x72, 0x76, 0x1b, 0xbf, 0xae, 0x33, 0xc3, 0x26, 0x6f, + 0x3a, 0x11, 0xde, 0xe6, 0x81, 0xa7, 0x98, 0x81, 0x26, 0x67, 0x22, 0x64, 0xc4, 0xa6, 0xe2, 0x13, + 0x41, 0x20, 0xb0, 0x64, 0xa2, 0x3a, 0x9b, 0x1d, 0x40, 0x27, 0xba, 0x74, 0x76, 0xaa, 0xbd, 0x71, + 0x67, 0xb3, 0x03, 0x27, 0x66, 0xc5, 0x0e, 0x9a, 0x56, 0x46, 0xda, 0xea, 0xe9, 0x87, 0xf2, 0x0f, + 0x9a, 0x6e, 0x69, 0xae, 0xf9, 0x41, 0x93, 0x45, 0x85, 0x33, 0xeb, 0xa2, 0x1f, 0xd7, 0x92, 0x31, + 0xc4, 0x44, 0x30, 0xfd, 0x27, 0x73, 0x42, 0xf0, 0xa5, 0x03, 0x8d, 0xf1, 0x8f, 0x53, 0x28, 0x1c, + 0xb3, 0x42, 0x75, 0x18, 0x6b, 0x19, 0xb1, 0x29, 0x59, 0x52, 0x80, 0x1c, 0xb9, 0x20, 0x2b, 0x8a, + 0x25, 0x57, 0x2a, 0x98, 0x18, 0x9c, 0xe0, 0xc9, 0x3c, 0xb4, 0xf8, 0x73, 0x2b, 0x96, 0x33, 0x20, + 0x67, 0xa8, 0x33, 0x5e, 0x64, 0xf1, 0xa1, 0x16, 0x08, 0x2c, 0x99, 0xd0, 0xde, 0x10, 0x8f, 0x84, + 0xfc, 0x90, 0xa5, 0xde, 0xc8, 0x33, 0xa4, 0x66, 0x59, 0x16, 0x64, 0x40, 0x66, 0x81, 0xc2, 0x31, + 0x2b, 0xba, 0x93, 0xd3, 0x03, 0xef, 0x54, 0xfe, 0x4e, 0x9e, 0x3c, 0xee, 0xd8, 0x4e, 0x4e, 0x0f, + 0xbb, 0xa2, 0x38, 0xea, 0x54, 0xfc, 0x60, 0x96, 0x36, 0x20, 0xa7, 0x5d, 0x2a, 0x00, 0x71, 0xba, + 0x5d, 0x0a, 0x85, 0x63, 0x56, 0xf6, 0x0f, 0x16, 0xe0, 0x4c, 0xe7, 0xf5, 0x16, 0x9b, 0x4b, 0x2a, + 0xb1, 0x4f, 0x49, 0xc2, 0x5c, 0xc2, 0x2f, 0xef, 0x31, 0x55, 0xcf, 0x21, 0x45, 0x2f, 0xc1, 0xa4, + 0x7a, 0xca, 0xd5, 0x70, 0x6b, 0x7b, 0xeb, 0xb1, 0xbe, 0x44, 0x05, 0xdf, 0xa8, 0x26, 0x09, 0x70, + 0xba, 0x0c, 0x9a, 0x83, 0x71, 0x03, 0xb8, 0xb2, 0x28, 0x2e, 0xe9, 0x71, 0xa0, 0x7a, 0x13, 0x8d, + 0x93, 0xf4, 0xf6, 0xcf, 0x5a, 0xf0, 0x50, 0x4e, 0xd6, 0xe0, 0x9e, 0x23, 0x66, 0x6e, 0xc2, 0x78, + 0xcb, 0x2c, 0xda, 0x25, 0xc8, 0xaf, 0x91, 0x9b, 0x58, 0xb5, 0x35, 0x81, 0xc0, 0x49, 0xa6, 0xf6, + 0x4f, 0x17, 0xe0, 0x74, 0x47, 0xdf, 0x64, 0x84, 0xe1, 0xc4, 0x56, 0x33, 0x74, 0x16, 0x02, 0x52, + 0x27, 0x5e, 0xe4, 0x3a, 0x8d, 0x6a, 0x8b, 0xd4, 0x34, 0x83, 0x17, 0x73, 0xf2, 0xbd, 0xb4, 0x56, + 0x9d, 0x4b, 0x53, 0xe0, 0x9c, 0x92, 0x68, 0x19, 0x50, 0x1a, 0x23, 0x46, 0x98, 0x25, 0xa0, 0x48, + 0xf3, 0xc3, 0x19, 0x25, 0xd0, 0x07, 0x61, 0x54, 0xf9, 0x3c, 0x6b, 0x23, 0xce, 0x36, 0x76, 0xac, + 0x23, 0xb0, 0x49, 0x87, 0x2e, 0xf2, 0x0c, 0x26, 0x22, 0xd7, 0x8d, 0xb0, 0x8e, 0x8d, 0xcb, 0xf4, + 0x24, 0x02, 0x8c, 0x75, 0x9a, 0xf9, 0x97, 0x7e, 0xeb, 0x9b, 0x67, 0xde, 0xf7, 0x7b, 0xdf, 0x3c, + 0xf3, 0xbe, 0x3f, 0xfc, 0xe6, 0x99, 0xf7, 0x7d, 0xcf, 0xdd, 0x33, 0xd6, 0x6f, 0xdd, 0x3d, 0x63, + 0xfd, 0xde, 0xdd, 0x33, 0xd6, 0x1f, 0xde, 0x3d, 0x63, 0xfd, 0xbb, 0xbb, 0x67, 0xac, 0x2f, 0xfd, + 0xc9, 0x99, 0xf7, 0xbd, 0x89, 0xe2, 0x18, 0xb4, 0x17, 0xe8, 0xe8, 0x5c, 0xd8, 0xbd, 0xf8, 0xbf, + 0x02, 0x00, 0x00, 0xff, 0xff, 0xe1, 0xe1, 0xd1, 0xf7, 0x50, 0x19, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -12342,6 +12379,39 @@ func (m *LocalVolumeSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ModifyVolumeStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ModifyVolumeStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyVolumeStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 + i -= len(m.TargetVolumeAttributesClassName) + copy(dAtA[i:], m.TargetVolumeAttributesClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.TargetVolumeAttributesClassName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *NFSVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -13861,6 +13931,13 @@ func (m *PersistentVolumeClaimSpec) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l + if m.VolumeAttributesClassName != nil { + i -= len(*m.VolumeAttributesClassName) + copy(dAtA[i:], *m.VolumeAttributesClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeAttributesClassName))) + i-- + dAtA[i] = 0x4a + } if m.DataSourceRef != nil { { size, err := m.DataSourceRef.MarshalToSizedBuffer(dAtA[:i]) @@ -13958,6 +14035,25 @@ func (m *PersistentVolumeClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, er _ = i var l int _ = l + if m.ModifyVolumeStatus != nil { + { + size, err := m.ModifyVolumeStatus.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + if m.CurrentVolumeAttributesClassName != nil { + i -= len(*m.CurrentVolumeAttributesClassName) + copy(dAtA[i:], *m.CurrentVolumeAttributesClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.CurrentVolumeAttributesClassName))) + i-- + dAtA[i] = 0x42 + } if len(m.AllocatedResourceStatuses) > 0 { keysForAllocatedResourceStatuses := make([]string, 0, len(m.AllocatedResourceStatuses)) for k := range m.AllocatedResourceStatuses { @@ -14518,6 +14614,13 @@ func (m *PersistentVolumeSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.VolumeAttributesClassName != nil { + i -= len(*m.VolumeAttributesClassName) + copy(dAtA[i:], *m.VolumeAttributesClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeAttributesClassName))) + i-- + dAtA[i] = 0x52 + } if m.NodeAffinity != nil { { size, err := m.NodeAffinity.MarshalToSizedBuffer(dAtA[:i]) @@ -22586,6 +22689,19 @@ func (m *LocalVolumeSource) Size() (n int) { return n } +func (m *ModifyVolumeStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TargetVolumeAttributesClassName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *NFSVolumeSource) Size() (n int) { if m == nil { return 0 @@ -23167,6 +23283,10 @@ func (m *PersistentVolumeClaimSpec) Size() (n int) { l = m.DataSourceRef.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.VolumeAttributesClassName != nil { + l = len(*m.VolumeAttributesClassName) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -23216,6 +23336,14 @@ func (m *PersistentVolumeClaimStatus) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if m.CurrentVolumeAttributesClassName != nil { + l = len(*m.CurrentVolumeAttributesClassName) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ModifyVolumeStatus != nil { + l = m.ModifyVolumeStatus.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -23403,6 +23531,10 @@ func (m *PersistentVolumeSpec) Size() (n int) { l = m.NodeAffinity.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.VolumeAttributesClassName != nil { + l = len(*m.VolumeAttributesClassName) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -27045,6 +27177,17 @@ func (this *LocalVolumeSource) String() string { }, "") return s } +func (this *ModifyVolumeStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ModifyVolumeStatus{`, + `TargetVolumeAttributesClassName:` + fmt.Sprintf("%v", this.TargetVolumeAttributesClassName) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `}`, + }, "") + return s +} func (this *NFSVolumeSource) String() string { if this == nil { return "nil" @@ -27501,6 +27644,7 @@ func (this *PersistentVolumeClaimSpec) String() string { `VolumeMode:` + valueToStringGenerated(this.VolumeMode) + `,`, `DataSource:` + strings.Replace(this.DataSource.String(), "TypedLocalObjectReference", "TypedLocalObjectReference", 1) + `,`, `DataSourceRef:` + strings.Replace(this.DataSourceRef.String(), "TypedObjectReference", "TypedObjectReference", 1) + `,`, + `VolumeAttributesClassName:` + valueToStringGenerated(this.VolumeAttributesClassName) + `,`, `}`, }, "") return s @@ -27551,6 +27695,8 @@ func (this *PersistentVolumeClaimStatus) String() string { `Conditions:` + repeatedStringForConditions + `,`, `AllocatedResources:` + mapStringForAllocatedResources + `,`, `AllocatedResourceStatuses:` + mapStringForAllocatedResourceStatuses + `,`, + `CurrentVolumeAttributesClassName:` + valueToStringGenerated(this.CurrentVolumeAttributesClassName) + `,`, + `ModifyVolumeStatus:` + strings.Replace(this.ModifyVolumeStatus.String(), "ModifyVolumeStatus", "ModifyVolumeStatus", 1) + `,`, `}`, }, "") return s @@ -27648,6 +27794,7 @@ func (this *PersistentVolumeSpec) String() string { `MountOptions:` + fmt.Sprintf("%v", this.MountOptions) + `,`, `VolumeMode:` + valueToStringGenerated(this.VolumeMode) + `,`, `NodeAffinity:` + strings.Replace(this.NodeAffinity.String(), "VolumeNodeAffinity", "VolumeNodeAffinity", 1) + `,`, + `VolumeAttributesClassName:` + valueToStringGenerated(this.VolumeAttributesClassName) + `,`, `}`, }, "") return s @@ -45059,6 +45206,120 @@ func (m *LocalVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *ModifyVolumeStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ModifyVolumeStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ModifyVolumeStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetVolumeAttributesClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetVolumeAttributesClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = PersistentVolumeClaimModifyVolumeStatus(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NFSVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -50175,6 +50436,39 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeAttributesClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.VolumeAttributesClassName = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -50708,6 +51002,75 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { } m.AllocatedResourceStatuses[ResourceName(mapkey)] = ((ClaimResourceStatus)(mapvalue)) iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentVolumeAttributesClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.CurrentVolumeAttributesClassName = &s + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ModifyVolumeStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ModifyVolumeStatus == nil { + m.ModifyVolumeStatus = &ModifyVolumeStatus{} + } + if err := m.ModifyVolumeStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -52330,6 +52693,39 @@ func (m *PersistentVolumeSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeAttributesClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.VolumeAttributesClassName = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 0fa44a4845e..b5254d174ea 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -2225,6 +2225,24 @@ message LocalVolumeSource { optional string fsType = 2; } +// ModifyVolumeStatus represents the status object of ControllerModifyVolume operation +message ModifyVolumeStatus { + // targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled + optional string targetVolumeAttributesClassName = 1; + + // status is the status of the ControllerModifyVolume operation. It can be in any of following states: + // - Pending + // Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as + // the specified VolumeAttributesClass not existing. + // - InProgress + // InProgress indicates that the volume is being modified. + // - Infeasible + // Infeasible indicates that the request has been rejected as invalid by the CSI driver. To + // resolve the error, a valid VolumeAttributesClass needs to be specified. + // Note: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately. + optional string status = 2; +} + // Represents an NFS mount that lasts the lifetime of a pod. // NFS volumes do not support ownership management or SELinux relabeling. message NFSVolumeSource { @@ -2882,6 +2900,22 @@ message PersistentVolumeClaimSpec { // (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. // +optional optional TypedObjectReference dataSourceRef = 8; + + // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. + // If specified, the CSI driver will create or update the volume with the attributes defined + // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, + // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass + // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. + // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass + // will be set by the persistentvolume controller if it exists. + // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be + // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource + // exists. + // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass + // (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled. + // +featureGate=VolumeAttributesClass + // +optional + optional string volumeAttributesClassName = 9; } // PersistentVolumeClaimStatus is the current status of a persistent volume claim. @@ -2971,6 +3005,20 @@ message PersistentVolumeClaimStatus { // +mapType=granular // +optional map allocatedResourceStatuses = 7; + + // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. + // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + optional string currentVolumeAttributesClassName = 8; + + // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. + // When this is unset, there is no ModifyVolume operation being attempted. + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + optional ModifyVolumeStatus modifyVolumeStatus = 9; } // PersistentVolumeClaimTemplate is used to produce @@ -3175,6 +3223,17 @@ message PersistentVolumeSpec { // This field influences the scheduling of pods that use this volume. // +optional optional VolumeNodeAffinity nodeAffinity = 9; + + // Name of VolumeAttributesClass to which this persistent volume belongs. Empty value + // is not allowed. When this field is not set, it indicates that this volume does not belong to any + // VolumeAttributesClass. This field is mutable and can be changed by the CSI driver + // after a volume has been updated successfully to a new class. + // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound + // PersistentVolumeClaims during the binding process. + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + optional string volumeAttributesClassName = 10; } // PersistentVolumeStatus is the current status of a persistent volume. diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index f4eeb6c648b..7dbb25a1735 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -363,6 +363,16 @@ type PersistentVolumeSpec struct { // This field influences the scheduling of pods that use this volume. // +optional NodeAffinity *VolumeNodeAffinity `json:"nodeAffinity,omitempty" protobuf:"bytes,9,opt,name=nodeAffinity"` + // Name of VolumeAttributesClass to which this persistent volume belongs. Empty value + // is not allowed. When this field is not set, it indicates that this volume does not belong to any + // VolumeAttributesClass. This field is mutable and can be changed by the CSI driver + // after a volume has been updated successfully to a new class. + // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound + // PersistentVolumeClaims during the binding process. + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty" protobuf:"bytes,10,opt,name=volumeAttributesClassName"` } // VolumeNodeAffinity defines constraints that limit what nodes this volume can be accessed from. @@ -533,6 +543,21 @@ type PersistentVolumeClaimSpec struct { // (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. // +optional DataSourceRef *TypedObjectReference `json:"dataSourceRef,omitempty" protobuf:"bytes,8,opt,name=dataSourceRef"` + // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. + // If specified, the CSI driver will create or update the volume with the attributes defined + // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, + // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass + // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. + // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass + // will be set by the persistentvolume controller if it exists. + // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be + // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource + // exists. + // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass + // (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled. + // +featureGate=VolumeAttributesClass + // +optional + VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty" protobuf:"bytes,9,opt,name=volumeAttributesClassName"` } type TypedObjectReference struct { @@ -561,6 +586,11 @@ const ( PersistentVolumeClaimResizing PersistentVolumeClaimConditionType = "Resizing" // PersistentVolumeClaimFileSystemResizePending - controller resize is finished and a file system resize is pending on node PersistentVolumeClaimFileSystemResizePending PersistentVolumeClaimConditionType = "FileSystemResizePending" + + // Applying the target VolumeAttributesClass encountered an error + PersistentVolumeClaimVolumeModifyVolumeError PersistentVolumeClaimConditionType = "ModifyVolumeError" + // Volume is being modified + PersistentVolumeClaimVolumeModifyingVolume PersistentVolumeClaimConditionType = "ModifyingVolume" ) // +enum @@ -587,6 +617,38 @@ const ( PersistentVolumeClaimNodeResizeFailed ClaimResourceStatus = "NodeResizeFailed" ) +// +enum +// New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately +type PersistentVolumeClaimModifyVolumeStatus string + +const ( + // Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as + // the specified VolumeAttributesClass not existing + PersistentVolumeClaimModifyVolumePending PersistentVolumeClaimModifyVolumeStatus = "Pending" + // InProgress indicates that the volume is being modified + PersistentVolumeClaimModifyVolumeInProgress PersistentVolumeClaimModifyVolumeStatus = "InProgress" + // Infeasible indicates that the request has been rejected as invalid by the CSI driver. To + // resolve the error, a valid VolumeAttributesClass needs to be specified + PersistentVolumeClaimModifyVolumeInfeasible PersistentVolumeClaimModifyVolumeStatus = "Infeasible" +) + +// ModifyVolumeStatus represents the status object of ControllerModifyVolume operation +type ModifyVolumeStatus struct { + // targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled + TargetVolumeAttributesClassName string `json:"targetVolumeAttributesClassName,omitempty" protobuf:"bytes,1,opt,name=targetVolumeAttributesClassName"` + // status is the status of the ControllerModifyVolume operation. It can be in any of following states: + // - Pending + // Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as + // the specified VolumeAttributesClass not existing. + // - InProgress + // InProgress indicates that the volume is being modified. + // - Infeasible + // Infeasible indicates that the request has been rejected as invalid by the CSI driver. To + // resolve the error, a valid VolumeAttributesClass needs to be specified. + // Note: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately. + Status PersistentVolumeClaimModifyVolumeStatus `json:"status" protobuf:"bytes,2,opt,name=status,casttype=PersistentVolumeClaimModifyVolumeStatus"` +} + // PersistentVolumeClaimCondition contains details about state of pvc type PersistentVolumeClaimCondition struct { Type PersistentVolumeClaimConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=PersistentVolumeClaimConditionType"` @@ -693,6 +755,18 @@ type PersistentVolumeClaimStatus struct { // +mapType=granular // +optional AllocatedResourceStatuses map[ResourceName]ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty" protobuf:"bytes,7,rep,name=allocatedResourceStatuses"` + // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. + // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + CurrentVolumeAttributesClassName *string `json:"currentVolumeAttributesClassName,omitempty" protobuf:"bytes,8,opt,name=currentVolumeAttributesClassName"` + // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. + // When this is unset, there is no ModifyVolume operation being attempted. + // This is an alpha field and requires enabling VolumeAttributesClass feature. + // +featureGate=VolumeAttributesClass + // +optional + ModifyVolumeStatus *ModifyVolumeStatus `json:"modifyVolumeStatus,omitempty" protobuf:"bytes,9,opt,name=modifyVolumeStatus"` } // +enum diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index cbc72fa4ff1..2fc669706a0 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1025,6 +1025,16 @@ func (LocalVolumeSource) SwaggerDoc() map[string]string { return map_LocalVolumeSource } +var map_ModifyVolumeStatus = map[string]string{ + "": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation", + "targetVolumeAttributesClassName": "targetVolumeAttributesClassName is the name of the VolumeAttributesClass the PVC currently being reconciled", + "status": "status is the status of the ControllerModifyVolume operation. It can be in any of following states:\n - Pending\n Pending indicates that the PersistentVolumeClaim cannot be modified due to unmet requirements, such as\n the specified VolumeAttributesClass not existing.\n - InProgress\n InProgress indicates that the volume is being modified.\n - Infeasible\n Infeasible indicates that the request has been rejected as invalid by the CSI driver. To\n\t resolve the error, a valid VolumeAttributesClass needs to be specified.\nNote: New statuses can be added in the future. Consumers should check for unknown statuses and fail appropriately.", +} + +func (ModifyVolumeStatus) SwaggerDoc() map[string]string { + return map_ModifyVolumeStatus +} + var map_NFSVolumeSource = map[string]string{ "": "Represents an NFS mount that lasts the lifetime of a pod. NFS volumes do not support ownership management or SELinux relabeling.", "server": "server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", @@ -1341,15 +1351,16 @@ func (PersistentVolumeClaimList) SwaggerDoc() map[string]string { } var map_PersistentVolumeClaimSpec = map[string]string{ - "": "PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes", - "accessModes": "accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", - "selector": "selector is a label query over volumes to consider for binding.", - "resources": "resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources", - "volumeName": "volumeName is the binding reference to the PersistentVolume backing this claim.", - "storageClassName": "storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", - "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", - "dataSource": "dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.", - "dataSourceRef": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While dataSource ignores disallowed values (dropping them), dataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n* While dataSource only allows local objects, dataSourceRef allows objects\n in any namespaces.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.", + "": "PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes", + "accessModes": "accessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", + "selector": "selector is a label query over volumes to consider for binding.", + "resources": "resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources", + "volumeName": "volumeName is the binding reference to the PersistentVolume backing this claim.", + "storageClassName": "storageClassName is the name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", + "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", + "dataSource": "dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.", + "dataSourceRef": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While dataSource ignores disallowed values (dropping them), dataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n* While dataSource only allows local objects, dataSourceRef allows objects\n in any namespaces.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.", + "volumeAttributesClassName": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass (Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.", } func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { @@ -1357,13 +1368,15 @@ func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { } var map_PersistentVolumeClaimStatus = map[string]string{ - "": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", - "phase": "phase represents the current phase of PersistentVolumeClaim.", - "accessModes": "accessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", - "capacity": "capacity represents the actual resources of the underlying volume.", - "conditions": "conditions is the current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", - "allocatedResources": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nCapacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity.\n\nA controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "allocatedResourceStatuses": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nClaimResourceStatus can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState set when resize controller starts resizing the volume in control-plane.\n\t- ControllerResizeFailed:\n\t\tState set when resize has failed in resize controller with a terminal error.\n\t- NodeResizePending:\n\t\tState set when resize controller has finished resizing the volume but further resizing of\n\t\tvolume is needed on the node.\n\t- NodeResizeInProgress:\n\t\tState set when kubelet starts resizing the volume.\n\t- NodeResizeFailed:\n\t\tState set when resizing has failed in kubelet with a terminal error. Transient errors don't set\n\t\tNodeResizeFailed.\nFor example: if expanding a PVC for more capacity - this field can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\"\nWhen this field is not set, it means that no resize operation is in progress for the given PVC.\n\nA controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "": "PersistentVolumeClaimStatus is the current status of a persistent volume claim.", + "phase": "phase represents the current phase of PersistentVolumeClaim.", + "accessModes": "accessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", + "capacity": "capacity represents the actual resources of the underlying volume.", + "conditions": "conditions is the current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.", + "allocatedResources": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nCapacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity.\n\nA controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "allocatedResourceStatuses": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nClaimResourceStatus can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState set when resize controller starts resizing the volume in control-plane.\n\t- ControllerResizeFailed:\n\t\tState set when resize has failed in resize controller with a terminal error.\n\t- NodeResizePending:\n\t\tState set when resize controller has finished resizing the volume but further resizing of\n\t\tvolume is needed on the node.\n\t- NodeResizeInProgress:\n\t\tState set when kubelet starts resizing the volume.\n\t- NodeResizeFailed:\n\t\tState set when resizing has failed in kubelet with a terminal error. Transient errors don't set\n\t\tNodeResizeFailed.\nFor example: if expanding a PVC for more capacity - this field can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\"\nWhen this field is not set, it means that no resize operation is in progress for the given PVC.\n\nA controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", + "currentVolumeAttributesClassName": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is an alpha field and requires enabling VolumeAttributesClass feature.", + "modifyVolumeStatus": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is an alpha field and requires enabling VolumeAttributesClass feature.", } func (PersistentVolumeClaimStatus) SwaggerDoc() map[string]string { @@ -1440,6 +1453,7 @@ var map_PersistentVolumeSpec = map[string]string{ "mountOptions": "mountOptions is the list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options", "volumeMode": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", "nodeAffinity": "nodeAffinity defines constraints that limit what nodes this volume can be accessed from. This field influences the scheduling of pods that use this volume.", + "volumeAttributesClassName": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is an alpha field and requires enabling VolumeAttributesClass feature.", } func (PersistentVolumeSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 528fbb3b125..6e2be5aecc6 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -2318,6 +2318,22 @@ func (in *LocalVolumeSource) DeepCopy() *LocalVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ModifyVolumeStatus) DeepCopyInto(out *ModifyVolumeStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModifyVolumeStatus. +func (in *ModifyVolumeStatus) DeepCopy() *ModifyVolumeStatus { + if in == nil { + return nil + } + out := new(ModifyVolumeStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NFSVolumeSource) DeepCopyInto(out *NFSVolumeSource) { *out = *in @@ -3066,6 +3082,11 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec *out = new(TypedObjectReference) (*in).DeepCopyInto(*out) } + if in.VolumeAttributesClassName != nil { + in, out := &in.VolumeAttributesClassName, &out.VolumeAttributesClassName + *out = new(string) + **out = **in + } return } @@ -3115,6 +3136,16 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val } } + if in.CurrentVolumeAttributesClassName != nil { + in, out := &in.CurrentVolumeAttributesClassName, &out.CurrentVolumeAttributesClassName + *out = new(string) + **out = **in + } + if in.ModifyVolumeStatus != nil { + in, out := &in.ModifyVolumeStatus, &out.ModifyVolumeStatus + *out = new(ModifyVolumeStatus) + **out = **in + } return } @@ -3357,6 +3388,11 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { *out = new(VolumeNodeAffinity) (*in).DeepCopyInto(*out) } + if in.VolumeAttributesClassName != nil { + in, out := &in.VolumeAttributesClassName, &out.VolumeAttributesClassName + *out = new(string) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/storage/v1alpha1/generated.pb.go b/staging/src/k8s.io/api/storage/v1alpha1/generated.pb.go index 1f3f380108a..2b15ec3feb0 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/generated.pb.go +++ b/staging/src/k8s.io/api/storage/v1alpha1/generated.pb.go @@ -243,10 +243,66 @@ func (m *VolumeAttachmentStatus) XXX_DiscardUnknown() { var xxx_messageInfo_VolumeAttachmentStatus proto.InternalMessageInfo +func (m *VolumeAttributesClass) Reset() { *m = VolumeAttributesClass{} } +func (*VolumeAttributesClass) ProtoMessage() {} +func (*VolumeAttributesClass) Descriptor() ([]byte, []int) { + return fileDescriptor_10f856db1e670dc4, []int{7} +} +func (m *VolumeAttributesClass) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *VolumeAttributesClass) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *VolumeAttributesClass) XXX_Merge(src proto.Message) { + xxx_messageInfo_VolumeAttributesClass.Merge(m, src) +} +func (m *VolumeAttributesClass) XXX_Size() int { + return m.Size() +} +func (m *VolumeAttributesClass) XXX_DiscardUnknown() { + xxx_messageInfo_VolumeAttributesClass.DiscardUnknown(m) +} + +var xxx_messageInfo_VolumeAttributesClass proto.InternalMessageInfo + +func (m *VolumeAttributesClassList) Reset() { *m = VolumeAttributesClassList{} } +func (*VolumeAttributesClassList) ProtoMessage() {} +func (*VolumeAttributesClassList) Descriptor() ([]byte, []int) { + return fileDescriptor_10f856db1e670dc4, []int{8} +} +func (m *VolumeAttributesClassList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *VolumeAttributesClassList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *VolumeAttributesClassList) XXX_Merge(src proto.Message) { + xxx_messageInfo_VolumeAttributesClassList.Merge(m, src) +} +func (m *VolumeAttributesClassList) XXX_Size() int { + return m.Size() +} +func (m *VolumeAttributesClassList) XXX_DiscardUnknown() { + xxx_messageInfo_VolumeAttributesClassList.DiscardUnknown(m) +} + +var xxx_messageInfo_VolumeAttributesClassList proto.InternalMessageInfo + func (m *VolumeError) Reset() { *m = VolumeError{} } func (*VolumeError) ProtoMessage() {} func (*VolumeError) Descriptor() ([]byte, []int) { - return fileDescriptor_10f856db1e670dc4, []int{7} + return fileDescriptor_10f856db1e670dc4, []int{9} } func (m *VolumeError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -280,6 +336,9 @@ func init() { proto.RegisterType((*VolumeAttachmentSpec)(nil), "k8s.io.api.storage.v1alpha1.VolumeAttachmentSpec") proto.RegisterType((*VolumeAttachmentStatus)(nil), "k8s.io.api.storage.v1alpha1.VolumeAttachmentStatus") proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.storage.v1alpha1.VolumeAttachmentStatus.AttachmentMetadataEntry") + proto.RegisterType((*VolumeAttributesClass)(nil), "k8s.io.api.storage.v1alpha1.VolumeAttributesClass") + proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.storage.v1alpha1.VolumeAttributesClass.ParametersEntry") + proto.RegisterType((*VolumeAttributesClassList)(nil), "k8s.io.api.storage.v1alpha1.VolumeAttributesClassList") proto.RegisterType((*VolumeError)(nil), "k8s.io.api.storage.v1alpha1.VolumeError") } @@ -288,65 +347,71 @@ func init() { } var fileDescriptor_10f856db1e670dc4 = []byte{ - // 925 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x3f, 0x6f, 0x23, 0x45, - 0x14, 0xf7, 0xc6, 0xce, 0x9d, 0x6f, 0x1c, 0xc0, 0x37, 0x32, 0x87, 0xe5, 0x93, 0xd6, 0x91, 0x2b, - 0x83, 0xb8, 0x59, 0x72, 0x20, 0x74, 0xa2, 0xf3, 0x26, 0x29, 0x22, 0x92, 0x00, 0xe3, 0x08, 0x21, - 0xa0, 0x60, 0xbc, 0x7e, 0xd8, 0x13, 0x7b, 0xff, 0x68, 0x67, 0x36, 0xc2, 0x54, 0x54, 0xd4, 0x74, - 0x7c, 0x03, 0x3e, 0x4b, 0x0a, 0x24, 0x4e, 0x54, 0x57, 0x59, 0x64, 0xf9, 0x0e, 0x14, 0x34, 0xa0, - 0x9d, 0x1d, 0xaf, 0x37, 0x5e, 0x27, 0xe7, 0x4b, 0x71, 0x9d, 0xdf, 0x9b, 0xf7, 0x7e, 0xbf, 0xf7, - 0xdf, 0x8b, 0x0e, 0x26, 0xcf, 0x04, 0xe1, 0xbe, 0x35, 0x89, 0x06, 0x10, 0x7a, 0x20, 0x41, 0x58, - 0x17, 0xe0, 0x0d, 0xfd, 0xd0, 0xd2, 0x0f, 0x2c, 0xe0, 0x96, 0x90, 0x7e, 0xc8, 0x46, 0x60, 0x5d, - 0xec, 0xb1, 0x69, 0x30, 0x66, 0x7b, 0xd6, 0x08, 0x3c, 0x08, 0x99, 0x84, 0x21, 0x09, 0x42, 0x5f, - 0xfa, 0xf8, 0x71, 0x6a, 0x4c, 0x58, 0xc0, 0x89, 0x36, 0x26, 0x0b, 0xe3, 0xd6, 0x93, 0x11, 0x97, - 0xe3, 0x68, 0x40, 0x1c, 0xdf, 0xb5, 0x46, 0xfe, 0xc8, 0xb7, 0x94, 0xcf, 0x20, 0xfa, 0x5e, 0x49, - 0x4a, 0x50, 0xbf, 0x52, 0xac, 0x56, 0x27, 0x47, 0xec, 0xf8, 0x61, 0xc2, 0xba, 0xca, 0xd7, 0xfa, - 0x68, 0x69, 0xe3, 0x32, 0x67, 0xcc, 0x3d, 0x08, 0x67, 0x56, 0x30, 0x19, 0x29, 0xa7, 0x10, 0x84, - 0x1f, 0x85, 0x0e, 0xbc, 0x92, 0x97, 0xb0, 0x5c, 0x90, 0x6c, 0x1d, 0x97, 0x75, 0x93, 0x57, 0x18, - 0x79, 0x92, 0xbb, 0x45, 0x9a, 0x8f, 0x5f, 0xe6, 0x20, 0x9c, 0x31, 0xb8, 0x6c, 0xd5, 0xaf, 0xf3, - 0x4f, 0x19, 0xe1, 0xfd, 0xfe, 0x51, 0x3f, 0xad, 0xdf, 0x3e, 0x0b, 0x98, 0xc3, 0xe5, 0x0c, 0x7f, - 0x87, 0xaa, 0x49, 0x68, 0x43, 0x26, 0x59, 0xd3, 0xd8, 0x35, 0xba, 0xb5, 0xa7, 0x1f, 0x90, 0x65, - 0xb9, 0x33, 0x06, 0x12, 0x4c, 0x46, 0x89, 0x42, 0x90, 0xc4, 0x9a, 0x5c, 0xec, 0x91, 0xcf, 0x06, - 0xe7, 0xe0, 0xc8, 0x13, 0x90, 0xcc, 0xc6, 0x97, 0xf3, 0x76, 0x29, 0x9e, 0xb7, 0xd1, 0x52, 0x47, - 0x33, 0x54, 0xcc, 0xd1, 0x8e, 0xe7, 0x0f, 0xe1, 0xcc, 0x0f, 0xfc, 0xa9, 0x3f, 0x9a, 0x35, 0xb7, - 0x14, 0xcb, 0x87, 0x9b, 0xb1, 0x1c, 0xb3, 0x01, 0x4c, 0xfb, 0x30, 0x05, 0x47, 0xfa, 0xa1, 0x5d, - 0x8f, 0xe7, 0xed, 0x9d, 0xd3, 0x1c, 0x18, 0xbd, 0x06, 0x8d, 0x0f, 0x50, 0x5d, 0xcf, 0xc7, 0xfe, - 0x94, 0x09, 0x71, 0xca, 0x5c, 0x68, 0x96, 0x77, 0x8d, 0xee, 0x03, 0xbb, 0xa9, 0x43, 0xac, 0xf7, - 0x57, 0xde, 0x69, 0xc1, 0x03, 0x7f, 0x85, 0xaa, 0x8e, 0x2e, 0x4f, 0xb3, 0xa2, 0x82, 0x25, 0xb7, - 0x05, 0x4b, 0x16, 0x13, 0x41, 0xbe, 0x88, 0x98, 0x27, 0xb9, 0x9c, 0xd9, 0x3b, 0xf1, 0xbc, 0x5d, - 0x5d, 0x94, 0x98, 0x66, 0x68, 0x58, 0xa0, 0x87, 0x2e, 0xfb, 0x81, 0xbb, 0x91, 0xfb, 0xa5, 0x3f, - 0x8d, 0x5c, 0xe8, 0xf3, 0x1f, 0xa1, 0xb9, 0x7d, 0x27, 0x8a, 0xb7, 0xe3, 0x79, 0xfb, 0xe1, 0xc9, - 0x2a, 0x18, 0x2d, 0xe2, 0x77, 0x7e, 0x37, 0xd0, 0xa3, 0x62, 0xe3, 0x8f, 0xb9, 0x90, 0xf8, 0xdb, - 0x42, 0xf3, 0xc9, 0x86, 0x6d, 0xe1, 0x22, 0x6d, 0x7d, 0x5d, 0xd7, 0xb5, 0xba, 0xd0, 0xe4, 0x1a, - 0x7f, 0x86, 0xb6, 0xb9, 0x04, 0x57, 0x34, 0xb7, 0x76, 0xcb, 0xdd, 0xda, 0x53, 0x8b, 0xdc, 0xb2, - 0xc6, 0xa4, 0x18, 0xa1, 0xfd, 0x86, 0xc6, 0xde, 0x3e, 0x4a, 0x50, 0x68, 0x0a, 0xd6, 0xf9, 0x6d, - 0x0b, 0xd5, 0xd3, 0xec, 0x7a, 0x52, 0x32, 0x67, 0xec, 0x82, 0x27, 0x5f, 0xc3, 0x14, 0xf7, 0x51, - 0x45, 0x04, 0xe0, 0xe8, 0xe9, 0xdd, 0xbb, 0x35, 0x97, 0xd5, 0xf0, 0xfa, 0x01, 0x38, 0xf6, 0x8e, - 0x86, 0xaf, 0x24, 0x12, 0x55, 0x60, 0xf8, 0x1b, 0x74, 0x4f, 0x48, 0x26, 0x23, 0xa1, 0xa6, 0xf4, - 0xfa, 0x52, 0x6c, 0x00, 0xab, 0x5c, 0xed, 0x37, 0x35, 0xf0, 0xbd, 0x54, 0xa6, 0x1a, 0xb2, 0x73, - 0x69, 0xa0, 0xc6, 0xaa, 0xcb, 0x6b, 0xe8, 0x3a, 0xbd, 0xde, 0xf5, 0x27, 0xaf, 0x94, 0xd2, 0x0d, - 0x3d, 0xff, 0xd3, 0x40, 0x8f, 0x0a, 0xd9, 0xab, 0x85, 0xc0, 0xc7, 0xa8, 0x11, 0x40, 0x28, 0xb8, - 0x90, 0xe0, 0xc9, 0xd4, 0x46, 0xad, 0xbd, 0x91, 0xae, 0x7d, 0x3c, 0x6f, 0x37, 0x3e, 0x5f, 0xf3, - 0x4e, 0xd7, 0x7a, 0xe1, 0x73, 0x54, 0xe7, 0xde, 0x94, 0x7b, 0xa0, 0xf7, 0x67, 0xd9, 0xf1, 0x6e, - 0x3e, 0x8f, 0xe4, 0x8f, 0x23, 0x29, 0xc8, 0x2a, 0xb2, 0x6a, 0x74, 0x23, 0x39, 0x33, 0x47, 0x2b, - 0x28, 0xb4, 0x80, 0xdb, 0xf9, 0x63, 0x4d, 0x7f, 0x92, 0x07, 0xfc, 0x3e, 0xaa, 0x32, 0xa5, 0x81, - 0x50, 0xa7, 0x91, 0xd5, 0xbb, 0xa7, 0xf5, 0x34, 0xb3, 0x50, 0x33, 0xa4, 0x4a, 0xb1, 0xe6, 0xb0, - 0x6e, 0x30, 0x43, 0xca, 0x35, 0x37, 0x43, 0x4a, 0xa6, 0x1a, 0x32, 0x09, 0x25, 0x39, 0xb0, 0xb9, - 0x43, 0x9a, 0x85, 0x72, 0xaa, 0xf5, 0x34, 0xb3, 0xe8, 0xfc, 0x57, 0x5e, 0xd3, 0x26, 0x35, 0x8c, - 0xb9, 0x9c, 0x86, 0x2a, 0xa7, 0x6a, 0x21, 0xa7, 0x61, 0x96, 0xd3, 0x10, 0xff, 0x6a, 0x20, 0xcc, - 0x32, 0x88, 0x93, 0xc5, 0xb0, 0xa6, 0x13, 0xf5, 0xe9, 0x1d, 0x96, 0x84, 0xf4, 0x0a, 0x68, 0x87, - 0x9e, 0x0c, 0x67, 0x76, 0x4b, 0x47, 0x81, 0x8b, 0x06, 0x74, 0x4d, 0x08, 0xf8, 0x1c, 0xd5, 0x52, - 0xed, 0x61, 0x18, 0xfa, 0xa1, 0x5e, 0xdb, 0xee, 0x06, 0x11, 0x29, 0x7b, 0xdb, 0x8c, 0xe7, 0xed, - 0x5a, 0x6f, 0x09, 0xf0, 0xef, 0xbc, 0x5d, 0xcb, 0xbd, 0xd3, 0x3c, 0x78, 0xc2, 0x35, 0x84, 0x25, - 0x57, 0xe5, 0x2e, 0x5c, 0x07, 0x70, 0x33, 0x57, 0x0e, 0xbc, 0x75, 0x88, 0xde, 0xb9, 0xa1, 0x44, - 0xb8, 0x8e, 0xca, 0x13, 0x98, 0xa5, 0x93, 0x48, 0x93, 0x9f, 0xb8, 0x81, 0xb6, 0x2f, 0xd8, 0x34, - 0x4a, 0x27, 0xee, 0x01, 0x4d, 0x85, 0x4f, 0xb6, 0x9e, 0x19, 0x9d, 0x9f, 0x0d, 0x94, 0xe7, 0xc0, - 0xc7, 0xa8, 0x92, 0x7c, 0x93, 0xe8, 0x33, 0xf3, 0xde, 0x66, 0x67, 0xe6, 0x8c, 0xbb, 0xb0, 0x3c, - 0x97, 0x89, 0x44, 0x15, 0x0a, 0x7e, 0x17, 0xdd, 0x77, 0x41, 0x08, 0x36, 0xd2, 0xcc, 0xf6, 0x5b, - 0xda, 0xe8, 0xfe, 0x49, 0xaa, 0xa6, 0x8b, 0x77, 0xbb, 0x77, 0x79, 0x65, 0x96, 0x9e, 0x5f, 0x99, - 0xa5, 0x17, 0x57, 0x66, 0xe9, 0xa7, 0xd8, 0x34, 0x2e, 0x63, 0xd3, 0x78, 0x1e, 0x9b, 0xc6, 0x8b, - 0xd8, 0x34, 0xfe, 0x8a, 0x4d, 0xe3, 0x97, 0xbf, 0xcd, 0xd2, 0xd7, 0x8f, 0x6f, 0xf9, 0x0a, 0xfd, - 0x3f, 0x00, 0x00, 0xff, 0xff, 0x1a, 0x8d, 0x17, 0x01, 0xbc, 0x0a, 0x00, 0x00, + // 1023 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcb, 0x6e, 0x23, 0x45, + 0x17, 0x4e, 0xe7, 0x32, 0xe3, 0xa9, 0xe4, 0xff, 0xc7, 0x53, 0xca, 0x0c, 0xc6, 0x23, 0xb5, 0x23, + 0xaf, 0x0c, 0x62, 0xba, 0x49, 0x40, 0x68, 0x84, 0xc4, 0xc2, 0x9d, 0x64, 0x11, 0x91, 0x84, 0xa1, + 0x1c, 0x01, 0x02, 0x16, 0x94, 0xdb, 0x07, 0xbb, 0x62, 0xf7, 0x45, 0x55, 0xd5, 0x16, 0x66, 0xc5, + 0x8a, 0x35, 0x3b, 0xde, 0x80, 0x67, 0xc9, 0x02, 0x89, 0xd1, 0xac, 0x66, 0x65, 0x91, 0x86, 0x67, + 0x60, 0xc1, 0x06, 0xd4, 0xd5, 0xe5, 0x76, 0xc7, 0x6d, 0x07, 0x27, 0x8b, 0xec, 0x5c, 0xe7, 0xf2, + 0x9d, 0xdb, 0x77, 0x4e, 0x27, 0xe8, 0xa0, 0xff, 0x5c, 0x58, 0x2c, 0xb0, 0xfb, 0x51, 0x1b, 0xb8, + 0x0f, 0x12, 0x84, 0x3d, 0x04, 0xbf, 0x13, 0x70, 0x5b, 0x2b, 0x68, 0xc8, 0x6c, 0x21, 0x03, 0x4e, + 0xbb, 0x60, 0x0f, 0x77, 0xe9, 0x20, 0xec, 0xd1, 0x5d, 0xbb, 0x0b, 0x3e, 0x70, 0x2a, 0xa1, 0x63, + 0x85, 0x3c, 0x90, 0x01, 0x7e, 0x9a, 0x1a, 0x5b, 0x34, 0x64, 0x96, 0x36, 0xb6, 0x26, 0xc6, 0xd5, + 0x67, 0x5d, 0x26, 0x7b, 0x51, 0xdb, 0x72, 0x03, 0xcf, 0xee, 0x06, 0xdd, 0xc0, 0x56, 0x3e, 0xed, + 0xe8, 0x5b, 0xf5, 0x52, 0x0f, 0xf5, 0x2b, 0xc5, 0xaa, 0xd6, 0x73, 0x81, 0xdd, 0x80, 0x27, 0x51, + 0x67, 0xe3, 0x55, 0xdf, 0x9f, 0xda, 0x78, 0xd4, 0xed, 0x31, 0x1f, 0xf8, 0xc8, 0x0e, 0xfb, 0x5d, + 0xe5, 0xc4, 0x41, 0x04, 0x11, 0x77, 0xe1, 0x46, 0x5e, 0xc2, 0xf6, 0x40, 0xd2, 0x79, 0xb1, 0xec, + 0x45, 0x5e, 0x3c, 0xf2, 0x25, 0xf3, 0x8a, 0x61, 0x3e, 0xf8, 0x2f, 0x07, 0xe1, 0xf6, 0xc0, 0xa3, + 0xb3, 0x7e, 0xf5, 0xbf, 0xd6, 0x10, 0xde, 0x6f, 0x1d, 0xb5, 0xd2, 0xfe, 0xed, 0xd3, 0x90, 0xba, + 0x4c, 0x8e, 0xf0, 0x37, 0xa8, 0x94, 0xa4, 0xd6, 0xa1, 0x92, 0x56, 0x8c, 0x1d, 0xa3, 0xb1, 0xb9, + 0xf7, 0xae, 0x35, 0x6d, 0x77, 0x16, 0xc1, 0x0a, 0xfb, 0xdd, 0x44, 0x20, 0xac, 0xc4, 0xda, 0x1a, + 0xee, 0x5a, 0x9f, 0xb4, 0xcf, 0xc1, 0x95, 0x27, 0x20, 0xa9, 0x83, 0x2f, 0xc6, 0xb5, 0x95, 0x78, + 0x5c, 0x43, 0x53, 0x19, 0xc9, 0x50, 0x31, 0x43, 0x5b, 0x7e, 0xd0, 0x81, 0xb3, 0x20, 0x0c, 0x06, + 0x41, 0x77, 0x54, 0x59, 0x55, 0x51, 0xde, 0x5b, 0x2e, 0xca, 0x31, 0x6d, 0xc3, 0xa0, 0x05, 0x03, + 0x70, 0x65, 0xc0, 0x9d, 0x72, 0x3c, 0xae, 0x6d, 0x9d, 0xe6, 0xc0, 0xc8, 0x15, 0x68, 0x7c, 0x80, + 0xca, 0x9a, 0x1f, 0xfb, 0x03, 0x2a, 0xc4, 0x29, 0xf5, 0xa0, 0xb2, 0xb6, 0x63, 0x34, 0x1e, 0x38, + 0x15, 0x9d, 0x62, 0xb9, 0x35, 0xa3, 0x27, 0x05, 0x0f, 0xfc, 0x05, 0x2a, 0xb9, 0xba, 0x3d, 0x95, + 0x75, 0x95, 0xac, 0x75, 0x5d, 0xb2, 0xd6, 0x84, 0x11, 0xd6, 0xa7, 0x11, 0xf5, 0x25, 0x93, 0x23, + 0x67, 0x2b, 0x1e, 0xd7, 0x4a, 0x93, 0x16, 0x93, 0x0c, 0x0d, 0x0b, 0xf4, 0xc8, 0xa3, 0xdf, 0x31, + 0x2f, 0xf2, 0x3e, 0x0b, 0x06, 0x91, 0x07, 0x2d, 0xf6, 0x3d, 0x54, 0x36, 0x6e, 0x15, 0xe2, 0x71, + 0x3c, 0xae, 0x3d, 0x3a, 0x99, 0x05, 0x23, 0x45, 0xfc, 0xfa, 0xaf, 0x06, 0x7a, 0x52, 0x1c, 0xfc, + 0x31, 0x13, 0x12, 0x7f, 0x5d, 0x18, 0xbe, 0xb5, 0xe4, 0x58, 0x98, 0x48, 0x47, 0x5f, 0xd6, 0x7d, + 0x2d, 0x4d, 0x24, 0xb9, 0xc1, 0x9f, 0xa1, 0x0d, 0x26, 0xc1, 0x13, 0x95, 0xd5, 0x9d, 0xb5, 0xc6, + 0xe6, 0x9e, 0x6d, 0x5d, 0xb3, 0xc6, 0x56, 0x31, 0x43, 0xe7, 0x7f, 0x1a, 0x7b, 0xe3, 0x28, 0x41, + 0x21, 0x29, 0x58, 0xfd, 0x97, 0x55, 0x54, 0x4e, 0xab, 0x6b, 0x4a, 0x49, 0xdd, 0x9e, 0x07, 0xbe, + 0xbc, 0x03, 0x16, 0xb7, 0xd0, 0xba, 0x08, 0xc1, 0xd5, 0xec, 0xdd, 0xbd, 0xb6, 0x96, 0xd9, 0xf4, + 0x5a, 0x21, 0xb8, 0xce, 0x96, 0x86, 0x5f, 0x4f, 0x5e, 0x44, 0x81, 0xe1, 0xaf, 0xd0, 0x3d, 0x21, + 0xa9, 0x8c, 0x84, 0x62, 0xe9, 0xd5, 0xa5, 0x58, 0x02, 0x56, 0xb9, 0x3a, 0xff, 0xd7, 0xc0, 0xf7, + 0xd2, 0x37, 0xd1, 0x90, 0xf5, 0x0b, 0x03, 0x6d, 0xcf, 0xba, 0xdc, 0xc1, 0xd4, 0xc9, 0xd5, 0xa9, + 0x3f, 0xbb, 0x51, 0x49, 0x0b, 0x66, 0xfe, 0xca, 0x40, 0x4f, 0x0a, 0xd5, 0xab, 0x85, 0xc0, 0xc7, + 0x68, 0x3b, 0x04, 0x2e, 0x98, 0x90, 0xe0, 0xcb, 0xd4, 0x46, 0xad, 0xbd, 0x91, 0xae, 0x7d, 0x3c, + 0xae, 0x6d, 0xbf, 0x98, 0xa3, 0x27, 0x73, 0xbd, 0xf0, 0x39, 0x2a, 0x33, 0x7f, 0xc0, 0x7c, 0xd0, + 0xfb, 0x33, 0x9d, 0x78, 0x23, 0x5f, 0x47, 0xf2, 0xe1, 0x48, 0x1a, 0x32, 0x8b, 0xac, 0x06, 0xbd, + 0x9d, 0x9c, 0x99, 0xa3, 0x19, 0x14, 0x52, 0xc0, 0xad, 0xff, 0x36, 0x67, 0x3e, 0x89, 0x02, 0xbf, + 0x83, 0x4a, 0x54, 0x49, 0x80, 0xeb, 0x32, 0xb2, 0x7e, 0x37, 0xb5, 0x9c, 0x64, 0x16, 0x8a, 0x43, + 0xaa, 0x15, 0x73, 0x0e, 0xeb, 0x12, 0x1c, 0x52, 0xae, 0x39, 0x0e, 0xa9, 0x37, 0xd1, 0x90, 0x49, + 0x2a, 0xc9, 0x81, 0xcd, 0x1d, 0xd2, 0x2c, 0x95, 0x53, 0x2d, 0x27, 0x99, 0x45, 0xfd, 0x9f, 0xb5, + 0x39, 0x63, 0x52, 0x64, 0xcc, 0xd5, 0xd4, 0x51, 0x35, 0x95, 0x0a, 0x35, 0x75, 0xb2, 0x9a, 0x3a, + 0xf8, 0x67, 0x03, 0x61, 0x9a, 0x41, 0x9c, 0x4c, 0xc8, 0x9a, 0x32, 0xea, 0xe3, 0x5b, 0x2c, 0x89, + 0xd5, 0x2c, 0xa0, 0x1d, 0xfa, 0x92, 0x8f, 0x9c, 0xaa, 0xce, 0x02, 0x17, 0x0d, 0xc8, 0x9c, 0x14, + 0xf0, 0x39, 0xda, 0x4c, 0xa5, 0x87, 0x9c, 0x07, 0x5c, 0xaf, 0x6d, 0x63, 0x89, 0x8c, 0x94, 0xbd, + 0x63, 0xc6, 0xe3, 0xda, 0x66, 0x73, 0x0a, 0xf0, 0xf7, 0xb8, 0xb6, 0x99, 0xd3, 0x93, 0x3c, 0x78, + 0x12, 0xab, 0x03, 0xd3, 0x58, 0xeb, 0xb7, 0x89, 0x75, 0x00, 0x8b, 0x63, 0xe5, 0xc0, 0xab, 0x87, + 0xe8, 0x8d, 0x05, 0x2d, 0xc2, 0x65, 0xb4, 0xd6, 0x87, 0x51, 0xca, 0x44, 0x92, 0xfc, 0xc4, 0xdb, + 0x68, 0x63, 0x48, 0x07, 0x51, 0xca, 0xb8, 0x07, 0x24, 0x7d, 0x7c, 0xb8, 0xfa, 0xdc, 0xa8, 0xff, + 0xb9, 0x8a, 0x1e, 0x67, 0x13, 0xe0, 0xac, 0x1d, 0x49, 0x10, 0xea, 0xc3, 0x7a, 0x07, 0x17, 0x7a, + 0x0f, 0xa1, 0x0e, 0x67, 0x43, 0xe0, 0x8a, 0xad, 0x2a, 0xb5, 0xa9, 0xc7, 0x41, 0xa6, 0x21, 0x39, + 0x2b, 0x3c, 0x44, 0x28, 0xa4, 0x9c, 0x7a, 0x20, 0x81, 0x27, 0x47, 0x38, 0xe1, 0x97, 0xb3, 0x1c, + 0xbf, 0xf2, 0xd5, 0x59, 0x2f, 0x32, 0x90, 0x94, 0x56, 0x59, 0xdc, 0xa9, 0x82, 0xe4, 0x22, 0x55, + 0x3f, 0x42, 0x0f, 0x67, 0x5c, 0x6e, 0xd4, 0xe6, 0x57, 0x06, 0x7a, 0x73, 0x6e, 0x22, 0x77, 0x70, + 0xdf, 0x3f, 0xbf, 0x7a, 0xdf, 0xf7, 0x6e, 0xde, 0xad, 0x05, 0x47, 0xfe, 0x47, 0x03, 0xe5, 0xf9, + 0x89, 0x8f, 0xd1, 0x7a, 0xf2, 0xf7, 0xac, 0x2e, 0xe1, 0xed, 0xe5, 0x4a, 0x38, 0x63, 0x1e, 0x4c, + 0x3f, 0xb5, 0xc9, 0x8b, 0x28, 0x14, 0xfc, 0x16, 0xba, 0xef, 0x81, 0x10, 0xb4, 0x3b, 0xa1, 0xc6, + 0x43, 0x6d, 0x74, 0xff, 0x24, 0x15, 0x93, 0x89, 0xde, 0x69, 0x5e, 0x5c, 0x9a, 0x2b, 0x2f, 0x2f, + 0xcd, 0x95, 0xd7, 0x97, 0xe6, 0xca, 0x0f, 0xb1, 0x69, 0x5c, 0xc4, 0xa6, 0xf1, 0x32, 0x36, 0x8d, + 0xd7, 0xb1, 0x69, 0xfc, 0x1e, 0x9b, 0xc6, 0x4f, 0x7f, 0x98, 0x2b, 0x5f, 0x3e, 0xbd, 0xe6, 0x3f, + 0x98, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x2f, 0x75, 0xee, 0xf8, 0x0c, 0x00, 0x00, } func (m *CSIStorageCapacity) Marshal() (dAtA []byte, err error) { @@ -734,6 +799,115 @@ func (m *VolumeAttachmentStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *VolumeAttributesClass) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VolumeAttributesClass) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *VolumeAttributesClass) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Parameters) > 0 { + keysForParameters := make([]string, 0, len(m.Parameters)) + for k := range m.Parameters { + keysForParameters = append(keysForParameters, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForParameters) + for iNdEx := len(keysForParameters) - 1; iNdEx >= 0; iNdEx-- { + v := m.Parameters[string(keysForParameters[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForParameters[iNdEx]) + copy(dAtA[i:], keysForParameters[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForParameters[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1a + } + } + i -= len(m.DriverName) + copy(dAtA[i:], m.DriverName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DriverName))) + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *VolumeAttributesClassList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VolumeAttributesClassList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *VolumeAttributesClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *VolumeError) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -915,6 +1089,44 @@ func (m *VolumeAttachmentStatus) Size() (n int) { return n } +func (m *VolumeAttributesClass) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.DriverName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Parameters) > 0 { + for k, v := range m.Parameters { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *VolumeAttributesClassList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *VolumeError) Size() (n int) { if m == nil { return 0 @@ -1038,6 +1250,44 @@ func (this *VolumeAttachmentStatus) String() string { }, "") return s } +func (this *VolumeAttributesClass) String() string { + if this == nil { + return "nil" + } + keysForParameters := make([]string, 0, len(this.Parameters)) + for k := range this.Parameters { + keysForParameters = append(keysForParameters, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForParameters) + mapStringForParameters := "map[string]string{" + for _, k := range keysForParameters { + mapStringForParameters += fmt.Sprintf("%v: %v,", k, this.Parameters[k]) + } + mapStringForParameters += "}" + s := strings.Join([]string{`&VolumeAttributesClass{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `DriverName:` + fmt.Sprintf("%v", this.DriverName) + `,`, + `Parameters:` + mapStringForParameters + `,`, + `}`, + }, "") + return s +} +func (this *VolumeAttributesClassList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]VolumeAttributesClass{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "VolumeAttributesClass", "VolumeAttributesClass", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&VolumeAttributesClassList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} func (this *VolumeError) String() string { if this == nil { return "nil" @@ -2198,6 +2448,365 @@ func (m *VolumeAttachmentStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *VolumeAttributesClass) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VolumeAttributesClass: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VolumeAttributesClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DriverName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DriverName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Parameters == nil { + m.Parameters = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Parameters[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VolumeAttributesClassList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VolumeAttributesClassList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VolumeAttributesClassList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, VolumeAttributesClass{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *VolumeError) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/staging/src/k8s.io/api/storage/v1alpha1/generated.proto b/staging/src/k8s.io/api/storage/v1alpha1/generated.proto index 88250a0f013..49e522be53c 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/generated.proto +++ b/staging/src/k8s.io/api/storage/v1alpha1/generated.proto @@ -216,6 +216,46 @@ message VolumeAttachmentStatus { optional VolumeError detachError = 4; } +// VolumeAttributesClass represents a specification of mutable volume attributes +// defined by the CSI driver. The class can be specified during dynamic provisioning +// of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning. +message VolumeAttributesClass { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Name of the CSI driver + // This field is immutable. + optional string driverName = 2; + + // parameters hold volume attributes defined by the CSI driver. These values + // are opaque to the Kubernetes and are passed directly to the CSI driver. + // The underlying storage provider supports changing these attributes on an + // existing volume, however the parameters field itself is immutable. To + // invoke a volume update, a new VolumeAttributesClass should be created with + // new parameters, and the PersistentVolumeClaim should be updated to reference + // the new VolumeAttributesClass. + // + // This field is required and must contain at least one key/value pair. + // The keys cannot be empty, and the maximum number of parameters is 512, with + // a cumulative max size of 256K. If the CSI driver rejects invalid parameters, + // the target PersistentVolumeClaim will be set to an "Infeasible" state in the + // modifyVolumeStatus field. + map parameters = 3; +} + +// VolumeAttributesClassList is a collection of VolumeAttributesClass objects. +message VolumeAttributesClassList { + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is the list of VolumeAttributesClass objects. + repeated VolumeAttributesClass items = 2; +} + // VolumeError captures an error encountered during a volume operation. message VolumeError { // time represents the time the error was encountered. diff --git a/staging/src/k8s.io/api/storage/v1alpha1/register.go b/staging/src/k8s.io/api/storage/v1alpha1/register.go index 779c858028c..a70f8e18634 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/register.go +++ b/staging/src/k8s.io/api/storage/v1alpha1/register.go @@ -45,6 +45,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &VolumeAttachmentList{}, &CSIStorageCapacity{}, &CSIStorageCapacityList{}, + &VolumeAttributesClass{}, + &VolumeAttributesClassList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) diff --git a/staging/src/k8s.io/api/storage/v1alpha1/types.go b/staging/src/k8s.io/api/storage/v1alpha1/types.go index 59ef348a316..5957e480749 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/types.go +++ b/staging/src/k8s.io/api/storage/v1alpha1/types.go @@ -251,3 +251,55 @@ type CSIStorageCapacityList struct { // +listMapKey=name Items []CSIStorageCapacity `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// +genclient +// +genclient:nonNamespaced +// +k8s:prerelease-lifecycle-gen:introduced=1.29 +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VolumeAttributesClass represents a specification of mutable volume attributes +// defined by the CSI driver. The class can be specified during dynamic provisioning +// of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning. +type VolumeAttributesClass struct { + metav1.TypeMeta `json:",inline"` + + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Name of the CSI driver + // This field is immutable. + DriverName string `json:"driverName" protobuf:"bytes,2,opt,name=driverName"` + + // parameters hold volume attributes defined by the CSI driver. These values + // are opaque to the Kubernetes and are passed directly to the CSI driver. + // The underlying storage provider supports changing these attributes on an + // existing volume, however the parameters field itself is immutable. To + // invoke a volume update, a new VolumeAttributesClass should be created with + // new parameters, and the PersistentVolumeClaim should be updated to reference + // the new VolumeAttributesClass. + // + // This field is required and must contain at least one key/value pair. + // The keys cannot be empty, and the maximum number of parameters is 512, with + // a cumulative max size of 256K. If the CSI driver rejects invalid parameters, + // the target PersistentVolumeClaim will be set to an "Infeasible" state in the + // modifyVolumeStatus field. + Parameters map[string]string `json:"parameters,omitempty" protobuf:"bytes,3,rep,name=parameters"` +} + +// +k8s:prerelease-lifecycle-gen:introduced=1.29 +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VolumeAttributesClassList is a collection of VolumeAttributesClass objects. +type VolumeAttributesClassList struct { + metav1.TypeMeta `json:",inline"` + + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is the list of VolumeAttributesClass objects. + Items []VolumeAttributesClass `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/staging/src/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go index ba6afbd5916..ac87dbdca34 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go @@ -103,6 +103,27 @@ func (VolumeAttachmentStatus) SwaggerDoc() map[string]string { return map_VolumeAttachmentStatus } +var map_VolumeAttributesClass = map[string]string{ + "": "VolumeAttributesClass represents a specification of mutable volume attributes defined by the CSI driver. The class can be specified during dynamic provisioning of PersistentVolumeClaims, and changed in the PersistentVolumeClaim spec after provisioning.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "driverName": "Name of the CSI driver This field is immutable.", + "parameters": "parameters hold volume attributes defined by the CSI driver. These values are opaque to the Kubernetes and are passed directly to the CSI driver. The underlying storage provider supports changing these attributes on an existing volume, however the parameters field itself is immutable. To invoke a volume update, a new VolumeAttributesClass should be created with new parameters, and the PersistentVolumeClaim should be updated to reference the new VolumeAttributesClass.\n\nThis field is required and must contain at least one key/value pair. The keys cannot be empty, and the maximum number of parameters is 512, with a cumulative max size of 256K. If the CSI driver rejects invalid parameters, the target PersistentVolumeClaim will be set to an \"Infeasible\" state in the modifyVolumeStatus field.", +} + +func (VolumeAttributesClass) SwaggerDoc() map[string]string { + return map_VolumeAttributesClass +} + +var map_VolumeAttributesClassList = map[string]string{ + "": "VolumeAttributesClassList is a collection of VolumeAttributesClass objects.", + "metadata": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is the list of VolumeAttributesClass objects.", +} + +func (VolumeAttributesClassList) SwaggerDoc() map[string]string { + return map_VolumeAttributesClassList +} + var map_VolumeError = map[string]string{ "": "VolumeError captures an error encountered during a volume operation.", "time": "time represents the time the error was encountered.", diff --git a/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go index d9bc94b2500..942871f7889 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go @@ -238,6 +238,72 @@ func (in *VolumeAttachmentStatus) DeepCopy() *VolumeAttachmentStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeAttributesClass) DeepCopyInto(out *VolumeAttributesClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeAttributesClass. +func (in *VolumeAttributesClass) DeepCopy() *VolumeAttributesClass { + if in == nil { + return nil + } + out := new(VolumeAttributesClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeAttributesClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VolumeAttributesClassList) DeepCopyInto(out *VolumeAttributesClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]VolumeAttributesClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeAttributesClassList. +func (in *VolumeAttributesClassList) DeepCopy() *VolumeAttributesClassList { + if in == nil { + return nil + } + out := new(VolumeAttributesClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VolumeAttributesClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VolumeError) DeepCopyInto(out *VolumeError) { *out = *in diff --git a/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go b/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go index 41114c3c68f..c169e782ceb 100644 --- a/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go +++ b/staging/src/k8s.io/api/storage/v1alpha1/zz_generated.prerelease-lifecycle.go @@ -120,3 +120,39 @@ func (in *VolumeAttachmentList) APILifecycleReplacement() schema.GroupVersionKin func (in *VolumeAttachmentList) APILifecycleRemoved() (major, minor int) { return 1, 24 } + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *VolumeAttributesClass) APILifecycleIntroduced() (major, minor int) { + return 1, 29 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *VolumeAttributesClass) APILifecycleDeprecated() (major, minor int) { + return 1, 32 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *VolumeAttributesClass) APILifecycleRemoved() (major, minor int) { + return 1, 35 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *VolumeAttributesClassList) APILifecycleIntroduced() (major, minor int) { + return 1, 29 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *VolumeAttributesClassList) APILifecycleDeprecated() (major, minor int) { + return 1, 32 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *VolumeAttributesClassList) APILifecycleRemoved() (major, minor int) { + return 1, 35 +} diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json index b8a149ba650..d1aa9f3e4c9 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.json @@ -467,7 +467,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb index e0508dbda05..26107d98dfb 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml index 7b2b628c658..bcd9cc7572b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.DaemonSet.yaml @@ -1031,6 +1031,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json index 41d75f1ffd6..957a56be4bb 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb index 0e7deff85ed..4bcabf6c30c 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml index 847aa54a2ba..621d54ec902 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.Deployment.yaml @@ -1039,6 +1039,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json index 84d71ebb41c..f53b0acf1ea 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.json @@ -469,7 +469,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb index f4125ab3542..e56e9af3252 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml index a905dd53f6a..0c3830e35a7 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.ReplicaSet.yaml @@ -1031,6 +1031,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json index 48c5bb9f8d4..6ef46c3736f 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } @@ -1806,7 +1807,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" }, "status": { "phase": "phaseValue", @@ -1831,6 +1833,11 @@ }, "allocatedResourceStatuses": { "allocatedResourceStatusesKey": "allocatedResourceStatusesValue" + }, + "currentVolumeAttributesClassName": "currentVolumeAttributesClassNameValue", + "modifyVolumeStatus": { + "targetVolumeAttributesClassName": "targetVolumeAttributesClassNameValue", + "status": "statusValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb index 2ddbe3615d1..c0caf845714 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml index 0cc8c95b0fd..2a0301fd29c 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1.StatefulSet.yaml @@ -1039,6 +1039,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: @@ -1251,6 +1252,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue status: @@ -1269,6 +1271,10 @@ spec: reason: reasonValue status: statusValue type: typeValue + currentVolumeAttributesClassName: currentVolumeAttributesClassNameValue + modifyVolumeStatus: + status: statusValue + targetVolumeAttributesClassName: targetVolumeAttributesClassNameValue phase: phaseValue status: availableReplicas: 11 diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json index b84f4aa8b61..e07dfa3b6de 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb index af3e8458b93..46ce7590778 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml index 4c537c4aebd..d9b9d9954c7 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.Deployment.yaml @@ -1041,6 +1041,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json index b67c5a6f33b..c7c60c06bde 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } @@ -1806,7 +1807,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" }, "status": { "phase": "phaseValue", @@ -1831,6 +1833,11 @@ }, "allocatedResourceStatuses": { "allocatedResourceStatusesKey": "allocatedResourceStatusesValue" + }, + "currentVolumeAttributesClassName": "currentVolumeAttributesClassNameValue", + "modifyVolumeStatus": { + "targetVolumeAttributesClassName": "targetVolumeAttributesClassNameValue", + "status": "statusValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb index 08fc1f1b532..e131192de27 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml index 6d4bc4d12ae..927615dc919 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta1.StatefulSet.yaml @@ -1039,6 +1039,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: @@ -1251,6 +1252,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue status: @@ -1269,6 +1271,10 @@ spec: reason: reasonValue status: statusValue type: typeValue + currentVolumeAttributesClassName: currentVolumeAttributesClassNameValue + modifyVolumeStatus: + status: statusValue + targetVolumeAttributesClassName: targetVolumeAttributesClassNameValue phase: phaseValue status: availableReplicas: 11 diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json index 5c6df44c492..f794c834c7b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.json @@ -467,7 +467,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb index 33411f8b80f..0bbc6cc5c69 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml index 8ce63252da2..206f73e01f1 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.DaemonSet.yaml @@ -1031,6 +1031,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json index 3a7c5fe7c69..429721afa6e 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb index 4e7fb49361a..3f91fcebae1 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml index 7aded373e51..2400285986d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.Deployment.yaml @@ -1039,6 +1039,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json index 9fb52a28996..ae70338b2a0 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.json @@ -469,7 +469,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb index ddc5cff24da..47cddee63c5 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml index aa675ba48d5..63ca31bec12 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.ReplicaSet.yaml @@ -1031,6 +1031,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json index 173842cd32b..dd4680033b8 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } @@ -1806,7 +1807,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" }, "status": { "phase": "phaseValue", @@ -1831,6 +1833,11 @@ }, "allocatedResourceStatuses": { "allocatedResourceStatusesKey": "allocatedResourceStatusesValue" + }, + "currentVolumeAttributesClassName": "currentVolumeAttributesClassNameValue", + "modifyVolumeStatus": { + "targetVolumeAttributesClassName": "targetVolumeAttributesClassNameValue", + "status": "statusValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb index 3f091401ece..c72300bcc74 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml index 605da4f3085..772ffa0c25d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/apps.v1beta2.StatefulSet.yaml @@ -1039,6 +1039,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: @@ -1251,6 +1252,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue status: @@ -1269,6 +1271,10 @@ spec: reason: reasonValue status: statusValue type: typeValue + currentVolumeAttributesClassName: currentVolumeAttributesClassNameValue + modifyVolumeStatus: + status: statusValue + targetVolumeAttributesClassName: targetVolumeAttributesClassNameValue phase: phaseValue status: availableReplicas: 11 diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json index 61062c83590..d058087e3a8 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.json @@ -543,7 +543,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb index 0051f3a43bb..3757a2f9f18 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml index 6bb4d5c5168..988d76f57ae 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.CronJob.yaml @@ -1086,6 +1086,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json index 79a402da70e..a5e49f72d9d 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.json @@ -494,7 +494,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb index 643b8743520..cc8beb8e83c 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml index 122d6464ec7..c50e8edc455 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1.Job.yaml @@ -1050,6 +1050,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json index 4e17905804d..af958b3d71e 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.json @@ -543,7 +543,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb index 010f565133a..cb5c85a4d64 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb and b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml index 895dd090eaa..3460e0651fe 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/batch.v1beta1.CronJob.yaml @@ -1086,6 +1086,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.json index 5e0231792ac..ff283f72527 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.json @@ -299,7 +299,8 @@ } ] } - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" }, "status": { "phase": "phaseValue", diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.pb index d496d8dd648..474cf3b7332 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.yaml index c8e576eac1a..1c2ff4fcea6 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolume.yaml @@ -225,6 +225,7 @@ spec: uid: uidValue volumeName: volumeNameValue volumeNamespace: volumeNamespaceValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue vsphereVolume: fsType: fsTypeValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.json index 5dfff4b0f08..e40dfb6ece0 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.json @@ -82,7 +82,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" }, "status": { "phase": "phaseValue", @@ -107,6 +108,11 @@ }, "allocatedResourceStatuses": { "allocatedResourceStatusesKey": "allocatedResourceStatusesValue" + }, + "currentVolumeAttributesClassName": "currentVolumeAttributesClassNameValue", + "modifyVolumeStatus": { + "targetVolumeAttributesClassName": "targetVolumeAttributesClassNameValue", + "status": "statusValue" } } } \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.pb index 890528ce908..1bd3103f05a 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.yaml index d7042bee9a4..e20cc4629fb 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PersistentVolumeClaim.yaml @@ -58,6 +58,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue status: @@ -76,4 +77,8 @@ status: reason: reasonValue status: statusValue type: typeValue + currentVolumeAttributesClassName: currentVolumeAttributesClassNameValue + modifyVolumeStatus: + status: statusValue + targetVolumeAttributesClassName: targetVolumeAttributesClassNameValue phase: phaseValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json index c302f0be48a..b7be8e35400 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.json @@ -409,7 +409,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb index 961a662f0b0..154ef50c51f 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml index 988d02398a6..83f86035541 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.Pod.yaml @@ -987,6 +987,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json index 3d08304c9a0..158592f9176 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.json @@ -452,7 +452,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb index 29a3dffd9b1..a91e9044e24 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml index 3159f2d707b..0220aec3cb3 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.PodTemplate.yaml @@ -1020,6 +1020,7 @@ template: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json index fb729da601d..16b826c66b4 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.json @@ -458,7 +458,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb index d445b707e32..7294e3f9373 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb and b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml index 29936bc64b6..fbca26825a0 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/core.v1.ReplicationController.yaml @@ -1025,6 +1025,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json index ec46f586aa7..f8745342b67 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.json @@ -467,7 +467,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb index d06b24ae1f3..c1642abcd7d 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml index ff380e1c35d..16fa61d6b72 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.DaemonSet.yaml @@ -1031,6 +1031,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json index bbbdc7262b0..8af0e266081 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.json @@ -468,7 +468,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb index edb8b3f84a0..126235d1b47 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb and b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml index 8ad52c63c88..7318908f6bb 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.Deployment.yaml @@ -1041,6 +1041,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json index ed004b94c45..12a4dcf800b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.json @@ -469,7 +469,8 @@ "kind": "kindValue", "name": "nameValue", "namespace": "namespaceValue" - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } } } diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb index 29b97c38250..ae6a740de93 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb and b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml index 8a161b665fb..df2c10d412c 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/extensions.v1beta1.ReplicaSet.yaml @@ -1031,6 +1031,7 @@ spec: matchLabels: matchLabelsKey: matchLabelsValue storageClassName: storageClassNameValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue volumeName: volumeNameValue fc: diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.json b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.json index f5e31e3479e..8589231efb9 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.json @@ -303,7 +303,8 @@ } ] } - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } }, "nodeName": "nodeNameValue" diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.pb b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.pb index 85dbd3ac5a2..e167dcd1249 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.pb and b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.yaml b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.yaml index a272881fe85..29acbbfe569 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1.VolumeAttachment.yaml @@ -229,6 +229,7 @@ spec: uid: uidValue volumeName: volumeNameValue volumeNamespace: volumeNamespaceValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue vsphereVolume: fsType: fsTypeValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.json b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.json index cc691ea427b..6bcf594d033 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.json @@ -303,7 +303,8 @@ } ] } - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } }, "nodeName": "nodeNameValue" diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.pb b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.pb index cdade06e38c..33c4c310e8d 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.pb and b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.yaml b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.yaml index 3b562466ebc..fc8fa35579b 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttachment.yaml @@ -229,6 +229,7 @@ spec: uid: uidValue volumeName: volumeNameValue volumeNamespace: volumeNamespaceValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue vsphereVolume: fsType: fsTypeValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.json b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.json new file mode 100644 index 00000000000..bffbd2f81e2 --- /dev/null +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.json @@ -0,0 +1,50 @@ +{ + "kind": "VolumeAttributesClass", + "apiVersion": "storage.k8s.io/v1alpha1", + "metadata": { + "name": "nameValue", + "generateName": "generateNameValue", + "namespace": "namespaceValue", + "selfLink": "selfLinkValue", + "uid": "uidValue", + "resourceVersion": "resourceVersionValue", + "generation": 7, + "creationTimestamp": "2008-01-01T01:01:01Z", + "deletionTimestamp": "2009-01-01T01:01:01Z", + "deletionGracePeriodSeconds": 10, + "labels": { + "labelsKey": "labelsValue" + }, + "annotations": { + "annotationsKey": "annotationsValue" + }, + "ownerReferences": [ + { + "apiVersion": "apiVersionValue", + "kind": "kindValue", + "name": "nameValue", + "uid": "uidValue", + "controller": true, + "blockOwnerDeletion": true + } + ], + "finalizers": [ + "finalizersValue" + ], + "managedFields": [ + { + "manager": "managerValue", + "operation": "operationValue", + "apiVersion": "apiVersionValue", + "time": "2004-01-01T01:01:01Z", + "fieldsType": "fieldsTypeValue", + "fieldsV1": {}, + "subresource": "subresourceValue" + } + ] + }, + "driverName": "driverNameValue", + "parameters": { + "parametersKey": "parametersValue" + } +} \ No newline at end of file diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.pb b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.pb new file mode 100644 index 00000000000..dc8e82be1fd Binary files /dev/null and b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.yaml b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.yaml new file mode 100644 index 00000000000..3d339ccfbf5 --- /dev/null +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1alpha1.VolumeAttributesClass.yaml @@ -0,0 +1,37 @@ +apiVersion: storage.k8s.io/v1alpha1 +driverName: driverNameValue +kind: VolumeAttributesClass +metadata: + annotations: + annotationsKey: annotationsValue + creationTimestamp: "2008-01-01T01:01:01Z" + deletionGracePeriodSeconds: 10 + deletionTimestamp: "2009-01-01T01:01:01Z" + finalizers: + - finalizersValue + generateName: generateNameValue + generation: 7 + labels: + labelsKey: labelsValue + managedFields: + - apiVersion: apiVersionValue + fieldsType: fieldsTypeValue + fieldsV1: {} + manager: managerValue + operation: operationValue + subresource: subresourceValue + time: "2004-01-01T01:01:01Z" + name: nameValue + namespace: namespaceValue + ownerReferences: + - apiVersion: apiVersionValue + blockOwnerDeletion: true + controller: true + kind: kindValue + name: nameValue + uid: uidValue + resourceVersion: resourceVersionValue + selfLink: selfLinkValue + uid: uidValue +parameters: + parametersKey: parametersValue diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.json b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.json index 8882618baa1..b1fe6b30494 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.json +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.json @@ -303,7 +303,8 @@ } ] } - } + }, + "volumeAttributesClassName": "volumeAttributesClassNameValue" } }, "nodeName": "nodeNameValue" diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.pb b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.pb index 3b731be6f72..bfd4e9e47d9 100644 Binary files a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.pb and b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.pb differ diff --git a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.yaml b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.yaml index 78cd06a2173..d9ca40ad398 100644 --- a/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.yaml +++ b/staging/src/k8s.io/api/testdata/HEAD/storage.k8s.io.v1beta1.VolumeAttachment.yaml @@ -229,6 +229,7 @@ spec: uid: uidValue volumeName: volumeNameValue volumeNamespace: volumeNamespaceValue + volumeAttributesClassName: volumeAttributesClassNameValue volumeMode: volumeModeValue vsphereVolume: fsType: fsTypeValue diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/modifyvolumestatus.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/modifyvolumestatus.go new file mode 100644 index 00000000000..4ff1d040cf3 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/modifyvolumestatus.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// ModifyVolumeStatusApplyConfiguration represents an declarative configuration of the ModifyVolumeStatus type for use +// with apply. +type ModifyVolumeStatusApplyConfiguration struct { + TargetVolumeAttributesClassName *string `json:"targetVolumeAttributesClassName,omitempty"` + Status *v1.PersistentVolumeClaimModifyVolumeStatus `json:"status,omitempty"` +} + +// ModifyVolumeStatusApplyConfiguration constructs an declarative configuration of the ModifyVolumeStatus type for use with +// apply. +func ModifyVolumeStatus() *ModifyVolumeStatusApplyConfiguration { + return &ModifyVolumeStatusApplyConfiguration{} +} + +// WithTargetVolumeAttributesClassName sets the TargetVolumeAttributesClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the TargetVolumeAttributesClassName field is set to the value of the last call. +func (b *ModifyVolumeStatusApplyConfiguration) WithTargetVolumeAttributesClassName(value string) *ModifyVolumeStatusApplyConfiguration { + b.TargetVolumeAttributesClassName = &value + return b +} + +// WithStatus sets the Status field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Status field is set to the value of the last call. +func (b *ModifyVolumeStatusApplyConfiguration) WithStatus(value v1.PersistentVolumeClaimModifyVolumeStatus) *ModifyVolumeStatusApplyConfiguration { + b.Status = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go index d67c2ff561a..4db12fadb38 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimspec.go @@ -26,14 +26,15 @@ import ( // PersistentVolumeClaimSpecApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimSpec type for use // with apply. type PersistentVolumeClaimSpecApplyConfiguration struct { - AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` - Selector *metav1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` - Resources *VolumeResourceRequirementsApplyConfiguration `json:"resources,omitempty"` - VolumeName *string `json:"volumeName,omitempty"` - StorageClassName *string `json:"storageClassName,omitempty"` - VolumeMode *v1.PersistentVolumeMode `json:"volumeMode,omitempty"` - DataSource *TypedLocalObjectReferenceApplyConfiguration `json:"dataSource,omitempty"` - DataSourceRef *TypedObjectReferenceApplyConfiguration `json:"dataSourceRef,omitempty"` + AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` + Selector *metav1.LabelSelectorApplyConfiguration `json:"selector,omitempty"` + Resources *VolumeResourceRequirementsApplyConfiguration `json:"resources,omitempty"` + VolumeName *string `json:"volumeName,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` + VolumeMode *v1.PersistentVolumeMode `json:"volumeMode,omitempty"` + DataSource *TypedLocalObjectReferenceApplyConfiguration `json:"dataSource,omitempty"` + DataSourceRef *TypedObjectReferenceApplyConfiguration `json:"dataSourceRef,omitempty"` + VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty"` } // PersistentVolumeClaimSpecApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimSpec type for use with @@ -107,3 +108,11 @@ func (b *PersistentVolumeClaimSpecApplyConfiguration) WithDataSourceRef(value *T b.DataSourceRef = value return b } + +// WithVolumeAttributesClassName sets the VolumeAttributesClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeAttributesClassName field is set to the value of the last call. +func (b *PersistentVolumeClaimSpecApplyConfiguration) WithVolumeAttributesClassName(value string) *PersistentVolumeClaimSpecApplyConfiguration { + b.VolumeAttributesClassName = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go index c29b2a9a155..1f6d5ae3238 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumeclaimstatus.go @@ -25,12 +25,14 @@ import ( // PersistentVolumeClaimStatusApplyConfiguration represents an declarative configuration of the PersistentVolumeClaimStatus type for use // with apply. type PersistentVolumeClaimStatusApplyConfiguration struct { - Phase *v1.PersistentVolumeClaimPhase `json:"phase,omitempty"` - AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` - Capacity *v1.ResourceList `json:"capacity,omitempty"` - Conditions []PersistentVolumeClaimConditionApplyConfiguration `json:"conditions,omitempty"` - AllocatedResources *v1.ResourceList `json:"allocatedResources,omitempty"` - AllocatedResourceStatuses map[v1.ResourceName]v1.ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty"` + Phase *v1.PersistentVolumeClaimPhase `json:"phase,omitempty"` + AccessModes []v1.PersistentVolumeAccessMode `json:"accessModes,omitempty"` + Capacity *v1.ResourceList `json:"capacity,omitempty"` + Conditions []PersistentVolumeClaimConditionApplyConfiguration `json:"conditions,omitempty"` + AllocatedResources *v1.ResourceList `json:"allocatedResources,omitempty"` + AllocatedResourceStatuses map[v1.ResourceName]v1.ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty"` + CurrentVolumeAttributesClassName *string `json:"currentVolumeAttributesClassName,omitempty"` + ModifyVolumeStatus *ModifyVolumeStatusApplyConfiguration `json:"modifyVolumeStatus,omitempty"` } // PersistentVolumeClaimStatusApplyConfiguration constructs an declarative configuration of the PersistentVolumeClaimStatus type for use with @@ -99,3 +101,19 @@ func (b *PersistentVolumeClaimStatusApplyConfiguration) WithAllocatedResourceSta } return b } + +// WithCurrentVolumeAttributesClassName sets the CurrentVolumeAttributesClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CurrentVolumeAttributesClassName field is set to the value of the last call. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithCurrentVolumeAttributesClassName(value string) *PersistentVolumeClaimStatusApplyConfiguration { + b.CurrentVolumeAttributesClassName = &value + return b +} + +// WithModifyVolumeStatus sets the ModifyVolumeStatus field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ModifyVolumeStatus field is set to the value of the last call. +func (b *PersistentVolumeClaimStatusApplyConfiguration) WithModifyVolumeStatus(value *ModifyVolumeStatusApplyConfiguration) *PersistentVolumeClaimStatusApplyConfiguration { + b.ModifyVolumeStatus = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go index b3a72b1c3ef..8a30dab6495 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/core/v1/persistentvolumespec.go @@ -34,6 +34,7 @@ type PersistentVolumeSpecApplyConfiguration struct { MountOptions []string `json:"mountOptions,omitempty"` VolumeMode *v1.PersistentVolumeMode `json:"volumeMode,omitempty"` NodeAffinity *VolumeNodeAffinityApplyConfiguration `json:"nodeAffinity,omitempty"` + VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty"` } // PersistentVolumeSpecApplyConfiguration constructs an declarative configuration of the PersistentVolumeSpec type for use with @@ -285,3 +286,11 @@ func (b *PersistentVolumeSpecApplyConfiguration) WithNodeAffinity(value *VolumeN b.NodeAffinity = value return b } + +// WithVolumeAttributesClassName sets the VolumeAttributesClassName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the VolumeAttributesClassName field is set to the value of the last call. +func (b *PersistentVolumeSpecApplyConfiguration) WithVolumeAttributesClassName(value string) *PersistentVolumeSpecApplyConfiguration { + b.VolumeAttributesClassName = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go index c616a9d4a4d..08228ca98a7 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -5564,6 +5564,16 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.core.v1.ModifyVolumeStatus + map: + fields: + - name: status + type: + scalar: string + default: "" + - name: targetVolumeAttributesClassName + type: + scalar: string - name: io.k8s.api.core.v1.NFSVolumeSource map: fields: @@ -6040,6 +6050,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: storageClassName type: scalar: string + - name: volumeAttributesClassName + type: + scalar: string - name: volumeMode type: scalar: string @@ -6079,6 +6092,12 @@ var schemaYAML = typed.YAMLObject(`types: elementRelationship: associative keys: - type + - name: currentVolumeAttributesClassName + type: + scalar: string + - name: modifyVolumeStatus + type: + namedType: io.k8s.api.core.v1.ModifyVolumeStatus - name: phase type: scalar: string @@ -6199,6 +6218,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: storageos type: namedType: io.k8s.api.core.v1.StorageOSPersistentVolumeSource + - name: volumeAttributesClassName + type: + scalar: string - name: volumeMode type: scalar: string @@ -12214,6 +12236,28 @@ var schemaYAML = typed.YAMLObject(`types: - name: detachError type: namedType: io.k8s.api.storage.v1alpha1.VolumeError +- name: io.k8s.api.storage.v1alpha1.VolumeAttributesClass + map: + fields: + - name: apiVersion + type: + scalar: string + - name: driverName + type: + scalar: string + default: "" + - name: kind + type: + scalar: string + - name: metadata + type: + namedType: io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta + default: {} + - name: parameters + type: + map: + elementType: + scalar: string - name: io.k8s.api.storage.v1alpha1.VolumeError map: fields: diff --git a/staging/src/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattributesclass.go b/staging/src/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattributesclass.go new file mode 100644 index 00000000000..9d4c476259e --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/storage/v1alpha1/volumeattributesclass.go @@ -0,0 +1,262 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/storage/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + managedfields "k8s.io/apimachinery/pkg/util/managedfields" + internal "k8s.io/client-go/applyconfigurations/internal" + v1 "k8s.io/client-go/applyconfigurations/meta/v1" +) + +// VolumeAttributesClassApplyConfiguration represents an declarative configuration of the VolumeAttributesClass type for use +// with apply. +type VolumeAttributesClassApplyConfiguration struct { + v1.TypeMetaApplyConfiguration `json:",inline"` + *v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"` + DriverName *string `json:"driverName,omitempty"` + Parameters map[string]string `json:"parameters,omitempty"` +} + +// VolumeAttributesClass constructs an declarative configuration of the VolumeAttributesClass type for use with +// apply. +func VolumeAttributesClass(name string) *VolumeAttributesClassApplyConfiguration { + b := &VolumeAttributesClassApplyConfiguration{} + b.WithName(name) + b.WithKind("VolumeAttributesClass") + b.WithAPIVersion("storage.k8s.io/v1alpha1") + return b +} + +// ExtractVolumeAttributesClass extracts the applied configuration owned by fieldManager from +// volumeAttributesClass. If no managedFields are found in volumeAttributesClass for fieldManager, a +// VolumeAttributesClassApplyConfiguration is returned with only the Name, Namespace (if applicable), +// APIVersion and Kind populated. It is possible that no managed fields were found for because other +// field managers have taken ownership of all the fields previously owned by fieldManager, or because +// the fieldManager never owned fields any fields. +// volumeAttributesClass must be a unmodified VolumeAttributesClass API object that was retrieved from the Kubernetes API. +// ExtractVolumeAttributesClass provides a way to perform a extract/modify-in-place/apply workflow. +// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously +// applied if another fieldManager has updated or force applied any of the previously applied fields. +// Experimental! +func ExtractVolumeAttributesClass(volumeAttributesClass *v1alpha1.VolumeAttributesClass, fieldManager string) (*VolumeAttributesClassApplyConfiguration, error) { + return extractVolumeAttributesClass(volumeAttributesClass, fieldManager, "") +} + +// ExtractVolumeAttributesClassStatus is the same as ExtractVolumeAttributesClass except +// that it extracts the status subresource applied configuration. +// Experimental! +func ExtractVolumeAttributesClassStatus(volumeAttributesClass *v1alpha1.VolumeAttributesClass, fieldManager string) (*VolumeAttributesClassApplyConfiguration, error) { + return extractVolumeAttributesClass(volumeAttributesClass, fieldManager, "status") +} + +func extractVolumeAttributesClass(volumeAttributesClass *v1alpha1.VolumeAttributesClass, fieldManager string, subresource string) (*VolumeAttributesClassApplyConfiguration, error) { + b := &VolumeAttributesClassApplyConfiguration{} + err := managedfields.ExtractInto(volumeAttributesClass, internal.Parser().Type("io.k8s.api.storage.v1alpha1.VolumeAttributesClass"), fieldManager, b, subresource) + if err != nil { + return nil, err + } + b.WithName(volumeAttributesClass.Name) + + b.WithKind("VolumeAttributesClass") + b.WithAPIVersion("storage.k8s.io/v1alpha1") + return b, nil +} + +// WithKind sets the Kind field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Kind field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithKind(value string) *VolumeAttributesClassApplyConfiguration { + b.Kind = &value + return b +} + +// WithAPIVersion sets the APIVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the APIVersion field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithAPIVersion(value string) *VolumeAttributesClassApplyConfiguration { + b.APIVersion = &value + return b +} + +// WithName sets the Name field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Name field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithName(value string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Name = &value + return b +} + +// WithGenerateName sets the GenerateName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the GenerateName field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithGenerateName(value string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.GenerateName = &value + return b +} + +// WithNamespace sets the Namespace field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Namespace field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithNamespace(value string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Namespace = &value + return b +} + +// WithUID sets the UID field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the UID field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithUID(value types.UID) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.UID = &value + return b +} + +// WithResourceVersion sets the ResourceVersion field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the ResourceVersion field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithResourceVersion(value string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.ResourceVersion = &value + return b +} + +// WithGeneration sets the Generation field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Generation field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithGeneration(value int64) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.Generation = &value + return b +} + +// WithCreationTimestamp sets the CreationTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the CreationTimestamp field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithCreationTimestamp(value metav1.Time) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.CreationTimestamp = &value + return b +} + +// WithDeletionTimestamp sets the DeletionTimestamp field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionTimestamp field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionTimestamp = &value + return b +} + +// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DeletionGracePeriodSeconds field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + b.DeletionGracePeriodSeconds = &value + return b +} + +// WithLabels puts the entries into the Labels field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Labels field, +// overwriting an existing map entries in Labels field with the same key. +func (b *VolumeAttributesClassApplyConfiguration) WithLabels(entries map[string]string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Labels == nil && len(entries) > 0 { + b.Labels = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Labels[k] = v + } + return b +} + +// WithAnnotations puts the entries into the Annotations field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Annotations field, +// overwriting an existing map entries in Annotations field with the same key. +func (b *VolumeAttributesClassApplyConfiguration) WithAnnotations(entries map[string]string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + if b.Annotations == nil && len(entries) > 0 { + b.Annotations = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Annotations[k] = v + } + return b +} + +// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the OwnerReferences field. +func (b *VolumeAttributesClassApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + if values[i] == nil { + panic("nil value passed to WithOwnerReferences") + } + b.OwnerReferences = append(b.OwnerReferences, *values[i]) + } + return b +} + +// WithFinalizers adds the given value to the Finalizers field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, values provided by each call will be appended to the Finalizers field. +func (b *VolumeAttributesClassApplyConfiguration) WithFinalizers(values ...string) *VolumeAttributesClassApplyConfiguration { + b.ensureObjectMetaApplyConfigurationExists() + for i := range values { + b.Finalizers = append(b.Finalizers, values[i]) + } + return b +} + +func (b *VolumeAttributesClassApplyConfiguration) ensureObjectMetaApplyConfigurationExists() { + if b.ObjectMetaApplyConfiguration == nil { + b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{} + } +} + +// WithDriverName sets the DriverName field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the DriverName field is set to the value of the last call. +func (b *VolumeAttributesClassApplyConfiguration) WithDriverName(value string) *VolumeAttributesClassApplyConfiguration { + b.DriverName = &value + return b +} + +// WithParameters puts the entries into the Parameters field in the declarative configuration +// and returns the receiver, so that objects can be build by chaining "With" function invocations. +// If called multiple times, the entries provided by each call will be put on the Parameters field, +// overwriting an existing map entries in Parameters field with the same key. +func (b *VolumeAttributesClassApplyConfiguration) WithParameters(entries map[string]string) *VolumeAttributesClassApplyConfiguration { + if b.Parameters == nil && len(entries) > 0 { + b.Parameters = make(map[string]string, len(entries)) + } + for k, v := range entries { + b.Parameters[k] = v + } + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/utils.go b/staging/src/k8s.io/client-go/applyconfigurations/utils.go index 84d9afc1168..d4630164c19 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/utils.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/utils.go @@ -737,6 +737,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &applyconfigurationscorev1.LocalObjectReferenceApplyConfiguration{} case corev1.SchemeGroupVersion.WithKind("LocalVolumeSource"): return &applyconfigurationscorev1.LocalVolumeSourceApplyConfiguration{} + case corev1.SchemeGroupVersion.WithKind("ModifyVolumeStatus"): + return &applyconfigurationscorev1.ModifyVolumeStatusApplyConfiguration{} case corev1.SchemeGroupVersion.WithKind("Namespace"): return &applyconfigurationscorev1.NamespaceApplyConfiguration{} case corev1.SchemeGroupVersion.WithKind("NamespaceCondition"): @@ -1565,6 +1567,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &applyconfigurationsstoragev1alpha1.VolumeAttachmentSpecApplyConfiguration{} case storagev1alpha1.SchemeGroupVersion.WithKind("VolumeAttachmentStatus"): return &applyconfigurationsstoragev1alpha1.VolumeAttachmentStatusApplyConfiguration{} + case storagev1alpha1.SchemeGroupVersion.WithKind("VolumeAttributesClass"): + return &applyconfigurationsstoragev1alpha1.VolumeAttributesClassApplyConfiguration{} case storagev1alpha1.SchemeGroupVersion.WithKind("VolumeError"): return &applyconfigurationsstoragev1alpha1.VolumeErrorApplyConfiguration{} diff --git a/staging/src/k8s.io/client-go/informers/generic.go b/staging/src/k8s.io/client-go/informers/generic.go index 7f0a7b361a7..5210df34525 100644 --- a/staging/src/k8s.io/client-go/informers/generic.go +++ b/staging/src/k8s.io/client-go/informers/generic.go @@ -394,6 +394,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1alpha1().CSIStorageCapacities().Informer()}, nil case storagev1alpha1.SchemeGroupVersion.WithResource("volumeattachments"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1alpha1().VolumeAttachments().Informer()}, nil + case storagev1alpha1.SchemeGroupVersion.WithResource("volumeattributesclasses"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1alpha1().VolumeAttributesClasses().Informer()}, nil // Group=storage.k8s.io, Version=v1beta1 case storagev1beta1.SchemeGroupVersion.WithResource("csidrivers"): diff --git a/staging/src/k8s.io/client-go/informers/storage/v1alpha1/interface.go b/staging/src/k8s.io/client-go/informers/storage/v1alpha1/interface.go index 033d3b10aa1..bda3b1add97 100644 --- a/staging/src/k8s.io/client-go/informers/storage/v1alpha1/interface.go +++ b/staging/src/k8s.io/client-go/informers/storage/v1alpha1/interface.go @@ -28,6 +28,8 @@ type Interface interface { CSIStorageCapacities() CSIStorageCapacityInformer // VolumeAttachments returns a VolumeAttachmentInformer. VolumeAttachments() VolumeAttachmentInformer + // VolumeAttributesClasses returns a VolumeAttributesClassInformer. + VolumeAttributesClasses() VolumeAttributesClassInformer } type version struct { @@ -50,3 +52,8 @@ func (v *version) CSIStorageCapacities() CSIStorageCapacityInformer { func (v *version) VolumeAttachments() VolumeAttachmentInformer { return &volumeAttachmentInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} } + +// VolumeAttributesClasses returns a VolumeAttributesClassInformer. +func (v *version) VolumeAttributesClasses() VolumeAttributesClassInformer { + return &volumeAttributesClassInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} diff --git a/staging/src/k8s.io/client-go/informers/storage/v1alpha1/volumeattributesclass.go b/staging/src/k8s.io/client-go/informers/storage/v1alpha1/volumeattributesclass.go new file mode 100644 index 00000000000..5e62e2f4230 --- /dev/null +++ b/staging/src/k8s.io/client-go/informers/storage/v1alpha1/volumeattributesclass.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + time "time" + + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1alpha1 "k8s.io/client-go/listers/storage/v1alpha1" + cache "k8s.io/client-go/tools/cache" +) + +// VolumeAttributesClassInformer provides access to a shared informer and lister for +// VolumeAttributesClasses. +type VolumeAttributesClassInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.VolumeAttributesClassLister +} + +type volumeAttributesClassInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// NewVolumeAttributesClassInformer constructs a new informer for VolumeAttributesClass type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewVolumeAttributesClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredVolumeAttributesClassInformer(client, resyncPeriod, indexers, nil) +} + +// NewFilteredVolumeAttributesClassInformer constructs a new informer for VolumeAttributesClass type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredVolumeAttributesClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.StorageV1alpha1().VolumeAttributesClasses().List(context.TODO(), options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.StorageV1alpha1().VolumeAttributesClasses().Watch(context.TODO(), options) + }, + }, + &storagev1alpha1.VolumeAttributesClass{}, + resyncPeriod, + indexers, + ) +} + +func (f *volumeAttributesClassInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredVolumeAttributesClassInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *volumeAttributesClassInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&storagev1alpha1.VolumeAttributesClass{}, f.defaultInformer) +} + +func (f *volumeAttributesClassInformer) Lister() v1alpha1.VolumeAttributesClassLister { + return v1alpha1.NewVolumeAttributesClassLister(f.Informer().GetIndexer()) +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go index c26190aa01a..0e078f34861 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go @@ -36,6 +36,10 @@ func (c *FakeStorageV1alpha1) VolumeAttachments() v1alpha1.VolumeAttachmentInter return &FakeVolumeAttachments{c} } +func (c *FakeStorageV1alpha1) VolumeAttributesClasses() v1alpha1.VolumeAttributesClassInterface { + return &FakeVolumeAttributesClasses{c} +} + // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. func (c *FakeStorageV1alpha1) RESTClient() rest.Interface { diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattributesclass.go b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattributesclass.go new file mode 100644 index 00000000000..d25263df48c --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattributesclass.go @@ -0,0 +1,145 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + json "encoding/json" + "fmt" + + v1alpha1 "k8s.io/api/storage/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + storagev1alpha1 "k8s.io/client-go/applyconfigurations/storage/v1alpha1" + testing "k8s.io/client-go/testing" +) + +// FakeVolumeAttributesClasses implements VolumeAttributesClassInterface +type FakeVolumeAttributesClasses struct { + Fake *FakeStorageV1alpha1 +} + +var volumeattributesclassesResource = v1alpha1.SchemeGroupVersion.WithResource("volumeattributesclasses") + +var volumeattributesclassesKind = v1alpha1.SchemeGroupVersion.WithKind("VolumeAttributesClass") + +// Get takes name of the volumeAttributesClass, and returns the corresponding volumeAttributesClass object, and an error if there is any. +func (c *FakeVolumeAttributesClasses) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootGetAction(volumeattributesclassesResource, name), &v1alpha1.VolumeAttributesClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttributesClass), err +} + +// List takes label and field selectors, and returns the list of VolumeAttributesClasses that match those selectors. +func (c *FakeVolumeAttributesClasses) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.VolumeAttributesClassList, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootListAction(volumeattributesclassesResource, volumeattributesclassesKind, opts), &v1alpha1.VolumeAttributesClassList{}) + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.VolumeAttributesClassList{ListMeta: obj.(*v1alpha1.VolumeAttributesClassList).ListMeta} + for _, item := range obj.(*v1alpha1.VolumeAttributesClassList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested volumeAttributesClasses. +func (c *FakeVolumeAttributesClasses) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewRootWatchAction(volumeattributesclassesResource, opts)) +} + +// Create takes the representation of a volumeAttributesClass and creates it. Returns the server's representation of the volumeAttributesClass, and an error, if there is any. +func (c *FakeVolumeAttributesClasses) Create(ctx context.Context, volumeAttributesClass *v1alpha1.VolumeAttributesClass, opts v1.CreateOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootCreateAction(volumeattributesclassesResource, volumeAttributesClass), &v1alpha1.VolumeAttributesClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttributesClass), err +} + +// Update takes the representation of a volumeAttributesClass and updates it. Returns the server's representation of the volumeAttributesClass, and an error, if there is any. +func (c *FakeVolumeAttributesClasses) Update(ctx context.Context, volumeAttributesClass *v1alpha1.VolumeAttributesClass, opts v1.UpdateOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateAction(volumeattributesclassesResource, volumeAttributesClass), &v1alpha1.VolumeAttributesClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttributesClass), err +} + +// Delete takes name of the volumeAttributesClass and deletes it. Returns an error if one occurs. +func (c *FakeVolumeAttributesClasses) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewRootDeleteActionWithOptions(volumeattributesclassesResource, name, opts), &v1alpha1.VolumeAttributesClass{}) + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeVolumeAttributesClasses) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewRootDeleteCollectionAction(volumeattributesclassesResource, listOpts) + + _, err := c.Fake.Invokes(action, &v1alpha1.VolumeAttributesClassList{}) + return err +} + +// Patch applies the patch and returns the patched volumeAttributesClass. +func (c *FakeVolumeAttributesClasses) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.VolumeAttributesClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattributesclassesResource, name, pt, data, subresources...), &v1alpha1.VolumeAttributesClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttributesClass), err +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttributesClass. +func (c *FakeVolumeAttributesClasses) Apply(ctx context.Context, volumeAttributesClass *storagev1alpha1.VolumeAttributesClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + if volumeAttributesClass == nil { + return nil, fmt.Errorf("volumeAttributesClass provided to Apply must not be nil") + } + data, err := json.Marshal(volumeAttributesClass) + if err != nil { + return nil, err + } + name := volumeAttributesClass.Name + if name == nil { + return nil, fmt.Errorf("volumeAttributesClass.Name must be provided to Apply") + } + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(volumeattributesclassesResource, *name, types.ApplyPatchType, data), &v1alpha1.VolumeAttributesClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.VolumeAttributesClass), err +} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go index 0f51c85f9e7..436e910f244 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go @@ -21,3 +21,5 @@ package v1alpha1 type CSIStorageCapacityExpansion interface{} type VolumeAttachmentExpansion interface{} + +type VolumeAttributesClassExpansion interface{} diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go index c9bf11d766c..63e3fc243f9 100644 --- a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go @@ -30,6 +30,7 @@ type StorageV1alpha1Interface interface { RESTClient() rest.Interface CSIStorageCapacitiesGetter VolumeAttachmentsGetter + VolumeAttributesClassesGetter } // StorageV1alpha1Client is used to interact with features provided by the storage.k8s.io group. @@ -45,6 +46,10 @@ func (c *StorageV1alpha1Client) VolumeAttachments() VolumeAttachmentInterface { return newVolumeAttachments(c) } +func (c *StorageV1alpha1Client) VolumeAttributesClasses() VolumeAttributesClassInterface { + return newVolumeAttributesClasses(c) +} + // NewForConfig creates a new StorageV1alpha1Client for the given config. // NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), // where httpClient was generated with rest.HTTPClientFor(c). diff --git a/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattributesclass.go b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattributesclass.go new file mode 100644 index 00000000000..6633a4dc150 --- /dev/null +++ b/staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattributesclass.go @@ -0,0 +1,197 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + json "encoding/json" + "fmt" + "time" + + v1alpha1 "k8s.io/api/storage/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + storagev1alpha1 "k8s.io/client-go/applyconfigurations/storage/v1alpha1" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// VolumeAttributesClassesGetter has a method to return a VolumeAttributesClassInterface. +// A group's client should implement this interface. +type VolumeAttributesClassesGetter interface { + VolumeAttributesClasses() VolumeAttributesClassInterface +} + +// VolumeAttributesClassInterface has methods to work with VolumeAttributesClass resources. +type VolumeAttributesClassInterface interface { + Create(ctx context.Context, volumeAttributesClass *v1alpha1.VolumeAttributesClass, opts v1.CreateOptions) (*v1alpha1.VolumeAttributesClass, error) + Update(ctx context.Context, volumeAttributesClass *v1alpha1.VolumeAttributesClass, opts v1.UpdateOptions) (*v1alpha1.VolumeAttributesClass, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.VolumeAttributesClass, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.VolumeAttributesClassList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.VolumeAttributesClass, err error) + Apply(ctx context.Context, volumeAttributesClass *storagev1alpha1.VolumeAttributesClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttributesClass, err error) + VolumeAttributesClassExpansion +} + +// volumeAttributesClasses implements VolumeAttributesClassInterface +type volumeAttributesClasses struct { + client rest.Interface +} + +// newVolumeAttributesClasses returns a VolumeAttributesClasses +func newVolumeAttributesClasses(c *StorageV1alpha1Client) *volumeAttributesClasses { + return &volumeAttributesClasses{ + client: c.RESTClient(), + } +} + +// Get takes name of the volumeAttributesClass, and returns the corresponding volumeAttributesClass object, and an error if there is any. +func (c *volumeAttributesClasses) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + result = &v1alpha1.VolumeAttributesClass{} + err = c.client.Get(). + Resource("volumeattributesclasses"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of VolumeAttributesClasses that match those selectors. +func (c *volumeAttributesClasses) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.VolumeAttributesClassList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.VolumeAttributesClassList{} + err = c.client.Get(). + Resource("volumeattributesclasses"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested volumeAttributesClasses. +func (c *volumeAttributesClasses) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("volumeattributesclasses"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a volumeAttributesClass and creates it. Returns the server's representation of the volumeAttributesClass, and an error, if there is any. +func (c *volumeAttributesClasses) Create(ctx context.Context, volumeAttributesClass *v1alpha1.VolumeAttributesClass, opts v1.CreateOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + result = &v1alpha1.VolumeAttributesClass{} + err = c.client.Post(). + Resource("volumeattributesclasses"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(volumeAttributesClass). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a volumeAttributesClass and updates it. Returns the server's representation of the volumeAttributesClass, and an error, if there is any. +func (c *volumeAttributesClasses) Update(ctx context.Context, volumeAttributesClass *v1alpha1.VolumeAttributesClass, opts v1.UpdateOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + result = &v1alpha1.VolumeAttributesClass{} + err = c.client.Put(). + Resource("volumeattributesclasses"). + Name(volumeAttributesClass.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(volumeAttributesClass). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the volumeAttributesClass and deletes it. Returns an error if one occurs. +func (c *volumeAttributesClasses) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Resource("volumeattributesclasses"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *volumeAttributesClasses) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("volumeattributesclasses"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched volumeAttributesClass. +func (c *volumeAttributesClasses) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.VolumeAttributesClass, err error) { + result = &v1alpha1.VolumeAttributesClass{} + err = c.client.Patch(pt). + Resource("volumeattributesclasses"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} + +// Apply takes the given apply declarative configuration, applies it and returns the applied volumeAttributesClass. +func (c *volumeAttributesClasses) Apply(ctx context.Context, volumeAttributesClass *storagev1alpha1.VolumeAttributesClassApplyConfiguration, opts v1.ApplyOptions) (result *v1alpha1.VolumeAttributesClass, err error) { + if volumeAttributesClass == nil { + return nil, fmt.Errorf("volumeAttributesClass provided to Apply must not be nil") + } + patchOpts := opts.ToPatchOptions() + data, err := json.Marshal(volumeAttributesClass) + if err != nil { + return nil, err + } + name := volumeAttributesClass.Name + if name == nil { + return nil, fmt.Errorf("volumeAttributesClass.Name must be provided to Apply") + } + result = &v1alpha1.VolumeAttributesClass{} + err = c.client.Patch(types.ApplyPatchType). + Resource("volumeattributesclasses"). + Name(*name). + VersionedParams(&patchOpts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/staging/src/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go b/staging/src/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go index edefe6d05ed..327fb6e31cd 100644 --- a/staging/src/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go +++ b/staging/src/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go @@ -29,3 +29,7 @@ type CSIStorageCapacityNamespaceListerExpansion interface{} // VolumeAttachmentListerExpansion allows custom methods to be added to // VolumeAttachmentLister. type VolumeAttachmentListerExpansion interface{} + +// VolumeAttributesClassListerExpansion allows custom methods to be added to +// VolumeAttributesClassLister. +type VolumeAttributesClassListerExpansion interface{} diff --git a/staging/src/k8s.io/client-go/listers/storage/v1alpha1/volumeattributesclass.go b/staging/src/k8s.io/client-go/listers/storage/v1alpha1/volumeattributesclass.go new file mode 100644 index 00000000000..f30b4a89ba1 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/storage/v1alpha1/volumeattributesclass.go @@ -0,0 +1,68 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "k8s.io/api/storage/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// VolumeAttributesClassLister helps list VolumeAttributesClasses. +// All objects returned here must be treated as read-only. +type VolumeAttributesClassLister interface { + // List lists all VolumeAttributesClasses in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.VolumeAttributesClass, err error) + // Get retrieves the VolumeAttributesClass from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1alpha1.VolumeAttributesClass, error) + VolumeAttributesClassListerExpansion +} + +// volumeAttributesClassLister implements the VolumeAttributesClassLister interface. +type volumeAttributesClassLister struct { + indexer cache.Indexer +} + +// NewVolumeAttributesClassLister returns a new VolumeAttributesClassLister. +func NewVolumeAttributesClassLister(indexer cache.Indexer) VolumeAttributesClassLister { + return &volumeAttributesClassLister{indexer: indexer} +} + +// List lists all VolumeAttributesClasses in the indexer. +func (s *volumeAttributesClassLister) List(selector labels.Selector) (ret []*v1alpha1.VolumeAttributesClass, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.VolumeAttributesClass)) + }) + return ret, err +} + +// Get retrieves the VolumeAttributesClass from the index for a given name. +func (s *volumeAttributesClassLister) Get(name string) (*v1alpha1.VolumeAttributesClass, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("volumeattributesclass"), name) + } + return obj.(*v1alpha1.VolumeAttributesClass), nil +} diff --git a/test/integration/etcd/data.go b/test/integration/etcd/data.go index 276ad0ef49c..2212a90db54 100644 --- a/test/integration/etcd/data.go +++ b/test/integration/etcd/data.go @@ -294,6 +294,13 @@ func GetEtcdStorageDataForNamespace(namespace string) map[schema.GroupVersionRes }, // -- + // k8s.io/kubernetes/pkg/apis/storage/v1alpha1 + gvr("storage.k8s.io", "v1alpha1", "volumeattributesclasses"): { + Stub: `{"metadata": {"name": "vac1"}, "driverName": "example.com/driver", "parameters": {"foo": "bar"}}`, + ExpectedEtcdPath: "/registry/volumeattributesclasses/vac1", + }, + // -- + // k8s.io/kubernetes/pkg/apis/storage/v1beta1 gvr("storage.k8s.io", "v1beta1", "csistoragecapacities"): { Stub: `{"metadata": {"name": "csc-12345-2"}, "storageClassName": "sc1"}`,