diff --git a/assets/swagger.json b/assets/swagger.json index e63eaa24c3..0f5bdcd069 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -1473,10 +1473,11 @@ } }, "post": { + "description": "Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is\nmaintained for backward compatibility. It will be removed in a future release.", "tags": [ "ApplicationService" ], - "summary": "RunResourceAction run resource action", + "summary": "RunResourceAction runs a resource action", "operationId": "ApplicationService_RunResourceAction", "parameters": [ { @@ -1490,7 +1491,81 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/applicationResourceActionRunRequest" + "type": "string" + } + }, + { + "type": "string", + "name": "namespace", + "in": "query" + }, + { + "type": "string", + "name": "resourceName", + "in": "query" + }, + { + "type": "string", + "name": "version", + "in": "query" + }, + { + "type": "string", + "name": "group", + "in": "query" + }, + { + "type": "string", + "name": "kind", + "in": "query" + }, + { + "type": "string", + "name": "appNamespace", + "in": "query" + }, + { + "type": "string", + "name": "project", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationApplicationResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, + "/api/v1/applications/{name}/resource/actions/v2": { + "post": { + "tags": [ + "ApplicationService" + ], + "summary": "RunResourceActionV2 runs a resource action with parameters", + "operationId": "ApplicationService_RunResourceActionV2", + "parameters": [ + { + "type": "string", + "name": "name", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/applicationResourceActionRunRequestV2" } } ], @@ -5127,7 +5202,7 @@ } } }, - "applicationResourceActionRunRequest": { + "applicationResourceActionRunRequestV2": { "type": "object", "properties": { "action": { diff --git a/cmd/argocd/commands/app_actions.go b/cmd/argocd/commands/app_actions.go index b863c1fd73..7551d2f783 100644 --- a/cmd/argocd/commands/app_actions.go +++ b/cmd/argocd/commands/app_actions.go @@ -8,23 +8,23 @@ import ( "strconv" "text/tabwriter" - "github.com/argoproj/argo-cd/v3/util/templates" - - "github.com/argoproj/argo-cd/v3/cmd/util" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "google.golang.org/grpc/codes" "k8s.io/utils/ptr" "sigs.k8s.io/yaml" "github.com/argoproj/argo-cd/v3/cmd/argocd/commands/headless" + "github.com/argoproj/argo-cd/v3/cmd/util" argocdclient "github.com/argoproj/argo-cd/v3/pkg/apiclient" applicationpkg "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" "github.com/argoproj/argo-cd/v3/pkg/apis/application" "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" "github.com/argoproj/argo-cd/v3/util/argo" "github.com/argoproj/argo-cd/v3/util/errors" + "github.com/argoproj/argo-cd/v3/util/grpc" utilio "github.com/argoproj/argo-cd/v3/util/io" + "github.com/argoproj/argo-cd/v3/util/templates" ) type DisplayedAction struct { @@ -192,7 +192,26 @@ func NewApplicationResourceActionsRunCommand(clientOpts *argocdclient.ClientOpti obj := filteredObjects[i] gvk := obj.GroupVersionKind() objResourceName := obj.GetName() - _, err := appIf.RunResourceAction(ctx, &applicationpkg.ResourceActionRunRequest{ + _, err := appIf.RunResourceActionV2(ctx, &applicationpkg.ResourceActionRunRequestV2{ + Name: &appName, + AppNamespace: &appNs, + Namespace: ptr.To(obj.GetNamespace()), + ResourceName: ptr.To(objResourceName), + Group: ptr.To(gvk.Group), + Kind: ptr.To(gvk.Kind), + Version: ptr.To(gvk.GroupVersion().Version), + Action: ptr.To(actionName), + // TODO: add support for parameters + }) + if err == nil { + continue + } + if grpc.UnwrapGRPCStatus(err).Code() != codes.Unimplemented { + errors.CheckError(err) + } + fmt.Println("RunResourceActionV2 is not supported by the server, falling back to RunResourceAction.") + //nolint:staticcheck // RunResourceAction is deprecated, but we still need to support it for backward compatibility. + _, err = appIf.RunResourceAction(ctx, &applicationpkg.ResourceActionRunRequest{ Name: &appName, AppNamespace: &appNs, Namespace: ptr.To(obj.GetNamespace()), diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index b8ba312fba..459e2a6cda 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -2228,10 +2228,15 @@ func (c *fakeAppServiceClient) ListResourceActions(_ context.Context, _ *applica return nil, nil } +// nolint:staticcheck // ResourceActionRunRequest is deprecated, but we still need to implement it to satisfy the server interface. func (c *fakeAppServiceClient) RunResourceAction(_ context.Context, _ *applicationpkg.ResourceActionRunRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationResponse, error) { return nil, nil } +func (c *fakeAppServiceClient) RunResourceActionV2(_ context.Context, _ *applicationpkg.ResourceActionRunRequestV2, _ ...grpc.CallOption) (*applicationpkg.ApplicationResponse, error) { + return nil, nil +} + func (c *fakeAppServiceClient) DeleteResource(_ context.Context, _ *applicationpkg.ApplicationResourceDeleteRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationResponse, error) { return nil, nil } diff --git a/docs/operator-manual/upgrading/3.0-3.1.md b/docs/operator-manual/upgrading/3.0-3.1.md index 34b85a4309..f53c3ae22e 100644 --- a/docs/operator-manual/upgrading/3.0-3.1.md +++ b/docs/operator-manual/upgrading/3.0-3.1.md @@ -20,6 +20,28 @@ The `--staticassets` directory in the API server (`/app/shared` by default) is n symlinks. This is to help protect against symlink attacks. If you have any symlinks in your `--staticassets` directory to a location outside the directory, they will return a 500 error starting with 3.1. +## v1 Actions API Deprecated + +The `/api/v1/applications/{name}/resource/actions` endpoint is deprecated in favor of `/api/v1/applications/{name}/resource/actions/v2`. + +This endpoint allows API users to run a custom resource action on a specific resource in an application. + +The old endpoint accepted various parameters as query parameters. The POST body was the action name. + +The new endpoint accepts all parameters as part of the POST body as a JSON object. The new endpoint also supports a new +`resourceActionParameters` field to parameterize action runs. + +The old endpoint will be removed in a future release, so users should migrate to the new endpoint as soon as possible. +API clients will just need to change the endpoint URL and switch query string parameters to a JSON body. + +If the old endpoint is used, the API will log a warning message: + +> RunResourceAction was called. RunResourceAction is deprecated and will be removed in a future release. Use RunResourceActionV2 instead. + +The CLI will fall back to the old endpoint if the new one is not available. If it falls back, it will log a warning message: + +> RunResourceActionV2 is not supported by the server, falling back to RunResourceAction. + ## OpenID Connect authorization code flow with PKCE is now handled by the server instead of the UI Previously, when PKCE was enabled, the authorization code flow (the process which happens when you log in to Argo CD using OpenID Connect) was handled by the UI, whereas this flow was handled by the server if PKCE was not enabled. The server now always handles this flow, PKCE being enabled or not. diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index 61bceaedcb..76b7859f2f 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -1772,20 +1772,23 @@ func (m *ResourceActionParameters) GetValue() string { return "" } +// ResourceActionRunRequest is a request to run a resource action. +// This message is deprecated and replaced by ResourceActionRunRequestV2. +// +// Deprecated: Do not use. type ResourceActionRunRequest struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` - ResourceName *string `protobuf:"bytes,3,req,name=resourceName" json:"resourceName,omitempty"` - Version *string `protobuf:"bytes,4,req,name=version" json:"version,omitempty"` - Group *string `protobuf:"bytes,5,opt,name=group" json:"group,omitempty"` - Kind *string `protobuf:"bytes,6,req,name=kind" json:"kind,omitempty"` - Action *string `protobuf:"bytes,7,req,name=action" json:"action,omitempty"` - AppNamespace *string `protobuf:"bytes,8,opt,name=appNamespace" json:"appNamespace,omitempty"` - Project *string `protobuf:"bytes,9,opt,name=project" json:"project,omitempty"` - ResourceActionParameters []*ResourceActionParameters `protobuf:"bytes,10,rep,name=resourceActionParameters" json:"resourceActionParameters,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + ResourceName *string `protobuf:"bytes,3,req,name=resourceName" json:"resourceName,omitempty"` + Version *string `protobuf:"bytes,4,req,name=version" json:"version,omitempty"` + Group *string `protobuf:"bytes,5,opt,name=group" json:"group,omitempty"` + Kind *string `protobuf:"bytes,6,req,name=kind" json:"kind,omitempty"` + Action *string `protobuf:"bytes,7,req,name=action" json:"action,omitempty"` + AppNamespace *string `protobuf:"bytes,8,opt,name=appNamespace" json:"appNamespace,omitempty"` + Project *string `protobuf:"bytes,9,opt,name=project" json:"project,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ResourceActionRunRequest) Reset() { *m = ResourceActionRunRequest{} } @@ -1884,7 +1887,119 @@ func (m *ResourceActionRunRequest) GetProject() string { return "" } -func (m *ResourceActionRunRequest) GetResourceActionParameters() []*ResourceActionParameters { +type ResourceActionRunRequestV2 struct { + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + ResourceName *string `protobuf:"bytes,3,req,name=resourceName" json:"resourceName,omitempty"` + Version *string `protobuf:"bytes,4,req,name=version" json:"version,omitempty"` + Group *string `protobuf:"bytes,5,opt,name=group" json:"group,omitempty"` + Kind *string `protobuf:"bytes,6,req,name=kind" json:"kind,omitempty"` + Action *string `protobuf:"bytes,7,req,name=action" json:"action,omitempty"` + AppNamespace *string `protobuf:"bytes,8,opt,name=appNamespace" json:"appNamespace,omitempty"` + Project *string `protobuf:"bytes,9,opt,name=project" json:"project,omitempty"` + ResourceActionParameters []*ResourceActionParameters `protobuf:"bytes,10,rep,name=resourceActionParameters" json:"resourceActionParameters,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResourceActionRunRequestV2) Reset() { *m = ResourceActionRunRequestV2{} } +func (m *ResourceActionRunRequestV2) String() string { return proto.CompactTextString(m) } +func (*ResourceActionRunRequestV2) ProtoMessage() {} +func (*ResourceActionRunRequestV2) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{22} +} +func (m *ResourceActionRunRequestV2) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceActionRunRequestV2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResourceActionRunRequestV2.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResourceActionRunRequestV2) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceActionRunRequestV2.Merge(m, src) +} +func (m *ResourceActionRunRequestV2) XXX_Size() int { + return m.Size() +} +func (m *ResourceActionRunRequestV2) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceActionRunRequestV2.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceActionRunRequestV2 proto.InternalMessageInfo + +func (m *ResourceActionRunRequestV2) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetNamespace() string { + if m != nil && m.Namespace != nil { + return *m.Namespace + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetResourceName() string { + if m != nil && m.ResourceName != nil { + return *m.ResourceName + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetGroup() string { + if m != nil && m.Group != nil { + return *m.Group + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetKind() string { + if m != nil && m.Kind != nil { + return *m.Kind + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetAction() string { + if m != nil && m.Action != nil { + return *m.Action + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetAppNamespace() string { + if m != nil && m.AppNamespace != nil { + return *m.AppNamespace + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetProject() string { + if m != nil && m.Project != nil { + return *m.Project + } + return "" +} + +func (m *ResourceActionRunRequestV2) GetResourceActionParameters() []*ResourceActionParameters { if m != nil { return m.ResourceActionParameters } @@ -1902,7 +2017,7 @@ func (m *ResourceActionsListResponse) Reset() { *m = ResourceActionsList func (m *ResourceActionsListResponse) String() string { return proto.CompactTextString(m) } func (*ResourceActionsListResponse) ProtoMessage() {} func (*ResourceActionsListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{22} + return fileDescriptor_df6e82b174b5eaec, []int{23} } func (m *ResourceActionsListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1949,7 +2064,7 @@ func (m *ApplicationResourceResponse) Reset() { *m = ApplicationResource func (m *ApplicationResourceResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceResponse) ProtoMessage() {} func (*ApplicationResourceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{23} + return fileDescriptor_df6e82b174b5eaec, []int{24} } func (m *ApplicationResourceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2012,7 +2127,7 @@ func (m *ApplicationPodLogsQuery) Reset() { *m = ApplicationPodLogsQuery func (m *ApplicationPodLogsQuery) String() string { return proto.CompactTextString(m) } func (*ApplicationPodLogsQuery) ProtoMessage() {} func (*ApplicationPodLogsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{24} + return fileDescriptor_df6e82b174b5eaec, []int{25} } func (m *ApplicationPodLogsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2176,7 +2291,7 @@ func (m *LogEntry) Reset() { *m = LogEntry{} } func (m *LogEntry) String() string { return proto.CompactTextString(m) } func (*LogEntry) ProtoMessage() {} func (*LogEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{25} + return fileDescriptor_df6e82b174b5eaec, []int{26} } func (m *LogEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2253,7 +2368,7 @@ func (m *OperationTerminateRequest) Reset() { *m = OperationTerminateReq func (m *OperationTerminateRequest) String() string { return proto.CompactTextString(m) } func (*OperationTerminateRequest) ProtoMessage() {} func (*OperationTerminateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{26} + return fileDescriptor_df6e82b174b5eaec, []int{27} } func (m *OperationTerminateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2316,7 +2431,7 @@ func (m *ApplicationSyncWindowsQuery) Reset() { *m = ApplicationSyncWind func (m *ApplicationSyncWindowsQuery) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindowsQuery) ProtoMessage() {} func (*ApplicationSyncWindowsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{27} + return fileDescriptor_df6e82b174b5eaec, []int{28} } func (m *ApplicationSyncWindowsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2379,7 +2494,7 @@ func (m *ApplicationSyncWindowsResponse) Reset() { *m = ApplicationSyncW func (m *ApplicationSyncWindowsResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindowsResponse) ProtoMessage() {} func (*ApplicationSyncWindowsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{28} + return fileDescriptor_df6e82b174b5eaec, []int{29} } func (m *ApplicationSyncWindowsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2443,7 +2558,7 @@ func (m *ApplicationSyncWindow) Reset() { *m = ApplicationSyncWindow{} } func (m *ApplicationSyncWindow) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindow) ProtoMessage() {} func (*ApplicationSyncWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{29} + return fileDescriptor_df6e82b174b5eaec, []int{30} } func (m *ApplicationSyncWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2510,7 +2625,7 @@ func (m *OperationTerminateResponse) Reset() { *m = OperationTerminateRe func (m *OperationTerminateResponse) String() string { return proto.CompactTextString(m) } func (*OperationTerminateResponse) ProtoMessage() {} func (*OperationTerminateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{30} + return fileDescriptor_df6e82b174b5eaec, []int{31} } func (m *OperationTerminateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2557,7 +2672,7 @@ func (m *ResourcesQuery) Reset() { *m = ResourcesQuery{} } func (m *ResourcesQuery) String() string { return proto.CompactTextString(m) } func (*ResourcesQuery) ProtoMessage() {} func (*ResourcesQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{31} + return fileDescriptor_df6e82b174b5eaec, []int{32} } func (m *ResourcesQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2653,7 +2768,7 @@ func (m *ManagedResourcesResponse) Reset() { *m = ManagedResourcesRespon func (m *ManagedResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ManagedResourcesResponse) ProtoMessage() {} func (*ManagedResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{32} + return fileDescriptor_df6e82b174b5eaec, []int{33} } func (m *ManagedResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2703,7 +2818,7 @@ func (m *LinkInfo) Reset() { *m = LinkInfo{} } func (m *LinkInfo) String() string { return proto.CompactTextString(m) } func (*LinkInfo) ProtoMessage() {} func (*LinkInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{33} + return fileDescriptor_df6e82b174b5eaec, []int{34} } func (m *LinkInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2771,7 +2886,7 @@ func (m *LinksResponse) Reset() { *m = LinksResponse{} } func (m *LinksResponse) String() string { return proto.CompactTextString(m) } func (*LinksResponse) ProtoMessage() {} func (*LinksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{34} + return fileDescriptor_df6e82b174b5eaec, []int{35} } func (m *LinksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2820,7 +2935,7 @@ func (m *ListAppLinksRequest) Reset() { *m = ListAppLinksRequest{} } func (m *ListAppLinksRequest) String() string { return proto.CompactTextString(m) } func (*ListAppLinksRequest) ProtoMessage() {} func (*ListAppLinksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{35} + return fileDescriptor_df6e82b174b5eaec, []int{36} } func (m *ListAppLinksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2893,6 +3008,7 @@ func init() { proto.RegisterType((*ApplicationResourceDeleteRequest)(nil), "application.ApplicationResourceDeleteRequest") proto.RegisterType((*ResourceActionParameters)(nil), "application.ResourceActionParameters") proto.RegisterType((*ResourceActionRunRequest)(nil), "application.ResourceActionRunRequest") + proto.RegisterType((*ResourceActionRunRequestV2)(nil), "application.ResourceActionRunRequestV2") proto.RegisterType((*ResourceActionsListResponse)(nil), "application.ResourceActionsListResponse") proto.RegisterType((*ApplicationResourceResponse)(nil), "application.ApplicationResourceResponse") proto.RegisterType((*ApplicationPodLogsQuery)(nil), "application.ApplicationPodLogsQuery") @@ -2914,185 +3030,188 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2833 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4f, 0x8f, 0x1c, 0x47, - 0x15, 0xa7, 0x66, 0x76, 0x76, 0x67, 0xdf, 0x78, 0xbd, 0x76, 0xc5, 0x5e, 0x3a, 0xe3, 0x8d, 0x99, - 0xb4, 0xbd, 0xf1, 0x64, 0xed, 0x9d, 0xb1, 0x37, 0x01, 0x92, 0x4d, 0x02, 0x38, 0x6b, 0xc7, 0x59, - 0x58, 0x3b, 0xa6, 0xd7, 0xc1, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xd3, 0x6c, 0x4f, 0x77, 0xbb, - 0xbb, 0x67, 0xc2, 0x2a, 0xe4, 0x12, 0xc4, 0x2d, 0x02, 0x01, 0x41, 0xe2, 0x80, 0x02, 0x4a, 0x14, - 0x09, 0x21, 0x10, 0x17, 0x84, 0x90, 0x10, 0x12, 0x1c, 0x82, 0xe0, 0x80, 0x14, 0xc1, 0x17, 0x40, - 0x11, 0xe2, 0x06, 0x5c, 0x72, 0x46, 0xa8, 0xaa, 0xab, 0xba, 0xab, 0xe7, 0x4f, 0xcf, 0x2c, 0x33, - 0x28, 0xb9, 0xf5, 0xab, 0xa9, 0x7a, 0xef, 0xf7, 0x5e, 0xbd, 0x7a, 0xef, 0xd5, 0xab, 0x81, 0xf3, - 0x21, 0x0d, 0x7a, 0x34, 0x68, 0x12, 0xdf, 0x77, 0x6c, 0x93, 0x44, 0xb6, 0xe7, 0xaa, 0xdf, 0x0d, - 0x3f, 0xf0, 0x22, 0x0f, 0x57, 0x94, 0xa1, 0xea, 0x6a, 0xcb, 0xf3, 0x5a, 0x0e, 0x6d, 0x12, 0xdf, - 0x6e, 0x12, 0xd7, 0xf5, 0x22, 0x3e, 0x1c, 0xc6, 0x53, 0xab, 0xfa, 0xc1, 0x63, 0x61, 0xc3, 0xf6, - 0xf8, 0xaf, 0xa6, 0x17, 0xd0, 0x66, 0xef, 0x4a, 0xb3, 0x45, 0x5d, 0x1a, 0x90, 0x88, 0x5a, 0x62, - 0xce, 0xa3, 0xe9, 0x9c, 0x0e, 0x31, 0xdb, 0xb6, 0x4b, 0x83, 0xc3, 0xa6, 0x7f, 0xd0, 0x62, 0x03, - 0x61, 0xb3, 0x43, 0x23, 0x32, 0x6c, 0xd5, 0x6e, 0xcb, 0x8e, 0xda, 0xdd, 0x17, 0x1b, 0xa6, 0xd7, - 0x69, 0x92, 0xa0, 0xe5, 0xf9, 0x81, 0xf7, 0x55, 0xfe, 0xb1, 0x61, 0x5a, 0xcd, 0xde, 0x23, 0x29, - 0x03, 0x55, 0x97, 0xde, 0x15, 0xe2, 0xf8, 0x6d, 0x32, 0xc8, 0xed, 0xfa, 0x18, 0x6e, 0x01, 0xf5, - 0x3d, 0x61, 0x1b, 0xfe, 0x69, 0x47, 0x5e, 0x70, 0xa8, 0x7c, 0xc6, 0x6c, 0xf4, 0xf7, 0x11, 0x9c, - 0xb8, 0x9a, 0xca, 0xfb, 0x7c, 0x97, 0x06, 0x87, 0x18, 0xc3, 0x9c, 0x4b, 0x3a, 0x54, 0x43, 0x35, - 0x54, 0x5f, 0x34, 0xf8, 0x37, 0xd6, 0x60, 0x21, 0xa0, 0xfb, 0x01, 0x0d, 0xdb, 0x5a, 0x81, 0x0f, - 0x4b, 0x12, 0x57, 0xa1, 0xcc, 0x84, 0x53, 0x33, 0x0a, 0xb5, 0x62, 0xad, 0x58, 0x5f, 0x34, 0x12, - 0x1a, 0xd7, 0x61, 0x39, 0xa0, 0xa1, 0xd7, 0x0d, 0x4c, 0xfa, 0x05, 0x1a, 0x84, 0xb6, 0xe7, 0x6a, - 0x73, 0x7c, 0x75, 0xff, 0x30, 0xe3, 0x12, 0x52, 0x87, 0x9a, 0x91, 0x17, 0x68, 0x25, 0x3e, 0x25, - 0xa1, 0x19, 0x1e, 0x06, 0x5c, 0x9b, 0x8f, 0xf1, 0xb0, 0x6f, 0xac, 0xc3, 0x31, 0xe2, 0xfb, 0xb7, - 0x48, 0x87, 0x86, 0x3e, 0x31, 0xa9, 0xb6, 0xc0, 0x7f, 0xcb, 0x8c, 0x31, 0xcc, 0x02, 0x89, 0x56, - 0xe6, 0xc0, 0x24, 0xa9, 0x6f, 0xc3, 0xe2, 0x2d, 0xcf, 0xa2, 0xa3, 0xd5, 0xed, 0x67, 0x5f, 0x18, - 0x64, 0xaf, 0xbf, 0x83, 0xe0, 0xb4, 0x41, 0x7b, 0x36, 0xc3, 0x7f, 0x93, 0x46, 0xc4, 0x22, 0x11, - 0xe9, 0xe7, 0x58, 0x48, 0x38, 0x56, 0xa1, 0x1c, 0x88, 0xc9, 0x5a, 0x81, 0x8f, 0x27, 0xf4, 0x80, - 0xb4, 0x62, 0xbe, 0x32, 0xb1, 0x09, 0x25, 0x89, 0x6b, 0x50, 0x89, 0x6d, 0xb9, 0xe3, 0x5a, 0xf4, - 0x6b, 0xdc, 0x7a, 0x25, 0x43, 0x1d, 0xc2, 0xab, 0xb0, 0xd8, 0x8b, 0xed, 0xbc, 0x63, 0x71, 0x2b, - 0x96, 0x8c, 0x74, 0x40, 0xff, 0x07, 0x82, 0xb3, 0x8a, 0x0f, 0x18, 0x62, 0x67, 0xae, 0xf7, 0xa8, - 0x1b, 0x85, 0xa3, 0x15, 0xba, 0x04, 0x27, 0xe5, 0x26, 0xf6, 0xdb, 0x69, 0xf0, 0x07, 0xa6, 0xa2, - 0x3a, 0x28, 0x55, 0x54, 0xc7, 0x98, 0x22, 0x92, 0x7e, 0x7e, 0xe7, 0x9a, 0x50, 0x53, 0x1d, 0x1a, - 0x30, 0x54, 0x29, 0xdf, 0x50, 0xf3, 0x19, 0x43, 0xe9, 0xef, 0x22, 0xd0, 0x14, 0x45, 0x6f, 0x12, - 0xd7, 0xde, 0xa7, 0x61, 0x34, 0xe9, 0x9e, 0xa1, 0x19, 0xee, 0x59, 0x1d, 0x96, 0x63, 0xad, 0x6e, - 0xb3, 0xf3, 0xc8, 0xe2, 0x8f, 0x56, 0xaa, 0x15, 0xeb, 0x45, 0xa3, 0x7f, 0x98, 0xed, 0x9d, 0x94, - 0x19, 0x6a, 0xf3, 0xdc, 0x8d, 0xd3, 0x01, 0xfd, 0x41, 0x58, 0x7c, 0xc6, 0x76, 0xe8, 0x76, 0xbb, - 0xeb, 0x1e, 0xe0, 0x53, 0x50, 0x32, 0xd9, 0x07, 0xd7, 0xe1, 0x98, 0x11, 0x13, 0xfa, 0x77, 0x10, - 0x3c, 0x38, 0x4a, 0xeb, 0xbb, 0x76, 0xd4, 0x66, 0xeb, 0xc3, 0x51, 0xea, 0x9b, 0x6d, 0x6a, 0x1e, - 0x84, 0xdd, 0x8e, 0x74, 0x59, 0x49, 0x4f, 0xa7, 0xbe, 0xfe, 0x53, 0x04, 0xf5, 0xb1, 0x98, 0xee, - 0x06, 0xc4, 0xf7, 0x69, 0x80, 0x9f, 0x81, 0xd2, 0x3d, 0xf6, 0x03, 0x3f, 0xa0, 0x95, 0xcd, 0x46, - 0x43, 0x0d, 0xf0, 0x63, 0xb9, 0x3c, 0xfb, 0x11, 0x23, 0x5e, 0x8e, 0x1b, 0xd2, 0x3c, 0x05, 0xce, - 0x67, 0x25, 0xc3, 0x27, 0xb1, 0x22, 0x9b, 0xcf, 0xa7, 0x3d, 0x3d, 0x0f, 0x73, 0x3e, 0x09, 0x22, - 0xfd, 0x34, 0xdc, 0x97, 0x3d, 0x1e, 0xbe, 0xe7, 0x86, 0x54, 0xff, 0x4d, 0xd6, 0x9b, 0xb6, 0x03, - 0x4a, 0x22, 0x6a, 0xd0, 0x7b, 0x5d, 0x1a, 0x46, 0xf8, 0x00, 0xd4, 0x9c, 0xc3, 0xad, 0x5a, 0xd9, - 0xdc, 0x69, 0xa4, 0x41, 0xbb, 0x21, 0x83, 0x36, 0xff, 0xf8, 0xb2, 0x69, 0x35, 0x7a, 0x8f, 0x34, - 0xfc, 0x83, 0x56, 0x83, 0xa5, 0x80, 0x0c, 0x32, 0x99, 0x02, 0x54, 0x55, 0x0d, 0x95, 0x3b, 0x5e, - 0x81, 0xf9, 0xae, 0x1f, 0xd2, 0x20, 0xe2, 0x9a, 0x95, 0x0d, 0x41, 0xb1, 0xfd, 0xeb, 0x11, 0xc7, - 0xb6, 0x48, 0x14, 0xef, 0x4f, 0xd9, 0x48, 0x68, 0xfd, 0xb7, 0x59, 0xf4, 0xcf, 0xfb, 0xd6, 0x07, - 0x85, 0x5e, 0x45, 0x59, 0xc8, 0xa2, 0x54, 0x3d, 0xa8, 0x98, 0xf5, 0xa0, 0x5f, 0x66, 0xf1, 0x5f, - 0xa3, 0x0e, 0x4d, 0xf1, 0x0f, 0x73, 0x66, 0x0d, 0x16, 0x4c, 0x12, 0x9a, 0xc4, 0x92, 0x52, 0x24, - 0xc9, 0x02, 0x99, 0x1f, 0x78, 0x3e, 0x69, 0x71, 0x4e, 0xb7, 0x3d, 0xc7, 0x36, 0x0f, 0x85, 0xb8, - 0xc1, 0x1f, 0x06, 0x1c, 0x7f, 0x2e, 0xdf, 0xf1, 0x4b, 0x59, 0xd8, 0xe7, 0xa0, 0xb2, 0x77, 0xe8, - 0x9a, 0xcf, 0xf9, 0xf1, 0xe1, 0x3e, 0x05, 0x25, 0x3b, 0xa2, 0x9d, 0x50, 0x43, 0xfc, 0x60, 0xc7, - 0x84, 0xfe, 0x9f, 0x12, 0xac, 0x28, 0xba, 0xb1, 0x05, 0x79, 0x9a, 0xe5, 0x45, 0xa9, 0x15, 0x98, - 0xb7, 0x82, 0x43, 0xa3, 0xeb, 0x0a, 0x07, 0x10, 0x14, 0x13, 0xec, 0x07, 0x5d, 0x37, 0x86, 0x5f, - 0x36, 0x62, 0x02, 0xef, 0x43, 0x39, 0x8c, 0x58, 0x95, 0xd1, 0x3a, 0xe4, 0xc0, 0x2b, 0x9b, 0x9f, - 0x9d, 0x6e, 0xd3, 0x19, 0xf4, 0x3d, 0xc1, 0xd1, 0x48, 0x78, 0xe3, 0x7b, 0x2c, 0xa6, 0xc5, 0x81, - 0x2e, 0xd4, 0x16, 0x6a, 0xc5, 0x7a, 0x65, 0x73, 0x6f, 0x7a, 0x41, 0xcf, 0xf9, 0xac, 0x42, 0x52, - 0x32, 0x98, 0x91, 0x4a, 0x61, 0x61, 0xb4, 0x23, 0xe2, 0x43, 0x28, 0xaa, 0x81, 0x74, 0x00, 0x7f, - 0x11, 0x4a, 0xb6, 0xbb, 0xef, 0x85, 0xda, 0x22, 0x07, 0xf3, 0xf4, 0x74, 0x60, 0x76, 0xdc, 0x7d, - 0xcf, 0x88, 0x19, 0xe2, 0x7b, 0xb0, 0x14, 0xd0, 0x28, 0x38, 0x94, 0x56, 0xd0, 0x80, 0xdb, 0xf5, - 0x73, 0xd3, 0x49, 0x30, 0x54, 0x96, 0x46, 0x56, 0x02, 0xde, 0x82, 0x4a, 0x98, 0xfa, 0x98, 0x56, - 0xe1, 0x02, 0xb5, 0x0c, 0x23, 0xc5, 0x07, 0x0d, 0x75, 0xf2, 0x80, 0x77, 0x1f, 0xcb, 0xf7, 0xee, - 0xa5, 0xb1, 0x59, 0xed, 0xf8, 0x04, 0x59, 0x6d, 0xb9, 0x3f, 0xab, 0xfd, 0x1b, 0xc1, 0xea, 0x40, - 0x70, 0xda, 0xf3, 0x69, 0xee, 0x31, 0x20, 0x30, 0x17, 0xfa, 0xd4, 0xe4, 0x99, 0xaa, 0xb2, 0x79, - 0x73, 0x66, 0xd1, 0x8a, 0xcb, 0xe5, 0xac, 0xf3, 0x02, 0xea, 0x94, 0x71, 0xe1, 0x47, 0x08, 0x3e, - 0xaa, 0xc8, 0xbc, 0x4d, 0x22, 0xb3, 0x9d, 0xa7, 0x2c, 0x3b, 0xbf, 0x6c, 0x8e, 0xc8, 0xcb, 0x31, - 0xc1, 0xac, 0xca, 0x3f, 0xee, 0x1c, 0xfa, 0x0c, 0x20, 0xfb, 0x25, 0x1d, 0x98, 0xb2, 0x78, 0xfa, - 0x19, 0x82, 0xaa, 0x1a, 0xc3, 0x3d, 0xc7, 0x79, 0x91, 0x98, 0x07, 0x79, 0x20, 0x8f, 0x43, 0xc1, - 0xb6, 0x38, 0xc2, 0xa2, 0x51, 0xb0, 0xad, 0x23, 0x06, 0xa3, 0x7e, 0xb8, 0xf3, 0xf9, 0x70, 0x17, - 0xb2, 0x70, 0xdf, 0xef, 0x83, 0x2b, 0x43, 0x42, 0x0e, 0xdc, 0x55, 0x58, 0x74, 0xfb, 0x0a, 0xd9, - 0x74, 0x60, 0x48, 0x01, 0x5b, 0x18, 0x28, 0x60, 0x35, 0x58, 0xe8, 0x25, 0xd7, 0x1c, 0xf6, 0xb3, - 0x24, 0x99, 0x8a, 0xad, 0xc0, 0xeb, 0xfa, 0xc2, 0xe8, 0x31, 0xc1, 0x50, 0x1c, 0xd8, 0x2e, 0x2b, - 0xc9, 0x39, 0x0a, 0xf6, 0x7d, 0xf4, 0x8b, 0x4d, 0x46, 0xed, 0x9f, 0x17, 0xe0, 0x63, 0x43, 0xd4, - 0x1e, 0xeb, 0x4f, 0x1f, 0x0e, 0xdd, 0x13, 0xaf, 0x5e, 0x18, 0xe9, 0xd5, 0xe5, 0x71, 0x5e, 0xbd, - 0x98, 0x6f, 0x2f, 0xc8, 0xda, 0xeb, 0x27, 0x05, 0xa8, 0x0d, 0xb1, 0xd7, 0xf8, 0x72, 0xe2, 0x43, - 0x63, 0xb0, 0x7d, 0x2f, 0x10, 0x5e, 0x52, 0x36, 0x62, 0x82, 0x9d, 0x33, 0x2f, 0xf0, 0xdb, 0xc4, - 0xe5, 0xde, 0x51, 0x36, 0x04, 0x35, 0xa5, 0xa9, 0xae, 0x81, 0x26, 0xcd, 0x73, 0xd5, 0x8c, 0x83, - 0x54, 0x40, 0x3a, 0x34, 0xa2, 0x41, 0x38, 0x2a, 0x44, 0xf5, 0x88, 0xd3, 0xa5, 0x32, 0x44, 0x71, - 0x42, 0xff, 0x67, 0xa1, 0x9f, 0x8d, 0xd1, 0x75, 0x3f, 0xfc, 0x86, 0x5e, 0x81, 0x79, 0xc2, 0xd1, - 0x0a, 0xd7, 0x14, 0xd4, 0x80, 0x49, 0xcb, 0xf9, 0x26, 0x5d, 0xcc, 0xe6, 0x4b, 0x02, 0x5a, 0x30, - 0xc2, 0xa4, 0x1a, 0xf0, 0x4a, 0x64, 0x2d, 0x93, 0x9e, 0x46, 0xd9, 0xdf, 0x18, 0xc9, 0x46, 0xff, - 0x26, 0x82, 0x33, 0xd9, 0x65, 0xe1, 0xae, 0x1d, 0x46, 0xf2, 0x16, 0x83, 0xf7, 0x61, 0x21, 0x56, - 0x25, 0xae, 0x41, 0x2b, 0x9b, 0xbb, 0xd3, 0x56, 0x26, 0x99, 0xbd, 0x95, 0xcc, 0xf5, 0xc7, 0xe1, - 0xcc, 0xd0, 0x70, 0x2c, 0x60, 0x54, 0xa1, 0x2c, 0xab, 0x31, 0xb1, 0xfb, 0x09, 0xad, 0xbf, 0x35, - 0x97, 0xcd, 0x8d, 0x9e, 0xb5, 0xeb, 0xb5, 0x72, 0x1a, 0x13, 0xf9, 0x1e, 0xc3, 0x76, 0xc3, 0xb3, - 0x94, 0x1e, 0x84, 0x24, 0xd9, 0x3a, 0xd3, 0x73, 0x23, 0x62, 0xbb, 0x34, 0x10, 0xe9, 0x3b, 0x1d, - 0x60, 0x3b, 0x1d, 0xda, 0xae, 0x49, 0xf7, 0xa8, 0xe9, 0xb9, 0x56, 0xc8, 0x5d, 0xa6, 0x68, 0x64, - 0xc6, 0xf0, 0xb3, 0xb0, 0xc8, 0xe9, 0x3b, 0x76, 0x27, 0xce, 0x57, 0x95, 0xcd, 0xf5, 0x46, 0xdc, - 0x2c, 0x6c, 0xa8, 0xcd, 0xc2, 0xd4, 0x86, 0x1d, 0x1a, 0x91, 0x46, 0xef, 0x4a, 0x83, 0xad, 0x30, - 0xd2, 0xc5, 0x0c, 0x4b, 0x44, 0x6c, 0x67, 0xd7, 0x76, 0x79, 0x85, 0xcc, 0x44, 0xa5, 0x03, 0xcc, - 0x1b, 0xf7, 0x3d, 0xc7, 0xf1, 0x5e, 0x92, 0x07, 0x3c, 0xa6, 0xd8, 0xaa, 0xae, 0x1b, 0xd9, 0x0e, - 0x97, 0x1f, 0xfb, 0x5a, 0x3a, 0xc0, 0x57, 0xd9, 0x4e, 0x44, 0x03, 0x71, 0xb2, 0x05, 0x95, 0xf8, - 0x7b, 0x25, 0xee, 0x7f, 0xc9, 0xc0, 0x12, 0x9f, 0x8c, 0x63, 0xea, 0xc9, 0xe8, 0x3f, 0x6d, 0x4b, - 0x43, 0x9a, 0x38, 0xbc, 0x1d, 0x48, 0x7b, 0xb6, 0xd7, 0x65, 0xc5, 0x1f, 0xaf, 0x91, 0x24, 0x3d, - 0x70, 0x5a, 0x96, 0xf3, 0x4f, 0xcb, 0x89, 0xec, 0x69, 0xe1, 0x25, 0x7c, 0x64, 0xb6, 0xb7, 0x49, - 0x48, 0xb5, 0x93, 0x9c, 0x75, 0x3a, 0xa0, 0xff, 0x0e, 0x41, 0x79, 0xd7, 0x6b, 0x5d, 0x77, 0xa3, - 0xe0, 0x90, 0x5f, 0xf6, 0x3c, 0x37, 0xa2, 0xae, 0xf4, 0x26, 0x49, 0xb2, 0x2d, 0x8a, 0xec, 0x0e, - 0xdd, 0x8b, 0x48, 0xc7, 0x17, 0xa5, 0xe2, 0x91, 0xb6, 0x28, 0x59, 0xcc, 0xcc, 0xe6, 0x90, 0x30, - 0xe2, 0x21, 0xa7, 0x6c, 0xf0, 0x6f, 0xa6, 0x60, 0x32, 0x61, 0x2f, 0x0a, 0x44, 0xbc, 0xc9, 0x8c, - 0xa9, 0x0e, 0x58, 0x8a, 0xb1, 0x09, 0x52, 0xef, 0xc0, 0xfd, 0xc9, 0x1d, 0xe6, 0x0e, 0x0d, 0x3a, - 0xb6, 0x4b, 0xf2, 0x93, 0xd0, 0x04, 0x5d, 0xca, 0x9c, 0x2b, 0xb4, 0x97, 0x39, 0x92, 0xec, 0x4a, - 0x70, 0xd7, 0x76, 0x2d, 0xef, 0xa5, 0x9c, 0xa3, 0x35, 0x9d, 0xc0, 0xbf, 0x64, 0x1b, 0x8d, 0x8a, - 0xc4, 0x24, 0x0e, 0x3c, 0x0b, 0x4b, 0x2c, 0x62, 0xf4, 0xa8, 0xf8, 0x41, 0x04, 0x25, 0x7d, 0x54, - 0xcf, 0x27, 0xe5, 0x61, 0x64, 0x17, 0xe2, 0x5d, 0x58, 0x26, 0x61, 0x68, 0xb7, 0x5c, 0x6a, 0x49, - 0x5e, 0x85, 0x89, 0x79, 0xf5, 0x2f, 0x8d, 0xbb, 0x07, 0x7c, 0x86, 0xd8, 0x6f, 0x49, 0xea, 0xdf, - 0x40, 0x70, 0x7a, 0x28, 0x93, 0xe4, 0x5c, 0x21, 0x25, 0x8f, 0x54, 0xa1, 0x1c, 0x9a, 0x6d, 0x6a, - 0x75, 0x1d, 0x99, 0x17, 0x13, 0x9a, 0xfd, 0x66, 0x75, 0xe3, 0xdd, 0x17, 0x79, 0x2c, 0xa1, 0xf1, - 0x59, 0x80, 0x0e, 0x71, 0xbb, 0xc4, 0xe1, 0x10, 0xe6, 0x38, 0x04, 0x65, 0x44, 0x5f, 0x85, 0xea, - 0x30, 0xd7, 0x11, 0xad, 0xaa, 0x7f, 0x21, 0x38, 0x2e, 0x43, 0xae, 0xd8, 0xdd, 0x3a, 0x2c, 0x2b, - 0x66, 0xb8, 0x95, 0x6e, 0x74, 0xff, 0xf0, 0x98, 0x70, 0x2a, 0xbd, 0xa4, 0x98, 0x7d, 0x2b, 0xe8, - 0x65, 0xba, 0xfd, 0x13, 0x27, 0x5c, 0x34, 0xa3, 0x32, 0xf8, 0xeb, 0xa0, 0xdd, 0x24, 0x2e, 0x69, - 0x51, 0x2b, 0x51, 0x3b, 0x71, 0xb1, 0xaf, 0xa8, 0x3d, 0x97, 0xa9, 0x3b, 0x1c, 0x49, 0xc5, 0x68, - 0xef, 0xef, 0xcb, 0xfe, 0x4d, 0x00, 0xe5, 0x5d, 0xdb, 0x3d, 0xd8, 0x71, 0xf7, 0x3d, 0xa6, 0x71, - 0x64, 0x47, 0x8e, 0xb4, 0x6e, 0x4c, 0xe0, 0x13, 0x50, 0xec, 0x06, 0x8e, 0xf0, 0x00, 0xf6, 0x89, - 0x6b, 0x50, 0xb1, 0x68, 0x68, 0x06, 0xb6, 0x2f, 0xf6, 0x9f, 0xf7, 0xbe, 0x95, 0x21, 0xb6, 0x0f, - 0xb6, 0xe9, 0xb9, 0xdb, 0x0e, 0x09, 0x43, 0x99, 0x9e, 0x92, 0x01, 0xfd, 0x49, 0x58, 0x62, 0x32, - 0x53, 0x35, 0x2f, 0x66, 0xd5, 0x3c, 0x9d, 0x81, 0x2f, 0xe1, 0x49, 0xc4, 0x04, 0xee, 0x63, 0x55, - 0xc1, 0x55, 0xdf, 0x17, 0x4c, 0x26, 0xac, 0xc7, 0x8a, 0xc3, 0xb2, 0xeb, 0xd0, 0x96, 0xef, 0xe6, - 0x1b, 0x6b, 0x80, 0xd5, 0x73, 0x42, 0x83, 0x9e, 0x6d, 0x52, 0xfc, 0x5d, 0x04, 0x73, 0x4c, 0x34, - 0x7e, 0x60, 0xd4, 0xb1, 0xe4, 0xfe, 0x5a, 0x9d, 0xdd, 0x7d, 0x9e, 0x49, 0xd3, 0x57, 0x5f, 0xfd, - 0xeb, 0xdf, 0xbf, 0x57, 0x58, 0xc1, 0xa7, 0xf8, 0x43, 0x5f, 0xef, 0x8a, 0xfa, 0xe8, 0x16, 0xe2, - 0xd7, 0x10, 0x60, 0x51, 0x25, 0x29, 0x4f, 0x21, 0xf8, 0xe2, 0x28, 0x88, 0x43, 0x9e, 0x4c, 0xaa, - 0x0f, 0x28, 0x59, 0xa5, 0x61, 0x7a, 0x01, 0x65, 0x39, 0x84, 0x4f, 0xe0, 0x00, 0xd6, 0x39, 0x80, - 0xf3, 0x58, 0x1f, 0x06, 0xa0, 0xf9, 0x32, 0xb3, 0xe8, 0x2b, 0x4d, 0x1a, 0xcb, 0x7d, 0x13, 0x41, - 0xe9, 0x2e, 0xbf, 0x0a, 0x8d, 0x31, 0xd2, 0xde, 0xcc, 0x8c, 0xc4, 0xc5, 0x71, 0xb4, 0xfa, 0x39, - 0x8e, 0xf4, 0x01, 0x7c, 0x46, 0x22, 0x0d, 0xa3, 0x80, 0x92, 0x4e, 0x06, 0xf0, 0x65, 0x84, 0xdf, - 0x46, 0x30, 0x1f, 0xf7, 0xc0, 0xf1, 0xda, 0x28, 0x94, 0x99, 0x1e, 0x79, 0x75, 0x76, 0x0d, 0x65, - 0xfd, 0x61, 0x8e, 0xf1, 0x9c, 0x3e, 0x74, 0x3b, 0xb7, 0x32, 0xed, 0xe6, 0xd7, 0x11, 0x14, 0x6f, - 0xd0, 0xb1, 0xfe, 0x36, 0x43, 0x70, 0x03, 0x06, 0x1c, 0xb2, 0xd5, 0xf8, 0x2d, 0x04, 0xf7, 0xdf, - 0xa0, 0xd1, 0xf0, 0xf4, 0x88, 0xeb, 0xe3, 0x73, 0x96, 0x70, 0xbb, 0x8b, 0x13, 0xcc, 0x4c, 0xf2, - 0x42, 0x93, 0x23, 0x7b, 0x18, 0x5f, 0xc8, 0x73, 0xc2, 0xf0, 0xd0, 0x35, 0x5f, 0x12, 0x38, 0xfe, - 0x84, 0xe0, 0x44, 0xff, 0x93, 0x27, 0xd6, 0xfb, 0xee, 0x28, 0x43, 0x5e, 0x44, 0xab, 0xb7, 0xa6, - 0x8d, 0xb2, 0x59, 0xa6, 0xfa, 0x55, 0x8e, 0xfc, 0x09, 0xfc, 0x78, 0x1e, 0xf2, 0xa4, 0xa1, 0xd8, - 0x7c, 0x59, 0x7e, 0xbe, 0xc2, 0x9f, 0xe7, 0x39, 0xec, 0x3f, 0x23, 0x38, 0x25, 0xf9, 0x6e, 0xb7, - 0x49, 0x10, 0x5d, 0xa3, 0xac, 0xc2, 0x0e, 0x27, 0xd2, 0x67, 0xca, 0xac, 0xa1, 0xca, 0xd3, 0xaf, - 0x73, 0x5d, 0x3e, 0x8d, 0x9f, 0x3a, 0xb2, 0x2e, 0x26, 0x63, 0x63, 0x09, 0xd8, 0xef, 0x20, 0x38, - 0x7e, 0x83, 0x46, 0xcf, 0x6d, 0xef, 0x1c, 0x69, 0x67, 0xa6, 0x74, 0x74, 0x45, 0x9c, 0x7e, 0x8d, - 0x2b, 0xf2, 0x29, 0xfc, 0xe4, 0x91, 0x15, 0xf1, 0x4c, 0x3b, 0xd9, 0x97, 0x57, 0x11, 0x1c, 0xbb, - 0x41, 0xa3, 0x9b, 0x49, 0x73, 0x7e, 0x6d, 0xa2, 0x07, 0xbf, 0xea, 0x6a, 0x43, 0xf9, 0x77, 0x83, - 0xfc, 0x29, 0x71, 0xf5, 0x0d, 0x8e, 0xed, 0x02, 0x5e, 0xcb, 0xc3, 0x96, 0x3e, 0x08, 0xbc, 0x89, - 0xe0, 0xb4, 0x0a, 0x22, 0x7d, 0x28, 0xfd, 0xf8, 0xd1, 0x9e, 0x1f, 0xc5, 0x23, 0xe6, 0x18, 0x74, - 0x9b, 0x1c, 0xdd, 0x25, 0x7d, 0xf8, 0x41, 0xec, 0x0c, 0xa0, 0xd8, 0x42, 0xeb, 0x75, 0x84, 0x7f, - 0x8f, 0x60, 0x3e, 0xee, 0x8d, 0x8f, 0xb6, 0x51, 0xe6, 0x61, 0x6f, 0x96, 0x51, 0x4d, 0x78, 0x6d, - 0xf5, 0xf2, 0x70, 0x83, 0xaa, 0xeb, 0xe5, 0xd6, 0x36, 0xb8, 0x95, 0xb3, 0xe1, 0xf8, 0x57, 0x08, - 0x20, 0xed, 0xef, 0xe3, 0x87, 0xf3, 0xf5, 0x50, 0xde, 0x00, 0xaa, 0xb3, 0xed, 0xf0, 0xeb, 0x0d, - 0xae, 0x4f, 0xbd, 0x5a, 0xcb, 0x8d, 0x85, 0x3e, 0x35, 0xb7, 0xe2, 0xb7, 0x80, 0x1f, 0x23, 0x28, - 0xf1, 0xb6, 0x2a, 0x3e, 0x3f, 0x0a, 0xb3, 0xda, 0x75, 0x9d, 0xa5, 0xe9, 0x1f, 0xe2, 0x50, 0x6b, - 0x9b, 0x79, 0x09, 0x65, 0x0b, 0xad, 0xe3, 0x1e, 0xcc, 0xc7, 0x8d, 0xcc, 0xd1, 0xee, 0x91, 0x69, - 0x74, 0x56, 0x6b, 0x39, 0x05, 0x4e, 0xec, 0xa8, 0x22, 0x97, 0xad, 0x8f, 0xcb, 0x65, 0x73, 0x2c, - 0xdd, 0xe0, 0x73, 0x79, 0xc9, 0xe8, 0xff, 0x60, 0x98, 0x8b, 0x1c, 0xdd, 0x9a, 0x5e, 0x1b, 0x97, - 0xcf, 0x98, 0x75, 0x7e, 0x80, 0xe0, 0x44, 0xff, 0x25, 0x01, 0x9f, 0x19, 0xda, 0x6f, 0x13, 0xb9, - 0x35, 0x6b, 0xc5, 0x51, 0x17, 0x0c, 0xfd, 0x33, 0x1c, 0xc5, 0x16, 0x7e, 0x6c, 0xec, 0xc9, 0xb8, - 0x25, 0xa3, 0x0e, 0x63, 0xb4, 0x91, 0x3e, 0x56, 0xfe, 0x1a, 0xc1, 0x31, 0xc9, 0xf7, 0x4e, 0x40, - 0x69, 0x3e, 0xac, 0xd9, 0x1d, 0x04, 0x26, 0x4b, 0x7f, 0x92, 0xc3, 0xff, 0x04, 0x7e, 0x74, 0x42, - 0xf8, 0x12, 0xf6, 0x46, 0xc4, 0x90, 0xfe, 0x01, 0xc1, 0xc9, 0xbb, 0xb1, 0xdf, 0x7f, 0x40, 0xf8, - 0xb7, 0x39, 0xfe, 0xa7, 0xf0, 0x13, 0x39, 0xf5, 0xea, 0x38, 0x35, 0x2e, 0x23, 0xfc, 0x0b, 0x04, - 0x65, 0xf9, 0xc8, 0x85, 0x2f, 0x8c, 0x3c, 0x18, 0xd9, 0x67, 0xb0, 0x59, 0x3a, 0xb3, 0x28, 0xce, - 0xf4, 0xf3, 0xb9, 0xd9, 0x54, 0xc8, 0x67, 0x0e, 0xfd, 0x3a, 0x02, 0x9c, 0xdc, 0xfd, 0x93, 0x6e, - 0x00, 0x7e, 0x28, 0x23, 0x6a, 0x64, 0x83, 0xa9, 0x7a, 0x61, 0xec, 0xbc, 0x6c, 0x2a, 0x5d, 0xcf, - 0x4d, 0xa5, 0x5e, 0x22, 0xff, 0x5b, 0x08, 0x2a, 0x37, 0x68, 0x72, 0x97, 0xca, 0xb1, 0x65, 0xf6, - 0x8d, 0xae, 0x5a, 0x1f, 0x3f, 0x51, 0x20, 0xba, 0xc4, 0x11, 0x3d, 0x84, 0xf3, 0x4d, 0x25, 0x01, - 0xfc, 0x10, 0xc1, 0xd2, 0x6d, 0xd5, 0x45, 0xf1, 0xa5, 0x71, 0x92, 0x32, 0x91, 0x7c, 0x72, 0x5c, - 0x8f, 0x70, 0x5c, 0x1b, 0xfa, 0x44, 0xb8, 0xb6, 0xc4, 0x73, 0xd7, 0x1b, 0x28, 0xbe, 0x8c, 0xf7, - 0x75, 0xed, 0xff, 0x57, 0xbb, 0xe5, 0x34, 0xff, 0xf5, 0x47, 0x39, 0xbe, 0x06, 0xbe, 0x34, 0x09, - 0xbe, 0xa6, 0x68, 0xe5, 0xe3, 0xef, 0x23, 0x38, 0xc9, 0x1f, 0x6d, 0x54, 0xc6, 0x38, 0xef, 0xa5, - 0x22, 0x7d, 0xe2, 0x99, 0x20, 0xc5, 0x7c, 0x92, 0x83, 0xba, 0xa2, 0x1f, 0x09, 0x14, 0xf3, 0xff, - 0x6f, 0x23, 0x38, 0x2e, 0xf3, 0x99, 0xd8, 0xd8, 0x8d, 0x71, 0x36, 0x3b, 0x6a, 0xfe, 0x13, 0x9e, - 0xb6, 0x3e, 0x99, 0xa7, 0xbd, 0x8d, 0x60, 0x41, 0x3c, 0x57, 0xe4, 0x54, 0x09, 0xca, 0x7b, 0x46, - 0xb5, 0xaf, 0x4d, 0x23, 0xfa, 0xd9, 0xfa, 0x97, 0xb8, 0xd8, 0xe7, 0x71, 0x33, 0x4f, 0xac, 0xef, - 0x59, 0x61, 0xf3, 0x65, 0xd1, 0x4c, 0x7e, 0xa5, 0xe9, 0x78, 0xad, 0xf0, 0x05, 0x1d, 0xe7, 0xe6, - 0x42, 0x36, 0xe7, 0x32, 0xc2, 0x11, 0x2c, 0x32, 0xbf, 0xe0, 0xbd, 0x1f, 0x5c, 0xeb, 0xeb, 0x14, - 0x0d, 0xb4, 0x85, 0xaa, 0xd5, 0x81, 0x5e, 0x52, 0x9a, 0xfc, 0xc4, 0x4d, 0x1c, 0x3f, 0x98, 0x2b, - 0x96, 0x0b, 0x7a, 0x0d, 0xc1, 0x49, 0xd5, 0xd1, 0x63, 0xf1, 0x13, 0xbb, 0x79, 0x1e, 0x0a, 0x51, - 0x4f, 0xe3, 0xf5, 0x89, 0x7c, 0x88, 0xc3, 0x79, 0xfa, 0x99, 0x3f, 0xbe, 0x77, 0x16, 0xbd, 0xfb, - 0xde, 0x59, 0xf4, 0xb7, 0xf7, 0xce, 0xa2, 0x17, 0x1e, 0x9b, 0xec, 0xdf, 0xda, 0xa6, 0x63, 0x53, - 0x37, 0x52, 0xd9, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x47, 0x2b, 0xad, 0x16, 0x93, 0x2e, 0x00, - 0x00, + // 2885 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xcf, 0x8f, 0x1c, 0x47, + 0xf5, 0xff, 0xd6, 0xcc, 0xce, 0xee, 0xec, 0x1b, 0xff, 0xac, 0xd8, 0xfe, 0x76, 0xc6, 0x1b, 0x33, + 0x69, 0xff, 0x9a, 0xac, 0xbd, 0x33, 0xf6, 0xc4, 0xa0, 0x64, 0x93, 0x10, 0x9c, 0xb5, 0xe3, 0x2c, + 0xac, 0x1d, 0xd3, 0xeb, 0xc4, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xd3, 0x6c, 0x4f, 0x77, 0xbb, + 0xbb, 0x67, 0xc2, 0x2a, 0xe4, 0x12, 0x84, 0xc4, 0x21, 0x0a, 0x02, 0x72, 0xe0, 0xc0, 0x2f, 0x25, + 0x8a, 0x84, 0x10, 0x88, 0x0b, 0x42, 0x48, 0x08, 0x09, 0x0e, 0x41, 0x70, 0x40, 0x8a, 0xe0, 0x1f, + 0x40, 0x11, 0xe2, 0x48, 0x2e, 0x39, 0x23, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0xf3, 0xa3, 0x67, 0x96, + 0x19, 0x14, 0x4b, 0xdc, 0xfa, 0xd5, 0x54, 0xbd, 0xf7, 0x79, 0xaf, 0x5e, 0xbd, 0x57, 0xf5, 0xde, + 0xc0, 0x99, 0x90, 0x06, 0x7d, 0x1a, 0x34, 0x89, 0xef, 0x3b, 0xb6, 0x49, 0x22, 0xdb, 0x73, 0xd5, + 0xef, 0x86, 0x1f, 0x78, 0x91, 0x87, 0x2b, 0xca, 0x50, 0x75, 0xa5, 0xed, 0x79, 0x6d, 0x87, 0x36, + 0x89, 0x6f, 0x37, 0x89, 0xeb, 0x7a, 0x11, 0x1f, 0x0e, 0xe3, 0xa9, 0x55, 0x7d, 0xf7, 0xb1, 0xb0, + 0x61, 0x7b, 0xfc, 0x57, 0xd3, 0x0b, 0x68, 0xb3, 0x7f, 0xb9, 0xd9, 0xa6, 0x2e, 0x0d, 0x48, 0x44, + 0x2d, 0x31, 0xe7, 0x4a, 0x3a, 0xa7, 0x4b, 0xcc, 0x8e, 0xed, 0xd2, 0x60, 0xaf, 0xe9, 0xef, 0xb6, + 0xd9, 0x40, 0xd8, 0xec, 0xd2, 0x88, 0x8c, 0x5a, 0xb5, 0xd5, 0xb6, 0xa3, 0x4e, 0xef, 0xe5, 0x86, + 0xe9, 0x75, 0x9b, 0x24, 0x68, 0x7b, 0x7e, 0xe0, 0x7d, 0x85, 0x7f, 0xac, 0x99, 0x56, 0xb3, 0xff, + 0x68, 0xca, 0x40, 0xd5, 0xa5, 0x7f, 0x99, 0x38, 0x7e, 0x87, 0x0c, 0x73, 0xbb, 0x3e, 0x81, 0x5b, + 0x40, 0x7d, 0x4f, 0xd8, 0x86, 0x7f, 0xda, 0x91, 0x17, 0xec, 0x29, 0x9f, 0x31, 0x1b, 0xfd, 0x23, + 0x04, 0x47, 0xae, 0xa6, 0xf2, 0x3e, 0xdf, 0xa3, 0xc1, 0x1e, 0xc6, 0xb0, 0xe0, 0x92, 0x2e, 0xd5, + 0x50, 0x0d, 0xd5, 0x97, 0x0d, 0xfe, 0x8d, 0x35, 0x58, 0x0a, 0xe8, 0x4e, 0x40, 0xc3, 0x8e, 0x56, + 0xe0, 0xc3, 0x92, 0xc4, 0x55, 0x28, 0x33, 0xe1, 0xd4, 0x8c, 0x42, 0xad, 0x58, 0x2b, 0xd6, 0x97, + 0x8d, 0x84, 0xc6, 0x75, 0x38, 0x1c, 0xd0, 0xd0, 0xeb, 0x05, 0x26, 0x7d, 0x91, 0x06, 0xa1, 0xed, + 0xb9, 0xda, 0x02, 0x5f, 0x3d, 0x38, 0xcc, 0xb8, 0x84, 0xd4, 0xa1, 0x66, 0xe4, 0x05, 0x5a, 0x89, + 0x4f, 0x49, 0x68, 0x86, 0x87, 0x01, 0xd7, 0x16, 0x63, 0x3c, 0xec, 0x1b, 0xeb, 0x70, 0x80, 0xf8, + 0xfe, 0x2d, 0xd2, 0xa5, 0xa1, 0x4f, 0x4c, 0xaa, 0x2d, 0xf1, 0xdf, 0x32, 0x63, 0x0c, 0xb3, 0x40, + 0xa2, 0x95, 0x39, 0x30, 0x49, 0xea, 0x1b, 0xb0, 0x7c, 0xcb, 0xb3, 0xe8, 0x78, 0x75, 0x07, 0xd9, + 0x17, 0x86, 0xd9, 0xeb, 0xef, 0x21, 0x38, 0x6e, 0xd0, 0xbe, 0xcd, 0xf0, 0xdf, 0xa4, 0x11, 0xb1, + 0x48, 0x44, 0x06, 0x39, 0x16, 0x12, 0x8e, 0x55, 0x28, 0x07, 0x62, 0xb2, 0x56, 0xe0, 0xe3, 0x09, + 0x3d, 0x24, 0xad, 0x98, 0xaf, 0x4c, 0x6c, 0x42, 0x49, 0xe2, 0x1a, 0x54, 0x62, 0x5b, 0x6e, 0xba, + 0x16, 0xfd, 0x2a, 0xb7, 0x5e, 0xc9, 0x50, 0x87, 0xf0, 0x0a, 0x2c, 0xf7, 0x63, 0x3b, 0x6f, 0x5a, + 0xdc, 0x8a, 0x25, 0x23, 0x1d, 0xd0, 0xff, 0x81, 0xe0, 0x94, 0xe2, 0x03, 0x86, 0xd8, 0x99, 0xeb, + 0x7d, 0xea, 0x46, 0xe1, 0x78, 0x85, 0x2e, 0xc2, 0x51, 0xb9, 0x89, 0x83, 0x76, 0x1a, 0xfe, 0x81, + 0xa9, 0xa8, 0x0e, 0x4a, 0x15, 0xd5, 0x31, 0xa6, 0x88, 0xa4, 0x5f, 0xd8, 0xbc, 0x26, 0xd4, 0x54, + 0x87, 0x86, 0x0c, 0x55, 0xca, 0x37, 0xd4, 0x62, 0xc6, 0x50, 0xfa, 0xfb, 0x08, 0x34, 0x45, 0xd1, + 0x9b, 0xc4, 0xb5, 0x77, 0x68, 0x18, 0x4d, 0xbb, 0x67, 0x68, 0x8e, 0x7b, 0x56, 0x87, 0xc3, 0xb1, + 0x56, 0xb7, 0xd9, 0x79, 0x64, 0xf1, 0x47, 0x2b, 0xd5, 0x8a, 0xf5, 0xa2, 0x31, 0x38, 0xcc, 0xf6, + 0x4e, 0xca, 0x0c, 0xb5, 0x45, 0xee, 0xc6, 0xe9, 0x80, 0xfe, 0x30, 0x2c, 0x3f, 0x6b, 0x3b, 0x74, + 0xa3, 0xd3, 0x73, 0x77, 0xf1, 0x31, 0x28, 0x99, 0xec, 0x83, 0xeb, 0x70, 0xc0, 0x88, 0x09, 0xfd, + 0xdb, 0x08, 0x1e, 0x1e, 0xa7, 0xf5, 0x5d, 0x3b, 0xea, 0xb0, 0xf5, 0xe1, 0x38, 0xf5, 0xcd, 0x0e, + 0x35, 0x77, 0xc3, 0x5e, 0x57, 0xba, 0xac, 0xa4, 0x67, 0x53, 0x5f, 0xff, 0x29, 0x82, 0xfa, 0x44, + 0x4c, 0x77, 0x03, 0xe2, 0xfb, 0x34, 0xc0, 0xcf, 0x42, 0xe9, 0x1e, 0xfb, 0x81, 0x1f, 0xd0, 0x4a, + 0xab, 0xd1, 0x50, 0x03, 0xfc, 0x44, 0x2e, 0xcf, 0xfd, 0x9f, 0x11, 0x2f, 0xc7, 0x0d, 0x69, 0x9e, + 0x02, 0xe7, 0x73, 0x22, 0xc3, 0x27, 0xb1, 0x22, 0x9b, 0xcf, 0xa7, 0x3d, 0xb3, 0x08, 0x0b, 0x3e, + 0x09, 0x22, 0xfd, 0x38, 0x3c, 0x90, 0x3d, 0x1e, 0xbe, 0xe7, 0x86, 0x54, 0xff, 0x4d, 0xd6, 0x9b, + 0x36, 0x02, 0x4a, 0x22, 0x6a, 0xd0, 0x7b, 0x3d, 0x1a, 0x46, 0x78, 0x17, 0xd4, 0x9c, 0xc3, 0xad, + 0x5a, 0x69, 0x6d, 0x36, 0xd2, 0xa0, 0xdd, 0x90, 0x41, 0x9b, 0x7f, 0x7c, 0xc9, 0xb4, 0x1a, 0xfd, + 0x47, 0x1b, 0xfe, 0x6e, 0xbb, 0xc1, 0x52, 0x40, 0x06, 0x99, 0x4c, 0x01, 0xaa, 0xaa, 0x86, 0xca, + 0x1d, 0x9f, 0x80, 0xc5, 0x9e, 0x1f, 0xd2, 0x20, 0xe2, 0x9a, 0x95, 0x0d, 0x41, 0xb1, 0xfd, 0xeb, + 0x13, 0xc7, 0xb6, 0x48, 0x14, 0xef, 0x4f, 0xd9, 0x48, 0x68, 0xfd, 0xb7, 0x59, 0xf4, 0x2f, 0xf8, + 0xd6, 0xc7, 0x85, 0x5e, 0x45, 0x59, 0xc8, 0xa2, 0x54, 0x3d, 0xa8, 0x98, 0xf5, 0xa0, 0x5f, 0x66, + 0xf1, 0x5f, 0xa3, 0x0e, 0x4d, 0xf1, 0x8f, 0x72, 0x66, 0x0d, 0x96, 0x4c, 0x12, 0x9a, 0xc4, 0x92, + 0x52, 0x24, 0xc9, 0x02, 0x99, 0x1f, 0x78, 0x3e, 0x69, 0x73, 0x4e, 0xb7, 0x3d, 0xc7, 0x36, 0xf7, + 0x84, 0xb8, 0xe1, 0x1f, 0x86, 0x1c, 0x7f, 0x21, 0xdf, 0xf1, 0x4b, 0x59, 0xd8, 0xa7, 0xa1, 0xb2, + 0xbd, 0xe7, 0x9a, 0xcf, 0xfb, 0xf1, 0xe1, 0x3e, 0x06, 0x25, 0x3b, 0xa2, 0xdd, 0x50, 0x43, 0xfc, + 0x60, 0xc7, 0x84, 0xfe, 0xaf, 0x12, 0x9c, 0x50, 0x74, 0x63, 0x0b, 0xf2, 0x34, 0xcb, 0x8b, 0x52, + 0x27, 0x60, 0xd1, 0x0a, 0xf6, 0x8c, 0x9e, 0x2b, 0x1c, 0x40, 0x50, 0x4c, 0xb0, 0x1f, 0xf4, 0xdc, + 0x18, 0x7e, 0xd9, 0x88, 0x09, 0xbc, 0x03, 0xe5, 0x30, 0x62, 0xb7, 0x8c, 0xf6, 0x1e, 0x07, 0x5e, + 0x69, 0x7d, 0x76, 0xb6, 0x4d, 0x67, 0xd0, 0xb7, 0x05, 0x47, 0x23, 0xe1, 0x8d, 0xef, 0xb1, 0x98, + 0x16, 0x07, 0xba, 0x50, 0x5b, 0xaa, 0x15, 0xeb, 0x95, 0xd6, 0xf6, 0xec, 0x82, 0x9e, 0xf7, 0xd9, + 0x0d, 0x49, 0xc9, 0x60, 0x46, 0x2a, 0x85, 0x85, 0xd1, 0xae, 0x88, 0x0f, 0xa1, 0xb8, 0x0d, 0xa4, + 0x03, 0xf8, 0x0b, 0x50, 0xb2, 0xdd, 0x1d, 0x2f, 0xd4, 0x96, 0x39, 0x98, 0x67, 0x66, 0x03, 0xb3, + 0xe9, 0xee, 0x78, 0x46, 0xcc, 0x10, 0xdf, 0x83, 0x83, 0x01, 0x8d, 0x82, 0x3d, 0x69, 0x05, 0x0d, + 0xb8, 0x5d, 0x3f, 0x37, 0x9b, 0x04, 0x43, 0x65, 0x69, 0x64, 0x25, 0xe0, 0x75, 0xa8, 0x84, 0xa9, + 0x8f, 0x69, 0x15, 0x2e, 0x50, 0xcb, 0x30, 0x52, 0x7c, 0xd0, 0x50, 0x27, 0x0f, 0x79, 0xf7, 0x81, + 0x7c, 0xef, 0x3e, 0x38, 0x31, 0xab, 0x1d, 0x9a, 0x22, 0xab, 0x1d, 0x1e, 0xcc, 0x6a, 0x1f, 0x22, + 0x58, 0x19, 0x0a, 0x4e, 0xdb, 0x3e, 0xcd, 0x3d, 0x06, 0x04, 0x16, 0x42, 0x9f, 0x9a, 0x3c, 0x53, + 0x55, 0x5a, 0x37, 0xe7, 0x16, 0xad, 0xb8, 0x5c, 0xce, 0x3a, 0x2f, 0xa0, 0xce, 0x18, 0x17, 0x7e, + 0x84, 0xe0, 0xff, 0x15, 0x99, 0xb7, 0x49, 0x64, 0x76, 0xf2, 0x94, 0x65, 0xe7, 0x97, 0xcd, 0x11, + 0x79, 0x39, 0x26, 0x98, 0x55, 0xf9, 0xc7, 0x9d, 0x3d, 0x9f, 0x01, 0x64, 0xbf, 0xa4, 0x03, 0x33, + 0x5e, 0x9e, 0x7e, 0x86, 0xa0, 0xaa, 0xc6, 0x70, 0xcf, 0x71, 0x5e, 0x26, 0xe6, 0x6e, 0x1e, 0xc8, + 0x43, 0x50, 0xb0, 0x2d, 0x8e, 0xb0, 0x68, 0x14, 0x6c, 0x6b, 0x9f, 0xc1, 0x68, 0x10, 0xee, 0x62, + 0x3e, 0xdc, 0xa5, 0x2c, 0xdc, 0x8f, 0x06, 0xe0, 0xca, 0x90, 0x90, 0x03, 0x77, 0x05, 0x96, 0xdd, + 0x81, 0x8b, 0x6c, 0x3a, 0x30, 0xe2, 0x02, 0x5b, 0x18, 0xba, 0xc0, 0x6a, 0xb0, 0xd4, 0x4f, 0x9e, + 0x39, 0xec, 0x67, 0x49, 0x32, 0x15, 0xdb, 0x81, 0xd7, 0xf3, 0x85, 0xd1, 0x63, 0x82, 0xa1, 0xd8, + 0xb5, 0x5d, 0x76, 0x25, 0xe7, 0x28, 0xd8, 0xf7, 0xfe, 0x1f, 0x36, 0x19, 0xb5, 0x7f, 0x5e, 0x80, + 0x4f, 0x8c, 0x50, 0x7b, 0xa2, 0x3f, 0xdd, 0x1f, 0xba, 0x27, 0x5e, 0xbd, 0x34, 0xd6, 0xab, 0xcb, + 0x93, 0xbc, 0x7a, 0x39, 0xdf, 0x5e, 0x90, 0xb5, 0xd7, 0x4f, 0x0a, 0x50, 0x1b, 0x61, 0xaf, 0xc9, + 0xd7, 0x89, 0xfb, 0xc6, 0x60, 0x3b, 0x5e, 0x20, 0xbc, 0xa4, 0x6c, 0xc4, 0x04, 0x3b, 0x67, 0x5e, + 0xe0, 0x77, 0x88, 0xcb, 0xbd, 0xa3, 0x6c, 0x08, 0x6a, 0x46, 0x53, 0x5d, 0x03, 0x4d, 0x9a, 0xe7, + 0xaa, 0x19, 0x07, 0xa9, 0x80, 0x74, 0x69, 0x44, 0x83, 0x70, 0x5c, 0x88, 0xea, 0x13, 0xa7, 0x47, + 0x65, 0x88, 0xe2, 0x84, 0xfe, 0x66, 0x61, 0x90, 0x8d, 0xd1, 0x73, 0xef, 0x7f, 0x43, 0x9f, 0x80, + 0x45, 0xc2, 0xd1, 0x0a, 0xd7, 0x14, 0xd4, 0x90, 0x49, 0xcb, 0xf9, 0x26, 0x5d, 0xce, 0x98, 0x74, + 0xbd, 0xa0, 0x21, 0xfd, 0xc3, 0x02, 0x54, 0xc7, 0x19, 0xe4, 0xc5, 0xd6, 0xff, 0x9a, 0x49, 0x30, + 0x01, 0x2d, 0x18, 0xe3, 0x65, 0x1a, 0xf0, 0xcb, 0xd9, 0xd9, 0x4c, 0xc6, 0x1e, 0xe7, 0x92, 0xc6, + 0x58, 0x36, 0xfa, 0x37, 0x10, 0x9c, 0xcc, 0x2e, 0x0b, 0xb7, 0xec, 0x30, 0x92, 0x0f, 0x3b, 0xbc, + 0x03, 0x4b, 0xb1, 0x2a, 0xf1, 0xb5, 0xbc, 0xd2, 0xda, 0x9a, 0xf5, 0xb2, 0x96, 0xd9, 0x5d, 0xc9, + 0x5c, 0x7f, 0x1c, 0x4e, 0x8e, 0xcc, 0x50, 0x02, 0x46, 0x15, 0xca, 0xf2, 0x82, 0x2a, 0x76, 0x3f, + 0xa1, 0xf5, 0x77, 0x16, 0xb2, 0xd7, 0x05, 0xcf, 0xda, 0xf2, 0xda, 0x39, 0xb5, 0x9a, 0x7c, 0x8f, + 0x61, 0xbb, 0xe1, 0x59, 0x4a, 0x59, 0x46, 0x92, 0x6c, 0x9d, 0xe9, 0xb9, 0x11, 0xb1, 0x5d, 0x1a, + 0x88, 0x1b, 0x4d, 0x3a, 0xc0, 0x76, 0x3a, 0xb4, 0x5d, 0x93, 0x6e, 0x53, 0xd3, 0x73, 0xad, 0x90, + 0xbb, 0x4c, 0xd1, 0xc8, 0x8c, 0xe1, 0xe7, 0x60, 0x99, 0xd3, 0x77, 0xec, 0x6e, 0x9c, 0xc2, 0x2b, + 0xad, 0xd5, 0x46, 0x5c, 0x3f, 0x6d, 0xa8, 0xf5, 0xd3, 0xd4, 0x86, 0x5d, 0x1a, 0x91, 0x46, 0xff, + 0x72, 0x83, 0xad, 0x30, 0xd2, 0xc5, 0x0c, 0x4b, 0x44, 0x6c, 0x67, 0xcb, 0x76, 0xf9, 0xa3, 0x81, + 0x89, 0x4a, 0x07, 0x98, 0x37, 0xee, 0x78, 0x8e, 0xe3, 0xbd, 0x22, 0x63, 0x5e, 0x4c, 0xb1, 0x55, + 0x3d, 0x37, 0xb2, 0x1d, 0x2e, 0x3f, 0xf6, 0xb5, 0x74, 0x80, 0xaf, 0xb2, 0x9d, 0x88, 0x06, 0x22, + 0xd8, 0x09, 0x2a, 0xf1, 0xf7, 0x4a, 0x5c, 0x12, 0x94, 0xb1, 0x36, 0x3e, 0x19, 0x07, 0xd4, 0x93, + 0x31, 0x78, 0xda, 0x0e, 0x8e, 0xa8, 0x6b, 0xf1, 0x0a, 0x29, 0xed, 0xdb, 0x5e, 0x8f, 0xdd, 0x87, + 0xf9, 0xb5, 0x51, 0xd2, 0x43, 0xa7, 0xe5, 0x70, 0xfe, 0x69, 0x39, 0x92, 0x3d, 0x2d, 0xfc, 0x55, + 0x13, 0x99, 0x9d, 0x0d, 0x12, 0x52, 0xed, 0x28, 0x67, 0x9d, 0x0e, 0xe8, 0xbf, 0x43, 0x50, 0xde, + 0xf2, 0xda, 0xd7, 0xdd, 0x28, 0xd8, 0xe3, 0xef, 0x5f, 0xcf, 0x8d, 0xa8, 0x2b, 0xbd, 0x49, 0x92, + 0x6c, 0x8b, 0x22, 0xbb, 0x4b, 0xb7, 0x23, 0xd2, 0xf5, 0xc5, 0xed, 0x79, 0x5f, 0x5b, 0x94, 0x2c, + 0x66, 0x66, 0x73, 0x48, 0x18, 0xf1, 0x90, 0x53, 0x36, 0xf8, 0x37, 0x53, 0x30, 0x99, 0xb0, 0x1d, + 0x05, 0x22, 0xde, 0x64, 0xc6, 0x54, 0x07, 0x2c, 0xc5, 0xd8, 0x04, 0xa9, 0x77, 0xe1, 0xc1, 0xe4, + 0x59, 0x77, 0x87, 0x06, 0x5d, 0xdb, 0x25, 0xf9, 0x79, 0x79, 0x8a, 0xc2, 0x6d, 0x4e, 0x55, 0xc1, + 0xcb, 0x1c, 0x49, 0xf6, 0x4a, 0xba, 0x6b, 0xbb, 0x96, 0xf7, 0x4a, 0xce, 0xd1, 0x9a, 0x4d, 0xe0, + 0x5f, 0xb2, 0xb5, 0x57, 0x45, 0x62, 0x12, 0x07, 0x9e, 0x83, 0x83, 0x2c, 0x62, 0xf4, 0xa9, 0xf8, + 0x41, 0x04, 0x25, 0x7d, 0x5c, 0x19, 0x2c, 0xe5, 0x61, 0x64, 0x17, 0xe2, 0x2d, 0x38, 0x4c, 0xc2, + 0xd0, 0x6e, 0xbb, 0xd4, 0x92, 0xbc, 0x0a, 0x53, 0xf3, 0x1a, 0x5c, 0x1a, 0x17, 0x54, 0xf8, 0x0c, + 0xb1, 0xdf, 0x92, 0xd4, 0xbf, 0x8e, 0xe0, 0xf8, 0x48, 0x26, 0xc9, 0xb9, 0x42, 0x4a, 0x1e, 0xa9, + 0x42, 0x39, 0x34, 0x3b, 0xd4, 0xea, 0x39, 0xf2, 0xaa, 0x90, 0xd0, 0xec, 0x37, 0xab, 0x17, 0xef, + 0xbe, 0xc8, 0x63, 0x09, 0x8d, 0x4f, 0x01, 0x74, 0x89, 0xdb, 0x23, 0x0e, 0x87, 0xb0, 0xc0, 0x21, + 0x28, 0x23, 0xfa, 0x0a, 0x54, 0x47, 0xb9, 0x8e, 0xa8, 0xde, 0xfd, 0x13, 0xc1, 0x21, 0x19, 0x72, + 0xc5, 0xee, 0xd6, 0xe1, 0xb0, 0x62, 0x86, 0x5b, 0xe9, 0x46, 0x0f, 0x0e, 0x4f, 0x08, 0xa7, 0xd2, + 0x4b, 0x8a, 0xd9, 0xf6, 0x49, 0x3f, 0xd3, 0x00, 0x99, 0x3a, 0xe1, 0xa2, 0x39, 0xbd, 0x0c, 0xbe, + 0x06, 0xda, 0x4d, 0xe2, 0x92, 0x36, 0xb5, 0x12, 0xb5, 0x13, 0x17, 0xfb, 0xb2, 0x5a, 0x86, 0x9a, + 0xb9, 0xe8, 0x93, 0x5c, 0xa2, 0xed, 0x9d, 0x1d, 0x59, 0xd2, 0x0a, 0xa0, 0xbc, 0x65, 0xbb, 0xbb, + 0x9b, 0xee, 0x8e, 0xc7, 0x34, 0x8e, 0xec, 0xc8, 0x91, 0xd6, 0x8d, 0x09, 0x7c, 0x04, 0x8a, 0xbd, + 0xc0, 0x11, 0x1e, 0xc0, 0x3e, 0x71, 0x0d, 0x2a, 0x16, 0x0d, 0xcd, 0xc0, 0xf6, 0xc5, 0xfe, 0xf3, + 0x76, 0x80, 0x32, 0xc4, 0xf6, 0xc1, 0x36, 0x3d, 0x77, 0xc3, 0x21, 0x61, 0x28, 0xd3, 0x53, 0x32, + 0xa0, 0x3f, 0x09, 0x07, 0x99, 0xcc, 0x54, 0xcd, 0x0b, 0x59, 0x35, 0x8f, 0x67, 0xe0, 0x4b, 0x78, + 0x12, 0x31, 0x81, 0x07, 0xd8, 0xad, 0xe0, 0xaa, 0xef, 0x0b, 0x26, 0x53, 0x5e, 0x51, 0x8b, 0xa3, + 0xb2, 0xeb, 0xc8, 0x2a, 0x78, 0xeb, 0xbd, 0x73, 0x80, 0xd5, 0x73, 0x42, 0x83, 0xbe, 0x6d, 0x52, + 0xfc, 0x1d, 0x04, 0x0b, 0x4c, 0x34, 0x7e, 0x68, 0xdc, 0xb1, 0xe4, 0xfe, 0x5a, 0x9d, 0x5f, 0x89, + 0x83, 0x49, 0xd3, 0x57, 0x5e, 0xff, 0xeb, 0xdf, 0xbf, 0x5b, 0x38, 0x81, 0x8f, 0xf1, 0xde, 0x67, + 0xff, 0xb2, 0xda, 0x87, 0x0c, 0xf1, 0x1b, 0x08, 0xb0, 0xb8, 0x25, 0x29, 0xdd, 0x21, 0x7c, 0x61, + 0x1c, 0xc4, 0x11, 0x5d, 0xa4, 0xea, 0x43, 0x4a, 0x56, 0x69, 0x98, 0x5e, 0x40, 0x59, 0x0e, 0xe1, + 0x13, 0x38, 0x80, 0x55, 0x0e, 0xe0, 0x0c, 0xd6, 0x47, 0x01, 0x68, 0xbe, 0xca, 0x2c, 0xfa, 0x5a, + 0x93, 0xc6, 0x72, 0xdf, 0x46, 0x50, 0xba, 0xcb, 0x5f, 0x87, 0x13, 0x8c, 0xb4, 0x3d, 0x37, 0x23, + 0x71, 0x71, 0x1c, 0xad, 0x7e, 0x9a, 0x23, 0x7d, 0x08, 0x9f, 0x94, 0x48, 0xc3, 0x28, 0xa0, 0xa4, + 0x9b, 0x01, 0x7c, 0x09, 0xe1, 0x77, 0x11, 0x2c, 0xc6, 0x6d, 0x01, 0x7c, 0x76, 0x1c, 0xca, 0x4c, + 0xdb, 0xa0, 0x3a, 0xbf, 0x1a, 0xbb, 0xfe, 0x08, 0xc7, 0x78, 0x5a, 0x1f, 0xb9, 0x9d, 0xeb, 0x99, + 0x0a, 0xfc, 0x5b, 0x08, 0x8a, 0x37, 0xe8, 0x44, 0x7f, 0x9b, 0x23, 0xb8, 0x21, 0x03, 0x8e, 0xd8, + 0x6a, 0xfc, 0x0e, 0x82, 0x07, 0x6f, 0xd0, 0x68, 0x74, 0x7a, 0xc4, 0xf5, 0xc9, 0x39, 0x4b, 0xb8, + 0xdd, 0x85, 0x29, 0x66, 0x26, 0x79, 0xa1, 0xc9, 0x91, 0x3d, 0x82, 0xcf, 0xe7, 0x39, 0x61, 0xb8, + 0xe7, 0x9a, 0xaf, 0x08, 0x1c, 0x7f, 0x42, 0x70, 0x64, 0xb0, 0x0b, 0x8c, 0xf5, 0x81, 0x37, 0xca, + 0x88, 0x26, 0x71, 0xf5, 0xd6, 0xac, 0x51, 0x36, 0xcb, 0x54, 0xbf, 0xca, 0x91, 0x3f, 0x81, 0x1f, + 0xcf, 0x43, 0x9e, 0xd4, 0x58, 0x9b, 0xaf, 0xca, 0xcf, 0xd7, 0xf8, 0x3f, 0x16, 0x38, 0xec, 0x3f, + 0x23, 0x38, 0x26, 0xf9, 0x6e, 0x74, 0x48, 0x10, 0x5d, 0xa3, 0xec, 0x86, 0x1d, 0x4e, 0xa5, 0xcf, + 0x8c, 0x59, 0x43, 0x95, 0xa7, 0x5f, 0xe7, 0xba, 0x3c, 0x8d, 0x9f, 0xda, 0xb7, 0x2e, 0x26, 0x63, + 0x63, 0x09, 0xd8, 0xef, 0x21, 0x38, 0x74, 0x83, 0x46, 0xcf, 0x6f, 0x6c, 0xee, 0x6b, 0x67, 0x66, + 0x74, 0x74, 0x45, 0x9c, 0x7e, 0x8d, 0x2b, 0xf2, 0x69, 0xfc, 0xe4, 0xbe, 0x15, 0xf1, 0x4c, 0x3b, + 0xd9, 0x97, 0xd7, 0x11, 0x1c, 0xb8, 0x41, 0xa3, 0x9b, 0x49, 0xbf, 0xe2, 0xec, 0x54, 0x3d, 0xd0, + 0xea, 0x4a, 0x43, 0xf9, 0xc3, 0x87, 0xfc, 0x29, 0x71, 0xf5, 0x35, 0x8e, 0xed, 0x3c, 0x3e, 0x9b, + 0x87, 0x2d, 0xed, 0x91, 0xbc, 0x8d, 0xe0, 0xb8, 0x0a, 0x22, 0xed, 0x1d, 0x7f, 0x72, 0x7f, 0x1d, + 0x59, 0xd1, 0xd7, 0x9d, 0x80, 0xae, 0xc5, 0xd1, 0x5d, 0xd4, 0x47, 0x1f, 0xc4, 0xee, 0x10, 0x8a, + 0x75, 0xb4, 0x5a, 0x47, 0xf8, 0xf7, 0x08, 0x16, 0xe3, 0x76, 0xc1, 0x78, 0x1b, 0x65, 0x7a, 0x9d, + 0xf3, 0x8c, 0x6a, 0xc2, 0x6b, 0xab, 0x97, 0x46, 0x1b, 0x54, 0x5d, 0x2f, 0xb7, 0xb6, 0xc1, 0xad, + 0x9c, 0x0d, 0xc7, 0xbf, 0x42, 0x00, 0x69, 0xcb, 0x03, 0x3f, 0x92, 0xaf, 0x87, 0xd2, 0x16, 0xa9, + 0xce, 0xb7, 0xe9, 0xa1, 0x37, 0xb8, 0x3e, 0xf5, 0x6a, 0x2d, 0x37, 0x16, 0xfa, 0xd4, 0x5c, 0x8f, + 0xdb, 0x23, 0x3f, 0x46, 0x50, 0xe2, 0x95, 0x66, 0x7c, 0x66, 0x1c, 0x66, 0xb5, 0x10, 0x3d, 0x4f, + 0xd3, 0x9f, 0xe3, 0x50, 0x6b, 0xad, 0xbc, 0x84, 0xb2, 0x8e, 0x56, 0x71, 0x1f, 0x16, 0xe3, 0xda, + 0xee, 0x78, 0xf7, 0xc8, 0xd4, 0x7e, 0xab, 0xb5, 0x9c, 0x0b, 0x4e, 0xec, 0xa8, 0x22, 0x97, 0xad, + 0x4e, 0xca, 0x65, 0x0b, 0x2c, 0xdd, 0xe0, 0xd3, 0x79, 0xc9, 0xe8, 0xbf, 0x60, 0x98, 0x0b, 0x1c, + 0xdd, 0x59, 0xbd, 0x36, 0x29, 0x9f, 0x31, 0xeb, 0x7c, 0x0f, 0xc1, 0x91, 0xc1, 0x47, 0x02, 0x3e, + 0x39, 0xb2, 0xde, 0x26, 0x72, 0x6b, 0xd6, 0x8a, 0xe3, 0x1e, 0x18, 0xfa, 0x67, 0x38, 0x8a, 0x75, + 0xfc, 0xd8, 0xc4, 0x93, 0x71, 0x4b, 0x46, 0x1d, 0xc6, 0x68, 0x2d, 0xed, 0xdf, 0xfe, 0x1a, 0xc1, + 0x01, 0xc9, 0xf7, 0x4e, 0x40, 0x69, 0x3e, 0xac, 0xf9, 0x1d, 0x04, 0x26, 0x4b, 0x7f, 0x92, 0xc3, + 0xff, 0x14, 0xbe, 0x32, 0x25, 0x7c, 0x09, 0x7b, 0x2d, 0x62, 0x48, 0xff, 0x80, 0xe0, 0xe8, 0xdd, + 0xd8, 0xef, 0x3f, 0x26, 0xfc, 0x1b, 0x1c, 0xff, 0x53, 0xf8, 0x89, 0x9c, 0xfb, 0xea, 0x24, 0x35, + 0x2e, 0x21, 0xfc, 0x0b, 0x04, 0x65, 0xd9, 0xf7, 0xc3, 0xe7, 0xc7, 0x1e, 0x8c, 0x6c, 0x67, 0x70, + 0x9e, 0xce, 0x2c, 0x2e, 0x67, 0xfa, 0x99, 0xdc, 0x6c, 0x2a, 0xe4, 0x33, 0x87, 0x7e, 0x0b, 0x01, + 0x4e, 0xde, 0xfe, 0x49, 0x35, 0x00, 0x9f, 0xcb, 0x88, 0x1a, 0x5b, 0x60, 0xaa, 0x9e, 0x9f, 0x38, + 0x2f, 0x9b, 0x4a, 0x57, 0x73, 0x53, 0xa9, 0x97, 0xc8, 0x7f, 0x13, 0x41, 0xe5, 0x06, 0x4d, 0xde, + 0x52, 0x39, 0xb6, 0xcc, 0xb6, 0x2d, 0xab, 0xf5, 0xc9, 0x13, 0x05, 0xa2, 0x8b, 0x1c, 0xd1, 0x39, + 0x9c, 0x6f, 0x2a, 0x09, 0xe0, 0xfb, 0x08, 0x0e, 0xde, 0x56, 0x5d, 0x14, 0x5f, 0x9c, 0x24, 0x29, + 0x13, 0xc9, 0xa7, 0xc7, 0xf5, 0x28, 0xc7, 0xb5, 0xa6, 0x4f, 0x85, 0x6b, 0x5d, 0x74, 0x00, 0x7f, + 0x88, 0xe2, 0xc7, 0xf8, 0x40, 0xd5, 0xfe, 0x3f, 0xb5, 0x5b, 0x4e, 0xf1, 0x5f, 0xbf, 0xc2, 0xf1, + 0x35, 0xf0, 0xc5, 0x69, 0xf0, 0x35, 0x45, 0x29, 0x1f, 0xff, 0x00, 0xc1, 0x51, 0xde, 0xb6, 0x51, + 0x19, 0xe3, 0xbc, 0x4e, 0x45, 0xda, 0xe4, 0x99, 0x22, 0xc5, 0x3c, 0x1d, 0xc7, 0x1f, 0x7d, 0x5f, + 0xa0, 0xd6, 0x45, 0x43, 0xe6, 0x9b, 0x05, 0xc4, 0xf6, 0xf7, 0x81, 0x21, 0x7c, 0x2f, 0xb6, 0x06, + 0x0c, 0x38, 0xbe, 0x0d, 0x35, 0x05, 0xc6, 0x75, 0x8e, 0xf1, 0x8a, 0xde, 0xdc, 0x0f, 0xc6, 0x66, + 0xbf, 0xc5, 0x8e, 0xe9, 0xb7, 0x10, 0x1c, 0x92, 0x69, 0x57, 0xf8, 0xdf, 0xda, 0xa4, 0xad, 0xdd, + 0x6f, 0x9a, 0x16, 0x07, 0x62, 0x75, 0xba, 0x03, 0xf1, 0x2e, 0x82, 0x25, 0xd1, 0x55, 0xc9, 0xb9, + 0xcc, 0x28, 0x6d, 0x97, 0xea, 0x40, 0x35, 0x49, 0x94, 0xdd, 0xf5, 0x2f, 0x72, 0xb1, 0x2f, 0xe0, + 0x5c, 0xb3, 0xf8, 0x9e, 0x15, 0x36, 0x5f, 0x15, 0x35, 0xef, 0xd7, 0x9a, 0x8e, 0xd7, 0x0e, 0x5f, + 0xd2, 0x71, 0x6e, 0xca, 0x66, 0x73, 0x2e, 0x21, 0x1c, 0xc1, 0x32, 0x73, 0x5f, 0x5e, 0xa2, 0xc2, + 0xb5, 0x81, 0x82, 0xd6, 0x50, 0xf5, 0xaa, 0x5a, 0x1d, 0x2a, 0x79, 0xa5, 0x39, 0x5a, 0x14, 0x0c, + 0xf0, 0xc3, 0xb9, 0x62, 0xb9, 0xa0, 0x37, 0x10, 0x1c, 0x55, 0xcf, 0x63, 0x2c, 0x7e, 0xea, 0xd3, + 0x98, 0x87, 0x42, 0x5c, 0xfb, 0xf1, 0xea, 0x54, 0x6e, 0xc4, 0xe1, 0x3c, 0xf3, 0xec, 0x1f, 0x3f, + 0x38, 0x85, 0xde, 0xff, 0xe0, 0x14, 0xfa, 0xdb, 0x07, 0xa7, 0xd0, 0x4b, 0x8f, 0x4d, 0xf7, 0x3f, + 0x7b, 0xd3, 0xb1, 0xa9, 0x1b, 0xa9, 0xec, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x81, 0x66, 0x91, + 0xb9, 0x4d, 0x30, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3155,8 +3274,13 @@ type ApplicationServiceClient interface { PatchResource(ctx context.Context, in *ApplicationResourcePatchRequest, opts ...grpc.CallOption) (*ApplicationResourceResponse, error) // ListResourceActions returns list of resource actions ListResourceActions(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*ResourceActionsListResponse, error) - // RunResourceAction run resource action + // RunResourceAction runs a resource action + // + // Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is + // maintained for backward compatibility. It will be removed in a future release. RunResourceAction(ctx context.Context, in *ResourceActionRunRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) + // RunResourceActionV2 runs a resource action with parameters + RunResourceActionV2(ctx context.Context, in *ResourceActionRunRequestV2, opts ...grpc.CallOption) (*ApplicationResponse, error) // DeleteResource deletes a single application resource DeleteResource(ctx context.Context, in *ApplicationResourceDeleteRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod @@ -3462,6 +3586,7 @@ func (c *applicationServiceClient) ListResourceActions(ctx context.Context, in * return out, nil } +// Deprecated: Do not use. func (c *applicationServiceClient) RunResourceAction(ctx context.Context, in *ResourceActionRunRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) { out := new(ApplicationResponse) err := c.cc.Invoke(ctx, "/application.ApplicationService/RunResourceAction", in, out, opts...) @@ -3471,6 +3596,15 @@ func (c *applicationServiceClient) RunResourceAction(ctx context.Context, in *Re return out, nil } +func (c *applicationServiceClient) RunResourceActionV2(ctx context.Context, in *ResourceActionRunRequestV2, opts ...grpc.CallOption) (*ApplicationResponse, error) { + out := new(ApplicationResponse) + err := c.cc.Invoke(ctx, "/application.ApplicationService/RunResourceActionV2", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *applicationServiceClient) DeleteResource(ctx context.Context, in *ApplicationResourceDeleteRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) { out := new(ApplicationResponse) err := c.cc.Invoke(ctx, "/application.ApplicationService/DeleteResource", in, out, opts...) @@ -3580,8 +3714,13 @@ type ApplicationServiceServer interface { PatchResource(context.Context, *ApplicationResourcePatchRequest) (*ApplicationResourceResponse, error) // ListResourceActions returns list of resource actions ListResourceActions(context.Context, *ApplicationResourceRequest) (*ResourceActionsListResponse, error) - // RunResourceAction run resource action + // RunResourceAction runs a resource action + // + // Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is + // maintained for backward compatibility. It will be removed in a future release. RunResourceAction(context.Context, *ResourceActionRunRequest) (*ApplicationResponse, error) + // RunResourceActionV2 runs a resource action with parameters + RunResourceActionV2(context.Context, *ResourceActionRunRequestV2) (*ApplicationResponse, error) // DeleteResource deletes a single application resource DeleteResource(context.Context, *ApplicationResourceDeleteRequest) (*ApplicationResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod @@ -3671,6 +3810,9 @@ func (*UnimplementedApplicationServiceServer) ListResourceActions(ctx context.Co func (*UnimplementedApplicationServiceServer) RunResourceAction(ctx context.Context, req *ResourceActionRunRequest) (*ApplicationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RunResourceAction not implemented") } +func (*UnimplementedApplicationServiceServer) RunResourceActionV2(ctx context.Context, req *ResourceActionRunRequestV2) (*ApplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunResourceActionV2 not implemented") +} func (*UnimplementedApplicationServiceServer) DeleteResource(ctx context.Context, req *ApplicationResourceDeleteRequest) (*ApplicationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteResource not implemented") } @@ -4152,6 +4294,24 @@ func _ApplicationService_RunResourceAction_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ApplicationService_RunResourceActionV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResourceActionRunRequestV2) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).RunResourceActionV2(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/application.ApplicationService/RunResourceActionV2", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).RunResourceActionV2(ctx, req.(*ResourceActionRunRequestV2)) + } + return interceptor(ctx, in, info, handler) +} + func _ApplicationService_DeleteResource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ApplicationResourceDeleteRequest) if err := dec(in); err != nil { @@ -4319,6 +4479,10 @@ var _ApplicationService_serviceDesc = grpc.ServiceDesc{ MethodName: "RunResourceAction", Handler: _ApplicationService_RunResourceAction_Handler, }, + { + MethodName: "RunResourceActionV2", + Handler: _ApplicationService_RunResourceActionV2_Handler, + }, { MethodName: "DeleteResource", Handler: _ApplicationService_DeleteResource_Handler, @@ -5877,6 +6041,106 @@ func (m *ResourceActionRunRequest) MarshalTo(dAtA []byte) (int, error) { } func (m *ResourceActionRunRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Project != nil { + i -= len(*m.Project) + copy(dAtA[i:], *m.Project) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Project))) + i-- + dAtA[i] = 0x4a + } + if m.AppNamespace != nil { + i -= len(*m.AppNamespace) + copy(dAtA[i:], *m.AppNamespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.AppNamespace))) + i-- + dAtA[i] = 0x42 + } + if m.Action == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("action") + } else { + i -= len(*m.Action) + copy(dAtA[i:], *m.Action) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Action))) + i-- + dAtA[i] = 0x3a + } + if m.Kind == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") + } else { + i -= len(*m.Kind) + copy(dAtA[i:], *m.Kind) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Kind))) + i-- + dAtA[i] = 0x32 + } + if m.Group != nil { + i -= len(*m.Group) + copy(dAtA[i:], *m.Group) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Group))) + i-- + dAtA[i] = 0x2a + } + if m.Version == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") + } else { + i -= len(*m.Version) + copy(dAtA[i:], *m.Version) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Version))) + i-- + dAtA[i] = 0x22 + } + if m.ResourceName == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("resourceName") + } else { + i -= len(*m.ResourceName) + copy(dAtA[i:], *m.ResourceName) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.ResourceName))) + i-- + dAtA[i] = 0x1a + } + if m.Namespace != nil { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if m.Name == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } else { + i -= len(*m.Name) + copy(dAtA[i:], *m.Name) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResourceActionRunRequestV2) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceActionRunRequestV2) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceActionRunRequestV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7545,6 +7809,54 @@ func (m *ResourceActionParameters) Size() (n int) { } func (m *ResourceActionRunRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.ResourceName != nil { + l = len(*m.ResourceName) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Version != nil { + l = len(*m.Version) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Group != nil { + l = len(*m.Group) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Kind != nil { + l = len(*m.Kind) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Action != nil { + l = len(*m.Action) + n += 1 + l + sovApplication(uint64(l)) + } + if m.AppNamespace != nil { + l = len(*m.AppNamespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Project != nil { + l = len(*m.Project) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ResourceActionRunRequestV2) Size() (n int) { if m == nil { return 0 } @@ -13010,6 +13322,375 @@ func (m *ResourceActionRunRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.Project = &s iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("resourceName") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") + } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("action") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceActionRunRequestV2) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceActionRunRequestV2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceActionRunRequestV2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Namespace = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ResourceName = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Version = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Group = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Kind = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Action = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000010) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppNamespace = &s + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceActionParameters", wireType) diff --git a/pkg/apiclient/application/application.pb.gw.go b/pkg/apiclient/application/application.pb.gw.go index e302d60d03..80c8dec506 100644 --- a/pkg/apiclient/application/application.pb.gw.go +++ b/pkg/apiclient/application/application.pb.gw.go @@ -1715,6 +1715,10 @@ func local_request_ApplicationService_ListResourceActions_0(ctx context.Context, } +var ( + filter_ApplicationService_RunResourceAction_0 = &utilities.DoubleArray{Encoding: map[string]int{"action": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} +) + func request_ApplicationService_RunResourceAction_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ResourceActionRunRequest var metadata runtime.ServerMetadata @@ -1723,7 +1727,7 @@ func request_ApplicationService_RunResourceAction_0(ctx context.Context, marshal if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Action); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1745,6 +1749,13 @@ func request_ApplicationService_RunResourceAction_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_RunResourceAction_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.RunResourceAction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -1754,6 +1765,48 @@ func local_request_ApplicationService_RunResourceAction_0(ctx context.Context, m var protoReq ResourceActionRunRequest var metadata runtime.ServerMetadata + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Action); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_RunResourceAction_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RunResourceAction(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ApplicationService_RunResourceActionV2_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ResourceActionRunRequestV2 + var metadata runtime.ServerMetadata + newReader, berr := utilities.IOReaderFactory(req.Body) if berr != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) @@ -1780,7 +1833,42 @@ func local_request_ApplicationService_RunResourceAction_0(ctx context.Context, m return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - msg, err := server.RunResourceAction(ctx, &protoReq) + msg, err := client.RunResourceActionV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationService_RunResourceActionV2_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ResourceActionRunRequestV2 + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + msg, err := server.RunResourceActionV2(ctx, &protoReq) return msg, metadata, err } @@ -2637,6 +2725,29 @@ func RegisterApplicationServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("POST", pattern_ApplicationService_RunResourceActionV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationService_RunResourceActionV2_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_RunResourceActionV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_ApplicationService_DeleteResource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3261,6 +3372,26 @@ func RegisterApplicationServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("POST", pattern_ApplicationService_RunResourceActionV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationService_RunResourceActionV2_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_RunResourceActionV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_ApplicationService_DeleteResource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3415,6 +3546,8 @@ var ( pattern_ApplicationService_RunResourceAction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"api", "v1", "applications", "name", "resource", "actions"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationService_RunResourceActionV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5, 2, 6}, []string{"api", "v1", "applications", "name", "resource", "actions", "v2"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationService_DeleteResource_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "resource"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ApplicationService_PodLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"api", "v1", "applications", "name", "pods", "podName", "logs"}, "", runtime.AssumeColonVerbOpt(true))) @@ -3477,6 +3610,8 @@ var ( forward_ApplicationService_RunResourceAction_0 = runtime.ForwardResponseMessage + forward_ApplicationService_RunResourceActionV2_0 = runtime.ForwardResponseMessage + forward_ApplicationService_DeleteResource_0 = runtime.ForwardResponseMessage forward_ApplicationService_PodLogs_0 = runtime.ForwardResponseStream diff --git a/server/application/application.go b/server/application/application.go index 29944e644a..4285d79132 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -2497,7 +2497,32 @@ func (s *Server) getAvailableActions(resourceOverrides map[string]v1alpha1.Resou return availableActions, nil } +// RunResourceAction runs a resource action on a live resource +// +// Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is +// maintained for backward compatibility. It will be removed in a future release. func (s *Server) RunResourceAction(ctx context.Context, q *application.ResourceActionRunRequest) (*application.ApplicationResponse, error) { + log.WithFields(log.Fields{ + "action": q.Action, + "application": q.Name, + "app-namespace": q.AppNamespace, + "project": q.Project, + "user": session.Username(ctx), + }).Warn("RunResourceAction was called. RunResourceAction is deprecated and will be removed in a future release. Use RunResourceActionV2 instead.") + qV2 := &application.ResourceActionRunRequestV2{ + Name: q.Name, + AppNamespace: q.AppNamespace, + Namespace: q.Namespace, + ResourceName: q.ResourceName, + Kind: q.Kind, + Version: q.Version, + Group: q.Group, + Project: q.Project, + } + return s.RunResourceActionV2(ctx, qV2) +} + +func (s *Server) RunResourceActionV2(ctx context.Context, q *application.ResourceActionRunRequestV2) (*application.ApplicationResponse, error) { resourceRequest := &application.ApplicationResourceRequest{ Name: q.Name, AppNamespace: q.AppNamespace, diff --git a/server/application/application.proto b/server/application/application.proto index 7cd69c3d40..6cbfd77687 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -208,7 +208,22 @@ message ResourceActionParameters { required string value = 2; } +// ResourceActionRunRequest is a request to run a resource action. +// This message is deprecated and replaced by ResourceActionRunRequestV2. message ResourceActionRunRequest { + option deprecated = true; + required string name = 1; + optional string namespace = 2; + required string resourceName = 3; + required string version = 4; + optional string group = 5; + required string kind = 6; + required string action = 7; + optional string appNamespace = 8; + optional string project = 9; +} + +message ResourceActionRunRequestV2 { required string name = 1; optional string namespace = 2; required string resourceName = 3; @@ -470,10 +485,22 @@ service ApplicationService { option (google.api.http).get = "/api/v1/applications/{name}/resource/actions"; } - // RunResourceAction run resource action + // RunResourceAction runs a resource action + // + // Deprecated: use RunResourceActionV2 instead. This version does not support resource action parameters but is + // maintained for backward compatibility. It will be removed in a future release. rpc RunResourceAction(ResourceActionRunRequest) returns (ApplicationResponse) { + option deprecated = true; option (google.api.http) = { post: "/api/v1/applications/{name}/resource/actions" + body: "action" + }; + } + + // RunResourceActionV2 runs a resource action with parameters + rpc RunResourceActionV2(ResourceActionRunRequestV2) returns (ApplicationResponse) { + option (google.api.http) = { + post: "/api/v1/applications/{name}/resource/actions/v2" body: "*" }; } diff --git a/server/application/application_test.go b/server/application/application_test.go index 56a9718975..006ebb88e1 100644 --- a/server/application/application_test.go +++ b/server/application/application_test.go @@ -989,15 +989,15 @@ func TestNoAppEnumeration(t *testing.T) { }) t.Run("RunResourceAction", func(t *testing.T) { - _, err := appServer.RunResourceAction(adminCtx, &application.ResourceActionRunRequest{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test"), Action: ptr.To("restart")}) + _, err := appServer.RunResourceActionV2(adminCtx, &application.ResourceActionRunRequestV2{Name: ptr.To("test"), ResourceName: ptr.To("test"), Group: ptr.To("apps"), Kind: ptr.To("Deployment"), Namespace: ptr.To("test"), Action: ptr.To("restart")}) require.NoError(t, err) - _, err = appServer.RunResourceAction(noRoleCtx, &application.ResourceActionRunRequest{Name: ptr.To("test")}) + _, err = appServer.RunResourceActionV2(noRoleCtx, &application.ResourceActionRunRequestV2{Name: ptr.To("test")}) require.EqualError(t, err, common.PermissionDeniedAPIError.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") - _, err = appServer.RunResourceAction(noRoleCtx, &application.ResourceActionRunRequest{Group: ptr.To("argoproj.io"), Kind: ptr.To("Application"), Name: ptr.To("test")}) + _, err = appServer.RunResourceActionV2(noRoleCtx, &application.ResourceActionRunRequestV2{Group: ptr.To("argoproj.io"), Kind: ptr.To("Application"), Name: ptr.To("test")}) require.EqualError(t, err, common.PermissionDeniedAPIError.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") - _, err = appServer.RunResourceAction(adminCtx, &application.ResourceActionRunRequest{Name: ptr.To("doest-not-exist")}) + _, err = appServer.RunResourceActionV2(adminCtx, &application.ResourceActionRunRequestV2{Name: ptr.To("doest-not-exist")}) require.EqualError(t, err, common.PermissionDeniedAPIError.Error(), "error message must be _only_ the permission error, to avoid leaking information about app existence") - _, err = appServer.RunResourceAction(adminCtx, &application.ResourceActionRunRequest{Name: ptr.To("doest-not-exist"), Project: ptr.To("test")}) + _, err = appServer.RunResourceActionV2(adminCtx, &application.ResourceActionRunRequestV2{Name: ptr.To("doest-not-exist"), Project: ptr.To("test")}) assert.EqualError(t, err, "rpc error: code = NotFound desc = applications.argoproj.io \"doest-not-exist\" not found", "when the request specifies a project, we can return the standard k8s error message") }) @@ -2536,7 +2536,7 @@ func TestRunNewStyleResourceAction(t *testing.T) { err := appStateCache.SetAppResourcesTree(testApp.Name, &v1alpha1.ApplicationTree{Nodes: nodes}) require.NoError(t, err) - appResponse, runErr := appServer.RunResourceAction(t.Context(), &application.ResourceActionRunRequest{ + appResponse, runErr := appServer.RunResourceActionV2(t.Context(), &application.ResourceActionRunRequestV2{ Name: &testApp.Name, Namespace: &namespace, Action: &action, @@ -2562,7 +2562,7 @@ func TestRunNewStyleResourceAction(t *testing.T) { err := appStateCache.SetAppResourcesTree(testApp.Name, &v1alpha1.ApplicationTree{Nodes: nodes}) require.NoError(t, err) - appResponse, runErr := appServer.RunResourceAction(t.Context(), &application.ResourceActionRunRequest{ + appResponse, runErr := appServer.RunResourceActionV2(t.Context(), &application.ResourceActionRunRequestV2{ Name: &testApp.Name, Namespace: &namespace, Action: &action, @@ -2633,7 +2633,7 @@ func TestRunOldStyleResourceAction(t *testing.T) { err := appStateCache.SetAppResourcesTree(testApp.Name, &v1alpha1.ApplicationTree{Nodes: nodes}) require.NoError(t, err) - appResponse, runErr := appServer.RunResourceAction(t.Context(), &application.ResourceActionRunRequest{ + appResponse, runErr := appServer.RunResourceActionV2(t.Context(), &application.ResourceActionRunRequestV2{ Name: &testApp.Name, Namespace: &namespace, Action: &action, diff --git a/test/e2e/app_management_ns_test.go b/test/e2e/app_management_ns_test.go index ad81a35150..f28ede2660 100644 --- a/test/e2e/app_management_ns_test.go +++ b/test/e2e/app_management_ns_test.go @@ -875,7 +875,7 @@ func TestNamespacedResourceAction(t *testing.T) { require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) - _, err = client.RunResourceAction(t.Context(), &applicationpkg.ResourceActionRunRequest{ + _, err = client.RunResourceActionV2(t.Context(), &applicationpkg.ResourceActionRunRequestV2{ Name: &app.Name, Group: ptr.To("apps"), Kind: ptr.To("Deployment"), @@ -1076,7 +1076,7 @@ func assertNSResourceActions(t *testing.T, appName string, successful bool) { }) assertError(err, expectedError) - _, err = cdClient.RunResourceAction(t.Context(), &applicationpkg.ResourceActionRunRequest{ + _, err = cdClient.RunResourceActionV2(t.Context(), &applicationpkg.ResourceActionRunRequestV2{ Name: &appName, AppNamespace: ptr.To(fixture.AppNamespace()), ResourceName: ptr.To("guestbook-ui"), diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go index 0c6b97e6bb..6d4ff14849 100644 --- a/test/e2e/app_management_test.go +++ b/test/e2e/app_management_test.go @@ -1086,7 +1086,7 @@ func TestOldStyleResourceAction(t *testing.T) { require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) - _, err = client.RunResourceAction(t.Context(), &applicationpkg.ResourceActionRunRequest{ + _, err = client.RunResourceActionV2(t.Context(), &applicationpkg.ResourceActionRunRequestV2{ Name: &app.Name, Group: ptr.To("apps"), Kind: ptr.To("Deployment"), @@ -1192,7 +1192,7 @@ func TestNewStyleResourceActionPermitted(t *testing.T) { require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) - _, err = client.RunResourceAction(t.Context(), &applicationpkg.ResourceActionRunRequest{ + _, err = client.RunResourceActionV2(t.Context(), &applicationpkg.ResourceActionRunRequestV2{ Name: &app.Name, Group: ptr.To("batch"), Kind: ptr.To("CronJob"), @@ -1304,7 +1304,7 @@ func TestNewStyleResourceActionMixedOk(t *testing.T) { require.NoError(t, err) assert.Equal(t, []*ResourceAction{{Name: "sample", Disabled: false}}, actions.Actions) - _, err = client.RunResourceAction(t.Context(), &applicationpkg.ResourceActionRunRequest{ + _, err = client.RunResourceActionV2(t.Context(), &applicationpkg.ResourceActionRunRequestV2{ Name: &app.Name, Group: ptr.To("batch"), Kind: ptr.To("CronJob"), @@ -1507,7 +1507,7 @@ func assertResourceActions(t *testing.T, appName string, successful bool) { }) assertError(err, expectedError) - _, err = cdClient.RunResourceAction(t.Context(), &applicationpkg.ResourceActionRunRequest{ + _, err = cdClient.RunResourceActionV2(t.Context(), &applicationpkg.ResourceActionRunRequestV2{ Name: &appName, ResourceName: ptr.To("guestbook-ui"), Namespace: ptr.To(fixture.DeploymentNamespace()), diff --git a/ui/src/app/shared/services/applications-service.ts b/ui/src/app/shared/services/applications-service.ts index 6f5544ca6c..6d05369b31 100644 --- a/ui/src/app/shared/services/applications-service.ts +++ b/ui/src/app/shared/services/applications-service.ts @@ -347,7 +347,7 @@ export class ApplicationsService { resourceActionParameters: models.ResourceActionParam[] ): Promise { return requests - .post(`/applications/${name}/resource/actions`) + .post(`/applications/${name}/resource/actions/v2`) .send( JSON.stringify({ appNamespace,