From f456630f0c90fd378c5f3ad2c450c4398db2d86f Mon Sep 17 00:00:00 2001 From: xing-yang Date: Tue, 12 Jul 2022 14:41:25 -0400 Subject: [PATCH 01/13] Add VolumeGroupSnapshot CSI RPCs --- csi.proto | 208 ++++++ lib/go/csi/csi.pb.go | 1600 +++++++++++++++++++++++++++++++++--------- spec.md | 309 ++++++++ 3 files changed, 1797 insertions(+), 320 deletions(-) diff --git a/csi.proto b/csi.proto index 53ae6df5..7cb9f9ee 100644 --- a/csi.proto +++ b/csi.proto @@ -102,6 +102,30 @@ service Controller { } } +service GroupController { + option (alpha_service) = true; + + rpc GroupControllerGetCapabilities ( + GroupControllerGetCapabilitiesRequest) + returns (GroupControllerGetCapabilitiesResponse) {} + + rpc CreateVolumeGroupSnapshot(CreateVolumeGroupSnapshotRequest) + returns (CreateVolumeGroupSnapshotResponse) { + option (alpha_method) = true; + } + + rpc DeleteVolumeGroupSnapshot(DeleteVolumeGroupSnapshotRequest) + returns (DeleteVolumeGroupSnapshotResponse) { + option (alpha_method) = true; + } + + rpc ControllerGetVolumeGroupSnapshot( + ControllerGetVolumeGroupSnapshotRequest) + returns (ControllerGetVolumeGroupSnapshotResponse) { + option (alpha_method) = true; + } +} + service Node { rpc NodeStageVolume (NodeStageVolumeRequest) returns (NodeStageVolumeResponse) {} @@ -181,6 +205,15 @@ message PluginCapability { // returned by NodeGetInfo to ensure that a given volume is // accessible from a given node when scheduling workloads. VOLUME_ACCESSIBILITY_CONSTRAINTS = 2; + + // GROUP_CONTROLLER_SERVICE indicates that the Plugin provides + // RPCs for the GroupControllerService. Plugins MAY provide this + // capability. + // The presence of this capability determines whether the CO will + // attempt to invoke the REQUIRED GroupControllerService RPCs, as + // well as specific RPCs as indicated by + // GroupControllerGetCapabilities. + GROUP_CONTROLLER_SERVICE = 3; } Type type = 1; } @@ -1163,6 +1196,17 @@ message Snapshot { // `volume_content_source` in a `CreateVolumeRequest`. The default // value is false. This field is REQUIRED. bool ready_to_use = 5; + + // The ID of the volume group snapshot that this snapshot is part of. + // It uniquely identifies the group snapshot on the storage system. + // This field is OPTIONAL. + // If this snapshot is a member of the volume group snapshot, the SP + // SHOULD provide the ID of the volume group snapshot in this field. + // If provided, CO MUST use this field to indicate that this snapshot + // is part of the specified group snapshot. + // If this message is inside a VolumeGroupSnapshot message, the value + // MUST be the same as the group_snapshot_id in that message. + string group_snapshot_id = 6 [(alpha_field) = true]; } message DeleteSnapshotRequest { // The ID of the snapshot to be deleted. @@ -1634,3 +1678,167 @@ message NodeExpandVolumeResponse { // The capacity of the volume in bytes. This field is OPTIONAL. int64 capacity_bytes = 1; } +message GroupControllerGetCapabilitiesRequest { + // Intentionally empty. +} + +message GroupControllerGetCapabilitiesResponse { + // All the capabilities that the group controller service supports. + // This field is OPTIONAL. + repeated GroupControllerServiceCapability capabilities = 1; +} + +// Specifies a capability of the group controller service. +message GroupControllerServiceCapability { + message RPC { + enum Type { + UNKNOWN = 0; + + // Indicates that the group controller plugin supports + // creating, deleting, and getting details of a volume + // group snapshot. + CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT = 1 + [(alpha_enum_value) = true]; + } + + Type type = 1; + } + + oneof type { + // RPC that the controller supports. + RPC rpc = 1; + } +} +message CreateVolumeGroupSnapshotRequest { + option (alpha_message) = true; + + // The suggested name for the group snapshot. This field is REQUIRED + // for idempotency. + // Any Unicode string that conforms to the length limit is allowed + // except those containing the following banned characters: + // U+0000-U+0008, U+000B, U+000C, U+000E-U+001F, U+007F-U+009F. + // (These are control characters other than commonly used whitespace.) + string name = 1; + + // volume ids of the source volumes to be snapshotted together. + // This field is REQUIRED. + repeated string source_volume_ids = 2; + + // Secrets required by plugin to complete + // ControllerCreateVolumeGroupSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerDeleteVolumeGroupSnapshot + // and ControllerGetVolumeGroupSnapshot requests for the same + // group snapshot unless if secrets are rotated after the + // group snapshot is created. + map secrets = 3 [(csi_secret) = true]; + + // Volume secrets required by plugin to complete volume group + // snapshot creation request. This field is needed in case the + // volume level secrets are different from the above secrets + // for the group snapshot. + // This field is OPTIONAL. + repeated VolumeSecret volume_secrets = 4; + + // Plugin specific parameters passed in as opaque key-value pairs. + // This field is OPTIONAL. The Plugin is responsible for parsing and + // validating these parameters. COs will treat these as opaque. + map parameters = 5; +} + +message VolumeSecret { + // ID of the volume whose secrets are provided. + // This field is REQUIRED. + string volume_id = 1; + + // Secrets required by plugin for a volume operation. + // This field is REQUIRED. Refer to the `Secrets Requirements` + // section on how to use this field. + map secrets = 2 [(.csi.v1.csi_secret) = true]; +} + +message CreateVolumeGroupSnapshotResponse { + option (alpha_message) = true; + + // Contains all attributes of the newly created group snapshot. + // This field is REQUIRED. + VolumeGroupSnapshot group_snapshot = 1; +} + +message VolumeGroupSnapshot { + option (alpha_message) = true; + + // The identifier for this group snapshot, generated by the plugin. + // This field MUST contain enough information to uniquely identify + // this specific snapshot vs all other group snapshots supported by + // this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this group snapshot. + // The SP is NOT responsible for global uniqueness of + // group_snapshot_id across multiple SPs. + // This field is REQUIRED. + string group_snapshot_id = 1; + + // A list of snapshots created. + // This field is REQUIRED. + repeated Snapshot snapshots = 2; + + // Timestamp when the volume group snapshot is taken. + // This field is REQUIRED. + .google.protobuf.Timestamp creation_time = 3; +} +message DeleteVolumeGroupSnapshotRequest { + option (alpha_message) = true; + + // The ID of the group snapshot to be deleted. + // This field is REQUIRED. + string group_snapshot_id = 1; + + // A list of snapshot ids that are part of this group snapshot. + // Some SPs require this list to delete the snapshots in the group. + // This field is REQUIRED. + repeated string snapshot_ids = 2; + + // Secrets required by plugin to complete group snapshot deletion + // request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerCreateVolumeGroupSnapshot + // request for the same group snapshot unless if secrets are rotated + // after the group snapshot is created. + // The secrets provided in the field SHOULD be passed to both + // the group snapshot and the individual snapshot members if needed. + map secrets = 3 [(csi_secret) = true]; +} + +message DeleteVolumeGroupSnapshotResponse { + // Intentionally empty. +} +message ControllerGetVolumeGroupSnapshotRequest { + option (alpha_message) = true; + + // The ID of the group snapshot to fetch current group snapshot + // information for. + // This field is REQUIRED. + string group_snapshot_id = 1; + + // Secrets required by plugin to complete + // ControllerGetVolumeGroupSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerCreateVolumeGroupSnapshot + // request for the same group snapshot unless if secrets are rotated + // after the group snapshot is created. + map secrets = 2 [(csi_secret) = true]; +} + +message ControllerGetVolumeGroupSnapshotResponse { + option (alpha_message) = true; + + // This field is REQUIRED + VolumeGroupSnapshot group_snapshot = 1; +} diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index d889edb2..c2c18305 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -47,18 +47,28 @@ const ( // returned by NodeGetInfo to ensure that a given volume is // accessible from a given node when scheduling workloads. PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS PluginCapability_Service_Type = 2 + // GROUP_CONTROLLER_SERVICE indicates that the Plugin provides + // RPCs for the GroupControllerService. Plugins MAY provide this + // capability. + // The presence of this capability determines whether the CO will + // attempt to invoke the REQUIRED GroupControllerService RPCs, as + // well as specific RPCs as indicated by + // GroupControllerGetCapabilities. + PluginCapability_Service_GROUP_CONTROLLER_SERVICE PluginCapability_Service_Type = 3 ) var PluginCapability_Service_Type_name = map[int32]string{ 0: "UNKNOWN", 1: "CONTROLLER_SERVICE", 2: "VOLUME_ACCESSIBILITY_CONSTRAINTS", + 3: "GROUP_CONTROLLER_SERVICE", } var PluginCapability_Service_Type_value = map[string]int32{ "UNKNOWN": 0, "CONTROLLER_SERVICE": 1, "VOLUME_ACCESSIBILITY_CONSTRAINTS": 2, + "GROUP_CONTROLLER_SERVICE": 3, } func (x PluginCapability_Service_Type) String() string { @@ -85,17 +95,20 @@ const ( // expansion of node-published volume via NodeExpandVolume. // // Example 1: Given a shared filesystem volume (e.g. GlusterFs), - // the Plugin may set the ONLINE volume expansion capability and - // implement ControllerExpandVolume but not NodeExpandVolume. + // + // the Plugin may set the ONLINE volume expansion capability and + // implement ControllerExpandVolume but not NodeExpandVolume. // // Example 2: Given a block storage volume type (e.g. EBS), the - // Plugin may set the ONLINE volume expansion capability and - // implement both ControllerExpandVolume and NodeExpandVolume. + // + // Plugin may set the ONLINE volume expansion capability and + // implement both ControllerExpandVolume and NodeExpandVolume. // // Example 3: Given a Plugin that supports volume expansion only - // upon a node, the Plugin may set the ONLINE volume - // expansion capability and implement NodeExpandVolume but not - // ControllerExpandVolume. + // + // upon a node, the Plugin may set the ONLINE volume + // expansion capability and implement NodeExpandVolume but not + // ControllerExpandVolume. PluginCapability_VolumeExpansion_ONLINE PluginCapability_VolumeExpansion_Type = 1 // OFFLINE indicates that volumes currently published and // available on a node SHALL NOT be expanded via @@ -105,10 +118,11 @@ const ( // the EXPAND_VOLUME node capability. // // Example 1: Given a block storage volume type (e.g. Azure Disk) - // that does not support expansion of "node-attached" (i.e. - // controller-published) volumes, the Plugin may indicate - // OFFLINE volume expansion support and implement both - // ControllerExpandVolume and NodeExpandVolume. + // + // that does not support expansion of "node-attached" (i.e. + // controller-published) volumes, the Plugin may indicate + // OFFLINE volume expansion support and implement both + // ControllerExpandVolume and NodeExpandVolume. PluginCapability_VolumeExpansion_OFFLINE PluginCapability_VolumeExpansion_Type = 2 ) @@ -385,6 +399,34 @@ func (NodeServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor_9cdb00adce470e01, []int{55, 0, 0} } +type GroupControllerServiceCapability_RPC_Type int32 + +const ( + GroupControllerServiceCapability_RPC_UNKNOWN GroupControllerServiceCapability_RPC_Type = 0 + // Indicates that the group controller plugin supports + // creating, deleting, and getting details of a volume + // group snapshot. + GroupControllerServiceCapability_RPC_CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT GroupControllerServiceCapability_RPC_Type = 1 +) + +var GroupControllerServiceCapability_RPC_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT", +} + +var GroupControllerServiceCapability_RPC_Type_value = map[string]int32{ + "UNKNOWN": 0, + "CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT": 1, +} + +func (x GroupControllerServiceCapability_RPC_Type) String() string { + return proto.EnumName(GroupControllerServiceCapability_RPC_Type_name, int32(x)) +} + +func (GroupControllerServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{62, 0, 0} +} + type GetPluginInfoRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -555,6 +597,7 @@ func (m *GetPluginCapabilitiesResponse) GetCapabilities() []*PluginCapability { // Specifies a capability of the plugin. type PluginCapability struct { // Types that are valid to be assigned to Type: + // // *PluginCapability_Service_ // *PluginCapability_VolumeExpansion_ Type isPluginCapability_Type `protobuf_oneof:"type"` @@ -748,16 +791,16 @@ type ProbeResponse struct { // and it is important for a CO to distinguish between the following // cases: // - // 1) The plugin is in an unhealthy state and MAY need restarting. In - // this case a gRPC error code SHALL be returned. - // 2) The plugin is still initializing, but is otherwise perfectly - // healthy. In this case a successful response SHALL be returned - // with a readiness value of `false`. Calls to the plugin's - // Controller and/or Node services MAY fail due to an incomplete - // initialization state. - // 3) The plugin has finished initializing and is ready to service - // calls to its Controller and/or Node services. A successful - // response is returned with a readiness value of `true`. + // 1. The plugin is in an unhealthy state and MAY need restarting. In + // this case a gRPC error code SHALL be returned. + // 2. The plugin is still initializing, but is otherwise perfectly + // healthy. In this case a successful response SHALL be returned + // with a readiness value of `false`. Calls to the plugin's + // Controller and/or Node services MAY fail due to an incomplete + // initialization state. + // 3. The plugin has finished initializing and is ready to service + // calls to its Controller and/or Node services. A successful + // response is returned with a readiness value of `true`. // // This field is OPTIONAL. If not present, the caller SHALL assume // that the plugin is in a ready state and is accepting calls to its @@ -804,26 +847,27 @@ func (m *ProbeResponse) GetReady() *wrappers.BoolValue { type CreateVolumeRequest struct { // The suggested name for the storage space. This field is REQUIRED. // It serves two purposes: - // 1) Idempotency - This name is generated by the CO to achieve - // idempotency. The Plugin SHOULD ensure that multiple - // `CreateVolume` calls for the same name do not result in more - // than one piece of storage provisioned corresponding to that - // name. If a Plugin is unable to enforce idempotency, the CO's - // error recovery logic could result in multiple (unused) volumes - // being provisioned. - // In the case of error, the CO MUST handle the gRPC error codes - // per the recovery behavior defined in the "CreateVolume Errors" - // section below. - // The CO is responsible for cleaning up volumes it provisioned - // that it no longer needs. If the CO is uncertain whether a volume - // was provisioned or not when a `CreateVolume` call fails, the CO - // MAY call `CreateVolume` again, with the same name, to ensure the - // volume exists and to retrieve the volume's `volume_id` (unless - // otherwise prohibited by "CreateVolume Errors"). - // 2) Suggested name - Some storage systems allow callers to specify - // an identifier by which to refer to the newly provisioned - // storage. If a storage system supports this, it can optionally - // use this name as the identifier for the new volume. + // 1. Idempotency - This name is generated by the CO to achieve + // idempotency. The Plugin SHOULD ensure that multiple + // `CreateVolume` calls for the same name do not result in more + // than one piece of storage provisioned corresponding to that + // name. If a Plugin is unable to enforce idempotency, the CO's + // error recovery logic could result in multiple (unused) volumes + // being provisioned. + // In the case of error, the CO MUST handle the gRPC error codes + // per the recovery behavior defined in the "CreateVolume Errors" + // section below. + // The CO is responsible for cleaning up volumes it provisioned + // that it no longer needs. If the CO is uncertain whether a volume + // was provisioned or not when a `CreateVolume` call fails, the CO + // MAY call `CreateVolume` again, with the same name, to ensure the + // volume exists and to retrieve the volume's `volume_id` (unless + // otherwise prohibited by "CreateVolume Errors"). + // 2. Suggested name - Some storage systems allow callers to specify + // an identifier by which to refer to the newly provisioned + // storage. If a storage system supports this, it can optionally + // use this name as the identifier for the new volume. + // // Any Unicode string that conforms to the length limit is allowed // except those containing the following banned characters: // U+0000-U+0008, U+000B, U+000C, U+000E-U+001F, U+007F-U+009F. @@ -957,6 +1001,7 @@ func (m *CreateVolumeRequest) GetAccessibilityRequirements() *TopologyRequiremen // type fields MUST be specified. type VolumeContentSource struct { // Types that are valid to be assigned to Type: + // // *VolumeContentSource_Snapshot // *VolumeContentSource_Volume Type isVolumeContentSource_Type `protobuf_oneof:"type"` @@ -1168,6 +1213,7 @@ type VolumeCapability struct { // following fields MUST be specified. // // Types that are valid to be assigned to AccessType: + // // *VolumeCapability_Block // *VolumeCapability_Mount AccessType isVolumeCapability_AccessType `protobuf_oneof:"access_type"` @@ -1509,14 +1555,18 @@ type Volume struct { // node. // // Example 1: - // accessible_topology = {"region": "R1", "zone": "Z2"} + // + // accessible_topology = {"region": "R1", "zone": "Z2"} + // // Indicates a volume accessible only from the "region" "R1" and the // "zone" "Z2". // // Example 2: - // accessible_topology = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"} + // + // accessible_topology = + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"} + // // Indicates a volume accessible from both "zone" "Z2" and "zone" "Z3" // in the "region" "R1". AccessibleTopology []*Topology `protobuf:"bytes,5,rep,name=accessible_topology,json=accessibleTopology,proto3" json:"accessible_topology,omitempty"` @@ -1595,21 +1645,27 @@ type TopologyRequirement struct { // accessible from at least one of the requisite topologies. // // Given - // x = number of topologies provisioned volume is accessible from - // n = number of requisite topologies + // + // x = number of topologies provisioned volume is accessible from + // n = number of requisite topologies + // // The CO MUST ensure n >= 1. The SP MUST ensure x >= 1 // If x==n, then the SP MUST make the provisioned volume available to // all topologies from the list of requisite topologies. If it is // unable to do so, the SP MUST fail the CreateVolume call. // For example, if a volume should be accessible from a single zone, // and requisite = - // {"region": "R1", "zone": "Z2"} + // + // {"region": "R1", "zone": "Z2"} + // // then the provisioned volume MUST be accessible from the "region" // "R1" and the "zone" "Z2". // Similarly, if a volume should be accessible from two zones, and // requisite = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"} + // + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"} + // // then the provisioned volume MUST be accessible from the "region" // "R1" and both "zone" "Z2" and "zone" "Z3". // @@ -1618,18 +1674,23 @@ type TopologyRequirement struct { // the CreateVolume call. // For example, if a volume should be accessible from a single zone, // and requisite = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"} + // + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"} + // // then the SP may choose to make the provisioned volume available in // either the "zone" "Z2" or the "zone" "Z3" in the "region" "R1". // Similarly, if a volume should be accessible from two zones, and // requisite = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"}, - // {"region": "R1", "zone": "Z4"} + // + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"}, + // {"region": "R1", "zone": "Z4"} + // // then the provisioned volume MUST be accessible from any combination // of two unique topologies: e.g. "R1/Z2" and "R1/Z3", or "R1/Z2" and - // "R1/Z4", or "R1/Z3" and "R1/Z4". + // + // "R1/Z4", or "R1/Z3" and "R1/Z4". // // If x>n, then the SP MUST make the provisioned volume available from // all topologies from the list of requisite topologies and MAY choose @@ -1638,7 +1699,9 @@ type TopologyRequirement struct { // CreateVolume call. // For example, if a volume should be accessible from two zones, and // requisite = - // {"region": "R1", "zone": "Z2"} + // + // {"region": "R1", "zone": "Z2"} + // // then the provisioned volume MUST be accessible from the "region" // "R1" and the "zone" "Z2" and the SP may select the second zone // independently, e.g. "R1/Z4". @@ -1667,10 +1730,14 @@ type TopologyRequirement struct { // Example 1: // Given a volume should be accessible from a single zone, and // requisite = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"} + // + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"} + // // preferred = - // {"region": "R1", "zone": "Z3"} + // + // {"region": "R1", "zone": "Z3"} + // // then the SP SHOULD first attempt to make the provisioned volume // available from "zone" "Z3" in the "region" "R1" and fall back to // "zone" "Z2" in the "region" "R1" if that is not possible. @@ -1678,13 +1745,17 @@ type TopologyRequirement struct { // Example 2: // Given a volume should be accessible from a single zone, and // requisite = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"}, - // {"region": "R1", "zone": "Z4"}, - // {"region": "R1", "zone": "Z5"} + // + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"}, + // {"region": "R1", "zone": "Z4"}, + // {"region": "R1", "zone": "Z5"} + // // preferred = - // {"region": "R1", "zone": "Z4"}, - // {"region": "R1", "zone": "Z2"} + // + // {"region": "R1", "zone": "Z4"}, + // {"region": "R1", "zone": "Z2"} + // // then the SP SHOULD first attempt to make the provisioned volume // accessible from "zone" "Z4" in the "region" "R1" and fall back to // "zone" "Z2" in the "region" "R1" if that is not possible. If that @@ -1697,13 +1768,17 @@ type TopologyRequirement struct { // the volume is accessible from two zones, aka synchronously // replicated), and // requisite = - // {"region": "R1", "zone": "Z2"}, - // {"region": "R1", "zone": "Z3"}, - // {"region": "R1", "zone": "Z4"}, - // {"region": "R1", "zone": "Z5"} + // + // {"region": "R1", "zone": "Z2"}, + // {"region": "R1", "zone": "Z3"}, + // {"region": "R1", "zone": "Z4"}, + // {"region": "R1", "zone": "Z5"} + // // preferred = - // {"region": "R1", "zone": "Z5"}, - // {"region": "R1", "zone": "Z3"} + // + // {"region": "R1", "zone": "Z5"}, + // {"region": "R1", "zone": "Z3"} + // // then the SP SHOULD first attempt to make the provisioned volume // accessible from the combination of the two "zones" "Z5" and "Z3" in // the "region" "R1". If that's not possible, it should fall back to @@ -2972,6 +3047,7 @@ func (m *ControllerGetCapabilitiesResponse) GetCapabilities() []*ControllerServi // Specifies a capability of the controller service. type ControllerServiceCapability struct { // Types that are valid to be assigned to Type: + // // *ControllerServiceCapability_Rpc Type isControllerServiceCapability_Type `protobuf_oneof:"type"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3093,12 +3169,12 @@ type CreateSnapshotRequest struct { // This field is OPTIONAL. The Plugin is responsible for parsing and // validating these parameters. COs will treat these as opaque. // Use cases for opaque parameters: - // - Specify a policy to automatically clean up the snapshot. - // - Specify an expiration date for the snapshot. - // - Specify whether the snapshot is readonly or read/write. - // - Specify if the snapshot should be replicated to some place. - // - Specify primary or secondary for replication systems that - // support snapshotting only on primary. + // - Specify a policy to automatically clean up the snapshot. + // - Specify an expiration date for the snapshot. + // - Specify whether the snapshot is readonly or read/write. + // - Specify if the snapshot should be replicated to some place. + // - Specify primary or secondary for replication systems that + // support snapshotting only on primary. Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3230,7 +3306,17 @@ type Snapshot struct { // Indicates if a snapshot is ready to use as a // `volume_content_source` in a `CreateVolumeRequest`. The default // value is false. This field is REQUIRED. - ReadyToUse bool `protobuf:"varint,5,opt,name=ready_to_use,json=readyToUse,proto3" json:"ready_to_use,omitempty"` + ReadyToUse bool `protobuf:"varint,5,opt,name=ready_to_use,json=readyToUse,proto3" json:"ready_to_use,omitempty"` + // The ID of the volume group snapshot that this snapshot is part of. + // It uniquely identifies the group snapshot on the storage system. + // This field is OPTIONAL. + // If this snapshot is a member of the volume group snapshot, the SP + // SHOULD provide the ID of the volume group snapshot in this field. + // If provided, CO MUST use this field to indicate that this snapshot + // is part of the specified group snapshot. + // If this message is inside a VolumeGroupSnapshot message, the value + // MUST be the same as the group_snapshot_id in that message. + GroupSnapshotId string `protobuf:"bytes,6,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3296,6 +3382,13 @@ func (m *Snapshot) GetReadyToUse() bool { return false } +func (m *Snapshot) GetGroupSnapshotId() string { + if m != nil { + return m.GroupSnapshotId + } + return "" +} + type DeleteSnapshotRequest struct { // The ID of the snapshot to be deleted. // This field is REQUIRED. @@ -4500,6 +4593,7 @@ func (m *NodeGetCapabilitiesResponse) GetCapabilities() []*NodeServiceCapability // Specifies a capability of the node service. type NodeServiceCapability struct { // Types that are valid to be assigned to Type: + // // *NodeServiceCapability_Rpc Type isNodeServiceCapability_Type `protobuf_oneof:"type"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -4666,8 +4760,10 @@ type NodeGetInfoResponse struct { // no topological constraints declared for V. // // Example 1: - // accessible_topology = - // {"region": "R1", "zone": "Z2"} + // + // accessible_topology = + // {"region": "R1", "zone": "Z2"} + // // Indicates the node exists within the "region" "R1" and the "zone" // "Z2". AccessibleTopology *Topology `protobuf:"bytes,3,opt,name=accessible_topology,json=accessibleTopology,proto3" json:"accessible_topology,omitempty"` @@ -4874,6 +4970,646 @@ func (m *NodeExpandVolumeResponse) GetCapacityBytes() int64 { return 0 } +type GroupControllerGetCapabilitiesRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupControllerGetCapabilitiesRequest) Reset() { *m = GroupControllerGetCapabilitiesRequest{} } +func (m *GroupControllerGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } +func (*GroupControllerGetCapabilitiesRequest) ProtoMessage() {} +func (*GroupControllerGetCapabilitiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{60} +} + +func (m *GroupControllerGetCapabilitiesRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupControllerGetCapabilitiesRequest.Unmarshal(m, b) +} +func (m *GroupControllerGetCapabilitiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupControllerGetCapabilitiesRequest.Marshal(b, m, deterministic) +} +func (m *GroupControllerGetCapabilitiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupControllerGetCapabilitiesRequest.Merge(m, src) +} +func (m *GroupControllerGetCapabilitiesRequest) XXX_Size() int { + return xxx_messageInfo_GroupControllerGetCapabilitiesRequest.Size(m) +} +func (m *GroupControllerGetCapabilitiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GroupControllerGetCapabilitiesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupControllerGetCapabilitiesRequest proto.InternalMessageInfo + +type GroupControllerGetCapabilitiesResponse struct { + // All the capabilities that the group controller service supports. + // This field is OPTIONAL. + Capabilities []*GroupControllerServiceCapability `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupControllerGetCapabilitiesResponse) Reset() { + *m = GroupControllerGetCapabilitiesResponse{} +} +func (m *GroupControllerGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } +func (*GroupControllerGetCapabilitiesResponse) ProtoMessage() {} +func (*GroupControllerGetCapabilitiesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{61} +} + +func (m *GroupControllerGetCapabilitiesResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupControllerGetCapabilitiesResponse.Unmarshal(m, b) +} +func (m *GroupControllerGetCapabilitiesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupControllerGetCapabilitiesResponse.Marshal(b, m, deterministic) +} +func (m *GroupControllerGetCapabilitiesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupControllerGetCapabilitiesResponse.Merge(m, src) +} +func (m *GroupControllerGetCapabilitiesResponse) XXX_Size() int { + return xxx_messageInfo_GroupControllerGetCapabilitiesResponse.Size(m) +} +func (m *GroupControllerGetCapabilitiesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GroupControllerGetCapabilitiesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupControllerGetCapabilitiesResponse proto.InternalMessageInfo + +func (m *GroupControllerGetCapabilitiesResponse) GetCapabilities() []*GroupControllerServiceCapability { + if m != nil { + return m.Capabilities + } + return nil +} + +// Specifies a capability of the group controller service. +type GroupControllerServiceCapability struct { + // Types that are valid to be assigned to Type: + // + // *GroupControllerServiceCapability_Rpc + Type isGroupControllerServiceCapability_Type `protobuf_oneof:"type"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupControllerServiceCapability) Reset() { *m = GroupControllerServiceCapability{} } +func (m *GroupControllerServiceCapability) String() string { return proto.CompactTextString(m) } +func (*GroupControllerServiceCapability) ProtoMessage() {} +func (*GroupControllerServiceCapability) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{62} +} + +func (m *GroupControllerServiceCapability) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupControllerServiceCapability.Unmarshal(m, b) +} +func (m *GroupControllerServiceCapability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupControllerServiceCapability.Marshal(b, m, deterministic) +} +func (m *GroupControllerServiceCapability) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupControllerServiceCapability.Merge(m, src) +} +func (m *GroupControllerServiceCapability) XXX_Size() int { + return xxx_messageInfo_GroupControllerServiceCapability.Size(m) +} +func (m *GroupControllerServiceCapability) XXX_DiscardUnknown() { + xxx_messageInfo_GroupControllerServiceCapability.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupControllerServiceCapability proto.InternalMessageInfo + +type isGroupControllerServiceCapability_Type interface { + isGroupControllerServiceCapability_Type() +} + +type GroupControllerServiceCapability_Rpc struct { + Rpc *GroupControllerServiceCapability_RPC `protobuf:"bytes,1,opt,name=rpc,proto3,oneof"` +} + +func (*GroupControllerServiceCapability_Rpc) isGroupControllerServiceCapability_Type() {} + +func (m *GroupControllerServiceCapability) GetType() isGroupControllerServiceCapability_Type { + if m != nil { + return m.Type + } + return nil +} + +func (m *GroupControllerServiceCapability) GetRpc() *GroupControllerServiceCapability_RPC { + if x, ok := m.GetType().(*GroupControllerServiceCapability_Rpc); ok { + return x.Rpc + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*GroupControllerServiceCapability) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*GroupControllerServiceCapability_Rpc)(nil), + } +} + +type GroupControllerServiceCapability_RPC struct { + Type GroupControllerServiceCapability_RPC_Type `protobuf:"varint,1,opt,name=type,proto3,enum=csi.v1.GroupControllerServiceCapability_RPC_Type" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GroupControllerServiceCapability_RPC) Reset() { *m = GroupControllerServiceCapability_RPC{} } +func (m *GroupControllerServiceCapability_RPC) String() string { return proto.CompactTextString(m) } +func (*GroupControllerServiceCapability_RPC) ProtoMessage() {} +func (*GroupControllerServiceCapability_RPC) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{62, 0} +} + +func (m *GroupControllerServiceCapability_RPC) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GroupControllerServiceCapability_RPC.Unmarshal(m, b) +} +func (m *GroupControllerServiceCapability_RPC) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GroupControllerServiceCapability_RPC.Marshal(b, m, deterministic) +} +func (m *GroupControllerServiceCapability_RPC) XXX_Merge(src proto.Message) { + xxx_messageInfo_GroupControllerServiceCapability_RPC.Merge(m, src) +} +func (m *GroupControllerServiceCapability_RPC) XXX_Size() int { + return xxx_messageInfo_GroupControllerServiceCapability_RPC.Size(m) +} +func (m *GroupControllerServiceCapability_RPC) XXX_DiscardUnknown() { + xxx_messageInfo_GroupControllerServiceCapability_RPC.DiscardUnknown(m) +} + +var xxx_messageInfo_GroupControllerServiceCapability_RPC proto.InternalMessageInfo + +func (m *GroupControllerServiceCapability_RPC) GetType() GroupControllerServiceCapability_RPC_Type { + if m != nil { + return m.Type + } + return GroupControllerServiceCapability_RPC_UNKNOWN +} + +type CreateVolumeGroupSnapshotRequest struct { + // The suggested name for the group snapshot. This field is REQUIRED + // for idempotency. + // Any Unicode string that conforms to the length limit is allowed + // except those containing the following banned characters: + // U+0000-U+0008, U+000B, U+000C, U+000E-U+001F, U+007F-U+009F. + // (These are control characters other than commonly used whitespace.) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // volume ids of the source volumes to be snapshotted together. + // This field is REQUIRED. + SourceVolumeIds []string `protobuf:"bytes,2,rep,name=source_volume_ids,json=sourceVolumeIds,proto3" json:"source_volume_ids,omitempty"` + // Secrets required by plugin to complete + // ControllerCreateVolumeGroupSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerDeleteVolumeGroupSnapshot + // and ControllerGetVolumeGroupSnapshot requests for the same + // group snapshot unless if secrets are rotated after the + // group snapshot is created. + Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Volume secrets required by plugin to complete volume group + // snapshot creation request. This field is needed in case the + // volume level secrets are different from the above secrets + // for the group snapshot. + // This field is OPTIONAL. + VolumeSecrets []*VolumeSecret `protobuf:"bytes,4,rep,name=volume_secrets,json=volumeSecrets,proto3" json:"volume_secrets,omitempty"` + // Plugin specific parameters passed in as opaque key-value pairs. + // This field is OPTIONAL. The Plugin is responsible for parsing and + // validating these parameters. COs will treat these as opaque. + Parameters map[string]string `protobuf:"bytes,5,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateVolumeGroupSnapshotRequest) Reset() { *m = CreateVolumeGroupSnapshotRequest{} } +func (m *CreateVolumeGroupSnapshotRequest) String() string { return proto.CompactTextString(m) } +func (*CreateVolumeGroupSnapshotRequest) ProtoMessage() {} +func (*CreateVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{63} +} + +func (m *CreateVolumeGroupSnapshotRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateVolumeGroupSnapshotRequest.Unmarshal(m, b) +} +func (m *CreateVolumeGroupSnapshotRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateVolumeGroupSnapshotRequest.Marshal(b, m, deterministic) +} +func (m *CreateVolumeGroupSnapshotRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateVolumeGroupSnapshotRequest.Merge(m, src) +} +func (m *CreateVolumeGroupSnapshotRequest) XXX_Size() int { + return xxx_messageInfo_CreateVolumeGroupSnapshotRequest.Size(m) +} +func (m *CreateVolumeGroupSnapshotRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CreateVolumeGroupSnapshotRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateVolumeGroupSnapshotRequest proto.InternalMessageInfo + +func (m *CreateVolumeGroupSnapshotRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *CreateVolumeGroupSnapshotRequest) GetSourceVolumeIds() []string { + if m != nil { + return m.SourceVolumeIds + } + return nil +} + +func (m *CreateVolumeGroupSnapshotRequest) GetSecrets() map[string]string { + if m != nil { + return m.Secrets + } + return nil +} + +func (m *CreateVolumeGroupSnapshotRequest) GetVolumeSecrets() []*VolumeSecret { + if m != nil { + return m.VolumeSecrets + } + return nil +} + +func (m *CreateVolumeGroupSnapshotRequest) GetParameters() map[string]string { + if m != nil { + return m.Parameters + } + return nil +} + +type VolumeSecret struct { + // ID of the volume whose secrets are provided. + // This field is REQUIRED. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + // Secrets required by plugin for a volume operation. + // This field is REQUIRED. Refer to the `Secrets Requirements` + // section on how to use this field. + Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *VolumeSecret) Reset() { *m = VolumeSecret{} } +func (m *VolumeSecret) String() string { return proto.CompactTextString(m) } +func (*VolumeSecret) ProtoMessage() {} +func (*VolumeSecret) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{64} +} + +func (m *VolumeSecret) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_VolumeSecret.Unmarshal(m, b) +} +func (m *VolumeSecret) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_VolumeSecret.Marshal(b, m, deterministic) +} +func (m *VolumeSecret) XXX_Merge(src proto.Message) { + xxx_messageInfo_VolumeSecret.Merge(m, src) +} +func (m *VolumeSecret) XXX_Size() int { + return xxx_messageInfo_VolumeSecret.Size(m) +} +func (m *VolumeSecret) XXX_DiscardUnknown() { + xxx_messageInfo_VolumeSecret.DiscardUnknown(m) +} + +var xxx_messageInfo_VolumeSecret proto.InternalMessageInfo + +func (m *VolumeSecret) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *VolumeSecret) GetSecrets() map[string]string { + if m != nil { + return m.Secrets + } + return nil +} + +type CreateVolumeGroupSnapshotResponse struct { + // Contains all attributes of the newly created group snapshot. + // This field is REQUIRED. + GroupSnapshot *VolumeGroupSnapshot `protobuf:"bytes,1,opt,name=group_snapshot,json=groupSnapshot,proto3" json:"group_snapshot,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateVolumeGroupSnapshotResponse) Reset() { *m = CreateVolumeGroupSnapshotResponse{} } +func (m *CreateVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } +func (*CreateVolumeGroupSnapshotResponse) ProtoMessage() {} +func (*CreateVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{65} +} + +func (m *CreateVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateVolumeGroupSnapshotResponse.Unmarshal(m, b) +} +func (m *CreateVolumeGroupSnapshotResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateVolumeGroupSnapshotResponse.Marshal(b, m, deterministic) +} +func (m *CreateVolumeGroupSnapshotResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateVolumeGroupSnapshotResponse.Merge(m, src) +} +func (m *CreateVolumeGroupSnapshotResponse) XXX_Size() int { + return xxx_messageInfo_CreateVolumeGroupSnapshotResponse.Size(m) +} +func (m *CreateVolumeGroupSnapshotResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CreateVolumeGroupSnapshotResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateVolumeGroupSnapshotResponse proto.InternalMessageInfo + +func (m *CreateVolumeGroupSnapshotResponse) GetGroupSnapshot() *VolumeGroupSnapshot { + if m != nil { + return m.GroupSnapshot + } + return nil +} + +type VolumeGroupSnapshot struct { + // The identifier for this group snapshot, generated by the plugin. + // This field MUST contain enough information to uniquely identify + // this specific snapshot vs all other group snapshots supported by + // this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this group snapshot. + // The SP is NOT responsible for global uniqueness of + // group_snapshot_id across multiple SPs. + // This field is REQUIRED. + GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` + // A list of snapshots created. + // This field is REQUIRED. + Snapshots []*Snapshot `protobuf:"bytes,2,rep,name=snapshots,proto3" json:"snapshots,omitempty"` + // Timestamp when the volume group snapshot is taken. + // This field is REQUIRED. + CreationTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *VolumeGroupSnapshot) Reset() { *m = VolumeGroupSnapshot{} } +func (m *VolumeGroupSnapshot) String() string { return proto.CompactTextString(m) } +func (*VolumeGroupSnapshot) ProtoMessage() {} +func (*VolumeGroupSnapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{66} +} + +func (m *VolumeGroupSnapshot) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_VolumeGroupSnapshot.Unmarshal(m, b) +} +func (m *VolumeGroupSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_VolumeGroupSnapshot.Marshal(b, m, deterministic) +} +func (m *VolumeGroupSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_VolumeGroupSnapshot.Merge(m, src) +} +func (m *VolumeGroupSnapshot) XXX_Size() int { + return xxx_messageInfo_VolumeGroupSnapshot.Size(m) +} +func (m *VolumeGroupSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_VolumeGroupSnapshot.DiscardUnknown(m) +} + +var xxx_messageInfo_VolumeGroupSnapshot proto.InternalMessageInfo + +func (m *VolumeGroupSnapshot) GetGroupSnapshotId() string { + if m != nil { + return m.GroupSnapshotId + } + return "" +} + +func (m *VolumeGroupSnapshot) GetSnapshots() []*Snapshot { + if m != nil { + return m.Snapshots + } + return nil +} + +func (m *VolumeGroupSnapshot) GetCreationTime() *timestamp.Timestamp { + if m != nil { + return m.CreationTime + } + return nil +} + +type DeleteVolumeGroupSnapshotRequest struct { + // The ID of the group snapshot to be deleted. + // This field is REQUIRED. + GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` + // A list of snapshot ids that are part of this group snapshot. + // Some SPs require this list to delete the snapshots in the group. + // This field is REQUIRED. + SnapshotIds []string `protobuf:"bytes,2,rep,name=snapshot_ids,json=snapshotIds,proto3" json:"snapshot_ids,omitempty"` + // Secrets required by plugin to complete group snapshot deletion + // request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerCreateVolumeGroupSnapshot + // request for the same group snapshot unless if secrets are rotated + // after the group snapshot is created. + // The secrets provided in the field SHOULD be passed to both + // the group snapshot and the individual snapshot members if needed. + Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeleteVolumeGroupSnapshotRequest) Reset() { *m = DeleteVolumeGroupSnapshotRequest{} } +func (m *DeleteVolumeGroupSnapshotRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteVolumeGroupSnapshotRequest) ProtoMessage() {} +func (*DeleteVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{67} +} + +func (m *DeleteVolumeGroupSnapshotRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeleteVolumeGroupSnapshotRequest.Unmarshal(m, b) +} +func (m *DeleteVolumeGroupSnapshotRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeleteVolumeGroupSnapshotRequest.Marshal(b, m, deterministic) +} +func (m *DeleteVolumeGroupSnapshotRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteVolumeGroupSnapshotRequest.Merge(m, src) +} +func (m *DeleteVolumeGroupSnapshotRequest) XXX_Size() int { + return xxx_messageInfo_DeleteVolumeGroupSnapshotRequest.Size(m) +} +func (m *DeleteVolumeGroupSnapshotRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeleteVolumeGroupSnapshotRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DeleteVolumeGroupSnapshotRequest proto.InternalMessageInfo + +func (m *DeleteVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { + if m != nil { + return m.GroupSnapshotId + } + return "" +} + +func (m *DeleteVolumeGroupSnapshotRequest) GetSnapshotIds() []string { + if m != nil { + return m.SnapshotIds + } + return nil +} + +func (m *DeleteVolumeGroupSnapshotRequest) GetSecrets() map[string]string { + if m != nil { + return m.Secrets + } + return nil +} + +type DeleteVolumeGroupSnapshotResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeleteVolumeGroupSnapshotResponse) Reset() { *m = DeleteVolumeGroupSnapshotResponse{} } +func (m *DeleteVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } +func (*DeleteVolumeGroupSnapshotResponse) ProtoMessage() {} +func (*DeleteVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{68} +} + +func (m *DeleteVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeleteVolumeGroupSnapshotResponse.Unmarshal(m, b) +} +func (m *DeleteVolumeGroupSnapshotResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeleteVolumeGroupSnapshotResponse.Marshal(b, m, deterministic) +} +func (m *DeleteVolumeGroupSnapshotResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteVolumeGroupSnapshotResponse.Merge(m, src) +} +func (m *DeleteVolumeGroupSnapshotResponse) XXX_Size() int { + return xxx_messageInfo_DeleteVolumeGroupSnapshotResponse.Size(m) +} +func (m *DeleteVolumeGroupSnapshotResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DeleteVolumeGroupSnapshotResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_DeleteVolumeGroupSnapshotResponse proto.InternalMessageInfo + +type ControllerGetVolumeGroupSnapshotRequest struct { + // The ID of the group snapshot to fetch current group snapshot + // information for. + // This field is REQUIRED. + GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` + // Secrets required by plugin to complete + // ControllerGetVolumeGroupSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerCreateVolumeGroupSnapshot + // request for the same group snapshot unless if secrets are rotated + // after the group snapshot is created. + Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ControllerGetVolumeGroupSnapshotRequest) Reset() { + *m = ControllerGetVolumeGroupSnapshotRequest{} +} +func (m *ControllerGetVolumeGroupSnapshotRequest) String() string { return proto.CompactTextString(m) } +func (*ControllerGetVolumeGroupSnapshotRequest) ProtoMessage() {} +func (*ControllerGetVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{69} +} + +func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Unmarshal(m, b) +} +func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Marshal(b, m, deterministic) +} +func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Merge(m, src) +} +func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Size() int { + return xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Size(m) +} +func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest proto.InternalMessageInfo + +func (m *ControllerGetVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { + if m != nil { + return m.GroupSnapshotId + } + return "" +} + +func (m *ControllerGetVolumeGroupSnapshotRequest) GetSecrets() map[string]string { + if m != nil { + return m.Secrets + } + return nil +} + +type ControllerGetVolumeGroupSnapshotResponse struct { + // This field is REQUIRED + GroupSnapshot *VolumeGroupSnapshot `protobuf:"bytes,1,opt,name=group_snapshot,json=groupSnapshot,proto3" json:"group_snapshot,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ControllerGetVolumeGroupSnapshotResponse) Reset() { + *m = ControllerGetVolumeGroupSnapshotResponse{} +} +func (m *ControllerGetVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } +func (*ControllerGetVolumeGroupSnapshotResponse) ProtoMessage() {} +func (*ControllerGetVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{70} +} + +func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Unmarshal(m, b) +} +func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Marshal(b, m, deterministic) +} +func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Merge(m, src) +} +func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Size() int { + return xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Size(m) +} +func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse proto.InternalMessageInfo + +func (m *ControllerGetVolumeGroupSnapshotResponse) GetGroupSnapshot() *VolumeGroupSnapshot { + if m != nil { + return m.GroupSnapshot + } + return nil +} + var E_AlphaEnum = &proto.ExtensionDesc{ ExtendedType: (*descriptor.EnumOptions)(nil), ExtensionType: (*bool)(nil), @@ -4944,6 +5680,7 @@ func init() { proto.RegisterEnum("csi.v1.ControllerServiceCapability_RPC_Type", ControllerServiceCapability_RPC_Type_name, ControllerServiceCapability_RPC_Type_value) proto.RegisterEnum("csi.v1.VolumeUsage_Unit", VolumeUsage_Unit_name, VolumeUsage_Unit_value) proto.RegisterEnum("csi.v1.NodeServiceCapability_RPC_Type", NodeServiceCapability_RPC_Type_name, NodeServiceCapability_RPC_Type_value) + proto.RegisterEnum("csi.v1.GroupControllerServiceCapability_RPC_Type", GroupControllerServiceCapability_RPC_Type_name, GroupControllerServiceCapability_RPC_Type_value) proto.RegisterType((*GetPluginInfoRequest)(nil), "csi.v1.GetPluginInfoRequest") proto.RegisterType((*GetPluginInfoResponse)(nil), "csi.v1.GetPluginInfoResponse") proto.RegisterMapType((map[string]string)(nil), "csi.v1.GetPluginInfoResponse.ManifestEntry") @@ -5046,6 +5783,23 @@ func init() { proto.RegisterType((*NodeExpandVolumeRequest)(nil), "csi.v1.NodeExpandVolumeRequest") proto.RegisterMapType((map[string]string)(nil), "csi.v1.NodeExpandVolumeRequest.SecretsEntry") proto.RegisterType((*NodeExpandVolumeResponse)(nil), "csi.v1.NodeExpandVolumeResponse") + proto.RegisterType((*GroupControllerGetCapabilitiesRequest)(nil), "csi.v1.GroupControllerGetCapabilitiesRequest") + proto.RegisterType((*GroupControllerGetCapabilitiesResponse)(nil), "csi.v1.GroupControllerGetCapabilitiesResponse") + proto.RegisterType((*GroupControllerServiceCapability)(nil), "csi.v1.GroupControllerServiceCapability") + proto.RegisterType((*GroupControllerServiceCapability_RPC)(nil), "csi.v1.GroupControllerServiceCapability.RPC") + proto.RegisterType((*CreateVolumeGroupSnapshotRequest)(nil), "csi.v1.CreateVolumeGroupSnapshotRequest") + proto.RegisterMapType((map[string]string)(nil), "csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry") + proto.RegisterMapType((map[string]string)(nil), "csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry") + proto.RegisterType((*VolumeSecret)(nil), "csi.v1.VolumeSecret") + proto.RegisterMapType((map[string]string)(nil), "csi.v1.VolumeSecret.SecretsEntry") + proto.RegisterType((*CreateVolumeGroupSnapshotResponse)(nil), "csi.v1.CreateVolumeGroupSnapshotResponse") + proto.RegisterType((*VolumeGroupSnapshot)(nil), "csi.v1.VolumeGroupSnapshot") + proto.RegisterType((*DeleteVolumeGroupSnapshotRequest)(nil), "csi.v1.DeleteVolumeGroupSnapshotRequest") + proto.RegisterMapType((map[string]string)(nil), "csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry") + proto.RegisterType((*DeleteVolumeGroupSnapshotResponse)(nil), "csi.v1.DeleteVolumeGroupSnapshotResponse") + proto.RegisterType((*ControllerGetVolumeGroupSnapshotRequest)(nil), "csi.v1.ControllerGetVolumeGroupSnapshotRequest") + proto.RegisterMapType((map[string]string)(nil), "csi.v1.ControllerGetVolumeGroupSnapshotRequest.SecretsEntry") + proto.RegisterType((*ControllerGetVolumeGroupSnapshotResponse)(nil), "csi.v1.ControllerGetVolumeGroupSnapshotResponse") proto.RegisterExtension(E_AlphaEnum) proto.RegisterExtension(E_AlphaEnumValue) proto.RegisterExtension(E_CsiSecret) @@ -5060,245 +5814,271 @@ func init() { } var fileDescriptor_9cdb00adce470e01 = []byte{ - // 3796 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3b, 0x4b, 0x6c, 0x23, 0x47, - 0x76, 0x6a, 0xfe, 0x24, 0x3d, 0x4a, 0x1a, 0xaa, 0x28, 0x69, 0x38, 0x2d, 0x69, 0xa4, 0xe9, 0xf1, - 0x78, 0xe5, 0xf1, 0x0c, 0x67, 0xad, 0xb5, 0x8d, 0x58, 0x1e, 0xef, 0x9a, 0xa4, 0x38, 0x12, 0x77, - 0x28, 0x52, 0x6e, 0x52, 0x33, 0x3b, 0x93, 0x18, 0xed, 0x16, 0x59, 0xe2, 0x34, 0x4c, 0x76, 0xd3, - 0xdd, 0x4d, 0x45, 0xda, 0x4b, 0x82, 0x04, 0x39, 0x04, 0xb9, 0xe4, 0xb6, 0xce, 0x29, 0x8b, 0x24, - 0xc7, 0x5d, 0xec, 0x21, 0x08, 0x72, 0x0c, 0x90, 0x5b, 0x02, 0xe4, 0x73, 0x4b, 0x90, 0xcb, 0x1e, - 0x02, 0xe4, 0x60, 0x24, 0x80, 0xcf, 0x39, 0x04, 0x41, 0x57, 0x55, 0x37, 0xfb, 0xcb, 0xcf, 0x48, - 0x03, 0x1f, 0xf6, 0x24, 0xf6, 0xab, 0xf7, 0x5e, 0xbd, 0xaa, 0x7a, 0xef, 0xd5, 0xfb, 0x94, 0xe0, - 0x83, 0x8e, 0x62, 0xbe, 0x1a, 0x9c, 0xe6, 0x5b, 0x5a, 0xef, 0x51, 0x4b, 0x53, 0x4d, 0x59, 0x51, - 0xb1, 0xfe, 0xd0, 0x30, 0x35, 0x5d, 0xee, 0xe0, 0x87, 0x8a, 0x6a, 0x62, 0xfd, 0x4c, 0x6e, 0xe1, - 0x47, 0x46, 0x1f, 0xb7, 0x1e, 0xb5, 0x0c, 0x25, 0xdf, 0xd7, 0x35, 0x53, 0x43, 0x29, 0xeb, 0xe7, - 0xf9, 0x7b, 0xfc, 0x76, 0x47, 0xd3, 0x3a, 0x5d, 0xfc, 0x88, 0x40, 0x4f, 0x07, 0x67, 0x8f, 0xda, - 0xd8, 0x68, 0xe9, 0x4a, 0xdf, 0xd4, 0x74, 0x8a, 0xc9, 0x6f, 0xf9, 0x31, 0x4c, 0xa5, 0x87, 0x0d, - 0x53, 0xee, 0xf5, 0x19, 0xc2, 0x6d, 0x3f, 0xc2, 0xef, 0xea, 0x72, 0xbf, 0x8f, 0x75, 0x83, 0x8e, - 0x0b, 0x6b, 0xb0, 0x72, 0x80, 0xcd, 0xe3, 0xee, 0xa0, 0xa3, 0xa8, 0x15, 0xf5, 0x4c, 0x13, 0xf1, - 0x57, 0x03, 0x6c, 0x98, 0xc2, 0xbf, 0x73, 0xb0, 0xea, 0x1b, 0x30, 0xfa, 0x9a, 0x6a, 0x60, 0x84, - 0x20, 0xa1, 0xca, 0x3d, 0x9c, 0xe3, 0xb6, 0xb9, 0x9d, 0x79, 0x91, 0xfc, 0x46, 0xf7, 0x60, 0xe9, - 0x1c, 0xab, 0x6d, 0x4d, 0x97, 0xce, 0xb1, 0x6e, 0x28, 0x9a, 0x9a, 0x8b, 0x91, 0xd1, 0x45, 0x0a, - 0x7d, 0x46, 0x81, 0xe8, 0x00, 0xe6, 0x7a, 0xb2, 0xaa, 0x9c, 0x61, 0xc3, 0xcc, 0xc5, 0xb7, 0xe3, - 0x3b, 0xe9, 0xdd, 0x77, 0xf3, 0x74, 0xa9, 0xf9, 0xd0, 0xb9, 0xf2, 0x47, 0x0c, 0xbb, 0xac, 0x9a, - 0xfa, 0xa5, 0xe8, 0x10, 0xf3, 0x1f, 0xc3, 0xa2, 0x67, 0x08, 0x65, 0x20, 0xfe, 0x25, 0xbe, 0x64, - 0x32, 0x59, 0x3f, 0xd1, 0x0a, 0x24, 0xcf, 0xe5, 0xee, 0x00, 0x33, 0x49, 0xe8, 0xc7, 0x5e, 0xec, - 0xb7, 0x38, 0xe1, 0x36, 0x6c, 0x38, 0xb3, 0x95, 0xe4, 0xbe, 0x7c, 0xaa, 0x74, 0x15, 0x53, 0xc1, - 0x86, 0xbd, 0xf4, 0xcf, 0x61, 0x33, 0x62, 0x9c, 0xed, 0xc0, 0x63, 0x58, 0x68, 0xb9, 0xe0, 0x39, - 0x8e, 0x2c, 0x25, 0x67, 0x2f, 0xc5, 0x47, 0x79, 0x29, 0x7a, 0xb0, 0x85, 0x7f, 0x8e, 0x43, 0xc6, - 0x8f, 0x82, 0x1e, 0xc3, 0xac, 0x81, 0xf5, 0x73, 0xa5, 0x45, 0xf7, 0x35, 0xbd, 0xbb, 0x1d, 0xc5, - 0x2d, 0xdf, 0xa0, 0x78, 0x87, 0x33, 0xa2, 0x4d, 0x82, 0x4e, 0x20, 0x73, 0xae, 0x75, 0x07, 0x3d, - 0x2c, 0xe1, 0x8b, 0xbe, 0xac, 0x3a, 0x07, 0x90, 0xde, 0xdd, 0x89, 0x64, 0xf3, 0x8c, 0x10, 0x94, - 0x6d, 0xfc, 0xc3, 0x19, 0xf1, 0xc6, 0xb9, 0x17, 0xc4, 0xff, 0x8c, 0x83, 0x59, 0x36, 0x1b, 0xfa, - 0x08, 0x12, 0xe6, 0x65, 0x9f, 0x4a, 0xb7, 0xb4, 0x7b, 0x6f, 0x9c, 0x74, 0xf9, 0xe6, 0x65, 0x1f, - 0x8b, 0x84, 0x44, 0xf8, 0x0c, 0x12, 0xd6, 0x17, 0x4a, 0xc3, 0xec, 0x49, 0xed, 0x69, 0xad, 0xfe, - 0xbc, 0x96, 0x99, 0x41, 0x6b, 0x80, 0x4a, 0xf5, 0x5a, 0x53, 0xac, 0x57, 0xab, 0x65, 0x51, 0x6a, - 0x94, 0xc5, 0x67, 0x95, 0x52, 0x39, 0xc3, 0xa1, 0xb7, 0x60, 0xfb, 0x59, 0xbd, 0x7a, 0x72, 0x54, - 0x96, 0x0a, 0xa5, 0x52, 0xb9, 0xd1, 0xa8, 0x14, 0x2b, 0xd5, 0x4a, 0xf3, 0x85, 0x54, 0xaa, 0xd7, - 0x1a, 0x4d, 0xb1, 0x50, 0xa9, 0x35, 0x1b, 0x99, 0x18, 0xff, 0x07, 0x1c, 0xdc, 0xf0, 0x2d, 0x00, - 0x15, 0x3c, 0x12, 0x3e, 0x9c, 0x74, 0xe1, 0x6e, 0x49, 0x1f, 0x84, 0x49, 0x0a, 0x90, 0xaa, 0xd7, - 0xaa, 0x95, 0x9a, 0x25, 0x5d, 0x1a, 0x66, 0xeb, 0x4f, 0x9e, 0x90, 0x8f, 0x58, 0x31, 0x45, 0x27, - 0x14, 0x96, 0x60, 0xe1, 0x58, 0xd7, 0x4e, 0xb1, 0xad, 0x3f, 0x05, 0x58, 0x64, 0xdf, 0x4c, 0x5f, - 0xbe, 0x0f, 0x49, 0x1d, 0xcb, 0xed, 0x4b, 0x76, 0xb4, 0x7c, 0x9e, 0xda, 0x64, 0xde, 0xb6, 0xc9, - 0x7c, 0x51, 0xd3, 0xba, 0xcf, 0x2c, 0xfd, 0x14, 0x29, 0xa2, 0xf0, 0x6d, 0x02, 0xb2, 0x25, 0x1d, - 0xcb, 0x26, 0xa6, 0xd2, 0x32, 0xd6, 0xa1, 0xb6, 0xf7, 0x18, 0x96, 0x2c, 0xfd, 0x6a, 0x29, 0xe6, - 0xa5, 0xa4, 0xcb, 0x6a, 0x07, 0xb3, 0xa3, 0x5f, 0xb5, 0x77, 0xa0, 0xc4, 0x46, 0x45, 0x6b, 0x50, - 0x5c, 0x6c, 0xb9, 0x3f, 0x51, 0x05, 0xb2, 0x4c, 0x75, 0x3c, 0x2a, 0x1d, 0xf7, 0xaa, 0x34, 0x95, - 0xc2, 0xa5, 0xd2, 0xe8, 0xdc, 0x0b, 0x51, 0xb0, 0x81, 0x9e, 0x02, 0xf4, 0x65, 0x5d, 0xee, 0x61, - 0x13, 0xeb, 0x46, 0x2e, 0xe1, 0xb5, 0xef, 0x90, 0xd5, 0xe4, 0x8f, 0x1d, 0x6c, 0x6a, 0xdf, 0x2e, - 0x72, 0x74, 0x60, 0x19, 0x44, 0x4b, 0xc7, 0xa6, 0x91, 0x4b, 0x12, 0x4e, 0x3b, 0xa3, 0x38, 0x35, - 0x28, 0x2a, 0x61, 0x53, 0x8c, 0x7f, 0x5d, 0xe4, 0x44, 0x9b, 0x1a, 0xd5, 0x61, 0xd5, 0x5e, 0xa0, - 0xa6, 0x9a, 0x58, 0x35, 0x25, 0x43, 0x1b, 0xe8, 0x2d, 0x9c, 0x4b, 0x91, 0x5d, 0x5a, 0xf7, 0x2d, - 0x91, 0xe2, 0x34, 0x08, 0x8a, 0xc8, 0xb6, 0xc6, 0x03, 0x44, 0x2f, 0x81, 0x97, 0x5b, 0x2d, 0x6c, - 0x18, 0x0a, 0xdd, 0x0b, 0x49, 0xc7, 0x5f, 0x0d, 0x14, 0x1d, 0xf7, 0xb0, 0x6a, 0x1a, 0xb9, 0x59, - 0x2f, 0xd7, 0xa6, 0xd6, 0xd7, 0xba, 0x5a, 0xe7, 0x52, 0x1c, 0xe2, 0x88, 0xb7, 0x3c, 0xe4, 0xae, - 0x11, 0x83, 0xff, 0x04, 0x6e, 0xf8, 0x36, 0x65, 0x1a, 0xcf, 0xc6, 0xef, 0xc1, 0x82, 0x7b, 0x27, - 0xa6, 0xf2, 0x8a, 0x7f, 0x12, 0x83, 0x6c, 0xc8, 0x1e, 0xa0, 0x43, 0x98, 0x33, 0x54, 0xb9, 0x6f, - 0xbc, 0xd2, 0x4c, 0xa6, 0xbf, 0xf7, 0x47, 0x6c, 0x59, 0xbe, 0xc1, 0x70, 0xe9, 0xe7, 0xe1, 0x8c, - 0xe8, 0x50, 0xa3, 0x22, 0xa4, 0xe8, 0x7e, 0xfa, 0x7d, 0x53, 0x18, 0x1f, 0x0a, 0x73, 0xb8, 0x30, - 0x4a, 0xfe, 0x3d, 0x58, 0xf2, 0xce, 0x80, 0xb6, 0x20, 0x6d, 0xcf, 0x20, 0x29, 0x6d, 0xb6, 0x56, - 0xb0, 0x41, 0x95, 0x36, 0xff, 0x2e, 0x2c, 0xb8, 0x99, 0xa1, 0x75, 0x98, 0x67, 0x0a, 0xe1, 0xa0, - 0xcf, 0x51, 0x40, 0xa5, 0xed, 0xd8, 0xf4, 0x0f, 0x61, 0xc5, 0xab, 0x67, 0xcc, 0x94, 0xdf, 0x76, - 0xd6, 0x40, 0xf7, 0x62, 0xc9, 0xbb, 0x06, 0x5b, 0x4e, 0xe1, 0xcf, 0x93, 0x90, 0xf1, 0x1b, 0x0d, - 0x7a, 0x0c, 0xc9, 0xd3, 0xae, 0xd6, 0xfa, 0x92, 0xd1, 0xbe, 0x15, 0x65, 0x5d, 0xf9, 0xa2, 0x85, - 0x45, 0xa1, 0x87, 0x33, 0x22, 0x25, 0xb2, 0xa8, 0x7b, 0xda, 0x40, 0x35, 0xd9, 0xee, 0x45, 0x53, - 0x1f, 0x59, 0x58, 0x43, 0x6a, 0x42, 0x84, 0xf6, 0x21, 0x4d, 0xd5, 0x4e, 0xea, 0x69, 0x6d, 0x9c, - 0x8b, 0x13, 0x1e, 0x77, 0x23, 0x79, 0x14, 0x08, 0xee, 0x91, 0xd6, 0xc6, 0x22, 0xc8, 0xce, 0x6f, - 0x7e, 0x11, 0xd2, 0x2e, 0xd9, 0xf8, 0x01, 0xa4, 0x5d, 0x93, 0xa1, 0x9b, 0x30, 0x7b, 0x66, 0x48, - 0x8e, 0x13, 0x9e, 0x17, 0x53, 0x67, 0x06, 0xf1, 0xa7, 0x5b, 0x90, 0x26, 0x52, 0x48, 0x67, 0x5d, - 0xb9, 0x63, 0xe4, 0x62, 0xdb, 0x71, 0xeb, 0x8c, 0x08, 0xe8, 0x89, 0x05, 0x41, 0x0f, 0x80, 0x39, - 0x14, 0x89, 0xe2, 0x75, 0x74, 0x6d, 0xd0, 0x27, 0x42, 0xce, 0x8b, 0xec, 0x6a, 0x23, 0x13, 0x1d, - 0x58, 0x70, 0xfe, 0xaf, 0x63, 0x00, 0x43, 0x01, 0xd1, 0x63, 0x48, 0x90, 0x35, 0x51, 0xc7, 0xbf, - 0x33, 0xc1, 0x9a, 0xf2, 0x64, 0x61, 0x84, 0x4a, 0xf8, 0x2f, 0x0e, 0x12, 0x84, 0x8d, 0xff, 0x7a, - 0x6a, 0x54, 0x6a, 0x07, 0xd5, 0xb2, 0x54, 0xab, 0xef, 0x97, 0xa5, 0xe7, 0x62, 0xa5, 0x59, 0x16, - 0x33, 0x1c, 0x5a, 0x87, 0x9b, 0x6e, 0xb8, 0x58, 0x2e, 0xec, 0x97, 0x45, 0xa9, 0x5e, 0xab, 0xbe, - 0xc8, 0xc4, 0x10, 0x0f, 0x6b, 0x47, 0x27, 0xd5, 0x66, 0x25, 0x38, 0x16, 0x47, 0x1b, 0x90, 0x73, - 0x8d, 0x31, 0x1e, 0x8c, 0x6d, 0xc2, 0x62, 0xeb, 0x1a, 0xa5, 0x3f, 0xd9, 0x60, 0x12, 0x09, 0x70, - 0xcb, 0x3d, 0xa7, 0x97, 0x36, 0xc5, 0xc7, 0x7f, 0x5e, 0xe4, 0xd0, 0x1d, 0xc8, 0xb9, 0x71, 0x3c, - 0x1c, 0x66, 0x09, 0x4a, 0x71, 0xd1, 0xd1, 0x00, 0xa2, 0xe1, 0xcf, 0x61, 0xd1, 0x73, 0x31, 0x58, - 0x31, 0x1c, 0xf3, 0x64, 0x6d, 0xe9, 0xf4, 0xd2, 0x24, 0x71, 0x0d, 0xb7, 0x13, 0x17, 0x17, 0x6d, - 0x68, 0xd1, 0x02, 0x5a, 0x67, 0xd9, 0x55, 0x7a, 0x8a, 0xc9, 0x70, 0x62, 0x04, 0x07, 0x08, 0x88, - 0x20, 0x08, 0xbf, 0x8e, 0x41, 0x8a, 0x29, 0xc4, 0x3d, 0xd7, 0xd5, 0xe4, 0x61, 0x69, 0x43, 0x29, - 0x4b, 0x8f, 0x45, 0xc6, 0xbc, 0x16, 0x89, 0x0e, 0x61, 0xc9, 0xed, 0xbf, 0x2f, 0xec, 0xc8, 0xf1, - 0x8e, 0xf7, 0x9c, 0xdd, 0x4e, 0xe4, 0x82, 0xc5, 0x8b, 0x8b, 0xe7, 0x6e, 0x18, 0x2a, 0xc2, 0x92, - 0xef, 0x0a, 0x48, 0x8c, 0xbf, 0x02, 0x16, 0x5b, 0x1e, 0x6f, 0x58, 0x80, 0xac, 0xed, 0xbd, 0xbb, - 0x58, 0x32, 0x99, 0x77, 0x67, 0x57, 0x54, 0x26, 0xe0, 0xf5, 0xd1, 0x10, 0xd9, 0x86, 0xf1, 0x9f, - 0x02, 0x0a, 0xca, 0x3a, 0x95, 0xab, 0x1e, 0x40, 0x36, 0xe4, 0x5e, 0x41, 0x79, 0x98, 0x27, 0x47, - 0x65, 0x28, 0x26, 0x66, 0x31, 0x69, 0x50, 0xa2, 0x21, 0x8a, 0x85, 0xdf, 0xd7, 0xf1, 0x19, 0xd6, - 0x75, 0xdc, 0x26, 0x36, 0x19, 0x8a, 0xef, 0xa0, 0x08, 0x7f, 0xc8, 0xc1, 0x9c, 0x0d, 0x47, 0x7b, - 0x30, 0x67, 0xe0, 0x0e, 0xbd, 0xf3, 0xe8, 0x5c, 0xb7, 0xfd, 0xb4, 0xf9, 0x06, 0x43, 0x60, 0xd1, - 0xbb, 0x8d, 0x6f, 0x45, 0xef, 0x9e, 0xa1, 0xa9, 0x16, 0xff, 0xb7, 0x1c, 0x64, 0xf7, 0x71, 0x17, - 0xfb, 0x43, 0xa3, 0x51, 0x6e, 0xdd, 0x1d, 0x4d, 0xc4, 0xbc, 0xd1, 0x44, 0x08, 0xab, 0x11, 0xd1, - 0xc4, 0x95, 0x6e, 0xd8, 0x35, 0x58, 0xf1, 0xce, 0x46, 0xef, 0x14, 0xe1, 0x7f, 0xe2, 0x70, 0xdb, - 0xd2, 0x05, 0x5d, 0xeb, 0x76, 0xb1, 0x7e, 0x3c, 0x38, 0xed, 0x2a, 0xc6, 0xab, 0x29, 0x16, 0x77, - 0x13, 0x66, 0x55, 0xad, 0xed, 0x32, 0x9e, 0x94, 0xf5, 0x59, 0x69, 0xa3, 0x32, 0x2c, 0xfb, 0x63, - 0xbb, 0x4b, 0xe6, 0xf9, 0xa3, 0x23, 0xbb, 0xcc, 0xb9, 0xff, 0xda, 0xe2, 0x61, 0xce, 0x8a, 0x4a, - 0x35, 0xb5, 0x7b, 0x49, 0x2c, 0x66, 0x4e, 0x74, 0xbe, 0x91, 0xe8, 0x0f, 0xd3, 0x7e, 0xe0, 0x84, - 0x69, 0x23, 0x57, 0x34, 0x2a, 0x62, 0xfb, 0x22, 0x60, 0xf1, 0x29, 0xc2, 0xfa, 0xa3, 0x09, 0x59, - 0x8f, 0xf5, 0x04, 0x57, 0x39, 0xc5, 0x6b, 0x30, 0xdf, 0x7f, 0xe4, 0x60, 0x2b, 0x72, 0x09, 0x2c, - 0xce, 0x68, 0xc3, 0x8d, 0x3e, 0x1d, 0x70, 0x36, 0x81, 0x5a, 0xd9, 0xc7, 0x63, 0x37, 0x81, 0xa5, - 0xce, 0x0c, 0xea, 0xd9, 0x86, 0xa5, 0xbe, 0x07, 0xc8, 0x17, 0x20, 0x1b, 0x82, 0x36, 0xd5, 0x62, - 0xbe, 0xe1, 0x60, 0x7b, 0x28, 0xca, 0x89, 0xda, 0xbf, 0x3e, 0xf5, 0x6d, 0x0e, 0x75, 0x8b, 0xba, - 0xfc, 0x0f, 0x82, 0x6b, 0x0f, 0x9f, 0xf0, 0x4d, 0x59, 0xf0, 0x5d, 0xb8, 0x33, 0x62, 0x6a, 0x66, - 0xce, 0xbf, 0x4e, 0xc0, 0x9d, 0x67, 0x72, 0x57, 0x69, 0x3b, 0xd1, 0x63, 0x48, 0x91, 0x61, 0xf4, - 0x96, 0xb4, 0x02, 0x16, 0x40, 0xbd, 0xd6, 0x63, 0xc7, 0x6a, 0xc7, 0xf1, 0x9f, 0xe0, 0x3a, 0xbc, - 0xc6, 0xcc, 0xef, 0x45, 0x48, 0xe6, 0xf7, 0xd1, 0xe4, 0xb2, 0x8e, 0xca, 0x03, 0x4f, 0xfc, 0x0e, - 0xe6, 0xc3, 0xc9, 0xf9, 0x8e, 0xd0, 0x82, 0x2b, 0x5b, 0xf1, 0x77, 0x99, 0xaa, 0xfd, 0x7d, 0x02, - 0x84, 0x51, 0xab, 0x67, 0x3e, 0x44, 0x84, 0xf9, 0x96, 0xa6, 0x9e, 0x29, 0x7a, 0x0f, 0xb7, 0x59, - 0xca, 0xf1, 0xfe, 0x24, 0x9b, 0xc7, 0x1c, 0x48, 0xc9, 0xa6, 0x15, 0x87, 0x6c, 0x50, 0x0e, 0x66, - 0x7b, 0xd8, 0x30, 0xe4, 0x8e, 0x2d, 0x96, 0xfd, 0xc9, 0xff, 0x32, 0x0e, 0xf3, 0x0e, 0x09, 0x52, - 0x03, 0x1a, 0x4c, 0xdd, 0xd7, 0xc1, 0xeb, 0x08, 0xf0, 0xfa, 0xca, 0x1c, 0x7b, 0x0d, 0x65, 0x6e, - 0x7b, 0x94, 0x99, 0x9a, 0xc3, 0xfe, 0x6b, 0x89, 0x3d, 0x42, 0xaf, 0xbf, 0x73, 0x05, 0x14, 0x7e, - 0x07, 0x50, 0x55, 0x31, 0x58, 0xea, 0xe6, 0xb8, 0x25, 0x2b, 0x53, 0x93, 0x2f, 0x24, 0xac, 0x9a, - 0xba, 0xc2, 0xc2, 0xf5, 0xa4, 0x08, 0x3d, 0xf9, 0xa2, 0x4c, 0x21, 0x56, 0x48, 0x6f, 0x98, 0xb2, - 0x6e, 0x2a, 0x6a, 0x47, 0x32, 0xb5, 0x2f, 0xb1, 0x53, 0xe9, 0xb5, 0xa1, 0x4d, 0x0b, 0x28, 0xfc, - 0x77, 0x0c, 0xb2, 0x1e, 0xf6, 0x4c, 0x27, 0x3f, 0x86, 0xd9, 0x21, 0x6f, 0x4f, 0x18, 0x1f, 0x82, - 0x9d, 0xa7, 0xdb, 0x66, 0x53, 0xa0, 0x4d, 0x00, 0x15, 0x5f, 0x98, 0x9e, 0x79, 0xe7, 0x2d, 0x08, - 0x99, 0x93, 0xff, 0x23, 0xce, 0xc9, 0xf4, 0x4d, 0xd9, 0x1c, 0x90, 0xac, 0x92, 0xb9, 0x68, 0xdc, - 0x96, 0xd8, 0x1d, 0x43, 0xe7, 0x9d, 0x17, 0x33, 0xce, 0x48, 0x8d, 0xdc, 0x36, 0x06, 0x3a, 0x70, - 0x8a, 0xa8, 0x2d, 0x4d, 0x6d, 0x2b, 0xe6, 0xb0, 0x88, 0x7a, 0x33, 0x90, 0x20, 0xd0, 0xe1, 0xa2, - 0x95, 0x57, 0xd9, 0x65, 0x53, 0x07, 0xca, 0x7f, 0x05, 0x49, 0x7a, 0x1c, 0x13, 0x16, 0x0b, 0xd0, - 0xa7, 0x90, 0x32, 0x88, 0xc4, 0xfe, 0xc2, 0x48, 0xd8, 0x9e, 0xb8, 0x57, 0x28, 0x32, 0x3a, 0xe1, - 0x87, 0xc0, 0x0f, 0x2f, 0xa6, 0x03, 0x6c, 0x4e, 0x7e, 0xfd, 0xee, 0x59, 0x6b, 0x10, 0x7e, 0x16, - 0x83, 0xf5, 0x50, 0x06, 0xd3, 0x95, 0x3d, 0xd0, 0xa1, 0x6f, 0x25, 0xdf, 0x0f, 0xde, 0xd8, 0x01, - 0xe6, 0xa1, 0x2b, 0xe2, 0x7f, 0xff, 0x6a, 0x87, 0x59, 0x9c, 0xfa, 0x30, 0x03, 0xe7, 0x48, 0x77, - 0xe6, 0x97, 0x31, 0x40, 0x07, 0xd8, 0x74, 0x52, 0x65, 0xb6, 0xa5, 0x11, 0xfe, 0x86, 0x7b, 0x0d, - 0x7f, 0xf3, 0x63, 0x8f, 0xbf, 0xa1, 0x1e, 0xeb, 0xbe, 0xab, 0x2d, 0xe2, 0x9b, 0x7a, 0xe4, 0x6d, - 0x19, 0x91, 0x9e, 0xd2, 0x98, 0x7f, 0xb2, 0xf4, 0xf4, 0x8a, 0x6e, 0xe5, 0x3f, 0x39, 0xc8, 0x7a, - 0x84, 0x66, 0x1a, 0xf4, 0x10, 0x90, 0x7c, 0x2e, 0x2b, 0x5d, 0xd9, 0x12, 0xcc, 0x4e, 0xff, 0x59, - 0x39, 0x60, 0xd9, 0x19, 0xb1, 0xc9, 0xd0, 0x53, 0xc8, 0xf6, 0xe4, 0x0b, 0xa5, 0x37, 0xe8, 0x49, - 0x6c, 0x9f, 0x0d, 0xe5, 0xa7, 0x76, 0xe1, 0x70, 0x3d, 0x50, 0x40, 0xaf, 0xa8, 0xe6, 0x87, 0xef, - 0xd3, 0x0a, 0xfa, 0x32, 0xa3, 0x63, 0xca, 0xa3, 0xfc, 0x14, 0xa3, 0x63, 0xc8, 0xf6, 0x14, 0x35, - 0xc0, 0x2c, 0x3e, 0x96, 0x19, 0x35, 0xf0, 0x65, 0x46, 0x3c, 0xe4, 0x28, 0x08, 0xee, 0xa0, 0x97, - 0x2d, 0xd7, 0xdf, 0x46, 0xea, 0xba, 0x83, 0xc5, 0x00, 0x0e, 0xdb, 0x96, 0x83, 0xd0, 0x56, 0xd2, - 0xdd, 0xa0, 0xd9, 0xb0, 0xbe, 0x4a, 0x64, 0x57, 0xe9, 0xff, 0xe2, 0x6e, 0x0b, 0x0e, 0x60, 0xa3, - 0x8f, 0x21, 0xae, 0xf7, 0x5b, 0xcc, 0x7c, 0xbf, 0x37, 0x01, 0xff, 0xbc, 0x78, 0x5c, 0x3a, 0x9c, - 0x11, 0x2d, 0x2a, 0xfe, 0xcf, 0xe2, 0x10, 0x17, 0x8f, 0x4b, 0xe8, 0x53, 0x4f, 0x8b, 0xe5, 0xc1, - 0x84, 0x5c, 0xdc, 0x1d, 0x96, 0x7f, 0x89, 0x85, 0xb5, 0x58, 0x72, 0xb0, 0x52, 0x12, 0xcb, 0x85, - 0x66, 0x59, 0xda, 0x2f, 0x57, 0xcb, 0xcd, 0xb2, 0x44, 0x5b, 0x40, 0x19, 0x0e, 0x6d, 0x40, 0xee, - 0xf8, 0xa4, 0x58, 0xad, 0x34, 0x0e, 0xa5, 0x93, 0x9a, 0xfd, 0x8b, 0x8d, 0xc6, 0x50, 0x06, 0x16, - 0xaa, 0x95, 0x46, 0x93, 0x01, 0x1a, 0x99, 0xb8, 0x05, 0x39, 0x28, 0x37, 0xa5, 0x52, 0xe1, 0xb8, - 0x50, 0xaa, 0x34, 0x5f, 0x64, 0x12, 0x88, 0x87, 0x35, 0x2f, 0xef, 0x46, 0xad, 0x70, 0xdc, 0x38, - 0xac, 0x37, 0x33, 0x49, 0x84, 0x60, 0x89, 0xd0, 0xdb, 0xa0, 0x46, 0x26, 0x65, 0x71, 0x28, 0x55, - 0xeb, 0x35, 0x47, 0x86, 0x59, 0xb4, 0x02, 0x19, 0x7b, 0x66, 0xb1, 0x5c, 0xd8, 0x27, 0x05, 0xbd, - 0x39, 0xb4, 0x0c, 0x8b, 0xe5, 0x9f, 0x1c, 0x17, 0x6a, 0xfb, 0x36, 0xe2, 0x3c, 0xda, 0x86, 0x0d, - 0xb7, 0x38, 0x12, 0xa3, 0x2a, 0xef, 0x93, 0xa2, 0x5c, 0x23, 0x03, 0xe8, 0x16, 0x64, 0x58, 0x77, - 0xab, 0x54, 0xaf, 0xed, 0x57, 0x9a, 0x95, 0x7a, 0x2d, 0x93, 0xa6, 0x15, 0xbc, 0x2c, 0x80, 0x25, - 0x39, 0x63, 0xb6, 0x30, 0xbe, 0xac, 0xb7, 0x48, 0xcb, 0x7a, 0x76, 0xc5, 0xfa, 0x9b, 0x18, 0xac, - 0xd2, 0x92, 0xb5, 0x5d, 0x20, 0xb7, 0x7d, 0xd5, 0x0e, 0x64, 0x68, 0xbd, 0x4b, 0xf2, 0xdf, 0x02, - 0x4b, 0x14, 0xfe, 0xcc, 0xce, 0x3b, 0xec, 0xf6, 0x52, 0xcc, 0xd5, 0x5e, 0xaa, 0xf8, 0xb3, 0xb0, - 0xfb, 0xde, 0x46, 0x8c, 0x6f, 0xb6, 0x51, 0x89, 0xfd, 0x51, 0x48, 0x9a, 0xf0, 0x70, 0x34, 0xb7, - 0x51, 0x21, 0xd4, 0x55, 0xb2, 0xf8, 0x2b, 0x7a, 0xb9, 0x27, 0xb0, 0xe6, 0x97, 0x97, 0x19, 0xf4, - 0x83, 0x40, 0xbb, 0xc4, 0x71, 0xbb, 0x0e, 0xae, 0x83, 0x21, 0xfc, 0x1b, 0x07, 0x73, 0x36, 0xd8, - 0x0a, 0x6f, 0x2c, 0xbf, 0xe4, 0xa9, 0x94, 0xce, 0x5b, 0x10, 0xa7, 0xf0, 0xea, 0x6e, 0x74, 0xc4, - 0xfc, 0x8d, 0x8e, 0xd0, 0x73, 0x8e, 0x87, 0x9e, 0xf3, 0x8f, 0x60, 0xb1, 0x65, 0x89, 0xaf, 0x68, - 0xaa, 0x64, 0x2a, 0x3d, 0xbb, 0x10, 0x1a, 0x6c, 0x4c, 0x36, 0xed, 0xd7, 0x04, 0xe2, 0x82, 0x4d, - 0x60, 0x81, 0xd0, 0x36, 0x2c, 0x90, 0x46, 0xa5, 0x64, 0x6a, 0xd2, 0xc0, 0xc0, 0xb9, 0x24, 0x29, - 0x0b, 0x01, 0x81, 0x35, 0xb5, 0x13, 0x03, 0x0b, 0x7f, 0xc7, 0xc1, 0x2a, 0xad, 0x76, 0xf9, 0xd5, - 0x71, 0x5c, 0xc3, 0xc6, 0xad, 0x71, 0xbe, 0xdb, 0x30, 0x94, 0xe1, 0x9b, 0x4a, 0xf6, 0x73, 0xb0, - 0xe6, 0x9f, 0x8f, 0x65, 0xf8, 0xbf, 0x8a, 0xc1, 0x8a, 0x15, 0x9a, 0xd9, 0x03, 0xd7, 0x1d, 0x3d, - 0x4f, 0x71, 0x92, 0xbe, 0xcd, 0x4c, 0x04, 0x36, 0xf3, 0xd0, 0x9f, 0x3f, 0xbf, 0xe3, 0x0e, 0x2e, - 0xfd, 0x2b, 0x78, 0x53, 0x7b, 0xf9, 0x0b, 0x0e, 0x56, 0x7d, 0xf3, 0x31, 0x7b, 0xf9, 0xc4, 0x9f, - 0x10, 0xdc, 0x8d, 0x90, 0xef, 0xb5, 0x52, 0x82, 0x0f, 0xec, 0x50, 0x7c, 0x3a, 0xb3, 0xfc, 0xd7, - 0x18, 0x6c, 0x0e, 0x2f, 0x35, 0xf2, 0x54, 0xa0, 0x3d, 0x45, 0x45, 0xeb, 0x6a, 0x1d, 0xf9, 0xcf, - 0xfc, 0x0e, 0x77, 0x37, 0x78, 0xcf, 0x86, 0x88, 0x34, 0xca, 0xf1, 0x86, 0x16, 0x82, 0x13, 0xd3, - 0x16, 0x82, 0xaf, 0xa4, 0x01, 0xbf, 0xe7, 0xae, 0x71, 0x7b, 0xc5, 0x67, 0x9a, 0x30, 0x61, 0xb3, - 0xe8, 0x43, 0xb8, 0x49, 0xa2, 0x7f, 0xe7, 0xa5, 0x8b, 0xdd, 0x7f, 0xa7, 0x2e, 0x71, 0x4e, 0x5c, - 0xb5, 0x86, 0x9d, 0xe7, 0x1d, 0xac, 0x41, 0xd2, 0x16, 0xbe, 0x4d, 0xc0, 0x9a, 0x95, 0x1d, 0x34, - 0x4c, 0xb9, 0x33, 0x4d, 0xeb, 0xe0, 0xb7, 0x83, 0x95, 0xd8, 0x98, 0xf7, 0x58, 0xc2, 0xb9, 0x4e, - 0x52, 0x80, 0x45, 0x79, 0xc8, 0x1a, 0xa6, 0xdc, 0x21, 0xee, 0x40, 0xd6, 0x3b, 0xd8, 0x94, 0xfa, - 0xb2, 0xf9, 0x8a, 0xd9, 0xfa, 0x32, 0x1b, 0x6a, 0x92, 0x91, 0x63, 0xd9, 0x7c, 0x75, 0x4d, 0x07, - 0x89, 0x7e, 0xec, 0x77, 0x0a, 0xef, 0x8e, 0x59, 0xcb, 0x08, 0xdd, 0xfa, 0x49, 0x44, 0xb5, 0xfe, - 0xbd, 0x31, 0x2c, 0xc7, 0x57, 0xe9, 0xaf, 0x5e, 0x9d, 0xfe, 0x8e, 0x0b, 0xfd, 0xb7, 0xe0, 0x66, - 0x60, 0xf1, 0xec, 0x0a, 0xe9, 0x40, 0xce, 0x1a, 0x3a, 0x51, 0x8d, 0x29, 0xd5, 0x31, 0x42, 0x63, - 0x62, 0x11, 0x1a, 0x23, 0xac, 0xc3, 0xad, 0x90, 0x89, 0x98, 0x14, 0x7f, 0x93, 0xa4, 0x62, 0x4c, - 0xdf, 0x73, 0xfa, 0x3c, 0xca, 0x2a, 0xde, 0x77, 0x1f, 0x7b, 0x68, 0x7b, 0xe6, 0x4d, 0xd8, 0xc5, - 0x16, 0xa4, 0xdd, 0x78, 0xec, 0x1a, 0x34, 0xc7, 0x18, 0x4e, 0xf2, 0x4a, 0xad, 0xb0, 0x94, 0xaf, - 0x15, 0x56, 0x1d, 0x1a, 0xd5, 0xac, 0x37, 0xb4, 0x8d, 0xdc, 0x8a, 0x11, 0x66, 0xf5, 0x32, 0x60, - 0x56, 0x73, 0xde, 0xfe, 0x5a, 0x24, 0xd3, 0xdf, 0x00, 0xc3, 0x62, 0x4a, 0x1d, 0xda, 0xf8, 0x12, - 0x5e, 0x02, 0x4f, 0x35, 0x7e, 0xfa, 0x56, 0x94, 0x4f, 0x8d, 0x62, 0x7e, 0x35, 0x12, 0x36, 0x61, - 0x3d, 0x94, 0x37, 0x9b, 0xfa, 0x8f, 0x39, 0x2a, 0x98, 0x53, 0xe3, 0x6a, 0x98, 0xb2, 0x69, 0x4c, - 0x3a, 0x35, 0x1b, 0x74, 0x4f, 0x4d, 0x41, 0x44, 0x83, 0xa7, 0x34, 0x09, 0xe1, 0x4f, 0x39, 0xba, - 0x0f, 0x7e, 0x59, 0xd8, 0x6d, 0xfb, 0x0e, 0x24, 0x07, 0xa4, 0x8c, 0x4f, 0xa3, 0xae, 0xac, 0xd7, - 0x08, 0x4e, 0xac, 0x21, 0x91, 0x62, 0x5c, 0x5b, 0x61, 0x54, 0xf8, 0x15, 0x07, 0x69, 0x17, 0x7f, - 0xb4, 0x01, 0xf3, 0x4e, 0xe5, 0xc7, 0xce, 0x77, 0x1c, 0x80, 0x75, 0xfc, 0xa6, 0x66, 0xca, 0x5d, - 0xf6, 0xc4, 0x84, 0x7e, 0x58, 0x29, 0xea, 0xc0, 0xc0, 0x34, 0x1c, 0x8e, 0x8b, 0xe4, 0x37, 0x7a, - 0x00, 0x89, 0x81, 0xaa, 0x98, 0xc4, 0xec, 0x97, 0xfc, 0xf6, 0x4c, 0xa6, 0xca, 0x9f, 0xa8, 0x8a, - 0x29, 0x12, 0x2c, 0xe1, 0x3e, 0x24, 0xac, 0x2f, 0x6f, 0x05, 0x62, 0x1e, 0x92, 0xc5, 0x17, 0xcd, - 0x72, 0x23, 0xc3, 0x21, 0x80, 0x54, 0x85, 0xe6, 0xeb, 0x31, 0xa1, 0x6a, 0x3f, 0x33, 0x75, 0x16, - 0x61, 0xb9, 0x00, 0xf9, 0x54, 0xd5, 0xf4, 0x9e, 0xdc, 0x25, 0x32, 0xcf, 0x89, 0xce, 0x77, 0x74, - 0x77, 0x84, 0xd6, 0x12, 0x37, 0x9c, 0x13, 0x09, 0xab, 0x17, 0x7d, 0x41, 0x75, 0x2b, 0xaa, 0x52, - 0x54, 0x08, 0xad, 0x14, 0x6d, 0x7a, 0x6e, 0xd9, 0x31, 0x35, 0xa2, 0x7f, 0x88, 0xc1, 0x6a, 0x28, - 0x1e, 0xfa, 0xc0, 0x5d, 0x1d, 0xba, 0x33, 0x92, 0xa7, 0xbb, 0x2e, 0xf4, 0x2d, 0x47, 0xeb, 0x42, - 0x7b, 0x9e, 0xba, 0xd0, 0xdb, 0x63, 0xe9, 0xdd, 0x15, 0xa1, 0x5f, 0x70, 0x11, 0x15, 0xa1, 0x46, - 0xb3, 0x70, 0x50, 0x96, 0x4e, 0x6a, 0xf4, 0xaf, 0x53, 0x11, 0x5a, 0x81, 0xcc, 0xb0, 0x4e, 0x22, - 0x35, 0x9a, 0x85, 0x66, 0x23, 0x13, 0x0b, 0x56, 0x63, 0xe2, 0xa1, 0xb5, 0x96, 0xc4, 0xf8, 0xb2, - 0x4a, 0x92, 0xa2, 0xac, 0x01, 0x62, 0xd4, 0x47, 0xf5, 0x93, 0x5a, 0x53, 0x3a, 0x10, 0xeb, 0x27, - 0xc7, 0x99, 0x94, 0x53, 0x6e, 0x59, 0x01, 0xc4, 0x4e, 0xcb, 0xfd, 0x6a, 0xfe, 0x2f, 0x38, 0xc8, - 0x7a, 0xc0, 0xec, 0xf0, 0x5c, 0x3d, 0x6e, 0xce, 0xd3, 0xe3, 0x7e, 0x04, 0x2b, 0x56, 0xc6, 0x48, - 0x2d, 0xc5, 0x90, 0xfa, 0x58, 0x27, 0xb5, 0x6d, 0xa6, 0xf3, 0xcb, 0x3d, 0xf9, 0x82, 0xd5, 0xff, - 0x8f, 0xb1, 0x6e, 0x31, 0xbe, 0x86, 0x0a, 0xaf, 0xf0, 0x75, 0x9c, 0xc6, 0x25, 0x53, 0xe7, 0x35, - 0x63, 0x7d, 0x54, 0x30, 0xf1, 0x89, 0x4f, 0x91, 0xf8, 0x44, 0x78, 0xb8, 0xc4, 0x54, 0xc1, 0xf0, - 0xf4, 0x77, 0x7a, 0x6d, 0x78, 0x6f, 0xd3, 0xc8, 0xf5, 0x81, 0x5b, 0x7f, 0xc7, 0x66, 0x5a, 0xa9, - 0xaf, 0x8b, 0xdc, 0xcf, 0xaf, 0x2b, 0x4f, 0x2e, 0xd0, 0x78, 0xec, 0x0a, 0xf9, 0xd1, 0xee, 0xff, - 0x72, 0x30, 0x57, 0x69, 0x63, 0xd5, 0xa4, 0x6b, 0x5b, 0xf4, 0xfc, 0x63, 0x05, 0xda, 0x88, 0xf8, - 0x7f, 0x0b, 0xb2, 0x30, 0x7e, 0x73, 0xe4, 0x7f, 0x63, 0x08, 0x33, 0xe8, 0xcc, 0xf5, 0x4f, 0x21, - 0x9e, 0x26, 0xc6, 0x5b, 0x01, 0xca, 0x10, 0x17, 0xc7, 0xdf, 0x1b, 0x83, 0xe5, 0xcc, 0xf3, 0x21, - 0x24, 0xc9, 0x13, 0x7a, 0xb4, 0xe2, 0x3c, 0xe3, 0x77, 0xbd, 0xb0, 0xe7, 0x57, 0x7d, 0x50, 0x9b, - 0x6e, 0xf7, 0x9f, 0xe6, 0x01, 0x86, 0x69, 0x26, 0x7a, 0x0a, 0x0b, 0xee, 0x57, 0xbc, 0x68, 0x7d, - 0xc4, 0x1b, 0x72, 0x7e, 0x23, 0x7c, 0xd0, 0x91, 0xe9, 0x29, 0x2c, 0xb8, 0x9f, 0x6f, 0x0d, 0x99, - 0x85, 0x3c, 0x21, 0x1b, 0x32, 0x0b, 0x7d, 0xf1, 0x35, 0x83, 0xba, 0x70, 0x33, 0xe2, 0x01, 0x0f, - 0x7a, 0x7b, 0xb2, 0x67, 0x4e, 0xfc, 0xf7, 0x26, 0x7c, 0x09, 0x24, 0xcc, 0x20, 0x1d, 0x6e, 0x45, - 0xbe, 0x5b, 0x41, 0x3b, 0x93, 0xbe, 0xaa, 0xe1, 0xdf, 0x99, 0x00, 0xd3, 0x99, 0x73, 0x00, 0x7c, - 0x74, 0xb3, 0x1c, 0xbd, 0x33, 0xf1, 0x2b, 0x0e, 0xfe, 0xfe, 0xe4, 0xbd, 0x77, 0x61, 0x06, 0x1d, - 0x42, 0xda, 0xd5, 0x35, 0x45, 0x7c, 0x68, 0x2b, 0x95, 0x32, 0x5e, 0x1f, 0xd1, 0x66, 0xa5, 0x9c, - 0x5c, 0x8d, 0xac, 0x21, 0xa7, 0x60, 0x4b, 0x6e, 0xc8, 0x29, 0xa4, 0xf3, 0xe5, 0xdf, 0x7e, 0xdf, - 0xfd, 0x1e, 0xb6, 0xfd, 0xe1, 0x01, 0x42, 0xd8, 0xf6, 0x47, 0x04, 0x0b, 0xc2, 0x0c, 0xfa, 0x0c, - 0x96, 0xbc, 0x15, 0x6a, 0xb4, 0x39, 0xb2, 0xd2, 0xce, 0xdf, 0x8e, 0x1a, 0x76, 0xb3, 0xf4, 0x16, - 0x44, 0x87, 0x2c, 0x43, 0x0b, 0xb3, 0x43, 0x96, 0x11, 0x75, 0xd4, 0x19, 0xcb, 0x3f, 0x79, 0xca, - 0x7c, 0x43, 0xff, 0x14, 0x56, 0x9d, 0x1c, 0xfa, 0xa7, 0xd0, 0xda, 0xa0, 0x30, 0x83, 0x14, 0x58, - 0x0b, 0xaf, 0x32, 0xa1, 0x7b, 0x13, 0x15, 0xd1, 0xf8, 0xb7, 0xc7, 0xa1, 0x39, 0x53, 0xb5, 0x20, - 0x1b, 0xd2, 0xd4, 0x46, 0xc2, 0xc8, 0x8e, 0x37, 0x9d, 0xe4, 0xee, 0x04, 0x5d, 0x71, 0xc1, 0x8a, - 0x42, 0x76, 0xff, 0x23, 0x09, 0x09, 0x72, 0xed, 0x37, 0xe1, 0x86, 0xaf, 0x94, 0x80, 0x6e, 0x8f, - 0x2e, 0xb0, 0xf0, 0x5b, 0x91, 0xe3, 0xce, 0x1a, 0x5e, 0xc2, 0x72, 0xa0, 0x38, 0x80, 0xb6, 0xdd, - 0x74, 0x61, 0x05, 0x0a, 0xfe, 0xce, 0x08, 0x0c, 0x3f, 0x6f, 0xaf, 0x6f, 0xdb, 0x1e, 0x97, 0xbd, - 0x7a, 0x79, 0x47, 0xf9, 0xb3, 0x2f, 0x68, 0x94, 0xe5, 0xf7, 0x64, 0x82, 0x57, 0xae, 0x50, 0x1f, - 0x76, 0x77, 0x24, 0x8e, 0x33, 0xc3, 0xe7, 0x4e, 0x78, 0xe7, 0x4a, 0x9e, 0x90, 0x47, 0xb8, 0xd0, - 0x24, 0x8f, 0x17, 0x46, 0xa1, 0x38, 0xec, 0x9f, 0x43, 0xc6, 0x7f, 0xcf, 0xa3, 0xad, 0x31, 0x61, - 0x07, 0xbf, 0x1d, 0x8d, 0xe0, 0xdf, 0x19, 0xbf, 0x93, 0xf1, 0x4b, 0x15, 0xe6, 0x5e, 0xee, 0x8e, - 0xc4, 0x71, 0xbb, 0x45, 0x57, 0x84, 0x3b, 0x74, 0x8b, 0xc1, 0x68, 0x78, 0xe8, 0x16, 0x43, 0x42, - 0x62, 0x61, 0x66, 0xef, 0x31, 0x80, 0xdc, 0xed, 0xbf, 0x92, 0x25, 0xac, 0x0e, 0x7a, 0x68, 0x23, - 0xd0, 0x7c, 0x2a, 0xab, 0x83, 0x5e, 0xbd, 0x6f, 0x25, 0x5d, 0x46, 0xee, 0xaf, 0xe6, 0x48, 0xaa, - 0x35, 0x4f, 0x08, 0xac, 0x81, 0xbd, 0x2a, 0x64, 0x86, 0xd4, 0x12, 0x09, 0xa1, 0xd0, 0x9d, 0x50, - 0x1e, 0xa4, 0x95, 0xef, 0x63, 0xb4, 0xe4, 0x30, 0x22, 0xa3, 0x7b, 0x9f, 0x00, 0xb4, 0x0c, 0x45, - 0xa2, 0x31, 0x1c, 0xda, 0x0c, 0xf0, 0x79, 0xa2, 0xe0, 0x6e, 0xdb, 0xe6, 0xf1, 0x97, 0x4c, 0x98, - 0x96, 0xa1, 0xd0, 0x48, 0x6f, 0xef, 0x47, 0x90, 0xa6, 0xc2, 0x9c, 0x59, 0x78, 0xe3, 0xe8, 0x99, - 0x0c, 0x74, 0xf5, 0x64, 0x64, 0xaf, 0x0c, 0x8b, 0x94, 0x01, 0x4b, 0x18, 0xd1, 0x56, 0x80, 0xc5, - 0x11, 0x1d, 0xf1, 0x31, 0x59, 0x20, 0x64, 0x6c, 0x6c, 0xaf, 0x08, 0x0b, 0x36, 0x1b, 0xf3, 0x95, - 0xd6, 0x46, 0xb7, 0x43, 0xb8, 0x58, 0x03, 0x3e, 0x26, 0x69, 0xc6, 0xc4, 0x1a, 0x1a, 0x8a, 0x62, - 0xff, 0x77, 0x69, 0x50, 0x14, 0x96, 0xd4, 0x85, 0x8a, 0xc2, 0xc6, 0x8a, 0xc9, 0x97, 0xf1, 0x96, - 0xa1, 0x9c, 0xa6, 0x08, 0xd1, 0x0f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x0a, 0xad, 0x10, - 0x0a, 0x3d, 0x00, 0x00, + // 4210 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x4d, 0x6c, 0x1b, 0x49, + 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xd3, 0x8f, 0xa9, 0xd2, 0x8f, 0xe9, 0x96, 0x6c, 0x4b, 0xed, 0xb1, + 0xad, 0xf1, 0xd8, 0xf4, 0x8c, 0x77, 0x66, 0xb0, 0x23, 0x7b, 0x76, 0x4d, 0x4a, 0xb4, 0xc4, 0xb5, + 0x4c, 0x69, 0x9b, 0x94, 0xbd, 0xf6, 0x66, 0xd0, 0xd3, 0x22, 0x4b, 0x72, 0x63, 0xc8, 0x6e, 0x4e, + 0x77, 0x53, 0xb1, 0xf6, 0x92, 0x64, 0x83, 0x00, 0x9b, 0xe4, 0x12, 0x20, 0x08, 0x32, 0x39, 0x65, + 0x91, 0xe4, 0x12, 0x60, 0x17, 0x7b, 0x08, 0x16, 0x7b, 0x0c, 0x90, 0x5b, 0x02, 0x04, 0x9b, 0x63, + 0x90, 0xcb, 0x1e, 0x02, 0xe4, 0xb0, 0x98, 0x00, 0x03, 0xe4, 0x96, 0x43, 0x10, 0x74, 0x55, 0x75, + 0xb3, 0xfa, 0x97, 0xa4, 0x25, 0x67, 0x02, 0xec, 0xc9, 0xea, 0xaa, 0x57, 0xaf, 0x5e, 0x55, 0xbd, + 0xf7, 0xea, 0xbd, 0xef, 0x15, 0x0d, 0x1f, 0x1c, 0x6b, 0xf6, 0xcb, 0xde, 0x61, 0xb1, 0x69, 0x74, + 0xee, 0x36, 0x0d, 0xdd, 0x56, 0x35, 0x1d, 0x9b, 0x77, 0x2c, 0xdb, 0x30, 0xd5, 0x63, 0x7c, 0x47, + 0xd3, 0x6d, 0x6c, 0x1e, 0xa9, 0x4d, 0x7c, 0xd7, 0xea, 0xe2, 0xe6, 0xdd, 0xa6, 0xa5, 0x15, 0xbb, + 0xa6, 0x61, 0x1b, 0x28, 0xe7, 0xfc, 0x79, 0xf2, 0x9e, 0xb8, 0x7a, 0x6c, 0x18, 0xc7, 0x6d, 0x7c, + 0x97, 0xb4, 0x1e, 0xf6, 0x8e, 0xee, 0xb6, 0xb0, 0xd5, 0x34, 0xb5, 0xae, 0x6d, 0x98, 0x94, 0x52, + 0xbc, 0x1a, 0xa4, 0xb0, 0xb5, 0x0e, 0xb6, 0x6c, 0xb5, 0xd3, 0x65, 0x04, 0x57, 0x82, 0x04, 0xbf, + 0x6d, 0xaa, 0xdd, 0x2e, 0x36, 0x2d, 0xda, 0x2f, 0x2d, 0xc1, 0xc2, 0x36, 0xb6, 0xf7, 0xdb, 0xbd, + 0x63, 0x4d, 0xaf, 0xea, 0x47, 0x86, 0x8c, 0x3f, 0xef, 0x61, 0xcb, 0x96, 0xfe, 0x55, 0x80, 0xc5, + 0x40, 0x87, 0xd5, 0x35, 0x74, 0x0b, 0x23, 0x04, 0x19, 0x5d, 0xed, 0xe0, 0x82, 0xb0, 0x2a, 0xac, + 0x4f, 0xca, 0xe4, 0x6f, 0x74, 0x1d, 0x66, 0x4f, 0xb0, 0xde, 0x32, 0x4c, 0xe5, 0x04, 0x9b, 0x96, + 0x66, 0xe8, 0x85, 0x14, 0xe9, 0x9d, 0xa1, 0xad, 0x4f, 0x69, 0x23, 0xda, 0x86, 0x89, 0x8e, 0xaa, + 0x6b, 0x47, 0xd8, 0xb2, 0x0b, 0xe9, 0xd5, 0xf4, 0xfa, 0xd4, 0xbd, 0x77, 0x8a, 0x74, 0xa9, 0xc5, + 0xc8, 0xb9, 0x8a, 0x4f, 0x18, 0x75, 0x45, 0xb7, 0xcd, 0x53, 0xd9, 0x1b, 0x2c, 0xde, 0x87, 0x19, + 0x5f, 0x17, 0xca, 0x43, 0xfa, 0x33, 0x7c, 0xca, 0x64, 0x72, 0xfe, 0x44, 0x0b, 0x90, 0x3d, 0x51, + 0xdb, 0x3d, 0xcc, 0x24, 0xa1, 0x1f, 0x1b, 0xa9, 0x6f, 0x0a, 0xd2, 0x15, 0x58, 0xf1, 0x66, 0xdb, + 0x54, 0xbb, 0xea, 0xa1, 0xd6, 0xd6, 0x6c, 0x0d, 0x5b, 0xee, 0xd2, 0x3f, 0x81, 0xcb, 0x31, 0xfd, + 0x6c, 0x07, 0x1e, 0xc0, 0x74, 0x93, 0x6b, 0x2f, 0x08, 0x64, 0x29, 0x05, 0x77, 0x29, 0x81, 0x91, + 0xa7, 0xb2, 0x8f, 0x5a, 0xfa, 0x32, 0x0d, 0xf9, 0x20, 0x09, 0x7a, 0x00, 0xe3, 0x16, 0x36, 0x4f, + 0xb4, 0x26, 0xdd, 0xd7, 0xa9, 0x7b, 0xab, 0x71, 0xdc, 0x8a, 0x75, 0x4a, 0xb7, 0x33, 0x26, 0xbb, + 0x43, 0xd0, 0x01, 0xe4, 0x4f, 0x8c, 0x76, 0xaf, 0x83, 0x15, 0xfc, 0xaa, 0xab, 0xea, 0xde, 0x01, + 0x4c, 0xdd, 0x5b, 0x8f, 0x65, 0xf3, 0x94, 0x0c, 0xa8, 0xb8, 0xf4, 0x3b, 0x63, 0xf2, 0x85, 0x13, + 0x7f, 0x93, 0xf8, 0x73, 0x01, 0xc6, 0xd9, 0x6c, 0xe8, 0x23, 0xc8, 0xd8, 0xa7, 0x5d, 0x2a, 0xdd, + 0xec, 0xbd, 0xeb, 0x83, 0xa4, 0x2b, 0x36, 0x4e, 0xbb, 0x58, 0x26, 0x43, 0x24, 0x03, 0x32, 0xce, + 0x17, 0x9a, 0x82, 0xf1, 0x83, 0xda, 0xe3, 0xda, 0xde, 0xb3, 0x5a, 0x7e, 0x0c, 0x2d, 0x01, 0xda, + 0xdc, 0xab, 0x35, 0xe4, 0xbd, 0xdd, 0xdd, 0x8a, 0xac, 0xd4, 0x2b, 0xf2, 0xd3, 0xea, 0x66, 0x25, + 0x2f, 0xa0, 0xb7, 0x60, 0xf5, 0xe9, 0xde, 0xee, 0xc1, 0x93, 0x8a, 0x52, 0xda, 0xdc, 0xac, 0xd4, + 0xeb, 0xd5, 0x72, 0x75, 0xb7, 0xda, 0x78, 0xae, 0x6c, 0xee, 0xd5, 0xea, 0x0d, 0xb9, 0x54, 0xad, + 0x35, 0xea, 0xf9, 0x14, 0x5a, 0x81, 0xc2, 0xb6, 0xbc, 0x77, 0xb0, 0xaf, 0x44, 0xf0, 0x48, 0x8b, + 0x3f, 0x14, 0xe0, 0x42, 0x60, 0x79, 0xa8, 0xe4, 0x93, 0xff, 0xce, 0xb0, 0xdb, 0xc2, 0xaf, 0xe3, + 0x76, 0xd4, 0x3a, 0x00, 0x72, 0x7b, 0xb5, 0xdd, 0x6a, 0xcd, 0x91, 0x7d, 0x0a, 0xc6, 0xf7, 0x1e, + 0x3d, 0x22, 0x1f, 0xa9, 0x72, 0x8e, 0x4e, 0x28, 0xcd, 0xc2, 0xf4, 0xbe, 0x69, 0x1c, 0x62, 0x57, + 0xbb, 0x4a, 0x30, 0xc3, 0xbe, 0x99, 0x36, 0xbd, 0x0b, 0x59, 0x13, 0xab, 0xad, 0x53, 0x76, 0xf0, + 0x62, 0x91, 0x5a, 0x6c, 0xd1, 0xb5, 0xd8, 0x62, 0xd9, 0x30, 0xda, 0x4f, 0x1d, 0xed, 0x95, 0x29, + 0xa1, 0xf4, 0x55, 0x06, 0xe6, 0x37, 0x4d, 0xac, 0xda, 0x98, 0x4a, 0xcb, 0x58, 0x47, 0x5a, 0xe6, + 0x03, 0x98, 0x75, 0xb4, 0xaf, 0xa9, 0xd9, 0xa7, 0x8a, 0xa9, 0xea, 0xc7, 0x98, 0x29, 0xc6, 0xa2, + 0xbb, 0x03, 0x9b, 0xac, 0x57, 0x76, 0x3a, 0xe5, 0x99, 0x26, 0xff, 0x89, 0xaa, 0x30, 0xcf, 0x14, + 0xcb, 0xa7, 0xf0, 0x69, 0xbf, 0xc2, 0x53, 0x29, 0x38, 0x85, 0x47, 0x27, 0xfe, 0x16, 0x0d, 0x5b, + 0xe8, 0x31, 0x40, 0x57, 0x35, 0xd5, 0x0e, 0xb6, 0xb1, 0x69, 0x15, 0x32, 0x7e, 0xeb, 0x8f, 0x58, + 0x4d, 0x71, 0xdf, 0xa3, 0xa6, 0xd6, 0xcf, 0x0d, 0x47, 0xdb, 0x8e, 0xb9, 0x34, 0x4d, 0x6c, 0x5b, + 0x85, 0x2c, 0xe1, 0xb4, 0x9e, 0xc4, 0xa9, 0x4e, 0x49, 0x09, 0x9b, 0x72, 0xfa, 0x8b, 0xb2, 0x20, + 0xbb, 0xa3, 0xd1, 0x1e, 0x2c, 0xba, 0x0b, 0x34, 0x74, 0x1b, 0xeb, 0xb6, 0x62, 0x19, 0x3d, 0xb3, + 0x89, 0x0b, 0x39, 0xb2, 0x4b, 0xcb, 0x81, 0x25, 0x52, 0x9a, 0x3a, 0x21, 0x91, 0xd9, 0xd6, 0xf8, + 0x1a, 0xd1, 0x0b, 0x10, 0xd5, 0x66, 0x13, 0x5b, 0x96, 0x46, 0xf7, 0x42, 0x31, 0xf1, 0xe7, 0x3d, + 0xcd, 0xc4, 0x1d, 0xac, 0xdb, 0x56, 0x61, 0xdc, 0xcf, 0xb5, 0x61, 0x74, 0x8d, 0xb6, 0x71, 0x7c, + 0x2a, 0xf7, 0x69, 0xe4, 0x4b, 0xbe, 0xe1, 0x5c, 0x8f, 0x25, 0x7e, 0x0c, 0x17, 0x02, 0x9b, 0x32, + 0x8a, 0xdf, 0x13, 0x37, 0x60, 0x9a, 0xdf, 0x89, 0x91, 0x7c, 0xe6, 0x1f, 0xa7, 0x60, 0x3e, 0x62, + 0x0f, 0xd0, 0x0e, 0x4c, 0x58, 0xba, 0xda, 0xb5, 0x5e, 0x1a, 0x36, 0xd3, 0xdf, 0x5b, 0x09, 0x5b, + 0x56, 0xac, 0x33, 0x5a, 0xfa, 0xb9, 0x33, 0x26, 0x7b, 0xa3, 0x51, 0x19, 0x72, 0x74, 0x3f, 0x83, + 0x9e, 0x2b, 0x8a, 0x0f, 0x6d, 0xf3, 0xb8, 0xb0, 0x91, 0xe2, 0x7b, 0x30, 0xeb, 0x9f, 0x01, 0x5d, + 0x85, 0x29, 0x77, 0x06, 0x45, 0x6b, 0xb1, 0xb5, 0x82, 0xdb, 0x54, 0x6d, 0x89, 0xef, 0xc0, 0x34, + 0xcf, 0x0c, 0x2d, 0xc3, 0x24, 0x53, 0x08, 0x8f, 0x7c, 0x82, 0x36, 0x54, 0x5b, 0x9e, 0x4d, 0x7f, + 0x0b, 0x16, 0xfc, 0x7a, 0xc6, 0x4c, 0xf9, 0x86, 0xb7, 0x06, 0xba, 0x17, 0xb3, 0xfe, 0x35, 0xb8, + 0x72, 0x4a, 0x7f, 0x99, 0x85, 0x7c, 0xd0, 0x68, 0xd0, 0x03, 0xc8, 0x1e, 0xb6, 0x8d, 0xe6, 0x67, + 0x6c, 0xec, 0x5b, 0x71, 0xd6, 0x55, 0x2c, 0x3b, 0x54, 0xb4, 0x75, 0x67, 0x4c, 0xa6, 0x83, 0x9c, + 0xd1, 0x1d, 0xa3, 0xa7, 0xdb, 0x6c, 0xf7, 0xe2, 0x47, 0x3f, 0x71, 0xa8, 0xfa, 0xa3, 0xc9, 0x20, + 0xb4, 0x05, 0x53, 0x54, 0xed, 0x94, 0x8e, 0xd1, 0xc2, 0x85, 0x34, 0xe1, 0x71, 0x2d, 0x96, 0x47, + 0x89, 0xd0, 0x3e, 0x31, 0x5a, 0x58, 0x06, 0xd5, 0xfb, 0x5b, 0x9c, 0x81, 0x29, 0x4e, 0x36, 0xb1, + 0x07, 0x53, 0xdc, 0x64, 0xe8, 0x22, 0x8c, 0x1f, 0x59, 0x8a, 0xe7, 0x84, 0x27, 0xe5, 0xdc, 0x91, + 0x45, 0xfc, 0xe9, 0x55, 0x98, 0x22, 0x52, 0x28, 0x47, 0x6d, 0xf5, 0xd8, 0x2a, 0xa4, 0x56, 0xd3, + 0xce, 0x19, 0x91, 0xa6, 0x47, 0x4e, 0x0b, 0xba, 0x0d, 0xcc, 0xa1, 0x28, 0x94, 0xee, 0xd8, 0x34, + 0x7a, 0x5d, 0x22, 0xe4, 0xa4, 0xcc, 0x2e, 0x3e, 0x32, 0xd1, 0xb6, 0xd3, 0x2e, 0xfe, 0x5d, 0x0a, + 0xa0, 0x2f, 0x20, 0x7a, 0x00, 0x19, 0xb2, 0x26, 0xea, 0xf8, 0xd7, 0x87, 0x58, 0x53, 0x91, 0x2c, + 0x8c, 0x8c, 0x92, 0xfe, 0x43, 0x80, 0x0c, 0x61, 0x13, 0xbc, 0xbc, 0xea, 0xd5, 0xda, 0xf6, 0x6e, + 0x45, 0xa9, 0xed, 0x6d, 0x55, 0x94, 0x67, 0x72, 0xb5, 0x51, 0x91, 0xf3, 0x02, 0x5a, 0x86, 0x8b, + 0x7c, 0xbb, 0x5c, 0x29, 0x6d, 0x55, 0x64, 0x65, 0xaf, 0xb6, 0xfb, 0x3c, 0x9f, 0x42, 0x22, 0x2c, + 0x3d, 0x39, 0xd8, 0x6d, 0x54, 0xc3, 0x7d, 0x69, 0xe7, 0x3e, 0xe3, 0xfa, 0x18, 0x0f, 0xc6, 0x36, + 0xe3, 0xb0, 0xe5, 0x7a, 0xe9, 0x9f, 0xac, 0x33, 0x8b, 0x24, 0xb8, 0xc4, 0xcf, 0xe9, 0x1f, 0x9b, + 0x13, 0xd3, 0x3f, 0x2e, 0x0b, 0x68, 0x0d, 0x0a, 0x3c, 0x8d, 0x8f, 0xc3, 0x38, 0x21, 0x29, 0xcf, + 0x78, 0x1a, 0x40, 0x34, 0xfc, 0x19, 0xcc, 0xf8, 0x2e, 0x06, 0x27, 0xc2, 0x63, 0x9e, 0xac, 0xa5, + 0x1c, 0x9e, 0xda, 0x24, 0xea, 0x11, 0xd6, 0xd3, 0xf2, 0x8c, 0xdb, 0x5a, 0x76, 0x1a, 0x9d, 0xb3, + 0x6c, 0x6b, 0x1d, 0xcd, 0x66, 0x34, 0x29, 0x42, 0x03, 0xa4, 0x89, 0x10, 0x48, 0xbf, 0x4a, 0x41, + 0x8e, 0x29, 0xc4, 0x75, 0xee, 0x6a, 0xf2, 0xb1, 0x74, 0x5b, 0x29, 0x4b, 0x9f, 0x45, 0xa6, 0xfc, + 0x16, 0x89, 0x76, 0x60, 0x96, 0xf7, 0xdf, 0xaf, 0xdc, 0xb8, 0x72, 0xcd, 0x7f, 0xce, 0xbc, 0x13, + 0x79, 0xc5, 0xa2, 0xc9, 0x99, 0x13, 0xbe, 0x0d, 0x95, 0x61, 0x36, 0x70, 0x05, 0x64, 0x06, 0x5f, + 0x01, 0x33, 0x4d, 0x9f, 0x37, 0x2c, 0xc1, 0xbc, 0xeb, 0xbd, 0xdb, 0x58, 0xb1, 0x99, 0x77, 0x67, + 0x57, 0x54, 0x3e, 0xe4, 0xf5, 0x51, 0x9f, 0xd8, 0x6d, 0x13, 0x1f, 0x02, 0x0a, 0xcb, 0x3a, 0x92, + 0xab, 0xee, 0xc1, 0x7c, 0xc4, 0xbd, 0x82, 0x8a, 0x30, 0x49, 0x8e, 0xca, 0xd2, 0x6c, 0xcc, 0x22, + 0xd6, 0xb0, 0x44, 0x7d, 0x12, 0x87, 0xbe, 0x6b, 0xe2, 0x23, 0x6c, 0x9a, 0xb8, 0x45, 0x6c, 0x32, + 0x92, 0xde, 0x23, 0x91, 0x7e, 0x5f, 0x80, 0x09, 0xb7, 0x1d, 0x6d, 0xc0, 0x84, 0x85, 0x8f, 0xe9, + 0x9d, 0x47, 0xe7, 0xba, 0x12, 0x1c, 0x5b, 0xac, 0x33, 0x02, 0x16, 0xdb, 0xbb, 0xf4, 0x4e, 0x6c, + 0xef, 0xeb, 0x1a, 0x69, 0xf1, 0xbf, 0x10, 0x60, 0x7e, 0x0b, 0xb7, 0x71, 0x30, 0x34, 0x4a, 0x72, + 0xeb, 0x7c, 0x34, 0x91, 0xf2, 0x47, 0x13, 0x11, 0xac, 0x12, 0xa2, 0x89, 0x33, 0xdd, 0xb0, 0x4b, + 0xb0, 0xe0, 0x9f, 0x8d, 0xde, 0x29, 0xd2, 0x7f, 0xa6, 0xe1, 0x8a, 0xa3, 0x0b, 0xa6, 0xd1, 0x6e, + 0x63, 0x73, 0xbf, 0x77, 0xd8, 0xd6, 0xac, 0x97, 0x23, 0x2c, 0xee, 0x22, 0x8c, 0xeb, 0x46, 0x8b, + 0x33, 0x9e, 0x9c, 0xf3, 0x59, 0x6d, 0xa1, 0x0a, 0xcc, 0x05, 0x63, 0xbb, 0x53, 0xe6, 0xf9, 0xe3, + 0x23, 0xbb, 0xfc, 0x49, 0xf0, 0xda, 0x12, 0x61, 0xc2, 0x89, 0x4a, 0x0d, 0xbd, 0x7d, 0x4a, 0x2c, + 0x66, 0x42, 0xf6, 0xbe, 0x91, 0x1c, 0x0c, 0xd3, 0xbe, 0xe1, 0x85, 0x69, 0x89, 0x2b, 0x4a, 0x8a, + 0xd8, 0x3e, 0x0d, 0x59, 0x7c, 0x8e, 0xb0, 0xfe, 0x68, 0x48, 0xd6, 0x03, 0x3d, 0xc1, 0x59, 0x4e, + 0xf1, 0x1c, 0xcc, 0xf7, 0x9f, 0x04, 0xb8, 0x1a, 0xbb, 0x04, 0x16, 0x67, 0xb4, 0xe0, 0x42, 0x97, + 0x76, 0x78, 0x9b, 0x40, 0xad, 0xec, 0xfe, 0xc0, 0x4d, 0x60, 0x89, 0x35, 0x6b, 0xf5, 0x6d, 0xc3, + 0x6c, 0xd7, 0xd7, 0x28, 0x96, 0x60, 0x3e, 0x82, 0x6c, 0xa4, 0xc5, 0xfc, 0x5a, 0x80, 0xd5, 0xbe, + 0x28, 0x07, 0x7a, 0xf7, 0xfc, 0xd4, 0xb7, 0xd1, 0xd7, 0x2d, 0xea, 0xf2, 0x3f, 0x08, 0xaf, 0x3d, + 0x7a, 0xc2, 0x37, 0x65, 0xc1, 0xd7, 0x60, 0x2d, 0x61, 0x6a, 0x66, 0xce, 0xbf, 0xca, 0xc0, 0xda, + 0x53, 0xb5, 0xad, 0xb5, 0xbc, 0xe8, 0x31, 0x02, 0x82, 0x48, 0xde, 0x92, 0x66, 0xc8, 0x02, 0xa8, + 0xd7, 0x7a, 0xe0, 0x59, 0xed, 0x20, 0xfe, 0x43, 0x5c, 0x87, 0xe7, 0x98, 0xf9, 0x3d, 0x8f, 0xc8, + 0xfc, 0x3e, 0x1a, 0x5e, 0xd6, 0xa4, 0x3c, 0xf0, 0x20, 0xe8, 0x60, 0x3e, 0x1c, 0x9e, 0x6f, 0x82, + 0x16, 0x9c, 0xd9, 0x8a, 0xbf, 0xce, 0x54, 0xed, 0x1f, 0x32, 0x20, 0x25, 0xad, 0x9e, 0xf9, 0x10, + 0x19, 0x26, 0x9b, 0x86, 0x7e, 0xa4, 0x99, 0x1d, 0xdc, 0x62, 0x29, 0xc7, 0xfb, 0xc3, 0x6c, 0x1e, + 0x73, 0x20, 0x9b, 0xee, 0x58, 0xb9, 0xcf, 0x06, 0x15, 0x60, 0xbc, 0x83, 0x2d, 0x4b, 0x3d, 0x76, + 0xc5, 0x72, 0x3f, 0xc5, 0x9f, 0xa6, 0x61, 0xd2, 0x1b, 0x82, 0xf4, 0x90, 0x06, 0x53, 0xf7, 0xb5, + 0xfd, 0x3a, 0x02, 0xbc, 0xbe, 0x32, 0xa7, 0x5e, 0x43, 0x99, 0x5b, 0x3e, 0x65, 0xa6, 0xe6, 0xb0, + 0xf5, 0x5a, 0x62, 0x27, 0xe8, 0xf5, 0xd7, 0xae, 0x80, 0xd2, 0x6f, 0x01, 0xda, 0xd5, 0x2c, 0x96, + 0xba, 0x79, 0x6e, 0xc9, 0xc9, 0xd4, 0xd4, 0x57, 0x0a, 0xd6, 0x6d, 0x53, 0x63, 0xe1, 0x7a, 0x56, + 0x86, 0x8e, 0xfa, 0xaa, 0x42, 0x5b, 0x9c, 0x90, 0xde, 0xb2, 0x55, 0xd3, 0xd6, 0xf4, 0x63, 0xc5, + 0x36, 0x3e, 0xc3, 0x1e, 0x0e, 0xec, 0xb6, 0x36, 0x9c, 0x46, 0xe9, 0xcb, 0x14, 0xcc, 0xfb, 0xd8, + 0x33, 0x9d, 0xbc, 0x0f, 0xe3, 0x7d, 0xde, 0xbe, 0x30, 0x3e, 0x82, 0xba, 0x48, 0xb7, 0xcd, 0x1d, + 0x81, 0x2e, 0x03, 0xe8, 0xf8, 0x95, 0xed, 0x9b, 0x77, 0xd2, 0x69, 0x21, 0x73, 0x8a, 0x7f, 0x20, + 0x78, 0x99, 0xbe, 0xad, 0xda, 0x3d, 0x92, 0x55, 0x32, 0x17, 0x8d, 0x5b, 0x0a, 0xbb, 0x63, 0xe8, + 0xbc, 0x93, 0x72, 0xde, 0xeb, 0xa9, 0x91, 0xdb, 0xc6, 0x42, 0xdb, 0x1e, 0xc4, 0xda, 0x34, 0xf4, + 0x96, 0x66, 0xf7, 0x21, 0xd6, 0x8b, 0xa1, 0x04, 0x81, 0x76, 0x97, 0x9d, 0xbc, 0xca, 0x05, 0x55, + 0xbd, 0x56, 0xf1, 0x73, 0xc8, 0xd2, 0xe3, 0x18, 0x12, 0x2c, 0x40, 0x0f, 0x21, 0x67, 0x11, 0x89, + 0x83, 0xc0, 0x48, 0xd4, 0x9e, 0xf0, 0x2b, 0x94, 0xd9, 0x38, 0xe9, 0x5b, 0x20, 0xf6, 0x2f, 0xa6, + 0x6d, 0x6c, 0x0f, 0x7f, 0xfd, 0x6e, 0x38, 0x6b, 0x90, 0xfe, 0x3c, 0x05, 0xcb, 0x91, 0x0c, 0x46, + 0x83, 0x3d, 0xd0, 0x4e, 0x60, 0x25, 0xef, 0x86, 0x6f, 0xec, 0x10, 0xf3, 0xc8, 0x15, 0x89, 0xbf, + 0x7b, 0xb6, 0xc3, 0x2c, 0x8f, 0x7c, 0x98, 0xa1, 0x73, 0xa4, 0x3b, 0xf3, 0xd3, 0x14, 0xa0, 0x6d, + 0x6c, 0x7b, 0xa9, 0x32, 0xdb, 0xd2, 0x18, 0x7f, 0x23, 0xbc, 0x86, 0xbf, 0xf9, 0x8e, 0xcf, 0xdf, + 0x50, 0x8f, 0x75, 0x8b, 0x2b, 0x9a, 0x04, 0xa6, 0x4e, 0xbc, 0x2d, 0x63, 0xd2, 0x53, 0x1a, 0xf3, + 0x0f, 0x97, 0x9e, 0x9e, 0xd1, 0xad, 0xfc, 0xbb, 0x00, 0xf3, 0x3e, 0xa1, 0x99, 0x06, 0xdd, 0x01, + 0xa4, 0x9e, 0xa8, 0x5a, 0x5b, 0x75, 0x04, 0x73, 0xd3, 0x7f, 0x06, 0x07, 0xcc, 0x79, 0x3d, 0xee, + 0x30, 0xf4, 0x18, 0xe6, 0x3b, 0xea, 0x2b, 0xad, 0xd3, 0xeb, 0x28, 0x6c, 0x9f, 0x2d, 0xed, 0x07, + 0x2e, 0x70, 0xb8, 0x1c, 0x02, 0xd0, 0xab, 0xba, 0xfd, 0xe1, 0xfb, 0x14, 0x41, 0x9f, 0x63, 0xe3, + 0x98, 0xf2, 0x68, 0x3f, 0xc0, 0x68, 0x1f, 0xe6, 0x3b, 0x9a, 0x1e, 0x62, 0x96, 0x1e, 0xc8, 0x8c, + 0x1a, 0xf8, 0x1c, 0x1b, 0xdc, 0xe7, 0x28, 0x49, 0x7c, 0xd0, 0xcb, 0x96, 0x1b, 0x2c, 0x32, 0xb5, + 0xf9, 0x60, 0x31, 0x44, 0xc3, 0xb6, 0x65, 0x3b, 0xb2, 0xd0, 0x74, 0x2d, 0x6c, 0x36, 0xac, 0xea, + 0x12, 0x5b, 0x73, 0xfa, 0x9f, 0x34, 0x6f, 0xc1, 0x21, 0x6a, 0x74, 0x1f, 0xd2, 0x66, 0xb7, 0xc9, + 0xcc, 0xf7, 0xe6, 0x10, 0xfc, 0x8b, 0xf2, 0xfe, 0xe6, 0xce, 0x98, 0xec, 0x8c, 0x12, 0xff, 0x22, + 0x0d, 0x69, 0x79, 0x7f, 0x13, 0x3d, 0xf4, 0x95, 0x58, 0x6e, 0x0f, 0xc9, 0x85, 0xaf, 0xb0, 0xfc, + 0x32, 0x15, 0x55, 0x62, 0x29, 0xc0, 0xc2, 0xa6, 0x5c, 0x29, 0x35, 0x2a, 0xca, 0x56, 0x65, 0xb7, + 0xd2, 0xa8, 0x28, 0xb4, 0x40, 0x94, 0x17, 0xd0, 0x0a, 0x14, 0xf6, 0x0f, 0xca, 0xbb, 0xd5, 0xfa, + 0x8e, 0x72, 0x50, 0x73, 0xff, 0x62, 0xbd, 0x29, 0x94, 0x87, 0xe9, 0xdd, 0x6a, 0xbd, 0xc1, 0x1a, + 0xea, 0xf9, 0xb4, 0xd3, 0xb2, 0x5d, 0x69, 0x28, 0x9b, 0xa5, 0xfd, 0xd2, 0x66, 0xb5, 0xf1, 0x3c, + 0x9f, 0x41, 0x22, 0x2c, 0xf9, 0x79, 0xd7, 0x6b, 0xa5, 0xfd, 0xfa, 0xce, 0x5e, 0x23, 0x9f, 0x45, + 0x08, 0x66, 0xc9, 0x78, 0xb7, 0xa9, 0x9e, 0xcf, 0x39, 0x1c, 0x36, 0x77, 0xf7, 0x6a, 0x9e, 0x0c, + 0xe3, 0x68, 0x01, 0xf2, 0xee, 0xcc, 0x72, 0xa5, 0xb4, 0x45, 0x00, 0xbd, 0x09, 0x34, 0x07, 0x33, + 0x95, 0xef, 0xed, 0x97, 0x6a, 0x5b, 0x2e, 0xe1, 0x24, 0x5a, 0x85, 0x15, 0x5e, 0x1c, 0x85, 0x8d, + 0xaa, 0x6c, 0x11, 0x50, 0xae, 0x9e, 0x07, 0x74, 0x09, 0xf2, 0xac, 0xf6, 0xb5, 0xb9, 0x57, 0xdb, + 0xaa, 0x36, 0xaa, 0x7b, 0xb5, 0xfc, 0x14, 0x45, 0xf0, 0xe6, 0x01, 0x1c, 0xc9, 0x19, 0xb3, 0xe9, + 0xc1, 0xb0, 0xde, 0x0c, 0x85, 0xf5, 0x5c, 0xc4, 0xfa, 0xd7, 0x29, 0x58, 0xa4, 0x90, 0xb5, 0x0b, + 0x90, 0xbb, 0xbe, 0x6a, 0x1d, 0xf2, 0x14, 0xef, 0x52, 0x82, 0xb7, 0xc0, 0x2c, 0x6d, 0x7f, 0xea, + 0xe6, 0x1d, 0x6e, 0x79, 0x29, 0xc5, 0x95, 0x97, 0xaa, 0xc1, 0x2c, 0xec, 0x96, 0xbf, 0x10, 0x13, + 0x98, 0x2d, 0x29, 0xb1, 0x7f, 0x12, 0x91, 0x26, 0xdc, 0x49, 0xe6, 0x96, 0x14, 0x42, 0x9d, 0x25, + 0x8b, 0x3f, 0xa3, 0x97, 0x7b, 0x04, 0x4b, 0x41, 0x79, 0x99, 0x41, 0xdf, 0x0e, 0x95, 0x4b, 0x3c, + 0xb7, 0xeb, 0xd1, 0x7a, 0x14, 0xd2, 0x8f, 0x52, 0x30, 0xe1, 0x36, 0x3b, 0xe1, 0x8d, 0xe3, 0x97, + 0x7c, 0x48, 0xe9, 0xa4, 0xd3, 0xe2, 0x01, 0xaf, 0x7c, 0xa1, 0x23, 0x15, 0x2c, 0x74, 0x44, 0x9e, + 0x73, 0x3a, 0xf2, 0x9c, 0xbf, 0x0d, 0x33, 0x4d, 0x47, 0x7c, 0xcd, 0xd0, 0x15, 0x5b, 0xeb, 0xb8, + 0x40, 0x68, 0xb8, 0x30, 0xd9, 0x70, 0xdf, 0x1a, 0xc8, 0xd3, 0xee, 0x00, 0xa7, 0x09, 0xad, 0xc2, + 0x34, 0x29, 0x54, 0x2a, 0xb6, 0xa1, 0xf4, 0x2c, 0x5c, 0xc8, 0x12, 0x58, 0x08, 0x48, 0x5b, 0xc3, + 0x38, 0xb0, 0x30, 0xba, 0x0b, 0x73, 0x04, 0xc4, 0x57, 0x78, 0x99, 0x73, 0x8e, 0x34, 0x2c, 0x6a, + 0x22, 0xbd, 0x75, 0x4f, 0x7a, 0xe9, 0xef, 0x05, 0x58, 0xa4, 0xf0, 0x58, 0x50, 0x7f, 0x07, 0x55, + 0x78, 0x78, 0x15, 0x0d, 0x5c, 0x9f, 0x91, 0x0c, 0xdf, 0x14, 0x3a, 0x50, 0x80, 0xa5, 0xe0, 0x7c, + 0x0c, 0x12, 0xf8, 0x59, 0x0a, 0x16, 0x9c, 0x58, 0xce, 0xed, 0x38, 0xef, 0x70, 0x7b, 0x84, 0xa3, + 0x0f, 0x6c, 0x66, 0x26, 0xb4, 0x99, 0x3b, 0xc1, 0x84, 0xfb, 0x6d, 0x3e, 0x1a, 0x0d, 0xae, 0xe0, + 0x4d, 0xed, 0xe5, 0x4f, 0x04, 0x58, 0x0c, 0xcc, 0xc7, 0x0c, 0xec, 0xe3, 0x60, 0x06, 0x71, 0x2d, + 0x46, 0xbe, 0xd7, 0xca, 0x21, 0x3e, 0x70, 0x63, 0xf7, 0xd1, 0xec, 0xf8, 0x5f, 0x52, 0x70, 0xb9, + 0x7f, 0x0b, 0x92, 0xb7, 0x05, 0xad, 0x11, 0x20, 0xb0, 0xb3, 0x95, 0xf0, 0xbf, 0x1b, 0xf4, 0xd0, + 0xf7, 0xc2, 0x17, 0x73, 0x84, 0x48, 0x49, 0x9e, 0x3a, 0x12, 0x39, 0xce, 0x8c, 0x8a, 0x1c, 0x9f, + 0x49, 0x03, 0x7e, 0x87, 0x07, 0xc5, 0xfd, 0xe2, 0x33, 0x4d, 0x18, 0xb2, 0xba, 0xf4, 0x21, 0x5c, + 0x24, 0xe9, 0x82, 0xf7, 0x70, 0xc6, 0x2d, 0xd8, 0x53, 0x1f, 0x3a, 0x21, 0x2f, 0x3a, 0xdd, 0xde, + 0x7b, 0x10, 0x56, 0x51, 0x69, 0x49, 0x5f, 0x65, 0x60, 0xc9, 0x49, 0x27, 0xea, 0xb6, 0x7a, 0x3c, + 0x4a, 0xad, 0xe1, 0xfb, 0x61, 0xe8, 0x36, 0xe5, 0x3f, 0x96, 0x68, 0xae, 0xc3, 0x20, 0xb6, 0xa8, + 0x08, 0xf3, 0x96, 0xad, 0x1e, 0x13, 0x77, 0xa0, 0x9a, 0xc7, 0xd8, 0x56, 0xba, 0xaa, 0xfd, 0x92, + 0xd9, 0xfa, 0x1c, 0xeb, 0x6a, 0x90, 0x9e, 0x7d, 0xd5, 0x7e, 0x79, 0x4e, 0x07, 0x89, 0xbe, 0x13, + 0x74, 0x0a, 0xef, 0x0c, 0x58, 0x4b, 0x82, 0x6e, 0x7d, 0x2f, 0x06, 0xde, 0x7f, 0x6f, 0x00, 0xcb, + 0xc1, 0xb0, 0xfe, 0xd9, 0xe1, 0xec, 0xaf, 0xb9, 0x32, 0x70, 0x09, 0x2e, 0x86, 0x16, 0xcf, 0xae, + 0x90, 0x63, 0x28, 0x38, 0x5d, 0x07, 0xba, 0x35, 0xa2, 0x3a, 0xc6, 0x68, 0x4c, 0x2a, 0x46, 0x63, + 0xa4, 0x65, 0xb8, 0x14, 0x31, 0x11, 0x93, 0xe2, 0xe7, 0x59, 0x2a, 0xc6, 0xe8, 0x45, 0xaa, 0x4f, + 0xe2, 0xac, 0xe2, 0x7d, 0xfe, 0xd8, 0x23, 0xeb, 0x39, 0x6f, 0xc2, 0x2e, 0xae, 0xc2, 0x14, 0x4f, + 0xc7, 0xae, 0x41, 0x7b, 0x80, 0xe1, 0x64, 0xcf, 0x54, 0x3b, 0xcb, 0x05, 0x6a, 0x67, 0xbb, 0x7d, + 0xa3, 0x1a, 0xf7, 0xc7, 0xc2, 0xb1, 0x5b, 0x91, 0x60, 0x56, 0x2f, 0x42, 0x66, 0x35, 0xe1, 0x2f, + 0xc8, 0xc5, 0x32, 0xfd, 0x0d, 0x30, 0x2c, 0xa6, 0xd4, 0x91, 0x95, 0x32, 0xe9, 0x05, 0x88, 0x54, + 0xe3, 0x47, 0xaf, 0x5d, 0x05, 0xd4, 0x28, 0x15, 0x54, 0x23, 0xe9, 0x32, 0x2c, 0x47, 0xf2, 0x66, + 0x53, 0xff, 0xa1, 0x40, 0x05, 0xf3, 0x40, 0xb1, 0xba, 0xad, 0xda, 0xd6, 0xb0, 0x53, 0xb3, 0x4e, + 0x7e, 0x6a, 0xda, 0x44, 0x34, 0x78, 0x44, 0x93, 0x90, 0xfe, 0x44, 0xa0, 0xfb, 0x10, 0x94, 0x85, + 0xdd, 0xb6, 0x6f, 0x43, 0xb6, 0x47, 0x70, 0x7f, 0x1a, 0x75, 0xcd, 0xfb, 0x8d, 0xe0, 0xc0, 0xe9, + 0x92, 0x29, 0xc5, 0xb9, 0x21, 0xa9, 0xd2, 0xcf, 0x04, 0x98, 0xe2, 0xf8, 0xa3, 0x15, 0x98, 0xf4, + 0xa0, 0x22, 0x37, 0x41, 0xf2, 0x1a, 0x9c, 0xe3, 0xb7, 0x0d, 0x5b, 0x6d, 0xb3, 0x37, 0x29, 0xf4, + 0xc3, 0xc9, 0x69, 0x7b, 0x16, 0xa6, 0xe1, 0x70, 0x5a, 0x26, 0x7f, 0xa3, 0xdb, 0x90, 0xe9, 0xe9, + 0x9a, 0x4d, 0xcc, 0x7e, 0x36, 0x68, 0xcf, 0x64, 0xaa, 0xe2, 0x81, 0xae, 0xd9, 0x32, 0xa1, 0x92, + 0x6e, 0x41, 0xc6, 0xf9, 0xf2, 0x43, 0x16, 0x93, 0x90, 0x2d, 0x3f, 0x6f, 0x54, 0xea, 0x79, 0x01, + 0x01, 0xe4, 0xaa, 0x34, 0xc1, 0x4f, 0x49, 0xbb, 0xee, 0xbb, 0x54, 0x6f, 0x11, 0x8e, 0x0b, 0x50, + 0x0f, 0x75, 0xc3, 0xec, 0xa8, 0x6d, 0x22, 0xf3, 0x84, 0xec, 0x7d, 0xc7, 0x97, 0x53, 0x28, 0xf8, + 0xb8, 0xe2, 0x9d, 0x48, 0x14, 0xc0, 0xf4, 0x29, 0xd5, 0xad, 0x38, 0x68, 0xa9, 0x14, 0x09, 0x2d, + 0x5d, 0xf6, 0xdd, 0xb2, 0x03, 0x40, 0xa5, 0x7f, 0x4c, 0xc1, 0x62, 0x24, 0x1d, 0xfa, 0x80, 0x87, + 0x93, 0xd6, 0x12, 0x79, 0xf2, 0x40, 0xd2, 0x57, 0x02, 0x05, 0x92, 0x36, 0x7c, 0x40, 0xd2, 0x8d, + 0x81, 0xe3, 0x79, 0x08, 0xe9, 0x27, 0x42, 0x0c, 0x84, 0x54, 0x6f, 0x94, 0xb6, 0x2b, 0xca, 0x41, + 0x8d, 0xfe, 0xeb, 0x41, 0x48, 0x0b, 0x90, 0xef, 0x03, 0x2b, 0x4a, 0xbd, 0x51, 0x22, 0xef, 0x8b, + 0x43, 0xf0, 0x4d, 0x3a, 0x12, 0x9c, 0xc9, 0x0c, 0xc6, 0x61, 0xb2, 0x94, 0x64, 0x09, 0x10, 0x1b, + 0xfd, 0x64, 0xef, 0xa0, 0xd6, 0x50, 0xc8, 0xeb, 0xe5, 0x7c, 0xce, 0xc3, 0x67, 0x16, 0x00, 0xb1, + 0xd3, 0xe2, 0x1f, 0xe1, 0xff, 0x95, 0x00, 0xf3, 0xbe, 0x66, 0x76, 0x78, 0x5c, 0x51, 0x5c, 0xf0, + 0x15, 0xc5, 0xef, 0xc2, 0x82, 0x93, 0x31, 0x52, 0x4b, 0xb1, 0x94, 0x2e, 0x36, 0x09, 0x18, 0xce, + 0x74, 0x7e, 0xae, 0xa3, 0xbe, 0x62, 0x05, 0x83, 0x7d, 0x6c, 0x3a, 0x8c, 0xcf, 0x01, 0x12, 0x96, + 0xbe, 0x48, 0xd3, 0xb8, 0x64, 0xe4, 0xbc, 0x66, 0xa0, 0x8f, 0x0a, 0x27, 0x3e, 0xe9, 0x11, 0x12, + 0x9f, 0x18, 0x0f, 0x97, 0x19, 0x29, 0x18, 0x1e, 0xfd, 0x4e, 0xaf, 0xf5, 0xef, 0x6d, 0x1a, 0xb9, + 0xde, 0xe6, 0xf5, 0x77, 0x60, 0xa6, 0x95, 0xfb, 0xa2, 0x2c, 0xfc, 0xf8, 0xbc, 0xf2, 0xe4, 0x12, + 0x8d, 0xc7, 0xce, 0x90, 0x1f, 0x49, 0x37, 0xe1, 0x3a, 0x79, 0x56, 0x39, 0x10, 0xd0, 0x3e, 0x81, + 0x1b, 0x83, 0x08, 0xd9, 0xcc, 0xbb, 0x91, 0xae, 0xc7, 0x2b, 0x6b, 0x05, 0xb8, 0x0c, 0xf2, 0x42, + 0x3f, 0x4c, 0xc1, 0xea, 0xa0, 0x21, 0xe8, 0x21, 0xef, 0x90, 0x6e, 0x0f, 0x3b, 0x13, 0xef, 0x9b, + 0xfe, 0x94, 0xf9, 0xa6, 0x8a, 0xcf, 0x37, 0xbd, 0x37, 0x0a, 0x2b, 0xde, 0x4d, 0x55, 0xa2, 0xbc, + 0xd4, 0xbb, 0x70, 0xd3, 0x0f, 0x46, 0x73, 0x9e, 0x89, 0xfe, 0xdc, 0xc1, 0x43, 0xa7, 0x05, 0x3f, + 0xbc, 0xfb, 0xcb, 0x34, 0xac, 0xf2, 0x2f, 0x92, 0xb7, 0x79, 0xf8, 0x2c, 0xe9, 0xe7, 0x01, 0xb7, + 0x60, 0x2e, 0x08, 0x0d, 0xb9, 0x2f, 0x70, 0x2f, 0xf8, 0xb1, 0x21, 0x2b, 0xe9, 0xc5, 0xcd, 0x80, + 0xa9, 0x93, 0x22, 0xd3, 0xfb, 0x5e, 0x64, 0xea, 0x32, 0xa7, 0xd0, 0xef, 0x82, 0xdf, 0xe6, 0x28, + 0x07, 0x37, 0xf4, 0xac, 0x7b, 0xd9, 0x22, 0x8f, 0x19, 0xd3, 0xe4, 0xf3, 0x9b, 0x43, 0x4b, 0xf5, + 0xff, 0x13, 0x3e, 0xa6, 0x97, 0xfb, 0xdf, 0xf6, 0x2b, 0x9c, 0x44, 0x8c, 0x64, 0x57, 0xfa, 0x30, + 0x88, 0x71, 0xae, 0x45, 0xed, 0xde, 0x9b, 0x82, 0xe3, 0xda, 0xb0, 0x96, 0xb0, 0xd7, 0xcc, 0xea, + 0xcb, 0x30, 0xeb, 0x87, 0x7c, 0x99, 0x35, 0x06, 0xde, 0xd7, 0xfa, 0x07, 0xcf, 0xf8, 0x70, 0x60, + 0xba, 0x33, 0xbf, 0x10, 0xdc, 0x9f, 0x22, 0xf8, 0x68, 0x1d, 0x55, 0x0e, 0x63, 0xca, 0x54, 0xfe, + 0x20, 0x9c, 0x8c, 0x8a, 0x30, 0xe9, 0x52, 0x59, 0xc1, 0xc7, 0xad, 0xde, 0xe4, 0x7d, 0x92, 0x30, + 0x24, 0x9e, 0x1e, 0x0d, 0x12, 0xa7, 0x92, 0xff, 0x28, 0x05, 0xab, 0xfc, 0x1b, 0xcf, 0x48, 0x2b, + 0x1d, 0x65, 0x19, 0x6b, 0x30, 0xcd, 0x51, 0xb9, 0x86, 0x3b, 0xd5, 0xc7, 0x6b, 0x93, 0x8c, 0x76, + 0x90, 0x24, 0x6f, 0x48, 0x5b, 0xe8, 0x56, 0x5c, 0x83, 0xb5, 0x84, 0xf9, 0x59, 0xfe, 0xf3, 0x5f, + 0x02, 0xdc, 0x8c, 0x78, 0x1a, 0x70, 0xe6, 0x6d, 0xfb, 0x7e, 0xd0, 0x5a, 0x1e, 0x24, 0x3c, 0x44, + 0xf8, 0x3f, 0xdf, 0x1a, 0x0b, 0xd6, 0x07, 0x8b, 0x71, 0xce, 0x46, 0x75, 0xef, 0xbf, 0x05, 0x98, + 0xa8, 0xb6, 0xb0, 0x6e, 0xd3, 0x10, 0x66, 0xc6, 0xf7, 0x73, 0x4c, 0xb4, 0x12, 0xf3, 0x2b, 0x4d, + 0xb2, 0x19, 0xe2, 0xe5, 0xc4, 0xdf, 0x70, 0x4a, 0x63, 0xe8, 0x88, 0xfb, 0x29, 0xa9, 0xef, 0x71, + 0xc3, 0x5b, 0xa1, 0x91, 0x11, 0x91, 0x85, 0x78, 0x7d, 0x00, 0x95, 0x37, 0xcf, 0x87, 0x90, 0x25, + 0x3f, 0xad, 0x43, 0xde, 0xdd, 0xc1, 0xff, 0xf2, 0x4e, 0x5c, 0x0c, 0xb4, 0xba, 0xe3, 0xee, 0xfd, + 0xf3, 0x24, 0x40, 0x7f, 0xcb, 0xd1, 0x63, 0x98, 0xe6, 0xdd, 0x19, 0x5a, 0x4e, 0xf8, 0x6d, 0x99, + 0xb8, 0x12, 0xdd, 0xe9, 0xc9, 0xf4, 0x18, 0xa6, 0x79, 0x45, 0xef, 0x33, 0x8b, 0x78, 0x5a, 0xde, + 0x67, 0x16, 0xf9, 0x12, 0x7c, 0x0c, 0xb5, 0xe1, 0x62, 0xcc, 0xc3, 0x5e, 0x74, 0x63, 0xb8, 0xe7, + 0xcf, 0xe2, 0xcd, 0x21, 0x5f, 0x08, 0x4b, 0x63, 0xc8, 0x84, 0x4b, 0xb1, 0xef, 0x59, 0xd1, 0xfa, + 0xb0, 0xaf, 0x6d, 0xc5, 0xb7, 0x87, 0xa0, 0xf4, 0xe6, 0xec, 0x81, 0x18, 0xff, 0x88, 0x0e, 0xbd, + 0x3d, 0xf4, 0xeb, 0x4e, 0xf1, 0xd6, 0xf0, 0x6f, 0xf2, 0xa4, 0x31, 0xb4, 0x03, 0x53, 0xdc, 0x6b, + 0x2a, 0x24, 0x46, 0x3e, 0xb1, 0xa2, 0x8c, 0x97, 0x13, 0x9e, 0x5f, 0x51, 0x4e, 0xdc, 0x03, 0x97, + 0x3e, 0xa7, 0xf0, 0x53, 0x9d, 0x3e, 0xa7, 0x88, 0x17, 0x31, 0xc1, 0xed, 0x0f, 0xc4, 0xd2, 0x51, + 0xdb, 0x1f, 0x1d, 0x97, 0x47, 0x6d, 0x7f, 0x4c, 0x60, 0x2e, 0x8d, 0xa1, 0xef, 0xc2, 0xac, 0xbf, + 0x72, 0x8d, 0x2e, 0x27, 0x56, 0xe0, 0xc5, 0x2b, 0x71, 0xdd, 0x3c, 0x4b, 0x7f, 0xdd, 0xb3, 0xcf, + 0x32, 0xb2, 0xfe, 0xda, 0x67, 0x19, 0x53, 0x2e, 0x1d, 0x73, 0xfc, 0x93, 0xaf, 0x9a, 0xd7, 0xf7, + 0x4f, 0x51, 0x45, 0xc8, 0xbe, 0x7f, 0x8a, 0x2c, 0x01, 0x4a, 0x63, 0x48, 0x83, 0xa5, 0xe8, 0x62, + 0x12, 0xba, 0x3e, 0x54, 0xad, 0x4c, 0xbc, 0x31, 0x88, 0xcc, 0x9b, 0xaa, 0x09, 0xf3, 0x11, 0xce, + 0x1d, 0x49, 0x89, 0x2f, 0xe1, 0xe8, 0x24, 0xd7, 0x86, 0x78, 0x2d, 0x27, 0x11, 0x67, 0xfe, 0x67, + 0x19, 0xb8, 0x10, 0x48, 0x48, 0xd0, 0xef, 0x09, 0x70, 0x25, 0x39, 0x3f, 0x43, 0x77, 0x62, 0x92, + 0x99, 0x18, 0xc5, 0x2a, 0x0e, 0x4b, 0xce, 0x19, 0xf7, 0xa5, 0xd8, 0x38, 0x11, 0xad, 0x0f, 0x1b, + 0xb6, 0x73, 0x1a, 0x3d, 0x28, 0xe8, 0x24, 0xdb, 0xe1, 0x4c, 0x1b, 0x1b, 0x6b, 0xa0, 0xf5, 0x61, + 0xc3, 0xa1, 0xfe, 0xb4, 0x83, 0x03, 0x17, 0x32, 0xed, 0x1f, 0x09, 0x81, 0x67, 0x60, 0x51, 0xd3, + 0xdf, 0x1d, 0x31, 0xf2, 0x10, 0xdf, 0x1d, 0x7e, 0x00, 0x27, 0x0c, 0xc9, 0x16, 0xef, 0xfd, 0x5b, + 0x16, 0x32, 0x04, 0xf5, 0x69, 0xc0, 0x85, 0x40, 0x25, 0x09, 0x5d, 0x49, 0xae, 0xaf, 0x89, 0x57, + 0x63, 0xfb, 0xbd, 0xe3, 0x7d, 0x01, 0x73, 0xa1, 0xda, 0x10, 0x5a, 0xe5, 0xc7, 0x45, 0xd5, 0xa7, + 0xc4, 0xb5, 0x04, 0x8a, 0x20, 0x6f, 0xff, 0x9d, 0xb7, 0x3a, 0xa8, 0x78, 0xe1, 0xe7, 0x1d, 0x77, + 0xcf, 0x7d, 0x4a, 0x41, 0xb6, 0xe0, 0x0d, 0x27, 0xf9, 0xe5, 0x8a, 0xbc, 0xdb, 0xae, 0x25, 0xd2, + 0x78, 0x33, 0x7c, 0xe2, 0xa1, 0x7b, 0x1c, 0x76, 0x8e, 0x7c, 0xc2, 0x45, 0x62, 0xfc, 0xa2, 0x94, + 0x44, 0xe2, 0xb1, 0x7f, 0x06, 0xf9, 0x20, 0xcc, 0x83, 0xae, 0x0e, 0x40, 0x9d, 0xc4, 0xd5, 0x78, + 0x82, 0xe0, 0xce, 0x04, 0x1d, 0x45, 0x50, 0xaa, 0x28, 0xef, 0x70, 0x2d, 0x91, 0x86, 0xbf, 0x2e, + 0x39, 0x80, 0xb3, 0x7f, 0x5d, 0x86, 0xc1, 0xd0, 0xfe, 0x75, 0x19, 0x81, 0x88, 0x4a, 0x63, 0x1b, + 0x0f, 0x00, 0xd4, 0x76, 0xf7, 0xa5, 0xaa, 0x60, 0xbd, 0xd7, 0x41, 0x2b, 0xa1, 0xcc, 0xac, 0xa2, + 0xf7, 0x3a, 0x7b, 0x5d, 0x27, 0x21, 0xb3, 0x0a, 0x7f, 0x33, 0x41, 0x90, 0xf6, 0x49, 0x32, 0xc0, + 0xe9, 0xd8, 0xd8, 0x85, 0x7c, 0x7f, 0xb4, 0x42, 0x22, 0x72, 0xb4, 0x16, 0xc9, 0x83, 0x3c, 0xfd, + 0x0c, 0x30, 0x9a, 0xf5, 0x18, 0x91, 0xde, 0x8d, 0x8f, 0x01, 0x9a, 0x96, 0xc6, 0x00, 0x0d, 0x74, + 0x39, 0xc4, 0xe7, 0x91, 0x86, 0xdb, 0x2d, 0x97, 0xc7, 0x5f, 0x33, 0x61, 0x9a, 0x96, 0x46, 0x13, + 0x87, 0x8d, 0x6f, 0xc3, 0x14, 0x15, 0xe6, 0xc8, 0xa1, 0x1b, 0x34, 0x9e, 0xc9, 0x40, 0x57, 0x4f, + 0x7a, 0x36, 0x2a, 0x30, 0x43, 0x19, 0xb0, 0x7a, 0x01, 0xba, 0x1a, 0x62, 0xf1, 0x84, 0xf6, 0x04, + 0x98, 0x4c, 0x93, 0x61, 0xac, 0x6f, 0xa3, 0x0c, 0xd3, 0x2e, 0x1b, 0xfb, 0xa5, 0xd1, 0x42, 0x57, + 0x22, 0xb8, 0x38, 0x1d, 0x01, 0x26, 0x53, 0x8c, 0x89, 0xd3, 0xd5, 0x17, 0xc5, 0xfd, 0xbf, 0x4a, + 0xc2, 0xa2, 0x30, 0xb0, 0x2c, 0x52, 0x14, 0xd6, 0x57, 0xce, 0xbe, 0x48, 0x37, 0x2d, 0xed, 0x30, + 0x47, 0x06, 0x7d, 0xe3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xe3, 0x24, 0x7c, 0x58, 0x47, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5957,6 +6737,186 @@ var _Controller_serviceDesc = grpc.ServiceDesc{ Metadata: "github.com/container-storage-interface/spec/csi.proto", } +// GroupControllerClient is the client API for GroupController service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type GroupControllerClient interface { + GroupControllerGetCapabilities(ctx context.Context, in *GroupControllerGetCapabilitiesRequest, opts ...grpc.CallOption) (*GroupControllerGetCapabilitiesResponse, error) + CreateVolumeGroupSnapshot(ctx context.Context, in *CreateVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*CreateVolumeGroupSnapshotResponse, error) + DeleteVolumeGroupSnapshot(ctx context.Context, in *DeleteVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*DeleteVolumeGroupSnapshotResponse, error) + ControllerGetVolumeGroupSnapshot(ctx context.Context, in *ControllerGetVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*ControllerGetVolumeGroupSnapshotResponse, error) +} + +type groupControllerClient struct { + cc *grpc.ClientConn +} + +func NewGroupControllerClient(cc *grpc.ClientConn) GroupControllerClient { + return &groupControllerClient{cc} +} + +func (c *groupControllerClient) GroupControllerGetCapabilities(ctx context.Context, in *GroupControllerGetCapabilitiesRequest, opts ...grpc.CallOption) (*GroupControllerGetCapabilitiesResponse, error) { + out := new(GroupControllerGetCapabilitiesResponse) + err := c.cc.Invoke(ctx, "/csi.v1.GroupController/GroupControllerGetCapabilities", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupControllerClient) CreateVolumeGroupSnapshot(ctx context.Context, in *CreateVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*CreateVolumeGroupSnapshotResponse, error) { + out := new(CreateVolumeGroupSnapshotResponse) + err := c.cc.Invoke(ctx, "/csi.v1.GroupController/CreateVolumeGroupSnapshot", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupControllerClient) DeleteVolumeGroupSnapshot(ctx context.Context, in *DeleteVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*DeleteVolumeGroupSnapshotResponse, error) { + out := new(DeleteVolumeGroupSnapshotResponse) + err := c.cc.Invoke(ctx, "/csi.v1.GroupController/DeleteVolumeGroupSnapshot", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *groupControllerClient) ControllerGetVolumeGroupSnapshot(ctx context.Context, in *ControllerGetVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*ControllerGetVolumeGroupSnapshotResponse, error) { + out := new(ControllerGetVolumeGroupSnapshotResponse) + err := c.cc.Invoke(ctx, "/csi.v1.GroupController/ControllerGetVolumeGroupSnapshot", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GroupControllerServer is the server API for GroupController service. +type GroupControllerServer interface { + GroupControllerGetCapabilities(context.Context, *GroupControllerGetCapabilitiesRequest) (*GroupControllerGetCapabilitiesResponse, error) + CreateVolumeGroupSnapshot(context.Context, *CreateVolumeGroupSnapshotRequest) (*CreateVolumeGroupSnapshotResponse, error) + DeleteVolumeGroupSnapshot(context.Context, *DeleteVolumeGroupSnapshotRequest) (*DeleteVolumeGroupSnapshotResponse, error) + ControllerGetVolumeGroupSnapshot(context.Context, *ControllerGetVolumeGroupSnapshotRequest) (*ControllerGetVolumeGroupSnapshotResponse, error) +} + +// UnimplementedGroupControllerServer can be embedded to have forward compatible implementations. +type UnimplementedGroupControllerServer struct { +} + +func (*UnimplementedGroupControllerServer) GroupControllerGetCapabilities(ctx context.Context, req *GroupControllerGetCapabilitiesRequest) (*GroupControllerGetCapabilitiesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GroupControllerGetCapabilities not implemented") +} +func (*UnimplementedGroupControllerServer) CreateVolumeGroupSnapshot(ctx context.Context, req *CreateVolumeGroupSnapshotRequest) (*CreateVolumeGroupSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateVolumeGroupSnapshot not implemented") +} +func (*UnimplementedGroupControllerServer) DeleteVolumeGroupSnapshot(ctx context.Context, req *DeleteVolumeGroupSnapshotRequest) (*DeleteVolumeGroupSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteVolumeGroupSnapshot not implemented") +} +func (*UnimplementedGroupControllerServer) ControllerGetVolumeGroupSnapshot(ctx context.Context, req *ControllerGetVolumeGroupSnapshotRequest) (*ControllerGetVolumeGroupSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControllerGetVolumeGroupSnapshot not implemented") +} + +func RegisterGroupControllerServer(s *grpc.Server, srv GroupControllerServer) { + s.RegisterService(&_GroupController_serviceDesc, srv) +} + +func _GroupController_GroupControllerGetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GroupControllerGetCapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupControllerServer).GroupControllerGetCapabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.v1.GroupController/GroupControllerGetCapabilities", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupControllerServer).GroupControllerGetCapabilities(ctx, req.(*GroupControllerGetCapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupController_CreateVolumeGroupSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateVolumeGroupSnapshotRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupControllerServer).CreateVolumeGroupSnapshot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.v1.GroupController/CreateVolumeGroupSnapshot", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupControllerServer).CreateVolumeGroupSnapshot(ctx, req.(*CreateVolumeGroupSnapshotRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupController_DeleteVolumeGroupSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteVolumeGroupSnapshotRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupControllerServer).DeleteVolumeGroupSnapshot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.v1.GroupController/DeleteVolumeGroupSnapshot", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupControllerServer).DeleteVolumeGroupSnapshot(ctx, req.(*DeleteVolumeGroupSnapshotRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GroupController_ControllerGetVolumeGroupSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControllerGetVolumeGroupSnapshotRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupControllerServer).ControllerGetVolumeGroupSnapshot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.v1.GroupController/ControllerGetVolumeGroupSnapshot", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupControllerServer).ControllerGetVolumeGroupSnapshot(ctx, req.(*ControllerGetVolumeGroupSnapshotRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _GroupController_serviceDesc = grpc.ServiceDesc{ + ServiceName: "csi.v1.GroupController", + HandlerType: (*GroupControllerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GroupControllerGetCapabilities", + Handler: _GroupController_GroupControllerGetCapabilities_Handler, + }, + { + MethodName: "CreateVolumeGroupSnapshot", + Handler: _GroupController_CreateVolumeGroupSnapshot_Handler, + }, + { + MethodName: "DeleteVolumeGroupSnapshot", + Handler: _GroupController_DeleteVolumeGroupSnapshot_Handler, + }, + { + MethodName: "ControllerGetVolumeGroupSnapshot", + Handler: _GroupController_ControllerGetVolumeGroupSnapshot_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "github.com/container-storage-interface/spec/csi.proto", +} + // NodeClient is the client API for Node service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. diff --git a/spec.md b/spec.md index 512097f6..ca34727c 100644 --- a/spec.md +++ b/spec.md @@ -383,6 +383,30 @@ service Controller { } } +service GroupController { + option (alpha_service) = true; + + rpc GroupControllerGetCapabilities ( + GroupControllerGetCapabilitiesRequest) + returns (GroupControllerGetCapabilitiesResponse) {} + + rpc CreateVolumeGroupSnapshot(CreateVolumeGroupSnapshotRequest) + returns (CreateVolumeGroupSnapshotResponse) { + option (alpha_method) = true; + } + + rpc DeleteVolumeGroupSnapshot(DeleteVolumeGroupSnapshotRequest) + returns (DeleteVolumeGroupSnapshotResponse) { + option (alpha_method) = true; + } + + rpc ControllerGetVolumeGroupSnapshot( + ControllerGetVolumeGroupSnapshotRequest) + returns (ControllerGetVolumeGroupSnapshotResponse) { + option (alpha_method) = true; + } +} + service Node { rpc NodeStageVolume (NodeStageVolumeRequest) returns (NodeStageVolumeResponse) {} @@ -591,6 +615,15 @@ message PluginCapability { // returned by NodeGetInfo to ensure that a given volume is // accessible from a given node when scheduling workloads. VOLUME_ACCESSIBILITY_CONSTRAINTS = 2; + + // GROUP_CONTROLLER_SERVICE indicates that the Plugin provides + // RPCs for the GroupControllerService. Plugins MAY provide this + // capability. + // The presence of this capability determines whether the CO will + // attempt to invoke the REQUIRED GroupControllerService RPCs, as + // well as specific RPCs as indicated by + // GroupControllerGetCapabilities. + GROUP_CONTROLLER_SERVICE = 3; } Type type = 1; } @@ -1873,6 +1906,17 @@ message Snapshot { // `volume_content_source` in a `CreateVolumeRequest`. The default // value is false. This field is REQUIRED. bool ready_to_use = 5; + + // The ID of the volume group snapshot that this snapshot is part of. + // It uniquely identifies the group snapshot on the storage system. + // This field is OPTIONAL. + // If this snapshot is a member of the volume group snapshot, the SP + // SHOULD provide the ID of the volume group snapshot in this field. + // If provided, CO MUST use this field to indicate that this snapshot + // is part of the specified group snapshot. + // If this message is inside a VolumeGroupSnapshot message, the value + // MUST be the same as the group_snapshot_id in that message. + string group_snapshot_id = 6 [(alpha_field) = true]; } ``` @@ -1897,6 +1941,8 @@ This RPC will be called by the CO to delete a snapshot. This operation MUST be idempotent. If a snapshot corresponding to the specified `snapshot_id` does not exist or the artifacts associated with the snapshot do not exist anymore, the Plugin MUST reply `0 OK`. +Snapshots that are members of a group snapshot will be deleted when the group snapshot is deleted. The CO SHOULD NOT call this RPC with a snapshot_id for a snapshot that was created as part of a group snapshot, i.e. if the snapshot had a non-empty group_snapshot_id field at creation time. The SP MAY refuse to delete such snapshots with this RPC call and return an error instead. + ```protobuf message DeleteSnapshotRequest { // The ID of the snapshot to be deleted. @@ -2734,6 +2780,269 @@ message NodeExpandVolumeResponse { | Volume in use | 9 FAILED_PRECONDITION | Indicates that the volume corresponding to the specified `volume_id` could not be expanded because it is node-published or node-staged and the underlying filesystem does not support expansion of published or staged volumes. | Caller MUST NOT retry. | | Unsupported capacity_range | 11 OUT_OF_RANGE | Indicates that the capacity range is not allowed by the Plugin. More human-readable information MAY be provided in the gRPC `status.message` field. | Caller MUST fix the capacity range before retrying. | +### Group Controller Service RPCs + +#### `GroupControllerGetCapabilities` + +A GroupController Plugin MUST implement this RPC call. This RPC allows the CO to check the supported capabilities of group controller service provided by the Plugin. + +```protobuf +message GroupControllerGetCapabilitiesRequest { + // Intentionally empty. +} + +message GroupControllerGetCapabilitiesResponse { + // All the capabilities that the group controller service supports. + // This field is OPTIONAL. + repeated GroupControllerServiceCapability capabilities = 1; +} + +// Specifies a capability of the group controller service. +message GroupControllerServiceCapability { + message RPC { + enum Type { + UNKNOWN = 0; + + // Indicates that the group controller plugin supports + // creating, deleting, and getting details of a volume + // group snapshot. + CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT = 1 + [(alpha_enum_value) = true]; + } + + Type type = 1; + } + + oneof type { + // RPC that the controller supports. + RPC rpc = 1; + } +} +``` + +##### GroupControllerGetCapabilities Errors + +If the plugin is unable to complete the GroupControllerGetCapabilities call successfully, it MUST return a non-ok gRPC code in the gRPC status. + +#### `CreateVolumeGroupSnapshot` + +**ALPHA FEATURE** + +A Group Controller Plugin MUST implement this RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` controller capability. +This RPC will be called by the CO to create a new volume group snapshot from a list of source volumes on behalf of a user. + +The purpose of this call is to request the creation of a multi-volume snapshot. Group snapshots can be created from the existing list of volumes. Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name - the group snapshot must only be created once. + +If a group snapshot corresponding to the specified group snapshot `name` is successfully created (meaning all snapshots associated with the group are successfully cut), the Plugin MUST reply `0 OK` with the corresponding `CreateVolumeGroupSnapshotResponse`. + +If an error occurs before a group snapshot is cut, `CreateVolumeGroupSnapshot` SHOULD return a corresponding gRPC error code that reflects the error condition. + +`CreateVolumeGroupSnapshot` SHOULD return `0 OK` after all the snapshots are cut regardless of whether post processing such as uploading is complete or not. + +CO SHOULD check the `ready_to_use` boolean of individual snapshots that are members of the group snapshot and only treat the group snapshot as ready to use when all snapshots have been "processed" and is ready to use to create new volumes from those snapshots. + +An individual snapshot MAY be used as the source to provision a new volume. + +In VolumeGroupSnapshot message, both snapshots and group_snapshot_id are required fields. + +If an error occurs before all the individual snapshots are created when creating a group snapshot of multiple volumes and a group_snapshot_id is not yet available for CO to do clean up, SP SHOULD do clean up and make sure no snapshots are leaked. + +```protobuf +message CreateVolumeGroupSnapshotRequest { + option (alpha_message) = true; + + // The suggested name for the group snapshot. This field is REQUIRED + // for idempotency. + // Any Unicode string that conforms to the length limit is allowed + // except those containing the following banned characters: + // U+0000-U+0008, U+000B, U+000C, U+000E-U+001F, U+007F-U+009F. + // (These are control characters other than commonly used whitespace.) + string name = 1; + + // volume ids of the source volumes to be snapshotted together. + // This field is REQUIRED. + repeated string source_volume_ids = 2; + + // Secrets required by plugin to complete + // ControllerCreateVolumeGroupSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerDeleteVolumeGroupSnapshot + // and ControllerGetVolumeGroupSnapshot requests for the same + // group snapshot unless if secrets are rotated after the + // group snapshot is created. + map secrets = 3 [(csi_secret) = true]; + + // Volume secrets required by plugin to complete volume group + // snapshot creation request. This field is needed in case the + // volume level secrets are different from the above secrets + // for the group snapshot. + // This field is OPTIONAL. + repeated VolumeSecret volume_secrets = 4; + + // Plugin specific parameters passed in as opaque key-value pairs. + // This field is OPTIONAL. The Plugin is responsible for parsing and + // validating these parameters. COs will treat these as opaque. + map parameters = 5; +} + +message VolumeSecret { + // ID of the volume whose secrets are provided. + // This field is REQUIRED. + string volume_id = 1; + + // Secrets required by plugin for a volume operation. + // This field is REQUIRED. Refer to the `Secrets Requirements` + // section on how to use this field. + map secrets = 2 [(.csi.v1.csi_secret) = true]; +} + +message CreateVolumeGroupSnapshotResponse { + option (alpha_message) = true; + + // Contains all attributes of the newly created group snapshot. + // This field is REQUIRED. + VolumeGroupSnapshot group_snapshot = 1; +} + +message VolumeGroupSnapshot { + option (alpha_message) = true; + + // The identifier for this group snapshot, generated by the plugin. + // This field MUST contain enough information to uniquely identify + // this specific snapshot vs all other group snapshots supported by + // this plugin. + // This field SHALL be used by the CO in subsequent calls to refer to + // this group snapshot. + // The SP is NOT responsible for global uniqueness of + // group_snapshot_id across multiple SPs. + // This field is REQUIRED. + string group_snapshot_id = 1; + + // A list of snapshots created. + // This field is REQUIRED. + repeated Snapshot snapshots = 2; + + // Timestamp when the volume group snapshot is taken. + // This field is REQUIRED. + .google.protobuf.Timestamp creation_time = 3; +} +``` + +##### CreateVolumeGroupSnapshot Errors + +If the plugin is unable to complete the CreateVolumeGroupSnapshot call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Group snapshot already exists but is incompatible | 6 ALREADY_EXISTS | Indicates that a group snapshot corresponding to the specified group snapshot `name` already exists but is incompatible with the specified `volume_id`. | Caller MUST fix the arguments or use a different `name` before retrying. | +| Not enough space to create group snapshot | 13 RESOURCE_EXHAUSTED | There is not enough space on the storage system to handle the create group snapshot request. | Caller SHOULD fail this request. Future calls to CreateVolumeGroupSnapshot MAY succeed if space is freed up. | + +#### `DeleteVolumeGroupSnapshot` + +**ALPHA FEATURE** + +A Controller Plugin MUST implement this RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` capability. +This RPC will be called by the CO to delete a volume group snapshot. +This operation will delete a volume group snapshot as well as all individual snapshots that are part of this volume group snapshot. + +This operation MUST be idempotent. +If a group snapshot corresponding to the specified `group_snapshot_id` does not exist or the artifacts associated with the group snapshot do not exist anymore, the Plugin MUST reply `0 OK`. + +```protobuf +message DeleteVolumeGroupSnapshotRequest { + option (alpha_message) = true; + + // The ID of the group snapshot to be deleted. + // This field is REQUIRED. + string group_snapshot_id = 1; + + // A list of snapshot ids that are part of this group snapshot. + // Some SPs require this list to delete the snapshots in the group. + // This field is REQUIRED. + repeated string snapshot_ids = 2; + + // Secrets required by plugin to complete group snapshot deletion + // request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerCreateVolumeGroupSnapshot + // request for the same group snapshot unless if secrets are rotated + // after the group snapshot is created. + // The secrets provided in the field SHOULD be passed to both + // the group snapshot and the individual snapshot members if needed. + map secrets = 3 [(csi_secret) = true]; +} + +message DeleteVolumeGroupSnapshotResponse { + // Intentionally empty. +} +``` + +##### DeleteVolumeGroupSnapshot Errors + +If the plugin is unable to complete the DeleteVolumeGroupSnapshot call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Volume group snapshot in use | 9 FAILED_PRECONDITION | Indicates that the volume group snapshot corresponding to the specified `group_snapshot_id` could not be deleted because it is in use by another resource. | Caller SHOULD ensure that there are no other resources using the volume group snapshot, and then retry with exponential back off. | + +#### `ControllerGetVolumeGroupSnapshot` + +**ALPHA FEATURE** + +This optional RPC MAY be called by the CO to fetch current information about a volume group snapshot. + +A Controller Plugin MUST implement this `ControllerGetVolumeGroupSnapshot` RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` capability. + +`ControllerGetVolumeGroupSnapshot` SHALL NOT show a group snapshot that is being created but has not been created successfully yet. +`ControllerGetVolumeGroupSnapshotResponse` should contain current information of a volume group snapshot if it exists. +If the volume group snapshot does not exist any more, `ControllerGetVolumeGroupSnapshot` should return gRPC error code `NOT_FOUND`. + +```protobuf +message ControllerGetVolumeGroupSnapshotRequest { + option (alpha_message) = true; + + // The ID of the group snapshot to fetch current group snapshot + // information for. + // This field is REQUIRED. + string group_snapshot_id = 1; + + // Secrets required by plugin to complete + // ControllerGetVolumeGroupSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + // The secrets provided in this field SHOULD be the same as + // the secrets provided in ControllerCreateVolumeGroupSnapshot + // request for the same group snapshot unless if secrets are rotated + // after the group snapshot is created. + map secrets = 2 [(csi_secret) = true]; +} + +message ControllerGetVolumeGroupSnapshotResponse { + option (alpha_message) = true; + + // This field is REQUIRED + VolumeGroupSnapshot group_snapshot = 1; +} +``` + +##### ControllerGetVolumeGroupSnapshot Errors + +If the plugin is unable to complete the ControllerGetVolumeGroupSnapshot call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Volume group snapshot does not exist | 5 NOT_FOUND | Indicates that a volume group snapshot corresponding to the specified `volume_group_snapshot_id` does not exist. | Caller MUST verify that the `volume_group_snapshot_id` is correct and that the volume group snapshot is accessible and has not been deleted before retrying with exponential back off. | + ## Protocol ### Connectivity From b3e48c6e38be7c1aeea5149f5b75b8e3dd23a6d9 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Tue, 24 Jan 2023 22:39:46 +0000 Subject: [PATCH 02/13] Add FAILED_PRECONDITION --- spec.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spec.md b/spec.md index ca34727c..d993baad 100644 --- a/spec.md +++ b/spec.md @@ -2939,6 +2939,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| | Group snapshot already exists but is incompatible | 6 ALREADY_EXISTS | Indicates that a group snapshot corresponding to the specified group snapshot `name` already exists but is incompatible with the specified `volume_id`. | Caller MUST fix the arguments or use a different `name` before retrying. | +| Cannot snapshot multiple volumes together | 9 FAILED_PRECONDITION | Indicates that the specified volumes cannot be snapshotted together because the volumes are not configured properly based on requirements from the SP. | Caller MUST fix the configuration of the volumes so that they meet the requirements for group snapshotting before retrying. | | Not enough space to create group snapshot | 13 RESOURCE_EXHAUSTED | There is not enough space on the storage system to handle the create group snapshot request. | Caller SHOULD fail this request. Future calls to CreateVolumeGroupSnapshot MAY succeed if space is freed up. | #### `DeleteVolumeGroupSnapshot` From 265314432f01afc98f98bd159994e2df60e5f3e3 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Thu, 26 Jan 2023 22:37:35 +0000 Subject: [PATCH 03/13] Address review comments --- csi.proto | 59 +--- lib/go/csi/csi.pb.go | 743 +++++++++++++++++++------------------------ spec.md | 75 ++--- 3 files changed, 373 insertions(+), 504 deletions(-) diff --git a/csi.proto b/csi.proto index 7cb9f9ee..9a81c8d2 100644 --- a/csi.proto +++ b/csi.proto @@ -119,9 +119,9 @@ service GroupController { option (alpha_method) = true; } - rpc ControllerGetVolumeGroupSnapshot( - ControllerGetVolumeGroupSnapshotRequest) - returns (ControllerGetVolumeGroupSnapshotResponse) { + rpc GetVolumeGroupSnapshot( + GetVolumeGroupSnapshotRequest) + returns (GetVolumeGroupSnapshotResponse) { option (alpha_method) = true; } } @@ -1720,7 +1720,7 @@ message CreateVolumeGroupSnapshotRequest { // (These are control characters other than commonly used whitespace.) string name = 1; - // volume ids of the source volumes to be snapshotted together. + // volume IDs of the source volumes to be snapshotted together. // This field is REQUIRED. repeated string source_volume_ids = 2; @@ -1728,35 +1728,14 @@ message CreateVolumeGroupSnapshotRequest { // ControllerCreateVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerDeleteVolumeGroupSnapshot - // and ControllerGetVolumeGroupSnapshot requests for the same - // group snapshot unless if secrets are rotated after the - // group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. map secrets = 3 [(csi_secret) = true]; - // Volume secrets required by plugin to complete volume group - // snapshot creation request. This field is needed in case the - // volume level secrets are different from the above secrets - // for the group snapshot. - // This field is OPTIONAL. - repeated VolumeSecret volume_secrets = 4; - // Plugin specific parameters passed in as opaque key-value pairs. // This field is OPTIONAL. The Plugin is responsible for parsing and // validating these parameters. COs will treat these as opaque. - map parameters = 5; -} - -message VolumeSecret { - // ID of the volume whose secrets are provided. - // This field is REQUIRED. - string volume_id = 1; - - // Secrets required by plugin for a volume operation. - // This field is REQUIRED. Refer to the `Secrets Requirements` - // section on how to use this field. - map secrets = 2 [(.csi.v1.csi_secret) = true]; + map parameters = 4; } message CreateVolumeGroupSnapshotResponse { @@ -1781,11 +1760,11 @@ message VolumeGroupSnapshot { // This field is REQUIRED. string group_snapshot_id = 1; - // A list of snapshots created. + // A list of snapshots belonging to this group. // This field is REQUIRED. repeated Snapshot snapshots = 2; - // Timestamp when the volume group snapshot is taken. + // Timestamp of when the volume group snapshot was taken. // This field is REQUIRED. .google.protobuf.Timestamp creation_time = 3; } @@ -1796,7 +1775,7 @@ message DeleteVolumeGroupSnapshotRequest { // This field is REQUIRED. string group_snapshot_id = 1; - // A list of snapshot ids that are part of this group snapshot. + // A list of snapshot IDs that are part of this group snapshot. // Some SPs require this list to delete the snapshots in the group. // This field is REQUIRED. repeated string snapshot_ids = 2; @@ -1805,10 +1784,8 @@ message DeleteVolumeGroupSnapshotRequest { // request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerCreateVolumeGroupSnapshot - // request for the same group snapshot unless if secrets are rotated - // after the group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. // The secrets provided in the field SHOULD be passed to both // the group snapshot and the individual snapshot members if needed. map secrets = 3 [(csi_secret) = true]; @@ -1817,7 +1794,7 @@ message DeleteVolumeGroupSnapshotRequest { message DeleteVolumeGroupSnapshotResponse { // Intentionally empty. } -message ControllerGetVolumeGroupSnapshotRequest { +message GetVolumeGroupSnapshotRequest { option (alpha_message) = true; // The ID of the group snapshot to fetch current group snapshot @@ -1826,17 +1803,15 @@ message ControllerGetVolumeGroupSnapshotRequest { string group_snapshot_id = 1; // Secrets required by plugin to complete - // ControllerGetVolumeGroupSnapshot request. + // GetVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerCreateVolumeGroupSnapshot - // request for the same group snapshot unless if secrets are rotated - // after the group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. map secrets = 2 [(csi_secret) = true]; } -message ControllerGetVolumeGroupSnapshotResponse { +message GetVolumeGroupSnapshotResponse { option (alpha_message) = true; // This field is REQUIRED diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index c2c18305..f8002b50 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -5158,29 +5158,20 @@ type CreateVolumeGroupSnapshotRequest struct { // U+0000-U+0008, U+000B, U+000C, U+000E-U+001F, U+007F-U+009F. // (These are control characters other than commonly used whitespace.) Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // volume ids of the source volumes to be snapshotted together. + // volume IDs of the source volumes to be snapshotted together. // This field is REQUIRED. SourceVolumeIds []string `protobuf:"bytes,2,rep,name=source_volume_ids,json=sourceVolumeIds,proto3" json:"source_volume_ids,omitempty"` // Secrets required by plugin to complete // ControllerCreateVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerDeleteVolumeGroupSnapshot - // and ControllerGetVolumeGroupSnapshot requests for the same - // group snapshot unless if secrets are rotated after the - // group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Volume secrets required by plugin to complete volume group - // snapshot creation request. This field is needed in case the - // volume level secrets are different from the above secrets - // for the group snapshot. - // This field is OPTIONAL. - VolumeSecrets []*VolumeSecret `protobuf:"bytes,4,rep,name=volume_secrets,json=volumeSecrets,proto3" json:"volume_secrets,omitempty"` // Plugin specific parameters passed in as opaque key-value pairs. // This field is OPTIONAL. The Plugin is responsible for parsing and // validating these parameters. COs will treat these as opaque. - Parameters map[string]string `protobuf:"bytes,5,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -5232,13 +5223,6 @@ func (m *CreateVolumeGroupSnapshotRequest) GetSecrets() map[string]string { return nil } -func (m *CreateVolumeGroupSnapshotRequest) GetVolumeSecrets() []*VolumeSecret { - if m != nil { - return m.VolumeSecrets - } - return nil -} - func (m *CreateVolumeGroupSnapshotRequest) GetParameters() map[string]string { if m != nil { return m.Parameters @@ -5246,58 +5230,6 @@ func (m *CreateVolumeGroupSnapshotRequest) GetParameters() map[string]string { return nil } -type VolumeSecret struct { - // ID of the volume whose secrets are provided. - // This field is REQUIRED. - VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - // Secrets required by plugin for a volume operation. - // This field is REQUIRED. Refer to the `Secrets Requirements` - // section on how to use this field. - Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *VolumeSecret) Reset() { *m = VolumeSecret{} } -func (m *VolumeSecret) String() string { return proto.CompactTextString(m) } -func (*VolumeSecret) ProtoMessage() {} -func (*VolumeSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{64} -} - -func (m *VolumeSecret) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_VolumeSecret.Unmarshal(m, b) -} -func (m *VolumeSecret) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_VolumeSecret.Marshal(b, m, deterministic) -} -func (m *VolumeSecret) XXX_Merge(src proto.Message) { - xxx_messageInfo_VolumeSecret.Merge(m, src) -} -func (m *VolumeSecret) XXX_Size() int { - return xxx_messageInfo_VolumeSecret.Size(m) -} -func (m *VolumeSecret) XXX_DiscardUnknown() { - xxx_messageInfo_VolumeSecret.DiscardUnknown(m) -} - -var xxx_messageInfo_VolumeSecret proto.InternalMessageInfo - -func (m *VolumeSecret) GetVolumeId() string { - if m != nil { - return m.VolumeId - } - return "" -} - -func (m *VolumeSecret) GetSecrets() map[string]string { - if m != nil { - return m.Secrets - } - return nil -} - type CreateVolumeGroupSnapshotResponse struct { // Contains all attributes of the newly created group snapshot. // This field is REQUIRED. @@ -5311,7 +5243,7 @@ func (m *CreateVolumeGroupSnapshotResponse) Reset() { *m = CreateVolumeG func (m *CreateVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } func (*CreateVolumeGroupSnapshotResponse) ProtoMessage() {} func (*CreateVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{65} + return fileDescriptor_9cdb00adce470e01, []int{64} } func (m *CreateVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { @@ -5350,10 +5282,10 @@ type VolumeGroupSnapshot struct { // group_snapshot_id across multiple SPs. // This field is REQUIRED. GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` - // A list of snapshots created. + // A list of snapshots belonging to this group. // This field is REQUIRED. Snapshots []*Snapshot `protobuf:"bytes,2,rep,name=snapshots,proto3" json:"snapshots,omitempty"` - // Timestamp when the volume group snapshot is taken. + // Timestamp of when the volume group snapshot was taken. // This field is REQUIRED. CreationTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -5365,7 +5297,7 @@ func (m *VolumeGroupSnapshot) Reset() { *m = VolumeGroupSnapshot{} } func (m *VolumeGroupSnapshot) String() string { return proto.CompactTextString(m) } func (*VolumeGroupSnapshot) ProtoMessage() {} func (*VolumeGroupSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{66} + return fileDescriptor_9cdb00adce470e01, []int{65} } func (m *VolumeGroupSnapshot) XXX_Unmarshal(b []byte) error { @@ -5411,7 +5343,7 @@ type DeleteVolumeGroupSnapshotRequest struct { // The ID of the group snapshot to be deleted. // This field is REQUIRED. GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` - // A list of snapshot ids that are part of this group snapshot. + // A list of snapshot IDs that are part of this group snapshot. // Some SPs require this list to delete the snapshots in the group. // This field is REQUIRED. SnapshotIds []string `protobuf:"bytes,2,rep,name=snapshot_ids,json=snapshotIds,proto3" json:"snapshot_ids,omitempty"` @@ -5419,10 +5351,8 @@ type DeleteVolumeGroupSnapshotRequest struct { // request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerCreateVolumeGroupSnapshot - // request for the same group snapshot unless if secrets are rotated - // after the group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. // The secrets provided in the field SHOULD be passed to both // the group snapshot and the individual snapshot members if needed. Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -5435,7 +5365,7 @@ func (m *DeleteVolumeGroupSnapshotRequest) Reset() { *m = DeleteVolumeGr func (m *DeleteVolumeGroupSnapshotRequest) String() string { return proto.CompactTextString(m) } func (*DeleteVolumeGroupSnapshotRequest) ProtoMessage() {} func (*DeleteVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{67} + return fileDescriptor_9cdb00adce470e01, []int{66} } func (m *DeleteVolumeGroupSnapshotRequest) XXX_Unmarshal(b []byte) error { @@ -5487,7 +5417,7 @@ func (m *DeleteVolumeGroupSnapshotResponse) Reset() { *m = DeleteVolumeG func (m *DeleteVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } func (*DeleteVolumeGroupSnapshotResponse) ProtoMessage() {} func (*DeleteVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{68} + return fileDescriptor_9cdb00adce470e01, []int{67} } func (m *DeleteVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { @@ -5508,67 +5438,63 @@ func (m *DeleteVolumeGroupSnapshotResponse) XXX_DiscardUnknown() { var xxx_messageInfo_DeleteVolumeGroupSnapshotResponse proto.InternalMessageInfo -type ControllerGetVolumeGroupSnapshotRequest struct { +type GetVolumeGroupSnapshotRequest struct { // The ID of the group snapshot to fetch current group snapshot // information for. // This field is REQUIRED. GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` // Secrets required by plugin to complete - // ControllerGetVolumeGroupSnapshot request. + // GetVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerCreateVolumeGroupSnapshot - // request for the same group snapshot unless if secrets are rotated - // after the group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *ControllerGetVolumeGroupSnapshotRequest) Reset() { - *m = ControllerGetVolumeGroupSnapshotRequest{} -} -func (m *ControllerGetVolumeGroupSnapshotRequest) String() string { return proto.CompactTextString(m) } -func (*ControllerGetVolumeGroupSnapshotRequest) ProtoMessage() {} -func (*ControllerGetVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{69} +func (m *GetVolumeGroupSnapshotRequest) Reset() { *m = GetVolumeGroupSnapshotRequest{} } +func (m *GetVolumeGroupSnapshotRequest) String() string { return proto.CompactTextString(m) } +func (*GetVolumeGroupSnapshotRequest) ProtoMessage() {} +func (*GetVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{68} } -func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Unmarshal(m, b) +func (m *GetVolumeGroupSnapshotRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetVolumeGroupSnapshotRequest.Unmarshal(m, b) } -func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Marshal(b, m, deterministic) +func (m *GetVolumeGroupSnapshotRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetVolumeGroupSnapshotRequest.Marshal(b, m, deterministic) } -func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Merge(m, src) +func (m *GetVolumeGroupSnapshotRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetVolumeGroupSnapshotRequest.Merge(m, src) } -func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_Size() int { - return xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.Size(m) +func (m *GetVolumeGroupSnapshotRequest) XXX_Size() int { + return xxx_messageInfo_GetVolumeGroupSnapshotRequest.Size(m) } -func (m *ControllerGetVolumeGroupSnapshotRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest.DiscardUnknown(m) +func (m *GetVolumeGroupSnapshotRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetVolumeGroupSnapshotRequest.DiscardUnknown(m) } -var xxx_messageInfo_ControllerGetVolumeGroupSnapshotRequest proto.InternalMessageInfo +var xxx_messageInfo_GetVolumeGroupSnapshotRequest proto.InternalMessageInfo -func (m *ControllerGetVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { +func (m *GetVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { if m != nil { return m.GroupSnapshotId } return "" } -func (m *ControllerGetVolumeGroupSnapshotRequest) GetSecrets() map[string]string { +func (m *GetVolumeGroupSnapshotRequest) GetSecrets() map[string]string { if m != nil { return m.Secrets } return nil } -type ControllerGetVolumeGroupSnapshotResponse struct { +type GetVolumeGroupSnapshotResponse struct { // This field is REQUIRED GroupSnapshot *VolumeGroupSnapshot `protobuf:"bytes,1,opt,name=group_snapshot,json=groupSnapshot,proto3" json:"group_snapshot,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -5576,34 +5502,32 @@ type ControllerGetVolumeGroupSnapshotResponse struct { XXX_sizecache int32 `json:"-"` } -func (m *ControllerGetVolumeGroupSnapshotResponse) Reset() { - *m = ControllerGetVolumeGroupSnapshotResponse{} -} -func (m *ControllerGetVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } -func (*ControllerGetVolumeGroupSnapshotResponse) ProtoMessage() {} -func (*ControllerGetVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cdb00adce470e01, []int{70} +func (m *GetVolumeGroupSnapshotResponse) Reset() { *m = GetVolumeGroupSnapshotResponse{} } +func (m *GetVolumeGroupSnapshotResponse) String() string { return proto.CompactTextString(m) } +func (*GetVolumeGroupSnapshotResponse) ProtoMessage() {} +func (*GetVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cdb00adce470e01, []int{69} } -func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Unmarshal(m, b) +func (m *GetVolumeGroupSnapshotResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetVolumeGroupSnapshotResponse.Unmarshal(m, b) } -func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Marshal(b, m, deterministic) +func (m *GetVolumeGroupSnapshotResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetVolumeGroupSnapshotResponse.Marshal(b, m, deterministic) } -func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Merge(m, src) +func (m *GetVolumeGroupSnapshotResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetVolumeGroupSnapshotResponse.Merge(m, src) } -func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_Size() int { - return xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.Size(m) +func (m *GetVolumeGroupSnapshotResponse) XXX_Size() int { + return xxx_messageInfo_GetVolumeGroupSnapshotResponse.Size(m) } -func (m *ControllerGetVolumeGroupSnapshotResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse.DiscardUnknown(m) +func (m *GetVolumeGroupSnapshotResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetVolumeGroupSnapshotResponse.DiscardUnknown(m) } -var xxx_messageInfo_ControllerGetVolumeGroupSnapshotResponse proto.InternalMessageInfo +var xxx_messageInfo_GetVolumeGroupSnapshotResponse proto.InternalMessageInfo -func (m *ControllerGetVolumeGroupSnapshotResponse) GetGroupSnapshot() *VolumeGroupSnapshot { +func (m *GetVolumeGroupSnapshotResponse) GetGroupSnapshot() *VolumeGroupSnapshot { if m != nil { return m.GroupSnapshot } @@ -5790,16 +5714,14 @@ func init() { proto.RegisterType((*CreateVolumeGroupSnapshotRequest)(nil), "csi.v1.CreateVolumeGroupSnapshotRequest") proto.RegisterMapType((map[string]string)(nil), "csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry") proto.RegisterMapType((map[string]string)(nil), "csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry") - proto.RegisterType((*VolumeSecret)(nil), "csi.v1.VolumeSecret") - proto.RegisterMapType((map[string]string)(nil), "csi.v1.VolumeSecret.SecretsEntry") proto.RegisterType((*CreateVolumeGroupSnapshotResponse)(nil), "csi.v1.CreateVolumeGroupSnapshotResponse") proto.RegisterType((*VolumeGroupSnapshot)(nil), "csi.v1.VolumeGroupSnapshot") proto.RegisterType((*DeleteVolumeGroupSnapshotRequest)(nil), "csi.v1.DeleteVolumeGroupSnapshotRequest") proto.RegisterMapType((map[string]string)(nil), "csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry") proto.RegisterType((*DeleteVolumeGroupSnapshotResponse)(nil), "csi.v1.DeleteVolumeGroupSnapshotResponse") - proto.RegisterType((*ControllerGetVolumeGroupSnapshotRequest)(nil), "csi.v1.ControllerGetVolumeGroupSnapshotRequest") - proto.RegisterMapType((map[string]string)(nil), "csi.v1.ControllerGetVolumeGroupSnapshotRequest.SecretsEntry") - proto.RegisterType((*ControllerGetVolumeGroupSnapshotResponse)(nil), "csi.v1.ControllerGetVolumeGroupSnapshotResponse") + proto.RegisterType((*GetVolumeGroupSnapshotRequest)(nil), "csi.v1.GetVolumeGroupSnapshotRequest") + proto.RegisterMapType((map[string]string)(nil), "csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry") + proto.RegisterType((*GetVolumeGroupSnapshotResponse)(nil), "csi.v1.GetVolumeGroupSnapshotResponse") proto.RegisterExtension(E_AlphaEnum) proto.RegisterExtension(E_AlphaEnumValue) proto.RegisterExtension(E_CsiSecret) @@ -5814,271 +5736,268 @@ func init() { } var fileDescriptor_9cdb00adce470e01 = []byte{ - // 4210 bytes of a gzipped FileDescriptorProto + // 4164 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x4d, 0x6c, 0x1b, 0x49, - 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xd3, 0x8f, 0xa9, 0xd2, 0x8f, 0xe9, 0x96, 0x6c, 0x4b, 0xed, 0xb1, - 0xad, 0xf1, 0xd8, 0xf4, 0x8c, 0x77, 0x66, 0xb0, 0x23, 0x7b, 0x76, 0x4d, 0x4a, 0xb4, 0xc4, 0xb5, - 0x4c, 0x69, 0x9b, 0x94, 0xbd, 0xf6, 0x66, 0xd0, 0xd3, 0x22, 0x4b, 0x72, 0x63, 0xc8, 0x6e, 0x4e, - 0x77, 0x53, 0xb1, 0xf6, 0x92, 0x64, 0x83, 0x00, 0x9b, 0xe4, 0x12, 0x20, 0x08, 0x32, 0x39, 0x65, - 0x91, 0xe4, 0x12, 0x60, 0x17, 0x7b, 0x08, 0x16, 0x7b, 0x0c, 0x90, 0x5b, 0x02, 0x04, 0x9b, 0x63, - 0x90, 0xcb, 0x1e, 0x02, 0xe4, 0xb0, 0x98, 0x00, 0x03, 0xe4, 0x96, 0x43, 0x10, 0x74, 0x55, 0x75, - 0xb3, 0xfa, 0x97, 0xa4, 0x25, 0x67, 0x02, 0xec, 0xc9, 0xea, 0xaa, 0x57, 0xaf, 0x5e, 0x55, 0xbd, - 0xf7, 0xea, 0xbd, 0xef, 0x15, 0x0d, 0x1f, 0x1c, 0x6b, 0xf6, 0xcb, 0xde, 0x61, 0xb1, 0x69, 0x74, - 0xee, 0x36, 0x0d, 0xdd, 0x56, 0x35, 0x1d, 0x9b, 0x77, 0x2c, 0xdb, 0x30, 0xd5, 0x63, 0x7c, 0x47, - 0xd3, 0x6d, 0x6c, 0x1e, 0xa9, 0x4d, 0x7c, 0xd7, 0xea, 0xe2, 0xe6, 0xdd, 0xa6, 0xa5, 0x15, 0xbb, - 0xa6, 0x61, 0x1b, 0x28, 0xe7, 0xfc, 0x79, 0xf2, 0x9e, 0xb8, 0x7a, 0x6c, 0x18, 0xc7, 0x6d, 0x7c, - 0x97, 0xb4, 0x1e, 0xf6, 0x8e, 0xee, 0xb6, 0xb0, 0xd5, 0x34, 0xb5, 0xae, 0x6d, 0x98, 0x94, 0x52, - 0xbc, 0x1a, 0xa4, 0xb0, 0xb5, 0x0e, 0xb6, 0x6c, 0xb5, 0xd3, 0x65, 0x04, 0x57, 0x82, 0x04, 0xbf, - 0x6d, 0xaa, 0xdd, 0x2e, 0x36, 0x2d, 0xda, 0x2f, 0x2d, 0xc1, 0xc2, 0x36, 0xb6, 0xf7, 0xdb, 0xbd, - 0x63, 0x4d, 0xaf, 0xea, 0x47, 0x86, 0x8c, 0x3f, 0xef, 0x61, 0xcb, 0x96, 0xfe, 0x55, 0x80, 0xc5, - 0x40, 0x87, 0xd5, 0x35, 0x74, 0x0b, 0x23, 0x04, 0x19, 0x5d, 0xed, 0xe0, 0x82, 0xb0, 0x2a, 0xac, - 0x4f, 0xca, 0xe4, 0x6f, 0x74, 0x1d, 0x66, 0x4f, 0xb0, 0xde, 0x32, 0x4c, 0xe5, 0x04, 0x9b, 0x96, - 0x66, 0xe8, 0x85, 0x14, 0xe9, 0x9d, 0xa1, 0xad, 0x4f, 0x69, 0x23, 0xda, 0x86, 0x89, 0x8e, 0xaa, - 0x6b, 0x47, 0xd8, 0xb2, 0x0b, 0xe9, 0xd5, 0xf4, 0xfa, 0xd4, 0xbd, 0x77, 0x8a, 0x74, 0xa9, 0xc5, - 0xc8, 0xb9, 0x8a, 0x4f, 0x18, 0x75, 0x45, 0xb7, 0xcd, 0x53, 0xd9, 0x1b, 0x2c, 0xde, 0x87, 0x19, - 0x5f, 0x17, 0xca, 0x43, 0xfa, 0x33, 0x7c, 0xca, 0x64, 0x72, 0xfe, 0x44, 0x0b, 0x90, 0x3d, 0x51, - 0xdb, 0x3d, 0xcc, 0x24, 0xa1, 0x1f, 0x1b, 0xa9, 0x6f, 0x0a, 0xd2, 0x15, 0x58, 0xf1, 0x66, 0xdb, - 0x54, 0xbb, 0xea, 0xa1, 0xd6, 0xd6, 0x6c, 0x0d, 0x5b, 0xee, 0xd2, 0x3f, 0x81, 0xcb, 0x31, 0xfd, - 0x6c, 0x07, 0x1e, 0xc0, 0x74, 0x93, 0x6b, 0x2f, 0x08, 0x64, 0x29, 0x05, 0x77, 0x29, 0x81, 0x91, - 0xa7, 0xb2, 0x8f, 0x5a, 0xfa, 0x32, 0x0d, 0xf9, 0x20, 0x09, 0x7a, 0x00, 0xe3, 0x16, 0x36, 0x4f, - 0xb4, 0x26, 0xdd, 0xd7, 0xa9, 0x7b, 0xab, 0x71, 0xdc, 0x8a, 0x75, 0x4a, 0xb7, 0x33, 0x26, 0xbb, - 0x43, 0xd0, 0x01, 0xe4, 0x4f, 0x8c, 0x76, 0xaf, 0x83, 0x15, 0xfc, 0xaa, 0xab, 0xea, 0xde, 0x01, - 0x4c, 0xdd, 0x5b, 0x8f, 0x65, 0xf3, 0x94, 0x0c, 0xa8, 0xb8, 0xf4, 0x3b, 0x63, 0xf2, 0x85, 0x13, - 0x7f, 0x93, 0xf8, 0x73, 0x01, 0xc6, 0xd9, 0x6c, 0xe8, 0x23, 0xc8, 0xd8, 0xa7, 0x5d, 0x2a, 0xdd, - 0xec, 0xbd, 0xeb, 0x83, 0xa4, 0x2b, 0x36, 0x4e, 0xbb, 0x58, 0x26, 0x43, 0x24, 0x03, 0x32, 0xce, - 0x17, 0x9a, 0x82, 0xf1, 0x83, 0xda, 0xe3, 0xda, 0xde, 0xb3, 0x5a, 0x7e, 0x0c, 0x2d, 0x01, 0xda, - 0xdc, 0xab, 0x35, 0xe4, 0xbd, 0xdd, 0xdd, 0x8a, 0xac, 0xd4, 0x2b, 0xf2, 0xd3, 0xea, 0x66, 0x25, - 0x2f, 0xa0, 0xb7, 0x60, 0xf5, 0xe9, 0xde, 0xee, 0xc1, 0x93, 0x8a, 0x52, 0xda, 0xdc, 0xac, 0xd4, - 0xeb, 0xd5, 0x72, 0x75, 0xb7, 0xda, 0x78, 0xae, 0x6c, 0xee, 0xd5, 0xea, 0x0d, 0xb9, 0x54, 0xad, - 0x35, 0xea, 0xf9, 0x14, 0x5a, 0x81, 0xc2, 0xb6, 0xbc, 0x77, 0xb0, 0xaf, 0x44, 0xf0, 0x48, 0x8b, - 0x3f, 0x14, 0xe0, 0x42, 0x60, 0x79, 0xa8, 0xe4, 0x93, 0xff, 0xce, 0xb0, 0xdb, 0xc2, 0xaf, 0xe3, - 0x76, 0xd4, 0x3a, 0x00, 0x72, 0x7b, 0xb5, 0xdd, 0x6a, 0xcd, 0x91, 0x7d, 0x0a, 0xc6, 0xf7, 0x1e, - 0x3d, 0x22, 0x1f, 0xa9, 0x72, 0x8e, 0x4e, 0x28, 0xcd, 0xc2, 0xf4, 0xbe, 0x69, 0x1c, 0x62, 0x57, - 0xbb, 0x4a, 0x30, 0xc3, 0xbe, 0x99, 0x36, 0xbd, 0x0b, 0x59, 0x13, 0xab, 0xad, 0x53, 0x76, 0xf0, - 0x62, 0x91, 0x5a, 0x6c, 0xd1, 0xb5, 0xd8, 0x62, 0xd9, 0x30, 0xda, 0x4f, 0x1d, 0xed, 0x95, 0x29, - 0xa1, 0xf4, 0x55, 0x06, 0xe6, 0x37, 0x4d, 0xac, 0xda, 0x98, 0x4a, 0xcb, 0x58, 0x47, 0x5a, 0xe6, - 0x03, 0x98, 0x75, 0xb4, 0xaf, 0xa9, 0xd9, 0xa7, 0x8a, 0xa9, 0xea, 0xc7, 0x98, 0x29, 0xc6, 0xa2, - 0xbb, 0x03, 0x9b, 0xac, 0x57, 0x76, 0x3a, 0xe5, 0x99, 0x26, 0xff, 0x89, 0xaa, 0x30, 0xcf, 0x14, - 0xcb, 0xa7, 0xf0, 0x69, 0xbf, 0xc2, 0x53, 0x29, 0x38, 0x85, 0x47, 0x27, 0xfe, 0x16, 0x0d, 0x5b, - 0xe8, 0x31, 0x40, 0x57, 0x35, 0xd5, 0x0e, 0xb6, 0xb1, 0x69, 0x15, 0x32, 0x7e, 0xeb, 0x8f, 0x58, - 0x4d, 0x71, 0xdf, 0xa3, 0xa6, 0xd6, 0xcf, 0x0d, 0x47, 0xdb, 0x8e, 0xb9, 0x34, 0x4d, 0x6c, 0x5b, - 0x85, 0x2c, 0xe1, 0xb4, 0x9e, 0xc4, 0xa9, 0x4e, 0x49, 0x09, 0x9b, 0x72, 0xfa, 0x8b, 0xb2, 0x20, - 0xbb, 0xa3, 0xd1, 0x1e, 0x2c, 0xba, 0x0b, 0x34, 0x74, 0x1b, 0xeb, 0xb6, 0x62, 0x19, 0x3d, 0xb3, - 0x89, 0x0b, 0x39, 0xb2, 0x4b, 0xcb, 0x81, 0x25, 0x52, 0x9a, 0x3a, 0x21, 0x91, 0xd9, 0xd6, 0xf8, - 0x1a, 0xd1, 0x0b, 0x10, 0xd5, 0x66, 0x13, 0x5b, 0x96, 0x46, 0xf7, 0x42, 0x31, 0xf1, 0xe7, 0x3d, - 0xcd, 0xc4, 0x1d, 0xac, 0xdb, 0x56, 0x61, 0xdc, 0xcf, 0xb5, 0x61, 0x74, 0x8d, 0xb6, 0x71, 0x7c, - 0x2a, 0xf7, 0x69, 0xe4, 0x4b, 0xbe, 0xe1, 0x5c, 0x8f, 0x25, 0x7e, 0x0c, 0x17, 0x02, 0x9b, 0x32, - 0x8a, 0xdf, 0x13, 0x37, 0x60, 0x9a, 0xdf, 0x89, 0x91, 0x7c, 0xe6, 0x1f, 0xa7, 0x60, 0x3e, 0x62, - 0x0f, 0xd0, 0x0e, 0x4c, 0x58, 0xba, 0xda, 0xb5, 0x5e, 0x1a, 0x36, 0xd3, 0xdf, 0x5b, 0x09, 0x5b, - 0x56, 0xac, 0x33, 0x5a, 0xfa, 0xb9, 0x33, 0x26, 0x7b, 0xa3, 0x51, 0x19, 0x72, 0x74, 0x3f, 0x83, - 0x9e, 0x2b, 0x8a, 0x0f, 0x6d, 0xf3, 0xb8, 0xb0, 0x91, 0xe2, 0x7b, 0x30, 0xeb, 0x9f, 0x01, 0x5d, - 0x85, 0x29, 0x77, 0x06, 0x45, 0x6b, 0xb1, 0xb5, 0x82, 0xdb, 0x54, 0x6d, 0x89, 0xef, 0xc0, 0x34, - 0xcf, 0x0c, 0x2d, 0xc3, 0x24, 0x53, 0x08, 0x8f, 0x7c, 0x82, 0x36, 0x54, 0x5b, 0x9e, 0x4d, 0x7f, - 0x0b, 0x16, 0xfc, 0x7a, 0xc6, 0x4c, 0xf9, 0x86, 0xb7, 0x06, 0xba, 0x17, 0xb3, 0xfe, 0x35, 0xb8, - 0x72, 0x4a, 0x7f, 0x99, 0x85, 0x7c, 0xd0, 0x68, 0xd0, 0x03, 0xc8, 0x1e, 0xb6, 0x8d, 0xe6, 0x67, - 0x6c, 0xec, 0x5b, 0x71, 0xd6, 0x55, 0x2c, 0x3b, 0x54, 0xb4, 0x75, 0x67, 0x4c, 0xa6, 0x83, 0x9c, - 0xd1, 0x1d, 0xa3, 0xa7, 0xdb, 0x6c, 0xf7, 0xe2, 0x47, 0x3f, 0x71, 0xa8, 0xfa, 0xa3, 0xc9, 0x20, - 0xb4, 0x05, 0x53, 0x54, 0xed, 0x94, 0x8e, 0xd1, 0xc2, 0x85, 0x34, 0xe1, 0x71, 0x2d, 0x96, 0x47, - 0x89, 0xd0, 0x3e, 0x31, 0x5a, 0x58, 0x06, 0xd5, 0xfb, 0x5b, 0x9c, 0x81, 0x29, 0x4e, 0x36, 0xb1, - 0x07, 0x53, 0xdc, 0x64, 0xe8, 0x22, 0x8c, 0x1f, 0x59, 0x8a, 0xe7, 0x84, 0x27, 0xe5, 0xdc, 0x91, - 0x45, 0xfc, 0xe9, 0x55, 0x98, 0x22, 0x52, 0x28, 0x47, 0x6d, 0xf5, 0xd8, 0x2a, 0xa4, 0x56, 0xd3, - 0xce, 0x19, 0x91, 0xa6, 0x47, 0x4e, 0x0b, 0xba, 0x0d, 0xcc, 0xa1, 0x28, 0x94, 0xee, 0xd8, 0x34, - 0x7a, 0x5d, 0x22, 0xe4, 0xa4, 0xcc, 0x2e, 0x3e, 0x32, 0xd1, 0xb6, 0xd3, 0x2e, 0xfe, 0x5d, 0x0a, - 0xa0, 0x2f, 0x20, 0x7a, 0x00, 0x19, 0xb2, 0x26, 0xea, 0xf8, 0xd7, 0x87, 0x58, 0x53, 0x91, 0x2c, - 0x8c, 0x8c, 0x92, 0xfe, 0x43, 0x80, 0x0c, 0x61, 0x13, 0xbc, 0xbc, 0xea, 0xd5, 0xda, 0xf6, 0x6e, - 0x45, 0xa9, 0xed, 0x6d, 0x55, 0x94, 0x67, 0x72, 0xb5, 0x51, 0x91, 0xf3, 0x02, 0x5a, 0x86, 0x8b, - 0x7c, 0xbb, 0x5c, 0x29, 0x6d, 0x55, 0x64, 0x65, 0xaf, 0xb6, 0xfb, 0x3c, 0x9f, 0x42, 0x22, 0x2c, - 0x3d, 0x39, 0xd8, 0x6d, 0x54, 0xc3, 0x7d, 0x69, 0xe7, 0x3e, 0xe3, 0xfa, 0x18, 0x0f, 0xc6, 0x36, - 0xe3, 0xb0, 0xe5, 0x7a, 0xe9, 0x9f, 0xac, 0x33, 0x8b, 0x24, 0xb8, 0xc4, 0xcf, 0xe9, 0x1f, 0x9b, - 0x13, 0xd3, 0x3f, 0x2e, 0x0b, 0x68, 0x0d, 0x0a, 0x3c, 0x8d, 0x8f, 0xc3, 0x38, 0x21, 0x29, 0xcf, - 0x78, 0x1a, 0x40, 0x34, 0xfc, 0x19, 0xcc, 0xf8, 0x2e, 0x06, 0x27, 0xc2, 0x63, 0x9e, 0xac, 0xa5, - 0x1c, 0x9e, 0xda, 0x24, 0xea, 0x11, 0xd6, 0xd3, 0xf2, 0x8c, 0xdb, 0x5a, 0x76, 0x1a, 0x9d, 0xb3, - 0x6c, 0x6b, 0x1d, 0xcd, 0x66, 0x34, 0x29, 0x42, 0x03, 0xa4, 0x89, 0x10, 0x48, 0xbf, 0x4a, 0x41, - 0x8e, 0x29, 0xc4, 0x75, 0xee, 0x6a, 0xf2, 0xb1, 0x74, 0x5b, 0x29, 0x4b, 0x9f, 0x45, 0xa6, 0xfc, - 0x16, 0x89, 0x76, 0x60, 0x96, 0xf7, 0xdf, 0xaf, 0xdc, 0xb8, 0x72, 0xcd, 0x7f, 0xce, 0xbc, 0x13, - 0x79, 0xc5, 0xa2, 0xc9, 0x99, 0x13, 0xbe, 0x0d, 0x95, 0x61, 0x36, 0x70, 0x05, 0x64, 0x06, 0x5f, - 0x01, 0x33, 0x4d, 0x9f, 0x37, 0x2c, 0xc1, 0xbc, 0xeb, 0xbd, 0xdb, 0x58, 0xb1, 0x99, 0x77, 0x67, - 0x57, 0x54, 0x3e, 0xe4, 0xf5, 0x51, 0x9f, 0xd8, 0x6d, 0x13, 0x1f, 0x02, 0x0a, 0xcb, 0x3a, 0x92, - 0xab, 0xee, 0xc1, 0x7c, 0xc4, 0xbd, 0x82, 0x8a, 0x30, 0x49, 0x8e, 0xca, 0xd2, 0x6c, 0xcc, 0x22, - 0xd6, 0xb0, 0x44, 0x7d, 0x12, 0x87, 0xbe, 0x6b, 0xe2, 0x23, 0x6c, 0x9a, 0xb8, 0x45, 0x6c, 0x32, - 0x92, 0xde, 0x23, 0x91, 0x7e, 0x5f, 0x80, 0x09, 0xb7, 0x1d, 0x6d, 0xc0, 0x84, 0x85, 0x8f, 0xe9, - 0x9d, 0x47, 0xe7, 0xba, 0x12, 0x1c, 0x5b, 0xac, 0x33, 0x02, 0x16, 0xdb, 0xbb, 0xf4, 0x4e, 0x6c, - 0xef, 0xeb, 0x1a, 0x69, 0xf1, 0xbf, 0x10, 0x60, 0x7e, 0x0b, 0xb7, 0x71, 0x30, 0x34, 0x4a, 0x72, - 0xeb, 0x7c, 0x34, 0x91, 0xf2, 0x47, 0x13, 0x11, 0xac, 0x12, 0xa2, 0x89, 0x33, 0xdd, 0xb0, 0x4b, - 0xb0, 0xe0, 0x9f, 0x8d, 0xde, 0x29, 0xd2, 0x7f, 0xa6, 0xe1, 0x8a, 0xa3, 0x0b, 0xa6, 0xd1, 0x6e, - 0x63, 0x73, 0xbf, 0x77, 0xd8, 0xd6, 0xac, 0x97, 0x23, 0x2c, 0xee, 0x22, 0x8c, 0xeb, 0x46, 0x8b, - 0x33, 0x9e, 0x9c, 0xf3, 0x59, 0x6d, 0xa1, 0x0a, 0xcc, 0x05, 0x63, 0xbb, 0x53, 0xe6, 0xf9, 0xe3, - 0x23, 0xbb, 0xfc, 0x49, 0xf0, 0xda, 0x12, 0x61, 0xc2, 0x89, 0x4a, 0x0d, 0xbd, 0x7d, 0x4a, 0x2c, - 0x66, 0x42, 0xf6, 0xbe, 0x91, 0x1c, 0x0c, 0xd3, 0xbe, 0xe1, 0x85, 0x69, 0x89, 0x2b, 0x4a, 0x8a, - 0xd8, 0x3e, 0x0d, 0x59, 0x7c, 0x8e, 0xb0, 0xfe, 0x68, 0x48, 0xd6, 0x03, 0x3d, 0xc1, 0x59, 0x4e, - 0xf1, 0x1c, 0xcc, 0xf7, 0x9f, 0x04, 0xb8, 0x1a, 0xbb, 0x04, 0x16, 0x67, 0xb4, 0xe0, 0x42, 0x97, - 0x76, 0x78, 0x9b, 0x40, 0xad, 0xec, 0xfe, 0xc0, 0x4d, 0x60, 0x89, 0x35, 0x6b, 0xf5, 0x6d, 0xc3, - 0x6c, 0xd7, 0xd7, 0x28, 0x96, 0x60, 0x3e, 0x82, 0x6c, 0xa4, 0xc5, 0xfc, 0x5a, 0x80, 0xd5, 0xbe, - 0x28, 0x07, 0x7a, 0xf7, 0xfc, 0xd4, 0xb7, 0xd1, 0xd7, 0x2d, 0xea, 0xf2, 0x3f, 0x08, 0xaf, 0x3d, - 0x7a, 0xc2, 0x37, 0x65, 0xc1, 0xd7, 0x60, 0x2d, 0x61, 0x6a, 0x66, 0xce, 0xbf, 0xca, 0xc0, 0xda, - 0x53, 0xb5, 0xad, 0xb5, 0xbc, 0xe8, 0x31, 0x02, 0x82, 0x48, 0xde, 0x92, 0x66, 0xc8, 0x02, 0xa8, - 0xd7, 0x7a, 0xe0, 0x59, 0xed, 0x20, 0xfe, 0x43, 0x5c, 0x87, 0xe7, 0x98, 0xf9, 0x3d, 0x8f, 0xc8, - 0xfc, 0x3e, 0x1a, 0x5e, 0xd6, 0xa4, 0x3c, 0xf0, 0x20, 0xe8, 0x60, 0x3e, 0x1c, 0x9e, 0x6f, 0x82, - 0x16, 0x9c, 0xd9, 0x8a, 0xbf, 0xce, 0x54, 0xed, 0x1f, 0x32, 0x20, 0x25, 0xad, 0x9e, 0xf9, 0x10, - 0x19, 0x26, 0x9b, 0x86, 0x7e, 0xa4, 0x99, 0x1d, 0xdc, 0x62, 0x29, 0xc7, 0xfb, 0xc3, 0x6c, 0x1e, - 0x73, 0x20, 0x9b, 0xee, 0x58, 0xb9, 0xcf, 0x06, 0x15, 0x60, 0xbc, 0x83, 0x2d, 0x4b, 0x3d, 0x76, - 0xc5, 0x72, 0x3f, 0xc5, 0x9f, 0xa6, 0x61, 0xd2, 0x1b, 0x82, 0xf4, 0x90, 0x06, 0x53, 0xf7, 0xb5, - 0xfd, 0x3a, 0x02, 0xbc, 0xbe, 0x32, 0xa7, 0x5e, 0x43, 0x99, 0x5b, 0x3e, 0x65, 0xa6, 0xe6, 0xb0, - 0xf5, 0x5a, 0x62, 0x27, 0xe8, 0xf5, 0xd7, 0xae, 0x80, 0xd2, 0x6f, 0x01, 0xda, 0xd5, 0x2c, 0x96, - 0xba, 0x79, 0x6e, 0xc9, 0xc9, 0xd4, 0xd4, 0x57, 0x0a, 0xd6, 0x6d, 0x53, 0x63, 0xe1, 0x7a, 0x56, - 0x86, 0x8e, 0xfa, 0xaa, 0x42, 0x5b, 0x9c, 0x90, 0xde, 0xb2, 0x55, 0xd3, 0xd6, 0xf4, 0x63, 0xc5, - 0x36, 0x3e, 0xc3, 0x1e, 0x0e, 0xec, 0xb6, 0x36, 0x9c, 0x46, 0xe9, 0xcb, 0x14, 0xcc, 0xfb, 0xd8, - 0x33, 0x9d, 0xbc, 0x0f, 0xe3, 0x7d, 0xde, 0xbe, 0x30, 0x3e, 0x82, 0xba, 0x48, 0xb7, 0xcd, 0x1d, - 0x81, 0x2e, 0x03, 0xe8, 0xf8, 0x95, 0xed, 0x9b, 0x77, 0xd2, 0x69, 0x21, 0x73, 0x8a, 0x7f, 0x20, - 0x78, 0x99, 0xbe, 0xad, 0xda, 0x3d, 0x92, 0x55, 0x32, 0x17, 0x8d, 0x5b, 0x0a, 0xbb, 0x63, 0xe8, - 0xbc, 0x93, 0x72, 0xde, 0xeb, 0xa9, 0x91, 0xdb, 0xc6, 0x42, 0xdb, 0x1e, 0xc4, 0xda, 0x34, 0xf4, - 0x96, 0x66, 0xf7, 0x21, 0xd6, 0x8b, 0xa1, 0x04, 0x81, 0x76, 0x97, 0x9d, 0xbc, 0xca, 0x05, 0x55, - 0xbd, 0x56, 0xf1, 0x73, 0xc8, 0xd2, 0xe3, 0x18, 0x12, 0x2c, 0x40, 0x0f, 0x21, 0x67, 0x11, 0x89, - 0x83, 0xc0, 0x48, 0xd4, 0x9e, 0xf0, 0x2b, 0x94, 0xd9, 0x38, 0xe9, 0x5b, 0x20, 0xf6, 0x2f, 0xa6, - 0x6d, 0x6c, 0x0f, 0x7f, 0xfd, 0x6e, 0x38, 0x6b, 0x90, 0xfe, 0x3c, 0x05, 0xcb, 0x91, 0x0c, 0x46, - 0x83, 0x3d, 0xd0, 0x4e, 0x60, 0x25, 0xef, 0x86, 0x6f, 0xec, 0x10, 0xf3, 0xc8, 0x15, 0x89, 0xbf, - 0x7b, 0xb6, 0xc3, 0x2c, 0x8f, 0x7c, 0x98, 0xa1, 0x73, 0xa4, 0x3b, 0xf3, 0xd3, 0x14, 0xa0, 0x6d, - 0x6c, 0x7b, 0xa9, 0x32, 0xdb, 0xd2, 0x18, 0x7f, 0x23, 0xbc, 0x86, 0xbf, 0xf9, 0x8e, 0xcf, 0xdf, - 0x50, 0x8f, 0x75, 0x8b, 0x2b, 0x9a, 0x04, 0xa6, 0x4e, 0xbc, 0x2d, 0x63, 0xd2, 0x53, 0x1a, 0xf3, - 0x0f, 0x97, 0x9e, 0x9e, 0xd1, 0xad, 0xfc, 0xbb, 0x00, 0xf3, 0x3e, 0xa1, 0x99, 0x06, 0xdd, 0x01, - 0xa4, 0x9e, 0xa8, 0x5a, 0x5b, 0x75, 0x04, 0x73, 0xd3, 0x7f, 0x06, 0x07, 0xcc, 0x79, 0x3d, 0xee, - 0x30, 0xf4, 0x18, 0xe6, 0x3b, 0xea, 0x2b, 0xad, 0xd3, 0xeb, 0x28, 0x6c, 0x9f, 0x2d, 0xed, 0x07, - 0x2e, 0x70, 0xb8, 0x1c, 0x02, 0xd0, 0xab, 0xba, 0xfd, 0xe1, 0xfb, 0x14, 0x41, 0x9f, 0x63, 0xe3, - 0x98, 0xf2, 0x68, 0x3f, 0xc0, 0x68, 0x1f, 0xe6, 0x3b, 0x9a, 0x1e, 0x62, 0x96, 0x1e, 0xc8, 0x8c, - 0x1a, 0xf8, 0x1c, 0x1b, 0xdc, 0xe7, 0x28, 0x49, 0x7c, 0xd0, 0xcb, 0x96, 0x1b, 0x2c, 0x32, 0xb5, - 0xf9, 0x60, 0x31, 0x44, 0xc3, 0xb6, 0x65, 0x3b, 0xb2, 0xd0, 0x74, 0x2d, 0x6c, 0x36, 0xac, 0xea, - 0x12, 0x5b, 0x73, 0xfa, 0x9f, 0x34, 0x6f, 0xc1, 0x21, 0x6a, 0x74, 0x1f, 0xd2, 0x66, 0xb7, 0xc9, - 0xcc, 0xf7, 0xe6, 0x10, 0xfc, 0x8b, 0xf2, 0xfe, 0xe6, 0xce, 0x98, 0xec, 0x8c, 0x12, 0xff, 0x22, - 0x0d, 0x69, 0x79, 0x7f, 0x13, 0x3d, 0xf4, 0x95, 0x58, 0x6e, 0x0f, 0xc9, 0x85, 0xaf, 0xb0, 0xfc, - 0x32, 0x15, 0x55, 0x62, 0x29, 0xc0, 0xc2, 0xa6, 0x5c, 0x29, 0x35, 0x2a, 0xca, 0x56, 0x65, 0xb7, - 0xd2, 0xa8, 0x28, 0xb4, 0x40, 0x94, 0x17, 0xd0, 0x0a, 0x14, 0xf6, 0x0f, 0xca, 0xbb, 0xd5, 0xfa, - 0x8e, 0x72, 0x50, 0x73, 0xff, 0x62, 0xbd, 0x29, 0x94, 0x87, 0xe9, 0xdd, 0x6a, 0xbd, 0xc1, 0x1a, - 0xea, 0xf9, 0xb4, 0xd3, 0xb2, 0x5d, 0x69, 0x28, 0x9b, 0xa5, 0xfd, 0xd2, 0x66, 0xb5, 0xf1, 0x3c, - 0x9f, 0x41, 0x22, 0x2c, 0xf9, 0x79, 0xd7, 0x6b, 0xa5, 0xfd, 0xfa, 0xce, 0x5e, 0x23, 0x9f, 0x45, - 0x08, 0x66, 0xc9, 0x78, 0xb7, 0xa9, 0x9e, 0xcf, 0x39, 0x1c, 0x36, 0x77, 0xf7, 0x6a, 0x9e, 0x0c, - 0xe3, 0x68, 0x01, 0xf2, 0xee, 0xcc, 0x72, 0xa5, 0xb4, 0x45, 0x00, 0xbd, 0x09, 0x34, 0x07, 0x33, - 0x95, 0xef, 0xed, 0x97, 0x6a, 0x5b, 0x2e, 0xe1, 0x24, 0x5a, 0x85, 0x15, 0x5e, 0x1c, 0x85, 0x8d, - 0xaa, 0x6c, 0x11, 0x50, 0xae, 0x9e, 0x07, 0x74, 0x09, 0xf2, 0xac, 0xf6, 0xb5, 0xb9, 0x57, 0xdb, - 0xaa, 0x36, 0xaa, 0x7b, 0xb5, 0xfc, 0x14, 0x45, 0xf0, 0xe6, 0x01, 0x1c, 0xc9, 0x19, 0xb3, 0xe9, - 0xc1, 0xb0, 0xde, 0x0c, 0x85, 0xf5, 0x5c, 0xc4, 0xfa, 0xd7, 0x29, 0x58, 0xa4, 0x90, 0xb5, 0x0b, - 0x90, 0xbb, 0xbe, 0x6a, 0x1d, 0xf2, 0x14, 0xef, 0x52, 0x82, 0xb7, 0xc0, 0x2c, 0x6d, 0x7f, 0xea, - 0xe6, 0x1d, 0x6e, 0x79, 0x29, 0xc5, 0x95, 0x97, 0xaa, 0xc1, 0x2c, 0xec, 0x96, 0xbf, 0x10, 0x13, - 0x98, 0x2d, 0x29, 0xb1, 0x7f, 0x12, 0x91, 0x26, 0xdc, 0x49, 0xe6, 0x96, 0x14, 0x42, 0x9d, 0x25, - 0x8b, 0x3f, 0xa3, 0x97, 0x7b, 0x04, 0x4b, 0x41, 0x79, 0x99, 0x41, 0xdf, 0x0e, 0x95, 0x4b, 0x3c, - 0xb7, 0xeb, 0xd1, 0x7a, 0x14, 0xd2, 0x8f, 0x52, 0x30, 0xe1, 0x36, 0x3b, 0xe1, 0x8d, 0xe3, 0x97, - 0x7c, 0x48, 0xe9, 0xa4, 0xd3, 0xe2, 0x01, 0xaf, 0x7c, 0xa1, 0x23, 0x15, 0x2c, 0x74, 0x44, 0x9e, - 0x73, 0x3a, 0xf2, 0x9c, 0xbf, 0x0d, 0x33, 0x4d, 0x47, 0x7c, 0xcd, 0xd0, 0x15, 0x5b, 0xeb, 0xb8, - 0x40, 0x68, 0xb8, 0x30, 0xd9, 0x70, 0xdf, 0x1a, 0xc8, 0xd3, 0xee, 0x00, 0xa7, 0x09, 0xad, 0xc2, - 0x34, 0x29, 0x54, 0x2a, 0xb6, 0xa1, 0xf4, 0x2c, 0x5c, 0xc8, 0x12, 0x58, 0x08, 0x48, 0x5b, 0xc3, - 0x38, 0xb0, 0x30, 0xba, 0x0b, 0x73, 0x04, 0xc4, 0x57, 0x78, 0x99, 0x73, 0x8e, 0x34, 0x2c, 0x6a, - 0x22, 0xbd, 0x75, 0x4f, 0x7a, 0xe9, 0xef, 0x05, 0x58, 0xa4, 0xf0, 0x58, 0x50, 0x7f, 0x07, 0x55, - 0x78, 0x78, 0x15, 0x0d, 0x5c, 0x9f, 0x91, 0x0c, 0xdf, 0x14, 0x3a, 0x50, 0x80, 0xa5, 0xe0, 0x7c, - 0x0c, 0x12, 0xf8, 0x59, 0x0a, 0x16, 0x9c, 0x58, 0xce, 0xed, 0x38, 0xef, 0x70, 0x7b, 0x84, 0xa3, - 0x0f, 0x6c, 0x66, 0x26, 0xb4, 0x99, 0x3b, 0xc1, 0x84, 0xfb, 0x6d, 0x3e, 0x1a, 0x0d, 0xae, 0xe0, - 0x4d, 0xed, 0xe5, 0x4f, 0x04, 0x58, 0x0c, 0xcc, 0xc7, 0x0c, 0xec, 0xe3, 0x60, 0x06, 0x71, 0x2d, - 0x46, 0xbe, 0xd7, 0xca, 0x21, 0x3e, 0x70, 0x63, 0xf7, 0xd1, 0xec, 0xf8, 0x5f, 0x52, 0x70, 0xb9, - 0x7f, 0x0b, 0x92, 0xb7, 0x05, 0xad, 0x11, 0x20, 0xb0, 0xb3, 0x95, 0xf0, 0xbf, 0x1b, 0xf4, 0xd0, - 0xf7, 0xc2, 0x17, 0x73, 0x84, 0x48, 0x49, 0x9e, 0x3a, 0x12, 0x39, 0xce, 0x8c, 0x8a, 0x1c, 0x9f, - 0x49, 0x03, 0x7e, 0x87, 0x07, 0xc5, 0xfd, 0xe2, 0x33, 0x4d, 0x18, 0xb2, 0xba, 0xf4, 0x21, 0x5c, - 0x24, 0xe9, 0x82, 0xf7, 0x70, 0xc6, 0x2d, 0xd8, 0x53, 0x1f, 0x3a, 0x21, 0x2f, 0x3a, 0xdd, 0xde, - 0x7b, 0x10, 0x56, 0x51, 0x69, 0x49, 0x5f, 0x65, 0x60, 0xc9, 0x49, 0x27, 0xea, 0xb6, 0x7a, 0x3c, - 0x4a, 0xad, 0xe1, 0xfb, 0x61, 0xe8, 0x36, 0xe5, 0x3f, 0x96, 0x68, 0xae, 0xc3, 0x20, 0xb6, 0xa8, - 0x08, 0xf3, 0x96, 0xad, 0x1e, 0x13, 0x77, 0xa0, 0x9a, 0xc7, 0xd8, 0x56, 0xba, 0xaa, 0xfd, 0x92, - 0xd9, 0xfa, 0x1c, 0xeb, 0x6a, 0x90, 0x9e, 0x7d, 0xd5, 0x7e, 0x79, 0x4e, 0x07, 0x89, 0xbe, 0x13, - 0x74, 0x0a, 0xef, 0x0c, 0x58, 0x4b, 0x82, 0x6e, 0x7d, 0x2f, 0x06, 0xde, 0x7f, 0x6f, 0x00, 0xcb, - 0xc1, 0xb0, 0xfe, 0xd9, 0xe1, 0xec, 0xaf, 0xb9, 0x32, 0x70, 0x09, 0x2e, 0x86, 0x16, 0xcf, 0xae, - 0x90, 0x63, 0x28, 0x38, 0x5d, 0x07, 0xba, 0x35, 0xa2, 0x3a, 0xc6, 0x68, 0x4c, 0x2a, 0x46, 0x63, - 0xa4, 0x65, 0xb8, 0x14, 0x31, 0x11, 0x93, 0xe2, 0xe7, 0x59, 0x2a, 0xc6, 0xe8, 0x45, 0xaa, 0x4f, - 0xe2, 0xac, 0xe2, 0x7d, 0xfe, 0xd8, 0x23, 0xeb, 0x39, 0x6f, 0xc2, 0x2e, 0xae, 0xc2, 0x14, 0x4f, - 0xc7, 0xae, 0x41, 0x7b, 0x80, 0xe1, 0x64, 0xcf, 0x54, 0x3b, 0xcb, 0x05, 0x6a, 0x67, 0xbb, 0x7d, - 0xa3, 0x1a, 0xf7, 0xc7, 0xc2, 0xb1, 0x5b, 0x91, 0x60, 0x56, 0x2f, 0x42, 0x66, 0x35, 0xe1, 0x2f, - 0xc8, 0xc5, 0x32, 0xfd, 0x0d, 0x30, 0x2c, 0xa6, 0xd4, 0x91, 0x95, 0x32, 0xe9, 0x05, 0x88, 0x54, - 0xe3, 0x47, 0xaf, 0x5d, 0x05, 0xd4, 0x28, 0x15, 0x54, 0x23, 0xe9, 0x32, 0x2c, 0x47, 0xf2, 0x66, - 0x53, 0xff, 0xa1, 0x40, 0x05, 0xf3, 0x40, 0xb1, 0xba, 0xad, 0xda, 0xd6, 0xb0, 0x53, 0xb3, 0x4e, - 0x7e, 0x6a, 0xda, 0x44, 0x34, 0x78, 0x44, 0x93, 0x90, 0xfe, 0x44, 0xa0, 0xfb, 0x10, 0x94, 0x85, - 0xdd, 0xb6, 0x6f, 0x43, 0xb6, 0x47, 0x70, 0x7f, 0x1a, 0x75, 0xcd, 0xfb, 0x8d, 0xe0, 0xc0, 0xe9, - 0x92, 0x29, 0xc5, 0xb9, 0x21, 0xa9, 0xd2, 0xcf, 0x04, 0x98, 0xe2, 0xf8, 0xa3, 0x15, 0x98, 0xf4, - 0xa0, 0x22, 0x37, 0x41, 0xf2, 0x1a, 0x9c, 0xe3, 0xb7, 0x0d, 0x5b, 0x6d, 0xb3, 0x37, 0x29, 0xf4, - 0xc3, 0xc9, 0x69, 0x7b, 0x16, 0xa6, 0xe1, 0x70, 0x5a, 0x26, 0x7f, 0xa3, 0xdb, 0x90, 0xe9, 0xe9, - 0x9a, 0x4d, 0xcc, 0x7e, 0x36, 0x68, 0xcf, 0x64, 0xaa, 0xe2, 0x81, 0xae, 0xd9, 0x32, 0xa1, 0x92, - 0x6e, 0x41, 0xc6, 0xf9, 0xf2, 0x43, 0x16, 0x93, 0x90, 0x2d, 0x3f, 0x6f, 0x54, 0xea, 0x79, 0x01, - 0x01, 0xe4, 0xaa, 0x34, 0xc1, 0x4f, 0x49, 0xbb, 0xee, 0xbb, 0x54, 0x6f, 0x11, 0x8e, 0x0b, 0x50, - 0x0f, 0x75, 0xc3, 0xec, 0xa8, 0x6d, 0x22, 0xf3, 0x84, 0xec, 0x7d, 0xc7, 0x97, 0x53, 0x28, 0xf8, - 0xb8, 0xe2, 0x9d, 0x48, 0x14, 0xc0, 0xf4, 0x29, 0xd5, 0xad, 0x38, 0x68, 0xa9, 0x14, 0x09, 0x2d, - 0x5d, 0xf6, 0xdd, 0xb2, 0x03, 0x40, 0xa5, 0x7f, 0x4c, 0xc1, 0x62, 0x24, 0x1d, 0xfa, 0x80, 0x87, - 0x93, 0xd6, 0x12, 0x79, 0xf2, 0x40, 0xd2, 0x57, 0x02, 0x05, 0x92, 0x36, 0x7c, 0x40, 0xd2, 0x8d, - 0x81, 0xe3, 0x79, 0x08, 0xe9, 0x27, 0x42, 0x0c, 0x84, 0x54, 0x6f, 0x94, 0xb6, 0x2b, 0xca, 0x41, - 0x8d, 0xfe, 0xeb, 0x41, 0x48, 0x0b, 0x90, 0xef, 0x03, 0x2b, 0x4a, 0xbd, 0x51, 0x22, 0xef, 0x8b, - 0x43, 0xf0, 0x4d, 0x3a, 0x12, 0x9c, 0xc9, 0x0c, 0xc6, 0x61, 0xb2, 0x94, 0x64, 0x09, 0x10, 0x1b, - 0xfd, 0x64, 0xef, 0xa0, 0xd6, 0x50, 0xc8, 0xeb, 0xe5, 0x7c, 0xce, 0xc3, 0x67, 0x16, 0x00, 0xb1, - 0xd3, 0xe2, 0x1f, 0xe1, 0xff, 0x95, 0x00, 0xf3, 0xbe, 0x66, 0x76, 0x78, 0x5c, 0x51, 0x5c, 0xf0, - 0x15, 0xc5, 0xef, 0xc2, 0x82, 0x93, 0x31, 0x52, 0x4b, 0xb1, 0x94, 0x2e, 0x36, 0x09, 0x18, 0xce, - 0x74, 0x7e, 0xae, 0xa3, 0xbe, 0x62, 0x05, 0x83, 0x7d, 0x6c, 0x3a, 0x8c, 0xcf, 0x01, 0x12, 0x96, - 0xbe, 0x48, 0xd3, 0xb8, 0x64, 0xe4, 0xbc, 0x66, 0xa0, 0x8f, 0x0a, 0x27, 0x3e, 0xe9, 0x11, 0x12, - 0x9f, 0x18, 0x0f, 0x97, 0x19, 0x29, 0x18, 0x1e, 0xfd, 0x4e, 0xaf, 0xf5, 0xef, 0x6d, 0x1a, 0xb9, - 0xde, 0xe6, 0xf5, 0x77, 0x60, 0xa6, 0x95, 0xfb, 0xa2, 0x2c, 0xfc, 0xf8, 0xbc, 0xf2, 0xe4, 0x12, - 0x8d, 0xc7, 0xce, 0x90, 0x1f, 0x49, 0x37, 0xe1, 0x3a, 0x79, 0x56, 0x39, 0x10, 0xd0, 0x3e, 0x81, - 0x1b, 0x83, 0x08, 0xd9, 0xcc, 0xbb, 0x91, 0xae, 0xc7, 0x2b, 0x6b, 0x05, 0xb8, 0x0c, 0xf2, 0x42, - 0x3f, 0x4c, 0xc1, 0xea, 0xa0, 0x21, 0xe8, 0x21, 0xef, 0x90, 0x6e, 0x0f, 0x3b, 0x13, 0xef, 0x9b, - 0xfe, 0x94, 0xf9, 0xa6, 0x8a, 0xcf, 0x37, 0xbd, 0x37, 0x0a, 0x2b, 0xde, 0x4d, 0x55, 0xa2, 0xbc, - 0xd4, 0xbb, 0x70, 0xd3, 0x0f, 0x46, 0x73, 0x9e, 0x89, 0xfe, 0xdc, 0xc1, 0x43, 0xa7, 0x05, 0x3f, - 0xbc, 0xfb, 0xcb, 0x34, 0xac, 0xf2, 0x2f, 0x92, 0xb7, 0x79, 0xf8, 0x2c, 0xe9, 0xe7, 0x01, 0xb7, - 0x60, 0x2e, 0x08, 0x0d, 0xb9, 0x2f, 0x70, 0x2f, 0xf8, 0xb1, 0x21, 0x2b, 0xe9, 0xc5, 0xcd, 0x80, - 0xa9, 0x93, 0x22, 0xd3, 0xfb, 0x5e, 0x64, 0xea, 0x32, 0xa7, 0xd0, 0xef, 0x82, 0xdf, 0xe6, 0x28, - 0x07, 0x37, 0xf4, 0xac, 0x7b, 0xd9, 0x22, 0x8f, 0x19, 0xd3, 0xe4, 0xf3, 0x9b, 0x43, 0x4b, 0xf5, - 0xff, 0x13, 0x3e, 0xa6, 0x97, 0xfb, 0xdf, 0xf6, 0x2b, 0x9c, 0x44, 0x8c, 0x64, 0x57, 0xfa, 0x30, - 0x88, 0x71, 0xae, 0x45, 0xed, 0xde, 0x9b, 0x82, 0xe3, 0xda, 0xb0, 0x96, 0xb0, 0xd7, 0xcc, 0xea, - 0xcb, 0x30, 0xeb, 0x87, 0x7c, 0x99, 0x35, 0x06, 0xde, 0xd7, 0xfa, 0x07, 0xcf, 0xf8, 0x70, 0x60, - 0xba, 0x33, 0xbf, 0x10, 0xdc, 0x9f, 0x22, 0xf8, 0x68, 0x1d, 0x55, 0x0e, 0x63, 0xca, 0x54, 0xfe, - 0x20, 0x9c, 0x8c, 0x8a, 0x30, 0xe9, 0x52, 0x59, 0xc1, 0xc7, 0xad, 0xde, 0xe4, 0x7d, 0x92, 0x30, - 0x24, 0x9e, 0x1e, 0x0d, 0x12, 0xa7, 0x92, 0xff, 0x28, 0x05, 0xab, 0xfc, 0x1b, 0xcf, 0x48, 0x2b, - 0x1d, 0x65, 0x19, 0x6b, 0x30, 0xcd, 0x51, 0xb9, 0x86, 0x3b, 0xd5, 0xc7, 0x6b, 0x93, 0x8c, 0x76, - 0x90, 0x24, 0x6f, 0x48, 0x5b, 0xe8, 0x56, 0x5c, 0x83, 0xb5, 0x84, 0xf9, 0x59, 0xfe, 0xf3, 0x5f, - 0x02, 0xdc, 0x8c, 0x78, 0x1a, 0x70, 0xe6, 0x6d, 0xfb, 0x7e, 0xd0, 0x5a, 0x1e, 0x24, 0x3c, 0x44, - 0xf8, 0x3f, 0xdf, 0x1a, 0x0b, 0xd6, 0x07, 0x8b, 0x71, 0xce, 0x46, 0x75, 0xef, 0xbf, 0x05, 0x98, - 0xa8, 0xb6, 0xb0, 0x6e, 0xd3, 0x10, 0x66, 0xc6, 0xf7, 0x73, 0x4c, 0xb4, 0x12, 0xf3, 0x2b, 0x4d, - 0xb2, 0x19, 0xe2, 0xe5, 0xc4, 0xdf, 0x70, 0x4a, 0x63, 0xe8, 0x88, 0xfb, 0x29, 0xa9, 0xef, 0x71, - 0xc3, 0x5b, 0xa1, 0x91, 0x11, 0x91, 0x85, 0x78, 0x7d, 0x00, 0x95, 0x37, 0xcf, 0x87, 0x90, 0x25, - 0x3f, 0xad, 0x43, 0xde, 0xdd, 0xc1, 0xff, 0xf2, 0x4e, 0x5c, 0x0c, 0xb4, 0xba, 0xe3, 0xee, 0xfd, - 0xf3, 0x24, 0x40, 0x7f, 0xcb, 0xd1, 0x63, 0x98, 0xe6, 0xdd, 0x19, 0x5a, 0x4e, 0xf8, 0x6d, 0x99, - 0xb8, 0x12, 0xdd, 0xe9, 0xc9, 0xf4, 0x18, 0xa6, 0x79, 0x45, 0xef, 0x33, 0x8b, 0x78, 0x5a, 0xde, - 0x67, 0x16, 0xf9, 0x12, 0x7c, 0x0c, 0xb5, 0xe1, 0x62, 0xcc, 0xc3, 0x5e, 0x74, 0x63, 0xb8, 0xe7, - 0xcf, 0xe2, 0xcd, 0x21, 0x5f, 0x08, 0x4b, 0x63, 0xc8, 0x84, 0x4b, 0xb1, 0xef, 0x59, 0xd1, 0xfa, - 0xb0, 0xaf, 0x6d, 0xc5, 0xb7, 0x87, 0xa0, 0xf4, 0xe6, 0xec, 0x81, 0x18, 0xff, 0x88, 0x0e, 0xbd, - 0x3d, 0xf4, 0xeb, 0x4e, 0xf1, 0xd6, 0xf0, 0x6f, 0xf2, 0xa4, 0x31, 0xb4, 0x03, 0x53, 0xdc, 0x6b, - 0x2a, 0x24, 0x46, 0x3e, 0xb1, 0xa2, 0x8c, 0x97, 0x13, 0x9e, 0x5f, 0x51, 0x4e, 0xdc, 0x03, 0x97, - 0x3e, 0xa7, 0xf0, 0x53, 0x9d, 0x3e, 0xa7, 0x88, 0x17, 0x31, 0xc1, 0xed, 0x0f, 0xc4, 0xd2, 0x51, - 0xdb, 0x1f, 0x1d, 0x97, 0x47, 0x6d, 0x7f, 0x4c, 0x60, 0x2e, 0x8d, 0xa1, 0xef, 0xc2, 0xac, 0xbf, - 0x72, 0x8d, 0x2e, 0x27, 0x56, 0xe0, 0xc5, 0x2b, 0x71, 0xdd, 0x3c, 0x4b, 0x7f, 0xdd, 0xb3, 0xcf, - 0x32, 0xb2, 0xfe, 0xda, 0x67, 0x19, 0x53, 0x2e, 0x1d, 0x73, 0xfc, 0x93, 0xaf, 0x9a, 0xd7, 0xf7, - 0x4f, 0x51, 0x45, 0xc8, 0xbe, 0x7f, 0x8a, 0x2c, 0x01, 0x4a, 0x63, 0x48, 0x83, 0xa5, 0xe8, 0x62, - 0x12, 0xba, 0x3e, 0x54, 0xad, 0x4c, 0xbc, 0x31, 0x88, 0xcc, 0x9b, 0xaa, 0x09, 0xf3, 0x11, 0xce, - 0x1d, 0x49, 0x89, 0x2f, 0xe1, 0xe8, 0x24, 0xd7, 0x86, 0x78, 0x2d, 0x27, 0x11, 0x67, 0xfe, 0x67, - 0x19, 0xb8, 0x10, 0x48, 0x48, 0xd0, 0xef, 0x09, 0x70, 0x25, 0x39, 0x3f, 0x43, 0x77, 0x62, 0x92, - 0x99, 0x18, 0xc5, 0x2a, 0x0e, 0x4b, 0xce, 0x19, 0xf7, 0xa5, 0xd8, 0x38, 0x11, 0xad, 0x0f, 0x1b, - 0xb6, 0x73, 0x1a, 0x3d, 0x28, 0xe8, 0x24, 0xdb, 0xe1, 0x4c, 0x1b, 0x1b, 0x6b, 0xa0, 0xf5, 0x61, - 0xc3, 0xa1, 0xfe, 0xb4, 0x83, 0x03, 0x17, 0x32, 0xed, 0x1f, 0x09, 0x81, 0x67, 0x60, 0x51, 0xd3, - 0xdf, 0x1d, 0x31, 0xf2, 0x10, 0xdf, 0x1d, 0x7e, 0x00, 0x27, 0x0c, 0xc9, 0x16, 0xef, 0xfd, 0x5b, - 0x16, 0x32, 0x04, 0xf5, 0x69, 0xc0, 0x85, 0x40, 0x25, 0x09, 0x5d, 0x49, 0xae, 0xaf, 0x89, 0x57, - 0x63, 0xfb, 0xbd, 0xe3, 0x7d, 0x01, 0x73, 0xa1, 0xda, 0x10, 0x5a, 0xe5, 0xc7, 0x45, 0xd5, 0xa7, - 0xc4, 0xb5, 0x04, 0x8a, 0x20, 0x6f, 0xff, 0x9d, 0xb7, 0x3a, 0xa8, 0x78, 0xe1, 0xe7, 0x1d, 0x77, - 0xcf, 0x7d, 0x4a, 0x41, 0xb6, 0xe0, 0x0d, 0x27, 0xf9, 0xe5, 0x8a, 0xbc, 0xdb, 0xae, 0x25, 0xd2, - 0x78, 0x33, 0x7c, 0xe2, 0xa1, 0x7b, 0x1c, 0x76, 0x8e, 0x7c, 0xc2, 0x45, 0x62, 0xfc, 0xa2, 0x94, - 0x44, 0xe2, 0xb1, 0x7f, 0x06, 0xf9, 0x20, 0xcc, 0x83, 0xae, 0x0e, 0x40, 0x9d, 0xc4, 0xd5, 0x78, - 0x82, 0xe0, 0xce, 0x04, 0x1d, 0x45, 0x50, 0xaa, 0x28, 0xef, 0x70, 0x2d, 0x91, 0x86, 0xbf, 0x2e, - 0x39, 0x80, 0xb3, 0x7f, 0x5d, 0x86, 0xc1, 0xd0, 0xfe, 0x75, 0x19, 0x81, 0x88, 0x4a, 0x63, 0x1b, - 0x0f, 0x00, 0xd4, 0x76, 0xf7, 0xa5, 0xaa, 0x60, 0xbd, 0xd7, 0x41, 0x2b, 0xa1, 0xcc, 0xac, 0xa2, - 0xf7, 0x3a, 0x7b, 0x5d, 0x27, 0x21, 0xb3, 0x0a, 0x7f, 0x33, 0x41, 0x90, 0xf6, 0x49, 0x32, 0xc0, - 0xe9, 0xd8, 0xd8, 0x85, 0x7c, 0x7f, 0xb4, 0x42, 0x22, 0x72, 0xb4, 0x16, 0xc9, 0x83, 0x3c, 0xfd, - 0x0c, 0x30, 0x9a, 0xf5, 0x18, 0x91, 0xde, 0x8d, 0x8f, 0x01, 0x9a, 0x96, 0xc6, 0x00, 0x0d, 0x74, - 0x39, 0xc4, 0xe7, 0x91, 0x86, 0xdb, 0x2d, 0x97, 0xc7, 0x5f, 0x33, 0x61, 0x9a, 0x96, 0x46, 0x13, - 0x87, 0x8d, 0x6f, 0xc3, 0x14, 0x15, 0xe6, 0xc8, 0xa1, 0x1b, 0x34, 0x9e, 0xc9, 0x40, 0x57, 0x4f, - 0x7a, 0x36, 0x2a, 0x30, 0x43, 0x19, 0xb0, 0x7a, 0x01, 0xba, 0x1a, 0x62, 0xf1, 0x84, 0xf6, 0x04, - 0x98, 0x4c, 0x93, 0x61, 0xac, 0x6f, 0xa3, 0x0c, 0xd3, 0x2e, 0x1b, 0xfb, 0xa5, 0xd1, 0x42, 0x57, - 0x22, 0xb8, 0x38, 0x1d, 0x01, 0x26, 0x53, 0x8c, 0x89, 0xd3, 0xd5, 0x17, 0xc5, 0xfd, 0xbf, 0x4a, - 0xc2, 0xa2, 0x30, 0xb0, 0x2c, 0x52, 0x14, 0xd6, 0x57, 0xce, 0xbe, 0x48, 0x37, 0x2d, 0xed, 0x30, - 0x47, 0x06, 0x7d, 0xe3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xe3, 0x24, 0x7c, 0x58, 0x47, - 0x00, 0x00, + 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xd3, 0x8f, 0xa9, 0xd2, 0x8f, 0xe9, 0x96, 0x2c, 0x4b, 0xed, 0xb1, + 0x47, 0xe3, 0xb1, 0xe9, 0x19, 0xed, 0xcc, 0x60, 0x47, 0xe3, 0xd9, 0x1d, 0x52, 0xa2, 0x25, 0xae, + 0x69, 0x52, 0xd3, 0xa4, 0x3c, 0x6b, 0x27, 0x83, 0x9e, 0x16, 0x59, 0x92, 0x1b, 0x43, 0x76, 0x73, + 0xba, 0x9b, 0x8a, 0xb5, 0x97, 0x24, 0x1b, 0x04, 0xd8, 0x20, 0x97, 0x20, 0x39, 0x64, 0x72, 0xca, + 0x22, 0xc9, 0x71, 0x17, 0x7b, 0x08, 0x16, 0x7b, 0x0c, 0x90, 0x5b, 0x02, 0x04, 0xc9, 0x31, 0xc8, + 0x65, 0x0f, 0x01, 0x72, 0x58, 0x4c, 0x80, 0x39, 0xe5, 0x90, 0x43, 0x10, 0x74, 0x55, 0xf5, 0xff, + 0x0f, 0x49, 0x4b, 0x86, 0x03, 0xe4, 0x64, 0x75, 0xd5, 0xab, 0x57, 0xaf, 0xaa, 0xde, 0x7b, 0xf5, + 0xde, 0xf7, 0x8a, 0x86, 0xf7, 0x4f, 0x15, 0xf3, 0xf9, 0xe0, 0xb8, 0xd8, 0xd6, 0x7a, 0xf7, 0xdb, + 0x9a, 0x6a, 0xca, 0x8a, 0x8a, 0xf5, 0x7b, 0x86, 0xa9, 0xe9, 0xf2, 0x29, 0xbe, 0xa7, 0xa8, 0x26, + 0xd6, 0x4f, 0xe4, 0x36, 0xbe, 0x6f, 0xf4, 0x71, 0xfb, 0x7e, 0xdb, 0x50, 0x8a, 0x7d, 0x5d, 0x33, + 0x35, 0x94, 0xb3, 0xfe, 0x3c, 0x7b, 0x97, 0xdf, 0x38, 0xd5, 0xb4, 0xd3, 0x2e, 0xbe, 0x4f, 0x5a, + 0x8f, 0x07, 0x27, 0xf7, 0x3b, 0xd8, 0x68, 0xeb, 0x4a, 0xdf, 0xd4, 0x74, 0x4a, 0xc9, 0xdf, 0x08, + 0x52, 0x98, 0x4a, 0x0f, 0x1b, 0xa6, 0xdc, 0xeb, 0x33, 0x82, 0xf5, 0x20, 0xc1, 0xef, 0xe8, 0x72, + 0xbf, 0x8f, 0x75, 0x83, 0xf6, 0x0b, 0x2b, 0xb0, 0xb4, 0x8f, 0xcd, 0xc3, 0xee, 0xe0, 0x54, 0x51, + 0xab, 0xea, 0x89, 0x26, 0xe2, 0xaf, 0x06, 0xd8, 0x30, 0x85, 0x7f, 0xe5, 0x60, 0x39, 0xd0, 0x61, + 0xf4, 0x35, 0xd5, 0xc0, 0x08, 0x41, 0x46, 0x95, 0x7b, 0xb8, 0xc0, 0x6d, 0x70, 0x5b, 0xd3, 0x22, + 0xf9, 0x1b, 0xdd, 0x82, 0xf9, 0x33, 0xac, 0x76, 0x34, 0x5d, 0x3a, 0xc3, 0xba, 0xa1, 0x68, 0x6a, + 0x21, 0x45, 0x7a, 0xe7, 0x68, 0xeb, 0x13, 0xda, 0x88, 0xf6, 0x61, 0xaa, 0x27, 0xab, 0xca, 0x09, + 0x36, 0xcc, 0x42, 0x7a, 0x23, 0xbd, 0x35, 0xb3, 0xfd, 0x76, 0x91, 0x2e, 0xb5, 0x18, 0x39, 0x57, + 0xf1, 0x31, 0xa3, 0xae, 0xa8, 0xa6, 0x7e, 0x2e, 0x3a, 0x83, 0xf9, 0x8f, 0x60, 0xce, 0xd7, 0x85, + 0xf2, 0x90, 0xfe, 0x12, 0x9f, 0x33, 0x99, 0xac, 0x3f, 0xd1, 0x12, 0x64, 0xcf, 0xe4, 0xee, 0x00, + 0x33, 0x49, 0xe8, 0xc7, 0x4e, 0xea, 0xbb, 0x9c, 0xb0, 0x0e, 0x6b, 0xce, 0x6c, 0xbb, 0x72, 0x5f, + 0x3e, 0x56, 0xba, 0x8a, 0xa9, 0x60, 0xc3, 0x5e, 0xfa, 0xe7, 0x70, 0x3d, 0xa6, 0x9f, 0xed, 0xc0, + 0x03, 0x98, 0x6d, 0x7b, 0xda, 0x0b, 0x1c, 0x59, 0x4a, 0xc1, 0x5e, 0x4a, 0x60, 0xe4, 0xb9, 0xe8, + 0xa3, 0x16, 0xbe, 0x49, 0x43, 0x3e, 0x48, 0x82, 0x1e, 0xc0, 0xa4, 0x81, 0xf5, 0x33, 0xa5, 0x4d, + 0xf7, 0x75, 0x66, 0x7b, 0x23, 0x8e, 0x5b, 0xb1, 0x49, 0xe9, 0x0e, 0x26, 0x44, 0x7b, 0x08, 0x3a, + 0x82, 0xfc, 0x99, 0xd6, 0x1d, 0xf4, 0xb0, 0x84, 0x5f, 0xf4, 0x65, 0xd5, 0x39, 0x80, 0x99, 0xed, + 0xad, 0x58, 0x36, 0x4f, 0xc8, 0x80, 0x8a, 0x4d, 0x7f, 0x30, 0x21, 0x5e, 0x39, 0xf3, 0x37, 0xf1, + 0xbf, 0xe4, 0x60, 0x92, 0xcd, 0x86, 0x3e, 0x84, 0x8c, 0x79, 0xde, 0xa7, 0xd2, 0xcd, 0x6f, 0xdf, + 0x1a, 0x26, 0x5d, 0xb1, 0x75, 0xde, 0xc7, 0x22, 0x19, 0x22, 0x68, 0x90, 0xb1, 0xbe, 0xd0, 0x0c, + 0x4c, 0x1e, 0xd5, 0x1f, 0xd5, 0x1b, 0x9f, 0xd5, 0xf3, 0x13, 0x68, 0x05, 0xd0, 0x6e, 0xa3, 0xde, + 0x12, 0x1b, 0xb5, 0x5a, 0x45, 0x94, 0x9a, 0x15, 0xf1, 0x49, 0x75, 0xb7, 0x92, 0xe7, 0xd0, 0x1b, + 0xb0, 0xf1, 0xa4, 0x51, 0x3b, 0x7a, 0x5c, 0x91, 0x4a, 0xbb, 0xbb, 0x95, 0x66, 0xb3, 0x5a, 0xae, + 0xd6, 0xaa, 0xad, 0xa7, 0xd2, 0x6e, 0xa3, 0xde, 0x6c, 0x89, 0xa5, 0x6a, 0xbd, 0xd5, 0xcc, 0xa7, + 0xd0, 0x1a, 0x14, 0xf6, 0xc5, 0xc6, 0xd1, 0xa1, 0x14, 0xc1, 0x23, 0xcd, 0xff, 0x98, 0x83, 0x2b, + 0x81, 0xe5, 0xa1, 0x92, 0x4f, 0xfe, 0x7b, 0xa3, 0x6e, 0x8b, 0x77, 0x1d, 0x77, 0xa3, 0xd6, 0x01, + 0x90, 0x6b, 0xd4, 0x6b, 0xd5, 0xba, 0x25, 0xfb, 0x0c, 0x4c, 0x36, 0x1e, 0x3e, 0x24, 0x1f, 0xa9, + 0x72, 0x8e, 0x4e, 0x28, 0xcc, 0xc3, 0xec, 0xa1, 0xae, 0x1d, 0x63, 0x5b, 0xbb, 0x4a, 0x30, 0xc7, + 0xbe, 0x99, 0x36, 0xbd, 0x03, 0x59, 0x1d, 0xcb, 0x9d, 0x73, 0x76, 0xf0, 0x7c, 0x91, 0x5a, 0x6c, + 0xd1, 0xb6, 0xd8, 0x62, 0x59, 0xd3, 0xba, 0x4f, 0x2c, 0xed, 0x15, 0x29, 0xa1, 0xf0, 0x6d, 0x06, + 0x16, 0x77, 0x75, 0x2c, 0x9b, 0x98, 0x4a, 0xcb, 0x58, 0x47, 0x5a, 0xe6, 0x03, 0x98, 0xb7, 0xb4, + 0xaf, 0xad, 0x98, 0xe7, 0x92, 0x2e, 0xab, 0xa7, 0x98, 0x29, 0xc6, 0xb2, 0xbd, 0x03, 0xbb, 0xac, + 0x57, 0xb4, 0x3a, 0xc5, 0xb9, 0xb6, 0xf7, 0x13, 0x55, 0x61, 0x91, 0x29, 0x96, 0x4f, 0xe1, 0xd3, + 0x7e, 0x85, 0xa7, 0x52, 0x78, 0x14, 0x1e, 0x9d, 0xf9, 0x5b, 0x14, 0x6c, 0xa0, 0x47, 0x00, 0x7d, + 0x59, 0x97, 0x7b, 0xd8, 0xc4, 0xba, 0x51, 0xc8, 0xf8, 0xad, 0x3f, 0x62, 0x35, 0xc5, 0x43, 0x87, + 0x9a, 0x5a, 0xbf, 0x67, 0x38, 0xda, 0xb7, 0xcc, 0xa5, 0xad, 0x63, 0xd3, 0x28, 0x64, 0x09, 0xa7, + 0xad, 0x24, 0x4e, 0x4d, 0x4a, 0x4a, 0xd8, 0x94, 0xd3, 0x5f, 0x97, 0x39, 0xd1, 0x1e, 0x8d, 0x1a, + 0xb0, 0x6c, 0x2f, 0x50, 0x53, 0x4d, 0xac, 0x9a, 0x92, 0xa1, 0x0d, 0xf4, 0x36, 0x2e, 0xe4, 0xc8, + 0x2e, 0xad, 0x06, 0x96, 0x48, 0x69, 0x9a, 0x84, 0x44, 0x64, 0x5b, 0xe3, 0x6b, 0x44, 0xcf, 0x80, + 0x97, 0xdb, 0x6d, 0x6c, 0x18, 0x0a, 0xdd, 0x0b, 0x49, 0xc7, 0x5f, 0x0d, 0x14, 0x1d, 0xf7, 0xb0, + 0x6a, 0x1a, 0x85, 0x49, 0x3f, 0xd7, 0x96, 0xd6, 0xd7, 0xba, 0xda, 0xe9, 0xb9, 0xe8, 0xd2, 0x88, + 0xd7, 0x7c, 0xc3, 0x3d, 0x3d, 0x06, 0xff, 0x31, 0x5c, 0x09, 0x6c, 0xca, 0x38, 0x7e, 0x8f, 0xdf, + 0x81, 0x59, 0xef, 0x4e, 0x8c, 0xe5, 0x33, 0xff, 0x38, 0x05, 0x8b, 0x11, 0x7b, 0x80, 0x0e, 0x60, + 0xca, 0x50, 0xe5, 0xbe, 0xf1, 0x5c, 0x33, 0x99, 0xfe, 0xde, 0x49, 0xd8, 0xb2, 0x62, 0x93, 0xd1, + 0xd2, 0xcf, 0x83, 0x09, 0xd1, 0x19, 0x8d, 0xca, 0x90, 0xa3, 0xfb, 0x19, 0xf4, 0x5c, 0x51, 0x7c, + 0x68, 0x9b, 0xc3, 0x85, 0x8d, 0xe4, 0xdf, 0x85, 0x79, 0xff, 0x0c, 0xe8, 0x06, 0xcc, 0xd8, 0x33, + 0x48, 0x4a, 0x87, 0xad, 0x15, 0xec, 0xa6, 0x6a, 0x87, 0x7f, 0x1b, 0x66, 0xbd, 0xcc, 0xd0, 0x2a, + 0x4c, 0x33, 0x85, 0x70, 0xc8, 0xa7, 0x68, 0x43, 0xb5, 0xe3, 0xd8, 0xf4, 0xf7, 0x60, 0xc9, 0xaf, + 0x67, 0xcc, 0x94, 0x6f, 0x3b, 0x6b, 0xa0, 0x7b, 0x31, 0xef, 0x5f, 0x83, 0x2d, 0xa7, 0xf0, 0x97, + 0x59, 0xc8, 0x07, 0x8d, 0x06, 0x3d, 0x80, 0xec, 0x71, 0x57, 0x6b, 0x7f, 0xc9, 0xc6, 0xbe, 0x11, + 0x67, 0x5d, 0xc5, 0xb2, 0x45, 0x45, 0x5b, 0x0f, 0x26, 0x44, 0x3a, 0xc8, 0x1a, 0xdd, 0xd3, 0x06, + 0xaa, 0xc9, 0x76, 0x2f, 0x7e, 0xf4, 0x63, 0x8b, 0xca, 0x1d, 0x4d, 0x06, 0xa1, 0x3d, 0x98, 0xa1, + 0x6a, 0x27, 0xf5, 0xb4, 0x0e, 0x2e, 0xa4, 0x09, 0x8f, 0x9b, 0xb1, 0x3c, 0x4a, 0x84, 0xf6, 0xb1, + 0xd6, 0xc1, 0x22, 0xc8, 0xce, 0xdf, 0xfc, 0x1c, 0xcc, 0x78, 0x64, 0xe3, 0x07, 0x30, 0xe3, 0x99, + 0x0c, 0x5d, 0x85, 0xc9, 0x13, 0x43, 0x72, 0x9c, 0xf0, 0xb4, 0x98, 0x3b, 0x31, 0x88, 0x3f, 0xbd, + 0x01, 0x33, 0x44, 0x0a, 0xe9, 0xa4, 0x2b, 0x9f, 0x1a, 0x85, 0xd4, 0x46, 0xda, 0x3a, 0x23, 0xd2, + 0xf4, 0xd0, 0x6a, 0x41, 0x77, 0x81, 0x39, 0x14, 0x89, 0xd2, 0x9d, 0xea, 0xda, 0xa0, 0x4f, 0x84, + 0x9c, 0x16, 0xd9, 0xc5, 0x47, 0x26, 0xda, 0xb7, 0xda, 0xf9, 0xbf, 0x4d, 0x01, 0xb8, 0x02, 0xa2, + 0x07, 0x90, 0x21, 0x6b, 0xa2, 0x8e, 0x7f, 0x6b, 0x84, 0x35, 0x15, 0xc9, 0xc2, 0xc8, 0x28, 0xe1, + 0x3f, 0x38, 0xc8, 0x10, 0x36, 0xc1, 0xcb, 0xab, 0x59, 0xad, 0xef, 0xd7, 0x2a, 0x52, 0xbd, 0xb1, + 0x57, 0x91, 0x3e, 0x13, 0xab, 0xad, 0x8a, 0x98, 0xe7, 0xd0, 0x2a, 0x5c, 0xf5, 0xb6, 0x8b, 0x95, + 0xd2, 0x5e, 0x45, 0x94, 0x1a, 0xf5, 0xda, 0xd3, 0x7c, 0x0a, 0xf1, 0xb0, 0xf2, 0xf8, 0xa8, 0xd6, + 0xaa, 0x86, 0xfb, 0xd2, 0xd6, 0x7d, 0xe6, 0xe9, 0x63, 0x3c, 0x18, 0xdb, 0x8c, 0xc5, 0xd6, 0xd3, + 0x4b, 0xff, 0x64, 0x9d, 0x59, 0x24, 0xc0, 0x35, 0xef, 0x9c, 0xfe, 0xb1, 0x39, 0x3e, 0xfd, 0xd3, + 0x32, 0x87, 0x36, 0xa1, 0xe0, 0xa5, 0xf1, 0x71, 0x98, 0x24, 0x24, 0xe5, 0x39, 0x47, 0x03, 0x88, + 0x86, 0x7f, 0x06, 0x73, 0xbe, 0x8b, 0xc1, 0x8a, 0xf0, 0x98, 0x27, 0xeb, 0x48, 0xc7, 0xe7, 0x26, + 0x89, 0x7a, 0xb8, 0xad, 0xb4, 0x38, 0x67, 0xb7, 0x96, 0xad, 0x46, 0xeb, 0x2c, 0xbb, 0x4a, 0x4f, + 0x31, 0x19, 0x4d, 0x8a, 0xd0, 0x00, 0x69, 0x22, 0x04, 0xc2, 0xaf, 0x53, 0x90, 0x63, 0x0a, 0x71, + 0xcb, 0x73, 0x35, 0xf9, 0x58, 0xda, 0xad, 0x94, 0xa5, 0xcf, 0x22, 0x53, 0x7e, 0x8b, 0x44, 0x07, + 0x30, 0xef, 0xf5, 0xdf, 0x2f, 0xec, 0xb8, 0x72, 0xd3, 0x7f, 0xce, 0x5e, 0x27, 0xf2, 0x82, 0x45, + 0x93, 0x73, 0x67, 0xde, 0x36, 0x54, 0x86, 0xf9, 0xc0, 0x15, 0x90, 0x19, 0x7e, 0x05, 0xcc, 0xb5, + 0x7d, 0xde, 0xb0, 0x04, 0x8b, 0xb6, 0xf7, 0xee, 0x62, 0xc9, 0x64, 0xde, 0x9d, 0x5d, 0x51, 0xf9, + 0x90, 0xd7, 0x47, 0x2e, 0xb1, 0xdd, 0xc6, 0x7f, 0x02, 0x28, 0x2c, 0xeb, 0x58, 0xae, 0x7a, 0x00, + 0x8b, 0x11, 0xf7, 0x0a, 0x2a, 0xc2, 0x34, 0x39, 0x2a, 0x43, 0x31, 0x31, 0x8b, 0x58, 0xc3, 0x12, + 0xb9, 0x24, 0x16, 0x7d, 0x5f, 0xc7, 0x27, 0x58, 0xd7, 0x71, 0x87, 0xd8, 0x64, 0x24, 0xbd, 0x43, + 0x22, 0xfc, 0x01, 0x07, 0x53, 0x76, 0x3b, 0xda, 0x81, 0x29, 0x03, 0x9f, 0xd2, 0x3b, 0x8f, 0xce, + 0xb5, 0x1e, 0x1c, 0x5b, 0x6c, 0x32, 0x02, 0x16, 0xdb, 0xdb, 0xf4, 0x56, 0x6c, 0xef, 0xeb, 0x1a, + 0x6b, 0xf1, 0xbf, 0xe2, 0x60, 0x71, 0x0f, 0x77, 0x71, 0x30, 0x34, 0x4a, 0x72, 0xeb, 0xde, 0x68, + 0x22, 0xe5, 0x8f, 0x26, 0x22, 0x58, 0x25, 0x44, 0x13, 0x17, 0xba, 0x61, 0x57, 0x60, 0xc9, 0x3f, + 0x1b, 0xbd, 0x53, 0x84, 0xff, 0x4c, 0xc3, 0xba, 0xa5, 0x0b, 0xba, 0xd6, 0xed, 0x62, 0xfd, 0x70, + 0x70, 0xdc, 0x55, 0x8c, 0xe7, 0x63, 0x2c, 0xee, 0x2a, 0x4c, 0xaa, 0x5a, 0xc7, 0x63, 0x3c, 0x39, + 0xeb, 0xb3, 0xda, 0x41, 0x15, 0x58, 0x08, 0xc6, 0x76, 0xe7, 0xcc, 0xf3, 0xc7, 0x47, 0x76, 0xf9, + 0xb3, 0xe0, 0xb5, 0xc5, 0xc3, 0x94, 0x15, 0x95, 0x6a, 0x6a, 0xf7, 0x9c, 0x58, 0xcc, 0x94, 0xe8, + 0x7c, 0x23, 0x31, 0x18, 0xa6, 0x7d, 0xc7, 0x09, 0xd3, 0x12, 0x57, 0x94, 0x14, 0xb1, 0x7d, 0x11, + 0xb2, 0xf8, 0x1c, 0x61, 0xfd, 0xe1, 0x88, 0xac, 0x87, 0x7a, 0x82, 0x8b, 0x9c, 0xe2, 0x25, 0x98, + 0xef, 0x3f, 0x72, 0x70, 0x23, 0x76, 0x09, 0x2c, 0xce, 0xe8, 0xc0, 0x95, 0x3e, 0xed, 0x70, 0x36, + 0x81, 0x5a, 0xd9, 0x47, 0x43, 0x37, 0x81, 0x25, 0xd6, 0xac, 0xd5, 0xb7, 0x0d, 0xf3, 0x7d, 0x5f, + 0x23, 0x5f, 0x82, 0xc5, 0x08, 0xb2, 0xb1, 0x16, 0xf3, 0x1b, 0x0e, 0x36, 0x5c, 0x51, 0x8e, 0xd4, + 0xfe, 0xe5, 0xa9, 0x6f, 0xcb, 0xd5, 0x2d, 0xea, 0xf2, 0xdf, 0x0f, 0xaf, 0x3d, 0x7a, 0xc2, 0x57, + 0x65, 0xc1, 0x37, 0x61, 0x33, 0x61, 0x6a, 0x66, 0xce, 0xbf, 0xce, 0xc0, 0xe6, 0x13, 0xb9, 0xab, + 0x74, 0x9c, 0xe8, 0x31, 0x02, 0x82, 0x48, 0xde, 0x92, 0x76, 0xc8, 0x02, 0xa8, 0xd7, 0x7a, 0xe0, + 0x58, 0xed, 0x30, 0xfe, 0x23, 0x5c, 0x87, 0x97, 0x98, 0xf9, 0x3d, 0x8d, 0xc8, 0xfc, 0x3e, 0x1c, + 0x5d, 0xd6, 0xa4, 0x3c, 0xf0, 0x28, 0xe8, 0x60, 0x3e, 0x18, 0x9d, 0x6f, 0x82, 0x16, 0x5c, 0xd8, + 0x8a, 0x5f, 0x67, 0xaa, 0xf6, 0xf7, 0x19, 0x10, 0x92, 0x56, 0xcf, 0x7c, 0x88, 0x08, 0xd3, 0x6d, + 0x4d, 0x3d, 0x51, 0xf4, 0x1e, 0xee, 0xb0, 0x94, 0xe3, 0xbd, 0x51, 0x36, 0x8f, 0x39, 0x90, 0x5d, + 0x7b, 0xac, 0xe8, 0xb2, 0x41, 0x05, 0x98, 0xec, 0x61, 0xc3, 0x90, 0x4f, 0x6d, 0xb1, 0xec, 0x4f, + 0xfe, 0xe7, 0x69, 0x98, 0x76, 0x86, 0x20, 0x35, 0xa4, 0xc1, 0xd4, 0x7d, 0xed, 0xbf, 0x8c, 0x00, + 0x2f, 0xaf, 0xcc, 0xa9, 0x97, 0x50, 0xe6, 0x8e, 0x4f, 0x99, 0xa9, 0x39, 0xec, 0xbd, 0x94, 0xd8, + 0x09, 0x7a, 0xfd, 0xda, 0x15, 0x50, 0xf8, 0x6d, 0x40, 0x35, 0xc5, 0x60, 0xa9, 0x9b, 0xe3, 0x96, + 0xac, 0x4c, 0x4d, 0x7e, 0x21, 0x61, 0xd5, 0xd4, 0x15, 0x16, 0xae, 0x67, 0x45, 0xe8, 0xc9, 0x2f, + 0x2a, 0xb4, 0xc5, 0x0a, 0xe9, 0x0d, 0x53, 0xd6, 0x4d, 0x45, 0x3d, 0x95, 0x4c, 0xed, 0x4b, 0xec, + 0xe0, 0xc0, 0x76, 0x6b, 0xcb, 0x6a, 0x14, 0xbe, 0x49, 0xc1, 0xa2, 0x8f, 0x3d, 0xd3, 0xc9, 0x8f, + 0x60, 0xd2, 0xe5, 0xed, 0x0b, 0xe3, 0x23, 0xa8, 0x8b, 0x74, 0xdb, 0xec, 0x11, 0xe8, 0x3a, 0x80, + 0x8a, 0x5f, 0x98, 0xbe, 0x79, 0xa7, 0xad, 0x16, 0x32, 0x27, 0xff, 0x87, 0x9c, 0x93, 0xe9, 0x9b, + 0xb2, 0x39, 0x20, 0x59, 0x25, 0x73, 0xd1, 0xb8, 0x23, 0xb1, 0x3b, 0x86, 0xce, 0x3b, 0x2d, 0xe6, + 0x9d, 0x9e, 0x3a, 0xb9, 0x6d, 0x0c, 0xb4, 0xef, 0x40, 0xac, 0x6d, 0x4d, 0xed, 0x28, 0xa6, 0x0b, + 0xb1, 0x5e, 0x0d, 0x25, 0x08, 0xb4, 0xbb, 0x6c, 0xe5, 0x55, 0x36, 0xa8, 0xea, 0xb4, 0xf2, 0x5f, + 0x41, 0x96, 0x1e, 0xc7, 0x88, 0x60, 0x01, 0xfa, 0x04, 0x72, 0x06, 0x91, 0x38, 0x08, 0x8c, 0x44, + 0xed, 0x89, 0x77, 0x85, 0x22, 0x1b, 0x27, 0x7c, 0x0f, 0x78, 0xf7, 0x62, 0xda, 0xc7, 0xe6, 0xe8, + 0xd7, 0xef, 0x8e, 0xb5, 0x06, 0xe1, 0xcf, 0x53, 0xb0, 0x1a, 0xc9, 0x60, 0x3c, 0xd8, 0x03, 0x1d, + 0x04, 0x56, 0xf2, 0x4e, 0xf8, 0xc6, 0x0e, 0x31, 0x8f, 0x5c, 0x11, 0xff, 0x7b, 0x17, 0x3b, 0xcc, + 0xf2, 0xd8, 0x87, 0x19, 0x3a, 0x47, 0xba, 0x33, 0x3f, 0x4f, 0x01, 0xda, 0xc7, 0xa6, 0x93, 0x2a, + 0xb3, 0x2d, 0x8d, 0xf1, 0x37, 0xdc, 0x4b, 0xf8, 0x9b, 0x1f, 0xf8, 0xfc, 0x0d, 0xf5, 0x58, 0x77, + 0x3c, 0x45, 0x93, 0xc0, 0xd4, 0x89, 0xb7, 0x65, 0x4c, 0x7a, 0x4a, 0x63, 0xfe, 0xd1, 0xd2, 0xd3, + 0x0b, 0xba, 0x95, 0x7f, 0xe7, 0x60, 0xd1, 0x27, 0x34, 0xd3, 0xa0, 0x7b, 0x80, 0xe4, 0x33, 0x59, + 0xe9, 0xca, 0x96, 0x60, 0x76, 0xfa, 0xcf, 0xe0, 0x80, 0x05, 0xa7, 0xc7, 0x1e, 0x86, 0x1e, 0xc1, + 0x62, 0x4f, 0x7e, 0xa1, 0xf4, 0x06, 0x3d, 0x89, 0xed, 0xb3, 0xa1, 0xfc, 0xc8, 0x06, 0x0e, 0x57, + 0x43, 0x00, 0x7a, 0x55, 0x35, 0x3f, 0x78, 0x8f, 0x22, 0xe8, 0x0b, 0x6c, 0x1c, 0x53, 0x1e, 0xe5, + 0x47, 0x18, 0x1d, 0xc2, 0x62, 0x4f, 0x51, 0x43, 0xcc, 0xd2, 0x43, 0x99, 0x51, 0x03, 0x5f, 0x60, + 0x83, 0x5d, 0x8e, 0x82, 0xe0, 0x0d, 0x7a, 0xd9, 0x72, 0x83, 0x45, 0xa6, 0xae, 0x37, 0x58, 0x0c, + 0xd1, 0xb0, 0x6d, 0xd9, 0x8f, 0x2c, 0x34, 0xdd, 0x0c, 0x9b, 0x0d, 0xab, 0xba, 0xc4, 0xd6, 0x9c, + 0xfe, 0x27, 0xed, 0xb5, 0xe0, 0x10, 0x35, 0xfa, 0x08, 0xd2, 0x7a, 0xbf, 0xcd, 0xcc, 0xf7, 0xcd, + 0x11, 0xf8, 0x17, 0xc5, 0xc3, 0xdd, 0x83, 0x09, 0xd1, 0x1a, 0xc5, 0xff, 0x45, 0x1a, 0xd2, 0xe2, + 0xe1, 0x2e, 0xfa, 0xc4, 0x57, 0x62, 0xb9, 0x3b, 0x22, 0x17, 0x6f, 0x85, 0xe5, 0x9f, 0x53, 0x51, + 0x25, 0x96, 0x02, 0x2c, 0xed, 0x8a, 0x95, 0x52, 0xab, 0x22, 0xed, 0x55, 0x6a, 0x95, 0x56, 0x45, + 0xa2, 0x05, 0xa2, 0x3c, 0x87, 0xd6, 0xa0, 0x70, 0x78, 0x54, 0xae, 0x55, 0x9b, 0x07, 0xd2, 0x51, + 0xdd, 0xfe, 0x8b, 0xf5, 0xa6, 0x50, 0x1e, 0x66, 0x6b, 0xd5, 0x66, 0x8b, 0x35, 0x34, 0xf3, 0x69, + 0xab, 0x65, 0xbf, 0xd2, 0x92, 0x76, 0x4b, 0x87, 0xa5, 0xdd, 0x6a, 0xeb, 0x69, 0x3e, 0x83, 0x78, + 0x58, 0xf1, 0xf3, 0x6e, 0xd6, 0x4b, 0x87, 0xcd, 0x83, 0x46, 0x2b, 0x9f, 0x45, 0x08, 0xe6, 0xc9, + 0x78, 0xbb, 0xa9, 0x99, 0xcf, 0x59, 0x1c, 0x76, 0x6b, 0x8d, 0xba, 0x23, 0xc3, 0x24, 0x5a, 0x82, + 0xbc, 0x3d, 0xb3, 0x58, 0x29, 0xed, 0x11, 0x40, 0x6f, 0x0a, 0x2d, 0xc0, 0x5c, 0xe5, 0x87, 0x87, + 0xa5, 0xfa, 0x9e, 0x4d, 0x38, 0x8d, 0x36, 0x60, 0xcd, 0x2b, 0x8e, 0xc4, 0x46, 0x55, 0xf6, 0x08, + 0x28, 0xd7, 0xcc, 0x03, 0xba, 0x06, 0x79, 0x56, 0xfb, 0xda, 0x6d, 0xd4, 0xf7, 0xaa, 0xad, 0x6a, + 0xa3, 0x9e, 0x9f, 0xa1, 0x08, 0xde, 0x22, 0x80, 0x25, 0x39, 0x63, 0x36, 0x3b, 0x1c, 0xd6, 0x9b, + 0xa3, 0xb0, 0x9e, 0x8d, 0x58, 0xff, 0x26, 0x05, 0xcb, 0x14, 0xb2, 0xb6, 0x01, 0x72, 0xdb, 0x57, + 0x6d, 0x41, 0x9e, 0xe2, 0x5d, 0x52, 0xf0, 0x16, 0x98, 0xa7, 0xed, 0x4f, 0xec, 0xbc, 0xc3, 0x2e, + 0x2f, 0xa5, 0x3c, 0xe5, 0xa5, 0x6a, 0x30, 0x0b, 0xbb, 0xe3, 0x2f, 0xc4, 0x04, 0x66, 0x4b, 0x4a, + 0xec, 0x1f, 0x47, 0xa4, 0x09, 0xf7, 0x92, 0xb9, 0x25, 0x85, 0x50, 0x17, 0xc9, 0xe2, 0x2f, 0xe8, + 0xe5, 0x1e, 0xc2, 0x4a, 0x50, 0x5e, 0x66, 0xd0, 0x77, 0x43, 0xe5, 0x12, 0xc7, 0xed, 0x3a, 0xb4, + 0x0e, 0x85, 0xf0, 0x93, 0x14, 0x4c, 0xd9, 0xcd, 0x56, 0x78, 0x63, 0xf9, 0x25, 0x1f, 0x52, 0x3a, + 0x6d, 0xb5, 0x38, 0xc0, 0xab, 0xb7, 0xd0, 0x91, 0x0a, 0x16, 0x3a, 0x22, 0xcf, 0x39, 0x1d, 0x79, + 0xce, 0xdf, 0x87, 0xb9, 0xb6, 0x25, 0xbe, 0xa2, 0xa9, 0x92, 0xa9, 0xf4, 0x6c, 0x20, 0x34, 0x5c, + 0x98, 0x6c, 0xd9, 0x6f, 0x0d, 0xc4, 0x59, 0x7b, 0x80, 0xd5, 0x84, 0x36, 0x60, 0x96, 0x14, 0x2a, + 0x25, 0x53, 0x93, 0x06, 0x06, 0x2e, 0x64, 0x09, 0x2c, 0x04, 0xa4, 0xad, 0xa5, 0x1d, 0x19, 0x18, + 0xdd, 0x87, 0x05, 0x02, 0xe2, 0x4b, 0x5e, 0x99, 0x73, 0x96, 0x34, 0x2c, 0x6a, 0x22, 0xbd, 0x4d, + 0x47, 0x7a, 0xe1, 0xef, 0x38, 0x58, 0xa6, 0xf0, 0x58, 0x50, 0x7f, 0x87, 0x55, 0x78, 0xbc, 0x2a, + 0x1a, 0xb8, 0x3e, 0x23, 0x19, 0xbe, 0x2a, 0x74, 0xa0, 0x00, 0x2b, 0xc1, 0xf9, 0x18, 0x24, 0xf0, + 0x8b, 0x14, 0x2c, 0x59, 0xb1, 0x9c, 0xdd, 0x71, 0xd9, 0xe1, 0xf6, 0x18, 0x47, 0x1f, 0xd8, 0xcc, + 0x4c, 0x68, 0x33, 0x0f, 0x82, 0x09, 0xf7, 0x5b, 0xde, 0x68, 0x34, 0xb8, 0x82, 0x57, 0xb5, 0x97, + 0x3f, 0xe3, 0x60, 0x39, 0x30, 0x1f, 0x33, 0xb0, 0x8f, 0x83, 0x19, 0xc4, 0xcd, 0x18, 0xf9, 0x5e, + 0x2a, 0x87, 0x78, 0xdf, 0x8e, 0xdd, 0xc7, 0xb3, 0xe3, 0x7f, 0x49, 0xc1, 0x75, 0xf7, 0x16, 0x24, + 0x6f, 0x0b, 0x3a, 0x63, 0x40, 0x60, 0x17, 0x2b, 0xe1, 0x7f, 0x1a, 0xf4, 0xd0, 0xdb, 0xe1, 0x8b, + 0x39, 0x42, 0xa4, 0x24, 0x4f, 0x1d, 0x89, 0x1c, 0x67, 0xc6, 0x45, 0x8e, 0x2f, 0xa4, 0x01, 0xbf, + 0xeb, 0x05, 0xc5, 0xfd, 0xe2, 0x33, 0x4d, 0x18, 0xb1, 0xba, 0xf4, 0x01, 0x5c, 0x25, 0xe9, 0x82, + 0xf3, 0x70, 0xc6, 0x2e, 0xd8, 0x53, 0x1f, 0x3a, 0x25, 0x2e, 0x5b, 0xdd, 0xce, 0x7b, 0x10, 0x56, + 0x51, 0xe9, 0x08, 0xdf, 0x66, 0x60, 0xc5, 0x4a, 0x27, 0x9a, 0xa6, 0x7c, 0x3a, 0x4e, 0xad, 0xe1, + 0xb7, 0xc2, 0xd0, 0x6d, 0xca, 0x7f, 0x2c, 0xd1, 0x5c, 0x47, 0x41, 0x6c, 0x51, 0x11, 0x16, 0x0d, + 0x53, 0x3e, 0x25, 0xee, 0x40, 0xd6, 0x4f, 0xb1, 0x29, 0xf5, 0x65, 0xf3, 0x39, 0xb3, 0xf5, 0x05, + 0xd6, 0xd5, 0x22, 0x3d, 0x87, 0xb2, 0xf9, 0xfc, 0x92, 0x0e, 0x12, 0xfd, 0x20, 0xe8, 0x14, 0xde, + 0x1e, 0xb2, 0x96, 0x04, 0xdd, 0xfa, 0x61, 0x0c, 0xbc, 0xff, 0xee, 0x10, 0x96, 0xc3, 0x61, 0xfd, + 0x8b, 0xc3, 0xd9, 0xaf, 0xb9, 0x32, 0x70, 0x0d, 0xae, 0x86, 0x16, 0xcf, 0xae, 0x90, 0x53, 0x28, + 0x58, 0x5d, 0x47, 0xaa, 0x31, 0xa6, 0x3a, 0xc6, 0x68, 0x4c, 0x2a, 0x46, 0x63, 0x84, 0x55, 0xb8, + 0x16, 0x31, 0x11, 0x93, 0xe2, 0x97, 0x59, 0x2a, 0xc6, 0xf8, 0x45, 0xaa, 0xcf, 0xe3, 0xac, 0xe2, + 0x3d, 0xef, 0xb1, 0x47, 0xd6, 0x73, 0x5e, 0x85, 0x5d, 0xdc, 0x80, 0x19, 0x2f, 0x1d, 0xbb, 0x06, + 0xcd, 0x21, 0x86, 0x93, 0xbd, 0x50, 0xed, 0x2c, 0x17, 0xa8, 0x9d, 0xd5, 0x5c, 0xa3, 0x9a, 0xf4, + 0xc7, 0xc2, 0xb1, 0x5b, 0x91, 0x60, 0x56, 0xcf, 0x42, 0x66, 0x35, 0xe5, 0x2f, 0xc8, 0xc5, 0x32, + 0xfd, 0x7f, 0x60, 0x58, 0x4c, 0xa9, 0x23, 0x2b, 0x65, 0xc2, 0x33, 0xe0, 0xa9, 0xc6, 0x8f, 0x5f, + 0xbb, 0x0a, 0xa8, 0x51, 0x2a, 0xa8, 0x46, 0xc2, 0x75, 0x58, 0x8d, 0xe4, 0xcd, 0xa6, 0xfe, 0x23, + 0x8e, 0x0a, 0xe6, 0x80, 0x62, 0x4d, 0x53, 0x36, 0x8d, 0x51, 0xa7, 0x66, 0x9d, 0xde, 0xa9, 0x69, + 0x13, 0xd1, 0xe0, 0x31, 0x4d, 0x42, 0xf8, 0x13, 0x8e, 0xee, 0x43, 0x50, 0x16, 0x76, 0xdb, 0xbe, + 0x05, 0xd9, 0x01, 0xc1, 0xfd, 0x69, 0xd4, 0xb5, 0xe8, 0x37, 0x82, 0x23, 0xab, 0x4b, 0xa4, 0x14, + 0x97, 0x86, 0xa4, 0x0a, 0xbf, 0xe0, 0x60, 0xc6, 0xc3, 0x1f, 0xad, 0xc1, 0xb4, 0x03, 0x15, 0xd9, + 0x09, 0x92, 0xd3, 0x60, 0x1d, 0xbf, 0xa9, 0x99, 0x72, 0x97, 0xbd, 0x49, 0xa1, 0x1f, 0x56, 0x4e, + 0x3b, 0x30, 0x30, 0x0d, 0x87, 0xd3, 0x22, 0xf9, 0x1b, 0xdd, 0x85, 0xcc, 0x40, 0x55, 0x4c, 0x62, + 0xf6, 0xf3, 0x41, 0x7b, 0x26, 0x53, 0x15, 0x8f, 0x54, 0xc5, 0x14, 0x09, 0x95, 0x70, 0x07, 0x32, + 0xd6, 0x97, 0x1f, 0xb2, 0x98, 0x86, 0x6c, 0xf9, 0x69, 0xab, 0xd2, 0xcc, 0x73, 0x08, 0x20, 0x57, + 0xa5, 0x09, 0x7e, 0x4a, 0xa8, 0xd9, 0xef, 0x52, 0x9d, 0x45, 0x58, 0x2e, 0x40, 0x3e, 0x56, 0x35, + 0xbd, 0x27, 0x77, 0x89, 0xcc, 0x53, 0xa2, 0xf3, 0x1d, 0x5f, 0x4e, 0xa1, 0xe0, 0xe3, 0x9a, 0x73, + 0x22, 0x51, 0x00, 0xd3, 0x17, 0x54, 0xb7, 0xe2, 0xa0, 0xa5, 0x52, 0x24, 0xb4, 0x74, 0xdd, 0x77, + 0xcb, 0x0e, 0x01, 0x95, 0xfe, 0x21, 0x05, 0xcb, 0x91, 0x74, 0xe8, 0x7d, 0x2f, 0x9c, 0xb4, 0x99, + 0xc8, 0xd3, 0x0b, 0x24, 0x7d, 0xcb, 0x51, 0x20, 0x69, 0xc7, 0x07, 0x24, 0xdd, 0x1e, 0x3a, 0xde, + 0x0b, 0x21, 0xfd, 0x8c, 0x8b, 0x81, 0x90, 0x9a, 0xad, 0xd2, 0x7e, 0x45, 0x3a, 0xaa, 0xd3, 0x7f, + 0x1d, 0x08, 0x69, 0x09, 0xf2, 0x2e, 0xb0, 0x22, 0x35, 0x5b, 0x25, 0xf2, 0xbe, 0x38, 0x04, 0xdf, + 0xa4, 0x23, 0xc1, 0x99, 0xcc, 0x70, 0x1c, 0x26, 0x4b, 0x49, 0x56, 0x00, 0xb1, 0xd1, 0x8f, 0x1b, + 0x47, 0xf5, 0x96, 0x44, 0x5e, 0x2f, 0xe7, 0x73, 0x0e, 0x3e, 0xb3, 0x04, 0x88, 0x9d, 0x96, 0xf7, + 0x11, 0xfe, 0x5f, 0x71, 0xb0, 0xe8, 0x6b, 0x66, 0x87, 0xe7, 0x29, 0x8a, 0x73, 0xbe, 0xa2, 0xf8, + 0x7d, 0x58, 0xb2, 0x32, 0x46, 0x6a, 0x29, 0x86, 0xd4, 0xc7, 0x3a, 0x01, 0xc3, 0x99, 0xce, 0x2f, + 0xf4, 0xe4, 0x17, 0xac, 0x60, 0x70, 0x88, 0x75, 0x8b, 0xf1, 0x25, 0x40, 0xc2, 0xc2, 0xd7, 0x69, + 0x1a, 0x97, 0x8c, 0x9d, 0xd7, 0x0c, 0xf5, 0x51, 0xe1, 0xc4, 0x27, 0x3d, 0x46, 0xe2, 0x13, 0xe3, + 0xe1, 0x32, 0x63, 0x05, 0xc3, 0xe3, 0xdf, 0xe9, 0x75, 0xf7, 0xde, 0xa6, 0x91, 0xeb, 0x5d, 0xaf, + 0xfe, 0x0e, 0xcd, 0xb4, 0x72, 0x5f, 0x97, 0xb9, 0x9f, 0x5e, 0x56, 0x9e, 0x5c, 0xa2, 0xf1, 0xd8, + 0x05, 0xf2, 0x23, 0xe1, 0x4d, 0xb8, 0x45, 0x9e, 0x55, 0x0e, 0x05, 0xb4, 0xcf, 0xe0, 0xf6, 0x30, + 0x42, 0x36, 0x73, 0x2d, 0xd2, 0xf5, 0x38, 0x65, 0xad, 0x00, 0x97, 0x61, 0x5e, 0xe8, 0xc7, 0x29, + 0xd8, 0x18, 0x36, 0x04, 0x7d, 0xe2, 0x75, 0x48, 0x77, 0x47, 0x9d, 0xc9, 0xeb, 0x9b, 0xfe, 0x8c, + 0xf9, 0xa6, 0x8a, 0xcf, 0x37, 0xbd, 0x3b, 0x0e, 0x2b, 0xaf, 0x9b, 0xaa, 0x44, 0x79, 0xa9, 0x77, + 0xe0, 0x4d, 0x3f, 0x18, 0xed, 0xf1, 0x4c, 0xf4, 0xe7, 0x0e, 0x0e, 0x3a, 0xcd, 0xf9, 0xe1, 0xdd, + 0x3f, 0x4d, 0xc3, 0x86, 0xf7, 0x45, 0xf2, 0xbe, 0x17, 0x3e, 0x4b, 0xfa, 0x79, 0xc0, 0x1d, 0x58, + 0x08, 0x42, 0x43, 0xf6, 0x0b, 0xdc, 0x2b, 0x7e, 0x6c, 0xc8, 0x48, 0x7a, 0x71, 0x33, 0x64, 0xea, + 0xe4, 0x84, 0x2f, 0x0c, 0xfb, 0x7e, 0x77, 0x64, 0xc6, 0xff, 0x37, 0x11, 0x60, 0x7a, 0x3f, 0x77, + 0x61, 0x33, 0x41, 0x7e, 0x66, 0x0c, 0x65, 0x98, 0xf7, 0x23, 0xa1, 0x4c, 0x49, 0x03, 0xcf, 0x4e, + 0xfd, 0x83, 0xe7, 0x7c, 0xf0, 0x28, 0x9d, 0xed, 0x57, 0x9c, 0xfd, 0x42, 0xdf, 0x47, 0x6b, 0x9d, + 0x70, 0x18, 0x6a, 0xa5, 0x8b, 0x08, 0xa2, 0xac, 0xa8, 0x08, 0xd3, 0x36, 0x95, 0x11, 0x7c, 0xf3, + 0xe9, 0x4c, 0xee, 0x92, 0x84, 0x91, 0xe2, 0xf4, 0x78, 0x48, 0x31, 0x95, 0xfc, 0x27, 0x29, 0xd8, + 0xf0, 0x3e, 0x7d, 0x8c, 0x54, 0xde, 0x71, 0x96, 0xb1, 0x09, 0xb3, 0x1e, 0x2a, 0x5b, 0x9f, 0x67, + 0x5c, 0x18, 0x33, 0x49, 0x97, 0x87, 0x49, 0xf2, 0x8a, 0x30, 0x4d, 0xba, 0x15, 0x37, 0x61, 0x33, + 0x61, 0x7e, 0xfb, 0x09, 0x19, 0x47, 0x7e, 0xa0, 0x76, 0x49, 0x9b, 0xf5, 0x69, 0x10, 0x1e, 0xdf, + 0xf6, 0x54, 0x97, 0x5f, 0xd3, 0x36, 0x28, 0xb0, 0x1e, 0x37, 0xf9, 0x25, 0x9b, 0xcd, 0xf6, 0x7f, + 0x73, 0x30, 0x55, 0xed, 0x60, 0xd5, 0xa4, 0x77, 0xf7, 0x9c, 0xef, 0x77, 0x88, 0x68, 0x2d, 0xe6, + 0xe7, 0x89, 0x64, 0x0b, 0xf8, 0xeb, 0x89, 0x3f, 0x5e, 0x14, 0x26, 0xd0, 0x89, 0xe7, 0x37, 0x94, + 0xbe, 0xaa, 0xfe, 0x1b, 0xa1, 0x91, 0x11, 0x57, 0x2a, 0x7f, 0x6b, 0x08, 0x95, 0x33, 0xcf, 0x07, + 0x90, 0x25, 0xbf, 0x29, 0x43, 0x4b, 0xce, 0xef, 0xda, 0x3c, 0x3f, 0x39, 0xe3, 0x97, 0x03, 0xad, + 0xf6, 0xb8, 0xed, 0x7f, 0x9a, 0x06, 0x70, 0x2f, 0x2d, 0xf4, 0x08, 0x66, 0xbd, 0x0e, 0x0b, 0xad, + 0x26, 0xfc, 0xa8, 0x8a, 0x5f, 0x8b, 0xee, 0x74, 0x64, 0x7a, 0x04, 0xb3, 0x5e, 0x55, 0x76, 0x99, + 0x45, 0xbc, 0xa9, 0x76, 0x99, 0x45, 0x3e, 0x81, 0x9e, 0x40, 0x5d, 0xb8, 0x1a, 0xf3, 0xa2, 0x15, + 0xdd, 0x1e, 0xed, 0xdd, 0x2f, 0xff, 0xe6, 0x88, 0x4f, 0x63, 0x85, 0x09, 0xa4, 0xc3, 0xb5, 0xd8, + 0x87, 0x9c, 0x68, 0x6b, 0xd4, 0x67, 0xa6, 0xfc, 0x5b, 0x23, 0x50, 0x3a, 0x73, 0x0e, 0x80, 0x8f, + 0x7f, 0x3d, 0x86, 0xde, 0x1a, 0xf9, 0x59, 0x23, 0x7f, 0x67, 0xf4, 0xc7, 0x68, 0xc2, 0x04, 0x3a, + 0x80, 0x19, 0xcf, 0x33, 0x22, 0xc4, 0x47, 0xbe, 0x2d, 0xa2, 0x8c, 0x57, 0x13, 0xde, 0x1d, 0x51, + 0x4e, 0x9e, 0x97, 0x1d, 0x2e, 0xa7, 0xf0, 0x1b, 0x15, 0x97, 0x53, 0xc4, 0x53, 0x90, 0xe0, 0xf6, + 0x07, 0x82, 0xc8, 0xa8, 0xed, 0x8f, 0x0e, 0x48, 0xa3, 0xb6, 0x3f, 0x26, 0x22, 0x15, 0x26, 0xd0, + 0xa7, 0x30, 0xef, 0x2f, 0xd9, 0xa2, 0xeb, 0x89, 0xa5, 0x67, 0x7e, 0x3d, 0xae, 0xdb, 0xcb, 0xd2, + 0x5f, 0xf0, 0x73, 0x59, 0x46, 0x16, 0x1e, 0x5d, 0x96, 0x31, 0x75, 0xc2, 0x09, 0xcb, 0x3f, 0xf9, + 0xca, 0x58, 0xae, 0x7f, 0x8a, 0xaa, 0xbe, 0xb9, 0xfe, 0x29, 0xb2, 0xf6, 0x25, 0x4c, 0x20, 0x05, + 0x56, 0xa2, 0xab, 0x28, 0xe8, 0xd6, 0x48, 0x45, 0x22, 0xfe, 0xf6, 0x30, 0x32, 0x67, 0xaa, 0x36, + 0x2c, 0x46, 0xbc, 0xf2, 0x42, 0x42, 0xe2, 0x13, 0x30, 0x3a, 0xc9, 0xcd, 0x11, 0x9e, 0x89, 0x09, + 0xc4, 0x99, 0xff, 0x57, 0x1a, 0xae, 0x04, 0x22, 0x71, 0xf4, 0xfb, 0x1c, 0xac, 0x27, 0x27, 0x26, + 0xe8, 0x5e, 0x4c, 0x14, 0x1f, 0xa3, 0x58, 0xc5, 0x51, 0xc9, 0x3d, 0xc6, 0x7d, 0x2d, 0x36, 0x12, + 0x44, 0x5b, 0xa3, 0x06, 0xbb, 0x1e, 0x8d, 0x1e, 0x16, 0x56, 0x92, 0xed, 0xb0, 0xa6, 0x8d, 0x8d, + 0x26, 0xd0, 0xd6, 0xa8, 0x01, 0x8f, 0x3b, 0xed, 0xf0, 0xd0, 0x84, 0x4c, 0xdb, 0x85, 0x95, 0xe8, + 0xdb, 0x1b, 0xdd, 0x1a, 0x29, 0xb4, 0x70, 0xb5, 0x2a, 0x39, 0x08, 0x20, 0xb3, 0x91, 0x3c, 0x68, + 0xfb, 0xdf, 0xb2, 0x90, 0x21, 0x78, 0x46, 0x0b, 0xae, 0x04, 0x6a, 0x24, 0x68, 0x3d, 0xb9, 0x72, + 0xc4, 0xdf, 0x88, 0xed, 0x77, 0xce, 0xef, 0x19, 0x2c, 0x84, 0xaa, 0x1e, 0x68, 0xc3, 0x3b, 0x2e, + 0xaa, 0xf2, 0xc2, 0x6f, 0x26, 0x50, 0x04, 0x79, 0xfb, 0x2f, 0xb5, 0x8d, 0x61, 0xb0, 0xbc, 0x9f, + 0x77, 0xdc, 0x45, 0xf6, 0x05, 0x85, 0x8f, 0x82, 0x57, 0x98, 0xe0, 0x97, 0x2b, 0xf2, 0xf2, 0xba, + 0x99, 0x48, 0xe3, 0xcc, 0xf0, 0xb9, 0x83, 0x5b, 0x79, 0x50, 0x61, 0xe4, 0x13, 0x2e, 0x12, 0xbd, + 0xe6, 0x85, 0x24, 0x12, 0x87, 0xfd, 0x67, 0x90, 0x0f, 0x02, 0x18, 0xe8, 0xc6, 0x10, 0x3c, 0x85, + 0xdf, 0x88, 0x27, 0x08, 0xee, 0x4c, 0xd0, 0x13, 0x04, 0xa5, 0x8a, 0x32, 0xff, 0x9b, 0x89, 0x34, + 0xde, 0xfb, 0xd0, 0x03, 0xdd, 0xb9, 0xf7, 0x61, 0x18, 0xe6, 0x73, 0xef, 0xc3, 0x08, 0xac, 0x4f, + 0x98, 0xd8, 0x79, 0x00, 0x20, 0x77, 0xfb, 0xcf, 0x65, 0x09, 0xab, 0x83, 0x1e, 0x5a, 0x0b, 0x25, + 0x57, 0x15, 0x75, 0xd0, 0x6b, 0xf4, 0xad, 0x9c, 0xca, 0x28, 0xfc, 0xcd, 0x14, 0xc1, 0x90, 0xa7, + 0xc9, 0x00, 0xab, 0x63, 0xa7, 0x06, 0x79, 0x77, 0xb4, 0x44, 0x02, 0x6d, 0xb4, 0x19, 0xc9, 0x83, + 0x3c, 0x6a, 0x0c, 0x30, 0x9a, 0x77, 0x18, 0x91, 0xde, 0x9d, 0x8f, 0x01, 0xda, 0x86, 0x22, 0xd1, + 0x48, 0x1f, 0x5d, 0x0f, 0xf1, 0x79, 0xa8, 0xe0, 0x6e, 0xc7, 0xe6, 0xf1, 0xd7, 0x4c, 0x98, 0xb6, + 0xa1, 0xd0, 0x7c, 0x60, 0xe7, 0xfb, 0x30, 0x43, 0x85, 0x39, 0xb1, 0xe8, 0x86, 0x8d, 0x67, 0x32, + 0xd0, 0xd5, 0x93, 0x9e, 0x9d, 0x0a, 0xcc, 0x51, 0x06, 0x0c, 0x09, 0x47, 0x37, 0x42, 0x2c, 0x1e, + 0xd3, 0x9e, 0x00, 0x93, 0x59, 0x32, 0x8c, 0xf5, 0xed, 0x94, 0x61, 0xd6, 0x66, 0x63, 0x3e, 0xd7, + 0x3a, 0x68, 0x3d, 0x82, 0x8b, 0xd5, 0x11, 0x60, 0x32, 0xc3, 0x98, 0x58, 0x5d, 0xae, 0x28, 0xf6, + 0xff, 0xc2, 0x11, 0x16, 0x85, 0xc1, 0x40, 0x91, 0xa2, 0xb0, 0xbe, 0x72, 0xf6, 0x59, 0xba, 0x6d, + 0x28, 0xc7, 0x39, 0x32, 0xe8, 0x3b, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xea, 0xf0, 0x01, 0x41, + 0x32, 0x46, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6744,7 +6663,7 @@ type GroupControllerClient interface { GroupControllerGetCapabilities(ctx context.Context, in *GroupControllerGetCapabilitiesRequest, opts ...grpc.CallOption) (*GroupControllerGetCapabilitiesResponse, error) CreateVolumeGroupSnapshot(ctx context.Context, in *CreateVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*CreateVolumeGroupSnapshotResponse, error) DeleteVolumeGroupSnapshot(ctx context.Context, in *DeleteVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*DeleteVolumeGroupSnapshotResponse, error) - ControllerGetVolumeGroupSnapshot(ctx context.Context, in *ControllerGetVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*ControllerGetVolumeGroupSnapshotResponse, error) + GetVolumeGroupSnapshot(ctx context.Context, in *GetVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*GetVolumeGroupSnapshotResponse, error) } type groupControllerClient struct { @@ -6782,9 +6701,9 @@ func (c *groupControllerClient) DeleteVolumeGroupSnapshot(ctx context.Context, i return out, nil } -func (c *groupControllerClient) ControllerGetVolumeGroupSnapshot(ctx context.Context, in *ControllerGetVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*ControllerGetVolumeGroupSnapshotResponse, error) { - out := new(ControllerGetVolumeGroupSnapshotResponse) - err := c.cc.Invoke(ctx, "/csi.v1.GroupController/ControllerGetVolumeGroupSnapshot", in, out, opts...) +func (c *groupControllerClient) GetVolumeGroupSnapshot(ctx context.Context, in *GetVolumeGroupSnapshotRequest, opts ...grpc.CallOption) (*GetVolumeGroupSnapshotResponse, error) { + out := new(GetVolumeGroupSnapshotResponse) + err := c.cc.Invoke(ctx, "/csi.v1.GroupController/GetVolumeGroupSnapshot", in, out, opts...) if err != nil { return nil, err } @@ -6796,7 +6715,7 @@ type GroupControllerServer interface { GroupControllerGetCapabilities(context.Context, *GroupControllerGetCapabilitiesRequest) (*GroupControllerGetCapabilitiesResponse, error) CreateVolumeGroupSnapshot(context.Context, *CreateVolumeGroupSnapshotRequest) (*CreateVolumeGroupSnapshotResponse, error) DeleteVolumeGroupSnapshot(context.Context, *DeleteVolumeGroupSnapshotRequest) (*DeleteVolumeGroupSnapshotResponse, error) - ControllerGetVolumeGroupSnapshot(context.Context, *ControllerGetVolumeGroupSnapshotRequest) (*ControllerGetVolumeGroupSnapshotResponse, error) + GetVolumeGroupSnapshot(context.Context, *GetVolumeGroupSnapshotRequest) (*GetVolumeGroupSnapshotResponse, error) } // UnimplementedGroupControllerServer can be embedded to have forward compatible implementations. @@ -6812,8 +6731,8 @@ func (*UnimplementedGroupControllerServer) CreateVolumeGroupSnapshot(ctx context func (*UnimplementedGroupControllerServer) DeleteVolumeGroupSnapshot(ctx context.Context, req *DeleteVolumeGroupSnapshotRequest) (*DeleteVolumeGroupSnapshotResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteVolumeGroupSnapshot not implemented") } -func (*UnimplementedGroupControllerServer) ControllerGetVolumeGroupSnapshot(ctx context.Context, req *ControllerGetVolumeGroupSnapshotRequest) (*ControllerGetVolumeGroupSnapshotResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControllerGetVolumeGroupSnapshot not implemented") +func (*UnimplementedGroupControllerServer) GetVolumeGroupSnapshot(ctx context.Context, req *GetVolumeGroupSnapshotRequest) (*GetVolumeGroupSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVolumeGroupSnapshot not implemented") } func RegisterGroupControllerServer(s *grpc.Server, srv GroupControllerServer) { @@ -6874,20 +6793,20 @@ func _GroupController_DeleteVolumeGroupSnapshot_Handler(srv interface{}, ctx con return interceptor(ctx, in, info, handler) } -func _GroupController_ControllerGetVolumeGroupSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControllerGetVolumeGroupSnapshotRequest) +func _GroupController_GetVolumeGroupSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetVolumeGroupSnapshotRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(GroupControllerServer).ControllerGetVolumeGroupSnapshot(ctx, in) + return srv.(GroupControllerServer).GetVolumeGroupSnapshot(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/csi.v1.GroupController/ControllerGetVolumeGroupSnapshot", + FullMethod: "/csi.v1.GroupController/GetVolumeGroupSnapshot", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupControllerServer).ControllerGetVolumeGroupSnapshot(ctx, req.(*ControllerGetVolumeGroupSnapshotRequest)) + return srv.(GroupControllerServer).GetVolumeGroupSnapshot(ctx, req.(*GetVolumeGroupSnapshotRequest)) } return interceptor(ctx, in, info, handler) } @@ -6909,8 +6828,8 @@ var _GroupController_serviceDesc = grpc.ServiceDesc{ Handler: _GroupController_DeleteVolumeGroupSnapshot_Handler, }, { - MethodName: "ControllerGetVolumeGroupSnapshot", - Handler: _GroupController_ControllerGetVolumeGroupSnapshot_Handler, + MethodName: "GetVolumeGroupSnapshot", + Handler: _GroupController_GetVolumeGroupSnapshot_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/spec.md b/spec.md index d993baad..7a1e98c6 100644 --- a/spec.md +++ b/spec.md @@ -400,9 +400,9 @@ service GroupController { option (alpha_method) = true; } - rpc ControllerGetVolumeGroupSnapshot( - ControllerGetVolumeGroupSnapshotRequest) - returns (ControllerGetVolumeGroupSnapshotResponse) { + rpc GetVolumeGroupSnapshot( + GetVolumeGroupSnapshotRequest) + returns (GetVolumeGroupSnapshotResponse) { option (alpha_method) = true; } } @@ -1966,7 +1966,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| -| Snapshot in use | 9 FAILED_PRECONDITION | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is in use by another resource. | Caller SHOULD ensure that there are no other resources using the snapshot, and then retry with exponential back off. | +| Snapshot in use | 9 FAILED_PRECONDITION | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is in use by another resource or it is part of a group snapshot. | Caller SHOULD ensure that there are no other resources using the snapshot, and then retry with exponential back off. | | Operation pending for snapshot | 10 ABORTED | Indicates that there is already an operation pending for the specified snapshot. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per snapshot at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same snapshot. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified snapshot, and then retry with exponential back off. | @@ -2859,7 +2859,7 @@ message CreateVolumeGroupSnapshotRequest { // (These are control characters other than commonly used whitespace.) string name = 1; - // volume ids of the source volumes to be snapshotted together. + // volume IDs of the source volumes to be snapshotted together. // This field is REQUIRED. repeated string source_volume_ids = 2; @@ -2867,35 +2867,14 @@ message CreateVolumeGroupSnapshotRequest { // ControllerCreateVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerDeleteVolumeGroupSnapshot - // and ControllerGetVolumeGroupSnapshot requests for the same - // group snapshot unless if secrets are rotated after the - // group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. map secrets = 3 [(csi_secret) = true]; - // Volume secrets required by plugin to complete volume group - // snapshot creation request. This field is needed in case the - // volume level secrets are different from the above secrets - // for the group snapshot. - // This field is OPTIONAL. - repeated VolumeSecret volume_secrets = 4; - // Plugin specific parameters passed in as opaque key-value pairs. // This field is OPTIONAL. The Plugin is responsible for parsing and // validating these parameters. COs will treat these as opaque. - map parameters = 5; -} - -message VolumeSecret { - // ID of the volume whose secrets are provided. - // This field is REQUIRED. - string volume_id = 1; - - // Secrets required by plugin for a volume operation. - // This field is REQUIRED. Refer to the `Secrets Requirements` - // section on how to use this field. - map secrets = 2 [(.csi.v1.csi_secret) = true]; + map parameters = 4; } message CreateVolumeGroupSnapshotResponse { @@ -2920,11 +2899,11 @@ message VolumeGroupSnapshot { // This field is REQUIRED. string group_snapshot_id = 1; - // A list of snapshots created. + // A list of snapshots belonging to this group. // This field is REQUIRED. repeated Snapshot snapshots = 2; - // Timestamp when the volume group snapshot is taken. + // Timestamp of when the volume group snapshot was taken. // This field is REQUIRED. .google.protobuf.Timestamp creation_time = 3; } @@ -2961,7 +2940,7 @@ message DeleteVolumeGroupSnapshotRequest { // This field is REQUIRED. string group_snapshot_id = 1; - // A list of snapshot ids that are part of this group snapshot. + // A list of snapshot IDs that are part of this group snapshot. // Some SPs require this list to delete the snapshots in the group. // This field is REQUIRED. repeated string snapshot_ids = 2; @@ -2970,10 +2949,8 @@ message DeleteVolumeGroupSnapshotRequest { // request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerCreateVolumeGroupSnapshot - // request for the same group snapshot unless if secrets are rotated - // after the group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. // The secrets provided in the field SHOULD be passed to both // the group snapshot and the individual snapshot members if needed. map secrets = 3 [(csi_secret) = true]; @@ -2994,20 +2971,20 @@ The CO MUST implement the specified error recovery behavior when it encounters t |-----------|-----------|-------------|-------------------| | Volume group snapshot in use | 9 FAILED_PRECONDITION | Indicates that the volume group snapshot corresponding to the specified `group_snapshot_id` could not be deleted because it is in use by another resource. | Caller SHOULD ensure that there are no other resources using the volume group snapshot, and then retry with exponential back off. | -#### `ControllerGetVolumeGroupSnapshot` +#### `GetVolumeGroupSnapshot` **ALPHA FEATURE** This optional RPC MAY be called by the CO to fetch current information about a volume group snapshot. -A Controller Plugin MUST implement this `ControllerGetVolumeGroupSnapshot` RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` capability. +A Controller Plugin MUST implement this `GetVolumeGroupSnapshot` RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` capability. -`ControllerGetVolumeGroupSnapshot` SHALL NOT show a group snapshot that is being created but has not been created successfully yet. -`ControllerGetVolumeGroupSnapshotResponse` should contain current information of a volume group snapshot if it exists. -If the volume group snapshot does not exist any more, `ControllerGetVolumeGroupSnapshot` should return gRPC error code `NOT_FOUND`. +`GetVolumeGroupSnapshot` SHALL NOT show a group snapshot that is being created but has not been created successfully yet. +`GetVolumeGroupSnapshotResponse` should contain current information of a volume group snapshot if it exists. +If the volume group snapshot does not exist any more, `GetVolumeGroupSnapshot` should return gRPC error code `NOT_FOUND`. ```protobuf -message ControllerGetVolumeGroupSnapshotRequest { +message GetVolumeGroupSnapshotRequest { option (alpha_message) = true; // The ID of the group snapshot to fetch current group snapshot @@ -3016,17 +2993,15 @@ message ControllerGetVolumeGroupSnapshotRequest { string group_snapshot_id = 1; // Secrets required by plugin to complete - // ControllerGetVolumeGroupSnapshot request. + // GetVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. - // The secrets provided in this field SHOULD be the same as - // the secrets provided in ControllerCreateVolumeGroupSnapshot - // request for the same group snapshot unless if secrets are rotated - // after the group snapshot is created. + // The secrets provided in this field SHOULD be the same for + // all group snapshot operations on the same group snapshot. map secrets = 2 [(csi_secret) = true]; } -message ControllerGetVolumeGroupSnapshotResponse { +message GetVolumeGroupSnapshotResponse { option (alpha_message) = true; // This field is REQUIRED @@ -3034,9 +3009,9 @@ message ControllerGetVolumeGroupSnapshotResponse { } ``` -##### ControllerGetVolumeGroupSnapshot Errors +##### GetVolumeGroupSnapshot Errors -If the plugin is unable to complete the ControllerGetVolumeGroupSnapshot call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the plugin is unable to complete the GetVolumeGroupSnapshot call successfully, it MUST return a non-ok gRPC code in the gRPC status. If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. From 11d9ad36d464ebab9ef161134ec5096fb8ce1077 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Sat, 28 Jan 2023 00:46:18 +0000 Subject: [PATCH 04/13] Add ready_to_use back to VolumeGroupSnapshot --- csi.proto | 8 ++ lib/go/csi/csi.pb.go | 334 ++++++++++++++++++++++--------------------- spec.md | 12 +- 3 files changed, 191 insertions(+), 163 deletions(-) diff --git a/csi.proto b/csi.proto index 9a81c8d2..c9fe06e9 100644 --- a/csi.proto +++ b/csi.proto @@ -1767,6 +1767,14 @@ message VolumeGroupSnapshot { // Timestamp of when the volume group snapshot was taken. // This field is REQUIRED. .google.protobuf.Timestamp creation_time = 3; + + // Indicates if all individual snapshots in the group snapshot + // are ready to use as a `volume_content_source` in a + // `CreateVolumeRequest`. The default value is false. + // CO MUST wait until all snapshots are ready to use before + // setting this field to true. + // This field is REQUIRED. + bool ready_to_use = 4; } message DeleteVolumeGroupSnapshotRequest { option (alpha_message) = true; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index f8002b50..1873119f 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -5287,10 +5287,17 @@ type VolumeGroupSnapshot struct { Snapshots []*Snapshot `protobuf:"bytes,2,rep,name=snapshots,proto3" json:"snapshots,omitempty"` // Timestamp of when the volume group snapshot was taken. // This field is REQUIRED. - CreationTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + CreationTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` + // Indicates if all individual snapshots in the group snapshot + // are ready to use as a `volume_content_source` in a + // `CreateVolumeRequest`. The default value is false. + // CO MUST wait until all snapshots are ready to use before + // setting this field to true. + // This field is REQUIRED. + ReadyToUse bool `protobuf:"varint,4,opt,name=ready_to_use,json=readyToUse,proto3" json:"ready_to_use,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *VolumeGroupSnapshot) Reset() { *m = VolumeGroupSnapshot{} } @@ -5339,6 +5346,13 @@ func (m *VolumeGroupSnapshot) GetCreationTime() *timestamp.Timestamp { return nil } +func (m *VolumeGroupSnapshot) GetReadyToUse() bool { + if m != nil { + return m.ReadyToUse + } + return false +} + type DeleteVolumeGroupSnapshotRequest struct { // The ID of the group snapshot to be deleted. // This field is REQUIRED. @@ -5736,96 +5750,96 @@ func init() { } var fileDescriptor_9cdb00adce470e01 = []byte{ - // 4164 bytes of a gzipped FileDescriptorProto + // 4168 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x4d, 0x6c, 0x1b, 0x49, 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xd3, 0x8f, 0xa9, 0xd2, 0x8f, 0xe9, 0x96, 0x2c, 0x4b, 0xed, 0xb1, 0x47, 0xe3, 0xb1, 0xe9, 0x19, 0xed, 0xcc, 0x60, 0x47, 0xe3, 0xd9, 0x1d, 0x52, 0xa2, 0x25, 0xae, 0x69, 0x52, 0xd3, 0xa4, 0x3c, 0x6b, 0x27, 0x83, 0x9e, 0x16, 0x59, 0x92, 0x1b, 0x43, 0x76, 0x73, 0xba, 0x9b, 0x8a, 0xb5, 0x97, 0x24, 0x1b, 0x04, 0xd8, 0x20, 0x97, 0x20, 0x39, 0x64, 0x72, 0xca, - 0x22, 0xc9, 0x71, 0x17, 0x7b, 0x08, 0x16, 0x7b, 0x0c, 0x90, 0x5b, 0x02, 0x04, 0xc9, 0x31, 0xc8, - 0x65, 0x0f, 0x01, 0x72, 0x58, 0x4c, 0x80, 0x39, 0xe5, 0x90, 0x43, 0x10, 0x74, 0x55, 0xf5, 0xff, - 0x0f, 0x49, 0x4b, 0x86, 0x03, 0xe4, 0x64, 0x75, 0xd5, 0xab, 0x57, 0xaf, 0xaa, 0xde, 0x7b, 0xf5, - 0xde, 0xf7, 0x8a, 0x86, 0xf7, 0x4f, 0x15, 0xf3, 0xf9, 0xe0, 0xb8, 0xd8, 0xd6, 0x7a, 0xf7, 0xdb, - 0x9a, 0x6a, 0xca, 0x8a, 0x8a, 0xf5, 0x7b, 0x86, 0xa9, 0xe9, 0xf2, 0x29, 0xbe, 0xa7, 0xa8, 0x26, - 0xd6, 0x4f, 0xe4, 0x36, 0xbe, 0x6f, 0xf4, 0x71, 0xfb, 0x7e, 0xdb, 0x50, 0x8a, 0x7d, 0x5d, 0x33, - 0x35, 0x94, 0xb3, 0xfe, 0x3c, 0x7b, 0x97, 0xdf, 0x38, 0xd5, 0xb4, 0xd3, 0x2e, 0xbe, 0x4f, 0x5a, - 0x8f, 0x07, 0x27, 0xf7, 0x3b, 0xd8, 0x68, 0xeb, 0x4a, 0xdf, 0xd4, 0x74, 0x4a, 0xc9, 0xdf, 0x08, - 0x52, 0x98, 0x4a, 0x0f, 0x1b, 0xa6, 0xdc, 0xeb, 0x33, 0x82, 0xf5, 0x20, 0xc1, 0xef, 0xe8, 0x72, - 0xbf, 0x8f, 0x75, 0x83, 0xf6, 0x0b, 0x2b, 0xb0, 0xb4, 0x8f, 0xcd, 0xc3, 0xee, 0xe0, 0x54, 0x51, - 0xab, 0xea, 0x89, 0x26, 0xe2, 0xaf, 0x06, 0xd8, 0x30, 0x85, 0x7f, 0xe5, 0x60, 0x39, 0xd0, 0x61, - 0xf4, 0x35, 0xd5, 0xc0, 0x08, 0x41, 0x46, 0x95, 0x7b, 0xb8, 0xc0, 0x6d, 0x70, 0x5b, 0xd3, 0x22, - 0xf9, 0x1b, 0xdd, 0x82, 0xf9, 0x33, 0xac, 0x76, 0x34, 0x5d, 0x3a, 0xc3, 0xba, 0xa1, 0x68, 0x6a, - 0x21, 0x45, 0x7a, 0xe7, 0x68, 0xeb, 0x13, 0xda, 0x88, 0xf6, 0x61, 0xaa, 0x27, 0xab, 0xca, 0x09, - 0x36, 0xcc, 0x42, 0x7a, 0x23, 0xbd, 0x35, 0xb3, 0xfd, 0x76, 0x91, 0x2e, 0xb5, 0x18, 0x39, 0x57, - 0xf1, 0x31, 0xa3, 0xae, 0xa8, 0xa6, 0x7e, 0x2e, 0x3a, 0x83, 0xf9, 0x8f, 0x60, 0xce, 0xd7, 0x85, - 0xf2, 0x90, 0xfe, 0x12, 0x9f, 0x33, 0x99, 0xac, 0x3f, 0xd1, 0x12, 0x64, 0xcf, 0xe4, 0xee, 0x00, - 0x33, 0x49, 0xe8, 0xc7, 0x4e, 0xea, 0xbb, 0x9c, 0xb0, 0x0e, 0x6b, 0xce, 0x6c, 0xbb, 0x72, 0x5f, - 0x3e, 0x56, 0xba, 0x8a, 0xa9, 0x60, 0xc3, 0x5e, 0xfa, 0xe7, 0x70, 0x3d, 0xa6, 0x9f, 0xed, 0xc0, - 0x03, 0x98, 0x6d, 0x7b, 0xda, 0x0b, 0x1c, 0x59, 0x4a, 0xc1, 0x5e, 0x4a, 0x60, 0xe4, 0xb9, 0xe8, - 0xa3, 0x16, 0xbe, 0x49, 0x43, 0x3e, 0x48, 0x82, 0x1e, 0xc0, 0xa4, 0x81, 0xf5, 0x33, 0xa5, 0x4d, - 0xf7, 0x75, 0x66, 0x7b, 0x23, 0x8e, 0x5b, 0xb1, 0x49, 0xe9, 0x0e, 0x26, 0x44, 0x7b, 0x08, 0x3a, - 0x82, 0xfc, 0x99, 0xd6, 0x1d, 0xf4, 0xb0, 0x84, 0x5f, 0xf4, 0x65, 0xd5, 0x39, 0x80, 0x99, 0xed, - 0xad, 0x58, 0x36, 0x4f, 0xc8, 0x80, 0x8a, 0x4d, 0x7f, 0x30, 0x21, 0x5e, 0x39, 0xf3, 0x37, 0xf1, - 0xbf, 0xe4, 0x60, 0x92, 0xcd, 0x86, 0x3e, 0x84, 0x8c, 0x79, 0xde, 0xa7, 0xd2, 0xcd, 0x6f, 0xdf, - 0x1a, 0x26, 0x5d, 0xb1, 0x75, 0xde, 0xc7, 0x22, 0x19, 0x22, 0x68, 0x90, 0xb1, 0xbe, 0xd0, 0x0c, - 0x4c, 0x1e, 0xd5, 0x1f, 0xd5, 0x1b, 0x9f, 0xd5, 0xf3, 0x13, 0x68, 0x05, 0xd0, 0x6e, 0xa3, 0xde, - 0x12, 0x1b, 0xb5, 0x5a, 0x45, 0x94, 0x9a, 0x15, 0xf1, 0x49, 0x75, 0xb7, 0x92, 0xe7, 0xd0, 0x1b, - 0xb0, 0xf1, 0xa4, 0x51, 0x3b, 0x7a, 0x5c, 0x91, 0x4a, 0xbb, 0xbb, 0x95, 0x66, 0xb3, 0x5a, 0xae, - 0xd6, 0xaa, 0xad, 0xa7, 0xd2, 0x6e, 0xa3, 0xde, 0x6c, 0x89, 0xa5, 0x6a, 0xbd, 0xd5, 0xcc, 0xa7, - 0xd0, 0x1a, 0x14, 0xf6, 0xc5, 0xc6, 0xd1, 0xa1, 0x14, 0xc1, 0x23, 0xcd, 0xff, 0x98, 0x83, 0x2b, - 0x81, 0xe5, 0xa1, 0x92, 0x4f, 0xfe, 0x7b, 0xa3, 0x6e, 0x8b, 0x77, 0x1d, 0x77, 0xa3, 0xd6, 0x01, - 0x90, 0x6b, 0xd4, 0x6b, 0xd5, 0xba, 0x25, 0xfb, 0x0c, 0x4c, 0x36, 0x1e, 0x3e, 0x24, 0x1f, 0xa9, - 0x72, 0x8e, 0x4e, 0x28, 0xcc, 0xc3, 0xec, 0xa1, 0xae, 0x1d, 0x63, 0x5b, 0xbb, 0x4a, 0x30, 0xc7, - 0xbe, 0x99, 0x36, 0xbd, 0x03, 0x59, 0x1d, 0xcb, 0x9d, 0x73, 0x76, 0xf0, 0x7c, 0x91, 0x5a, 0x6c, - 0xd1, 0xb6, 0xd8, 0x62, 0x59, 0xd3, 0xba, 0x4f, 0x2c, 0xed, 0x15, 0x29, 0xa1, 0xf0, 0x6d, 0x06, - 0x16, 0x77, 0x75, 0x2c, 0x9b, 0x98, 0x4a, 0xcb, 0x58, 0x47, 0x5a, 0xe6, 0x03, 0x98, 0xb7, 0xb4, - 0xaf, 0xad, 0x98, 0xe7, 0x92, 0x2e, 0xab, 0xa7, 0x98, 0x29, 0xc6, 0xb2, 0xbd, 0x03, 0xbb, 0xac, - 0x57, 0xb4, 0x3a, 0xc5, 0xb9, 0xb6, 0xf7, 0x13, 0x55, 0x61, 0x91, 0x29, 0x96, 0x4f, 0xe1, 0xd3, - 0x7e, 0x85, 0xa7, 0x52, 0x78, 0x14, 0x1e, 0x9d, 0xf9, 0x5b, 0x14, 0x6c, 0xa0, 0x47, 0x00, 0x7d, - 0x59, 0x97, 0x7b, 0xd8, 0xc4, 0xba, 0x51, 0xc8, 0xf8, 0xad, 0x3f, 0x62, 0x35, 0xc5, 0x43, 0x87, - 0x9a, 0x5a, 0xbf, 0x67, 0x38, 0xda, 0xb7, 0xcc, 0xa5, 0xad, 0x63, 0xd3, 0x28, 0x64, 0x09, 0xa7, - 0xad, 0x24, 0x4e, 0x4d, 0x4a, 0x4a, 0xd8, 0x94, 0xd3, 0x5f, 0x97, 0x39, 0xd1, 0x1e, 0x8d, 0x1a, - 0xb0, 0x6c, 0x2f, 0x50, 0x53, 0x4d, 0xac, 0x9a, 0x92, 0xa1, 0x0d, 0xf4, 0x36, 0x2e, 0xe4, 0xc8, - 0x2e, 0xad, 0x06, 0x96, 0x48, 0x69, 0x9a, 0x84, 0x44, 0x64, 0x5b, 0xe3, 0x6b, 0x44, 0xcf, 0x80, - 0x97, 0xdb, 0x6d, 0x6c, 0x18, 0x0a, 0xdd, 0x0b, 0x49, 0xc7, 0x5f, 0x0d, 0x14, 0x1d, 0xf7, 0xb0, - 0x6a, 0x1a, 0x85, 0x49, 0x3f, 0xd7, 0x96, 0xd6, 0xd7, 0xba, 0xda, 0xe9, 0xb9, 0xe8, 0xd2, 0x88, - 0xd7, 0x7c, 0xc3, 0x3d, 0x3d, 0x06, 0xff, 0x31, 0x5c, 0x09, 0x6c, 0xca, 0x38, 0x7e, 0x8f, 0xdf, - 0x81, 0x59, 0xef, 0x4e, 0x8c, 0xe5, 0x33, 0xff, 0x38, 0x05, 0x8b, 0x11, 0x7b, 0x80, 0x0e, 0x60, - 0xca, 0x50, 0xe5, 0xbe, 0xf1, 0x5c, 0x33, 0x99, 0xfe, 0xde, 0x49, 0xd8, 0xb2, 0x62, 0x93, 0xd1, - 0xd2, 0xcf, 0x83, 0x09, 0xd1, 0x19, 0x8d, 0xca, 0x90, 0xa3, 0xfb, 0x19, 0xf4, 0x5c, 0x51, 0x7c, - 0x68, 0x9b, 0xc3, 0x85, 0x8d, 0xe4, 0xdf, 0x85, 0x79, 0xff, 0x0c, 0xe8, 0x06, 0xcc, 0xd8, 0x33, - 0x48, 0x4a, 0x87, 0xad, 0x15, 0xec, 0xa6, 0x6a, 0x87, 0x7f, 0x1b, 0x66, 0xbd, 0xcc, 0xd0, 0x2a, - 0x4c, 0x33, 0x85, 0x70, 0xc8, 0xa7, 0x68, 0x43, 0xb5, 0xe3, 0xd8, 0xf4, 0xf7, 0x60, 0xc9, 0xaf, - 0x67, 0xcc, 0x94, 0x6f, 0x3b, 0x6b, 0xa0, 0x7b, 0x31, 0xef, 0x5f, 0x83, 0x2d, 0xa7, 0xf0, 0x97, - 0x59, 0xc8, 0x07, 0x8d, 0x06, 0x3d, 0x80, 0xec, 0x71, 0x57, 0x6b, 0x7f, 0xc9, 0xc6, 0xbe, 0x11, - 0x67, 0x5d, 0xc5, 0xb2, 0x45, 0x45, 0x5b, 0x0f, 0x26, 0x44, 0x3a, 0xc8, 0x1a, 0xdd, 0xd3, 0x06, - 0xaa, 0xc9, 0x76, 0x2f, 0x7e, 0xf4, 0x63, 0x8b, 0xca, 0x1d, 0x4d, 0x06, 0xa1, 0x3d, 0x98, 0xa1, - 0x6a, 0x27, 0xf5, 0xb4, 0x0e, 0x2e, 0xa4, 0x09, 0x8f, 0x9b, 0xb1, 0x3c, 0x4a, 0x84, 0xf6, 0xb1, - 0xd6, 0xc1, 0x22, 0xc8, 0xce, 0xdf, 0xfc, 0x1c, 0xcc, 0x78, 0x64, 0xe3, 0x07, 0x30, 0xe3, 0x99, - 0x0c, 0x5d, 0x85, 0xc9, 0x13, 0x43, 0x72, 0x9c, 0xf0, 0xb4, 0x98, 0x3b, 0x31, 0x88, 0x3f, 0xbd, - 0x01, 0x33, 0x44, 0x0a, 0xe9, 0xa4, 0x2b, 0x9f, 0x1a, 0x85, 0xd4, 0x46, 0xda, 0x3a, 0x23, 0xd2, - 0xf4, 0xd0, 0x6a, 0x41, 0x77, 0x81, 0x39, 0x14, 0x89, 0xd2, 0x9d, 0xea, 0xda, 0xa0, 0x4f, 0x84, - 0x9c, 0x16, 0xd9, 0xc5, 0x47, 0x26, 0xda, 0xb7, 0xda, 0xf9, 0xbf, 0x4d, 0x01, 0xb8, 0x02, 0xa2, - 0x07, 0x90, 0x21, 0x6b, 0xa2, 0x8e, 0x7f, 0x6b, 0x84, 0x35, 0x15, 0xc9, 0xc2, 0xc8, 0x28, 0xe1, - 0x3f, 0x38, 0xc8, 0x10, 0x36, 0xc1, 0xcb, 0xab, 0x59, 0xad, 0xef, 0xd7, 0x2a, 0x52, 0xbd, 0xb1, - 0x57, 0x91, 0x3e, 0x13, 0xab, 0xad, 0x8a, 0x98, 0xe7, 0xd0, 0x2a, 0x5c, 0xf5, 0xb6, 0x8b, 0x95, - 0xd2, 0x5e, 0x45, 0x94, 0x1a, 0xf5, 0xda, 0xd3, 0x7c, 0x0a, 0xf1, 0xb0, 0xf2, 0xf8, 0xa8, 0xd6, - 0xaa, 0x86, 0xfb, 0xd2, 0xd6, 0x7d, 0xe6, 0xe9, 0x63, 0x3c, 0x18, 0xdb, 0x8c, 0xc5, 0xd6, 0xd3, - 0x4b, 0xff, 0x64, 0x9d, 0x59, 0x24, 0xc0, 0x35, 0xef, 0x9c, 0xfe, 0xb1, 0x39, 0x3e, 0xfd, 0xd3, - 0x32, 0x87, 0x36, 0xa1, 0xe0, 0xa5, 0xf1, 0x71, 0x98, 0x24, 0x24, 0xe5, 0x39, 0x47, 0x03, 0x88, - 0x86, 0x7f, 0x06, 0x73, 0xbe, 0x8b, 0xc1, 0x8a, 0xf0, 0x98, 0x27, 0xeb, 0x48, 0xc7, 0xe7, 0x26, - 0x89, 0x7a, 0xb8, 0xad, 0xb4, 0x38, 0x67, 0xb7, 0x96, 0xad, 0x46, 0xeb, 0x2c, 0xbb, 0x4a, 0x4f, - 0x31, 0x19, 0x4d, 0x8a, 0xd0, 0x00, 0x69, 0x22, 0x04, 0xc2, 0xaf, 0x53, 0x90, 0x63, 0x0a, 0x71, - 0xcb, 0x73, 0x35, 0xf9, 0x58, 0xda, 0xad, 0x94, 0xa5, 0xcf, 0x22, 0x53, 0x7e, 0x8b, 0x44, 0x07, - 0x30, 0xef, 0xf5, 0xdf, 0x2f, 0xec, 0xb8, 0x72, 0xd3, 0x7f, 0xce, 0x5e, 0x27, 0xf2, 0x82, 0x45, - 0x93, 0x73, 0x67, 0xde, 0x36, 0x54, 0x86, 0xf9, 0xc0, 0x15, 0x90, 0x19, 0x7e, 0x05, 0xcc, 0xb5, - 0x7d, 0xde, 0xb0, 0x04, 0x8b, 0xb6, 0xf7, 0xee, 0x62, 0xc9, 0x64, 0xde, 0x9d, 0x5d, 0x51, 0xf9, - 0x90, 0xd7, 0x47, 0x2e, 0xb1, 0xdd, 0xc6, 0x7f, 0x02, 0x28, 0x2c, 0xeb, 0x58, 0xae, 0x7a, 0x00, - 0x8b, 0x11, 0xf7, 0x0a, 0x2a, 0xc2, 0x34, 0x39, 0x2a, 0x43, 0x31, 0x31, 0x8b, 0x58, 0xc3, 0x12, - 0xb9, 0x24, 0x16, 0x7d, 0x5f, 0xc7, 0x27, 0x58, 0xd7, 0x71, 0x87, 0xd8, 0x64, 0x24, 0xbd, 0x43, - 0x22, 0xfc, 0x01, 0x07, 0x53, 0x76, 0x3b, 0xda, 0x81, 0x29, 0x03, 0x9f, 0xd2, 0x3b, 0x8f, 0xce, - 0xb5, 0x1e, 0x1c, 0x5b, 0x6c, 0x32, 0x02, 0x16, 0xdb, 0xdb, 0xf4, 0x56, 0x6c, 0xef, 0xeb, 0x1a, - 0x6b, 0xf1, 0xbf, 0xe2, 0x60, 0x71, 0x0f, 0x77, 0x71, 0x30, 0x34, 0x4a, 0x72, 0xeb, 0xde, 0x68, + 0x22, 0xc9, 0x71, 0x17, 0x7b, 0x08, 0x16, 0x39, 0x06, 0xc8, 0x2d, 0x01, 0x82, 0xe4, 0x98, 0xe4, + 0xb2, 0x87, 0x00, 0x39, 0x2c, 0x26, 0xc0, 0x9c, 0x72, 0xc8, 0x21, 0x08, 0xba, 0xaa, 0xfa, 0xff, + 0x87, 0xa4, 0x25, 0xc3, 0x01, 0x72, 0xb2, 0xba, 0xea, 0xd5, 0xab, 0x57, 0x55, 0xef, 0xbd, 0x7a, + 0xef, 0x7b, 0x45, 0xc3, 0xfb, 0xa7, 0x8a, 0xf9, 0x7c, 0x70, 0x5c, 0x6c, 0x6b, 0xbd, 0xfb, 0x6d, + 0x4d, 0x35, 0x65, 0x45, 0xc5, 0xfa, 0x3d, 0xc3, 0xd4, 0x74, 0xf9, 0x14, 0xdf, 0x53, 0x54, 0x13, + 0xeb, 0x27, 0x72, 0x1b, 0xdf, 0x37, 0xfa, 0xb8, 0x7d, 0xbf, 0x6d, 0x28, 0xc5, 0xbe, 0xae, 0x99, + 0x1a, 0xca, 0x59, 0x7f, 0x9e, 0xbd, 0xcb, 0x6f, 0x9c, 0x6a, 0xda, 0x69, 0x17, 0xdf, 0x27, 0xad, + 0xc7, 0x83, 0x93, 0xfb, 0x1d, 0x6c, 0xb4, 0x75, 0xa5, 0x6f, 0x6a, 0x3a, 0xa5, 0xe4, 0x6f, 0x04, + 0x29, 0x4c, 0xa5, 0x87, 0x0d, 0x53, 0xee, 0xf5, 0x19, 0xc1, 0x7a, 0x90, 0xe0, 0xb7, 0x74, 0xb9, + 0xdf, 0xc7, 0xba, 0x41, 0xfb, 0x85, 0x15, 0x58, 0xda, 0xc7, 0xe6, 0x61, 0x77, 0x70, 0xaa, 0xa8, + 0x55, 0xf5, 0x44, 0x13, 0xf1, 0x57, 0x03, 0x6c, 0x98, 0xc2, 0xbf, 0x70, 0xb0, 0x1c, 0xe8, 0x30, + 0xfa, 0x9a, 0x6a, 0x60, 0x84, 0x20, 0xa3, 0xca, 0x3d, 0x5c, 0xe0, 0x36, 0xb8, 0xad, 0x69, 0x91, + 0xfc, 0x8d, 0x6e, 0xc1, 0xfc, 0x19, 0x56, 0x3b, 0x9a, 0x2e, 0x9d, 0x61, 0xdd, 0x50, 0x34, 0xb5, + 0x90, 0x22, 0xbd, 0x73, 0xb4, 0xf5, 0x09, 0x6d, 0x44, 0xfb, 0x30, 0xd5, 0x93, 0x55, 0xe5, 0x04, + 0x1b, 0x66, 0x21, 0xbd, 0x91, 0xde, 0x9a, 0xd9, 0x7e, 0xbb, 0x48, 0x97, 0x5a, 0x8c, 0x9c, 0xab, + 0xf8, 0x98, 0x51, 0x57, 0x54, 0x53, 0x3f, 0x17, 0x9d, 0xc1, 0xfc, 0x47, 0x30, 0xe7, 0xeb, 0x42, + 0x79, 0x48, 0x7f, 0x89, 0xcf, 0x99, 0x4c, 0xd6, 0x9f, 0x68, 0x09, 0xb2, 0x67, 0x72, 0x77, 0x80, + 0x99, 0x24, 0xf4, 0x63, 0x27, 0xf5, 0x5d, 0x4e, 0x58, 0x87, 0x35, 0x67, 0xb6, 0x5d, 0xb9, 0x2f, + 0x1f, 0x2b, 0x5d, 0xc5, 0x54, 0xb0, 0x61, 0x2f, 0xfd, 0x73, 0xb8, 0x1e, 0xd3, 0xcf, 0x76, 0xe0, + 0x01, 0xcc, 0xb6, 0x3d, 0xed, 0x05, 0x8e, 0x2c, 0xa5, 0x60, 0x2f, 0x25, 0x30, 0xf2, 0x5c, 0xf4, + 0x51, 0x0b, 0xdf, 0xa4, 0x21, 0x1f, 0x24, 0x41, 0x0f, 0x60, 0xd2, 0xc0, 0xfa, 0x99, 0xd2, 0xa6, + 0xfb, 0x3a, 0xb3, 0xbd, 0x11, 0xc7, 0xad, 0xd8, 0xa4, 0x74, 0x07, 0x13, 0xa2, 0x3d, 0x04, 0x1d, + 0x41, 0xfe, 0x4c, 0xeb, 0x0e, 0x7a, 0x58, 0xc2, 0x2f, 0xfa, 0xb2, 0xea, 0x1c, 0xc0, 0xcc, 0xf6, + 0x56, 0x2c, 0x9b, 0x27, 0x64, 0x40, 0xc5, 0xa6, 0x3f, 0x98, 0x10, 0xaf, 0x9c, 0xf9, 0x9b, 0xf8, + 0x5f, 0x72, 0x30, 0xc9, 0x66, 0x43, 0x1f, 0x42, 0xc6, 0x3c, 0xef, 0x53, 0xe9, 0xe6, 0xb7, 0x6f, + 0x0d, 0x93, 0xae, 0xd8, 0x3a, 0xef, 0x63, 0x91, 0x0c, 0x11, 0x34, 0xc8, 0x58, 0x5f, 0x68, 0x06, + 0x26, 0x8f, 0xea, 0x8f, 0xea, 0x8d, 0xcf, 0xea, 0xf9, 0x09, 0xb4, 0x02, 0x68, 0xb7, 0x51, 0x6f, + 0x89, 0x8d, 0x5a, 0xad, 0x22, 0x4a, 0xcd, 0x8a, 0xf8, 0xa4, 0xba, 0x5b, 0xc9, 0x73, 0xe8, 0x0d, + 0xd8, 0x78, 0xd2, 0xa8, 0x1d, 0x3d, 0xae, 0x48, 0xa5, 0xdd, 0xdd, 0x4a, 0xb3, 0x59, 0x2d, 0x57, + 0x6b, 0xd5, 0xd6, 0x53, 0x69, 0xb7, 0x51, 0x6f, 0xb6, 0xc4, 0x52, 0xb5, 0xde, 0x6a, 0xe6, 0x53, + 0x68, 0x0d, 0x0a, 0xfb, 0x62, 0xe3, 0xe8, 0x50, 0x8a, 0xe0, 0x91, 0xe6, 0x7f, 0xcc, 0xc1, 0x95, + 0xc0, 0xf2, 0x50, 0xc9, 0x27, 0xff, 0xbd, 0x51, 0xb7, 0xc5, 0xbb, 0x8e, 0xbb, 0x51, 0xeb, 0x00, + 0xc8, 0x35, 0xea, 0xb5, 0x6a, 0xdd, 0x92, 0x7d, 0x06, 0x26, 0x1b, 0x0f, 0x1f, 0x92, 0x8f, 0x54, + 0x39, 0x47, 0x27, 0x14, 0xe6, 0x61, 0xf6, 0x50, 0xd7, 0x8e, 0xb1, 0xad, 0x5d, 0x25, 0x98, 0x63, + 0xdf, 0x4c, 0x9b, 0xde, 0x81, 0xac, 0x8e, 0xe5, 0xce, 0x39, 0x3b, 0x78, 0xbe, 0x48, 0x2d, 0xb6, + 0x68, 0x5b, 0x6c, 0xb1, 0xac, 0x69, 0xdd, 0x27, 0x96, 0xf6, 0x8a, 0x94, 0x50, 0xf8, 0x36, 0x03, + 0x8b, 0xbb, 0x3a, 0x96, 0x4d, 0x4c, 0xa5, 0x65, 0xac, 0x23, 0x2d, 0xf3, 0x01, 0xcc, 0x5b, 0xda, + 0xd7, 0x56, 0xcc, 0x73, 0x49, 0x97, 0xd5, 0x53, 0xcc, 0x14, 0x63, 0xd9, 0xde, 0x81, 0x5d, 0xd6, + 0x2b, 0x5a, 0x9d, 0xe2, 0x5c, 0xdb, 0xfb, 0x89, 0xaa, 0xb0, 0xc8, 0x14, 0xcb, 0xa7, 0xf0, 0x69, + 0xbf, 0xc2, 0x53, 0x29, 0x3c, 0x0a, 0x8f, 0xce, 0xfc, 0x2d, 0x0a, 0x36, 0xd0, 0x23, 0x80, 0xbe, + 0xac, 0xcb, 0x3d, 0x6c, 0x62, 0xdd, 0x28, 0x64, 0xfc, 0xd6, 0x1f, 0xb1, 0x9a, 0xe2, 0xa1, 0x43, + 0x4d, 0xad, 0xdf, 0x33, 0x1c, 0xed, 0x5b, 0xe6, 0xd2, 0xd6, 0xb1, 0x69, 0x14, 0xb2, 0x84, 0xd3, + 0x56, 0x12, 0xa7, 0x26, 0x25, 0x25, 0x6c, 0xca, 0xe9, 0xaf, 0xcb, 0x9c, 0x68, 0x8f, 0x46, 0x0d, + 0x58, 0xb6, 0x17, 0xa8, 0xa9, 0x26, 0x56, 0x4d, 0xc9, 0xd0, 0x06, 0x7a, 0x1b, 0x17, 0x72, 0x64, + 0x97, 0x56, 0x03, 0x4b, 0xa4, 0x34, 0x4d, 0x42, 0x22, 0xb2, 0xad, 0xf1, 0x35, 0xa2, 0x67, 0xc0, + 0xcb, 0xed, 0x36, 0x36, 0x0c, 0x85, 0xee, 0x85, 0xa4, 0xe3, 0xaf, 0x06, 0x8a, 0x8e, 0x7b, 0x58, + 0x35, 0x8d, 0xc2, 0xa4, 0x9f, 0x6b, 0x4b, 0xeb, 0x6b, 0x5d, 0xed, 0xf4, 0x5c, 0x74, 0x69, 0xc4, + 0x6b, 0xbe, 0xe1, 0x9e, 0x1e, 0x83, 0xff, 0x18, 0xae, 0x04, 0x36, 0x65, 0x1c, 0xbf, 0xc7, 0xef, + 0xc0, 0xac, 0x77, 0x27, 0xc6, 0xf2, 0x99, 0x7f, 0x98, 0x82, 0xc5, 0x88, 0x3d, 0x40, 0x07, 0x30, + 0x65, 0xa8, 0x72, 0xdf, 0x78, 0xae, 0x99, 0x4c, 0x7f, 0xef, 0x24, 0x6c, 0x59, 0xb1, 0xc9, 0x68, + 0xe9, 0xe7, 0xc1, 0x84, 0xe8, 0x8c, 0x46, 0x65, 0xc8, 0xd1, 0xfd, 0x0c, 0x7a, 0xae, 0x28, 0x3e, + 0xb4, 0xcd, 0xe1, 0xc2, 0x46, 0xf2, 0xef, 0xc2, 0xbc, 0x7f, 0x06, 0x74, 0x03, 0x66, 0xec, 0x19, + 0x24, 0xa5, 0xc3, 0xd6, 0x0a, 0x76, 0x53, 0xb5, 0xc3, 0xbf, 0x0d, 0xb3, 0x5e, 0x66, 0x68, 0x15, + 0xa6, 0x99, 0x42, 0x38, 0xe4, 0x53, 0xb4, 0xa1, 0xda, 0x71, 0x6c, 0xfa, 0x7b, 0xb0, 0xe4, 0xd7, + 0x33, 0x66, 0xca, 0xb7, 0x9d, 0x35, 0xd0, 0xbd, 0x98, 0xf7, 0xaf, 0xc1, 0x96, 0x53, 0xf8, 0xf3, + 0x2c, 0xe4, 0x83, 0x46, 0x83, 0x1e, 0x40, 0xf6, 0xb8, 0xab, 0xb5, 0xbf, 0x64, 0x63, 0xdf, 0x88, + 0xb3, 0xae, 0x62, 0xd9, 0xa2, 0xa2, 0xad, 0x07, 0x13, 0x22, 0x1d, 0x64, 0x8d, 0xee, 0x69, 0x03, + 0xd5, 0x64, 0xbb, 0x17, 0x3f, 0xfa, 0xb1, 0x45, 0xe5, 0x8e, 0x26, 0x83, 0xd0, 0x1e, 0xcc, 0x50, + 0xb5, 0x93, 0x7a, 0x5a, 0x07, 0x17, 0xd2, 0x84, 0xc7, 0xcd, 0x58, 0x1e, 0x25, 0x42, 0xfb, 0x58, + 0xeb, 0x60, 0x11, 0x64, 0xe7, 0x6f, 0x7e, 0x0e, 0x66, 0x3c, 0xb2, 0xf1, 0x03, 0x98, 0xf1, 0x4c, + 0x86, 0xae, 0xc2, 0xe4, 0x89, 0x21, 0x39, 0x4e, 0x78, 0x5a, 0xcc, 0x9d, 0x18, 0xc4, 0x9f, 0xde, + 0x80, 0x19, 0x22, 0x85, 0x74, 0xd2, 0x95, 0x4f, 0x8d, 0x42, 0x6a, 0x23, 0x6d, 0x9d, 0x11, 0x69, + 0x7a, 0x68, 0xb5, 0xa0, 0xbb, 0xc0, 0x1c, 0x8a, 0x44, 0xe9, 0x4e, 0x75, 0x6d, 0xd0, 0x27, 0x42, + 0x4e, 0x8b, 0xec, 0xe2, 0x23, 0x13, 0xed, 0x5b, 0xed, 0xfc, 0x5f, 0xa7, 0x00, 0x5c, 0x01, 0xd1, + 0x03, 0xc8, 0x90, 0x35, 0x51, 0xc7, 0xbf, 0x35, 0xc2, 0x9a, 0x8a, 0x64, 0x61, 0x64, 0x94, 0xf0, + 0x1f, 0x1c, 0x64, 0x08, 0x9b, 0xe0, 0xe5, 0xd5, 0xac, 0xd6, 0xf7, 0x6b, 0x15, 0xa9, 0xde, 0xd8, + 0xab, 0x48, 0x9f, 0x89, 0xd5, 0x56, 0x45, 0xcc, 0x73, 0x68, 0x15, 0xae, 0x7a, 0xdb, 0xc5, 0x4a, + 0x69, 0xaf, 0x22, 0x4a, 0x8d, 0x7a, 0xed, 0x69, 0x3e, 0x85, 0x78, 0x58, 0x79, 0x7c, 0x54, 0x6b, + 0x55, 0xc3, 0x7d, 0x69, 0xeb, 0x3e, 0xf3, 0xf4, 0x31, 0x1e, 0x8c, 0x6d, 0xc6, 0x62, 0xeb, 0xe9, + 0xa5, 0x7f, 0xb2, 0xce, 0x2c, 0x12, 0xe0, 0x9a, 0x77, 0x4e, 0xff, 0xd8, 0x1c, 0x9f, 0xfe, 0x69, + 0x99, 0x43, 0x9b, 0x50, 0xf0, 0xd2, 0xf8, 0x38, 0x4c, 0x12, 0x92, 0xf2, 0x9c, 0xa3, 0x01, 0x44, + 0xc3, 0x3f, 0x83, 0x39, 0xdf, 0xc5, 0x60, 0x45, 0x78, 0xcc, 0x93, 0x75, 0xa4, 0xe3, 0x73, 0x93, + 0x44, 0x3d, 0xdc, 0x56, 0x5a, 0x9c, 0xb3, 0x5b, 0xcb, 0x56, 0xa3, 0x75, 0x96, 0x5d, 0xa5, 0xa7, + 0x98, 0x8c, 0x26, 0x45, 0x68, 0x80, 0x34, 0x11, 0x02, 0xe1, 0x57, 0x29, 0xc8, 0x31, 0x85, 0xb8, + 0xe5, 0xb9, 0x9a, 0x7c, 0x2c, 0xed, 0x56, 0xca, 0xd2, 0x67, 0x91, 0x29, 0xbf, 0x45, 0xa2, 0x03, + 0x98, 0xf7, 0xfa, 0xef, 0x17, 0x76, 0x5c, 0xb9, 0xe9, 0x3f, 0x67, 0xaf, 0x13, 0x79, 0xc1, 0xa2, + 0xc9, 0xb9, 0x33, 0x6f, 0x1b, 0x2a, 0xc3, 0x7c, 0xe0, 0x0a, 0xc8, 0x0c, 0xbf, 0x02, 0xe6, 0xda, + 0x3e, 0x6f, 0x58, 0x82, 0x45, 0xdb, 0x7b, 0x77, 0xb1, 0x64, 0x32, 0xef, 0xce, 0xae, 0xa8, 0x7c, + 0xc8, 0xeb, 0x23, 0x97, 0xd8, 0x6e, 0xe3, 0x3f, 0x01, 0x14, 0x96, 0x75, 0x2c, 0x57, 0x3d, 0x80, + 0xc5, 0x88, 0x7b, 0x05, 0x15, 0x61, 0x9a, 0x1c, 0x95, 0xa1, 0x98, 0x98, 0x45, 0xac, 0x61, 0x89, + 0x5c, 0x12, 0x8b, 0xbe, 0xaf, 0xe3, 0x13, 0xac, 0xeb, 0xb8, 0x43, 0x6c, 0x32, 0x92, 0xde, 0x21, + 0x11, 0x7e, 0x8f, 0x83, 0x29, 0xbb, 0x1d, 0xed, 0xc0, 0x94, 0x81, 0x4f, 0xe9, 0x9d, 0x47, 0xe7, + 0x5a, 0x0f, 0x8e, 0x2d, 0x36, 0x19, 0x01, 0x8b, 0xed, 0x6d, 0x7a, 0x2b, 0xb6, 0xf7, 0x75, 0x8d, + 0xb5, 0xf8, 0xbf, 0xe1, 0x60, 0x71, 0x0f, 0x77, 0x71, 0x30, 0x34, 0x4a, 0x72, 0xeb, 0xde, 0x68, 0x22, 0xe5, 0x8f, 0x26, 0x22, 0x58, 0x25, 0x44, 0x13, 0x17, 0xba, 0x61, 0x57, 0x60, 0xc9, 0x3f, 0x1b, 0xbd, 0x53, 0x84, 0xff, 0x4c, 0xc3, 0xba, 0xa5, 0x0b, 0xba, 0xd6, 0xed, 0x62, 0xfd, 0x70, 0x70, 0xdc, 0x55, 0x8c, 0xe7, 0x63, 0x2c, 0xee, 0x2a, 0x4c, 0xaa, 0x5a, 0xc7, 0x63, 0x3c, 0x39, @@ -5833,32 +5847,32 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0xb3, 0xe0, 0xb5, 0xc5, 0xc3, 0x94, 0x15, 0x95, 0x6a, 0x6a, 0xf7, 0x9c, 0x58, 0xcc, 0x94, 0xe8, 0x7c, 0x23, 0x31, 0x18, 0xa6, 0x7d, 0xc7, 0x09, 0xd3, 0x12, 0x57, 0x94, 0x14, 0xb1, 0x7d, 0x11, 0xb2, 0xf8, 0x1c, 0x61, 0xfd, 0xe1, 0x88, 0xac, 0x87, 0x7a, 0x82, 0x8b, 0x9c, 0xe2, 0x25, 0x98, - 0xef, 0x3f, 0x72, 0x70, 0x23, 0x76, 0x09, 0x2c, 0xce, 0xe8, 0xc0, 0x95, 0x3e, 0xed, 0x70, 0x36, + 0xef, 0x3f, 0x70, 0x70, 0x23, 0x76, 0x09, 0x2c, 0xce, 0xe8, 0xc0, 0x95, 0x3e, 0xed, 0x70, 0x36, 0x81, 0x5a, 0xd9, 0x47, 0x43, 0x37, 0x81, 0x25, 0xd6, 0xac, 0xd5, 0xb7, 0x0d, 0xf3, 0x7d, 0x5f, - 0x23, 0x5f, 0x82, 0xc5, 0x08, 0xb2, 0xb1, 0x16, 0xf3, 0x1b, 0x0e, 0x36, 0x5c, 0x51, 0x8e, 0xd4, + 0x23, 0x5f, 0x82, 0xc5, 0x08, 0xb2, 0xb1, 0x16, 0xf3, 0x6b, 0x0e, 0x36, 0x5c, 0x51, 0x8e, 0xd4, 0xfe, 0xe5, 0xa9, 0x6f, 0xcb, 0xd5, 0x2d, 0xea, 0xf2, 0xdf, 0x0f, 0xaf, 0x3d, 0x7a, 0xc2, 0x57, - 0x65, 0xc1, 0x37, 0x61, 0x33, 0x61, 0x6a, 0x66, 0xce, 0xbf, 0xce, 0xc0, 0xe6, 0x13, 0xb9, 0xab, + 0x65, 0xc1, 0x37, 0x61, 0x33, 0x61, 0x6a, 0x66, 0xce, 0xbf, 0xca, 0xc0, 0xe6, 0x13, 0xb9, 0xab, 0x74, 0x9c, 0xe8, 0x31, 0x02, 0x82, 0x48, 0xde, 0x92, 0x76, 0xc8, 0x02, 0xa8, 0xd7, 0x7a, 0xe0, 0x58, 0xed, 0x30, 0xfe, 0x23, 0x5c, 0x87, 0x97, 0x98, 0xf9, 0x3d, 0x8d, 0xc8, 0xfc, 0x3e, 0x1c, 0x5d, 0xd6, 0xa4, 0x3c, 0xf0, 0x28, 0xe8, 0x60, 0x3e, 0x18, 0x9d, 0x6f, 0x82, 0x16, 0x5c, 0xd8, - 0x8a, 0x5f, 0x67, 0xaa, 0xf6, 0xf7, 0x19, 0x10, 0x92, 0x56, 0xcf, 0x7c, 0x88, 0x08, 0xd3, 0x6d, + 0x8a, 0x5f, 0x67, 0xaa, 0xf6, 0x77, 0x19, 0x10, 0x92, 0x56, 0xcf, 0x7c, 0x88, 0x08, 0xd3, 0x6d, 0x4d, 0x3d, 0x51, 0xf4, 0x1e, 0xee, 0xb0, 0x94, 0xe3, 0xbd, 0x51, 0x36, 0x8f, 0x39, 0x90, 0x5d, 0x7b, 0xac, 0xe8, 0xb2, 0x41, 0x05, 0x98, 0xec, 0x61, 0xc3, 0x90, 0x4f, 0x6d, 0xb1, 0xec, 0x4f, 0xfe, 0xe7, 0x69, 0x98, 0x76, 0x86, 0x20, 0x35, 0xa4, 0xc1, 0xd4, 0x7d, 0xed, 0xbf, 0x8c, 0x00, 0x2f, 0xaf, 0xcc, 0xa9, 0x97, 0x50, 0xe6, 0x8e, 0x4f, 0x99, 0xa9, 0x39, 0xec, 0xbd, 0x94, 0xd8, - 0x09, 0x7a, 0xfd, 0xda, 0x15, 0x50, 0xf8, 0x6d, 0x40, 0x35, 0xc5, 0x60, 0xa9, 0x9b, 0xe3, 0x96, + 0x09, 0x7a, 0xfd, 0xda, 0x15, 0x50, 0xf8, 0x4d, 0x40, 0x35, 0xc5, 0x60, 0xa9, 0x9b, 0xe3, 0x96, 0xac, 0x4c, 0x4d, 0x7e, 0x21, 0x61, 0xd5, 0xd4, 0x15, 0x16, 0xae, 0x67, 0x45, 0xe8, 0xc9, 0x2f, 0x2a, 0xb4, 0xc5, 0x0a, 0xe9, 0x0d, 0x53, 0xd6, 0x4d, 0x45, 0x3d, 0x95, 0x4c, 0xed, 0x4b, 0xec, 0xe0, 0xc0, 0x76, 0x6b, 0xcb, 0x6a, 0x14, 0xbe, 0x49, 0xc1, 0xa2, 0x8f, 0x3d, 0xd3, 0xc9, 0x8f, 0x60, 0xd2, 0xe5, 0xed, 0x0b, 0xe3, 0x23, 0xa8, 0x8b, 0x74, 0xdb, 0xec, 0x11, 0xe8, 0x3a, 0x80, - 0x8a, 0x5f, 0x98, 0xbe, 0x79, 0xa7, 0xad, 0x16, 0x32, 0x27, 0xff, 0x87, 0x9c, 0x93, 0xe9, 0x9b, + 0x8a, 0x5f, 0x98, 0xbe, 0x79, 0xa7, 0xad, 0x16, 0x32, 0x27, 0xff, 0xfb, 0x9c, 0x93, 0xe9, 0x9b, 0xb2, 0x39, 0x20, 0x59, 0x25, 0x73, 0xd1, 0xb8, 0x23, 0xb1, 0x3b, 0x86, 0xce, 0x3b, 0x2d, 0xe6, 0x9d, 0x9e, 0x3a, 0xb9, 0x6d, 0x0c, 0xb4, 0xef, 0x40, 0xac, 0x6d, 0x4d, 0xed, 0x28, 0xa6, 0x0b, 0xb1, 0x5e, 0x0d, 0x25, 0x08, 0xb4, 0xbb, 0x6c, 0xe5, 0x55, 0x36, 0xa8, 0xea, 0xb4, 0xf2, 0x5f, 0x41, 0x96, 0x1e, 0xc7, 0x88, 0x60, 0x01, 0xfa, 0x04, 0x72, 0x06, 0x91, 0x38, 0x08, 0x8c, 0x44, 0xed, 0x89, 0x77, 0x85, 0x22, 0x1b, 0x27, 0x7c, 0x0f, 0x78, 0xf7, 0x62, 0xda, 0xc7, 0xe6, 0xe8, - 0xd7, 0xef, 0x8e, 0xb5, 0x06, 0xe1, 0xcf, 0x53, 0xb0, 0x1a, 0xc9, 0x60, 0x3c, 0xd8, 0x03, 0x1d, - 0x04, 0x56, 0xf2, 0x4e, 0xf8, 0xc6, 0x0e, 0x31, 0x8f, 0x5c, 0x11, 0xff, 0x7b, 0x17, 0x3b, 0xcc, + 0xd7, 0xef, 0x8e, 0xb5, 0x06, 0xe1, 0x4f, 0x53, 0xb0, 0x1a, 0xc9, 0x60, 0x3c, 0xd8, 0x03, 0x1d, + 0x04, 0x56, 0xf2, 0x4e, 0xf8, 0xc6, 0x0e, 0x31, 0x8f, 0x5c, 0x11, 0xff, 0x3b, 0x17, 0x3b, 0xcc, 0xf2, 0xd8, 0x87, 0x19, 0x3a, 0x47, 0xba, 0x33, 0x3f, 0x4f, 0x01, 0xda, 0xc7, 0xa6, 0x93, 0x2a, 0xb3, 0x2d, 0x8d, 0xf1, 0x37, 0xdc, 0x4b, 0xf8, 0x9b, 0x1f, 0xf8, 0xfc, 0x0d, 0xf5, 0x58, 0x77, 0x3c, 0x45, 0x93, 0xc0, 0xd4, 0x89, 0xb7, 0x65, 0x4c, 0x7a, 0x4a, 0x63, 0xfe, 0xd1, 0xd2, 0xd3, @@ -5870,8 +5884,8 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0x83, 0x5d, 0x8e, 0x82, 0xe0, 0x0d, 0x7a, 0xd9, 0x72, 0x83, 0x45, 0xa6, 0xae, 0x37, 0x58, 0x0c, 0xd1, 0xb0, 0x6d, 0xd9, 0x8f, 0x2c, 0x34, 0xdd, 0x0c, 0x9b, 0x0d, 0xab, 0xba, 0xc4, 0xd6, 0x9c, 0xfe, 0x27, 0xed, 0xb5, 0xe0, 0x10, 0x35, 0xfa, 0x08, 0xd2, 0x7a, 0xbf, 0xcd, 0xcc, 0xf7, 0xcd, - 0x11, 0xf8, 0x17, 0xc5, 0xc3, 0xdd, 0x83, 0x09, 0xd1, 0x1a, 0xc5, 0xff, 0x45, 0x1a, 0xd2, 0xe2, - 0xe1, 0x2e, 0xfa, 0xc4, 0x57, 0x62, 0xb9, 0x3b, 0x22, 0x17, 0x6f, 0x85, 0xe5, 0x9f, 0x53, 0x51, + 0x11, 0xf8, 0x17, 0xc5, 0xc3, 0xdd, 0x83, 0x09, 0xd1, 0x1a, 0xc5, 0xff, 0x59, 0x1a, 0xd2, 0xe2, + 0xe1, 0x2e, 0xfa, 0xc4, 0x57, 0x62, 0xb9, 0x3b, 0x22, 0x17, 0x6f, 0x85, 0xe5, 0x9f, 0x52, 0x51, 0x25, 0x96, 0x02, 0x2c, 0xed, 0x8a, 0x95, 0x52, 0xab, 0x22, 0xed, 0x55, 0x6a, 0x95, 0x56, 0x45, 0xa2, 0x05, 0xa2, 0x3c, 0x87, 0xd6, 0xa0, 0x70, 0x78, 0x54, 0xae, 0x55, 0x9b, 0x07, 0xd2, 0x51, 0xdd, 0xfe, 0x8b, 0xf5, 0xa6, 0x50, 0x1e, 0x66, 0x6b, 0xd5, 0x66, 0x8b, 0x35, 0x34, 0xf3, 0x69, @@ -5882,7 +5896,7 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0xa5, 0xfa, 0x9e, 0x4d, 0x38, 0x8d, 0x36, 0x60, 0xcd, 0x2b, 0x8e, 0xc4, 0x46, 0x55, 0xf6, 0x08, 0x28, 0xd7, 0xcc, 0x03, 0xba, 0x06, 0x79, 0x56, 0xfb, 0xda, 0x6d, 0xd4, 0xf7, 0xaa, 0xad, 0x6a, 0xa3, 0x9e, 0x9f, 0xa1, 0x08, 0xde, 0x22, 0x80, 0x25, 0x39, 0x63, 0x36, 0x3b, 0x1c, 0xd6, 0x9b, - 0xa3, 0xb0, 0x9e, 0x8d, 0x58, 0xff, 0x26, 0x05, 0xcb, 0x14, 0xb2, 0xb6, 0x01, 0x72, 0xdb, 0x57, + 0xa3, 0xb0, 0x9e, 0x8d, 0x58, 0xff, 0x3a, 0x05, 0xcb, 0x14, 0xb2, 0xb6, 0x01, 0x72, 0xdb, 0x57, 0x6d, 0x41, 0x9e, 0xe2, 0x5d, 0x52, 0xf0, 0x16, 0x98, 0xa7, 0xed, 0x4f, 0xec, 0xbc, 0xc3, 0x2e, 0x2f, 0xa5, 0x3c, 0xe5, 0xa5, 0x6a, 0x30, 0x0b, 0xbb, 0xe3, 0x2f, 0xc4, 0x04, 0x66, 0x4b, 0x4a, 0xec, 0x1f, 0x47, 0xa4, 0x09, 0xf7, 0x92, 0xb9, 0x25, 0x85, 0x50, 0x17, 0xc9, 0xe2, 0x2f, 0xe8, @@ -5893,18 +5907,18 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0x98, 0x6c, 0xd9, 0x6f, 0x0d, 0xc4, 0x59, 0x7b, 0x80, 0xd5, 0x84, 0x36, 0x60, 0x96, 0x14, 0x2a, 0x25, 0x53, 0x93, 0x06, 0x06, 0x2e, 0x64, 0x09, 0x2c, 0x04, 0xa4, 0xad, 0xa5, 0x1d, 0x19, 0x18, 0xdd, 0x87, 0x05, 0x02, 0xe2, 0x4b, 0x5e, 0x99, 0x73, 0x96, 0x34, 0x2c, 0x6a, 0x22, 0xbd, 0x4d, - 0x47, 0x7a, 0xe1, 0xef, 0x38, 0x58, 0xa6, 0xf0, 0x58, 0x50, 0x7f, 0x87, 0x55, 0x78, 0xbc, 0x2a, + 0x47, 0x7a, 0xe1, 0x6f, 0x39, 0x58, 0xa6, 0xf0, 0x58, 0x50, 0x7f, 0x87, 0x55, 0x78, 0xbc, 0x2a, 0x1a, 0xb8, 0x3e, 0x23, 0x19, 0xbe, 0x2a, 0x74, 0xa0, 0x00, 0x2b, 0xc1, 0xf9, 0x18, 0x24, 0xf0, 0x8b, 0x14, 0x2c, 0x59, 0xb1, 0x9c, 0xdd, 0x71, 0xd9, 0xe1, 0xf6, 0x18, 0x47, 0x1f, 0xd8, 0xcc, 0x4c, 0x68, 0x33, 0x0f, 0x82, 0x09, 0xf7, 0x5b, 0xde, 0x68, 0x34, 0xb8, 0x82, 0x57, 0xb5, 0x97, 0x3f, 0xe3, 0x60, 0x39, 0x30, 0x1f, 0x33, 0xb0, 0x8f, 0x83, 0x19, 0xc4, 0xcd, 0x18, 0xf9, 0x5e, - 0x2a, 0x87, 0x78, 0xdf, 0x8e, 0xdd, 0xc7, 0xb3, 0xe3, 0x7f, 0x49, 0xc1, 0x75, 0xf7, 0x16, 0x24, + 0x2a, 0x87, 0x78, 0xdf, 0x8e, 0xdd, 0xc7, 0xb3, 0xe3, 0x7f, 0x4e, 0xc1, 0x75, 0xf7, 0x16, 0x24, 0x6f, 0x0b, 0x3a, 0x63, 0x40, 0x60, 0x17, 0x2b, 0xe1, 0x7f, 0x1a, 0xf4, 0xd0, 0xdb, 0xe1, 0x8b, 0x39, 0x42, 0xa4, 0x24, 0x4f, 0x1d, 0x89, 0x1c, 0x67, 0xc6, 0x45, 0x8e, 0x2f, 0xa4, 0x01, 0xbf, - 0xeb, 0x05, 0xc5, 0xfd, 0xe2, 0x33, 0x4d, 0x18, 0xb1, 0xba, 0xf4, 0x01, 0x5c, 0x25, 0xe9, 0x82, + 0xed, 0x05, 0xc5, 0xfd, 0xe2, 0x33, 0x4d, 0x18, 0xb1, 0xba, 0xf4, 0x01, 0x5c, 0x25, 0xe9, 0x82, 0xf3, 0x70, 0xc6, 0x2e, 0xd8, 0x53, 0x1f, 0x3a, 0x25, 0x2e, 0x5b, 0xdd, 0xce, 0x7b, 0x10, 0x56, 0x51, 0xe9, 0x08, 0xdf, 0x66, 0x60, 0xc5, 0x4a, 0x27, 0x9a, 0xa6, 0x7c, 0x3a, 0x4e, 0xad, 0xe1, - 0xb7, 0xc2, 0xd0, 0x6d, 0xca, 0x7f, 0x2c, 0xd1, 0x5c, 0x47, 0x41, 0x6c, 0x51, 0x11, 0x16, 0x0d, + 0x37, 0xc2, 0xd0, 0x6d, 0xca, 0x7f, 0x2c, 0xd1, 0x5c, 0x47, 0x41, 0x6c, 0x51, 0x11, 0x16, 0x0d, 0x53, 0x3e, 0x25, 0xee, 0x40, 0xd6, 0x4f, 0xb1, 0x29, 0xf5, 0x65, 0xf3, 0x39, 0xb3, 0xf5, 0x05, 0xd6, 0xd5, 0x22, 0x3d, 0x87, 0xb2, 0xf9, 0xfc, 0x92, 0x0e, 0x12, 0xfd, 0x20, 0xe8, 0x14, 0xde, 0x1e, 0xb2, 0x96, 0x04, 0xdd, 0xfa, 0x61, 0x0c, 0xbc, 0xff, 0xee, 0x10, 0x96, 0xc3, 0x61, 0xfd, @@ -5915,9 +5929,9 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0xcd, 0x21, 0x86, 0x93, 0xbd, 0x50, 0xed, 0x2c, 0x17, 0xa8, 0x9d, 0xd5, 0x5c, 0xa3, 0x9a, 0xf4, 0xc7, 0xc2, 0xb1, 0x5b, 0x91, 0x60, 0x56, 0xcf, 0x42, 0x66, 0x35, 0xe5, 0x2f, 0xc8, 0xc5, 0x32, 0xfd, 0x7f, 0x60, 0x58, 0x4c, 0xa9, 0x23, 0x2b, 0x65, 0xc2, 0x33, 0xe0, 0xa9, 0xc6, 0x8f, 0x5f, - 0xbb, 0x0a, 0xa8, 0x51, 0x2a, 0xa8, 0x46, 0xc2, 0x75, 0x58, 0x8d, 0xe4, 0xcd, 0xa6, 0xfe, 0x23, + 0xbb, 0x0a, 0xa8, 0x51, 0x2a, 0xa8, 0x46, 0xc2, 0x75, 0x58, 0x8d, 0xe4, 0xcd, 0xa6, 0xfe, 0x03, 0x8e, 0x0a, 0xe6, 0x80, 0x62, 0x4d, 0x53, 0x36, 0x8d, 0x51, 0xa7, 0x66, 0x9d, 0xde, 0xa9, 0x69, - 0x13, 0xd1, 0xe0, 0x31, 0x4d, 0x42, 0xf8, 0x13, 0x8e, 0xee, 0x43, 0x50, 0x16, 0x76, 0xdb, 0xbe, + 0x13, 0xd1, 0xe0, 0x31, 0x4d, 0x42, 0xf8, 0x23, 0x8e, 0xee, 0x43, 0x50, 0x16, 0x76, 0xdb, 0xbe, 0x05, 0xd9, 0x01, 0xc1, 0xfd, 0x69, 0xd4, 0xb5, 0xe8, 0x37, 0x82, 0x23, 0xab, 0x4b, 0xa4, 0x14, 0x97, 0x86, 0xa4, 0x0a, 0xbf, 0xe0, 0x60, 0xc6, 0xc3, 0x1f, 0xad, 0xc1, 0xb4, 0x03, 0x15, 0xd9, 0x09, 0x92, 0xd3, 0x60, 0x1d, 0xbf, 0xa9, 0x99, 0x72, 0x97, 0xbd, 0x49, 0xa1, 0x1f, 0x56, 0x4e, @@ -5927,13 +5941,13 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0xa5, 0x09, 0x7e, 0x4a, 0xa8, 0xd9, 0xef, 0x52, 0x9d, 0x45, 0x58, 0x2e, 0x40, 0x3e, 0x56, 0x35, 0xbd, 0x27, 0x77, 0x89, 0xcc, 0x53, 0xa2, 0xf3, 0x1d, 0x5f, 0x4e, 0xa1, 0xe0, 0xe3, 0x9a, 0x73, 0x22, 0x51, 0x00, 0xd3, 0x17, 0x54, 0xb7, 0xe2, 0xa0, 0xa5, 0x52, 0x24, 0xb4, 0x74, 0xdd, 0x77, - 0xcb, 0x0e, 0x01, 0x95, 0xfe, 0x21, 0x05, 0xcb, 0x91, 0x74, 0xe8, 0x7d, 0x2f, 0x9c, 0xb4, 0x99, + 0xcb, 0x0e, 0x01, 0x95, 0xfe, 0x3e, 0x05, 0xcb, 0x91, 0x74, 0xe8, 0x7d, 0x2f, 0x9c, 0xb4, 0x99, 0xc8, 0xd3, 0x0b, 0x24, 0x7d, 0xcb, 0x51, 0x20, 0x69, 0xc7, 0x07, 0x24, 0xdd, 0x1e, 0x3a, 0xde, 0x0b, 0x21, 0xfd, 0x8c, 0x8b, 0x81, 0x90, 0x9a, 0xad, 0xd2, 0x7e, 0x45, 0x3a, 0xaa, 0xd3, 0x7f, 0x1d, 0x08, 0x69, 0x09, 0xf2, 0x2e, 0xb0, 0x22, 0x35, 0x5b, 0x25, 0xf2, 0xbe, 0x38, 0x04, 0xdf, 0xa4, 0x23, 0xc1, 0x99, 0xcc, 0x70, 0x1c, 0x26, 0x4b, 0x49, 0x56, 0x00, 0xb1, 0xd1, 0x8f, 0x1b, 0x47, 0xf5, 0x96, 0x44, 0x5e, 0x2f, 0xe7, 0x73, 0x0e, 0x3e, 0xb3, 0x04, 0x88, 0x9d, 0x96, 0xf7, - 0x11, 0xfe, 0x5f, 0x71, 0xb0, 0xe8, 0x6b, 0x66, 0x87, 0xe7, 0x29, 0x8a, 0x73, 0xbe, 0xa2, 0xf8, + 0x11, 0xfe, 0x5f, 0x70, 0xb0, 0xe8, 0x6b, 0x66, 0x87, 0xe7, 0x29, 0x8a, 0x73, 0xbe, 0xa2, 0xf8, 0x7d, 0x58, 0xb2, 0x32, 0x46, 0x6a, 0x29, 0x86, 0xd4, 0xc7, 0x3a, 0x01, 0xc3, 0x99, 0xce, 0x2f, 0xf4, 0xe4, 0x17, 0xac, 0x60, 0x70, 0x88, 0x75, 0x8b, 0xf1, 0x25, 0x40, 0xc2, 0xc2, 0xd7, 0x69, 0x1a, 0x97, 0x8c, 0x9d, 0xd7, 0x0c, 0xf5, 0x51, 0xe1, 0xc4, 0x27, 0x3d, 0x46, 0xe2, 0x13, 0xe3, @@ -5941,63 +5955,63 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0xfe, 0x0e, 0xcd, 0xb4, 0x72, 0x5f, 0x97, 0xb9, 0x9f, 0x5e, 0x56, 0x9e, 0x5c, 0xa2, 0xf1, 0xd8, 0x05, 0xf2, 0x23, 0xe1, 0x4d, 0xb8, 0x45, 0x9e, 0x55, 0x0e, 0x05, 0xb4, 0xcf, 0xe0, 0xf6, 0x30, 0x42, 0x36, 0x73, 0x2d, 0xd2, 0xf5, 0x38, 0x65, 0xad, 0x00, 0x97, 0x61, 0x5e, 0xe8, 0xc7, 0x29, - 0xd8, 0x18, 0x36, 0x04, 0x7d, 0xe2, 0x75, 0x48, 0x77, 0x47, 0x9d, 0xc9, 0xeb, 0x9b, 0xfe, 0x8c, + 0xd8, 0x18, 0x36, 0x04, 0x7d, 0xe2, 0x75, 0x48, 0x77, 0x47, 0x9d, 0xc9, 0xeb, 0x9b, 0xfe, 0x84, 0xf9, 0xa6, 0x8a, 0xcf, 0x37, 0xbd, 0x3b, 0x0e, 0x2b, 0xaf, 0x9b, 0xaa, 0x44, 0x79, 0xa9, 0x77, 0xe0, 0x4d, 0x3f, 0x18, 0xed, 0xf1, 0x4c, 0xf4, 0xe7, 0x0e, 0x0e, 0x3a, 0xcd, 0xf9, 0xe1, 0xdd, - 0x3f, 0x4d, 0xc3, 0x86, 0xf7, 0x45, 0xf2, 0xbe, 0x17, 0x3e, 0x4b, 0xfa, 0x79, 0xc0, 0x1d, 0x58, + 0x3f, 0x4e, 0xc3, 0x86, 0xf7, 0x45, 0xf2, 0xbe, 0x17, 0x3e, 0x4b, 0xfa, 0x79, 0xc0, 0x1d, 0x58, 0x08, 0x42, 0x43, 0xf6, 0x0b, 0xdc, 0x2b, 0x7e, 0x6c, 0xc8, 0x48, 0x7a, 0x71, 0x33, 0x64, 0xea, 0xe4, 0x84, 0x2f, 0x0c, 0xfb, 0x7e, 0x77, 0x64, 0xc6, 0xff, 0x37, 0x11, 0x60, 0x7a, 0x3f, 0x77, 0x61, 0x33, 0x41, 0x7e, 0x66, 0x0c, 0x65, 0x98, 0xf7, 0x23, 0xa1, 0x4c, 0x49, 0x03, 0xcf, 0x4e, - 0xfd, 0x83, 0xe7, 0x7c, 0xf0, 0x28, 0x9d, 0xed, 0x57, 0x9c, 0xfd, 0x42, 0xdf, 0x47, 0x6b, 0x9d, - 0x70, 0x18, 0x6a, 0xa5, 0x8b, 0x08, 0xa2, 0xac, 0xa8, 0x08, 0xd3, 0x36, 0x95, 0x11, 0x7c, 0xf3, - 0xe9, 0x4c, 0xee, 0x92, 0x84, 0x91, 0xe2, 0xf4, 0x78, 0x48, 0x31, 0x95, 0xfc, 0x27, 0x29, 0xd8, - 0xf0, 0x3e, 0x7d, 0x8c, 0x54, 0xde, 0x71, 0x96, 0xb1, 0x09, 0xb3, 0x1e, 0x2a, 0x5b, 0x9f, 0x67, - 0x5c, 0x18, 0x33, 0x49, 0x97, 0x87, 0x49, 0xf2, 0x8a, 0x30, 0x4d, 0xba, 0x15, 0x37, 0x61, 0x33, - 0x61, 0x7e, 0xfb, 0x09, 0x19, 0x47, 0x7e, 0xa0, 0x76, 0x49, 0x9b, 0xf5, 0x69, 0x10, 0x1e, 0xdf, - 0xf6, 0x54, 0x97, 0x5f, 0xd3, 0x36, 0x28, 0xb0, 0x1e, 0x37, 0xf9, 0x25, 0x9b, 0xcd, 0xf6, 0x7f, - 0x73, 0x30, 0x55, 0xed, 0x60, 0xd5, 0xa4, 0x77, 0xf7, 0x9c, 0xef, 0x77, 0x88, 0x68, 0x2d, 0xe6, - 0xe7, 0x89, 0x64, 0x0b, 0xf8, 0xeb, 0x89, 0x3f, 0x5e, 0x14, 0x26, 0xd0, 0x89, 0xe7, 0x37, 0x94, - 0xbe, 0xaa, 0xfe, 0x1b, 0xa1, 0x91, 0x11, 0x57, 0x2a, 0x7f, 0x6b, 0x08, 0x95, 0x33, 0xcf, 0x07, - 0x90, 0x25, 0xbf, 0x29, 0x43, 0x4b, 0xce, 0xef, 0xda, 0x3c, 0x3f, 0x39, 0xe3, 0x97, 0x03, 0xad, - 0xf6, 0xb8, 0xed, 0x7f, 0x9a, 0x06, 0x70, 0x2f, 0x2d, 0xf4, 0x08, 0x66, 0xbd, 0x0e, 0x0b, 0xad, - 0x26, 0xfc, 0xa8, 0x8a, 0x5f, 0x8b, 0xee, 0x74, 0x64, 0x7a, 0x04, 0xb3, 0x5e, 0x55, 0x76, 0x99, - 0x45, 0xbc, 0xa9, 0x76, 0x99, 0x45, 0x3e, 0x81, 0x9e, 0x40, 0x5d, 0xb8, 0x1a, 0xf3, 0xa2, 0x15, - 0xdd, 0x1e, 0xed, 0xdd, 0x2f, 0xff, 0xe6, 0x88, 0x4f, 0x63, 0x85, 0x09, 0xa4, 0xc3, 0xb5, 0xd8, - 0x87, 0x9c, 0x68, 0x6b, 0xd4, 0x67, 0xa6, 0xfc, 0x5b, 0x23, 0x50, 0x3a, 0x73, 0x0e, 0x80, 0x8f, - 0x7f, 0x3d, 0x86, 0xde, 0x1a, 0xf9, 0x59, 0x23, 0x7f, 0x67, 0xf4, 0xc7, 0x68, 0xc2, 0x04, 0x3a, - 0x80, 0x19, 0xcf, 0x33, 0x22, 0xc4, 0x47, 0xbe, 0x2d, 0xa2, 0x8c, 0x57, 0x13, 0xde, 0x1d, 0x51, - 0x4e, 0x9e, 0x97, 0x1d, 0x2e, 0xa7, 0xf0, 0x1b, 0x15, 0x97, 0x53, 0xc4, 0x53, 0x90, 0xe0, 0xf6, - 0x07, 0x82, 0xc8, 0xa8, 0xed, 0x8f, 0x0e, 0x48, 0xa3, 0xb6, 0x3f, 0x26, 0x22, 0x15, 0x26, 0xd0, - 0xa7, 0x30, 0xef, 0x2f, 0xd9, 0xa2, 0xeb, 0x89, 0xa5, 0x67, 0x7e, 0x3d, 0xae, 0xdb, 0xcb, 0xd2, - 0x5f, 0xf0, 0x73, 0x59, 0x46, 0x16, 0x1e, 0x5d, 0x96, 0x31, 0x75, 0xc2, 0x09, 0xcb, 0x3f, 0xf9, - 0xca, 0x58, 0xae, 0x7f, 0x8a, 0xaa, 0xbe, 0xb9, 0xfe, 0x29, 0xb2, 0xf6, 0x25, 0x4c, 0x20, 0x05, - 0x56, 0xa2, 0xab, 0x28, 0xe8, 0xd6, 0x48, 0x45, 0x22, 0xfe, 0xf6, 0x30, 0x32, 0x67, 0xaa, 0x36, - 0x2c, 0x46, 0xbc, 0xf2, 0x42, 0x42, 0xe2, 0x13, 0x30, 0x3a, 0xc9, 0xcd, 0x11, 0x9e, 0x89, 0x09, - 0xc4, 0x99, 0xff, 0x57, 0x1a, 0xae, 0x04, 0x22, 0x71, 0xf4, 0xfb, 0x1c, 0xac, 0x27, 0x27, 0x26, - 0xe8, 0x5e, 0x4c, 0x14, 0x1f, 0xa3, 0x58, 0xc5, 0x51, 0xc9, 0x3d, 0xc6, 0x7d, 0x2d, 0x36, 0x12, - 0x44, 0x5b, 0xa3, 0x06, 0xbb, 0x1e, 0x8d, 0x1e, 0x16, 0x56, 0x92, 0xed, 0xb0, 0xa6, 0x8d, 0x8d, - 0x26, 0xd0, 0xd6, 0xa8, 0x01, 0x8f, 0x3b, 0xed, 0xf0, 0xd0, 0x84, 0x4c, 0xdb, 0x85, 0x95, 0xe8, - 0xdb, 0x1b, 0xdd, 0x1a, 0x29, 0xb4, 0x70, 0xb5, 0x2a, 0x39, 0x08, 0x20, 0xb3, 0x91, 0x3c, 0x68, - 0xfb, 0xdf, 0xb2, 0x90, 0x21, 0x78, 0x46, 0x0b, 0xae, 0x04, 0x6a, 0x24, 0x68, 0x3d, 0xb9, 0x72, - 0xc4, 0xdf, 0x88, 0xed, 0x77, 0xce, 0xef, 0x19, 0x2c, 0x84, 0xaa, 0x1e, 0x68, 0xc3, 0x3b, 0x2e, - 0xaa, 0xf2, 0xc2, 0x6f, 0x26, 0x50, 0x04, 0x79, 0xfb, 0x2f, 0xb5, 0x8d, 0x61, 0xb0, 0xbc, 0x9f, - 0x77, 0xdc, 0x45, 0xf6, 0x05, 0x85, 0x8f, 0x82, 0x57, 0x98, 0xe0, 0x97, 0x2b, 0xf2, 0xf2, 0xba, - 0x99, 0x48, 0xe3, 0xcc, 0xf0, 0xb9, 0x83, 0x5b, 0x79, 0x50, 0x61, 0xe4, 0x13, 0x2e, 0x12, 0xbd, - 0xe6, 0x85, 0x24, 0x12, 0x87, 0xfd, 0x67, 0x90, 0x0f, 0x02, 0x18, 0xe8, 0xc6, 0x10, 0x3c, 0x85, - 0xdf, 0x88, 0x27, 0x08, 0xee, 0x4c, 0xd0, 0x13, 0x04, 0xa5, 0x8a, 0x32, 0xff, 0x9b, 0x89, 0x34, - 0xde, 0xfb, 0xd0, 0x03, 0xdd, 0xb9, 0xf7, 0x61, 0x18, 0xe6, 0x73, 0xef, 0xc3, 0x08, 0xac, 0x4f, - 0x98, 0xd8, 0x79, 0x00, 0x20, 0x77, 0xfb, 0xcf, 0x65, 0x09, 0xab, 0x83, 0x1e, 0x5a, 0x0b, 0x25, - 0x57, 0x15, 0x75, 0xd0, 0x6b, 0xf4, 0xad, 0x9c, 0xca, 0x28, 0xfc, 0xcd, 0x14, 0xc1, 0x90, 0xa7, - 0xc9, 0x00, 0xab, 0x63, 0xa7, 0x06, 0x79, 0x77, 0xb4, 0x44, 0x02, 0x6d, 0xb4, 0x19, 0xc9, 0x83, - 0x3c, 0x6a, 0x0c, 0x30, 0x9a, 0x77, 0x18, 0x91, 0xde, 0x9d, 0x8f, 0x01, 0xda, 0x86, 0x22, 0xd1, - 0x48, 0x1f, 0x5d, 0x0f, 0xf1, 0x79, 0xa8, 0xe0, 0x6e, 0xc7, 0xe6, 0xf1, 0xd7, 0x4c, 0x98, 0xb6, - 0xa1, 0xd0, 0x7c, 0x60, 0xe7, 0xfb, 0x30, 0x43, 0x85, 0x39, 0xb1, 0xe8, 0x86, 0x8d, 0x67, 0x32, - 0xd0, 0xd5, 0x93, 0x9e, 0x9d, 0x0a, 0xcc, 0x51, 0x06, 0x0c, 0x09, 0x47, 0x37, 0x42, 0x2c, 0x1e, - 0xd3, 0x9e, 0x00, 0x93, 0x59, 0x32, 0x8c, 0xf5, 0xed, 0x94, 0x61, 0xd6, 0x66, 0x63, 0x3e, 0xd7, - 0x3a, 0x68, 0x3d, 0x82, 0x8b, 0xd5, 0x11, 0x60, 0x32, 0xc3, 0x98, 0x58, 0x5d, 0xae, 0x28, 0xf6, - 0xff, 0xc2, 0x11, 0x16, 0x85, 0xc1, 0x40, 0x91, 0xa2, 0xb0, 0xbe, 0x72, 0xf6, 0x59, 0xba, 0x6d, - 0x28, 0xc7, 0x39, 0x32, 0xe8, 0x3b, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xea, 0xf0, 0x01, 0x41, - 0x32, 0x46, 0x00, 0x00, + 0xfd, 0x83, 0xe7, 0x7c, 0xf0, 0x28, 0x9d, 0xed, 0x5f, 0x39, 0xfb, 0x85, 0xbe, 0x8f, 0xd6, 0x3a, + 0xe1, 0x30, 0xd4, 0x4a, 0x17, 0x11, 0x44, 0x59, 0x51, 0x11, 0xa6, 0x6d, 0x2a, 0x23, 0xf8, 0xe6, + 0xd3, 0x99, 0xdc, 0x25, 0x09, 0x23, 0xc5, 0xe9, 0x0b, 0x22, 0xc5, 0x99, 0x20, 0x52, 0x4c, 0xd7, + 0xf6, 0x93, 0x14, 0x6c, 0x78, 0x1f, 0x47, 0x46, 0xaa, 0xf7, 0x38, 0x0b, 0xdd, 0x84, 0x59, 0x0f, + 0x95, 0xad, 0xf1, 0x33, 0x2e, 0xd0, 0x99, 0xa4, 0xed, 0xc3, 0x24, 0x79, 0x45, 0xa8, 0x27, 0xdd, + 0x8a, 0x9b, 0xb0, 0x99, 0x30, 0xbf, 0xfd, 0xc8, 0x8c, 0x23, 0x3f, 0x61, 0xbb, 0xa4, 0xcd, 0xfa, + 0x34, 0x08, 0xa0, 0x6f, 0x7b, 0xea, 0xcf, 0xaf, 0x69, 0x1b, 0x14, 0x58, 0x8f, 0x9b, 0xfc, 0x92, + 0x0d, 0x6b, 0xfb, 0xbf, 0x39, 0x98, 0xaa, 0x76, 0xb0, 0x6a, 0xd2, 0xdb, 0x7d, 0xce, 0xf7, 0x4b, + 0x45, 0xb4, 0x16, 0xf3, 0x03, 0x46, 0xb2, 0x05, 0xfc, 0xf5, 0xc4, 0x9f, 0x37, 0x0a, 0x13, 0xe8, + 0xc4, 0xf3, 0x2b, 0x4b, 0x5f, 0xdd, 0xff, 0x8d, 0xd0, 0xc8, 0x88, 0x4b, 0x97, 0xbf, 0x35, 0x84, + 0xca, 0x99, 0xe7, 0x03, 0xc8, 0x92, 0x5f, 0x9d, 0xa1, 0x25, 0xe7, 0x97, 0x6f, 0x9e, 0x1f, 0xa5, + 0xf1, 0xcb, 0x81, 0x56, 0x7b, 0xdc, 0xf6, 0x3f, 0x4e, 0x03, 0xb8, 0xd7, 0x1a, 0x7a, 0x04, 0xb3, + 0x5e, 0x97, 0x86, 0x56, 0x13, 0x7e, 0x76, 0xc5, 0xaf, 0x45, 0x77, 0x3a, 0x32, 0x3d, 0x82, 0x59, + 0xaf, 0x2a, 0xbb, 0xcc, 0x22, 0x5e, 0x5d, 0xbb, 0xcc, 0x22, 0x1f, 0x49, 0x4f, 0xa0, 0x2e, 0x5c, + 0x8d, 0x79, 0xf3, 0x8a, 0x6e, 0x8f, 0xf6, 0x32, 0x98, 0x7f, 0x73, 0xc4, 0xc7, 0xb3, 0xc2, 0x04, + 0xd2, 0xe1, 0x5a, 0xec, 0x53, 0x4f, 0xb4, 0x35, 0xea, 0x43, 0x54, 0xfe, 0xad, 0x11, 0x28, 0x9d, + 0x39, 0x07, 0xc0, 0xc7, 0xbf, 0x2f, 0x43, 0x6f, 0x8d, 0xfc, 0xf0, 0x91, 0xbf, 0x33, 0xfa, 0x73, + 0x35, 0x61, 0x02, 0x1d, 0xc0, 0x8c, 0xe7, 0xa1, 0x11, 0xe2, 0x23, 0x5f, 0x1f, 0x51, 0xc6, 0xab, + 0x09, 0x2f, 0x93, 0x28, 0x27, 0xcf, 0xdb, 0x0f, 0x97, 0x53, 0xf8, 0x15, 0x8b, 0xcb, 0x29, 0xe2, + 0xb1, 0x48, 0x70, 0xfb, 0x03, 0x61, 0x66, 0xd4, 0xf6, 0x47, 0x87, 0xac, 0x51, 0xdb, 0x1f, 0x13, + 0xb3, 0x0a, 0x13, 0xe8, 0x53, 0x98, 0xf7, 0x17, 0x75, 0xd1, 0xf5, 0xc4, 0xe2, 0x34, 0xbf, 0x1e, + 0xd7, 0xed, 0x65, 0xe9, 0x2f, 0x09, 0xba, 0x2c, 0x23, 0x4b, 0x93, 0x2e, 0xcb, 0x98, 0x4a, 0xe2, + 0x84, 0xe5, 0x9f, 0x7c, 0x85, 0x2e, 0xd7, 0x3f, 0x45, 0xd5, 0xe7, 0x5c, 0xff, 0x14, 0x59, 0x1d, + 0x13, 0x26, 0x90, 0x02, 0x2b, 0xd1, 0x75, 0x16, 0x74, 0x6b, 0xa4, 0x32, 0x12, 0x7f, 0x7b, 0x18, + 0x99, 0x33, 0x55, 0x1b, 0x16, 0x23, 0xde, 0x81, 0x21, 0x21, 0xf1, 0x91, 0x18, 0x9d, 0xe4, 0xe6, + 0x08, 0x0f, 0xc9, 0x04, 0xe2, 0xcc, 0xff, 0x2b, 0x0d, 0x57, 0x02, 0xb1, 0x3a, 0xfa, 0x5d, 0x0e, + 0xd6, 0x93, 0x53, 0x17, 0x74, 0x2f, 0x26, 0xce, 0x8f, 0x51, 0xac, 0xe2, 0xa8, 0xe4, 0x1e, 0xe3, + 0xbe, 0x16, 0x1b, 0x2b, 0xa2, 0xad, 0x51, 0xc3, 0x61, 0x8f, 0x46, 0x0f, 0x0b, 0x3c, 0xc9, 0x76, + 0x58, 0xd3, 0xc6, 0x46, 0x13, 0x68, 0x6b, 0xd4, 0x80, 0xc7, 0x9d, 0x76, 0x78, 0x68, 0x42, 0xa6, + 0xed, 0xc2, 0x4a, 0xf4, 0xed, 0x8d, 0x6e, 0x8d, 0x14, 0x5a, 0xb8, 0x5a, 0x95, 0x1c, 0x04, 0x90, + 0xd9, 0x48, 0xa6, 0xb4, 0xfd, 0x6f, 0x59, 0xc8, 0x10, 0xc4, 0xa3, 0x05, 0x57, 0x02, 0x55, 0x14, + 0xb4, 0x9e, 0x5c, 0x5b, 0xe2, 0x6f, 0xc4, 0xf6, 0x3b, 0xe7, 0xf7, 0x0c, 0x16, 0x42, 0x75, 0x11, + 0xb4, 0xe1, 0x1d, 0x17, 0x55, 0x9b, 0xe1, 0x37, 0x13, 0x28, 0x82, 0xbc, 0xfd, 0x97, 0xda, 0xc6, + 0x30, 0xe0, 0xde, 0xcf, 0x3b, 0xee, 0x22, 0xfb, 0x82, 0x02, 0x4c, 0xc1, 0x2b, 0x4c, 0xf0, 0xcb, + 0x15, 0x79, 0x79, 0xdd, 0x4c, 0xa4, 0x71, 0x66, 0xf8, 0xdc, 0x41, 0xb6, 0x3c, 0xb8, 0x31, 0xf2, + 0x09, 0x17, 0x89, 0x6f, 0xf3, 0x42, 0x12, 0x89, 0xc3, 0xfe, 0x33, 0xc8, 0x07, 0x21, 0x0e, 0x74, + 0x63, 0x08, 0xe2, 0xc2, 0x6f, 0xc4, 0x13, 0x04, 0x77, 0x26, 0xe8, 0x09, 0x82, 0x52, 0x45, 0x99, + 0xff, 0xcd, 0x44, 0x1a, 0xef, 0x7d, 0xe8, 0x01, 0xf7, 0xdc, 0xfb, 0x30, 0x0c, 0x04, 0xba, 0xf7, + 0x61, 0x04, 0x1a, 0x28, 0x4c, 0xec, 0x3c, 0x00, 0x90, 0xbb, 0xfd, 0xe7, 0xb2, 0x84, 0xd5, 0x41, + 0x0f, 0xad, 0x85, 0xd2, 0xaf, 0x8a, 0x3a, 0xe8, 0x35, 0xfa, 0x56, 0xd6, 0x65, 0x14, 0xfe, 0x6a, + 0x8a, 0xe4, 0x58, 0xd3, 0x64, 0x80, 0xd5, 0xb1, 0x53, 0x83, 0xbc, 0x3b, 0x5a, 0x22, 0x81, 0x36, + 0xda, 0x8c, 0xe4, 0x41, 0x9e, 0x3d, 0x06, 0x18, 0xcd, 0x3b, 0x8c, 0x48, 0xef, 0xce, 0xc7, 0x00, + 0x6d, 0x43, 0x91, 0x68, 0xa4, 0x8f, 0xae, 0x87, 0xf8, 0x3c, 0x54, 0x70, 0xb7, 0x63, 0xf3, 0xf8, + 0x4b, 0x26, 0x4c, 0xdb, 0x50, 0x68, 0x3e, 0xb0, 0xf3, 0x7d, 0x98, 0xa1, 0xc2, 0x9c, 0x58, 0x74, + 0xc3, 0xc6, 0x33, 0x19, 0xe8, 0xea, 0x49, 0xcf, 0x4e, 0x05, 0xe6, 0x28, 0x03, 0x86, 0x95, 0xa3, + 0x1b, 0x21, 0x16, 0x8f, 0x69, 0x4f, 0x80, 0xc9, 0x2c, 0x19, 0xc6, 0xfa, 0x76, 0xca, 0x30, 0x6b, + 0xb3, 0x31, 0x9f, 0x6b, 0x1d, 0xb4, 0x1e, 0xc1, 0xc5, 0xea, 0x08, 0x30, 0x99, 0x61, 0x4c, 0xac, + 0x2e, 0x57, 0x14, 0xfb, 0xff, 0xe9, 0x08, 0x8b, 0xc2, 0x80, 0xa2, 0x48, 0x51, 0x58, 0x5f, 0x39, + 0xfb, 0x2c, 0xdd, 0x36, 0x94, 0xe3, 0x1c, 0x19, 0xf4, 0x9d, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, + 0x68, 0xb4, 0x34, 0x85, 0x54, 0x46, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/spec.md b/spec.md index 7a1e98c6..5f041b28 100644 --- a/spec.md +++ b/spec.md @@ -2837,9 +2837,7 @@ If a group snapshot corresponding to the specified group snapshot `name` is succ If an error occurs before a group snapshot is cut, `CreateVolumeGroupSnapshot` SHOULD return a corresponding gRPC error code that reflects the error condition. -`CreateVolumeGroupSnapshot` SHOULD return `0 OK` after all the snapshots are cut regardless of whether post processing such as uploading is complete or not. - -CO SHOULD check the `ready_to_use` boolean of individual snapshots that are members of the group snapshot and only treat the group snapshot as ready to use when all snapshots have been "processed" and is ready to use to create new volumes from those snapshots. +For plugins that supports snapshot post processing such as uploading, CreateVolumeGroupSnapshot SHOULD return 0 OK and ready_to_use SHOULD be set to false after the group snapshot is cut but still being processed. CO SHOULD then reissue the same CreateVolumeGroupSnapshotRequest periodically until boolean ready_to_use flips to true indicating all the snapshots have been "processed" and are ready to use to create new volumes. If an error occurs during the process for any individual snapshot, CreateVolumeGroupSnapshot SHOULD return a corresponding gRPC error code that reflects the error condition. The ready_to_use field for all individual snapshots SHOULD stay false until all the snapshots have been "processed" and are ready to use to create new volumes. An individual snapshot MAY be used as the source to provision a new volume. @@ -2906,6 +2904,14 @@ message VolumeGroupSnapshot { // Timestamp of when the volume group snapshot was taken. // This field is REQUIRED. .google.protobuf.Timestamp creation_time = 3; + + // Indicates if all individual snapshots in the group snapshot + // are ready to use as a `volume_content_source` in a + // `CreateVolumeRequest`. The default value is false. + // CO MUST wait until all snapshots are ready to use before + // setting this field to true. + // This field is REQUIRED. + bool ready_to_use = 4; } ``` From 24b2d18037a7f9aeb8e5eb3ac3743188b712e2d9 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Sat, 28 Jan 2023 01:19:20 +0000 Subject: [PATCH 05/13] Update comments --- csi.proto | 7 +++++-- lib/go/csi/csi.pb.go | 7 +++++-- spec.md | 9 ++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/csi.proto b/csi.proto index c9fe06e9..49e2fb89 100644 --- a/csi.proto +++ b/csi.proto @@ -1771,8 +1771,11 @@ message VolumeGroupSnapshot { // Indicates if all individual snapshots in the group snapshot // are ready to use as a `volume_content_source` in a // `CreateVolumeRequest`. The default value is false. - // CO MUST wait until all snapshots are ready to use before - // setting this field to true. + // If any snapshot in the list of snapshots in this message have + // ready_to_use set to false, the SP MUST set this field to false. + // If all of the snapshots in the list of snapshots in this message + // have ready_to_use set to true, the SP SHOULD set this field to + // true. // This field is REQUIRED. bool ready_to_use = 4; } diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index 1873119f..3fe7c6aa 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -5291,8 +5291,11 @@ type VolumeGroupSnapshot struct { // Indicates if all individual snapshots in the group snapshot // are ready to use as a `volume_content_source` in a // `CreateVolumeRequest`. The default value is false. - // CO MUST wait until all snapshots are ready to use before - // setting this field to true. + // If any snapshot in the list of snapshots in this message have + // ready_to_use set to false, the SP MUST set this field to false. + // If all of the snapshots in the list of snapshots in this message + // have ready_to_use set to true, the SP SHOULD set this field to + // true. // This field is REQUIRED. ReadyToUse bool `protobuf:"varint,4,opt,name=ready_to_use,json=readyToUse,proto3" json:"ready_to_use,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` diff --git a/spec.md b/spec.md index 5f041b28..e0f48a05 100644 --- a/spec.md +++ b/spec.md @@ -2837,7 +2837,7 @@ If a group snapshot corresponding to the specified group snapshot `name` is succ If an error occurs before a group snapshot is cut, `CreateVolumeGroupSnapshot` SHOULD return a corresponding gRPC error code that reflects the error condition. -For plugins that supports snapshot post processing such as uploading, CreateVolumeGroupSnapshot SHOULD return 0 OK and ready_to_use SHOULD be set to false after the group snapshot is cut but still being processed. CO SHOULD then reissue the same CreateVolumeGroupSnapshotRequest periodically until boolean ready_to_use flips to true indicating all the snapshots have been "processed" and are ready to use to create new volumes. If an error occurs during the process for any individual snapshot, CreateVolumeGroupSnapshot SHOULD return a corresponding gRPC error code that reflects the error condition. The ready_to_use field for all individual snapshots SHOULD stay false until all the snapshots have been "processed" and are ready to use to create new volumes. +For plugins that support snapshot post processing such as uploading, CreateVolumeGroupSnapshot SHOULD return 0 OK and the ready_to_use field SHOULD be set to false after the group snapshot is cut but still being processed. The CO SHOULD issue the CreateVolumeGroupSnapshotRequest RPC with the same arguments again periodically until the ready_to_use field has a value of true indicating all the snapshots have been "processed" and are ready to use to create new volumes. If an error occurs during the process for any individual snapshot, CreateVolumeGroupSnapshot SHOULD return a corresponding gRPC error code that reflects the error condition. The ready_to_use field for each individual snapshot SHOULD have a value of false until the snapshot has been "processed" and is ready to use to create new volumes. An individual snapshot MAY be used as the source to provision a new volume. @@ -2908,8 +2908,11 @@ message VolumeGroupSnapshot { // Indicates if all individual snapshots in the group snapshot // are ready to use as a `volume_content_source` in a // `CreateVolumeRequest`. The default value is false. - // CO MUST wait until all snapshots are ready to use before - // setting this field to true. + // If any snapshot in the list of snapshots in this message have + // ready_to_use set to false, the SP MUST set this field to false. + // If all of the snapshots in the list of snapshots in this message + // have ready_to_use set to true, the SP SHOULD set this field to + // true. // This field is REQUIRED. bool ready_to_use = 4; } From f595ae3613b4496d7e7d273323de80d626d9d48f Mon Sep 17 00:00:00 2001 From: xing-yang Date: Tue, 31 Jan 2023 17:36:29 +0000 Subject: [PATCH 06/13] Address review comments --- csi.proto | 12 +++++++++--- lib/go/csi/csi.pb.go | 12 +++++++++--- spec.md | 21 +++++++++++++-------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/csi.proto b/csi.proto index 49e2fb89..f38392ea 100644 --- a/csi.proto +++ b/csi.proto @@ -207,10 +207,10 @@ message PluginCapability { VOLUME_ACCESSIBILITY_CONSTRAINTS = 2; // GROUP_CONTROLLER_SERVICE indicates that the Plugin provides - // RPCs for the GroupControllerService. Plugins MAY provide this - // capability. + // RPCs for operating on groups of volumes. Plugins MAY provide + // this capability. // The presence of this capability determines whether the CO will - // attempt to invoke the REQUIRED GroupControllerService RPCs, as + // attempt to invoke the REQUIRED GroupController service RPCs, as // well as specific RPCs as indicated by // GroupControllerGetCapabilities. GROUP_CONTROLLER_SERVICE = 3; @@ -1204,6 +1204,8 @@ message Snapshot { // SHOULD provide the ID of the volume group snapshot in this field. // If provided, CO MUST use this field to indicate that this snapshot // is part of the specified group snapshot. + // If not provided, CO SHALL not indicate this snapshot is part of + // a group snapshot and allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. string group_snapshot_id = 6 [(alpha_field) = true]; @@ -1787,7 +1789,11 @@ message DeleteVolumeGroupSnapshotRequest { string group_snapshot_id = 1; // A list of snapshot IDs that are part of this group snapshot. + // If SP does not need to rely on this field to delete the snapshots + // in the group, this field MAY be ignored. // Some SPs require this list to delete the snapshots in the group. + // If SP needs to use this field to delete the snapshots in the + // group, it MAY report an error when there is a mismatch. // This field is REQUIRED. repeated string snapshot_ids = 2; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index 3fe7c6aa..e0ae1cec 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -48,10 +48,10 @@ const ( // accessible from a given node when scheduling workloads. PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS PluginCapability_Service_Type = 2 // GROUP_CONTROLLER_SERVICE indicates that the Plugin provides - // RPCs for the GroupControllerService. Plugins MAY provide this - // capability. + // RPCs for operating on groups of volumes. Plugins MAY provide + // this capability. // The presence of this capability determines whether the CO will - // attempt to invoke the REQUIRED GroupControllerService RPCs, as + // attempt to invoke the REQUIRED GroupController service RPCs, as // well as specific RPCs as indicated by // GroupControllerGetCapabilities. PluginCapability_Service_GROUP_CONTROLLER_SERVICE PluginCapability_Service_Type = 3 @@ -3314,6 +3314,8 @@ type Snapshot struct { // SHOULD provide the ID of the volume group snapshot in this field. // If provided, CO MUST use this field to indicate that this snapshot // is part of the specified group snapshot. + // If not provided, CO SHALL not indicate this snapshot is part of + // a group snapshot and allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. GroupSnapshotId string `protobuf:"bytes,6,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` @@ -5361,7 +5363,11 @@ type DeleteVolumeGroupSnapshotRequest struct { // This field is REQUIRED. GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` // A list of snapshot IDs that are part of this group snapshot. + // If SP does not need to rely on this field to delete the snapshots + // in the group, this field MAY be ignored. // Some SPs require this list to delete the snapshots in the group. + // If SP needs to use this field to delete the snapshots in the + // group, it MAY report an error when there is a mismatch. // This field is REQUIRED. SnapshotIds []string `protobuf:"bytes,2,rep,name=snapshot_ids,json=snapshotIds,proto3" json:"snapshot_ids,omitempty"` // Secrets required by plugin to complete group snapshot deletion diff --git a/spec.md b/spec.md index e0f48a05..22096fe0 100644 --- a/spec.md +++ b/spec.md @@ -617,10 +617,10 @@ message PluginCapability { VOLUME_ACCESSIBILITY_CONSTRAINTS = 2; // GROUP_CONTROLLER_SERVICE indicates that the Plugin provides - // RPCs for the GroupControllerService. Plugins MAY provide this - // capability. + // RPCs for operating on groups of volumes. Plugins MAY provide + // this capability. // The presence of this capability determines whether the CO will - // attempt to invoke the REQUIRED GroupControllerService RPCs, as + // attempt to invoke the REQUIRED GroupController service RPCs, as // well as specific RPCs as indicated by // GroupControllerGetCapabilities. GROUP_CONTROLLER_SERVICE = 3; @@ -1914,6 +1914,8 @@ message Snapshot { // SHOULD provide the ID of the volume group snapshot in this field. // If provided, CO MUST use this field to indicate that this snapshot // is part of the specified group snapshot. + // If not provided, CO SHALL not indicate this snapshot is part of + // a group snapshot and allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. string group_snapshot_id = 6 [(alpha_field) = true]; @@ -2784,7 +2786,7 @@ message NodeExpandVolumeResponse { #### `GroupControllerGetCapabilities` -A GroupController Plugin MUST implement this RPC call. This RPC allows the CO to check the supported capabilities of group controller service provided by the Plugin. +A Plugin that implements GroupController MUST implement this RPC call. This RPC allows the CO to check the supported capabilities of group controller service provided by the Plugin. ```protobuf message GroupControllerGetCapabilitiesRequest { @@ -2831,7 +2833,7 @@ If the plugin is unable to complete the GroupControllerGetCapabilities call succ A Group Controller Plugin MUST implement this RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` controller capability. This RPC will be called by the CO to create a new volume group snapshot from a list of source volumes on behalf of a user. -The purpose of this call is to request the creation of a multi-volume snapshot. Group snapshots can be created from the existing list of volumes. Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name - the group snapshot must only be created once. +The purpose of this call is to request the creation of a multi-volume snapshot.This group snapshot SHOULD be crash consistent. Group snapshots can be created from the existing list of volumes. Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name - the group snapshot must only be created once. If a group snapshot corresponding to the specified group snapshot `name` is successfully created (meaning all snapshots associated with the group are successfully cut), the Plugin MUST reply `0 OK` with the corresponding `CreateVolumeGroupSnapshotResponse`. @@ -2839,11 +2841,11 @@ If an error occurs before a group snapshot is cut, `CreateVolumeGroupSnapshot` S For plugins that support snapshot post processing such as uploading, CreateVolumeGroupSnapshot SHOULD return 0 OK and the ready_to_use field SHOULD be set to false after the group snapshot is cut but still being processed. The CO SHOULD issue the CreateVolumeGroupSnapshotRequest RPC with the same arguments again periodically until the ready_to_use field has a value of true indicating all the snapshots have been "processed" and are ready to use to create new volumes. If an error occurs during the process for any individual snapshot, CreateVolumeGroupSnapshot SHOULD return a corresponding gRPC error code that reflects the error condition. The ready_to_use field for each individual snapshot SHOULD have a value of false until the snapshot has been "processed" and is ready to use to create new volumes. -An individual snapshot MAY be used as the source to provision a new volume. +After snapshot creation, any individual snapshot from the group MAY be used as a source to provision a new volume. In VolumeGroupSnapshot message, both snapshots and group_snapshot_id are required fields. -If an error occurs before all the individual snapshots are created when creating a group snapshot of multiple volumes and a group_snapshot_id is not yet available for CO to do clean up, SP SHOULD do clean up and make sure no snapshots are leaked. +If an error occurs before all the individual snapshots are cut when creating a group snapshot of multiple volumes and a group_snapshot_id is not yet available for CO to do clean up, SP MUST return an error, and SP SHOULD also do clean up and make sure no snapshots are leaked. ```protobuf message CreateVolumeGroupSnapshotRequest { @@ -2950,7 +2952,11 @@ message DeleteVolumeGroupSnapshotRequest { string group_snapshot_id = 1; // A list of snapshot IDs that are part of this group snapshot. + // If SP does not need to rely on this field to delete the snapshots + // in the group, this field MAY be ignored. // Some SPs require this list to delete the snapshots in the group. + // If SP needs to use this field to delete the snapshots in the + // group, it MAY report an error when there is a mismatch. // This field is REQUIRED. repeated string snapshot_ids = 2; @@ -2988,7 +2994,6 @@ This optional RPC MAY be called by the CO to fetch current information about a v A Controller Plugin MUST implement this `GetVolumeGroupSnapshot` RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` capability. -`GetVolumeGroupSnapshot` SHALL NOT show a group snapshot that is being created but has not been created successfully yet. `GetVolumeGroupSnapshotResponse` should contain current information of a volume group snapshot if it exists. If the volume group snapshot does not exist any more, `GetVolumeGroupSnapshot` should return gRPC error code `NOT_FOUND`. From 4b8f1430f0f4192e31335e166f382f5f2bfc1bda Mon Sep 17 00:00:00 2001 From: xing-yang Date: Wed, 1 Feb 2023 14:33:18 +0000 Subject: [PATCH 07/13] Clarified requirements for consistency --- spec.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec.md b/spec.md index 22096fe0..7733a8b2 100644 --- a/spec.md +++ b/spec.md @@ -2833,9 +2833,9 @@ If the plugin is unable to complete the GroupControllerGetCapabilities call succ A Group Controller Plugin MUST implement this RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` controller capability. This RPC will be called by the CO to create a new volume group snapshot from a list of source volumes on behalf of a user. -The purpose of this call is to request the creation of a multi-volume snapshot.This group snapshot SHOULD be crash consistent. Group snapshots can be created from the existing list of volumes. Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name - the group snapshot must only be created once. +The purpose of this call is to request the creation of a multi-volume group snapshot. This group snapshot MUST give a write-order consistency guarantee or fail if that's not possible. That is to say, all the of the volume snapshots in the group MUST be taken at the same point-in-time relative to a stream of write traffic to the specified volumes. Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name, with the same `source_volume_ids` and `parameters` - the group snapshot MUST only be created once. -If a group snapshot corresponding to the specified group snapshot `name` is successfully created (meaning all snapshots associated with the group are successfully cut), the Plugin MUST reply `0 OK` with the corresponding `CreateVolumeGroupSnapshotResponse`. +If a group snapshot corresponding to the specified group snapshot `name`, `source_volume_ids', and `parameters` is successfully created (meaning all snapshots associated with the group are successfully cut), the Plugin MUST reply `0 OK` with the corresponding `CreateVolumeGroupSnapshotResponse`. If an error occurs before a group snapshot is cut, `CreateVolumeGroupSnapshot` SHOULD return a corresponding gRPC error code that reflects the error condition. From 7445a3a0f585733ad283907e0ec6ecf989c839ab Mon Sep 17 00:00:00 2001 From: xing-yang Date: Tue, 7 Feb 2023 14:41:24 +0000 Subject: [PATCH 08/13] Update comments about group snapshot id --- csi.proto | 10 ++++++---- lib/go/csi/csi.pb.go | 10 ++++++---- spec.md | 10 ++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/csi.proto b/csi.proto index f38392ea..2d81068e 100644 --- a/csi.proto +++ b/csi.proto @@ -1200,10 +1200,12 @@ message Snapshot { // The ID of the volume group snapshot that this snapshot is part of. // It uniquely identifies the group snapshot on the storage system. // This field is OPTIONAL. - // If this snapshot is a member of the volume group snapshot, the SP - // SHOULD provide the ID of the volume group snapshot in this field. - // If provided, CO MUST use this field to indicate that this snapshot - // is part of the specified group snapshot. + // If this snapshot is a member of a volume group snapshot, and it + // CAN NOT be deleted as a stand alone snapshot, then the SP + // MUST provide the ID of the volume group snapshot in this field. + // If provided, CO MUST use this field in subsequent snapshot volume + // group operations to indicate that this snapshot is part of the + // specified group snapshot. // If not provided, CO SHALL not indicate this snapshot is part of // a group snapshot and allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index e0ae1cec..084d4d66 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -3310,10 +3310,12 @@ type Snapshot struct { // The ID of the volume group snapshot that this snapshot is part of. // It uniquely identifies the group snapshot on the storage system. // This field is OPTIONAL. - // If this snapshot is a member of the volume group snapshot, the SP - // SHOULD provide the ID of the volume group snapshot in this field. - // If provided, CO MUST use this field to indicate that this snapshot - // is part of the specified group snapshot. + // If this snapshot is a member of a volume group snapshot, and it + // CAN NOT be deleted as a stand alone snapshot, then the SP + // MUST provide the ID of the volume group snapshot in this field. + // If provided, CO MUST use this field in subsequent snapshot volume + // group operations to indicate that this snapshot is part of the + // specified group snapshot. // If not provided, CO SHALL not indicate this snapshot is part of // a group snapshot and allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value diff --git a/spec.md b/spec.md index 7733a8b2..94fd6143 100644 --- a/spec.md +++ b/spec.md @@ -1910,10 +1910,12 @@ message Snapshot { // The ID of the volume group snapshot that this snapshot is part of. // It uniquely identifies the group snapshot on the storage system. // This field is OPTIONAL. - // If this snapshot is a member of the volume group snapshot, the SP - // SHOULD provide the ID of the volume group snapshot in this field. - // If provided, CO MUST use this field to indicate that this snapshot - // is part of the specified group snapshot. + // If this snapshot is a member of a volume group snapshot, and it + // CAN NOT be deleted as a stand alone snapshot, then the SP + // MUST provide the ID of the volume group snapshot in this field. + // If provided, CO MUST use this field in subsequent snapshot volume + // group operations to indicate that this snapshot is part of the + // specified group snapshot. // If not provided, CO SHALL not indicate this snapshot is part of // a group snapshot and allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value From 5286513e857e192e11ea0f6759f4ecd6a624ab23 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Tue, 7 Feb 2023 23:29:55 +0000 Subject: [PATCH 09/13] Address review comments. --- csi.proto | 6 +++--- lib/go/csi/csi.pb.go | 6 +++--- spec.md | 16 +++++++++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/csi.proto b/csi.proto index 2d81068e..31f51e79 100644 --- a/csi.proto +++ b/csi.proto @@ -1201,13 +1201,13 @@ message Snapshot { // It uniquely identifies the group snapshot on the storage system. // This field is OPTIONAL. // If this snapshot is a member of a volume group snapshot, and it - // CAN NOT be deleted as a stand alone snapshot, then the SP + // MUST NOT be deleted as a stand alone snapshot, then the SP // MUST provide the ID of the volume group snapshot in this field. // If provided, CO MUST use this field in subsequent snapshot volume // group operations to indicate that this snapshot is part of the // specified group snapshot. - // If not provided, CO SHALL not indicate this snapshot is part of - // a group snapshot and allow it to be deleted separately. + // If not provided, CO SHALL treat the snapshot as independent, + // and SP SHALL allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. string group_snapshot_id = 6 [(alpha_field) = true]; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index 084d4d66..086dde68 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -3311,13 +3311,13 @@ type Snapshot struct { // It uniquely identifies the group snapshot on the storage system. // This field is OPTIONAL. // If this snapshot is a member of a volume group snapshot, and it - // CAN NOT be deleted as a stand alone snapshot, then the SP + // MUST NOT be deleted as a stand alone snapshot, then the SP // MUST provide the ID of the volume group snapshot in this field. // If provided, CO MUST use this field in subsequent snapshot volume // group operations to indicate that this snapshot is part of the // specified group snapshot. - // If not provided, CO SHALL not indicate this snapshot is part of - // a group snapshot and allow it to be deleted separately. + // If not provided, CO SHALL treat the snapshot as independent, + // and SP SHALL allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. GroupSnapshotId string `protobuf:"bytes,6,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` diff --git a/spec.md b/spec.md index 94fd6143..b3bec949 100644 --- a/spec.md +++ b/spec.md @@ -1911,13 +1911,13 @@ message Snapshot { // It uniquely identifies the group snapshot on the storage system. // This field is OPTIONAL. // If this snapshot is a member of a volume group snapshot, and it - // CAN NOT be deleted as a stand alone snapshot, then the SP + // MUST NOT be deleted as a stand alone snapshot, then the SP // MUST provide the ID of the volume group snapshot in this field. // If provided, CO MUST use this field in subsequent snapshot volume // group operations to indicate that this snapshot is part of the // specified group snapshot. - // If not provided, CO SHALL not indicate this snapshot is part of - // a group snapshot and allow it to be deleted separately. + // If not provided, CO SHALL treat the snapshot as independent, + // and SP SHALL allow it to be deleted separately. // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. string group_snapshot_id = 6 [(alpha_field) = true]; @@ -1945,7 +1945,13 @@ This RPC will be called by the CO to delete a snapshot. This operation MUST be idempotent. If a snapshot corresponding to the specified `snapshot_id` does not exist or the artifacts associated with the snapshot do not exist anymore, the Plugin MUST reply `0 OK`. -Snapshots that are members of a group snapshot will be deleted when the group snapshot is deleted. The CO SHOULD NOT call this RPC with a snapshot_id for a snapshot that was created as part of a group snapshot, i.e. if the snapshot had a non-empty group_snapshot_id field at creation time. The SP MAY refuse to delete such snapshots with this RPC call and return an error instead. +The CO SHALL NOT call this RPC with a snapshot for which SP +provided a non-empty group_snapshot_id field at creation time. +A snapshot for which SP provided a non-empty group_snapshot_id +indicates a snapshot that CAN NOT be deleted stand alone. +The SP MAY refuse to delete such snapshots with this RPC call and return an error instead. +For such snapshots SP MUST delete the entire snapshot group via a +DeleteVolumeGroupSnapshotRequest call. ```protobuf message DeleteSnapshotRequest { @@ -1970,7 +1976,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| -| Snapshot in use | 9 FAILED_PRECONDITION | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is in use by another resource or it is part of a group snapshot. | Caller SHOULD ensure that there are no other resources using the snapshot, and then retry with exponential back off. | +| Snapshot in use | 9 FAILED_PRECONDITION | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is in use by another resource or it is part of a group snapshot and CAN NOT be deleted stand alone. | Caller SHOULD ensure that there are no other resources using the snapshot, and then retry with exponential back off. | | Operation pending for snapshot | 10 ABORTED | Indicates that there is already an operation pending for the specified snapshot. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per snapshot at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same snapshot. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified snapshot, and then retry with exponential back off. | From 1bc24d7f61c3fc6daebeca3504eb4766708acadb Mon Sep 17 00:00:00 2001 From: xing-yang Date: Thu, 9 Feb 2023 23:09:32 +0000 Subject: [PATCH 10/13] Address comments --- csi.proto | 6 ++---- lib/go/csi/csi.pb.go | 6 ++---- spec.md | 38 ++++++++++++++++++++------------------ 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/csi.proto b/csi.proto index 31f51e79..869ceb3c 100644 --- a/csi.proto +++ b/csi.proto @@ -1203,8 +1203,8 @@ message Snapshot { // If this snapshot is a member of a volume group snapshot, and it // MUST NOT be deleted as a stand alone snapshot, then the SP // MUST provide the ID of the volume group snapshot in this field. - // If provided, CO MUST use this field in subsequent snapshot volume - // group operations to indicate that this snapshot is part of the + // If provided, CO MUST use this field in subsequent volume group + // snapshot operations to indicate that this snapshot is part of the // specified group snapshot. // If not provided, CO SHALL treat the snapshot as independent, // and SP SHALL allow it to be deleted separately. @@ -1805,8 +1805,6 @@ message DeleteVolumeGroupSnapshotRequest { // section on how to use this field. // The secrets provided in this field SHOULD be the same for // all group snapshot operations on the same group snapshot. - // The secrets provided in the field SHOULD be passed to both - // the group snapshot and the individual snapshot members if needed. map secrets = 3 [(csi_secret) = true]; } diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index 086dde68..4fb20839 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -3313,8 +3313,8 @@ type Snapshot struct { // If this snapshot is a member of a volume group snapshot, and it // MUST NOT be deleted as a stand alone snapshot, then the SP // MUST provide the ID of the volume group snapshot in this field. - // If provided, CO MUST use this field in subsequent snapshot volume - // group operations to indicate that this snapshot is part of the + // If provided, CO MUST use this field in subsequent volume group + // snapshot operations to indicate that this snapshot is part of the // specified group snapshot. // If not provided, CO SHALL treat the snapshot as independent, // and SP SHALL allow it to be deleted separately. @@ -5378,8 +5378,6 @@ type DeleteVolumeGroupSnapshotRequest struct { // section on how to use this field. // The secrets provided in this field SHOULD be the same for // all group snapshot operations on the same group snapshot. - // The secrets provided in the field SHOULD be passed to both - // the group snapshot and the individual snapshot members if needed. Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` diff --git a/spec.md b/spec.md index b3bec949..b5d31eb7 100644 --- a/spec.md +++ b/spec.md @@ -1913,8 +1913,8 @@ message Snapshot { // If this snapshot is a member of a volume group snapshot, and it // MUST NOT be deleted as a stand alone snapshot, then the SP // MUST provide the ID of the volume group snapshot in this field. - // If provided, CO MUST use this field in subsequent snapshot volume - // group operations to indicate that this snapshot is part of the + // If provided, CO MUST use this field in subsequent volume group + // snapshot operations to indicate that this snapshot is part of the // specified group snapshot. // If not provided, CO SHALL treat the snapshot as independent, // and SP SHALL allow it to be deleted separately. @@ -1945,13 +1945,10 @@ This RPC will be called by the CO to delete a snapshot. This operation MUST be idempotent. If a snapshot corresponding to the specified `snapshot_id` does not exist or the artifacts associated with the snapshot do not exist anymore, the Plugin MUST reply `0 OK`. -The CO SHALL NOT call this RPC with a snapshot for which SP -provided a non-empty group_snapshot_id field at creation time. -A snapshot for which SP provided a non-empty group_snapshot_id -indicates a snapshot that CAN NOT be deleted stand alone. +The CO SHALL NOT call this RPC with a snapshot for which SP provided a non-empty group_snapshot_id field at creation time. +A snapshot for which SP provided a non-empty group_snapshot_id indicates a snapshot that CAN NOT be deleted stand alone. The SP MAY refuse to delete such snapshots with this RPC call and return an error instead. -For such snapshots SP MUST delete the entire snapshot group via a -DeleteVolumeGroupSnapshotRequest call. +For such snapshots SP MUST delete the entire snapshot group via a DeleteVolumeGroupSnapshotRequest call. ```protobuf message DeleteSnapshotRequest { @@ -2794,7 +2791,8 @@ message NodeExpandVolumeResponse { #### `GroupControllerGetCapabilities` -A Plugin that implements GroupController MUST implement this RPC call. This RPC allows the CO to check the supported capabilities of group controller service provided by the Plugin. +A Plugin that implements GroupController MUST implement this RPC call. +This RPC allows the CO to check the supported capabilities of group controller service provided by the Plugin. ```protobuf message GroupControllerGetCapabilitiesRequest { @@ -2841,17 +2839,23 @@ If the plugin is unable to complete the GroupControllerGetCapabilities call succ A Group Controller Plugin MUST implement this RPC call if it has `CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT` controller capability. This RPC will be called by the CO to create a new volume group snapshot from a list of source volumes on behalf of a user. -The purpose of this call is to request the creation of a multi-volume group snapshot. This group snapshot MUST give a write-order consistency guarantee or fail if that's not possible. That is to say, all the of the volume snapshots in the group MUST be taken at the same point-in-time relative to a stream of write traffic to the specified volumes. Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name, with the same `source_volume_ids` and `parameters` - the group snapshot MUST only be created once. +The purpose of this call is to request the creation of a multi-volume group snapshot. +This group snapshot MUST give a write-order consistency guarantee or fail if that's not possible. +That is to say, all the of the volume snapshots in the group MUST be taken at the same point-in-time relative to a stream of write traffic to the specified volumes. +Note that calls to this function MUST be idempotent - the function may be called multiple times for the same name, with the same `source_volume_ids` and `parameters` - the group snapshot MUST only be created once. -If a group snapshot corresponding to the specified group snapshot `name`, `source_volume_ids', and `parameters` is successfully created (meaning all snapshots associated with the group are successfully cut), the Plugin MUST reply `0 OK` with the corresponding `CreateVolumeGroupSnapshotResponse`. +If a group snapshot corresponding to the specified group snapshot `name`, `source_volume_ids`, and `parameters` is successfully created (meaning all snapshots associated with the group are successfully cut), the Plugin MUST reply `0 OK` with the corresponding `CreateVolumeGroupSnapshotResponse`. If an error occurs before a group snapshot is cut, `CreateVolumeGroupSnapshot` SHOULD return a corresponding gRPC error code that reflects the error condition. -For plugins that support snapshot post processing such as uploading, CreateVolumeGroupSnapshot SHOULD return 0 OK and the ready_to_use field SHOULD be set to false after the group snapshot is cut but still being processed. The CO SHOULD issue the CreateVolumeGroupSnapshotRequest RPC with the same arguments again periodically until the ready_to_use field has a value of true indicating all the snapshots have been "processed" and are ready to use to create new volumes. If an error occurs during the process for any individual snapshot, CreateVolumeGroupSnapshot SHOULD return a corresponding gRPC error code that reflects the error condition. The ready_to_use field for each individual snapshot SHOULD have a value of false until the snapshot has been "processed" and is ready to use to create new volumes. +For plugins that support snapshot post processing such as uploading, CreateVolumeGroupSnapshot SHOULD return 0 OK and the ready_to_use field SHOULD be set to false after the group snapshot is cut but still being processed. +The CO SHOULD issue the CreateVolumeGroupSnapshotRequest RPC with the same arguments again periodically until the ready_to_use field has a value of true indicating all the snapshots have been "processed" and are ready to use to create new volumes. +If an error occurs during the process for any individual snapshot, CreateVolumeGroupSnapshot SHOULD return a corresponding gRPC error code that reflects the error condition. +The ready_to_use field for each individual snapshot SHOULD have a value of false until the snapshot has been "processed" and is ready to use to create new volumes. After snapshot creation, any individual snapshot from the group MAY be used as a source to provision a new volume. -In VolumeGroupSnapshot message, both snapshots and group_snapshot_id are required fields. +In the VolumeGroupSnapshot message, both snapshots and group_snapshot_id are required fields. If an error occurs before all the individual snapshots are cut when creating a group snapshot of multiple volumes and a group_snapshot_id is not yet available for CO to do clean up, SP MUST return an error, and SP SHOULD also do clean up and make sure no snapshots are leaked. @@ -2936,9 +2940,9 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| -| Group snapshot already exists but is incompatible | 6 ALREADY_EXISTS | Indicates that a group snapshot corresponding to the specified group snapshot `name` already exists but is incompatible with the specified `volume_id`. | Caller MUST fix the arguments or use a different `name` before retrying. | +| Group snapshot already exists but is incompatible | 6 ALREADY_EXISTS | Indicates that a group snapshot corresponding to the specified group snapshot `name` already exists but is incompatible with the specified `source_volume_ids` or `parameters`. | Caller MUST fix the arguments or use a different `name` before retrying. | | Cannot snapshot multiple volumes together | 9 FAILED_PRECONDITION | Indicates that the specified volumes cannot be snapshotted together because the volumes are not configured properly based on requirements from the SP. | Caller MUST fix the configuration of the volumes so that they meet the requirements for group snapshotting before retrying. | -| Not enough space to create group snapshot | 13 RESOURCE_EXHAUSTED | There is not enough space on the storage system to handle the create group snapshot request. | Caller SHOULD fail this request. Future calls to CreateVolumeGroupSnapshot MAY succeed if space is freed up. | +| Not enough space to create group snapshot | 13 RESOURCE_EXHAUSTED | There is not enough space on the storage system to handle the create group snapshot request. | Future calls to CreateVolumeGroupSnapshot MAY succeed if space is freed up. | #### `DeleteVolumeGroupSnapshot` @@ -2974,8 +2978,6 @@ message DeleteVolumeGroupSnapshotRequest { // section on how to use this field. // The secrets provided in this field SHOULD be the same for // all group snapshot operations on the same group snapshot. - // The secrets provided in the field SHOULD be passed to both - // the group snapshot and the individual snapshot members if needed. map secrets = 3 [(csi_secret) = true]; } @@ -3039,7 +3041,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| -| Volume group snapshot does not exist | 5 NOT_FOUND | Indicates that a volume group snapshot corresponding to the specified `volume_group_snapshot_id` does not exist. | Caller MUST verify that the `volume_group_snapshot_id` is correct and that the volume group snapshot is accessible and has not been deleted before retrying with exponential back off. | +| Volume group snapshot does not exist | 5 NOT_FOUND | Indicates that a volume group snapshot corresponding to the specified `group_snapshot_id` does not exist. | Caller MUST verify that the `group_snapshot_id` is correct and that the volume group snapshot is accessible and has not been deleted before retrying with exponential back off. | ## Protocol From 8959d25967193aa050f15b0b76f6f6bf0d69d5b6 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Fri, 10 Feb 2023 00:08:52 +0000 Subject: [PATCH 11/13] Added INVALID_ARGUMENT for snapshot id mismatch --- csi.proto | 6 ++++-- lib/go/csi/csi.pb.go | 6 ++++-- spec.md | 7 +++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/csi.proto b/csi.proto index 869ceb3c..63fd18e6 100644 --- a/csi.proto +++ b/csi.proto @@ -1792,10 +1792,12 @@ message DeleteVolumeGroupSnapshotRequest { // A list of snapshot IDs that are part of this group snapshot. // If SP does not need to rely on this field to delete the snapshots - // in the group, this field MAY be ignored. + // in the group, it SHOULD check this field and report an error + // if it has the ability to detect a mismatch. // Some SPs require this list to delete the snapshots in the group. // If SP needs to use this field to delete the snapshots in the - // group, it MAY report an error when there is a mismatch. + // group, it MUST report an error if it has the ability to detect + // a mismatch. // This field is REQUIRED. repeated string snapshot_ids = 2; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index 4fb20839..bf991648 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -5366,10 +5366,12 @@ type DeleteVolumeGroupSnapshotRequest struct { GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` // A list of snapshot IDs that are part of this group snapshot. // If SP does not need to rely on this field to delete the snapshots - // in the group, this field MAY be ignored. + // in the group, it SHOULD check this field and report an error + // if it has the ability to detect a mismatch. // Some SPs require this list to delete the snapshots in the group. // If SP needs to use this field to delete the snapshots in the - // group, it MAY report an error when there is a mismatch. + // group, it MUST report an error if it has the ability to detect + // a mismatch. // This field is REQUIRED. SnapshotIds []string `protobuf:"bytes,2,rep,name=snapshot_ids,json=snapshotIds,proto3" json:"snapshot_ids,omitempty"` // Secrets required by plugin to complete group snapshot deletion diff --git a/spec.md b/spec.md index b5d31eb7..f7bbbae6 100644 --- a/spec.md +++ b/spec.md @@ -2965,10 +2965,12 @@ message DeleteVolumeGroupSnapshotRequest { // A list of snapshot IDs that are part of this group snapshot. // If SP does not need to rely on this field to delete the snapshots - // in the group, this field MAY be ignored. + // in the group, it SHOULD check this field and report an error + // if it has the ability to detect a mismatch. // Some SPs require this list to delete the snapshots in the group. // If SP needs to use this field to delete the snapshots in the - // group, it MAY report an error when there is a mismatch. + // group, it MUST report an error if it has the ability to detect + // a mismatch. // This field is REQUIRED. repeated string snapshot_ids = 2; @@ -2994,6 +2996,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| +| Snapshot list mismatch | 3 INVALID_ARGUMENT | Besides the general cases, this code SHOULD also be used to indicate when plugin supporting CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT detects a mismatch in the `snapshot_ids`. | If a mismatch is detected in the `snapshot_ids`, caller SHOULD use different `snapshot_ids`. | | Volume group snapshot in use | 9 FAILED_PRECONDITION | Indicates that the volume group snapshot corresponding to the specified `group_snapshot_id` could not be deleted because it is in use by another resource. | Caller SHOULD ensure that there are no other resources using the volume group snapshot, and then retry with exponential back off. | #### `GetVolumeGroupSnapshot` From 4ced11bfe8df7994223d3efb60f52eb65f18ddac Mon Sep 17 00:00:00 2001 From: xing-yang Date: Thu, 16 Feb 2023 17:57:40 +0000 Subject: [PATCH 12/13] Adds snapshot_ids to GetVolumeGroupSnapshotRequest --- csi.proto | 13 +- lib/go/csi/csi.pb.go | 539 ++++++++++++++++++++++--------------------- spec.md | 14 +- 3 files changed, 303 insertions(+), 263 deletions(-) diff --git a/csi.proto b/csi.proto index 63fd18e6..e53765eb 100644 --- a/csi.proto +++ b/csi.proto @@ -1821,13 +1821,24 @@ message GetVolumeGroupSnapshotRequest { // This field is REQUIRED. string group_snapshot_id = 1; + // A list of snapshot IDs that are part of this group snapshot. + // If SP does not need to rely on this field to get the snapshots + // in the group, it SHOULD check this field and report an error + // if it has the ability to detect a mismatch. + // Some SPs require this list to get the snapshots in the group. + // If SP needs to use this field to get the snapshots in the + // group, it MUST report an error if it has the ability to detect + // a mismatch. + // This field is REQUIRED. + repeated string snapshot_ids = 2; + // Secrets required by plugin to complete // GetVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. // The secrets provided in this field SHOULD be the same for // all group snapshot operations on the same group snapshot. - map secrets = 2 [(csi_secret) = true]; + map secrets = 3 [(csi_secret) = true]; } message GetVolumeGroupSnapshotResponse { diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index bf991648..e918e27a 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -5468,13 +5468,23 @@ type GetVolumeGroupSnapshotRequest struct { // information for. // This field is REQUIRED. GroupSnapshotId string `protobuf:"bytes,1,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` + // A list of snapshot IDs that are part of this group snapshot. + // If SP does not need to rely on this field to get the snapshots + // in the group, it SHOULD check this field and report an error + // if it has the ability to detect a mismatch. + // Some SPs require this list to get the snapshots in the group. + // If SP needs to use this field to get the snapshots in the + // group, it MUST report an error if it has the ability to detect + // a mismatch. + // This field is REQUIRED. + SnapshotIds []string `protobuf:"bytes,2,rep,name=snapshot_ids,json=snapshotIds,proto3" json:"snapshot_ids,omitempty"` // Secrets required by plugin to complete // GetVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. // The secrets provided in this field SHOULD be the same for // all group snapshot operations on the same group snapshot. - Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Secrets map[string]string `protobuf:"bytes,3,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -5512,6 +5522,13 @@ func (m *GetVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { return "" } +func (m *GetVolumeGroupSnapshotRequest) GetSnapshotIds() []string { + if m != nil { + return m.SnapshotIds + } + return nil +} + func (m *GetVolumeGroupSnapshotRequest) GetSecrets() map[string]string { if m != nil { return m.Secrets @@ -5763,266 +5780,266 @@ func init() { var fileDescriptor_9cdb00adce470e01 = []byte{ // 4168 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x4d, 0x6c, 0x1b, 0x49, - 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xd3, 0x8f, 0xa9, 0xd2, 0x8f, 0xe9, 0x96, 0x2c, 0x4b, 0xed, 0xb1, - 0x47, 0xe3, 0xb1, 0xe9, 0x19, 0xed, 0xcc, 0x60, 0x47, 0xe3, 0xd9, 0x1d, 0x52, 0xa2, 0x25, 0xae, - 0x69, 0x52, 0xd3, 0xa4, 0x3c, 0x6b, 0x27, 0x83, 0x9e, 0x16, 0x59, 0x92, 0x1b, 0x43, 0x76, 0x73, - 0xba, 0x9b, 0x8a, 0xb5, 0x97, 0x24, 0x1b, 0x04, 0xd8, 0x20, 0x97, 0x20, 0x39, 0x64, 0x72, 0xca, - 0x22, 0xc9, 0x71, 0x17, 0x7b, 0x08, 0x16, 0x39, 0x06, 0xc8, 0x2d, 0x01, 0x82, 0xe4, 0x98, 0xe4, - 0xb2, 0x87, 0x00, 0x39, 0x2c, 0x26, 0xc0, 0x9c, 0x72, 0xc8, 0x21, 0x08, 0xba, 0xaa, 0xfa, 0xff, - 0x87, 0xa4, 0x25, 0xc3, 0x01, 0x72, 0xb2, 0xba, 0xea, 0xd5, 0xab, 0x57, 0x55, 0xef, 0xbd, 0x7a, - 0xef, 0x7b, 0x45, 0xc3, 0xfb, 0xa7, 0x8a, 0xf9, 0x7c, 0x70, 0x5c, 0x6c, 0x6b, 0xbd, 0xfb, 0x6d, - 0x4d, 0x35, 0x65, 0x45, 0xc5, 0xfa, 0x3d, 0xc3, 0xd4, 0x74, 0xf9, 0x14, 0xdf, 0x53, 0x54, 0x13, - 0xeb, 0x27, 0x72, 0x1b, 0xdf, 0x37, 0xfa, 0xb8, 0x7d, 0xbf, 0x6d, 0x28, 0xc5, 0xbe, 0xae, 0x99, - 0x1a, 0xca, 0x59, 0x7f, 0x9e, 0xbd, 0xcb, 0x6f, 0x9c, 0x6a, 0xda, 0x69, 0x17, 0xdf, 0x27, 0xad, - 0xc7, 0x83, 0x93, 0xfb, 0x1d, 0x6c, 0xb4, 0x75, 0xa5, 0x6f, 0x6a, 0x3a, 0xa5, 0xe4, 0x6f, 0x04, - 0x29, 0x4c, 0xa5, 0x87, 0x0d, 0x53, 0xee, 0xf5, 0x19, 0xc1, 0x7a, 0x90, 0xe0, 0xb7, 0x74, 0xb9, - 0xdf, 0xc7, 0xba, 0x41, 0xfb, 0x85, 0x15, 0x58, 0xda, 0xc7, 0xe6, 0x61, 0x77, 0x70, 0xaa, 0xa8, - 0x55, 0xf5, 0x44, 0x13, 0xf1, 0x57, 0x03, 0x6c, 0x98, 0xc2, 0xbf, 0x70, 0xb0, 0x1c, 0xe8, 0x30, - 0xfa, 0x9a, 0x6a, 0x60, 0x84, 0x20, 0xa3, 0xca, 0x3d, 0x5c, 0xe0, 0x36, 0xb8, 0xad, 0x69, 0x91, - 0xfc, 0x8d, 0x6e, 0xc1, 0xfc, 0x19, 0x56, 0x3b, 0x9a, 0x2e, 0x9d, 0x61, 0xdd, 0x50, 0x34, 0xb5, - 0x90, 0x22, 0xbd, 0x73, 0xb4, 0xf5, 0x09, 0x6d, 0x44, 0xfb, 0x30, 0xd5, 0x93, 0x55, 0xe5, 0x04, - 0x1b, 0x66, 0x21, 0xbd, 0x91, 0xde, 0x9a, 0xd9, 0x7e, 0xbb, 0x48, 0x97, 0x5a, 0x8c, 0x9c, 0xab, - 0xf8, 0x98, 0x51, 0x57, 0x54, 0x53, 0x3f, 0x17, 0x9d, 0xc1, 0xfc, 0x47, 0x30, 0xe7, 0xeb, 0x42, - 0x79, 0x48, 0x7f, 0x89, 0xcf, 0x99, 0x4c, 0xd6, 0x9f, 0x68, 0x09, 0xb2, 0x67, 0x72, 0x77, 0x80, - 0x99, 0x24, 0xf4, 0x63, 0x27, 0xf5, 0x5d, 0x4e, 0x58, 0x87, 0x35, 0x67, 0xb6, 0x5d, 0xb9, 0x2f, - 0x1f, 0x2b, 0x5d, 0xc5, 0x54, 0xb0, 0x61, 0x2f, 0xfd, 0x73, 0xb8, 0x1e, 0xd3, 0xcf, 0x76, 0xe0, - 0x01, 0xcc, 0xb6, 0x3d, 0xed, 0x05, 0x8e, 0x2c, 0xa5, 0x60, 0x2f, 0x25, 0x30, 0xf2, 0x5c, 0xf4, - 0x51, 0x0b, 0xdf, 0xa4, 0x21, 0x1f, 0x24, 0x41, 0x0f, 0x60, 0xd2, 0xc0, 0xfa, 0x99, 0xd2, 0xa6, - 0xfb, 0x3a, 0xb3, 0xbd, 0x11, 0xc7, 0xad, 0xd8, 0xa4, 0x74, 0x07, 0x13, 0xa2, 0x3d, 0x04, 0x1d, - 0x41, 0xfe, 0x4c, 0xeb, 0x0e, 0x7a, 0x58, 0xc2, 0x2f, 0xfa, 0xb2, 0xea, 0x1c, 0xc0, 0xcc, 0xf6, - 0x56, 0x2c, 0x9b, 0x27, 0x64, 0x40, 0xc5, 0xa6, 0x3f, 0x98, 0x10, 0xaf, 0x9c, 0xf9, 0x9b, 0xf8, - 0x5f, 0x72, 0x30, 0xc9, 0x66, 0x43, 0x1f, 0x42, 0xc6, 0x3c, 0xef, 0x53, 0xe9, 0xe6, 0xb7, 0x6f, - 0x0d, 0x93, 0xae, 0xd8, 0x3a, 0xef, 0x63, 0x91, 0x0c, 0x11, 0x34, 0xc8, 0x58, 0x5f, 0x68, 0x06, - 0x26, 0x8f, 0xea, 0x8f, 0xea, 0x8d, 0xcf, 0xea, 0xf9, 0x09, 0xb4, 0x02, 0x68, 0xb7, 0x51, 0x6f, - 0x89, 0x8d, 0x5a, 0xad, 0x22, 0x4a, 0xcd, 0x8a, 0xf8, 0xa4, 0xba, 0x5b, 0xc9, 0x73, 0xe8, 0x0d, - 0xd8, 0x78, 0xd2, 0xa8, 0x1d, 0x3d, 0xae, 0x48, 0xa5, 0xdd, 0xdd, 0x4a, 0xb3, 0x59, 0x2d, 0x57, - 0x6b, 0xd5, 0xd6, 0x53, 0x69, 0xb7, 0x51, 0x6f, 0xb6, 0xc4, 0x52, 0xb5, 0xde, 0x6a, 0xe6, 0x53, - 0x68, 0x0d, 0x0a, 0xfb, 0x62, 0xe3, 0xe8, 0x50, 0x8a, 0xe0, 0x91, 0xe6, 0x7f, 0xcc, 0xc1, 0x95, - 0xc0, 0xf2, 0x50, 0xc9, 0x27, 0xff, 0xbd, 0x51, 0xb7, 0xc5, 0xbb, 0x8e, 0xbb, 0x51, 0xeb, 0x00, - 0xc8, 0x35, 0xea, 0xb5, 0x6a, 0xdd, 0x92, 0x7d, 0x06, 0x26, 0x1b, 0x0f, 0x1f, 0x92, 0x8f, 0x54, - 0x39, 0x47, 0x27, 0x14, 0xe6, 0x61, 0xf6, 0x50, 0xd7, 0x8e, 0xb1, 0xad, 0x5d, 0x25, 0x98, 0x63, - 0xdf, 0x4c, 0x9b, 0xde, 0x81, 0xac, 0x8e, 0xe5, 0xce, 0x39, 0x3b, 0x78, 0xbe, 0x48, 0x2d, 0xb6, - 0x68, 0x5b, 0x6c, 0xb1, 0xac, 0x69, 0xdd, 0x27, 0x96, 0xf6, 0x8a, 0x94, 0x50, 0xf8, 0x36, 0x03, - 0x8b, 0xbb, 0x3a, 0x96, 0x4d, 0x4c, 0xa5, 0x65, 0xac, 0x23, 0x2d, 0xf3, 0x01, 0xcc, 0x5b, 0xda, - 0xd7, 0x56, 0xcc, 0x73, 0x49, 0x97, 0xd5, 0x53, 0xcc, 0x14, 0x63, 0xd9, 0xde, 0x81, 0x5d, 0xd6, - 0x2b, 0x5a, 0x9d, 0xe2, 0x5c, 0xdb, 0xfb, 0x89, 0xaa, 0xb0, 0xc8, 0x14, 0xcb, 0xa7, 0xf0, 0x69, - 0xbf, 0xc2, 0x53, 0x29, 0x3c, 0x0a, 0x8f, 0xce, 0xfc, 0x2d, 0x0a, 0x36, 0xd0, 0x23, 0x80, 0xbe, - 0xac, 0xcb, 0x3d, 0x6c, 0x62, 0xdd, 0x28, 0x64, 0xfc, 0xd6, 0x1f, 0xb1, 0x9a, 0xe2, 0xa1, 0x43, - 0x4d, 0xad, 0xdf, 0x33, 0x1c, 0xed, 0x5b, 0xe6, 0xd2, 0xd6, 0xb1, 0x69, 0x14, 0xb2, 0x84, 0xd3, - 0x56, 0x12, 0xa7, 0x26, 0x25, 0x25, 0x6c, 0xca, 0xe9, 0xaf, 0xcb, 0x9c, 0x68, 0x8f, 0x46, 0x0d, - 0x58, 0xb6, 0x17, 0xa8, 0xa9, 0x26, 0x56, 0x4d, 0xc9, 0xd0, 0x06, 0x7a, 0x1b, 0x17, 0x72, 0x64, - 0x97, 0x56, 0x03, 0x4b, 0xa4, 0x34, 0x4d, 0x42, 0x22, 0xb2, 0xad, 0xf1, 0x35, 0xa2, 0x67, 0xc0, - 0xcb, 0xed, 0x36, 0x36, 0x0c, 0x85, 0xee, 0x85, 0xa4, 0xe3, 0xaf, 0x06, 0x8a, 0x8e, 0x7b, 0x58, - 0x35, 0x8d, 0xc2, 0xa4, 0x9f, 0x6b, 0x4b, 0xeb, 0x6b, 0x5d, 0xed, 0xf4, 0x5c, 0x74, 0x69, 0xc4, - 0x6b, 0xbe, 0xe1, 0x9e, 0x1e, 0x83, 0xff, 0x18, 0xae, 0x04, 0x36, 0x65, 0x1c, 0xbf, 0xc7, 0xef, - 0xc0, 0xac, 0x77, 0x27, 0xc6, 0xf2, 0x99, 0x7f, 0x98, 0x82, 0xc5, 0x88, 0x3d, 0x40, 0x07, 0x30, - 0x65, 0xa8, 0x72, 0xdf, 0x78, 0xae, 0x99, 0x4c, 0x7f, 0xef, 0x24, 0x6c, 0x59, 0xb1, 0xc9, 0x68, - 0xe9, 0xe7, 0xc1, 0x84, 0xe8, 0x8c, 0x46, 0x65, 0xc8, 0xd1, 0xfd, 0x0c, 0x7a, 0xae, 0x28, 0x3e, - 0xb4, 0xcd, 0xe1, 0xc2, 0x46, 0xf2, 0xef, 0xc2, 0xbc, 0x7f, 0x06, 0x74, 0x03, 0x66, 0xec, 0x19, - 0x24, 0xa5, 0xc3, 0xd6, 0x0a, 0x76, 0x53, 0xb5, 0xc3, 0xbf, 0x0d, 0xb3, 0x5e, 0x66, 0x68, 0x15, - 0xa6, 0x99, 0x42, 0x38, 0xe4, 0x53, 0xb4, 0xa1, 0xda, 0x71, 0x6c, 0xfa, 0x7b, 0xb0, 0xe4, 0xd7, - 0x33, 0x66, 0xca, 0xb7, 0x9d, 0x35, 0xd0, 0xbd, 0x98, 0xf7, 0xaf, 0xc1, 0x96, 0x53, 0xf8, 0xf3, - 0x2c, 0xe4, 0x83, 0x46, 0x83, 0x1e, 0x40, 0xf6, 0xb8, 0xab, 0xb5, 0xbf, 0x64, 0x63, 0xdf, 0x88, - 0xb3, 0xae, 0x62, 0xd9, 0xa2, 0xa2, 0xad, 0x07, 0x13, 0x22, 0x1d, 0x64, 0x8d, 0xee, 0x69, 0x03, - 0xd5, 0x64, 0xbb, 0x17, 0x3f, 0xfa, 0xb1, 0x45, 0xe5, 0x8e, 0x26, 0x83, 0xd0, 0x1e, 0xcc, 0x50, - 0xb5, 0x93, 0x7a, 0x5a, 0x07, 0x17, 0xd2, 0x84, 0xc7, 0xcd, 0x58, 0x1e, 0x25, 0x42, 0xfb, 0x58, - 0xeb, 0x60, 0x11, 0x64, 0xe7, 0x6f, 0x7e, 0x0e, 0x66, 0x3c, 0xb2, 0xf1, 0x03, 0x98, 0xf1, 0x4c, - 0x86, 0xae, 0xc2, 0xe4, 0x89, 0x21, 0x39, 0x4e, 0x78, 0x5a, 0xcc, 0x9d, 0x18, 0xc4, 0x9f, 0xde, - 0x80, 0x19, 0x22, 0x85, 0x74, 0xd2, 0x95, 0x4f, 0x8d, 0x42, 0x6a, 0x23, 0x6d, 0x9d, 0x11, 0x69, - 0x7a, 0x68, 0xb5, 0xa0, 0xbb, 0xc0, 0x1c, 0x8a, 0x44, 0xe9, 0x4e, 0x75, 0x6d, 0xd0, 0x27, 0x42, - 0x4e, 0x8b, 0xec, 0xe2, 0x23, 0x13, 0xed, 0x5b, 0xed, 0xfc, 0x5f, 0xa7, 0x00, 0x5c, 0x01, 0xd1, - 0x03, 0xc8, 0x90, 0x35, 0x51, 0xc7, 0xbf, 0x35, 0xc2, 0x9a, 0x8a, 0x64, 0x61, 0x64, 0x94, 0xf0, - 0x1f, 0x1c, 0x64, 0x08, 0x9b, 0xe0, 0xe5, 0xd5, 0xac, 0xd6, 0xf7, 0x6b, 0x15, 0xa9, 0xde, 0xd8, - 0xab, 0x48, 0x9f, 0x89, 0xd5, 0x56, 0x45, 0xcc, 0x73, 0x68, 0x15, 0xae, 0x7a, 0xdb, 0xc5, 0x4a, - 0x69, 0xaf, 0x22, 0x4a, 0x8d, 0x7a, 0xed, 0x69, 0x3e, 0x85, 0x78, 0x58, 0x79, 0x7c, 0x54, 0x6b, - 0x55, 0xc3, 0x7d, 0x69, 0xeb, 0x3e, 0xf3, 0xf4, 0x31, 0x1e, 0x8c, 0x6d, 0xc6, 0x62, 0xeb, 0xe9, - 0xa5, 0x7f, 0xb2, 0xce, 0x2c, 0x12, 0xe0, 0x9a, 0x77, 0x4e, 0xff, 0xd8, 0x1c, 0x9f, 0xfe, 0x69, - 0x99, 0x43, 0x9b, 0x50, 0xf0, 0xd2, 0xf8, 0x38, 0x4c, 0x12, 0x92, 0xf2, 0x9c, 0xa3, 0x01, 0x44, - 0xc3, 0x3f, 0x83, 0x39, 0xdf, 0xc5, 0x60, 0x45, 0x78, 0xcc, 0x93, 0x75, 0xa4, 0xe3, 0x73, 0x93, - 0x44, 0x3d, 0xdc, 0x56, 0x5a, 0x9c, 0xb3, 0x5b, 0xcb, 0x56, 0xa3, 0x75, 0x96, 0x5d, 0xa5, 0xa7, - 0x98, 0x8c, 0x26, 0x45, 0x68, 0x80, 0x34, 0x11, 0x02, 0xe1, 0x57, 0x29, 0xc8, 0x31, 0x85, 0xb8, - 0xe5, 0xb9, 0x9a, 0x7c, 0x2c, 0xed, 0x56, 0xca, 0xd2, 0x67, 0x91, 0x29, 0xbf, 0x45, 0xa2, 0x03, - 0x98, 0xf7, 0xfa, 0xef, 0x17, 0x76, 0x5c, 0xb9, 0xe9, 0x3f, 0x67, 0xaf, 0x13, 0x79, 0xc1, 0xa2, - 0xc9, 0xb9, 0x33, 0x6f, 0x1b, 0x2a, 0xc3, 0x7c, 0xe0, 0x0a, 0xc8, 0x0c, 0xbf, 0x02, 0xe6, 0xda, - 0x3e, 0x6f, 0x58, 0x82, 0x45, 0xdb, 0x7b, 0x77, 0xb1, 0x64, 0x32, 0xef, 0xce, 0xae, 0xa8, 0x7c, - 0xc8, 0xeb, 0x23, 0x97, 0xd8, 0x6e, 0xe3, 0x3f, 0x01, 0x14, 0x96, 0x75, 0x2c, 0x57, 0x3d, 0x80, - 0xc5, 0x88, 0x7b, 0x05, 0x15, 0x61, 0x9a, 0x1c, 0x95, 0xa1, 0x98, 0x98, 0x45, 0xac, 0x61, 0x89, - 0x5c, 0x12, 0x8b, 0xbe, 0xaf, 0xe3, 0x13, 0xac, 0xeb, 0xb8, 0x43, 0x6c, 0x32, 0x92, 0xde, 0x21, - 0x11, 0x7e, 0x8f, 0x83, 0x29, 0xbb, 0x1d, 0xed, 0xc0, 0x94, 0x81, 0x4f, 0xe9, 0x9d, 0x47, 0xe7, - 0x5a, 0x0f, 0x8e, 0x2d, 0x36, 0x19, 0x01, 0x8b, 0xed, 0x6d, 0x7a, 0x2b, 0xb6, 0xf7, 0x75, 0x8d, - 0xb5, 0xf8, 0xbf, 0xe1, 0x60, 0x71, 0x0f, 0x77, 0x71, 0x30, 0x34, 0x4a, 0x72, 0xeb, 0xde, 0x68, - 0x22, 0xe5, 0x8f, 0x26, 0x22, 0x58, 0x25, 0x44, 0x13, 0x17, 0xba, 0x61, 0x57, 0x60, 0xc9, 0x3f, - 0x1b, 0xbd, 0x53, 0x84, 0xff, 0x4c, 0xc3, 0xba, 0xa5, 0x0b, 0xba, 0xd6, 0xed, 0x62, 0xfd, 0x70, - 0x70, 0xdc, 0x55, 0x8c, 0xe7, 0x63, 0x2c, 0xee, 0x2a, 0x4c, 0xaa, 0x5a, 0xc7, 0x63, 0x3c, 0x39, - 0xeb, 0xb3, 0xda, 0x41, 0x15, 0x58, 0x08, 0xc6, 0x76, 0xe7, 0xcc, 0xf3, 0xc7, 0x47, 0x76, 0xf9, - 0xb3, 0xe0, 0xb5, 0xc5, 0xc3, 0x94, 0x15, 0x95, 0x6a, 0x6a, 0xf7, 0x9c, 0x58, 0xcc, 0x94, 0xe8, - 0x7c, 0x23, 0x31, 0x18, 0xa6, 0x7d, 0xc7, 0x09, 0xd3, 0x12, 0x57, 0x94, 0x14, 0xb1, 0x7d, 0x11, - 0xb2, 0xf8, 0x1c, 0x61, 0xfd, 0xe1, 0x88, 0xac, 0x87, 0x7a, 0x82, 0x8b, 0x9c, 0xe2, 0x25, 0x98, - 0xef, 0x3f, 0x70, 0x70, 0x23, 0x76, 0x09, 0x2c, 0xce, 0xe8, 0xc0, 0x95, 0x3e, 0xed, 0x70, 0x36, - 0x81, 0x5a, 0xd9, 0x47, 0x43, 0x37, 0x81, 0x25, 0xd6, 0xac, 0xd5, 0xb7, 0x0d, 0xf3, 0x7d, 0x5f, - 0x23, 0x5f, 0x82, 0xc5, 0x08, 0xb2, 0xb1, 0x16, 0xf3, 0x6b, 0x0e, 0x36, 0x5c, 0x51, 0x8e, 0xd4, - 0xfe, 0xe5, 0xa9, 0x6f, 0xcb, 0xd5, 0x2d, 0xea, 0xf2, 0xdf, 0x0f, 0xaf, 0x3d, 0x7a, 0xc2, 0x57, - 0x65, 0xc1, 0x37, 0x61, 0x33, 0x61, 0x6a, 0x66, 0xce, 0xbf, 0xca, 0xc0, 0xe6, 0x13, 0xb9, 0xab, - 0x74, 0x9c, 0xe8, 0x31, 0x02, 0x82, 0x48, 0xde, 0x92, 0x76, 0xc8, 0x02, 0xa8, 0xd7, 0x7a, 0xe0, - 0x58, 0xed, 0x30, 0xfe, 0x23, 0x5c, 0x87, 0x97, 0x98, 0xf9, 0x3d, 0x8d, 0xc8, 0xfc, 0x3e, 0x1c, - 0x5d, 0xd6, 0xa4, 0x3c, 0xf0, 0x28, 0xe8, 0x60, 0x3e, 0x18, 0x9d, 0x6f, 0x82, 0x16, 0x5c, 0xd8, - 0x8a, 0x5f, 0x67, 0xaa, 0xf6, 0x77, 0x19, 0x10, 0x92, 0x56, 0xcf, 0x7c, 0x88, 0x08, 0xd3, 0x6d, - 0x4d, 0x3d, 0x51, 0xf4, 0x1e, 0xee, 0xb0, 0x94, 0xe3, 0xbd, 0x51, 0x36, 0x8f, 0x39, 0x90, 0x5d, - 0x7b, 0xac, 0xe8, 0xb2, 0x41, 0x05, 0x98, 0xec, 0x61, 0xc3, 0x90, 0x4f, 0x6d, 0xb1, 0xec, 0x4f, - 0xfe, 0xe7, 0x69, 0x98, 0x76, 0x86, 0x20, 0x35, 0xa4, 0xc1, 0xd4, 0x7d, 0xed, 0xbf, 0x8c, 0x00, - 0x2f, 0xaf, 0xcc, 0xa9, 0x97, 0x50, 0xe6, 0x8e, 0x4f, 0x99, 0xa9, 0x39, 0xec, 0xbd, 0x94, 0xd8, - 0x09, 0x7a, 0xfd, 0xda, 0x15, 0x50, 0xf8, 0x4d, 0x40, 0x35, 0xc5, 0x60, 0xa9, 0x9b, 0xe3, 0x96, - 0xac, 0x4c, 0x4d, 0x7e, 0x21, 0x61, 0xd5, 0xd4, 0x15, 0x16, 0xae, 0x67, 0x45, 0xe8, 0xc9, 0x2f, - 0x2a, 0xb4, 0xc5, 0x0a, 0xe9, 0x0d, 0x53, 0xd6, 0x4d, 0x45, 0x3d, 0x95, 0x4c, 0xed, 0x4b, 0xec, - 0xe0, 0xc0, 0x76, 0x6b, 0xcb, 0x6a, 0x14, 0xbe, 0x49, 0xc1, 0xa2, 0x8f, 0x3d, 0xd3, 0xc9, 0x8f, - 0x60, 0xd2, 0xe5, 0xed, 0x0b, 0xe3, 0x23, 0xa8, 0x8b, 0x74, 0xdb, 0xec, 0x11, 0xe8, 0x3a, 0x80, - 0x8a, 0x5f, 0x98, 0xbe, 0x79, 0xa7, 0xad, 0x16, 0x32, 0x27, 0xff, 0xfb, 0x9c, 0x93, 0xe9, 0x9b, - 0xb2, 0x39, 0x20, 0x59, 0x25, 0x73, 0xd1, 0xb8, 0x23, 0xb1, 0x3b, 0x86, 0xce, 0x3b, 0x2d, 0xe6, - 0x9d, 0x9e, 0x3a, 0xb9, 0x6d, 0x0c, 0xb4, 0xef, 0x40, 0xac, 0x6d, 0x4d, 0xed, 0x28, 0xa6, 0x0b, - 0xb1, 0x5e, 0x0d, 0x25, 0x08, 0xb4, 0xbb, 0x6c, 0xe5, 0x55, 0x36, 0xa8, 0xea, 0xb4, 0xf2, 0x5f, - 0x41, 0x96, 0x1e, 0xc7, 0x88, 0x60, 0x01, 0xfa, 0x04, 0x72, 0x06, 0x91, 0x38, 0x08, 0x8c, 0x44, - 0xed, 0x89, 0x77, 0x85, 0x22, 0x1b, 0x27, 0x7c, 0x0f, 0x78, 0xf7, 0x62, 0xda, 0xc7, 0xe6, 0xe8, - 0xd7, 0xef, 0x8e, 0xb5, 0x06, 0xe1, 0x4f, 0x53, 0xb0, 0x1a, 0xc9, 0x60, 0x3c, 0xd8, 0x03, 0x1d, - 0x04, 0x56, 0xf2, 0x4e, 0xf8, 0xc6, 0x0e, 0x31, 0x8f, 0x5c, 0x11, 0xff, 0x3b, 0x17, 0x3b, 0xcc, - 0xf2, 0xd8, 0x87, 0x19, 0x3a, 0x47, 0xba, 0x33, 0x3f, 0x4f, 0x01, 0xda, 0xc7, 0xa6, 0x93, 0x2a, - 0xb3, 0x2d, 0x8d, 0xf1, 0x37, 0xdc, 0x4b, 0xf8, 0x9b, 0x1f, 0xf8, 0xfc, 0x0d, 0xf5, 0x58, 0x77, - 0x3c, 0x45, 0x93, 0xc0, 0xd4, 0x89, 0xb7, 0x65, 0x4c, 0x7a, 0x4a, 0x63, 0xfe, 0xd1, 0xd2, 0xd3, - 0x0b, 0xba, 0x95, 0x7f, 0xe7, 0x60, 0xd1, 0x27, 0x34, 0xd3, 0xa0, 0x7b, 0x80, 0xe4, 0x33, 0x59, - 0xe9, 0xca, 0x96, 0x60, 0x76, 0xfa, 0xcf, 0xe0, 0x80, 0x05, 0xa7, 0xc7, 0x1e, 0x86, 0x1e, 0xc1, - 0x62, 0x4f, 0x7e, 0xa1, 0xf4, 0x06, 0x3d, 0x89, 0xed, 0xb3, 0xa1, 0xfc, 0xc8, 0x06, 0x0e, 0x57, - 0x43, 0x00, 0x7a, 0x55, 0x35, 0x3f, 0x78, 0x8f, 0x22, 0xe8, 0x0b, 0x6c, 0x1c, 0x53, 0x1e, 0xe5, - 0x47, 0x18, 0x1d, 0xc2, 0x62, 0x4f, 0x51, 0x43, 0xcc, 0xd2, 0x43, 0x99, 0x51, 0x03, 0x5f, 0x60, - 0x83, 0x5d, 0x8e, 0x82, 0xe0, 0x0d, 0x7a, 0xd9, 0x72, 0x83, 0x45, 0xa6, 0xae, 0x37, 0x58, 0x0c, - 0xd1, 0xb0, 0x6d, 0xd9, 0x8f, 0x2c, 0x34, 0xdd, 0x0c, 0x9b, 0x0d, 0xab, 0xba, 0xc4, 0xd6, 0x9c, - 0xfe, 0x27, 0xed, 0xb5, 0xe0, 0x10, 0x35, 0xfa, 0x08, 0xd2, 0x7a, 0xbf, 0xcd, 0xcc, 0xf7, 0xcd, - 0x11, 0xf8, 0x17, 0xc5, 0xc3, 0xdd, 0x83, 0x09, 0xd1, 0x1a, 0xc5, 0xff, 0x59, 0x1a, 0xd2, 0xe2, - 0xe1, 0x2e, 0xfa, 0xc4, 0x57, 0x62, 0xb9, 0x3b, 0x22, 0x17, 0x6f, 0x85, 0xe5, 0x9f, 0x52, 0x51, - 0x25, 0x96, 0x02, 0x2c, 0xed, 0x8a, 0x95, 0x52, 0xab, 0x22, 0xed, 0x55, 0x6a, 0x95, 0x56, 0x45, - 0xa2, 0x05, 0xa2, 0x3c, 0x87, 0xd6, 0xa0, 0x70, 0x78, 0x54, 0xae, 0x55, 0x9b, 0x07, 0xd2, 0x51, - 0xdd, 0xfe, 0x8b, 0xf5, 0xa6, 0x50, 0x1e, 0x66, 0x6b, 0xd5, 0x66, 0x8b, 0x35, 0x34, 0xf3, 0x69, - 0xab, 0x65, 0xbf, 0xd2, 0x92, 0x76, 0x4b, 0x87, 0xa5, 0xdd, 0x6a, 0xeb, 0x69, 0x3e, 0x83, 0x78, - 0x58, 0xf1, 0xf3, 0x6e, 0xd6, 0x4b, 0x87, 0xcd, 0x83, 0x46, 0x2b, 0x9f, 0x45, 0x08, 0xe6, 0xc9, - 0x78, 0xbb, 0xa9, 0x99, 0xcf, 0x59, 0x1c, 0x76, 0x6b, 0x8d, 0xba, 0x23, 0xc3, 0x24, 0x5a, 0x82, - 0xbc, 0x3d, 0xb3, 0x58, 0x29, 0xed, 0x11, 0x40, 0x6f, 0x0a, 0x2d, 0xc0, 0x5c, 0xe5, 0x87, 0x87, - 0xa5, 0xfa, 0x9e, 0x4d, 0x38, 0x8d, 0x36, 0x60, 0xcd, 0x2b, 0x8e, 0xc4, 0x46, 0x55, 0xf6, 0x08, - 0x28, 0xd7, 0xcc, 0x03, 0xba, 0x06, 0x79, 0x56, 0xfb, 0xda, 0x6d, 0xd4, 0xf7, 0xaa, 0xad, 0x6a, - 0xa3, 0x9e, 0x9f, 0xa1, 0x08, 0xde, 0x22, 0x80, 0x25, 0x39, 0x63, 0x36, 0x3b, 0x1c, 0xd6, 0x9b, - 0xa3, 0xb0, 0x9e, 0x8d, 0x58, 0xff, 0x3a, 0x05, 0xcb, 0x14, 0xb2, 0xb6, 0x01, 0x72, 0xdb, 0x57, - 0x6d, 0x41, 0x9e, 0xe2, 0x5d, 0x52, 0xf0, 0x16, 0x98, 0xa7, 0xed, 0x4f, 0xec, 0xbc, 0xc3, 0x2e, - 0x2f, 0xa5, 0x3c, 0xe5, 0xa5, 0x6a, 0x30, 0x0b, 0xbb, 0xe3, 0x2f, 0xc4, 0x04, 0x66, 0x4b, 0x4a, - 0xec, 0x1f, 0x47, 0xa4, 0x09, 0xf7, 0x92, 0xb9, 0x25, 0x85, 0x50, 0x17, 0xc9, 0xe2, 0x2f, 0xe8, - 0xe5, 0x1e, 0xc2, 0x4a, 0x50, 0x5e, 0x66, 0xd0, 0x77, 0x43, 0xe5, 0x12, 0xc7, 0xed, 0x3a, 0xb4, - 0x0e, 0x85, 0xf0, 0x93, 0x14, 0x4c, 0xd9, 0xcd, 0x56, 0x78, 0x63, 0xf9, 0x25, 0x1f, 0x52, 0x3a, - 0x6d, 0xb5, 0x38, 0xc0, 0xab, 0xb7, 0xd0, 0x91, 0x0a, 0x16, 0x3a, 0x22, 0xcf, 0x39, 0x1d, 0x79, - 0xce, 0xdf, 0x87, 0xb9, 0xb6, 0x25, 0xbe, 0xa2, 0xa9, 0x92, 0xa9, 0xf4, 0x6c, 0x20, 0x34, 0x5c, - 0x98, 0x6c, 0xd9, 0x6f, 0x0d, 0xc4, 0x59, 0x7b, 0x80, 0xd5, 0x84, 0x36, 0x60, 0x96, 0x14, 0x2a, - 0x25, 0x53, 0x93, 0x06, 0x06, 0x2e, 0x64, 0x09, 0x2c, 0x04, 0xa4, 0xad, 0xa5, 0x1d, 0x19, 0x18, - 0xdd, 0x87, 0x05, 0x02, 0xe2, 0x4b, 0x5e, 0x99, 0x73, 0x96, 0x34, 0x2c, 0x6a, 0x22, 0xbd, 0x4d, - 0x47, 0x7a, 0xe1, 0x6f, 0x39, 0x58, 0xa6, 0xf0, 0x58, 0x50, 0x7f, 0x87, 0x55, 0x78, 0xbc, 0x2a, - 0x1a, 0xb8, 0x3e, 0x23, 0x19, 0xbe, 0x2a, 0x74, 0xa0, 0x00, 0x2b, 0xc1, 0xf9, 0x18, 0x24, 0xf0, - 0x8b, 0x14, 0x2c, 0x59, 0xb1, 0x9c, 0xdd, 0x71, 0xd9, 0xe1, 0xf6, 0x18, 0x47, 0x1f, 0xd8, 0xcc, - 0x4c, 0x68, 0x33, 0x0f, 0x82, 0x09, 0xf7, 0x5b, 0xde, 0x68, 0x34, 0xb8, 0x82, 0x57, 0xb5, 0x97, - 0x3f, 0xe3, 0x60, 0x39, 0x30, 0x1f, 0x33, 0xb0, 0x8f, 0x83, 0x19, 0xc4, 0xcd, 0x18, 0xf9, 0x5e, - 0x2a, 0x87, 0x78, 0xdf, 0x8e, 0xdd, 0xc7, 0xb3, 0xe3, 0x7f, 0x4e, 0xc1, 0x75, 0xf7, 0x16, 0x24, - 0x6f, 0x0b, 0x3a, 0x63, 0x40, 0x60, 0x17, 0x2b, 0xe1, 0x7f, 0x1a, 0xf4, 0xd0, 0xdb, 0xe1, 0x8b, - 0x39, 0x42, 0xa4, 0x24, 0x4f, 0x1d, 0x89, 0x1c, 0x67, 0xc6, 0x45, 0x8e, 0x2f, 0xa4, 0x01, 0xbf, - 0xed, 0x05, 0xc5, 0xfd, 0xe2, 0x33, 0x4d, 0x18, 0xb1, 0xba, 0xf4, 0x01, 0x5c, 0x25, 0xe9, 0x82, - 0xf3, 0x70, 0xc6, 0x2e, 0xd8, 0x53, 0x1f, 0x3a, 0x25, 0x2e, 0x5b, 0xdd, 0xce, 0x7b, 0x10, 0x56, - 0x51, 0xe9, 0x08, 0xdf, 0x66, 0x60, 0xc5, 0x4a, 0x27, 0x9a, 0xa6, 0x7c, 0x3a, 0x4e, 0xad, 0xe1, - 0x37, 0xc2, 0xd0, 0x6d, 0xca, 0x7f, 0x2c, 0xd1, 0x5c, 0x47, 0x41, 0x6c, 0x51, 0x11, 0x16, 0x0d, - 0x53, 0x3e, 0x25, 0xee, 0x40, 0xd6, 0x4f, 0xb1, 0x29, 0xf5, 0x65, 0xf3, 0x39, 0xb3, 0xf5, 0x05, - 0xd6, 0xd5, 0x22, 0x3d, 0x87, 0xb2, 0xf9, 0xfc, 0x92, 0x0e, 0x12, 0xfd, 0x20, 0xe8, 0x14, 0xde, - 0x1e, 0xb2, 0x96, 0x04, 0xdd, 0xfa, 0x61, 0x0c, 0xbc, 0xff, 0xee, 0x10, 0x96, 0xc3, 0x61, 0xfd, - 0x8b, 0xc3, 0xd9, 0xaf, 0xb9, 0x32, 0x70, 0x0d, 0xae, 0x86, 0x16, 0xcf, 0xae, 0x90, 0x53, 0x28, - 0x58, 0x5d, 0x47, 0xaa, 0x31, 0xa6, 0x3a, 0xc6, 0x68, 0x4c, 0x2a, 0x46, 0x63, 0x84, 0x55, 0xb8, - 0x16, 0x31, 0x11, 0x93, 0xe2, 0x97, 0x59, 0x2a, 0xc6, 0xf8, 0x45, 0xaa, 0xcf, 0xe3, 0xac, 0xe2, - 0x3d, 0xef, 0xb1, 0x47, 0xd6, 0x73, 0x5e, 0x85, 0x5d, 0xdc, 0x80, 0x19, 0x2f, 0x1d, 0xbb, 0x06, - 0xcd, 0x21, 0x86, 0x93, 0xbd, 0x50, 0xed, 0x2c, 0x17, 0xa8, 0x9d, 0xd5, 0x5c, 0xa3, 0x9a, 0xf4, - 0xc7, 0xc2, 0xb1, 0x5b, 0x91, 0x60, 0x56, 0xcf, 0x42, 0x66, 0x35, 0xe5, 0x2f, 0xc8, 0xc5, 0x32, - 0xfd, 0x7f, 0x60, 0x58, 0x4c, 0xa9, 0x23, 0x2b, 0x65, 0xc2, 0x33, 0xe0, 0xa9, 0xc6, 0x8f, 0x5f, - 0xbb, 0x0a, 0xa8, 0x51, 0x2a, 0xa8, 0x46, 0xc2, 0x75, 0x58, 0x8d, 0xe4, 0xcd, 0xa6, 0xfe, 0x03, - 0x8e, 0x0a, 0xe6, 0x80, 0x62, 0x4d, 0x53, 0x36, 0x8d, 0x51, 0xa7, 0x66, 0x9d, 0xde, 0xa9, 0x69, - 0x13, 0xd1, 0xe0, 0x31, 0x4d, 0x42, 0xf8, 0x23, 0x8e, 0xee, 0x43, 0x50, 0x16, 0x76, 0xdb, 0xbe, - 0x05, 0xd9, 0x01, 0xc1, 0xfd, 0x69, 0xd4, 0xb5, 0xe8, 0x37, 0x82, 0x23, 0xab, 0x4b, 0xa4, 0x14, - 0x97, 0x86, 0xa4, 0x0a, 0xbf, 0xe0, 0x60, 0xc6, 0xc3, 0x1f, 0xad, 0xc1, 0xb4, 0x03, 0x15, 0xd9, - 0x09, 0x92, 0xd3, 0x60, 0x1d, 0xbf, 0xa9, 0x99, 0x72, 0x97, 0xbd, 0x49, 0xa1, 0x1f, 0x56, 0x4e, - 0x3b, 0x30, 0x30, 0x0d, 0x87, 0xd3, 0x22, 0xf9, 0x1b, 0xdd, 0x85, 0xcc, 0x40, 0x55, 0x4c, 0x62, - 0xf6, 0xf3, 0x41, 0x7b, 0x26, 0x53, 0x15, 0x8f, 0x54, 0xc5, 0x14, 0x09, 0x95, 0x70, 0x07, 0x32, - 0xd6, 0x97, 0x1f, 0xb2, 0x98, 0x86, 0x6c, 0xf9, 0x69, 0xab, 0xd2, 0xcc, 0x73, 0x08, 0x20, 0x57, - 0xa5, 0x09, 0x7e, 0x4a, 0xa8, 0xd9, 0xef, 0x52, 0x9d, 0x45, 0x58, 0x2e, 0x40, 0x3e, 0x56, 0x35, - 0xbd, 0x27, 0x77, 0x89, 0xcc, 0x53, 0xa2, 0xf3, 0x1d, 0x5f, 0x4e, 0xa1, 0xe0, 0xe3, 0x9a, 0x73, - 0x22, 0x51, 0x00, 0xd3, 0x17, 0x54, 0xb7, 0xe2, 0xa0, 0xa5, 0x52, 0x24, 0xb4, 0x74, 0xdd, 0x77, - 0xcb, 0x0e, 0x01, 0x95, 0xfe, 0x3e, 0x05, 0xcb, 0x91, 0x74, 0xe8, 0x7d, 0x2f, 0x9c, 0xb4, 0x99, - 0xc8, 0xd3, 0x0b, 0x24, 0x7d, 0xcb, 0x51, 0x20, 0x69, 0xc7, 0x07, 0x24, 0xdd, 0x1e, 0x3a, 0xde, - 0x0b, 0x21, 0xfd, 0x8c, 0x8b, 0x81, 0x90, 0x9a, 0xad, 0xd2, 0x7e, 0x45, 0x3a, 0xaa, 0xd3, 0x7f, - 0x1d, 0x08, 0x69, 0x09, 0xf2, 0x2e, 0xb0, 0x22, 0x35, 0x5b, 0x25, 0xf2, 0xbe, 0x38, 0x04, 0xdf, - 0xa4, 0x23, 0xc1, 0x99, 0xcc, 0x70, 0x1c, 0x26, 0x4b, 0x49, 0x56, 0x00, 0xb1, 0xd1, 0x8f, 0x1b, - 0x47, 0xf5, 0x96, 0x44, 0x5e, 0x2f, 0xe7, 0x73, 0x0e, 0x3e, 0xb3, 0x04, 0x88, 0x9d, 0x96, 0xf7, - 0x11, 0xfe, 0x5f, 0x70, 0xb0, 0xe8, 0x6b, 0x66, 0x87, 0xe7, 0x29, 0x8a, 0x73, 0xbe, 0xa2, 0xf8, - 0x7d, 0x58, 0xb2, 0x32, 0x46, 0x6a, 0x29, 0x86, 0xd4, 0xc7, 0x3a, 0x01, 0xc3, 0x99, 0xce, 0x2f, - 0xf4, 0xe4, 0x17, 0xac, 0x60, 0x70, 0x88, 0x75, 0x8b, 0xf1, 0x25, 0x40, 0xc2, 0xc2, 0xd7, 0x69, - 0x1a, 0x97, 0x8c, 0x9d, 0xd7, 0x0c, 0xf5, 0x51, 0xe1, 0xc4, 0x27, 0x3d, 0x46, 0xe2, 0x13, 0xe3, - 0xe1, 0x32, 0x63, 0x05, 0xc3, 0xe3, 0xdf, 0xe9, 0x75, 0xf7, 0xde, 0xa6, 0x91, 0xeb, 0x5d, 0xaf, - 0xfe, 0x0e, 0xcd, 0xb4, 0x72, 0x5f, 0x97, 0xb9, 0x9f, 0x5e, 0x56, 0x9e, 0x5c, 0xa2, 0xf1, 0xd8, - 0x05, 0xf2, 0x23, 0xe1, 0x4d, 0xb8, 0x45, 0x9e, 0x55, 0x0e, 0x05, 0xb4, 0xcf, 0xe0, 0xf6, 0x30, - 0x42, 0x36, 0x73, 0x2d, 0xd2, 0xf5, 0x38, 0x65, 0xad, 0x00, 0x97, 0x61, 0x5e, 0xe8, 0xc7, 0x29, - 0xd8, 0x18, 0x36, 0x04, 0x7d, 0xe2, 0x75, 0x48, 0x77, 0x47, 0x9d, 0xc9, 0xeb, 0x9b, 0xfe, 0x84, - 0xf9, 0xa6, 0x8a, 0xcf, 0x37, 0xbd, 0x3b, 0x0e, 0x2b, 0xaf, 0x9b, 0xaa, 0x44, 0x79, 0xa9, 0x77, - 0xe0, 0x4d, 0x3f, 0x18, 0xed, 0xf1, 0x4c, 0xf4, 0xe7, 0x0e, 0x0e, 0x3a, 0xcd, 0xf9, 0xe1, 0xdd, - 0x3f, 0x4e, 0xc3, 0x86, 0xf7, 0x45, 0xf2, 0xbe, 0x17, 0x3e, 0x4b, 0xfa, 0x79, 0xc0, 0x1d, 0x58, - 0x08, 0x42, 0x43, 0xf6, 0x0b, 0xdc, 0x2b, 0x7e, 0x6c, 0xc8, 0x48, 0x7a, 0x71, 0x33, 0x64, 0xea, - 0xe4, 0x84, 0x2f, 0x0c, 0xfb, 0x7e, 0x77, 0x64, 0xc6, 0xff, 0x37, 0x11, 0x60, 0x7a, 0x3f, 0x77, - 0x61, 0x33, 0x41, 0x7e, 0x66, 0x0c, 0x65, 0x98, 0xf7, 0x23, 0xa1, 0x4c, 0x49, 0x03, 0xcf, 0x4e, - 0xfd, 0x83, 0xe7, 0x7c, 0xf0, 0x28, 0x9d, 0xed, 0x5f, 0x39, 0xfb, 0x85, 0xbe, 0x8f, 0xd6, 0x3a, - 0xe1, 0x30, 0xd4, 0x4a, 0x17, 0x11, 0x44, 0x59, 0x51, 0x11, 0xa6, 0x6d, 0x2a, 0x23, 0xf8, 0xe6, - 0xd3, 0x99, 0xdc, 0x25, 0x09, 0x23, 0xc5, 0xe9, 0x0b, 0x22, 0xc5, 0x99, 0x20, 0x52, 0x4c, 0xd7, - 0xf6, 0x93, 0x14, 0x6c, 0x78, 0x1f, 0x47, 0x46, 0xaa, 0xf7, 0x38, 0x0b, 0xdd, 0x84, 0x59, 0x0f, - 0x95, 0xad, 0xf1, 0x33, 0x2e, 0xd0, 0x99, 0xa4, 0xed, 0xc3, 0x24, 0x79, 0x45, 0xa8, 0x27, 0xdd, - 0x8a, 0x9b, 0xb0, 0x99, 0x30, 0xbf, 0xfd, 0xc8, 0x8c, 0x23, 0x3f, 0x61, 0xbb, 0xa4, 0xcd, 0xfa, - 0x34, 0x08, 0xa0, 0x6f, 0x7b, 0xea, 0xcf, 0xaf, 0x69, 0x1b, 0x14, 0x58, 0x8f, 0x9b, 0xfc, 0x92, - 0x0d, 0x6b, 0xfb, 0xbf, 0x39, 0x98, 0xaa, 0x76, 0xb0, 0x6a, 0xd2, 0xdb, 0x7d, 0xce, 0xf7, 0x4b, - 0x45, 0xb4, 0x16, 0xf3, 0x03, 0x46, 0xb2, 0x05, 0xfc, 0xf5, 0xc4, 0x9f, 0x37, 0x0a, 0x13, 0xe8, - 0xc4, 0xf3, 0x2b, 0x4b, 0x5f, 0xdd, 0xff, 0x8d, 0xd0, 0xc8, 0x88, 0x4b, 0x97, 0xbf, 0x35, 0x84, - 0xca, 0x99, 0xe7, 0x03, 0xc8, 0x92, 0x5f, 0x9d, 0xa1, 0x25, 0xe7, 0x97, 0x6f, 0x9e, 0x1f, 0xa5, - 0xf1, 0xcb, 0x81, 0x56, 0x7b, 0xdc, 0xf6, 0x3f, 0x4e, 0x03, 0xb8, 0xd7, 0x1a, 0x7a, 0x04, 0xb3, - 0x5e, 0x97, 0x86, 0x56, 0x13, 0x7e, 0x76, 0xc5, 0xaf, 0x45, 0x77, 0x3a, 0x32, 0x3d, 0x82, 0x59, - 0xaf, 0x2a, 0xbb, 0xcc, 0x22, 0x5e, 0x5d, 0xbb, 0xcc, 0x22, 0x1f, 0x49, 0x4f, 0xa0, 0x2e, 0x5c, - 0x8d, 0x79, 0xf3, 0x8a, 0x6e, 0x8f, 0xf6, 0x32, 0x98, 0x7f, 0x73, 0xc4, 0xc7, 0xb3, 0xc2, 0x04, - 0xd2, 0xe1, 0x5a, 0xec, 0x53, 0x4f, 0xb4, 0x35, 0xea, 0x43, 0x54, 0xfe, 0xad, 0x11, 0x28, 0x9d, - 0x39, 0x07, 0xc0, 0xc7, 0xbf, 0x2f, 0x43, 0x6f, 0x8d, 0xfc, 0xf0, 0x91, 0xbf, 0x33, 0xfa, 0x73, - 0x35, 0x61, 0x02, 0x1d, 0xc0, 0x8c, 0xe7, 0xa1, 0x11, 0xe2, 0x23, 0x5f, 0x1f, 0x51, 0xc6, 0xab, - 0x09, 0x2f, 0x93, 0x28, 0x27, 0xcf, 0xdb, 0x0f, 0x97, 0x53, 0xf8, 0x15, 0x8b, 0xcb, 0x29, 0xe2, - 0xb1, 0x48, 0x70, 0xfb, 0x03, 0x61, 0x66, 0xd4, 0xf6, 0x47, 0x87, 0xac, 0x51, 0xdb, 0x1f, 0x13, - 0xb3, 0x0a, 0x13, 0xe8, 0x53, 0x98, 0xf7, 0x17, 0x75, 0xd1, 0xf5, 0xc4, 0xe2, 0x34, 0xbf, 0x1e, - 0xd7, 0xed, 0x65, 0xe9, 0x2f, 0x09, 0xba, 0x2c, 0x23, 0x4b, 0x93, 0x2e, 0xcb, 0x98, 0x4a, 0xe2, - 0x84, 0xe5, 0x9f, 0x7c, 0x85, 0x2e, 0xd7, 0x3f, 0x45, 0xd5, 0xe7, 0x5c, 0xff, 0x14, 0x59, 0x1d, - 0x13, 0x26, 0x90, 0x02, 0x2b, 0xd1, 0x75, 0x16, 0x74, 0x6b, 0xa4, 0x32, 0x12, 0x7f, 0x7b, 0x18, - 0x99, 0x33, 0x55, 0x1b, 0x16, 0x23, 0xde, 0x81, 0x21, 0x21, 0xf1, 0x91, 0x18, 0x9d, 0xe4, 0xe6, - 0x08, 0x0f, 0xc9, 0x04, 0xe2, 0xcc, 0xff, 0x2b, 0x0d, 0x57, 0x02, 0xb1, 0x3a, 0xfa, 0x5d, 0x0e, - 0xd6, 0x93, 0x53, 0x17, 0x74, 0x2f, 0x26, 0xce, 0x8f, 0x51, 0xac, 0xe2, 0xa8, 0xe4, 0x1e, 0xe3, - 0xbe, 0x16, 0x1b, 0x2b, 0xa2, 0xad, 0x51, 0xc3, 0x61, 0x8f, 0x46, 0x0f, 0x0b, 0x3c, 0xc9, 0x76, - 0x58, 0xd3, 0xc6, 0x46, 0x13, 0x68, 0x6b, 0xd4, 0x80, 0xc7, 0x9d, 0x76, 0x78, 0x68, 0x42, 0xa6, - 0xed, 0xc2, 0x4a, 0xf4, 0xed, 0x8d, 0x6e, 0x8d, 0x14, 0x5a, 0xb8, 0x5a, 0x95, 0x1c, 0x04, 0x90, - 0xd9, 0x48, 0xa6, 0xb4, 0xfd, 0x6f, 0x59, 0xc8, 0x10, 0xc4, 0xa3, 0x05, 0x57, 0x02, 0x55, 0x14, - 0xb4, 0x9e, 0x5c, 0x5b, 0xe2, 0x6f, 0xc4, 0xf6, 0x3b, 0xe7, 0xf7, 0x0c, 0x16, 0x42, 0x75, 0x11, - 0xb4, 0xe1, 0x1d, 0x17, 0x55, 0x9b, 0xe1, 0x37, 0x13, 0x28, 0x82, 0xbc, 0xfd, 0x97, 0xda, 0xc6, - 0x30, 0xe0, 0xde, 0xcf, 0x3b, 0xee, 0x22, 0xfb, 0x82, 0x02, 0x4c, 0xc1, 0x2b, 0x4c, 0xf0, 0xcb, - 0x15, 0x79, 0x79, 0xdd, 0x4c, 0xa4, 0x71, 0x66, 0xf8, 0xdc, 0x41, 0xb6, 0x3c, 0xb8, 0x31, 0xf2, - 0x09, 0x17, 0x89, 0x6f, 0xf3, 0x42, 0x12, 0x89, 0xc3, 0xfe, 0x33, 0xc8, 0x07, 0x21, 0x0e, 0x74, - 0x63, 0x08, 0xe2, 0xc2, 0x6f, 0xc4, 0x13, 0x04, 0x77, 0x26, 0xe8, 0x09, 0x82, 0x52, 0x45, 0x99, - 0xff, 0xcd, 0x44, 0x1a, 0xef, 0x7d, 0xe8, 0x01, 0xf7, 0xdc, 0xfb, 0x30, 0x0c, 0x04, 0xba, 0xf7, - 0x61, 0x04, 0x1a, 0x28, 0x4c, 0xec, 0x3c, 0x00, 0x90, 0xbb, 0xfd, 0xe7, 0xb2, 0x84, 0xd5, 0x41, - 0x0f, 0xad, 0x85, 0xd2, 0xaf, 0x8a, 0x3a, 0xe8, 0x35, 0xfa, 0x56, 0xd6, 0x65, 0x14, 0xfe, 0x6a, - 0x8a, 0xe4, 0x58, 0xd3, 0x64, 0x80, 0xd5, 0xb1, 0x53, 0x83, 0xbc, 0x3b, 0x5a, 0x22, 0x81, 0x36, - 0xda, 0x8c, 0xe4, 0x41, 0x9e, 0x3d, 0x06, 0x18, 0xcd, 0x3b, 0x8c, 0x48, 0xef, 0xce, 0xc7, 0x00, - 0x6d, 0x43, 0x91, 0x68, 0xa4, 0x8f, 0xae, 0x87, 0xf8, 0x3c, 0x54, 0x70, 0xb7, 0x63, 0xf3, 0xf8, - 0x4b, 0x26, 0x4c, 0xdb, 0x50, 0x68, 0x3e, 0xb0, 0xf3, 0x7d, 0x98, 0xa1, 0xc2, 0x9c, 0x58, 0x74, - 0xc3, 0xc6, 0x33, 0x19, 0xe8, 0xea, 0x49, 0xcf, 0x4e, 0x05, 0xe6, 0x28, 0x03, 0x86, 0x95, 0xa3, - 0x1b, 0x21, 0x16, 0x8f, 0x69, 0x4f, 0x80, 0xc9, 0x2c, 0x19, 0xc6, 0xfa, 0x76, 0xca, 0x30, 0x6b, - 0xb3, 0x31, 0x9f, 0x6b, 0x1d, 0xb4, 0x1e, 0xc1, 0xc5, 0xea, 0x08, 0x30, 0x99, 0x61, 0x4c, 0xac, - 0x2e, 0x57, 0x14, 0xfb, 0xff, 0xe9, 0x08, 0x8b, 0xc2, 0x80, 0xa2, 0x48, 0x51, 0x58, 0x5f, 0x39, - 0xfb, 0x2c, 0xdd, 0x36, 0x94, 0xe3, 0x1c, 0x19, 0xf4, 0x9d, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, - 0x68, 0xb4, 0x34, 0x85, 0x54, 0x46, 0x00, 0x00, + 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xa3, 0x24, 0x53, 0xa5, 0x1f, 0xd3, 0x2d, 0x59, 0x96, 0xda, 0xe3, + 0x19, 0x8d, 0xc7, 0xa6, 0x67, 0xbc, 0x33, 0x83, 0x1d, 0x8d, 0x67, 0x77, 0x48, 0x89, 0x96, 0xb8, + 0xa6, 0x49, 0x6d, 0x93, 0xf2, 0xac, 0x9d, 0x0c, 0x7a, 0x5a, 0x64, 0x49, 0x6e, 0x0c, 0xd9, 0xcd, + 0xe9, 0x6e, 0x2a, 0xd6, 0x5e, 0x92, 0x4c, 0x10, 0x60, 0x83, 0x5c, 0x82, 0xe4, 0x90, 0xc9, 0x29, + 0x8b, 0x24, 0xc7, 0x5d, 0xec, 0x21, 0x58, 0xe4, 0x18, 0x20, 0xb7, 0x04, 0x08, 0x92, 0x63, 0x92, + 0xcb, 0x1e, 0x02, 0xe4, 0xb0, 0xd8, 0x00, 0x73, 0xca, 0x21, 0x87, 0x20, 0xe8, 0xaa, 0xea, 0xff, + 0x1f, 0x92, 0x96, 0x9c, 0x09, 0xb0, 0x27, 0xab, 0xab, 0x5e, 0xbd, 0x7a, 0x55, 0xf5, 0xde, 0xab, + 0xf7, 0xbe, 0x57, 0x34, 0xbc, 0x77, 0xaa, 0x98, 0xcf, 0x87, 0xc7, 0xa5, 0x8e, 0xd6, 0xbf, 0xd7, + 0xd1, 0x54, 0x53, 0x56, 0x54, 0xac, 0xdf, 0x35, 0x4c, 0x4d, 0x97, 0x4f, 0xf1, 0x5d, 0x45, 0x35, + 0xb1, 0x7e, 0x22, 0x77, 0xf0, 0x3d, 0x63, 0x80, 0x3b, 0xf7, 0x3a, 0x86, 0x52, 0x1a, 0xe8, 0x9a, + 0xa9, 0xa1, 0x9c, 0xf5, 0xe7, 0xd9, 0x3b, 0xfc, 0xe6, 0xa9, 0xa6, 0x9d, 0xf6, 0xf0, 0x3d, 0xd2, + 0x7a, 0x3c, 0x3c, 0xb9, 0xd7, 0xc5, 0x46, 0x47, 0x57, 0x06, 0xa6, 0xa6, 0x53, 0x4a, 0xfe, 0x46, + 0x90, 0xc2, 0x54, 0xfa, 0xd8, 0x30, 0xe5, 0xfe, 0x80, 0x11, 0x6c, 0x04, 0x09, 0x7e, 0x4b, 0x97, + 0x07, 0x03, 0xac, 0x1b, 0xb4, 0x5f, 0x58, 0x85, 0xe5, 0x7d, 0x6c, 0x1e, 0xf6, 0x86, 0xa7, 0x8a, + 0x5a, 0x53, 0x4f, 0x34, 0x11, 0x7f, 0x31, 0xc4, 0x86, 0x29, 0xfc, 0x0b, 0x07, 0x2b, 0x81, 0x0e, + 0x63, 0xa0, 0xa9, 0x06, 0x46, 0x08, 0x32, 0xaa, 0xdc, 0xc7, 0x45, 0x6e, 0x93, 0xdb, 0x9e, 0x15, + 0xc9, 0xdf, 0xe8, 0x16, 0x2c, 0x9c, 0x61, 0xb5, 0xab, 0xe9, 0xd2, 0x19, 0xd6, 0x0d, 0x45, 0x53, + 0x8b, 0x29, 0xd2, 0x3b, 0x4f, 0x5b, 0x9f, 0xd0, 0x46, 0xb4, 0x0f, 0x33, 0x7d, 0x59, 0x55, 0x4e, + 0xb0, 0x61, 0x16, 0xd3, 0x9b, 0xe9, 0xed, 0xfc, 0xfd, 0xb7, 0x4a, 0x74, 0xa9, 0xa5, 0xc8, 0xb9, + 0x4a, 0x8f, 0x19, 0x75, 0x55, 0x35, 0xf5, 0x73, 0xd1, 0x19, 0xcc, 0x7f, 0x08, 0xf3, 0xbe, 0x2e, + 0x54, 0x80, 0xf4, 0xe7, 0xf8, 0x9c, 0xc9, 0x64, 0xfd, 0x89, 0x96, 0x21, 0x7b, 0x26, 0xf7, 0x86, + 0x98, 0x49, 0x42, 0x3f, 0x76, 0x52, 0xdf, 0xe6, 0x84, 0x0d, 0x58, 0x77, 0x66, 0xdb, 0x95, 0x07, + 0xf2, 0xb1, 0xd2, 0x53, 0x4c, 0x05, 0x1b, 0xf6, 0xd2, 0x3f, 0x85, 0xeb, 0x31, 0xfd, 0x6c, 0x07, + 0x1e, 0xc0, 0x5c, 0xc7, 0xd3, 0x5e, 0xe4, 0xc8, 0x52, 0x8a, 0xf6, 0x52, 0x02, 0x23, 0xcf, 0x45, + 0x1f, 0xb5, 0xf0, 0xab, 0x34, 0x14, 0x82, 0x24, 0xe8, 0x01, 0x4c, 0x1b, 0x58, 0x3f, 0x53, 0x3a, + 0x74, 0x5f, 0xf3, 0xf7, 0x37, 0xe3, 0xb8, 0x95, 0x5a, 0x94, 0xee, 0x60, 0x4a, 0xb4, 0x87, 0xa0, + 0x23, 0x28, 0x9c, 0x69, 0xbd, 0x61, 0x1f, 0x4b, 0xf8, 0xc5, 0x40, 0x56, 0x9d, 0x03, 0xc8, 0xdf, + 0xdf, 0x8e, 0x65, 0xf3, 0x84, 0x0c, 0xa8, 0xda, 0xf4, 0x07, 0x53, 0xe2, 0x95, 0x33, 0x7f, 0x13, + 0xff, 0x73, 0x0e, 0xa6, 0xd9, 0x6c, 0xe8, 0x03, 0xc8, 0x98, 0xe7, 0x03, 0x2a, 0xdd, 0xc2, 0xfd, + 0x5b, 0xa3, 0xa4, 0x2b, 0xb5, 0xcf, 0x07, 0x58, 0x24, 0x43, 0x04, 0x0d, 0x32, 0xd6, 0x17, 0xca, + 0xc3, 0xf4, 0x51, 0xe3, 0x51, 0xa3, 0xf9, 0x49, 0xa3, 0x30, 0x85, 0x56, 0x01, 0xed, 0x36, 0x1b, + 0x6d, 0xb1, 0x59, 0xaf, 0x57, 0x45, 0xa9, 0x55, 0x15, 0x9f, 0xd4, 0x76, 0xab, 0x05, 0x0e, 0xbd, + 0x06, 0x9b, 0x4f, 0x9a, 0xf5, 0xa3, 0xc7, 0x55, 0xa9, 0xbc, 0xbb, 0x5b, 0x6d, 0xb5, 0x6a, 0x95, + 0x5a, 0xbd, 0xd6, 0x7e, 0x2a, 0xed, 0x36, 0x1b, 0xad, 0xb6, 0x58, 0xae, 0x35, 0xda, 0xad, 0x42, + 0x0a, 0xad, 0x43, 0x71, 0x5f, 0x6c, 0x1e, 0x1d, 0x4a, 0x11, 0x3c, 0xd2, 0xfc, 0x97, 0x1c, 0x5c, + 0x09, 0x2c, 0x0f, 0x95, 0x7d, 0xf2, 0xdf, 0x1d, 0x77, 0x5b, 0xbc, 0xeb, 0xb8, 0x13, 0xb5, 0x0e, + 0x80, 0x5c, 0xb3, 0x51, 0xaf, 0x35, 0x2c, 0xd9, 0xf3, 0x30, 0xdd, 0x7c, 0xf8, 0x90, 0x7c, 0xa4, + 0x2a, 0x39, 0x3a, 0xa1, 0xb0, 0x00, 0x73, 0x87, 0xba, 0x76, 0x8c, 0x6d, 0xed, 0x2a, 0xc3, 0x3c, + 0xfb, 0x66, 0xda, 0xf4, 0x36, 0x64, 0x75, 0x2c, 0x77, 0xcf, 0xd9, 0xc1, 0xf3, 0x25, 0x6a, 0xb1, + 0x25, 0xdb, 0x62, 0x4b, 0x15, 0x4d, 0xeb, 0x3d, 0xb1, 0xb4, 0x57, 0xa4, 0x84, 0xc2, 0xd7, 0x19, + 0x58, 0xda, 0xd5, 0xb1, 0x6c, 0x62, 0x2a, 0x2d, 0x63, 0x1d, 0x69, 0x99, 0x0f, 0x60, 0xc1, 0xd2, + 0xbe, 0x8e, 0x62, 0x9e, 0x4b, 0xba, 0xac, 0x9e, 0x62, 0xa6, 0x18, 0x2b, 0xf6, 0x0e, 0xec, 0xb2, + 0x5e, 0xd1, 0xea, 0x14, 0xe7, 0x3b, 0xde, 0x4f, 0x54, 0x83, 0x25, 0xa6, 0x58, 0x3e, 0x85, 0x4f, + 0xfb, 0x15, 0x9e, 0x4a, 0xe1, 0x51, 0x78, 0x74, 0xe6, 0x6f, 0x51, 0xb0, 0x81, 0x1e, 0x01, 0x0c, + 0x64, 0x5d, 0xee, 0x63, 0x13, 0xeb, 0x46, 0x31, 0xe3, 0xb7, 0xfe, 0x88, 0xd5, 0x94, 0x0e, 0x1d, + 0x6a, 0x6a, 0xfd, 0x9e, 0xe1, 0x68, 0xdf, 0x32, 0x97, 0x8e, 0x8e, 0x4d, 0xa3, 0x98, 0x25, 0x9c, + 0xb6, 0x93, 0x38, 0xb5, 0x28, 0x29, 0x61, 0x53, 0x49, 0x7f, 0x55, 0xe1, 0x44, 0x7b, 0x34, 0x6a, + 0xc2, 0x8a, 0xbd, 0x40, 0x4d, 0x35, 0xb1, 0x6a, 0x4a, 0x86, 0x36, 0xd4, 0x3b, 0xb8, 0x98, 0x23, + 0xbb, 0xb4, 0x16, 0x58, 0x22, 0xa5, 0x69, 0x11, 0x12, 0x91, 0x6d, 0x8d, 0xaf, 0x11, 0x3d, 0x03, + 0x5e, 0xee, 0x74, 0xb0, 0x61, 0x28, 0x74, 0x2f, 0x24, 0x1d, 0x7f, 0x31, 0x54, 0x74, 0xdc, 0xc7, + 0xaa, 0x69, 0x14, 0xa7, 0xfd, 0x5c, 0xdb, 0xda, 0x40, 0xeb, 0x69, 0xa7, 0xe7, 0xa2, 0x4b, 0x23, + 0x5e, 0xf3, 0x0d, 0xf7, 0xf4, 0x18, 0xfc, 0x47, 0x70, 0x25, 0xb0, 0x29, 0x93, 0xf8, 0x3d, 0x7e, + 0x07, 0xe6, 0xbc, 0x3b, 0x31, 0x91, 0xcf, 0xfc, 0xc3, 0x14, 0x2c, 0x45, 0xec, 0x01, 0x3a, 0x80, + 0x19, 0x43, 0x95, 0x07, 0xc6, 0x73, 0xcd, 0x64, 0xfa, 0x7b, 0x3b, 0x61, 0xcb, 0x4a, 0x2d, 0x46, + 0x4b, 0x3f, 0x0f, 0xa6, 0x44, 0x67, 0x34, 0xaa, 0x40, 0x8e, 0xee, 0x67, 0xd0, 0x73, 0x45, 0xf1, + 0xa1, 0x6d, 0x0e, 0x17, 0x36, 0x92, 0x7f, 0x07, 0x16, 0xfc, 0x33, 0xa0, 0x1b, 0x90, 0xb7, 0x67, + 0x90, 0x94, 0x2e, 0x5b, 0x2b, 0xd8, 0x4d, 0xb5, 0x2e, 0xff, 0x16, 0xcc, 0x79, 0x99, 0xa1, 0x35, + 0x98, 0x65, 0x0a, 0xe1, 0x90, 0xcf, 0xd0, 0x86, 0x5a, 0xd7, 0xb1, 0xe9, 0xef, 0xc0, 0xb2, 0x5f, + 0xcf, 0x98, 0x29, 0xbf, 0xee, 0xac, 0x81, 0xee, 0xc5, 0x82, 0x7f, 0x0d, 0xb6, 0x9c, 0xc2, 0x9f, + 0x67, 0xa1, 0x10, 0x34, 0x1a, 0xf4, 0x00, 0xb2, 0xc7, 0x3d, 0xad, 0xf3, 0x39, 0x1b, 0xfb, 0x5a, + 0x9c, 0x75, 0x95, 0x2a, 0x16, 0x15, 0x6d, 0x3d, 0x98, 0x12, 0xe9, 0x20, 0x6b, 0x74, 0x5f, 0x1b, + 0xaa, 0x26, 0xdb, 0xbd, 0xf8, 0xd1, 0x8f, 0x2d, 0x2a, 0x77, 0x34, 0x19, 0x84, 0xf6, 0x20, 0x4f, + 0xd5, 0x4e, 0xea, 0x6b, 0x5d, 0x5c, 0x4c, 0x13, 0x1e, 0x37, 0x63, 0x79, 0x94, 0x09, 0xed, 0x63, + 0xad, 0x8b, 0x45, 0x90, 0x9d, 0xbf, 0xf9, 0x79, 0xc8, 0x7b, 0x64, 0xe3, 0x87, 0x90, 0xf7, 0x4c, + 0x86, 0xae, 0xc2, 0xf4, 0x89, 0x21, 0x39, 0x4e, 0x78, 0x56, 0xcc, 0x9d, 0x18, 0xc4, 0x9f, 0xde, + 0x80, 0x3c, 0x91, 0x42, 0x3a, 0xe9, 0xc9, 0xa7, 0x46, 0x31, 0xb5, 0x99, 0xb6, 0xce, 0x88, 0x34, + 0x3d, 0xb4, 0x5a, 0xd0, 0x1d, 0x60, 0x0e, 0x45, 0xa2, 0x74, 0xa7, 0xba, 0x36, 0x1c, 0x10, 0x21, + 0x67, 0x45, 0x76, 0xf1, 0x91, 0x89, 0xf6, 0xad, 0x76, 0xfe, 0xaf, 0x53, 0x00, 0xae, 0x80, 0xe8, + 0x01, 0x64, 0xc8, 0x9a, 0xa8, 0xe3, 0xdf, 0x1e, 0x63, 0x4d, 0x25, 0xb2, 0x30, 0x32, 0x4a, 0xf8, + 0x0f, 0x0e, 0x32, 0x84, 0x4d, 0xf0, 0xf2, 0x6a, 0xd5, 0x1a, 0xfb, 0xf5, 0xaa, 0xd4, 0x68, 0xee, + 0x55, 0xa5, 0x4f, 0xc4, 0x5a, 0xbb, 0x2a, 0x16, 0x38, 0xb4, 0x06, 0x57, 0xbd, 0xed, 0x62, 0xb5, + 0xbc, 0x57, 0x15, 0xa5, 0x66, 0xa3, 0xfe, 0xb4, 0x90, 0x42, 0x3c, 0xac, 0x3e, 0x3e, 0xaa, 0xb7, + 0x6b, 0xe1, 0xbe, 0xb4, 0x75, 0x9f, 0x79, 0xfa, 0x18, 0x0f, 0xc6, 0x36, 0x63, 0xb1, 0xf5, 0xf4, + 0xd2, 0x3f, 0x59, 0x67, 0x16, 0x09, 0x70, 0xcd, 0x3b, 0xa7, 0x7f, 0x6c, 0x8e, 0x4f, 0xff, 0xb8, + 0xc2, 0xa1, 0x2d, 0x28, 0x7a, 0x69, 0x7c, 0x1c, 0xa6, 0x09, 0x49, 0x65, 0xde, 0xd1, 0x00, 0xa2, + 0xe1, 0x9f, 0xc0, 0xbc, 0xef, 0x62, 0xb0, 0x22, 0x3c, 0xe6, 0xc9, 0xba, 0xd2, 0xf1, 0xb9, 0x49, + 0xa2, 0x1e, 0x6e, 0x3b, 0x2d, 0xce, 0xdb, 0xad, 0x15, 0xab, 0xd1, 0x3a, 0xcb, 0x9e, 0xd2, 0x57, + 0x4c, 0x46, 0x93, 0x22, 0x34, 0x40, 0x9a, 0x08, 0x81, 0xf0, 0x8b, 0x14, 0xe4, 0x98, 0x42, 0xdc, + 0xf2, 0x5c, 0x4d, 0x3e, 0x96, 0x76, 0x2b, 0x65, 0xe9, 0xb3, 0xc8, 0x94, 0xdf, 0x22, 0xd1, 0x01, + 0x2c, 0x78, 0xfd, 0xf7, 0x0b, 0x3b, 0xae, 0xdc, 0xf2, 0x9f, 0xb3, 0xd7, 0x89, 0xbc, 0x60, 0xd1, + 0xe4, 0xfc, 0x99, 0xb7, 0x0d, 0x55, 0x60, 0x21, 0x70, 0x05, 0x64, 0x46, 0x5f, 0x01, 0xf3, 0x1d, + 0x9f, 0x37, 0x2c, 0xc3, 0x92, 0xed, 0xbd, 0x7b, 0x58, 0x32, 0x99, 0x77, 0x67, 0x57, 0x54, 0x21, + 0xe4, 0xf5, 0x91, 0x4b, 0x6c, 0xb7, 0xf1, 0x1f, 0x03, 0x0a, 0xcb, 0x3a, 0x91, 0xab, 0x1e, 0xc2, + 0x52, 0xc4, 0xbd, 0x82, 0x4a, 0x30, 0x4b, 0x8e, 0xca, 0x50, 0x4c, 0xcc, 0x22, 0xd6, 0xb0, 0x44, + 0x2e, 0x89, 0x45, 0x3f, 0xd0, 0xf1, 0x09, 0xd6, 0x75, 0xdc, 0x25, 0x36, 0x19, 0x49, 0xef, 0x90, + 0x08, 0xbf, 0xc7, 0xc1, 0x8c, 0xdd, 0x8e, 0x76, 0x60, 0xc6, 0xc0, 0xa7, 0xf4, 0xce, 0xa3, 0x73, + 0x6d, 0x04, 0xc7, 0x96, 0x5a, 0x8c, 0x80, 0xc5, 0xf6, 0x36, 0xbd, 0x15, 0xdb, 0xfb, 0xba, 0x26, + 0x5a, 0xfc, 0xdf, 0x70, 0xb0, 0xb4, 0x87, 0x7b, 0x38, 0x18, 0x1a, 0x25, 0xb9, 0x75, 0x6f, 0x34, + 0x91, 0xf2, 0x47, 0x13, 0x11, 0xac, 0x12, 0xa2, 0x89, 0x0b, 0xdd, 0xb0, 0xab, 0xb0, 0xec, 0x9f, + 0x8d, 0xde, 0x29, 0xc2, 0x7f, 0xa6, 0x61, 0xc3, 0xd2, 0x05, 0x5d, 0xeb, 0xf5, 0xb0, 0x7e, 0x38, + 0x3c, 0xee, 0x29, 0xc6, 0xf3, 0x09, 0x16, 0x77, 0x15, 0xa6, 0x55, 0xad, 0xeb, 0x31, 0x9e, 0x9c, + 0xf5, 0x59, 0xeb, 0xa2, 0x2a, 0x2c, 0x06, 0x63, 0xbb, 0x73, 0xe6, 0xf9, 0xe3, 0x23, 0xbb, 0xc2, + 0x59, 0xf0, 0xda, 0xe2, 0x61, 0xc6, 0x8a, 0x4a, 0x35, 0xb5, 0x77, 0x4e, 0x2c, 0x66, 0x46, 0x74, + 0xbe, 0x91, 0x18, 0x0c, 0xd3, 0xbe, 0xe5, 0x84, 0x69, 0x89, 0x2b, 0x4a, 0x8a, 0xd8, 0x3e, 0x0b, + 0x59, 0x7c, 0x8e, 0xb0, 0xfe, 0x60, 0x4c, 0xd6, 0x23, 0x3d, 0xc1, 0x45, 0x4e, 0xf1, 0x12, 0xcc, + 0xf7, 0x1f, 0x38, 0xb8, 0x11, 0xbb, 0x04, 0x16, 0x67, 0x74, 0xe1, 0xca, 0x80, 0x76, 0x38, 0x9b, + 0x40, 0xad, 0xec, 0xc3, 0x91, 0x9b, 0xc0, 0x12, 0x6b, 0xd6, 0xea, 0xdb, 0x86, 0x85, 0x81, 0xaf, + 0x91, 0x2f, 0xc3, 0x52, 0x04, 0xd9, 0x44, 0x8b, 0xf9, 0x25, 0x07, 0x9b, 0xae, 0x28, 0x47, 0xea, + 0xe0, 0xf2, 0xd4, 0xb7, 0xed, 0xea, 0x16, 0x75, 0xf9, 0xef, 0x85, 0xd7, 0x1e, 0x3d, 0xe1, 0xab, + 0xb2, 0xe0, 0x9b, 0xb0, 0x95, 0x30, 0x35, 0x33, 0xe7, 0x5f, 0x64, 0x60, 0xeb, 0x89, 0xdc, 0x53, + 0xba, 0x4e, 0xf4, 0x18, 0x01, 0x41, 0x24, 0x6f, 0x49, 0x27, 0x64, 0x01, 0xd4, 0x6b, 0x3d, 0x70, + 0xac, 0x76, 0x14, 0xff, 0x31, 0xae, 0xc3, 0x4b, 0xcc, 0xfc, 0x9e, 0x46, 0x64, 0x7e, 0x1f, 0x8c, + 0x2f, 0x6b, 0x52, 0x1e, 0x78, 0x14, 0x74, 0x30, 0xef, 0x8f, 0xcf, 0x37, 0x41, 0x0b, 0x2e, 0x6c, + 0xc5, 0xdf, 0x64, 0xaa, 0xf6, 0x77, 0x19, 0x10, 0x92, 0x56, 0xcf, 0x7c, 0x88, 0x08, 0xb3, 0x1d, + 0x4d, 0x3d, 0x51, 0xf4, 0x3e, 0xee, 0xb2, 0x94, 0xe3, 0xdd, 0x71, 0x36, 0x8f, 0x39, 0x90, 0x5d, + 0x7b, 0xac, 0xe8, 0xb2, 0x41, 0x45, 0x98, 0xee, 0x63, 0xc3, 0x90, 0x4f, 0x6d, 0xb1, 0xec, 0x4f, + 0xfe, 0xa7, 0x69, 0x98, 0x75, 0x86, 0x20, 0x35, 0xa4, 0xc1, 0xd4, 0x7d, 0xed, 0xbf, 0x8c, 0x00, + 0x2f, 0xaf, 0xcc, 0xa9, 0x97, 0x50, 0xe6, 0xae, 0x4f, 0x99, 0xa9, 0x39, 0xec, 0xbd, 0x94, 0xd8, + 0x09, 0x7a, 0xfd, 0x8d, 0x2b, 0xa0, 0xf0, 0x9b, 0x80, 0xea, 0x8a, 0xc1, 0x52, 0x37, 0xc7, 0x2d, + 0x59, 0x99, 0x9a, 0xfc, 0x42, 0xc2, 0xaa, 0xa9, 0x2b, 0x2c, 0x5c, 0xcf, 0x8a, 0xd0, 0x97, 0x5f, + 0x54, 0x69, 0x8b, 0x15, 0xd2, 0x1b, 0xa6, 0xac, 0x9b, 0x8a, 0x7a, 0x2a, 0x99, 0xda, 0xe7, 0xd8, + 0xc1, 0x81, 0xed, 0xd6, 0xb6, 0xd5, 0x28, 0xfc, 0x2a, 0x05, 0x4b, 0x3e, 0xf6, 0x4c, 0x27, 0x3f, + 0x84, 0x69, 0x97, 0xb7, 0x2f, 0x8c, 0x8f, 0xa0, 0x2e, 0xd1, 0x6d, 0xb3, 0x47, 0xa0, 0xeb, 0x00, + 0x2a, 0x7e, 0x61, 0xfa, 0xe6, 0x9d, 0xb5, 0x5a, 0xc8, 0x9c, 0xfc, 0xef, 0x73, 0x4e, 0xa6, 0x6f, + 0xca, 0xe6, 0x90, 0x64, 0x95, 0xcc, 0x45, 0xe3, 0xae, 0xc4, 0xee, 0x18, 0x3a, 0xef, 0xac, 0x58, + 0x70, 0x7a, 0x1a, 0xe4, 0xb6, 0x31, 0xd0, 0xbe, 0x03, 0xb1, 0x76, 0x34, 0xb5, 0xab, 0x98, 0x2e, + 0xc4, 0x7a, 0x35, 0x94, 0x20, 0xd0, 0xee, 0x8a, 0x95, 0x57, 0xd9, 0xa0, 0xaa, 0xd3, 0xca, 0x7f, + 0x01, 0x59, 0x7a, 0x1c, 0x63, 0x82, 0x05, 0xe8, 0x63, 0xc8, 0x19, 0x44, 0xe2, 0x20, 0x30, 0x12, + 0xb5, 0x27, 0xde, 0x15, 0x8a, 0x6c, 0x9c, 0xf0, 0x1d, 0xe0, 0xdd, 0x8b, 0x69, 0x1f, 0x9b, 0xe3, + 0x5f, 0xbf, 0x3b, 0xd6, 0x1a, 0x84, 0x3f, 0x4d, 0xc1, 0x5a, 0x24, 0x83, 0xc9, 0x60, 0x0f, 0x74, + 0x10, 0x58, 0xc9, 0xdb, 0xe1, 0x1b, 0x3b, 0xc4, 0x3c, 0x72, 0x45, 0xfc, 0xef, 0x5c, 0xec, 0x30, + 0x2b, 0x13, 0x1f, 0x66, 0xe8, 0x1c, 0xe9, 0xce, 0xfc, 0x34, 0x05, 0x68, 0x1f, 0x9b, 0x4e, 0xaa, + 0xcc, 0xb6, 0x34, 0xc6, 0xdf, 0x70, 0x2f, 0xe1, 0x6f, 0xbe, 0xe7, 0xf3, 0x37, 0xd4, 0x63, 0xdd, + 0xf6, 0x14, 0x4d, 0x02, 0x53, 0x27, 0xde, 0x96, 0x31, 0xe9, 0x29, 0x8d, 0xf9, 0xc7, 0x4b, 0x4f, + 0x2f, 0xe8, 0x56, 0xfe, 0x9d, 0x83, 0x25, 0x9f, 0xd0, 0x4c, 0x83, 0xee, 0x02, 0x92, 0xcf, 0x64, + 0xa5, 0x27, 0x5b, 0x82, 0xd9, 0xe9, 0x3f, 0x83, 0x03, 0x16, 0x9d, 0x1e, 0x7b, 0x18, 0x7a, 0x04, + 0x4b, 0x7d, 0xf9, 0x85, 0xd2, 0x1f, 0xf6, 0x25, 0xb6, 0xcf, 0x86, 0xf2, 0x43, 0x1b, 0x38, 0x5c, + 0x0b, 0x01, 0xe8, 0x35, 0xd5, 0x7c, 0xff, 0x5d, 0x8a, 0xa0, 0x2f, 0xb2, 0x71, 0x4c, 0x79, 0x94, + 0x1f, 0x62, 0x74, 0x08, 0x4b, 0x7d, 0x45, 0x0d, 0x31, 0x4b, 0x8f, 0x64, 0x46, 0x0d, 0x7c, 0x91, + 0x0d, 0x76, 0x39, 0x0a, 0x82, 0x37, 0xe8, 0x65, 0xcb, 0x0d, 0x16, 0x99, 0x7a, 0xde, 0x60, 0x31, + 0x44, 0xc3, 0xb6, 0x65, 0x3f, 0xb2, 0xd0, 0x74, 0x33, 0x6c, 0x36, 0xac, 0xea, 0x12, 0x5b, 0x73, + 0xfa, 0x9f, 0xb4, 0xd7, 0x82, 0x43, 0xd4, 0xe8, 0x43, 0x48, 0xeb, 0x83, 0x0e, 0x33, 0xdf, 0x37, + 0xc6, 0xe0, 0x5f, 0x12, 0x0f, 0x77, 0x0f, 0xa6, 0x44, 0x6b, 0x14, 0xff, 0x67, 0x69, 0x48, 0x8b, + 0x87, 0xbb, 0xe8, 0x63, 0x5f, 0x89, 0xe5, 0xce, 0x98, 0x5c, 0xbc, 0x15, 0x96, 0x7f, 0x4a, 0x45, + 0x95, 0x58, 0x8a, 0xb0, 0xbc, 0x2b, 0x56, 0xcb, 0xed, 0xaa, 0xb4, 0x57, 0xad, 0x57, 0xdb, 0x55, + 0x89, 0x16, 0x88, 0x0a, 0x1c, 0x5a, 0x87, 0xe2, 0xe1, 0x51, 0xa5, 0x5e, 0x6b, 0x1d, 0x48, 0x47, + 0x0d, 0xfb, 0x2f, 0xd6, 0x9b, 0x42, 0x05, 0x98, 0xab, 0xd7, 0x5a, 0x6d, 0xd6, 0xd0, 0x2a, 0xa4, + 0xad, 0x96, 0xfd, 0x6a, 0x5b, 0xda, 0x2d, 0x1f, 0x96, 0x77, 0x6b, 0xed, 0xa7, 0x85, 0x0c, 0xe2, + 0x61, 0xd5, 0xcf, 0xbb, 0xd5, 0x28, 0x1f, 0xb6, 0x0e, 0x9a, 0xed, 0x42, 0x16, 0x21, 0x58, 0x20, + 0xe3, 0xed, 0xa6, 0x56, 0x21, 0x67, 0x71, 0xd8, 0xad, 0x37, 0x1b, 0x8e, 0x0c, 0xd3, 0x68, 0x19, + 0x0a, 0xf6, 0xcc, 0x62, 0xb5, 0xbc, 0x47, 0x00, 0xbd, 0x19, 0xb4, 0x08, 0xf3, 0xd5, 0x1f, 0x1c, + 0x96, 0x1b, 0x7b, 0x36, 0xe1, 0x2c, 0xda, 0x84, 0x75, 0xaf, 0x38, 0x12, 0x1b, 0x55, 0xdd, 0x23, + 0xa0, 0x5c, 0xab, 0x00, 0xe8, 0x1a, 0x14, 0x58, 0xed, 0x6b, 0xb7, 0xd9, 0xd8, 0xab, 0xb5, 0x6b, + 0xcd, 0x46, 0x21, 0x4f, 0x11, 0xbc, 0x25, 0x00, 0x4b, 0x72, 0xc6, 0x6c, 0x6e, 0x34, 0xac, 0x37, + 0x4f, 0x61, 0x3d, 0x1b, 0xb1, 0xfe, 0x65, 0x0a, 0x56, 0x28, 0x64, 0x6d, 0x03, 0xe4, 0xb6, 0xaf, + 0xda, 0x86, 0x02, 0xc5, 0xbb, 0xa4, 0xe0, 0x2d, 0xb0, 0x40, 0xdb, 0x9f, 0xd8, 0x79, 0x87, 0x5d, + 0x5e, 0x4a, 0x79, 0xca, 0x4b, 0xb5, 0x60, 0x16, 0x76, 0xdb, 0x5f, 0x88, 0x09, 0xcc, 0x96, 0x94, + 0xd8, 0x3f, 0x8e, 0x48, 0x13, 0xee, 0x26, 0x73, 0x4b, 0x0a, 0xa1, 0x2e, 0x92, 0xc5, 0x5f, 0xd0, + 0xcb, 0x3d, 0x84, 0xd5, 0xa0, 0xbc, 0xcc, 0xa0, 0xef, 0x84, 0xca, 0x25, 0x8e, 0xdb, 0x75, 0x68, + 0x1d, 0x0a, 0xe1, 0x47, 0x29, 0x98, 0xb1, 0x9b, 0xad, 0xf0, 0xc6, 0xf2, 0x4b, 0x3e, 0xa4, 0x74, + 0xd6, 0x6a, 0x71, 0x80, 0x57, 0x6f, 0xa1, 0x23, 0x15, 0x2c, 0x74, 0x44, 0x9e, 0x73, 0x3a, 0xf2, + 0x9c, 0xbf, 0x0b, 0xf3, 0x1d, 0x4b, 0x7c, 0x45, 0x53, 0x25, 0x53, 0xe9, 0xdb, 0x40, 0x68, 0xb8, + 0x30, 0xd9, 0xb6, 0xdf, 0x1a, 0x88, 0x73, 0xf6, 0x00, 0xab, 0x09, 0x6d, 0xc2, 0x1c, 0x29, 0x54, + 0x4a, 0xa6, 0x26, 0x0d, 0x0d, 0x5c, 0xcc, 0x12, 0x58, 0x08, 0x48, 0x5b, 0x5b, 0x3b, 0x32, 0x30, + 0xba, 0x07, 0x8b, 0x04, 0xc4, 0x97, 0xbc, 0x32, 0xe7, 0x2c, 0x69, 0x58, 0xd4, 0x44, 0x7a, 0x5b, + 0x8e, 0xf4, 0xc2, 0xdf, 0x72, 0xb0, 0x42, 0xe1, 0xb1, 0xa0, 0xfe, 0x8e, 0xaa, 0xf0, 0x78, 0x55, + 0x34, 0x70, 0x7d, 0x46, 0x32, 0x7c, 0x55, 0xe8, 0x40, 0x11, 0x56, 0x83, 0xf3, 0x31, 0x48, 0xe0, + 0x67, 0x29, 0x58, 0xb6, 0x62, 0x39, 0xbb, 0xe3, 0xb2, 0xc3, 0xed, 0x09, 0x8e, 0x3e, 0xb0, 0x99, + 0x99, 0xd0, 0x66, 0x1e, 0x04, 0x13, 0xee, 0x37, 0xbd, 0xd1, 0x68, 0x70, 0x05, 0xaf, 0x6a, 0x2f, + 0x7f, 0xc2, 0xc1, 0x4a, 0x60, 0x3e, 0x66, 0x60, 0x1f, 0x05, 0x33, 0x88, 0x9b, 0x31, 0xf2, 0xbd, + 0x54, 0x0e, 0xf1, 0x9e, 0x1d, 0xbb, 0x4f, 0x66, 0xc7, 0xff, 0x9c, 0x82, 0xeb, 0xee, 0x2d, 0x48, + 0xde, 0x16, 0x74, 0x27, 0x80, 0xc0, 0x2e, 0x56, 0xc2, 0xff, 0x7e, 0xd0, 0x43, 0xdf, 0x0f, 0x5f, + 0xcc, 0x11, 0x22, 0x25, 0x79, 0xea, 0x48, 0xe4, 0x38, 0x33, 0x29, 0x72, 0x7c, 0x21, 0x0d, 0xf8, + 0x6d, 0x2f, 0x28, 0xee, 0x17, 0x9f, 0x69, 0xc2, 0x98, 0xd5, 0xa5, 0xf7, 0xe1, 0x2a, 0x49, 0x17, + 0x9c, 0x87, 0x33, 0x76, 0xc1, 0x9e, 0xfa, 0xd0, 0x19, 0x71, 0xc5, 0xea, 0x76, 0xde, 0x83, 0xb0, + 0x8a, 0x4a, 0x57, 0xf8, 0x3a, 0x03, 0xab, 0x56, 0x3a, 0xd1, 0x32, 0xe5, 0xd3, 0x49, 0x6a, 0x0d, + 0xbf, 0x11, 0x86, 0x6e, 0x53, 0xfe, 0x63, 0x89, 0xe6, 0x3a, 0x0e, 0x62, 0x8b, 0x4a, 0xb0, 0x64, + 0x98, 0xf2, 0x29, 0x71, 0x07, 0xb2, 0x7e, 0x8a, 0x4d, 0x69, 0x20, 0x9b, 0xcf, 0x99, 0xad, 0x2f, + 0xb2, 0xae, 0x36, 0xe9, 0x39, 0x94, 0xcd, 0xe7, 0x97, 0x74, 0x90, 0xe8, 0x7b, 0x41, 0xa7, 0xf0, + 0xd6, 0x88, 0xb5, 0x24, 0xe8, 0xd6, 0x0f, 0x62, 0xe0, 0xfd, 0x77, 0x46, 0xb0, 0x1c, 0x0d, 0xeb, + 0x5f, 0x1c, 0xce, 0xfe, 0x86, 0x2b, 0x03, 0xd7, 0xe0, 0x6a, 0x68, 0xf1, 0xec, 0x0a, 0x39, 0x85, + 0xa2, 0xd5, 0x75, 0xa4, 0x1a, 0x13, 0xaa, 0x63, 0x8c, 0xc6, 0xa4, 0x62, 0x34, 0x46, 0x58, 0x83, + 0x6b, 0x11, 0x13, 0x31, 0x29, 0x7e, 0x9e, 0xa5, 0x62, 0x4c, 0x5e, 0xa4, 0xfa, 0x34, 0xce, 0x2a, + 0xde, 0xf5, 0x1e, 0x7b, 0x64, 0x3d, 0xe7, 0x55, 0xd8, 0xc5, 0x0d, 0xc8, 0x7b, 0xe9, 0xd8, 0x35, + 0x68, 0x8e, 0x30, 0x9c, 0xec, 0x85, 0x6a, 0x67, 0xb9, 0x40, 0xed, 0xac, 0xee, 0x1a, 0xd5, 0xb4, + 0x3f, 0x16, 0x8e, 0xdd, 0x8a, 0x04, 0xb3, 0x7a, 0x16, 0x32, 0xab, 0x19, 0x7f, 0x41, 0x2e, 0x96, + 0xe9, 0xaf, 0x81, 0x61, 0x31, 0xa5, 0x8e, 0xac, 0x94, 0x09, 0xcf, 0x80, 0xa7, 0x1a, 0x3f, 0x79, + 0xed, 0x2a, 0xa0, 0x46, 0xa9, 0xa0, 0x1a, 0x09, 0xd7, 0x61, 0x2d, 0x92, 0x37, 0x9b, 0xfa, 0x0f, + 0x38, 0x2a, 0x98, 0x03, 0x8a, 0xb5, 0x4c, 0xd9, 0x34, 0xc6, 0x9d, 0x9a, 0x75, 0x7a, 0xa7, 0xa6, + 0x4d, 0x44, 0x83, 0x27, 0x34, 0x09, 0xe1, 0x8f, 0x38, 0xba, 0x0f, 0x41, 0x59, 0xd8, 0x6d, 0xfb, + 0x26, 0x64, 0x87, 0x04, 0xf7, 0xa7, 0x51, 0xd7, 0x92, 0xdf, 0x08, 0x8e, 0xac, 0x2e, 0x91, 0x52, + 0x5c, 0x1a, 0x92, 0x2a, 0xfc, 0x8c, 0x83, 0xbc, 0x87, 0x3f, 0x5a, 0x87, 0x59, 0x07, 0x2a, 0xb2, + 0x13, 0x24, 0xa7, 0xc1, 0x3a, 0x7e, 0x53, 0x33, 0xe5, 0x1e, 0x7b, 0x93, 0x42, 0x3f, 0xac, 0x9c, + 0x76, 0x68, 0x60, 0x1a, 0x0e, 0xa7, 0x45, 0xf2, 0x37, 0xba, 0x03, 0x99, 0xa1, 0xaa, 0x98, 0xc4, + 0xec, 0x17, 0x82, 0xf6, 0x4c, 0xa6, 0x2a, 0x1d, 0xa9, 0x8a, 0x29, 0x12, 0x2a, 0xe1, 0x36, 0x64, + 0xac, 0x2f, 0x3f, 0x64, 0x31, 0x0b, 0xd9, 0xca, 0xd3, 0x76, 0xb5, 0x55, 0xe0, 0x10, 0x40, 0xae, + 0x46, 0x13, 0xfc, 0x94, 0x50, 0xb7, 0xdf, 0xa5, 0x3a, 0x8b, 0xb0, 0x5c, 0x80, 0x7c, 0xac, 0x6a, + 0x7a, 0x5f, 0xee, 0x11, 0x99, 0x67, 0x44, 0xe7, 0x3b, 0xbe, 0x9c, 0x42, 0xc1, 0xc7, 0x75, 0xe7, + 0x44, 0xa2, 0x00, 0xa6, 0xcf, 0xa8, 0x6e, 0xc5, 0x41, 0x4b, 0xe5, 0x48, 0x68, 0xe9, 0xba, 0xef, + 0x96, 0x1d, 0x01, 0x2a, 0xfd, 0x7d, 0x0a, 0x56, 0x22, 0xe9, 0xd0, 0x7b, 0x5e, 0x38, 0x69, 0x2b, + 0x91, 0xa7, 0x17, 0x48, 0xfa, 0x9a, 0xa3, 0x40, 0xd2, 0x8e, 0x0f, 0x48, 0x7a, 0x7d, 0xe4, 0x78, + 0x2f, 0x84, 0xf4, 0x13, 0x2e, 0x06, 0x42, 0x6a, 0xb5, 0xcb, 0xfb, 0x55, 0xe9, 0xa8, 0x41, 0xff, + 0x75, 0x20, 0xa4, 0x65, 0x28, 0xb8, 0xc0, 0x8a, 0xd4, 0x6a, 0x97, 0xc9, 0xfb, 0xe2, 0x10, 0x7c, + 0x93, 0x8e, 0x04, 0x67, 0x32, 0xa3, 0x71, 0x98, 0x2c, 0x25, 0x59, 0x05, 0xc4, 0x46, 0x3f, 0x6e, + 0x1e, 0x35, 0xda, 0x12, 0x79, 0xbd, 0x5c, 0xc8, 0x39, 0xf8, 0xcc, 0x32, 0x20, 0x76, 0x5a, 0xde, + 0x47, 0xf8, 0x7f, 0xc1, 0xc1, 0x92, 0xaf, 0x99, 0x1d, 0x9e, 0xa7, 0x28, 0xce, 0xf9, 0x8a, 0xe2, + 0xf7, 0x60, 0xd9, 0xca, 0x18, 0xa9, 0xa5, 0x18, 0xd2, 0x00, 0xeb, 0x04, 0x0c, 0x67, 0x3a, 0xbf, + 0xd8, 0x97, 0x5f, 0xb0, 0x82, 0xc1, 0x21, 0xd6, 0x2d, 0xc6, 0x97, 0x00, 0x09, 0x0b, 0x5f, 0xa5, + 0x69, 0x5c, 0x32, 0x71, 0x5e, 0x33, 0xd2, 0x47, 0x85, 0x13, 0x9f, 0xf4, 0x04, 0x89, 0x4f, 0x8c, + 0x87, 0xcb, 0x4c, 0x14, 0x0c, 0x4f, 0x7e, 0xa7, 0x37, 0xdc, 0x7b, 0x9b, 0x46, 0xae, 0x77, 0xbc, + 0xfa, 0x3b, 0x32, 0xd3, 0xca, 0x7d, 0x55, 0xe1, 0x7e, 0x7c, 0x59, 0x79, 0x72, 0x99, 0xc6, 0x63, + 0x17, 0xc8, 0x8f, 0x84, 0x37, 0xe0, 0x16, 0x79, 0x56, 0x39, 0x12, 0xd0, 0x3e, 0x83, 0xd7, 0x47, + 0x11, 0xb2, 0x99, 0xeb, 0x91, 0xae, 0xc7, 0x29, 0x6b, 0x05, 0xb8, 0x8c, 0xf2, 0x42, 0x5f, 0xa6, + 0x60, 0x73, 0xd4, 0x10, 0xf4, 0xb1, 0xd7, 0x21, 0xdd, 0x19, 0x77, 0x26, 0xaf, 0x6f, 0xfa, 0x13, + 0xe6, 0x9b, 0xaa, 0x3e, 0xdf, 0xf4, 0xce, 0x24, 0xac, 0xbc, 0x6e, 0xaa, 0x1a, 0xe5, 0xa5, 0xde, + 0x86, 0x37, 0xfc, 0x60, 0xb4, 0xc7, 0x33, 0xd1, 0x9f, 0x3b, 0x38, 0xe8, 0x34, 0xe7, 0x87, 0x77, + 0xff, 0x38, 0x0d, 0x9b, 0xde, 0x17, 0xc9, 0xfb, 0x5e, 0xf8, 0x2c, 0xe9, 0xe7, 0x01, 0xb7, 0x61, + 0x31, 0x08, 0x0d, 0xd9, 0x2f, 0x70, 0xaf, 0xf8, 0xb1, 0x21, 0x23, 0xe9, 0xc5, 0xcd, 0x88, 0xa9, + 0x93, 0x13, 0xbe, 0x30, 0xec, 0xfb, 0xed, 0xb1, 0x19, 0xff, 0xff, 0x44, 0x80, 0xe9, 0xfd, 0xdc, + 0x83, 0xad, 0x04, 0xf9, 0x99, 0x31, 0x54, 0x60, 0xc1, 0x8f, 0x84, 0x32, 0x25, 0x0d, 0x3c, 0x3b, + 0xf5, 0x0f, 0x9e, 0xf7, 0xc1, 0xa3, 0x74, 0xb6, 0x7f, 0xe5, 0xec, 0x17, 0xfa, 0x3e, 0x5a, 0xeb, + 0x84, 0xc3, 0x50, 0x2b, 0x5d, 0x44, 0x10, 0x65, 0x45, 0x25, 0x98, 0xb5, 0xa9, 0x8c, 0xe0, 0x9b, + 0x4f, 0x67, 0x72, 0x97, 0x24, 0x8c, 0x14, 0xa7, 0x2f, 0x88, 0x14, 0x67, 0x82, 0x48, 0x31, 0x5d, + 0xdb, 0x8f, 0x52, 0xb0, 0xe9, 0x7d, 0x1c, 0x19, 0xa9, 0xde, 0x93, 0x2c, 0x74, 0x0b, 0xe6, 0x3c, + 0x54, 0xb6, 0xc6, 0xe7, 0x5d, 0xa0, 0x33, 0x49, 0xdb, 0x47, 0x49, 0xf2, 0x8a, 0x50, 0x4f, 0xba, + 0x15, 0x37, 0x61, 0x2b, 0x61, 0x7e, 0x96, 0x38, 0x7c, 0x99, 0x22, 0x3f, 0x61, 0xfb, 0xbf, 0xdb, + 0xac, 0x78, 0x90, 0x31, 0x51, 0x8c, 0x57, 0xba, 0x53, 0x0a, 0x6c, 0xc4, 0x4d, 0x7e, 0xc9, 0xb6, + 0x77, 0xff, 0xbf, 0x39, 0x98, 0xa9, 0x75, 0xb1, 0x6a, 0xd2, 0x00, 0x60, 0xde, 0xf7, 0x63, 0x46, + 0xb4, 0x1e, 0xf3, 0x1b, 0x47, 0xb2, 0x05, 0xfc, 0xf5, 0xc4, 0x5f, 0x40, 0x0a, 0x53, 0xe8, 0xc4, + 0xf3, 0x43, 0x4c, 0xdf, 0xd3, 0x80, 0xd7, 0x42, 0x23, 0x23, 0xee, 0x65, 0xfe, 0xd6, 0x08, 0x2a, + 0x67, 0x9e, 0xf7, 0x21, 0x4b, 0x7e, 0x98, 0x86, 0x96, 0x9d, 0x1f, 0xc7, 0x79, 0x7e, 0xb7, 0xc6, + 0xaf, 0x04, 0x5a, 0xed, 0x71, 0xf7, 0xff, 0x71, 0x16, 0xc0, 0xbd, 0xf9, 0xd0, 0x23, 0x98, 0xf3, + 0x7a, 0x3d, 0xb4, 0x96, 0xf0, 0xcb, 0x2c, 0x7e, 0x3d, 0xba, 0xd3, 0x91, 0xe9, 0x11, 0xcc, 0x79, + 0xb5, 0xdd, 0x65, 0x16, 0xf1, 0x30, 0xdb, 0x65, 0x16, 0xf9, 0x8e, 0x7a, 0x0a, 0xf5, 0xe0, 0x6a, + 0xcc, 0xb3, 0x58, 0xf4, 0xfa, 0x78, 0x8f, 0x87, 0xf9, 0x37, 0xc6, 0x7c, 0x5f, 0x2b, 0x4c, 0x21, + 0x1d, 0xae, 0xc5, 0xbe, 0x06, 0x45, 0xdb, 0xe3, 0xbe, 0x55, 0xe5, 0xdf, 0x1c, 0x83, 0xd2, 0x99, + 0x73, 0x08, 0x7c, 0xfc, 0x13, 0x34, 0xf4, 0xe6, 0xd8, 0x6f, 0x23, 0xf9, 0xdb, 0xe3, 0xbf, 0x68, + 0x13, 0xa6, 0xd0, 0x01, 0xe4, 0x3d, 0x6f, 0x91, 0x10, 0x1f, 0xf9, 0x40, 0x89, 0x32, 0x5e, 0x4b, + 0x78, 0xbc, 0x44, 0x39, 0x79, 0x9e, 0x87, 0xb8, 0x9c, 0xc2, 0x0f, 0x5d, 0x5c, 0x4e, 0x11, 0xef, + 0x49, 0x82, 0xdb, 0x1f, 0x88, 0x44, 0xa3, 0xb6, 0x3f, 0x3a, 0xaa, 0x8d, 0xda, 0xfe, 0x98, 0xb0, + 0x56, 0x98, 0x42, 0xdf, 0x87, 0x05, 0x7f, 0xdd, 0x17, 0x5d, 0x4f, 0xac, 0x5f, 0xf3, 0x1b, 0x71, + 0xdd, 0x5e, 0x96, 0xfe, 0xaa, 0xa1, 0xcb, 0x32, 0xb2, 0x7a, 0xe9, 0xb2, 0x8c, 0x29, 0x36, 0x4e, + 0x59, 0xfe, 0xc9, 0x57, 0x0b, 0x73, 0xfd, 0x53, 0x54, 0x09, 0xcf, 0xf5, 0x4f, 0x91, 0x05, 0x34, + 0x61, 0x0a, 0x29, 0xb0, 0x1a, 0x5d, 0x8a, 0x41, 0xb7, 0xc6, 0xaa, 0x34, 0xf1, 0xaf, 0x8f, 0x22, + 0x73, 0xa6, 0xea, 0xc0, 0x52, 0xc4, 0x53, 0x31, 0x24, 0x24, 0xbe, 0x23, 0xa3, 0x93, 0xdc, 0x1c, + 0xe3, 0xad, 0x99, 0x40, 0x9c, 0xf9, 0x7f, 0xa5, 0xe1, 0x4a, 0x20, 0x9c, 0x47, 0xbf, 0xcb, 0xc1, + 0x46, 0x72, 0x76, 0x83, 0xee, 0xc6, 0xa4, 0x02, 0x31, 0x8a, 0x55, 0x1a, 0x97, 0xdc, 0x63, 0xdc, + 0xd7, 0x62, 0xc3, 0x49, 0xb4, 0x3d, 0x6e, 0xc4, 0xec, 0xd1, 0xe8, 0x51, 0xb1, 0x29, 0xd9, 0x0e, + 0x6b, 0xda, 0xd8, 0x80, 0x03, 0x6d, 0x8f, 0x1b, 0x13, 0xb9, 0xd3, 0x8e, 0x8e, 0x5e, 0xc8, 0xb4, + 0x3d, 0x58, 0x8d, 0xbe, 0xbd, 0xd1, 0xad, 0xb1, 0x42, 0x0b, 0x57, 0xab, 0x92, 0x83, 0x00, 0x32, + 0x1b, 0x49, 0xa6, 0xee, 0xff, 0x5b, 0x16, 0x32, 0x04, 0x14, 0x69, 0xc3, 0x95, 0x40, 0xa1, 0x05, + 0x6d, 0x24, 0x97, 0x9f, 0xf8, 0x1b, 0xb1, 0xfd, 0xce, 0xf9, 0x3d, 0x83, 0xc5, 0x50, 0xe9, 0x04, + 0x6d, 0x7a, 0xc7, 0x45, 0x95, 0x6f, 0xf8, 0xad, 0x04, 0x8a, 0x20, 0x6f, 0xff, 0xa5, 0xb6, 0x39, + 0x0a, 0xdb, 0xf7, 0xf3, 0x8e, 0xbb, 0xc8, 0x3e, 0xa3, 0x18, 0x54, 0xf0, 0x0a, 0x13, 0xfc, 0x72, + 0x45, 0x5e, 0x5e, 0x37, 0x13, 0x69, 0x9c, 0x19, 0x3e, 0x75, 0xc0, 0x2f, 0x0f, 0xb4, 0x8c, 0x7c, + 0xc2, 0x45, 0x42, 0xe0, 0xbc, 0x90, 0x44, 0xe2, 0xb0, 0xff, 0x04, 0x0a, 0x41, 0x14, 0x04, 0xdd, + 0x18, 0x01, 0xca, 0xf0, 0x9b, 0xf1, 0x04, 0xc1, 0x9d, 0x09, 0x7a, 0x82, 0xa0, 0x54, 0x51, 0xe6, + 0x7f, 0x33, 0x91, 0xc6, 0x7b, 0x1f, 0x7a, 0xf0, 0x3f, 0xf7, 0x3e, 0x0c, 0x63, 0x85, 0xee, 0x7d, + 0x18, 0x01, 0x18, 0x0a, 0x53, 0x3b, 0x0f, 0x00, 0xe4, 0xde, 0xe0, 0xb9, 0x2c, 0x61, 0x75, 0xd8, + 0x47, 0xeb, 0xa1, 0x0c, 0xad, 0xaa, 0x0e, 0xfb, 0xcd, 0x81, 0x95, 0x98, 0x19, 0xc5, 0xbf, 0x9a, + 0x21, 0x69, 0xd8, 0x2c, 0x19, 0x60, 0x75, 0xec, 0xd4, 0xa1, 0xe0, 0x8e, 0x96, 0x48, 0xa0, 0x8d, + 0xb6, 0x22, 0x79, 0x90, 0x97, 0x91, 0x01, 0x46, 0x0b, 0x0e, 0x23, 0xd2, 0xbb, 0xf3, 0x11, 0x40, + 0xc7, 0x50, 0x24, 0x1a, 0xe9, 0xa3, 0xeb, 0x21, 0x3e, 0x0f, 0x15, 0xdc, 0xeb, 0xda, 0x3c, 0xfe, + 0x92, 0x09, 0xd3, 0x31, 0x14, 0x9a, 0x0f, 0xec, 0x7c, 0x17, 0xf2, 0x54, 0x98, 0x13, 0x8b, 0x6e, + 0xd4, 0x78, 0x26, 0x03, 0x5d, 0x3d, 0xe9, 0xd9, 0xa9, 0xc2, 0x3c, 0x65, 0xc0, 0xe0, 0x74, 0x74, + 0x23, 0xc4, 0xe2, 0x31, 0xed, 0x09, 0x30, 0x99, 0x23, 0xc3, 0x58, 0xdf, 0x4e, 0x05, 0xe6, 0x6c, + 0x36, 0xe6, 0x73, 0xad, 0x8b, 0x36, 0x22, 0xb8, 0x58, 0x1d, 0x01, 0x26, 0x79, 0xc6, 0xc4, 0xea, + 0x72, 0x45, 0xb1, 0xff, 0x2b, 0x8f, 0xb0, 0x28, 0x0c, 0x4b, 0x8a, 0x14, 0x85, 0xf5, 0x55, 0xb2, + 0xcf, 0xd2, 0x1d, 0x43, 0x39, 0xce, 0x91, 0x41, 0xdf, 0xfa, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x9c, 0xd2, 0x9c, 0x51, 0x77, 0x46, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/spec.md b/spec.md index f7bbbae6..78bd5f27 100644 --- a/spec.md +++ b/spec.md @@ -3019,13 +3019,24 @@ message GetVolumeGroupSnapshotRequest { // This field is REQUIRED. string group_snapshot_id = 1; + // A list of snapshot IDs that are part of this group snapshot. + // If SP does not need to rely on this field to get the snapshots + // in the group, it SHOULD check this field and report an error + // if it has the ability to detect a mismatch. + // Some SPs require this list to get the snapshots in the group. + // If SP needs to use this field to get the snapshots in the + // group, it MUST report an error if it has the ability to detect + // a mismatch. + // This field is REQUIRED. + repeated string snapshot_ids = 2; + // Secrets required by plugin to complete // GetVolumeGroupSnapshot request. // This field is OPTIONAL. Refer to the `Secrets Requirements` // section on how to use this field. // The secrets provided in this field SHOULD be the same for // all group snapshot operations on the same group snapshot. - map secrets = 2 [(csi_secret) = true]; + map secrets = 3 [(csi_secret) = true]; } message GetVolumeGroupSnapshotResponse { @@ -3044,6 +3055,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| +| Snapshot list mismatch | 3 INVALID_ARGUMENT | Besides the general cases, this code SHOULD also be used to indicate when plugin supporting CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT detects a mismatch in the `snapshot_ids`. | If a mismatch is detected in the `snapshot_ids`, caller SHOULD use different `snapshot_ids`. | | Volume group snapshot does not exist | 5 NOT_FOUND | Indicates that a volume group snapshot corresponding to the specified `group_snapshot_id` does not exist. | Caller MUST verify that the `group_snapshot_id` is correct and that the volume group snapshot is accessible and has not been deleted before retrying with exponential back off. | ## Protocol From 536316fa2417b1d91c336f7ee860b96205cc0037 Mon Sep 17 00:00:00 2001 From: xing-yang Date: Tue, 21 Feb 2023 20:39:35 +0000 Subject: [PATCH 13/13] Use INVALID_ARGUMENT error code if DeleteSnapshot fails because snapshot is part of a group snapshot. --- csi.proto | 1 + lib/go/csi/csi.pb.go | 92 ++++++++++++++++++++++---------------------- spec.md | 4 +- 3 files changed, 50 insertions(+), 47 deletions(-) diff --git a/csi.proto b/csi.proto index e53765eb..97b30aa3 100644 --- a/csi.proto +++ b/csi.proto @@ -1812,6 +1812,7 @@ message DeleteVolumeGroupSnapshotRequest { message DeleteVolumeGroupSnapshotResponse { // Intentionally empty. + option (alpha_message) = true; } message GetVolumeGroupSnapshotRequest { option (alpha_message) = true; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index e918e27a..99a6310f 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -5778,7 +5778,7 @@ func init() { } var fileDescriptor_9cdb00adce470e01 = []byte{ - // 4168 bytes of a gzipped FileDescriptorProto + // 4169 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x4d, 0x6c, 0x1b, 0x49, 0x76, 0x56, 0xf3, 0x4f, 0xd2, 0xa3, 0x24, 0x53, 0xa5, 0x1f, 0xd3, 0x2d, 0x59, 0x96, 0xda, 0xe3, 0x19, 0x8d, 0xc7, 0xa6, 0x67, 0xbc, 0x33, 0x83, 0x1d, 0x8d, 0x67, 0x77, 0x48, 0x89, 0x96, 0xb8, @@ -5995,51 +5995,51 @@ var fileDescriptor_9cdb00adce470e01 = []byte{ 0x4f, 0x67, 0x72, 0x97, 0x24, 0x8c, 0x14, 0xa7, 0x2f, 0x88, 0x14, 0x67, 0x82, 0x48, 0x31, 0x5d, 0xdb, 0x8f, 0x52, 0xb0, 0xe9, 0x7d, 0x1c, 0x19, 0xa9, 0xde, 0x93, 0x2c, 0x74, 0x0b, 0xe6, 0x3c, 0x54, 0xb6, 0xc6, 0xe7, 0x5d, 0xa0, 0x33, 0x49, 0xdb, 0x47, 0x49, 0xf2, 0x8a, 0x50, 0x4f, 0xba, - 0x15, 0x37, 0x61, 0x2b, 0x61, 0x7e, 0x96, 0x38, 0x7c, 0x99, 0x22, 0x3f, 0x61, 0xfb, 0xbf, 0xdb, - 0xac, 0x78, 0x90, 0x31, 0x51, 0x8c, 0x57, 0xba, 0x53, 0x0a, 0x6c, 0xc4, 0x4d, 0x7e, 0xc9, 0xb6, - 0x77, 0xff, 0xbf, 0x39, 0x98, 0xa9, 0x75, 0xb1, 0x6a, 0xd2, 0x00, 0x60, 0xde, 0xf7, 0x63, 0x46, - 0xb4, 0x1e, 0xf3, 0x1b, 0x47, 0xb2, 0x05, 0xfc, 0xf5, 0xc4, 0x5f, 0x40, 0x0a, 0x53, 0xe8, 0xc4, - 0xf3, 0x43, 0x4c, 0xdf, 0xd3, 0x80, 0xd7, 0x42, 0x23, 0x23, 0xee, 0x65, 0xfe, 0xd6, 0x08, 0x2a, - 0x67, 0x9e, 0xf7, 0x21, 0x4b, 0x7e, 0x98, 0x86, 0x96, 0x9d, 0x1f, 0xc7, 0x79, 0x7e, 0xb7, 0xc6, - 0xaf, 0x04, 0x5a, 0xed, 0x71, 0xf7, 0xff, 0x71, 0x16, 0xc0, 0xbd, 0xf9, 0xd0, 0x23, 0x98, 0xf3, - 0x7a, 0x3d, 0xb4, 0x96, 0xf0, 0xcb, 0x2c, 0x7e, 0x3d, 0xba, 0xd3, 0x91, 0xe9, 0x11, 0xcc, 0x79, - 0xb5, 0xdd, 0x65, 0x16, 0xf1, 0x30, 0xdb, 0x65, 0x16, 0xf9, 0x8e, 0x7a, 0x0a, 0xf5, 0xe0, 0x6a, - 0xcc, 0xb3, 0x58, 0xf4, 0xfa, 0x78, 0x8f, 0x87, 0xf9, 0x37, 0xc6, 0x7c, 0x5f, 0x2b, 0x4c, 0x21, - 0x1d, 0xae, 0xc5, 0xbe, 0x06, 0x45, 0xdb, 0xe3, 0xbe, 0x55, 0xe5, 0xdf, 0x1c, 0x83, 0xd2, 0x99, - 0x73, 0x08, 0x7c, 0xfc, 0x13, 0x34, 0xf4, 0xe6, 0xd8, 0x6f, 0x23, 0xf9, 0xdb, 0xe3, 0xbf, 0x68, - 0x13, 0xa6, 0xd0, 0x01, 0xe4, 0x3d, 0x6f, 0x91, 0x10, 0x1f, 0xf9, 0x40, 0x89, 0x32, 0x5e, 0x4b, - 0x78, 0xbc, 0x44, 0x39, 0x79, 0x9e, 0x87, 0xb8, 0x9c, 0xc2, 0x0f, 0x5d, 0x5c, 0x4e, 0x11, 0xef, - 0x49, 0x82, 0xdb, 0x1f, 0x88, 0x44, 0xa3, 0xb6, 0x3f, 0x3a, 0xaa, 0x8d, 0xda, 0xfe, 0x98, 0xb0, - 0x56, 0x98, 0x42, 0xdf, 0x87, 0x05, 0x7f, 0xdd, 0x17, 0x5d, 0x4f, 0xac, 0x5f, 0xf3, 0x1b, 0x71, - 0xdd, 0x5e, 0x96, 0xfe, 0xaa, 0xa1, 0xcb, 0x32, 0xb2, 0x7a, 0xe9, 0xb2, 0x8c, 0x29, 0x36, 0x4e, - 0x59, 0xfe, 0xc9, 0x57, 0x0b, 0x73, 0xfd, 0x53, 0x54, 0x09, 0xcf, 0xf5, 0x4f, 0x91, 0x05, 0x34, - 0x61, 0x0a, 0x29, 0xb0, 0x1a, 0x5d, 0x8a, 0x41, 0xb7, 0xc6, 0xaa, 0x34, 0xf1, 0xaf, 0x8f, 0x22, - 0x73, 0xa6, 0xea, 0xc0, 0x52, 0xc4, 0x53, 0x31, 0x24, 0x24, 0xbe, 0x23, 0xa3, 0x93, 0xdc, 0x1c, - 0xe3, 0xad, 0x99, 0x40, 0x9c, 0xf9, 0x7f, 0xa5, 0xe1, 0x4a, 0x20, 0x9c, 0x47, 0xbf, 0xcb, 0xc1, - 0x46, 0x72, 0x76, 0x83, 0xee, 0xc6, 0xa4, 0x02, 0x31, 0x8a, 0x55, 0x1a, 0x97, 0xdc, 0x63, 0xdc, - 0xd7, 0x62, 0xc3, 0x49, 0xb4, 0x3d, 0x6e, 0xc4, 0xec, 0xd1, 0xe8, 0x51, 0xb1, 0x29, 0xd9, 0x0e, - 0x6b, 0xda, 0xd8, 0x80, 0x03, 0x6d, 0x8f, 0x1b, 0x13, 0xb9, 0xd3, 0x8e, 0x8e, 0x5e, 0xc8, 0xb4, - 0x3d, 0x58, 0x8d, 0xbe, 0xbd, 0xd1, 0xad, 0xb1, 0x42, 0x0b, 0x57, 0xab, 0x92, 0x83, 0x00, 0x32, - 0x1b, 0x49, 0xa6, 0xee, 0xff, 0x5b, 0x16, 0x32, 0x04, 0x14, 0x69, 0xc3, 0x95, 0x40, 0xa1, 0x05, - 0x6d, 0x24, 0x97, 0x9f, 0xf8, 0x1b, 0xb1, 0xfd, 0xce, 0xf9, 0x3d, 0x83, 0xc5, 0x50, 0xe9, 0x04, - 0x6d, 0x7a, 0xc7, 0x45, 0x95, 0x6f, 0xf8, 0xad, 0x04, 0x8a, 0x20, 0x6f, 0xff, 0xa5, 0xb6, 0x39, - 0x0a, 0xdb, 0xf7, 0xf3, 0x8e, 0xbb, 0xc8, 0x3e, 0xa3, 0x18, 0x54, 0xf0, 0x0a, 0x13, 0xfc, 0x72, - 0x45, 0x5e, 0x5e, 0x37, 0x13, 0x69, 0x9c, 0x19, 0x3e, 0x75, 0xc0, 0x2f, 0x0f, 0xb4, 0x8c, 0x7c, - 0xc2, 0x45, 0x42, 0xe0, 0xbc, 0x90, 0x44, 0xe2, 0xb0, 0xff, 0x04, 0x0a, 0x41, 0x14, 0x04, 0xdd, - 0x18, 0x01, 0xca, 0xf0, 0x9b, 0xf1, 0x04, 0xc1, 0x9d, 0x09, 0x7a, 0x82, 0xa0, 0x54, 0x51, 0xe6, - 0x7f, 0x33, 0x91, 0xc6, 0x7b, 0x1f, 0x7a, 0xf0, 0x3f, 0xf7, 0x3e, 0x0c, 0x63, 0x85, 0xee, 0x7d, - 0x18, 0x01, 0x18, 0x0a, 0x53, 0x3b, 0x0f, 0x00, 0xe4, 0xde, 0xe0, 0xb9, 0x2c, 0x61, 0x75, 0xd8, - 0x47, 0xeb, 0xa1, 0x0c, 0xad, 0xaa, 0x0e, 0xfb, 0xcd, 0x81, 0x95, 0x98, 0x19, 0xc5, 0xbf, 0x9a, - 0x21, 0x69, 0xd8, 0x2c, 0x19, 0x60, 0x75, 0xec, 0xd4, 0xa1, 0xe0, 0x8e, 0x96, 0x48, 0xa0, 0x8d, - 0xb6, 0x22, 0x79, 0x90, 0x97, 0x91, 0x01, 0x46, 0x0b, 0x0e, 0x23, 0xd2, 0xbb, 0xf3, 0x11, 0x40, - 0xc7, 0x50, 0x24, 0x1a, 0xe9, 0xa3, 0xeb, 0x21, 0x3e, 0x0f, 0x15, 0xdc, 0xeb, 0xda, 0x3c, 0xfe, - 0x92, 0x09, 0xd3, 0x31, 0x14, 0x9a, 0x0f, 0xec, 0x7c, 0x17, 0xf2, 0x54, 0x98, 0x13, 0x8b, 0x6e, - 0xd4, 0x78, 0x26, 0x03, 0x5d, 0x3d, 0xe9, 0xd9, 0xa9, 0xc2, 0x3c, 0x65, 0xc0, 0xe0, 0x74, 0x74, - 0x23, 0xc4, 0xe2, 0x31, 0xed, 0x09, 0x30, 0x99, 0x23, 0xc3, 0x58, 0xdf, 0x4e, 0x05, 0xe6, 0x6c, - 0x36, 0xe6, 0x73, 0xad, 0x8b, 0x36, 0x22, 0xb8, 0x58, 0x1d, 0x01, 0x26, 0x79, 0xc6, 0xc4, 0xea, - 0x72, 0x45, 0xb1, 0xff, 0x2b, 0x8f, 0xb0, 0x28, 0x0c, 0x4b, 0x8a, 0x14, 0x85, 0xf5, 0x55, 0xb2, - 0xcf, 0xd2, 0x1d, 0x43, 0x39, 0xce, 0x91, 0x41, 0xdf, 0xfa, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x9c, 0xd2, 0x9c, 0x51, 0x77, 0x46, 0x00, 0x00, + 0x15, 0xdb, 0xb0, 0x95, 0x30, 0x3f, 0x55, 0x2a, 0x4a, 0xf9, 0x65, 0x8a, 0xfc, 0x8e, 0xed, 0xff, + 0x6e, 0xc7, 0xe2, 0x91, 0xc6, 0x44, 0x31, 0x5e, 0xe9, 0x76, 0x29, 0xb0, 0x11, 0x37, 0xf9, 0x25, + 0x1b, 0xe0, 0xfd, 0xff, 0xe6, 0x60, 0xa6, 0xd6, 0xc5, 0xaa, 0x49, 0xa3, 0x80, 0x79, 0xdf, 0x2f, + 0x1a, 0xd1, 0x7a, 0xcc, 0x0f, 0x1d, 0xc9, 0x16, 0xf0, 0xd7, 0x13, 0x7f, 0x06, 0x29, 0x4c, 0xa1, + 0x13, 0xcf, 0xaf, 0x31, 0x7d, 0xef, 0x03, 0x5e, 0x0b, 0x8d, 0x8c, 0xb8, 0x9c, 0xf9, 0x5b, 0x23, + 0xa8, 0x9c, 0x79, 0xde, 0x87, 0x2c, 0xf9, 0x75, 0x1a, 0x5a, 0x76, 0x7e, 0x21, 0xe7, 0xf9, 0xf1, + 0x1a, 0xbf, 0x12, 0x68, 0xb5, 0xc7, 0xdd, 0xff, 0xc7, 0x59, 0x00, 0xf7, 0xfa, 0x43, 0x8f, 0x60, + 0xce, 0xeb, 0xfa, 0xd0, 0x5a, 0xc2, 0xcf, 0xb3, 0xf8, 0xf5, 0xe8, 0x4e, 0x47, 0xa6, 0x47, 0x30, + 0xe7, 0x55, 0x79, 0x97, 0x59, 0xc4, 0xeb, 0x6c, 0x97, 0x59, 0xe4, 0x63, 0xea, 0x29, 0xd4, 0x83, + 0xab, 0x31, 0x6f, 0x63, 0xd1, 0xeb, 0xe3, 0xbd, 0x20, 0xe6, 0xdf, 0x18, 0xf3, 0x91, 0xad, 0x30, + 0x85, 0x74, 0xb8, 0x16, 0xfb, 0x24, 0x14, 0x6d, 0x8f, 0xfb, 0x60, 0x95, 0x7f, 0x73, 0x0c, 0x4a, + 0x67, 0xce, 0x21, 0xf0, 0xf1, 0xef, 0xd0, 0xd0, 0x9b, 0x63, 0x3f, 0x90, 0xe4, 0x6f, 0x8f, 0xff, + 0xac, 0x4d, 0x98, 0x42, 0x07, 0x90, 0xf7, 0x3c, 0x48, 0x42, 0x7c, 0xe4, 0x2b, 0x25, 0xca, 0x78, + 0x2d, 0xe1, 0x05, 0x13, 0xe5, 0xe4, 0x79, 0x23, 0xe2, 0x72, 0x0a, 0xbf, 0x76, 0x71, 0x39, 0x45, + 0x3c, 0x2a, 0x09, 0x6e, 0x7f, 0x20, 0x1c, 0x8d, 0xda, 0xfe, 0xe8, 0xd0, 0x36, 0x6a, 0xfb, 0x63, + 0x62, 0x5b, 0x61, 0x0a, 0x7d, 0x1f, 0x16, 0xfc, 0xc5, 0x5f, 0x74, 0x3d, 0xb1, 0x88, 0xcd, 0x6f, + 0xc4, 0x75, 0x7b, 0x59, 0xfa, 0x4b, 0x87, 0x2e, 0xcb, 0xc8, 0x12, 0xa6, 0xcb, 0x32, 0xa6, 0xe2, + 0x38, 0x65, 0xf9, 0x27, 0x5f, 0x41, 0xcc, 0xf5, 0x4f, 0x51, 0x75, 0x3c, 0xd7, 0x3f, 0x45, 0x56, + 0xd1, 0x84, 0x29, 0xa4, 0xc0, 0x6a, 0x74, 0x3d, 0x06, 0xdd, 0x1a, 0xab, 0xdc, 0xc4, 0xbf, 0x3e, + 0x8a, 0xcc, 0x99, 0xaa, 0x03, 0x4b, 0x11, 0xef, 0xc5, 0x90, 0x90, 0xf8, 0x98, 0x8c, 0x4e, 0x72, + 0x73, 0x8c, 0x07, 0x67, 0x02, 0x71, 0xe6, 0xff, 0x95, 0x86, 0x2b, 0x81, 0x98, 0x1e, 0xfd, 0x2e, + 0x07, 0x1b, 0xc9, 0x29, 0x0e, 0xba, 0x1b, 0x93, 0x0f, 0xc4, 0x28, 0x56, 0x69, 0x5c, 0x72, 0x8f, + 0x71, 0x5f, 0x8b, 0x8d, 0x29, 0xd1, 0xf6, 0xb8, 0x61, 0xb3, 0x47, 0xa3, 0x47, 0x05, 0xa8, 0x64, + 0x3b, 0xac, 0x69, 0x63, 0xa3, 0x0e, 0xb4, 0x3d, 0x6e, 0x60, 0xe4, 0x4e, 0x3b, 0x32, 0x84, 0xa1, + 0xd3, 0xf6, 0x60, 0x35, 0xfa, 0xf6, 0x46, 0xb7, 0xc6, 0x0a, 0x2d, 0x5c, 0xad, 0x4a, 0x0e, 0x02, + 0xc8, 0x6c, 0x24, 0xa3, 0xba, 0xff, 0x6f, 0x59, 0xc8, 0x10, 0x64, 0xa4, 0x0d, 0x57, 0x02, 0xd5, + 0x16, 0xb4, 0x91, 0x5c, 0x83, 0xe2, 0x6f, 0xc4, 0xf6, 0x3b, 0xe7, 0xf7, 0x0c, 0x16, 0x43, 0xf5, + 0x13, 0xb4, 0xe9, 0x1d, 0x17, 0x55, 0xc3, 0xe1, 0xb7, 0x12, 0x28, 0x82, 0xbc, 0xfd, 0x97, 0xda, + 0xe6, 0x28, 0x80, 0xdf, 0xcf, 0x3b, 0xee, 0x22, 0xfb, 0x8c, 0x02, 0x51, 0xc1, 0x2b, 0x4c, 0xf0, + 0xcb, 0x15, 0x79, 0x79, 0xdd, 0x4c, 0xa4, 0x71, 0x66, 0xf8, 0xd4, 0x41, 0xc0, 0x3c, 0xf8, 0x32, + 0xf2, 0x09, 0x17, 0x89, 0x83, 0xf3, 0x42, 0x12, 0x89, 0xc3, 0xfe, 0x13, 0x28, 0x04, 0xa1, 0x10, + 0x74, 0x63, 0x04, 0x32, 0xc3, 0x6f, 0xc6, 0x13, 0x04, 0x77, 0x26, 0xe8, 0x09, 0x82, 0x52, 0x45, + 0x99, 0xff, 0xcd, 0x44, 0x1a, 0xef, 0x7d, 0xe8, 0x01, 0x01, 0xdd, 0xfb, 0x30, 0x0c, 0x18, 0xba, + 0xf7, 0x61, 0x04, 0x6a, 0x28, 0x4c, 0xed, 0x3c, 0x00, 0x90, 0x7b, 0x83, 0xe7, 0xb2, 0x84, 0xd5, + 0x61, 0x1f, 0xad, 0x87, 0xd2, 0xb4, 0xaa, 0x3a, 0xec, 0x37, 0x07, 0x56, 0x76, 0x66, 0x14, 0xff, + 0x6a, 0x86, 0xe4, 0x62, 0xb3, 0x64, 0x80, 0xd5, 0xb1, 0x53, 0x87, 0x82, 0x3b, 0x5a, 0x22, 0x81, + 0x36, 0xda, 0x8a, 0xe4, 0x41, 0x9e, 0x47, 0x06, 0x18, 0x2d, 0x38, 0x8c, 0x48, 0xef, 0xce, 0x47, + 0x00, 0x1d, 0x43, 0x91, 0x68, 0xa4, 0x8f, 0xae, 0x87, 0xf8, 0x3c, 0x54, 0x70, 0xaf, 0x6b, 0xf3, + 0xf8, 0x4b, 0x26, 0x4c, 0xc7, 0x50, 0x68, 0x3e, 0xb0, 0xf3, 0x5d, 0xc8, 0x53, 0x61, 0x4e, 0x2c, + 0xba, 0x51, 0xe3, 0x99, 0x0c, 0x74, 0xf5, 0xa4, 0x67, 0xa7, 0x0a, 0xf3, 0x94, 0x01, 0xc3, 0xd4, + 0xd1, 0x8d, 0x10, 0x8b, 0xc7, 0xb4, 0x27, 0xc0, 0x64, 0x8e, 0x0c, 0x63, 0x7d, 0x3b, 0x15, 0x98, + 0xb3, 0xd9, 0x98, 0xcf, 0xb5, 0x2e, 0xda, 0x88, 0xe0, 0x62, 0x75, 0x04, 0x98, 0xe4, 0x19, 0x13, + 0xab, 0xcb, 0x15, 0xc5, 0xfe, 0xff, 0x3c, 0xc2, 0xa2, 0x30, 0x40, 0x29, 0x52, 0x14, 0xd6, 0x57, + 0xc9, 0x3e, 0x4b, 0x77, 0x0c, 0xe5, 0x38, 0x47, 0x06, 0x7d, 0xeb, 0x7f, 0x03, 0x00, 0x00, 0xff, + 0xff, 0x32, 0x3b, 0xcf, 0x0e, 0x7c, 0x46, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/spec.md b/spec.md index 78bd5f27..af8cf150 100644 --- a/spec.md +++ b/spec.md @@ -1973,7 +1973,8 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Condition | gRPC Code | Description | Recovery Behavior | |-----------|-----------|-------------|-------------------| -| Snapshot in use | 9 FAILED_PRECONDITION | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is in use by another resource or it is part of a group snapshot and CAN NOT be deleted stand alone. | Caller SHOULD ensure that there are no other resources using the snapshot, and then retry with exponential back off. | +| Snapshot is part of a group | 3 INVALID_ARGUMENT | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is part of a group snapshot and CAN NOT be deleted stand alone. | Caller SHOULD stop calling DeleteSnapshot and call DeleteVolumeGroupSnapshot instead. | +| Snapshot in use | 9 FAILED_PRECONDITION | Indicates that the snapshot corresponding to the specified `snapshot_id` could not be deleted because it is in use by another resource. | Caller SHOULD ensure that there are no other resources using the snapshot, and then retry with exponential back off. | | Operation pending for snapshot | 10 ABORTED | Indicates that there is already an operation pending for the specified snapshot. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per snapshot at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same snapshot. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified snapshot, and then retry with exponential back off. | @@ -2985,6 +2986,7 @@ message DeleteVolumeGroupSnapshotRequest { message DeleteVolumeGroupSnapshotResponse { // Intentionally empty. + option (alpha_message) = true; } ```