From 50a8977e55ce0e06c0419affff162c7ec96ff7db Mon Sep 17 00:00:00 2001 From: Santiago Jimenez Giraldo Date: Mon, 22 Jan 2024 17:03:37 +0100 Subject: [PATCH 1/5] feat(proto): extend kafka-connect service Include get connector and get connector status messages Signed-off-by: Santiago Jimenez Giraldo --- .../kafka_connect.connect.go | 40 + .../kafka_connect.connect.gw.go | 6 + .../dataplane/v1alpha1/kafka_connect.pb.go | 1447 +++++++++-------- .../dataplane/v1alpha1/kafka_connect.pb.gw.go | 132 ++ .../v1alpha1/kafka_connect_grpc.pb.go | 47 + .../v1alpha1/kafka_connect_connect.ts | 17 +- .../dataplane/v1alpha1/kafka_connect_pb.ts | 132 +- proto/gen/openapi/openapi.json | 2 +- proto/gen/openapi/openapi.yaml | 66 +- .../dataplane/v1alpha1/kafka_connect.proto | 46 +- 10 files changed, 1224 insertions(+), 711 deletions(-) diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.go b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.go index 1849c9a86..49303dedf 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.go @@ -54,6 +54,9 @@ const ( // KafkaConnectServiceGetConnectorProcedure is the fully-qualified name of the KafkaConnectService's // GetConnector RPC. KafkaConnectServiceGetConnectorProcedure = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/GetConnector" + // KafkaConnectServiceGetConnectorStatusProcedure is the fully-qualified name of the + // KafkaConnectService's GetConnectorStatus RPC. + KafkaConnectServiceGetConnectorStatusProcedure = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/GetConnectorStatus" // KafkaConnectServicePauseConnectorProcedure is the fully-qualified name of the // KafkaConnectService's PauseConnector RPC. KafkaConnectServicePauseConnectorProcedure = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/PauseConnector" @@ -89,6 +92,7 @@ var ( kafkaConnectServiceCreateConnectorMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("CreateConnector") kafkaConnectServiceRestartConnectorMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("RestartConnector") kafkaConnectServiceGetConnectorMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("GetConnector") + kafkaConnectServiceGetConnectorStatusMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("GetConnectorStatus") kafkaConnectServicePauseConnectorMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("PauseConnector") kafkaConnectServiceResumeConnectorMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("ResumeConnector") kafkaConnectServiceStopConnectorMethodDescriptor = kafkaConnectServiceServiceDescriptor.Methods().ByName("StopConnector") @@ -120,6 +124,12 @@ type KafkaConnectServiceClient interface { // GetConnector implements the get connector method, exposes a Kafka // Connect equivalent REST endpoint GetConnector(context.Context, *connect.Request[v1alpha1.GetConnectorRequest]) (*connect.Response[v1alpha1.GetConnectorResponse], error) + // GetConnectorStatus implement the get status method, Gets the current status of the connector, including: + // Whether it is running or restarting, or if it has failed or paused + // Which worker it is assigned to + // Error information if it has failed + // The state of all its tasks + GetConnectorStatus(context.Context, *connect.Request[v1alpha1.GetConnectorStatusRequest]) (*connect.Response[v1alpha1.GetConnectorStatusResponse], error) // PauseConnector implements the pause connector method, exposes a Kafka // connect equivalent REST endpoint PauseConnector(context.Context, *connect.Request[v1alpha1.PauseConnectorRequest]) (*connect.Response[emptypb.Empty], error) @@ -192,6 +202,12 @@ func NewKafkaConnectServiceClient(httpClient connect.HTTPClient, baseURL string, connect.WithSchema(kafkaConnectServiceGetConnectorMethodDescriptor), connect.WithClientOptions(opts...), ), + getConnectorStatus: connect.NewClient[v1alpha1.GetConnectorStatusRequest, v1alpha1.GetConnectorStatusResponse]( + httpClient, + baseURL+KafkaConnectServiceGetConnectorStatusProcedure, + connect.WithSchema(kafkaConnectServiceGetConnectorStatusMethodDescriptor), + connect.WithClientOptions(opts...), + ), pauseConnector: connect.NewClient[v1alpha1.PauseConnectorRequest, emptypb.Empty]( httpClient, baseURL+KafkaConnectServicePauseConnectorProcedure, @@ -251,6 +267,7 @@ type kafkaConnectServiceClient struct { createConnector *connect.Client[v1alpha1.CreateConnectorRequest, v1alpha1.CreateConnectorResponse] restartConnector *connect.Client[v1alpha1.RestartConnectorRequest, emptypb.Empty] getConnector *connect.Client[v1alpha1.GetConnectorRequest, v1alpha1.GetConnectorResponse] + getConnectorStatus *connect.Client[v1alpha1.GetConnectorStatusRequest, v1alpha1.GetConnectorStatusResponse] pauseConnector *connect.Client[v1alpha1.PauseConnectorRequest, emptypb.Empty] resumeConnector *connect.Client[v1alpha1.ResumeConnectorRequest, emptypb.Empty] stopConnector *connect.Client[v1alpha1.StopConnectorRequest, emptypb.Empty] @@ -292,6 +309,11 @@ func (c *kafkaConnectServiceClient) GetConnector(ctx context.Context, req *conne return c.getConnector.CallUnary(ctx, req) } +// GetConnectorStatus calls redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorStatus. +func (c *kafkaConnectServiceClient) GetConnectorStatus(ctx context.Context, req *connect.Request[v1alpha1.GetConnectorStatusRequest]) (*connect.Response[v1alpha1.GetConnectorStatusResponse], error) { + return c.getConnectorStatus.CallUnary(ctx, req) +} + // PauseConnector calls redpanda.api.dataplane.v1alpha1.KafkaConnectService.PauseConnector. func (c *kafkaConnectServiceClient) PauseConnector(ctx context.Context, req *connect.Request[v1alpha1.PauseConnectorRequest]) (*connect.Response[emptypb.Empty], error) { return c.pauseConnector.CallUnary(ctx, req) @@ -355,6 +377,12 @@ type KafkaConnectServiceHandler interface { // GetConnector implements the get connector method, exposes a Kafka // Connect equivalent REST endpoint GetConnector(context.Context, *connect.Request[v1alpha1.GetConnectorRequest]) (*connect.Response[v1alpha1.GetConnectorResponse], error) + // GetConnectorStatus implement the get status method, Gets the current status of the connector, including: + // Whether it is running or restarting, or if it has failed or paused + // Which worker it is assigned to + // Error information if it has failed + // The state of all its tasks + GetConnectorStatus(context.Context, *connect.Request[v1alpha1.GetConnectorStatusRequest]) (*connect.Response[v1alpha1.GetConnectorStatusResponse], error) // PauseConnector implements the pause connector method, exposes a Kafka // connect equivalent REST endpoint PauseConnector(context.Context, *connect.Request[v1alpha1.PauseConnectorRequest]) (*connect.Response[emptypb.Empty], error) @@ -422,6 +450,12 @@ func NewKafkaConnectServiceHandler(svc KafkaConnectServiceHandler, opts ...conne connect.WithSchema(kafkaConnectServiceGetConnectorMethodDescriptor), connect.WithHandlerOptions(opts...), ) + kafkaConnectServiceGetConnectorStatusHandler := connect.NewUnaryHandler( + KafkaConnectServiceGetConnectorStatusProcedure, + svc.GetConnectorStatus, + connect.WithSchema(kafkaConnectServiceGetConnectorStatusMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) kafkaConnectServicePauseConnectorHandler := connect.NewUnaryHandler( KafkaConnectServicePauseConnectorProcedure, svc.PauseConnector, @@ -484,6 +518,8 @@ func NewKafkaConnectServiceHandler(svc KafkaConnectServiceHandler, opts ...conne kafkaConnectServiceRestartConnectorHandler.ServeHTTP(w, r) case KafkaConnectServiceGetConnectorProcedure: kafkaConnectServiceGetConnectorHandler.ServeHTTP(w, r) + case KafkaConnectServiceGetConnectorStatusProcedure: + kafkaConnectServiceGetConnectorStatusHandler.ServeHTTP(w, r) case KafkaConnectServicePauseConnectorProcedure: kafkaConnectServicePauseConnectorHandler.ServeHTTP(w, r) case KafkaConnectServiceResumeConnectorProcedure: @@ -533,6 +569,10 @@ func (UnimplementedKafkaConnectServiceHandler) GetConnector(context.Context, *co return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnector is not implemented")) } +func (UnimplementedKafkaConnectServiceHandler) GetConnectorStatus(context.Context, *connect.Request[v1alpha1.GetConnectorStatusRequest]) (*connect.Response[v1alpha1.GetConnectorStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorStatus is not implemented")) +} + func (UnimplementedKafkaConnectServiceHandler) PauseConnector(context.Context, *connect.Request[v1alpha1.PauseConnectorRequest]) (*connect.Response[emptypb.Empty], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1alpha1.KafkaConnectService.PauseConnector is not implemented")) } diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.gw.go b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.gw.go index 222761889..221f3887c 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.gw.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect/kafka_connect.connect.gw.go @@ -25,6 +25,7 @@ type KafkaConnectServiceGatewayServer struct { createConnector connect_gateway.UnaryHandler[v1alpha1.CreateConnectorRequest, v1alpha1.CreateConnectorResponse] restartConnector connect_gateway.UnaryHandler[v1alpha1.RestartConnectorRequest, emptypb.Empty] getConnector connect_gateway.UnaryHandler[v1alpha1.GetConnectorRequest, v1alpha1.GetConnectorResponse] + getConnectorStatus connect_gateway.UnaryHandler[v1alpha1.GetConnectorStatusRequest, v1alpha1.GetConnectorStatusResponse] pauseConnector connect_gateway.UnaryHandler[v1alpha1.PauseConnectorRequest, emptypb.Empty] resumeConnector connect_gateway.UnaryHandler[v1alpha1.ResumeConnectorRequest, emptypb.Empty] stopConnector connect_gateway.UnaryHandler[v1alpha1.StopConnectorRequest, emptypb.Empty] @@ -45,6 +46,7 @@ func NewKafkaConnectServiceGatewayServer(svc KafkaConnectServiceHandler, opts .. createConnector: connect_gateway.NewUnaryHandler(KafkaConnectServiceCreateConnectorProcedure, svc.CreateConnector, opts...), restartConnector: connect_gateway.NewUnaryHandler(KafkaConnectServiceRestartConnectorProcedure, svc.RestartConnector, opts...), getConnector: connect_gateway.NewUnaryHandler(KafkaConnectServiceGetConnectorProcedure, svc.GetConnector, opts...), + getConnectorStatus: connect_gateway.NewUnaryHandler(KafkaConnectServiceGetConnectorStatusProcedure, svc.GetConnectorStatus, opts...), pauseConnector: connect_gateway.NewUnaryHandler(KafkaConnectServicePauseConnectorProcedure, svc.PauseConnector, opts...), resumeConnector: connect_gateway.NewUnaryHandler(KafkaConnectServiceResumeConnectorProcedure, svc.ResumeConnector, opts...), stopConnector: connect_gateway.NewUnaryHandler(KafkaConnectServiceStopConnectorProcedure, svc.StopConnector, opts...), @@ -80,6 +82,10 @@ func (s *KafkaConnectServiceGatewayServer) GetConnector(ctx context.Context, req return s.getConnector(ctx, req) } +func (s *KafkaConnectServiceGatewayServer) GetConnectorStatus(ctx context.Context, req *v1alpha1.GetConnectorStatusRequest) (*v1alpha1.GetConnectorStatusResponse, error) { + return s.getConnectorStatus(ctx, req) +} + func (s *KafkaConnectServiceGatewayServer) PauseConnector(ctx context.Context, req *v1alpha1.PauseConnectorRequest) (*emptypb.Empty, error) { return s.pauseConnector(ctx, req) } diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.go b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.go index 12a6fbf29..cd8896304 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.go @@ -308,7 +308,11 @@ type ConnectorStatus struct { Connector *ConnectorStatus_Connector `protobuf:"bytes,2,opt,name=connector,proto3" json:"connector,omitempty"` Tasks []*TaskStatus `protobuf:"bytes,3,rep,name=tasks,proto3" json:"tasks,omitempty"` Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - Trace string `protobuf:"bytes,5,opt,name=trace,proto3" json:"trace,omitempty"` + // holistic_state of all the tasks within the connector this is our internal + // holistic state concept + HolisticState ConnectorHolisticState `protobuf:"varint,5,opt,name=holistic_state,json=holisticState,proto3,enum=redpanda.api.dataplane.v1alpha1.ConnectorHolisticState" json:"holistic_state,omitempty"` + // Errors is list of parsed connectors' and tasks' errors + Errors []*ConnectorError `protobuf:"bytes,6,rep,name=errors,proto3" json:"errors,omitempty"` } func (x *ConnectorStatus) Reset() { @@ -371,11 +375,18 @@ func (x *ConnectorStatus) GetType() string { return "" } -func (x *ConnectorStatus) GetTrace() string { +func (x *ConnectorStatus) GetHolisticState() ConnectorHolisticState { if x != nil { - return x.Trace + return x.HolisticState } - return "" + return ConnectorHolisticState_CONNECTOR_HOLISTIC_STATE_UNSPECIFIED +} + +func (x *ConnectorStatus) GetErrors() []*ConnectorError { + if x != nil { + return x.Errors + } + return nil } type TaskStatus struct { @@ -1097,9 +1108,7 @@ type GetConnectorResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Connector *ConnectorSpec `protobuf:"bytes,1,opt,name=connector,proto3" json:"connector,omitempty"` - HolisticState ConnectorHolisticState `protobuf:"varint,4,opt,name=holistic_state,json=holisticState,proto3,enum=redpanda.api.dataplane.v1alpha1.ConnectorHolisticState" json:"holistic_state,omitempty"` - Errors []*ConnectorError `protobuf:"bytes,5,rep,name=errors,proto3" json:"errors,omitempty"` + Connector *ConnectorSpec `protobuf:"bytes,1,opt,name=connector,proto3" json:"connector,omitempty"` } func (x *GetConnectorResponse) Reset() { @@ -1141,20 +1150,6 @@ func (x *GetConnectorResponse) GetConnector() *ConnectorSpec { return nil } -func (x *GetConnectorResponse) GetHolisticState() ConnectorHolisticState { - if x != nil { - return x.HolisticState - } - return ConnectorHolisticState_CONNECTOR_HOLISTIC_STATE_UNSPECIFIED -} - -func (x *GetConnectorResponse) GetErrors() []*ConnectorError { - if x != nil { - return x.Errors - } - return nil -} - type CreateConnectorResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1649,6 +1644,108 @@ func (x *GetConnectorConfigResponse) GetConfig() map[string]string { return nil } +type GetConnectorStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterName string `protobuf:"bytes,1,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetConnectorStatusRequest) Reset() { + *x = GetConnectorStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetConnectorStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConnectorStatusRequest) ProtoMessage() {} + +func (x *GetConnectorStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetConnectorStatusRequest.ProtoReflect.Descriptor instead. +func (*GetConnectorStatusRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{26} +} + +func (x *GetConnectorStatusRequest) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +func (x *GetConnectorStatusRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetConnectorStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status *ConnectorStatus `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *GetConnectorStatusResponse) Reset() { + *x = GetConnectorStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetConnectorStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConnectorStatusResponse) ProtoMessage() {} + +func (x *GetConnectorStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetConnectorStatusResponse.ProtoReflect.Descriptor instead. +func (*GetConnectorStatusResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{27} +} + +func (x *GetConnectorStatusResponse) GetStatus() *ConnectorStatus { + if x != nil { + return x.Status + } + return nil +} + type ListConnectorTopicsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1661,7 +1758,7 @@ type ListConnectorTopicsRequest struct { func (x *ListConnectorTopicsRequest) Reset() { *x = ListConnectorTopicsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[26] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1674,7 +1771,7 @@ func (x *ListConnectorTopicsRequest) String() string { func (*ListConnectorTopicsRequest) ProtoMessage() {} func (x *ListConnectorTopicsRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[26] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1687,7 +1784,7 @@ func (x *ListConnectorTopicsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListConnectorTopicsRequest.ProtoReflect.Descriptor instead. func (*ListConnectorTopicsRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{26} + return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{28} } func (x *ListConnectorTopicsRequest) GetClusterName() string { @@ -1715,7 +1812,7 @@ type ListConnectorTopicsResponse struct { func (x *ListConnectorTopicsResponse) Reset() { *x = ListConnectorTopicsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[27] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1728,7 +1825,7 @@ func (x *ListConnectorTopicsResponse) String() string { func (*ListConnectorTopicsResponse) ProtoMessage() {} func (x *ListConnectorTopicsResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[27] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1741,7 +1838,7 @@ func (x *ListConnectorTopicsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListConnectorTopicsResponse.ProtoReflect.Descriptor instead. func (*ListConnectorTopicsResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{27} + return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{29} } func (x *ListConnectorTopicsResponse) GetTopics() []string { @@ -1763,7 +1860,7 @@ type ResetConnectorTopicsRequest struct { func (x *ResetConnectorTopicsRequest) Reset() { *x = ResetConnectorTopicsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[28] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1776,7 +1873,7 @@ func (x *ResetConnectorTopicsRequest) String() string { func (*ResetConnectorTopicsRequest) ProtoMessage() {} func (x *ResetConnectorTopicsRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[28] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1789,7 +1886,7 @@ func (x *ResetConnectorTopicsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetConnectorTopicsRequest.ProtoReflect.Descriptor instead. func (*ResetConnectorTopicsRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{28} + return file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP(), []int{30} } func (x *ResetConnectorTopicsRequest) GetClusterName() string { @@ -1819,7 +1916,7 @@ type ConnectCluster_Info struct { func (x *ConnectCluster_Info) Reset() { *x = ConnectCluster_Info{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[29] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1832,7 +1929,7 @@ func (x *ConnectCluster_Info) String() string { func (*ConnectCluster_Info) ProtoMessage() {} func (x *ConnectCluster_Info) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[29] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1876,12 +1973,13 @@ type ConnectorStatus_Connector struct { State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` WorkerId string `protobuf:"bytes,2,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"` + Trace string `protobuf:"bytes,3,opt,name=trace,proto3" json:"trace,omitempty"` } func (x *ConnectorStatus_Connector) Reset() { *x = ConnectorStatus_Connector{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[30] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1894,7 +1992,7 @@ func (x *ConnectorStatus_Connector) String() string { func (*ConnectorStatus_Connector) ProtoMessage() {} func (x *ConnectorStatus_Connector) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[30] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1924,6 +2022,13 @@ func (x *ConnectorStatus_Connector) GetWorkerId() string { return "" } +func (x *ConnectorStatus_Connector) GetTrace() string { + if x != nil { + return x.Trace + } + return "" +} + type RestartConnectorRequest_Options struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1936,7 +2041,7 @@ type RestartConnectorRequest_Options struct { func (x *RestartConnectorRequest_Options) Reset() { *x = RestartConnectorRequest_Options{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[32] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1949,7 +2054,7 @@ func (x *RestartConnectorRequest_Options) String() string { func (*RestartConnectorRequest_Options) ProtoMessage() {} func (x *RestartConnectorRequest_Options) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[32] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1988,17 +2093,12 @@ type ListConnectorsResponse_ConnectorInfoStatus struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Info *ConnectorSpec `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` Status *ConnectorStatus `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - // holistic_state of all the tasks within the connector this is our internal - // holistic state concept - HolisticState ConnectorHolisticState `protobuf:"varint,4,opt,name=holistic_state,json=holisticState,proto3,enum=redpanda.api.dataplane.v1alpha1.ConnectorHolisticState" json:"holistic_state,omitempty"` - // Errors is list of parsed connectors' and tasks' errors - Errors []*ConnectorError `protobuf:"bytes,5,rep,name=errors,proto3" json:"errors,omitempty"` } func (x *ListConnectorsResponse_ConnectorInfoStatus) Reset() { *x = ListConnectorsResponse_ConnectorInfoStatus{} if protoimpl.UnsafeEnabled { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[33] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2011,7 +2111,7 @@ func (x *ListConnectorsResponse_ConnectorInfoStatus) String() string { func (*ListConnectorsResponse_ConnectorInfoStatus) ProtoMessage() {} func (x *ListConnectorsResponse_ConnectorInfoStatus) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[33] + mi := &file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2048,20 +2148,6 @@ func (x *ListConnectorsResponse_ConnectorInfoStatus) GetStatus() *ConnectorStatu return nil } -func (x *ListConnectorsResponse_ConnectorInfoStatus) GetHolisticState() ConnectorHolisticState { - if x != nil { - return x.HolisticState - } - return ConnectorHolisticState_CONNECTOR_HOLISTIC_STATE_UNSPECIFIED -} - -func (x *ListConnectorsResponse_ConnectorInfoStatus) GetErrors() []*ConnectorError { - if x != nil { - return x.Errors - } - return nil -} - var File_redpanda_api_dataplane_v1alpha1_kafka_connect_proto protoreflect.FileDescriptor var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDesc = []byte{ @@ -2106,7 +2192,7 @@ var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDesc = []byte{ 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x22, 0xac, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x64, 0x22, 0xd5, 0x03, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x72, @@ -2119,595 +2205,621 @@ var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDesc = []byte{ 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x1a, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, - 0x22, 0x65, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0x3c, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0xca, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x48, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, - 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x02, 0x22, 0xa7, 0x02, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, - 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x44, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x15, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x93, 0x02, 0x0a, 0x17, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, - 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, - 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x72, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x68, 0x6f, + 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x6f, + 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x68, 0x6f, 0x6c, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x1a, 0x54, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x0a, 0x54, 0x61, 0x73, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x22, 0x3c, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0xca, + 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x48, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x22, 0xa7, 0x02, 0x0a, 0x0d, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1d, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4f, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x6e, - 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x65, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, - 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x64, 0x0a, 0x15, 0x50, 0x61, 0x75, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, - 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x63, 0x0a, 0x14, - 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, - 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x62, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x93, 0x02, 0x0a, 0x17, + 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x4f, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x6e, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x22, 0x65, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x64, 0x0a, 0x15, 0x50, 0x61, 0x75, 0x73, + 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, + 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, - 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x8d, 0x02, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, - 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x5e, 0x0a, 0x0e, 0x68, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x72, 0x65, - 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, - 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x68, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x67, 0x0a, 0x17, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x63, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, + 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x94, + 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x81, 0x05, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x96, 0x01, - 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x50, 0x61, - 0x67, 0x65, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, - 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, - 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0xe0, 0x02, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x64, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x48, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x5e, 0x0a, 0x0e, 0x68, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, - 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x48, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x0d, 0x68, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x47, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x67, 0x0a, 0x17, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x22, 0xd8, 0x03, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x96, 0x01, 0x0a, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6e, 0x92, 0x41, 0x6b, 0x32, 0x69, 0x50, 0x61, 0x67, + 0x65, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0xb7, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x42, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x48, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x48, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x6a, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, + 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x48, 0x0a, 0x18, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x66, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x49, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1b, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x64, - 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, - 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x66, 0x0a, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, - 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x67, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x68, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, - 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, - 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, + 0x61, 0x6d, 0x65, 0x12, 0x66, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x39, 0x0a, 0x0b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x68, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, 0x1b, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x74, 0x6f, 0x70, 0x69, - 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x06, 0x52, 0x06, 0x74, - 0x6f, 0x70, 0x69, 0x63, 0x73, 0x22, 0x6a, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, + 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x1a, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, + 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x66, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x69, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x2a, 0xa2, 0x03, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, - 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x24, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, - 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x50, 0x41, 0x55, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, - 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, + 0x65, 0x22, 0x3a, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x06, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x22, 0x6a, 0x0a, + 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, + 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0c, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0xa2, 0x03, 0x0a, 0x16, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x6f, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x24, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, + 0x0a, 0x1f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, + 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x55, 0x53, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, - 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, - 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, - 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, - 0x4e, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, - 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, - 0x06, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, - 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x07, 0x12, 0x25, 0x0a, 0x21, 0x43, 0x4f, 0x4e, + 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, + 0x45, 0x44, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x4f, + 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x53, 0x53, 0x49, 0x47, 0x4e, 0x45, + 0x44, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x06, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x08, - 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, - 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x09, 0x32, 0xec, 0x23, 0x0a, 0x13, 0x4b, 0x61, 0x66, 0x6b, 0x61, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xab, - 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x98, 0x01, 0x92, 0x41, 0x73, 0x12, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x5a, - 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x27, 0x73, 0x20, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, - 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0xd9, 0x02, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x39, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, - 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xcc, 0x01, 0x92, 0x41, 0x8e, 0x01, - 0x12, 0x13, 0x47, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x77, 0x47, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x20, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x20, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x34, 0x62, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x29, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xc4, 0x02, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x36, 0x2e, 0x72, 0x65, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, + 0x07, 0x12, 0x25, 0x0a, 0x21, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, + 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, + 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x08, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x43, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x09, 0x32, 0xd7, + 0x26, 0x0a, 0x13, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xab, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x3b, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x01, 0x92, 0x41, 0x73, 0x12, + 0x15, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x5a, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x6b, 0x61, 0x66, 0x6b, + 0x61, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x12, 0xd9, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x39, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xcc, 0x01, 0x92, 0x41, 0x8e, 0x01, 0x12, 0x13, 0x47, 0x65, 0x74, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x77, 0x47, + 0x65, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x27, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x62, 0x07, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x29, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0xc4, 0x02, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x92, - 0x41, 0x80, 0x01, 0x12, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0xae, 0x02, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, - 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa7, 0x01, 0x92, 0x41, 0x52, 0x12, 0x10, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3e, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x62, - 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x34, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0xc9, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x92, 0x41, 0x80, 0x01, 0x12, 0x0f, 0x4c, 0x69, 0x73, + 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x6d, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x61, 0x66, + 0x6b, 0x61, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x36, 0x12, 0x34, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xae, 0x02, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa7, + 0x01, 0x92, 0x41, 0x52, 0x12, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3e, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x09, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x62, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x22, 0x34, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xc9, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0xe2, 0x01, 0x92, 0x41, 0x8a, 0x01, 0x12, 0x11, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x75, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2c, + 0x20, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x79, + 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x6f, + 0x72, 0x2f, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x43, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x98, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x34, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xe2, 0x01, 0x92, 0x41, 0x8a, 0x01, 0x12, 0x11, - 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x1a, 0x75, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x73, - 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x2f, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x43, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x98, 0x02, 0x0a, - 0x0c, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x34, 0x2e, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x9a, 0x01, 0x92, 0x41, 0x49, 0x12, 0x0d, 0x47, 0x65, 0x74, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x38, 0x47, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x62, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x3b, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0xe8, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xd8, 0x01, 0x92, 0x41, 0x82, 0x01, 0x12, 0x14, 0x47, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x6a, 0x47, 0x65, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x2c, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x62, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0xbc, 0x02, 0x0a, 0x0e, 0x50, + 0x61, 0x75, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x01, 0x92, 0x41, 0x49, - 0x12, 0x0d, 0x47, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, - 0x38, 0x47, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x62, - 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xbc, 0x02, 0x0a, 0x0e, 0x50, 0x61, 0x75, 0x73, - 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x36, 0x2e, 0x72, 0x65, 0x64, - 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x75, - 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xd9, 0x01, 0x92, 0x41, 0x8c, - 0x01, 0x12, 0x0f, 0x50, 0x61, 0x75, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x1a, 0x79, 0x50, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x73, 0x74, 0x6f, - 0x70, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, - 0x61, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x43, 0x1a, 0x41, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x50, 0x61, 0x75, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xd9, 0x01, + 0x92, 0x41, 0x8c, 0x01, 0x12, 0x0f, 0x50, 0x61, 0x75, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x79, 0x50, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x74, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x73, 0x74, 0x6f, 0x70, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x1a, 0x41, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0xe4, 0x02, 0x0a, 0x0f, 0x52, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xff, + 0x01, 0x92, 0x41, 0xb1, 0x01, 0x12, 0x10, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x9c, 0x01, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x20, 0x61, 0x20, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x75, 0x73, 0x65, + 0x64, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x6e, + 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, + 0x61, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x1a, 0x42, 0x2f, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x12, 0xc2, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0xe1, 0x01, 0x92, 0x41, 0x95, 0x01, 0x12, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x82, 0x01, 0x53, 0x74, 0x6f, 0x70, 0x73, + 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x69, 0x74, + 0x20, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x20, 0x62, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x68, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x77, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x6c, 0x79, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x42, 0x1a, 0x40, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0xe4, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, - 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xff, 0x01, 0x92, 0x41, - 0xb1, 0x01, 0x12, 0x10, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x9c, 0x01, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x61, 0x20, - 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, - 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x68, - 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x20, - 0x49, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x68, - 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x75, 0x73, - 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x1a, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x8e, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xa9, 0x01, 0x92, 0x41, 0x63, + 0x12, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x1a, 0x4f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, + 0x79, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x2a, 0x3b, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0xc2, 0x02, - 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xbf, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x73, 0x65, 0x72, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, + 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb8, 0x02, + 0x92, 0x41, 0xd7, 0x01, 0x12, 0x1e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb4, 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x2e, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x68, 0x61, 0x73, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x57, 0x3a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xac, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xe1, - 0x01, 0x92, 0x41, 0x95, 0x01, 0x12, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x20, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x82, 0x01, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x20, 0x61, 0x20, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, - 0x6f, 0x70, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x20, 0x62, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x68, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x6c, 0x79, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, - 0x1a, 0x40, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x73, 0x74, - 0x6f, 0x70, 0x12, 0x8e, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xa9, 0x01, 0x92, 0x41, 0x63, 0x12, 0x10, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, - 0x4f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x73, - 0x74, 0x6f, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x2a, 0x3b, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x7d, 0x12, 0xbf, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, - 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb8, 0x02, 0x92, 0x41, 0xd7, - 0x01, 0x12, 0x1e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x1a, 0xb4, 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, - 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, - 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, - 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x57, 0x3a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x1a, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xac, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x2e, 0x72, - 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, - 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x92, 0x41, 0x47, 0x12, 0x1b, 0x47, 0x65, 0x74, - 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x28, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x62, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0xdf, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x3b, 0x2e, 0x72, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x92, 0x41, 0x47, 0x12, 0x1b, + 0x47, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x28, 0x47, 0x65, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x62, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xdf, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, + 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, + 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, - 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xcc, 0x01, 0x92, 0x41, 0x7f, 0x12, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, - 0x70, 0x69, 0x63, 0x73, 0x1a, 0x66, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x20, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x69, - 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6e, - 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x69, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x44, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x9c, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, - 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xad, 0x01, 0x92, 0x41, 0x5a, 0x12, 0x16, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x70, - 0x69, 0x63, 0x73, 0x1a, 0x40, 0x52, 0x65, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x75, - 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x1a, 0x48, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x2f, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x42, 0xc0, 0x02, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, - 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, - 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x11, 0x4b, - 0x61, 0x66, 0x6b, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x67, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, - 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, - 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, - 0x61, 0x6e, 0x65, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, - 0x44, 0xaa, 0x02, 0x1f, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0xca, 0x02, 0x1f, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, - 0x70, 0x69, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5c, 0x56, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2b, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, - 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5c, 0x56, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x22, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, - 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x3a, 0x3a, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xcc, 0x01, 0x92, 0x41, 0x7f, + 0x12, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x20, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x1a, 0x66, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x9c, 0x02, 0x0a, 0x14, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, + 0x63, 0x73, 0x12, 0x3c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xad, 0x01, 0x92, 0x41, 0x5a, 0x12, 0x16, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x1a, 0x40, 0x52, 0x65, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x1a, 0x48, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x73, 0x2f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x42, 0xc0, 0x02, 0x0a, 0x23, 0x63, 0x6f, 0x6d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x42, 0x11, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x67, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2f, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, + 0x03, 0x52, 0x41, 0x44, 0xaa, 0x02, 0x1f, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x41, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x1f, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2b, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x22, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -2723,7 +2835,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDescGZIP() []by } var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes = make([]protoimpl.MessageInfo, 36) +var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes = make([]protoimpl.MessageInfo, 38) var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_goTypes = []interface{}{ (ConnectorHolisticState)(0), // 0: redpanda.api.dataplane.v1alpha1.ConnectorHolisticState (ConnectorError_Type)(0), // 1: redpanda.api.dataplane.v1alpha1.ConnectorError.Type @@ -2753,75 +2865,78 @@ var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_goTypes = []interfa (*UpsertConnectorResponse)(nil), // 25: redpanda.api.dataplane.v1alpha1.UpsertConnectorResponse (*GetConnectorConfigRequest)(nil), // 26: redpanda.api.dataplane.v1alpha1.GetConnectorConfigRequest (*GetConnectorConfigResponse)(nil), // 27: redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse - (*ListConnectorTopicsRequest)(nil), // 28: redpanda.api.dataplane.v1alpha1.ListConnectorTopicsRequest - (*ListConnectorTopicsResponse)(nil), // 29: redpanda.api.dataplane.v1alpha1.ListConnectorTopicsResponse - (*ResetConnectorTopicsRequest)(nil), // 30: redpanda.api.dataplane.v1alpha1.ResetConnectorTopicsRequest - (*ConnectCluster_Info)(nil), // 31: redpanda.api.dataplane.v1alpha1.ConnectCluster.Info - (*ConnectorStatus_Connector)(nil), // 32: redpanda.api.dataplane.v1alpha1.ConnectorStatus.Connector - nil, // 33: redpanda.api.dataplane.v1alpha1.ConnectorSpec.ConfigEntry - (*RestartConnectorRequest_Options)(nil), // 34: redpanda.api.dataplane.v1alpha1.RestartConnectorRequest.Options - (*ListConnectorsResponse_ConnectorInfoStatus)(nil), // 35: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus - nil, // 36: redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest.ConfigEntry - nil, // 37: redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse.ConfigEntry - (*emptypb.Empty)(nil), // 38: google.protobuf.Empty + (*GetConnectorStatusRequest)(nil), // 28: redpanda.api.dataplane.v1alpha1.GetConnectorStatusRequest + (*GetConnectorStatusResponse)(nil), // 29: redpanda.api.dataplane.v1alpha1.GetConnectorStatusResponse + (*ListConnectorTopicsRequest)(nil), // 30: redpanda.api.dataplane.v1alpha1.ListConnectorTopicsRequest + (*ListConnectorTopicsResponse)(nil), // 31: redpanda.api.dataplane.v1alpha1.ListConnectorTopicsResponse + (*ResetConnectorTopicsRequest)(nil), // 32: redpanda.api.dataplane.v1alpha1.ResetConnectorTopicsRequest + (*ConnectCluster_Info)(nil), // 33: redpanda.api.dataplane.v1alpha1.ConnectCluster.Info + (*ConnectorStatus_Connector)(nil), // 34: redpanda.api.dataplane.v1alpha1.ConnectorStatus.Connector + nil, // 35: redpanda.api.dataplane.v1alpha1.ConnectorSpec.ConfigEntry + (*RestartConnectorRequest_Options)(nil), // 36: redpanda.api.dataplane.v1alpha1.RestartConnectorRequest.Options + (*ListConnectorsResponse_ConnectorInfoStatus)(nil), // 37: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus + nil, // 38: redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest.ConfigEntry + nil, // 39: redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse.ConfigEntry + (*emptypb.Empty)(nil), // 40: google.protobuf.Empty } var file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_depIdxs = []int32{ - 31, // 0: redpanda.api.dataplane.v1alpha1.ConnectCluster.info:type_name -> redpanda.api.dataplane.v1alpha1.ConnectCluster.Info + 33, // 0: redpanda.api.dataplane.v1alpha1.ConnectCluster.info:type_name -> redpanda.api.dataplane.v1alpha1.ConnectCluster.Info 2, // 1: redpanda.api.dataplane.v1alpha1.ConnectCluster.plugins:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorPlugin - 32, // 2: redpanda.api.dataplane.v1alpha1.ConnectorStatus.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorStatus.Connector + 34, // 2: redpanda.api.dataplane.v1alpha1.ConnectorStatus.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorStatus.Connector 5, // 3: redpanda.api.dataplane.v1alpha1.ConnectorStatus.tasks:type_name -> redpanda.api.dataplane.v1alpha1.TaskStatus - 1, // 4: redpanda.api.dataplane.v1alpha1.ConnectorError.type:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorError.Type - 33, // 5: redpanda.api.dataplane.v1alpha1.ConnectorSpec.config:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec.ConfigEntry - 6, // 6: redpanda.api.dataplane.v1alpha1.ConnectorSpec.tasks:type_name -> redpanda.api.dataplane.v1alpha1.TaskInfo - 34, // 7: redpanda.api.dataplane.v1alpha1.RestartConnectorRequest.options:type_name -> redpanda.api.dataplane.v1alpha1.RestartConnectorRequest.Options - 8, // 8: redpanda.api.dataplane.v1alpha1.CreateConnectorRequest.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec - 8, // 9: redpanda.api.dataplane.v1alpha1.GetConnectorResponse.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec - 0, // 10: redpanda.api.dataplane.v1alpha1.GetConnectorResponse.holistic_state:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorHolisticState - 7, // 11: redpanda.api.dataplane.v1alpha1.GetConnectorResponse.errors:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorError + 0, // 4: redpanda.api.dataplane.v1alpha1.ConnectorStatus.holistic_state:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorHolisticState + 7, // 5: redpanda.api.dataplane.v1alpha1.ConnectorStatus.errors:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorError + 1, // 6: redpanda.api.dataplane.v1alpha1.ConnectorError.type:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorError.Type + 35, // 7: redpanda.api.dataplane.v1alpha1.ConnectorSpec.config:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec.ConfigEntry + 6, // 8: redpanda.api.dataplane.v1alpha1.ConnectorSpec.tasks:type_name -> redpanda.api.dataplane.v1alpha1.TaskInfo + 36, // 9: redpanda.api.dataplane.v1alpha1.RestartConnectorRequest.options:type_name -> redpanda.api.dataplane.v1alpha1.RestartConnectorRequest.Options + 8, // 10: redpanda.api.dataplane.v1alpha1.CreateConnectorRequest.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec + 8, // 11: redpanda.api.dataplane.v1alpha1.GetConnectorResponse.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec 8, // 12: redpanda.api.dataplane.v1alpha1.CreateConnectorResponse.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec - 35, // 13: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.connectors:type_name -> redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus + 37, // 13: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.connectors:type_name -> redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus 3, // 14: redpanda.api.dataplane.v1alpha1.GetConnectClusterResponse.cluster:type_name -> redpanda.api.dataplane.v1alpha1.ConnectCluster 3, // 15: redpanda.api.dataplane.v1alpha1.ListConnectClustersResponse.clusters:type_name -> redpanda.api.dataplane.v1alpha1.ConnectCluster - 36, // 16: redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest.config:type_name -> redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest.ConfigEntry + 38, // 16: redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest.config:type_name -> redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest.ConfigEntry 8, // 17: redpanda.api.dataplane.v1alpha1.UpsertConnectorResponse.connector:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec - 37, // 18: redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse.config:type_name -> redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse.ConfigEntry - 8, // 19: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus.info:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec - 4, // 20: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus.status:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorStatus - 0, // 21: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus.holistic_state:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorHolisticState - 7, // 22: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus.errors:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorError - 22, // 23: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectClusters:input_type -> redpanda.api.dataplane.v1alpha1.ListConnectClustersRequest - 20, // 24: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectCluster:input_type -> redpanda.api.dataplane.v1alpha1.GetConnectClusterRequest - 9, // 25: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectors:input_type -> redpanda.api.dataplane.v1alpha1.ListConnectorsRequest - 16, // 26: redpanda.api.dataplane.v1alpha1.KafkaConnectService.CreateConnector:input_type -> redpanda.api.dataplane.v1alpha1.CreateConnectorRequest - 10, // 27: redpanda.api.dataplane.v1alpha1.KafkaConnectService.RestartConnector:input_type -> redpanda.api.dataplane.v1alpha1.RestartConnectorRequest - 15, // 28: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnector:input_type -> redpanda.api.dataplane.v1alpha1.GetConnectorRequest + 39, // 18: redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse.config:type_name -> redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse.ConfigEntry + 4, // 19: redpanda.api.dataplane.v1alpha1.GetConnectorStatusResponse.status:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorStatus + 8, // 20: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus.info:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorSpec + 4, // 21: redpanda.api.dataplane.v1alpha1.ListConnectorsResponse.ConnectorInfoStatus.status:type_name -> redpanda.api.dataplane.v1alpha1.ConnectorStatus + 22, // 22: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectClusters:input_type -> redpanda.api.dataplane.v1alpha1.ListConnectClustersRequest + 20, // 23: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectCluster:input_type -> redpanda.api.dataplane.v1alpha1.GetConnectClusterRequest + 9, // 24: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectors:input_type -> redpanda.api.dataplane.v1alpha1.ListConnectorsRequest + 16, // 25: redpanda.api.dataplane.v1alpha1.KafkaConnectService.CreateConnector:input_type -> redpanda.api.dataplane.v1alpha1.CreateConnectorRequest + 10, // 26: redpanda.api.dataplane.v1alpha1.KafkaConnectService.RestartConnector:input_type -> redpanda.api.dataplane.v1alpha1.RestartConnectorRequest + 15, // 27: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnector:input_type -> redpanda.api.dataplane.v1alpha1.GetConnectorRequest + 28, // 28: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorStatus:input_type -> redpanda.api.dataplane.v1alpha1.GetConnectorStatusRequest 12, // 29: redpanda.api.dataplane.v1alpha1.KafkaConnectService.PauseConnector:input_type -> redpanda.api.dataplane.v1alpha1.PauseConnectorRequest 13, // 30: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResumeConnector:input_type -> redpanda.api.dataplane.v1alpha1.ResumeConnectorRequest 14, // 31: redpanda.api.dataplane.v1alpha1.KafkaConnectService.StopConnector:input_type -> redpanda.api.dataplane.v1alpha1.StopConnectorRequest 11, // 32: redpanda.api.dataplane.v1alpha1.KafkaConnectService.DeleteConnector:input_type -> redpanda.api.dataplane.v1alpha1.DeleteConnectorRequest 24, // 33: redpanda.api.dataplane.v1alpha1.KafkaConnectService.UpsertConnector:input_type -> redpanda.api.dataplane.v1alpha1.UpsertConnectorRequest 26, // 34: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorConfig:input_type -> redpanda.api.dataplane.v1alpha1.GetConnectorConfigRequest - 28, // 35: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectorTopics:input_type -> redpanda.api.dataplane.v1alpha1.ListConnectorTopicsRequest - 30, // 36: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResetConnectorTopics:input_type -> redpanda.api.dataplane.v1alpha1.ResetConnectorTopicsRequest + 30, // 35: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectorTopics:input_type -> redpanda.api.dataplane.v1alpha1.ListConnectorTopicsRequest + 32, // 36: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResetConnectorTopics:input_type -> redpanda.api.dataplane.v1alpha1.ResetConnectorTopicsRequest 23, // 37: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectClusters:output_type -> redpanda.api.dataplane.v1alpha1.ListConnectClustersResponse 21, // 38: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectCluster:output_type -> redpanda.api.dataplane.v1alpha1.GetConnectClusterResponse 19, // 39: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectors:output_type -> redpanda.api.dataplane.v1alpha1.ListConnectorsResponse 18, // 40: redpanda.api.dataplane.v1alpha1.KafkaConnectService.CreateConnector:output_type -> redpanda.api.dataplane.v1alpha1.CreateConnectorResponse - 38, // 41: redpanda.api.dataplane.v1alpha1.KafkaConnectService.RestartConnector:output_type -> google.protobuf.Empty + 40, // 41: redpanda.api.dataplane.v1alpha1.KafkaConnectService.RestartConnector:output_type -> google.protobuf.Empty 17, // 42: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnector:output_type -> redpanda.api.dataplane.v1alpha1.GetConnectorResponse - 38, // 43: redpanda.api.dataplane.v1alpha1.KafkaConnectService.PauseConnector:output_type -> google.protobuf.Empty - 38, // 44: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResumeConnector:output_type -> google.protobuf.Empty - 38, // 45: redpanda.api.dataplane.v1alpha1.KafkaConnectService.StopConnector:output_type -> google.protobuf.Empty - 38, // 46: redpanda.api.dataplane.v1alpha1.KafkaConnectService.DeleteConnector:output_type -> google.protobuf.Empty - 25, // 47: redpanda.api.dataplane.v1alpha1.KafkaConnectService.UpsertConnector:output_type -> redpanda.api.dataplane.v1alpha1.UpsertConnectorResponse - 27, // 48: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorConfig:output_type -> redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse - 29, // 49: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectorTopics:output_type -> redpanda.api.dataplane.v1alpha1.ListConnectorTopicsResponse - 38, // 50: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResetConnectorTopics:output_type -> google.protobuf.Empty - 37, // [37:51] is the sub-list for method output_type - 23, // [23:37] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 29, // 43: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorStatus:output_type -> redpanda.api.dataplane.v1alpha1.GetConnectorStatusResponse + 40, // 44: redpanda.api.dataplane.v1alpha1.KafkaConnectService.PauseConnector:output_type -> google.protobuf.Empty + 40, // 45: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResumeConnector:output_type -> google.protobuf.Empty + 40, // 46: redpanda.api.dataplane.v1alpha1.KafkaConnectService.StopConnector:output_type -> google.protobuf.Empty + 40, // 47: redpanda.api.dataplane.v1alpha1.KafkaConnectService.DeleteConnector:output_type -> google.protobuf.Empty + 25, // 48: redpanda.api.dataplane.v1alpha1.KafkaConnectService.UpsertConnector:output_type -> redpanda.api.dataplane.v1alpha1.UpsertConnectorResponse + 27, // 49: redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorConfig:output_type -> redpanda.api.dataplane.v1alpha1.GetConnectorConfigResponse + 31, // 50: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ListConnectorTopics:output_type -> redpanda.api.dataplane.v1alpha1.ListConnectorTopicsResponse + 40, // 51: redpanda.api.dataplane.v1alpha1.KafkaConnectService.ResetConnectorTopics:output_type -> google.protobuf.Empty + 37, // [37:52] is the sub-list for method output_type + 22, // [22:37] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() } @@ -3143,7 +3258,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { } } file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListConnectorTopicsRequest); i { + switch v := v.(*GetConnectorStatusRequest); i { case 0: return &v.state case 1: @@ -3155,7 +3270,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { } } file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListConnectorTopicsResponse); i { + switch v := v.(*GetConnectorStatusResponse); i { case 0: return &v.state case 1: @@ -3167,7 +3282,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { } } file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetConnectorTopicsRequest); i { + switch v := v.(*ListConnectorTopicsRequest); i { case 0: return &v.state case 1: @@ -3179,7 +3294,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { } } file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectCluster_Info); i { + switch v := v.(*ListConnectorTopicsResponse); i { case 0: return &v.state case 1: @@ -3191,7 +3306,19 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { } } file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectorStatus_Connector); i { + switch v := v.(*ResetConnectorTopicsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnectCluster_Info); i { case 0: return &v.state case 1: @@ -3203,6 +3330,18 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { } } file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnectorStatus_Connector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestartConnectorRequest_Options); i { case 0: return &v.state @@ -3214,7 +3353,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { return nil } } - file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListConnectorsResponse_ConnectorInfoStatus); i { case 0: return &v.state @@ -3233,7 +3372,7 @@ func file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_redpanda_api_dataplane_v1alpha1_kafka_connect_proto_rawDesc, NumEnums: 2, - NumMessages: 36, + NumMessages: 38, NumExtensions: 0, NumServices: 1, }, diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.gw.go b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.gw.go index e4e361bc8..30e071d66 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.gw.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect.pb.gw.go @@ -399,6 +399,78 @@ func local_request_KafkaConnectService_GetConnector_0(ctx context.Context, marsh } +func request_KafkaConnectService_GetConnectorStatus_0(ctx context.Context, marshaler runtime.Marshaler, client KafkaConnectServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetConnectorStatusRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["cluster_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cluster_name") + } + + protoReq.ClusterName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cluster_name", err) + } + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + msg, err := client.GetConnectorStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_KafkaConnectService_GetConnectorStatus_0(ctx context.Context, marshaler runtime.Marshaler, server KafkaConnectServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetConnectorStatusRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["cluster_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cluster_name") + } + + protoReq.ClusterName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cluster_name", err) + } + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + msg, err := server.GetConnectorStatus(ctx, &protoReq) + return msg, metadata, err + +} + func request_KafkaConnectService_PauseConnector_0(ctx context.Context, marshaler runtime.Marshaler, client KafkaConnectServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq PauseConnectorRequest var metadata runtime.ServerMetadata @@ -1147,6 +1219,31 @@ func RegisterKafkaConnectServiceHandlerServer(ctx context.Context, mux *runtime. }) + mux.Handle("GET", pattern_KafkaConnectService_GetConnectorStatus_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) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/GetConnectorStatus", runtime.WithHTTPPathPattern("/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_KafkaConnectService_GetConnectorStatus_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_KafkaConnectService_GetConnectorStatus_0(annotatedContext, mux, outboundMarshaler, w, req, response_KafkaConnectService_GetConnectorStatus_0{resp}, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_KafkaConnectService_PauseConnector_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1520,6 +1617,28 @@ func RegisterKafkaConnectServiceHandlerClient(ctx context.Context, mux *runtime. }) + mux.Handle("GET", pattern_KafkaConnectService_GetConnectorStatus_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) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/GetConnectorStatus", runtime.WithHTTPPathPattern("/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_KafkaConnectService_GetConnectorStatus_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_KafkaConnectService_GetConnectorStatus_0(annotatedContext, mux, outboundMarshaler, w, req, response_KafkaConnectService_GetConnectorStatus_0{resp}, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_KafkaConnectService_PauseConnector_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1726,6 +1845,15 @@ func (m response_KafkaConnectService_GetConnector_0) XXX_ResponseBody() interfac return response.Connector } +type response_KafkaConnectService_GetConnectorStatus_0 struct { + proto.Message +} + +func (m response_KafkaConnectService_GetConnectorStatus_0) XXX_ResponseBody() interface{} { + response := m.Message.(*GetConnectorStatusResponse) + return response.Status +} + type response_KafkaConnectService_UpsertConnector_0 struct { proto.Message } @@ -1757,6 +1885,8 @@ var ( pattern_KafkaConnectService_GetConnector_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}, []string{"v1alpha1", "connect", "clusters", "cluster_name", "connectors", "name"}, "")) + pattern_KafkaConnectService_GetConnectorStatus_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{"v1alpha1", "connect", "clusters", "cluster_name", "connectors", "name", "status"}, "")) + pattern_KafkaConnectService_PauseConnector_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{"v1alpha1", "connect", "clusters", "cluster_name", "connectors", "name", "pause"}, "")) pattern_KafkaConnectService_ResumeConnector_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{"v1alpha1", "connect", "clusters", "cluster_name", "connectors", "name", "resume"}, "")) @@ -1787,6 +1917,8 @@ var ( forward_KafkaConnectService_GetConnector_0 = runtime.ForwardResponseMessage + forward_KafkaConnectService_GetConnectorStatus_0 = runtime.ForwardResponseMessage + forward_KafkaConnectService_PauseConnector_0 = runtime.ForwardResponseMessage forward_KafkaConnectService_ResumeConnector_0 = runtime.ForwardResponseMessage diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_grpc.pb.go b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_grpc.pb.go index 6fd1d7a58..3a0de2543 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_grpc.pb.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_grpc.pb.go @@ -27,6 +27,7 @@ const ( KafkaConnectService_CreateConnector_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/CreateConnector" KafkaConnectService_RestartConnector_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/RestartConnector" KafkaConnectService_GetConnector_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/GetConnector" + KafkaConnectService_GetConnectorStatus_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/GetConnectorStatus" KafkaConnectService_PauseConnector_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/PauseConnector" KafkaConnectService_ResumeConnector_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/ResumeConnector" KafkaConnectService_StopConnector_FullMethodName = "/redpanda.api.dataplane.v1alpha1.KafkaConnectService/StopConnector" @@ -59,6 +60,12 @@ type KafkaConnectServiceClient interface { // GetConnector implements the get connector method, exposes a Kafka // Connect equivalent REST endpoint GetConnector(ctx context.Context, in *GetConnectorRequest, opts ...grpc.CallOption) (*GetConnectorResponse, error) + // GetConnectorStatus implement the get status method, Gets the current status of the connector, including: + // Whether it is running or restarting, or if it has failed or paused + // Which worker it is assigned to + // Error information if it has failed + // The state of all its tasks + GetConnectorStatus(ctx context.Context, in *GetConnectorStatusRequest, opts ...grpc.CallOption) (*GetConnectorStatusResponse, error) // PauseConnector implements the pause connector method, exposes a Kafka // connect equivalent REST endpoint PauseConnector(ctx context.Context, in *PauseConnectorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) @@ -146,6 +153,15 @@ func (c *kafkaConnectServiceClient) GetConnector(ctx context.Context, in *GetCon return out, nil } +func (c *kafkaConnectServiceClient) GetConnectorStatus(ctx context.Context, in *GetConnectorStatusRequest, opts ...grpc.CallOption) (*GetConnectorStatusResponse, error) { + out := new(GetConnectorStatusResponse) + err := c.cc.Invoke(ctx, KafkaConnectService_GetConnectorStatus_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *kafkaConnectServiceClient) PauseConnector(ctx context.Context, in *PauseConnectorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, KafkaConnectService_PauseConnector_FullMethodName, in, out, opts...) @@ -240,6 +256,12 @@ type KafkaConnectServiceServer interface { // GetConnector implements the get connector method, exposes a Kafka // Connect equivalent REST endpoint GetConnector(context.Context, *GetConnectorRequest) (*GetConnectorResponse, error) + // GetConnectorStatus implement the get status method, Gets the current status of the connector, including: + // Whether it is running or restarting, or if it has failed or paused + // Which worker it is assigned to + // Error information if it has failed + // The state of all its tasks + GetConnectorStatus(context.Context, *GetConnectorStatusRequest) (*GetConnectorStatusResponse, error) // PauseConnector implements the pause connector method, exposes a Kafka // connect equivalent REST endpoint PauseConnector(context.Context, *PauseConnectorRequest) (*emptypb.Empty, error) @@ -288,6 +310,9 @@ func (UnimplementedKafkaConnectServiceServer) RestartConnector(context.Context, func (UnimplementedKafkaConnectServiceServer) GetConnector(context.Context, *GetConnectorRequest) (*GetConnectorResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetConnector not implemented") } +func (UnimplementedKafkaConnectServiceServer) GetConnectorStatus(context.Context, *GetConnectorStatusRequest) (*GetConnectorStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetConnectorStatus not implemented") +} func (UnimplementedKafkaConnectServiceServer) PauseConnector(context.Context, *PauseConnectorRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method PauseConnector not implemented") } @@ -433,6 +458,24 @@ func _KafkaConnectService_GetConnector_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _KafkaConnectService_GetConnectorStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetConnectorStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KafkaConnectServiceServer).GetConnectorStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: KafkaConnectService_GetConnectorStatus_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KafkaConnectServiceServer).GetConnectorStatus(ctx, req.(*GetConnectorStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _KafkaConnectService_PauseConnector_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PauseConnectorRequest) if err := dec(in); err != nil { @@ -608,6 +651,10 @@ var KafkaConnectService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetConnector", Handler: _KafkaConnectService_GetConnector_Handler, }, + { + MethodName: "GetConnectorStatus", + Handler: _KafkaConnectService_GetConnectorStatus_Handler, + }, { MethodName: "PauseConnector", Handler: _KafkaConnectService_PauseConnector_Handler, diff --git a/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_connect.ts b/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_connect.ts index 870a8a525..429925695 100644 --- a/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_connect.ts +++ b/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_connect.ts @@ -3,7 +3,7 @@ /* eslint-disable */ // @ts-nocheck -import { CreateConnectorRequest, CreateConnectorResponse, DeleteConnectorRequest, GetConnectClusterRequest, GetConnectClusterResponse, GetConnectorConfigRequest, GetConnectorConfigResponse, GetConnectorRequest, GetConnectorResponse, ListConnectClustersRequest, ListConnectClustersResponse, ListConnectorsRequest, ListConnectorsResponse, ListConnectorTopicsRequest, ListConnectorTopicsResponse, PauseConnectorRequest, ResetConnectorTopicsRequest, RestartConnectorRequest, ResumeConnectorRequest, StopConnectorRequest, UpsertConnectorRequest, UpsertConnectorResponse } from "./kafka_connect_pb"; +import { CreateConnectorRequest, CreateConnectorResponse, DeleteConnectorRequest, GetConnectClusterRequest, GetConnectClusterResponse, GetConnectorConfigRequest, GetConnectorConfigResponse, GetConnectorRequest, GetConnectorResponse, GetConnectorStatusRequest, GetConnectorStatusResponse, ListConnectClustersRequest, ListConnectClustersResponse, ListConnectorsRequest, ListConnectorsResponse, ListConnectorTopicsRequest, ListConnectorTopicsResponse, PauseConnectorRequest, ResetConnectorTopicsRequest, RestartConnectorRequest, ResumeConnectorRequest, StopConnectorRequest, UpsertConnectorRequest, UpsertConnectorResponse } from "./kafka_connect_pb"; import { Empty, MethodKind } from "@bufbuild/protobuf"; /** @@ -90,6 +90,21 @@ export const KafkaConnectService = { O: GetConnectorResponse, kind: MethodKind.Unary, }, + /** + * GetConnectorStatus implement the get status method, Gets the current status of the connector, including: + * Whether it is running or restarting, or if it has failed or paused + * Which worker it is assigned to + * Error information if it has failed + * The state of all its tasks + * + * @generated from rpc redpanda.api.dataplane.v1alpha1.KafkaConnectService.GetConnectorStatus + */ + getConnectorStatus: { + name: "GetConnectorStatus", + I: GetConnectorStatusRequest, + O: GetConnectorStatusResponse, + kind: MethodKind.Unary, + }, /** * PauseConnector implements the pause connector method, exposes a Kafka * connect equivalent REST endpoint diff --git a/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_pb.ts b/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_pb.ts index c35693ce9..82198ae8d 100644 --- a/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_pb.ts +++ b/frontend/src/protogen/redpanda/api/dataplane/v1alpha1/kafka_connect_pb.ts @@ -281,9 +281,19 @@ export class ConnectorStatus extends Message { type = ""; /** - * @generated from field: string trace = 5; + * holistic_state of all the tasks within the connector this is our internal + * holistic state concept + * + * @generated from field: redpanda.api.dataplane.v1alpha1.ConnectorHolisticState holistic_state = 5; */ - trace = ""; + holisticState = ConnectorHolisticState.UNSPECIFIED; + + /** + * Errors is list of parsed connectors' and tasks' errors + * + * @generated from field: repeated redpanda.api.dataplane.v1alpha1.ConnectorError errors = 6; + */ + errors: ConnectorError[] = []; constructor(data?: PartialMessage) { super(); @@ -297,7 +307,8 @@ export class ConnectorStatus extends Message { { no: 2, name: "connector", kind: "message", T: ConnectorStatus_Connector }, { no: 3, name: "tasks", kind: "message", T: TaskStatus, repeated: true }, { no: 4, name: "type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "trace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "holistic_state", kind: "enum", T: proto3.getEnumType(ConnectorHolisticState) }, + { no: 6, name: "errors", kind: "message", T: ConnectorError, repeated: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ConnectorStatus { @@ -331,6 +342,11 @@ export class ConnectorStatus_Connector extends Message) { super(); proto3.util.initPartial(data, this); @@ -341,6 +357,7 @@ export class ConnectorStatus_Connector extends Message [ { no: 1, name: "state", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "worker_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "trace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ConnectorStatus_Connector { @@ -999,16 +1016,6 @@ export class GetConnectorResponse extends Message { */ connector?: ConnectorSpec; - /** - * @generated from field: redpanda.api.dataplane.v1alpha1.ConnectorHolisticState holistic_state = 4; - */ - holisticState = ConnectorHolisticState.UNSPECIFIED; - - /** - * @generated from field: repeated redpanda.api.dataplane.v1alpha1.ConnectorError errors = 5; - */ - errors: ConnectorError[] = []; - constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1018,8 +1025,6 @@ export class GetConnectorResponse extends Message { static readonly typeName = "redpanda.api.dataplane.v1alpha1.GetConnectorResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "connector", kind: "message", T: ConnectorSpec }, - { no: 4, name: "holistic_state", kind: "enum", T: proto3.getEnumType(ConnectorHolisticState) }, - { no: 5, name: "errors", kind: "message", T: ConnectorError, repeated: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): GetConnectorResponse { @@ -1142,21 +1147,6 @@ export class ListConnectorsResponse_ConnectorInfoStatus extends Message) { super(); proto3.util.initPartial(data, this); @@ -1168,8 +1158,6 @@ export class ListConnectorsResponse_ConnectorInfoStatus extends Message): ListConnectorsResponse_ConnectorInfoStatus { @@ -1497,6 +1485,86 @@ export class GetConnectorConfigResponse extends Message { + /** + * @generated from field: string cluster_name = 1; + */ + clusterName = ""; + + /** + * @generated from field: string name = 2; + */ + name = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1alpha1.GetConnectorStatusRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "cluster_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetConnectorStatusRequest { + return new GetConnectorStatusRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetConnectorStatusRequest { + return new GetConnectorStatusRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetConnectorStatusRequest { + return new GetConnectorStatusRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetConnectorStatusRequest | PlainMessage | undefined, b: GetConnectorStatusRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetConnectorStatusRequest, a, b); + } +} + +/** + * @generated from message redpanda.api.dataplane.v1alpha1.GetConnectorStatusResponse + */ +export class GetConnectorStatusResponse extends Message { + /** + * @generated from field: redpanda.api.dataplane.v1alpha1.ConnectorStatus status = 1; + */ + status?: ConnectorStatus; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1alpha1.GetConnectorStatusResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "status", kind: "message", T: ConnectorStatus }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetConnectorStatusResponse { + return new GetConnectorStatusResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetConnectorStatusResponse { + return new GetConnectorStatusResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetConnectorStatusResponse { + return new GetConnectorStatusResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetConnectorStatusResponse | PlainMessage | undefined, b: GetConnectorStatusResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetConnectorStatusResponse, a, b); + } +} + /** * @generated from message redpanda.api.dataplane.v1alpha1.ListConnectorTopicsRequest */ diff --git a/proto/gen/openapi/openapi.json b/proto/gen/openapi/openapi.json index dc7c44fa7..589f90c4b 100644 --- a/proto/gen/openapi/openapi.json +++ b/proto/gen/openapi/openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"ACL.Operation":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"},"BadRequest":{"description":"Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.","properties":{"field_violations":{"description":"Describes all violations in a client request.","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"title":"BadRequest","type":"object"},"Config":{"properties":{"name":{"description":"Name is a topic level config key (e.g. segment.bytes).","type":"string"},"value":{"nullable":true,"title":"Value is a topic level config value (e.g. 1073741824)","type":"string"}},"type":"object"},"ConfigSource":{"enum":["CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG","CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG","CONFIG_SOURCE_STATIC_BROKER_CONFIG","CONFIG_SOURCE_DEFAULT_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG"],"type":"string"},"ConfigSynonym":{"properties":{"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConfigType":{"enum":["CONFIG_TYPE_BOOLEAN","CONFIG_TYPE_STRING","CONFIG_TYPE_INT","CONFIG_TYPE_SHORT","CONFIG_TYPE_LONG","CONFIG_TYPE_DOUBLE","CONFIG_TYPE_LIST","CONFIG_TYPE_CLASS","CONFIG_TYPE_PASSWORD"],"type":"string"},"Configuration":{"properties":{"config_synonyms":{"items":{"$ref":"#/components/schemas/ConfigSynonym"},"type":"array"},"documentation":{"nullable":true,"type":"string"},"is_read_only":{"type":"boolean"},"is_sensitive":{"type":"boolean"},"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"type":{"$ref":"#/components/schemas/ConfigType"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConnectCluster":{"properties":{"address":{"type":"string"},"info":{"$ref":"#/components/schemas/ConnectCluster.Info"},"name":{"type":"string"},"plugins":{"items":{"$ref":"#/components/schemas/ConnectorPlugin"},"type":"array"}},"type":"object"},"ConnectCluster.Info":{"properties":{"commit":{"type":"string"},"kafka_cluster_id":{"type":"string"},"version":{"type":"string"}},"type":"object"},"Connector":{"properties":{"state":{"type":"string"},"worker_id":{"type":"string"}},"type":"object"},"ConnectorError":{"properties":{"content":{"type":"string"},"title":{"type":"string"},"type":{"$ref":"#/components/schemas/ConnectorError.Type"}},"title":"ConnectorError is the error of a connector, this is holistic error\nabstraction, made parsing the error trace of connector or Task","type":"object"},"ConnectorError.Type":{"enum":["TYPE_ERROR","TYPE_WARNING"],"type":"string"},"ConnectorHolisticState":{"description":"- CONNECTOR_HOLISTIC_STATE_PAUSED: PAUSED: The connector/task has been administratively paused.\n - CONNECTOR_HOLISTIC_STATE_RESTARTING: RESTARTING: he connector/task is restarting.\n - CONNECTOR_HOLISTIC_STATE_DESTROYED: DESTROYED: Connector is in destroyed state, regardless of any tasks.\n - CONNECTOR_HOLISTIC_STATE_STOPPED: STOPPED: The connector/task has been stopped.\n - CONNECTOR_HOLISTIC_STATE_UNASSIGNED: The connector/task has not yet been assigned to a worker\nUNASSIGNED: Connector is in unassigned state.\n Or Connector is in running state, and there are unassigned tasks.\n - CONNECTOR_HOLISTIC_STATE_HEALTHY: HEALTHY: Connector is in running state, \u003e 0 tasks, all of them in running state.\n - CONNECTOR_HOLISTIC_STATE_UNHEALTHY: UNHEALTHY: Connector is failed state.\n\t\t\tOr Connector is in running state but has 0 tasks.\n\t\t\tOr Connector is in running state, has \u003e 0 tasks, and all tasks are in failed state.\n - CONNECTOR_HOLISTIC_STATE_DEGRADED: DEGRADED: Connector is in running state, has \u003e 0 tasks, but has at least one state in failed state, but not all tasks are failed.\n - CONNECTOR_HOLISTIC_STATE_UNKNOWN: UNKNOWN: The connector/task could no be determined","enum":["CONNECTOR_HOLISTIC_STATE_PAUSED","CONNECTOR_HOLISTIC_STATE_RESTARTING","CONNECTOR_HOLISTIC_STATE_DESTROYED","CONNECTOR_HOLISTIC_STATE_STOPPED","CONNECTOR_HOLISTIC_STATE_UNASSIGNED","CONNECTOR_HOLISTIC_STATE_HEALTHY","CONNECTOR_HOLISTIC_STATE_UNHEALTHY","CONNECTOR_HOLISTIC_STATE_DEGRADED","CONNECTOR_HOLISTIC_STATE_UNKNOWN"],"title":"The following states are possible for a connector or one of its tasks\nimplement the state interface described in the Kafka connect API @see\nhttps://docs.confluent.io/platform/current/connect/monitoring.html#connector-and-task-status\nthis includes holistic unified connector status that takes into account not\njust the connector instance state, but also state of all the tasks within the\nconnector","type":"string"},"ConnectorInfoStatus":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/ConnectorError"},"title":"Errors is list of parsed connectors' and tasks' errors","type":"array"},"holistic_state":{"$ref":"#/components/schemas/ConnectorHolisticState"},"info":{"$ref":"#/components/schemas/ConnectorSpec"},"name":{"title":"name is the connector name","type":"string"},"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"ConnectorPlugin":{"properties":{"class":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ConnectorSpec":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskInfo"},"readOnly":true,"type":"array"},"type":{"readOnly":true,"type":"string"}},"required":["name","config"],"title":"ConectorInfo is the spec of the connector, as defined in the Kafka connect\nAPI, it can be used as input of the connector creation or output of the\nconnectors","type":"object"},"ConnectorStatus":{"properties":{"connector":{"$ref":"#/components/schemas/Connector"},"name":{"type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskStatus"},"type":"array"},"trace":{"type":"string"},"type":{"type":"string"}},"type":"object"},"CreateACLRequest":{"properties":{"host":{"description":"Host is the host address to use for this acl. Each host to allow\nthe principal access from must be specified as a new creation.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"Principal is the user to apply this acl for. With the Kafka simple\nauthorizer, this must begin with \"User:\".","type":"string"},"resource_name":{"description":"ResourceName is the name of the resource this acl entry will be on.\nFor requests with resource_type CLUSTER, this will default to the expected\nvalue \"kafka-cluster\".","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","principal","host","operation","permission_type"],"type":"object"},"CreateACLResponse":{"type":"object"},"CreateConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"CreateSecretResponse":{"properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"title":"CreateSecretResponse is the response of CreateSecret","type":"object"},"CreateTopicRequest.Topic":{"properties":{"configs":{"description":"Configs is an array of key value config pairs for a topic.\nThese correspond to Kafka Topic-Level Configs.","items":{"$ref":"#/components/schemas/Config"},"type":"array"},"name":{"description":"Name is the topic's name.","type":"string"},"partition_count":{"description":"NumPartitions is how many partitions to give a topic. This must\nbe null if specifying partitions manually (see ReplicaAssignment)\nor, to use the cluster default partitions.","format":"int32","nullable":true,"type":"integer"},"replica_assignment":{"description":"ReplicaAssignment is an array to manually dictate replicas and their\npartitions for a topic. If using this, both ReplicationFactor and\nNumPartitions must be -1.","items":{"$ref":"#/components/schemas/ReplicaAssignment"},"type":"array"},"replication_factor":{"description":"ReplicationFactor is how many replicas every partition must have.\nThis must be null if specifying partitions manually (see ReplicaAssignment)\nor, to use the cluster default replication factor.","format":"int32","nullable":true,"type":"integer"}},"type":"object"},"CreateTopicResponse":{"properties":{"name":{"description":"Name is the topic's name.","type":"string"}},"type":"object"},"CreateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"},"password":{"type":"string"}},"type":"object"},"CreateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/CreateUserResponse.User"}},"type":"object"},"CreateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"DeleteACLsRequest.Filter":{"properties":{"host":{"nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"nullable":true,"type":"string"},"resource_name":{"nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","operation","permission_type"],"type":"object"},"DeleteACLsResponse":{"properties":{"matching_acls":{"items":{"$ref":"#/components/schemas/MatchingACL"},"type":"array"}},"type":"object"},"DeleteSecretResponse":{"title":"DeleteSecretResponse is the response of DeleteSecret","type":"object"},"DeleteTopicResponse":{"type":"object"},"DeleteUserResponse":{"type":"object"},"ErrorInfo":{"description":"Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n { \"reason\": \"API_DISABLED\"\n \"domain\": \"googleapis.com\"\n \"metadata\": {\n \"resource\": \"projects/123\",\n \"service\": \"pubsub.googleapis.com\"\n }\n }\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n { \"reason\": \"STOCKOUT\"\n \"domain\": \"spanner.googleapis.com\",\n \"metadata\": {\n \"availableRegions\": \"us-central1,us-east2\"\n }\n }","properties":{"domain":{"description":"The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".","type":"string"},"metadata":{"additionalProperties":{"type":"string"},"description":"Additional structured details about this error.\n\nKeys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n{\"instanceLimit\": \"100/request\"}, should be returned as,\n{\"instanceLimitPerRequest\": \"100\"}, if the client exceeds the number of\ninstances that can be created in a single (batch) request.","type":"object"},"reason":{"description":"The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.","type":"string"}},"title":"ErrorInfo","type":"object"},"FieldViolation":{"description":"A message type used to describe a single bad request field.","properties":{"description":{"description":"A description of why the request element is bad.","type":"string"},"field":{"description":"A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\n message CreateContactRequest {\n message EmailAddress {\n enum Type {\n TYPE_UNSPECIFIED = 0;\n HOME = 1;\n WORK = 2;\n }\n\n optional string email = 1;\n repeated EmailType type = 2;\n }\n\n string full_name = 1;\n repeated EmailAddress email_addresses = 2;\n }\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[1].email` for a violation in the `email` field of the\n first `email_addresses` message\n* `email_addresses[3].type[2]` for a violation in the second `type`\n value in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[1].email` for a violation in the `email` field of the\n first `emailAddresses` message\n* `emailAddresses[3].type[2]` for a violation in the second `type`\n value in the third `emailAddresses` message.","type":"string"}},"type":"object"},"GetConnectClusterResponse":{"properties":{"cluster":{"$ref":"#/components/schemas/ConnectCluster"}},"type":"object"},"GetConnectorConfigResponse":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"GetConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"},"errors":{"items":{"$ref":"#/components/schemas/ConnectorError"},"type":"array"},"holistic_state":{"$ref":"#/components/schemas/ConnectorHolisticState"}},"type":"object"},"GetTopicConfigurationsResponse":{"properties":{"configurations":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"Help":{"description":"Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.","properties":{"links":{"description":"URL(s) pointing to additional information on handling the current error.","items":{"$ref":"#/components/schemas/Link"},"type":"array"}},"title":"Help","type":"object"},"Link":{"description":"Describes a URL link.","properties":{"description":{"description":"Describes what the link offers.","type":"string"},"url":{"description":"The URL of the link.","type":"string"}},"type":"object"},"ListACLsRequest.Filter":{"properties":{"host":{"nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"nullable":true,"type":"string"},"resource_name":{"nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ListACLsResponse":{"properties":{"resources":{"items":{"$ref":"#/components/schemas/Resource"},"type":"array"}},"type":"object"},"ListConnectClustersResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/ConnectCluster"},"type":"array"}},"type":"object"},"ListConnectorTopicsResponse":{"properties":{"topics":{"items":{"type":"string"},"type":"array"}},"type":"object"},"ListConnectorsResponse":{"properties":{"connectors":{"items":{"$ref":"#/components/schemas/ConnectorInfoStatus"},"title":"connectors is the list of connectors the key is the connector name","type":"array"},"next_page_token":{"description":"Page Token to fetch the next page. The value can be used as page_token in the next call to this endpoint.","type":"string"}},"type":"object"},"ListSecretsRequest.Filter":{"properties":{"labels[string]":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"}},"title":"Defines the filter for Secrets","type":"object"},"ListSecretsResponse":{"properties":{"next_page_token":{"description":"token to retrieve the next page.","type":"string"},"secrets":{"items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"title":"ListSecretsResponse is the response of ListSecrets","type":"object"},"ListTopicsRequest.Filter":{"properties":{"name":{"type":"string"}},"type":"object"},"ListTopicsResponse":{"properties":{"next_page_token":{"type":"string"},"topics":{"items":{"$ref":"#/components/schemas/v1alpha1.Topic"},"type":"array"}},"type":"object"},"ListUsersResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/ListUsersResponse.User"},"type":"array"}},"type":"object"},"ListUsersResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"MatchingACL":{"properties":{"error":{"$ref":"#/components/schemas/Status"},"host":{"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"type":"string"},"resource_name":{"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"Options":{"properties":{"include_tasks":{"type":"boolean"},"only_failed":{"type":"boolean"}},"type":"object"},"PermissionType":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"},"Policy":{"properties":{"host":{"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"type":"string"}},"type":"object"},"QuotaFailure":{"description":"Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.","properties":{"violations":{"description":"Describes all quota violations.","items":{"$ref":"#/components/schemas/QuotaFailure.Violation"},"type":"array"}},"title":"QuotaFailure","type":"object"},"QuotaFailure.Violation":{"description":"A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.","properties":{"description":{"description":"A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".","type":"string"},"subject":{"description":"The subject on which the quota check failed.\nFor example, \"clientip:\u003cip address of client\u003e\" or \"project:\u003cGoogle\ndeveloper project id\u003e\".","type":"string"}},"type":"object"},"ReplicaAssignment":{"properties":{"partition":{"description":"Partition is a partition to create.","format":"int32","type":"integer"},"replicas":{"description":"Replicas are broker IDs the partition must exist on.","items":{"format":"int32","type":"integer"},"type":"array"}},"type":"object"},"Resource":{"properties":{"acls":{"items":{"$ref":"#/components/schemas/Policy"},"type":"array"},"resource_name":{"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ResourcePatternType":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"},"ResourceType":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"},"SASLMechanism":{"enum":["SASL_MECHANISM_SCRAM_SHA_256","SASL_MECHANISM_SCRAM_SHA_512"],"type":"string"},"Secret":{"properties":{"id":{"readOnly":true,"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"}},"title":"Secret defienes the secret resource","type":"object"},"SecretInput":{"properties":{"id":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"secret_data":{"format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"SetConfiguration":{"properties":{"key":{"type":"string"},"value":{"type":"string"}},"type":"object"},"SetTopicConfigurationResponse":{"properties":{"configuration":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"Status":{"description":"The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors).","properties":{"code":{"description":"RPC status code, as described [here](https://github.com/googleapis/googleapis/blob/b4c238feaa1097c53798ed77035bbfeb7fc72e96/google/rpc/code.proto#L32).","enum":["OK","CANCELLED","UNKNOWN","INVALID_ARGUMENT","DEADLINE_EXCEEDED","NOT_FOUND","ALREADY_EXISTS","PERMISSION_DENIED","UNAUTHENTICATED","RESOURCE_EXHAUSTED","FAILED_PRECONDITION","ABORTED","OUT_OF_RANGE","UNIMPLEMENTED","INTERNAL","UNAVAILABLE","DATA_LOSS"],"format":"int32","type":"string"},"details":{"items":{"description":"Details of the error.","oneOf":[{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.BadRequest"],"type":"string"}}},{"$ref":"#/components/schemas/BadRequest"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.ErrorInfo"],"type":"string"}}},{"$ref":"#/components/schemas/ErrorInfo"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.QuotaFailure"],"type":"string"}}},{"$ref":"#/components/schemas/QuotaFailure"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.Help"],"type":"string"}}},{"$ref":"#/components/schemas/Help"}]}]},"type":"array"},"message":{"description":"Detailed error message. No compatibility guarantees are given for the text contained in this message.","type":"string"}},"type":"object"},"TaskInfo":{"properties":{"connector":{"type":"string"},"task":{"format":"int32","type":"integer"}},"type":"object"},"TaskStatus":{"properties":{"id":{"format":"int32","type":"integer"},"state":{"type":"string"},"trace":{"type":"string"},"worker_id":{"type":"string"}},"type":"object"},"UpdateConfiguration":{"properties":{"key":{"type":"string"},"operation":{"$ref":"#/components/schemas/UpdateConfiguration.Operation"},"value":{"type":"string"}},"type":"object"},"UpdateConfiguration.Operation":{"enum":["OPERATION_SET","OPERATION_DELETE","OPERATION_APPEND","OPERATION_SUBTRACT"],"type":"string"},"UpdateSecretResponse":{"properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"title":"UpdateSecretResponse is the response of UpdateSecret","type":"object"},"UpdateTopicConfigurationResponse":{"properties":{"configuration":{"description":"Topic's complete set of configurations after this partial patch has been applied.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"UpdateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"},"password":{"type":"string"}},"type":"object"},"UpdateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/UpdateUserResponse.User"}},"type":"object"},"UpdateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"UpsertConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"v1alpha1.Topic":{"properties":{"configuration":{"description":"configurations is omitted in ListTopics.\n\nredpanda.api.common.v1alpha1.ErrorStatus x = 7;","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"},"is_internal":{"type":"boolean"},"name":{"type":"string"},"partition_count":{"format":"int32","type":"integer"},"replication_factor":{"format":"int32","type":"integer"}},"type":"object"}},"securitySchemes":{"auth0":{"description":"RedpandaCloud","flows":{"implicit":{"authorizationUrl":"https://prod-cloudv2.us.auth0.com/oauth/authorize","scopes":{},"x-client-id":"dQjapNIAHhF7EQqQToRla3yEII9sUSap"}},"type":"oauth2"}}},"info":{"description":"Welcome to Redpanda Cloud's Dataplane API documentation.","title":"Redpanda Cloud","version":"v1alpha1"},"openapi":"3.0.3","paths":{"/v1alpha1/acls":{"delete":{"description":"Delete all ACLs that match the given filter","operationId":"ACLService_DeleteACLs","parameters":[{"in":"query","name":"filter.resource_type","required":true,"schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"in":"query","name":"filter.resource_pattern_type","required":true,"schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"in":"query","name":"filter.principal","schema":{"type":"string"}},{"in":"query","name":"filter.host","schema":{"type":"string"}},{"in":"query","name":"filter.operation","required":true,"schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"in":"query","name":"filter.permission_type","required":true,"schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete ACLs","tags":["ACLService"]},"get":{"description":"List ACLs","operationId":"ACLService_ListACLs","parameters":[{"in":"query","name":"filter.resource_type","schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"in":"query","name":"filter.resource_pattern_type","schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"in":"query","name":"filter.principal","schema":{"type":"string"}},{"in":"query","name":"filter.host","schema":{"type":"string"}},{"in":"query","name":"filter.operation","schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"in":"query","name":"filter.permission_type","schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List ACLs","tags":["ACLService"]},"post":{"description":"Create ACL","operationId":"ACLService_CreateACL","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create ACL","tags":["ACLService"]}},"/v1alpha1/connect/clusters":{"get":{"description":"List connect clusters available for being consumed by the console's kafka-connect service.","operationId":"KafkaConnectService_ListConnectClusters","responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List connect clusters","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}":{"get":{"description":"Get information about an available kafka connect cluster, use the cluster_name defined in console's configuration file.","operationId":"KafkaConnectService_GetConnectCluster","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connect cluster","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors":{"get":{"description":"List connectors managed by the kafka-connect service, use the cluster_name defined in the configuration file.","operationId":"KafkaConnectService_ListConnectors","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List connectors","tags":["KafkaConnectService"]},"post":{"description":"Attempt to create a connector with the specific configuration.","operationId":"KafkaConnectService_CreateConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"required":true,"x-originalParamName":"connector"},"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}":{"delete":{"description":"Delete a connector forcefully stoping all tasks and deleting its configuration.","operationId":"KafkaConnectService_DeleteConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete connector","tags":["KafkaConnectService"]},"get":{"description":"Get information about a connector in a specific cluster.","operationId":"KafkaConnectService_GetConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/config":{"get":{"description":"Get the configuration for the connector.","operationId":"KafkaConnectService_GetConnectorConfig","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connector configuration","tags":["KafkaConnectService"]},"put":{"description":"Create a new connector using the given configuration, or update the configuration for an existing connector. Returns information about the connector after the change has been made.","operationId":"KafkaConnectService_UpsertConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"required":["config"],"type":"object"}}},"required":true,"x-originalParamName":"config"},"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Upsert connector configuration","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/pause":{"put":{"description":"Pause the connector and its tasks, which stops message processing until the connector is resumed. This call asynchronous.","operationId":"KafkaConnectService_PauseConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Pause connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/restart":{"post":{"description":"Restarts a connector, triggers a connector restart, you can specify the only_failed or/and the include_tasks options.","operationId":"KafkaConnectService_RestartConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Options"}}},"required":true,"x-originalParamName":"options"},"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Restart connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/resume":{"put":{"description":"Resume a paused connector and its tasks, resumes message processing after the connector has been paused. It won't do nothing if the connector is not paused.","operationId":"KafkaConnectService_ResumeConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Resume connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/stop":{"put":{"description":"Stops a connector, it stops the connector but does not delete the connector. All tasks for the connector are shut down completely.","operationId":"KafkaConnectService_StopConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Stop connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/topics":{"get":{"description":"Returns a list of connector topic names, it will return an empty list if the connector is not running.","operationId":"KafkaConnectService_ListConnectorTopics","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List connector topics","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/topics/reset":{"put":{"description":"Resets the set of topic names that the connector has been using.","operationId":"KafkaConnectService_ResetConnectorTopics","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Reset connector topics","tags":["KafkaConnectService"]}},"/v1alpha1/secret/{secret.id}":{"put":{"description":"Update a Secret content.","operationId":"SecretService_UpdateSecret","parameters":[{"in":"path","name":"secret.id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"labels":{"additionalProperties":{"type":"string"},"type":"object"},"secret_data":{"format":"byte","type":"string"}},"required":["secret_data"],"type":"object"}}},"required":true,"x-originalParamName":"secret"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Update Secret","tags":["SecretService"]}},"/v1alpha1/secrets":{"get":{"description":"List Secrets","operationId":"SecretService_ListSecrets","parameters":[{"in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string]","schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List Secrets","tags":["SecretService"]},"post":{"description":"Create a Secret.","operationId":"SecretService_CreateSecret","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretInput"}}},"required":true,"x-originalParamName":"secret"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret Created."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create Secret","tags":["SecretService"]}},"/v1alpha1/secrets/{id}":{"delete":{"description":"Delete a Secret.","operationId":"SecretService_DeleteSecret","parameters":[{"description":"The id of the secret you want to delete","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret was deleted successfully."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete Secret","tags":["SecretService"]}},"/v1alpha1/topics":{"get":{"description":"List Topics","operationId":"TopicService_ListTopics","parameters":[{"in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List Topics","tags":["TopicService"]},"post":{"description":"Create a Topic.","operationId":"TopicService_CreateTopic","parameters":[{"description":"ValidateOnly makes this request a dry-run; everything is validated but\nno topics are actually created.","in":"query","name":"validate_only","schema":{"type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRequest.Topic"}}},"description":"Topic is the topic to attempt to create.","required":true,"x-originalParamName":"topic"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/v1alpha1.Topic"}}},"description":"Topic Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create Topic","tags":["TopicService"]}},"/v1alpha1/topics/{name}":{"delete":{"description":"Deletes the Kafka topic with the requested name.","operationId":"TopicService_DeleteTopic","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Topic was deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"The requested topic does not exist"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete a Kafka topic","tags":["TopicService"]}},"/v1alpha1/topics/{topic_name}/configuration":{"patch":{"description":"Updates a subset of the topic configuration.","operationId":"TopicService_UpdateTopicConfiguration","parameters":[{"in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UpdateConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configuration"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicConfigurationResponse"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Update Topic Configuration","tags":["TopicService"]},"put":{"description":"Set the entire configuration of a topic. Config entries not provided in the request are removed.","operationId":"TopicService_SetTopicConfiguration","parameters":[{"in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SetConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configuration"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicConfigurationResponse"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Configuration","tags":["TopicService"]}},"/v1alpha1/topics/{topic_name}/configurations":{"get":{"description":"Get Topic Configurations.","operationId":"TopicService_GetTopicConfigurations","parameters":[{"in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTopicConfigurationsResponse"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get Topic Configurations","tags":["TopicService"]}},"/v1alpha1/users":{"get":{"description":"List Users","operationId":"UserService_ListUsers","parameters":[{"in":"query","name":"name","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"users":[{"name":"payment-service"},{"name":"jane"}]},"schema":{"$ref":"#/components/schemas/ListUsersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List Users","tags":["UserService"]},"post":{"description":"Create a User.","operationId":"UserService_CreateUser","requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service","password":"secure-password"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"required":true,"x-originalParamName":"user"},"responses":{"201":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"description":"Creates a user"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password"},{"description":"value is required","field":"user.mechanism"}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Bad Request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create User","tags":["UserService"]}},"/v1alpha1/users/{name}":{"delete":{"description":"Delete Users","operationId":"UserService_DeleteUser","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"User was deleted successfully."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"example":{"code":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_RESOURCE_NOT_FOUND"}],"message":"user not found"},"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete Users","tags":["UserService"]}},"/v1alpha1/users/{user.name}":{"put":{"description":"Update a User.","operationId":"UserService_UpdateUser","parameters":[{"in":"path","name":"user.name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","password":"new-password"}},"schema":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"password":{"type":"string"}},"type":"object"}}},"required":true,"x-originalParamName":"user"},"responses":{"200":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/UpdateUserResponse.User"}}},"description":"Ok"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password"},{"description":"value is required","field":"user.mechanism"}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Bad Request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Update User","tags":["UserService"]}}},"security":[{"auth0":[]}],"servers":[{"description":"Dataplane API","url":"{dataplane_api_url}","variables":{"dataplane_api_url":{"default":"https://api-a4cb21.ck09ma3c4vs12cng3cig.fmc.prd.cloud.redpanda.com","description":"Dataplane API.\u003cbr\u003e\n\t\t\t\t\tThe Dataplane API allows management of Topics,ACLs,Service accounts. It is exposed by each individual cluster.\n\t\t\t\t\tRetrieve the Dataplane API URL of a cluster by using the dataplane_api.url field returned by the Get Cluster endpoint.\u003cbr\u003e\u003cbr\u003e\n\t\t\t\t\tExample (Dedicated): https://api-a4cb21.ck09mi9c4vs17hng9gig.fmc.prd.cloud.redpanda.com\u003cbr\u003e\n\t\t\t\t\tExample (BYOC): https://api-a4cb21.ck09mi9c4vs17hng9gig.byoc.prd.cloud.redpanda.com"}}}],"tags":[{"name":"ACLService"},{"name":"KafkaConnectService"},{"name":"SecretService"},{"name":"TopicService"},{"name":"UserService"}]} \ No newline at end of file +{"components":{"schemas":{"ACL.Operation":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"},"BadRequest":{"description":"Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.","properties":{"field_violations":{"description":"Describes all violations in a client request.","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"title":"BadRequest","type":"object"},"Config":{"properties":{"name":{"description":"Name is a topic level config key (e.g. segment.bytes).","type":"string"},"value":{"nullable":true,"title":"Value is a topic level config value (e.g. 1073741824)","type":"string"}},"type":"object"},"ConfigSource":{"enum":["CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG","CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG","CONFIG_SOURCE_STATIC_BROKER_CONFIG","CONFIG_SOURCE_DEFAULT_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG"],"type":"string"},"ConfigSynonym":{"properties":{"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConfigType":{"enum":["CONFIG_TYPE_BOOLEAN","CONFIG_TYPE_STRING","CONFIG_TYPE_INT","CONFIG_TYPE_SHORT","CONFIG_TYPE_LONG","CONFIG_TYPE_DOUBLE","CONFIG_TYPE_LIST","CONFIG_TYPE_CLASS","CONFIG_TYPE_PASSWORD"],"type":"string"},"Configuration":{"properties":{"config_synonyms":{"items":{"$ref":"#/components/schemas/ConfigSynonym"},"type":"array"},"documentation":{"nullable":true,"type":"string"},"is_read_only":{"type":"boolean"},"is_sensitive":{"type":"boolean"},"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"type":{"$ref":"#/components/schemas/ConfigType"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConnectCluster":{"properties":{"address":{"type":"string"},"info":{"$ref":"#/components/schemas/ConnectCluster.Info"},"name":{"type":"string"},"plugins":{"items":{"$ref":"#/components/schemas/ConnectorPlugin"},"type":"array"}},"type":"object"},"ConnectCluster.Info":{"properties":{"commit":{"type":"string"},"kafka_cluster_id":{"type":"string"},"version":{"type":"string"}},"type":"object"},"Connector":{"properties":{"state":{"type":"string"},"trace":{"type":"string"},"worker_id":{"type":"string"}},"type":"object"},"ConnectorError":{"properties":{"content":{"type":"string"},"title":{"type":"string"},"type":{"$ref":"#/components/schemas/ConnectorError.Type"}},"title":"ConnectorError is the error of a connector, this is holistic error\nabstraction, made parsing the error trace of connector or Task","type":"object"},"ConnectorError.Type":{"enum":["TYPE_ERROR","TYPE_WARNING"],"type":"string"},"ConnectorHolisticState":{"description":"- CONNECTOR_HOLISTIC_STATE_PAUSED: PAUSED: The connector/task has been administratively paused.\n - CONNECTOR_HOLISTIC_STATE_RESTARTING: RESTARTING: he connector/task is restarting.\n - CONNECTOR_HOLISTIC_STATE_DESTROYED: DESTROYED: Connector is in destroyed state, regardless of any tasks.\n - CONNECTOR_HOLISTIC_STATE_STOPPED: STOPPED: The connector/task has been stopped.\n - CONNECTOR_HOLISTIC_STATE_UNASSIGNED: The connector/task has not yet been assigned to a worker\nUNASSIGNED: Connector is in unassigned state.\n Or Connector is in running state, and there are unassigned tasks.\n - CONNECTOR_HOLISTIC_STATE_HEALTHY: HEALTHY: Connector is in running state, \u003e 0 tasks, all of them in running state.\n - CONNECTOR_HOLISTIC_STATE_UNHEALTHY: UNHEALTHY: Connector is failed state.\n\t\t\tOr Connector is in running state but has 0 tasks.\n\t\t\tOr Connector is in running state, has \u003e 0 tasks, and all tasks are in failed state.\n - CONNECTOR_HOLISTIC_STATE_DEGRADED: DEGRADED: Connector is in running state, has \u003e 0 tasks, but has at least one state in failed state, but not all tasks are failed.\n - CONNECTOR_HOLISTIC_STATE_UNKNOWN: UNKNOWN: The connector/task could no be determined","enum":["CONNECTOR_HOLISTIC_STATE_PAUSED","CONNECTOR_HOLISTIC_STATE_RESTARTING","CONNECTOR_HOLISTIC_STATE_DESTROYED","CONNECTOR_HOLISTIC_STATE_STOPPED","CONNECTOR_HOLISTIC_STATE_UNASSIGNED","CONNECTOR_HOLISTIC_STATE_HEALTHY","CONNECTOR_HOLISTIC_STATE_UNHEALTHY","CONNECTOR_HOLISTIC_STATE_DEGRADED","CONNECTOR_HOLISTIC_STATE_UNKNOWN"],"title":"The following states are possible for a connector or one of its tasks\nimplement the state interface described in the Kafka connect API @see\nhttps://docs.confluent.io/platform/current/connect/monitoring.html#connector-and-task-status\nthis includes holistic unified connector status that takes into account not\njust the connector instance state, but also state of all the tasks within the\nconnector","type":"string"},"ConnectorInfoStatus":{"properties":{"info":{"$ref":"#/components/schemas/ConnectorSpec"},"name":{"title":"name is the connector name","type":"string"},"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"ConnectorPlugin":{"properties":{"class":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ConnectorSpec":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskInfo"},"readOnly":true,"type":"array"},"type":{"readOnly":true,"type":"string"}},"required":["name","config"],"title":"ConectorInfo is the spec of the connector, as defined in the Kafka connect\nAPI, it can be used as input of the connector creation or output of the\nconnectors","type":"object"},"ConnectorStatus":{"properties":{"connector":{"$ref":"#/components/schemas/Connector"},"errors":{"items":{"$ref":"#/components/schemas/ConnectorError"},"title":"Errors is list of parsed connectors' and tasks' errors","type":"array"},"holistic_state":{"$ref":"#/components/schemas/ConnectorHolisticState"},"name":{"type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskStatus"},"type":"array"},"type":{"type":"string"}},"type":"object"},"CreateACLRequest":{"properties":{"host":{"description":"Host is the host address to use for this acl. Each host to allow\nthe principal access from must be specified as a new creation.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"Principal is the user to apply this acl for. With the Kafka simple\nauthorizer, this must begin with \"User:\".","type":"string"},"resource_name":{"description":"ResourceName is the name of the resource this acl entry will be on.\nFor requests with resource_type CLUSTER, this will default to the expected\nvalue \"kafka-cluster\".","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","principal","host","operation","permission_type"],"type":"object"},"CreateACLResponse":{"type":"object"},"CreateConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"CreateSecretResponse":{"properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"title":"CreateSecretResponse is the response of CreateSecret","type":"object"},"CreateTopicRequest.Topic":{"properties":{"configs":{"description":"Configs is an array of key value config pairs for a topic.\nThese correspond to Kafka Topic-Level Configs.","items":{"$ref":"#/components/schemas/Config"},"type":"array"},"name":{"description":"Name is the topic's name.","type":"string"},"partition_count":{"description":"NumPartitions is how many partitions to give a topic. This must\nbe null if specifying partitions manually (see ReplicaAssignment)\nor, to use the cluster default partitions.","format":"int32","nullable":true,"type":"integer"},"replica_assignment":{"description":"ReplicaAssignment is an array to manually dictate replicas and their\npartitions for a topic. If using this, both ReplicationFactor and\nNumPartitions must be -1.","items":{"$ref":"#/components/schemas/ReplicaAssignment"},"type":"array"},"replication_factor":{"description":"ReplicationFactor is how many replicas every partition must have.\nThis must be null if specifying partitions manually (see ReplicaAssignment)\nor, to use the cluster default replication factor.","format":"int32","nullable":true,"type":"integer"}},"type":"object"},"CreateTopicResponse":{"properties":{"name":{"description":"Name is the topic's name.","type":"string"}},"type":"object"},"CreateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"},"password":{"type":"string"}},"type":"object"},"CreateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/CreateUserResponse.User"}},"type":"object"},"CreateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"DeleteACLsRequest.Filter":{"properties":{"host":{"nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"nullable":true,"type":"string"},"resource_name":{"nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","operation","permission_type"],"type":"object"},"DeleteACLsResponse":{"properties":{"matching_acls":{"items":{"$ref":"#/components/schemas/MatchingACL"},"type":"array"}},"type":"object"},"DeleteSecretResponse":{"title":"DeleteSecretResponse is the response of DeleteSecret","type":"object"},"DeleteTopicResponse":{"type":"object"},"DeleteUserResponse":{"type":"object"},"ErrorInfo":{"description":"Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n { \"reason\": \"API_DISABLED\"\n \"domain\": \"googleapis.com\"\n \"metadata\": {\n \"resource\": \"projects/123\",\n \"service\": \"pubsub.googleapis.com\"\n }\n }\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n { \"reason\": \"STOCKOUT\"\n \"domain\": \"spanner.googleapis.com\",\n \"metadata\": {\n \"availableRegions\": \"us-central1,us-east2\"\n }\n }","properties":{"domain":{"description":"The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".","type":"string"},"metadata":{"additionalProperties":{"type":"string"},"description":"Additional structured details about this error.\n\nKeys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n{\"instanceLimit\": \"100/request\"}, should be returned as,\n{\"instanceLimitPerRequest\": \"100\"}, if the client exceeds the number of\ninstances that can be created in a single (batch) request.","type":"object"},"reason":{"description":"The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.","type":"string"}},"title":"ErrorInfo","type":"object"},"FieldViolation":{"description":"A message type used to describe a single bad request field.","properties":{"description":{"description":"A description of why the request element is bad.","type":"string"},"field":{"description":"A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\n message CreateContactRequest {\n message EmailAddress {\n enum Type {\n TYPE_UNSPECIFIED = 0;\n HOME = 1;\n WORK = 2;\n }\n\n optional string email = 1;\n repeated EmailType type = 2;\n }\n\n string full_name = 1;\n repeated EmailAddress email_addresses = 2;\n }\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[1].email` for a violation in the `email` field of the\n first `email_addresses` message\n* `email_addresses[3].type[2]` for a violation in the second `type`\n value in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[1].email` for a violation in the `email` field of the\n first `emailAddresses` message\n* `emailAddresses[3].type[2]` for a violation in the second `type`\n value in the third `emailAddresses` message.","type":"string"}},"type":"object"},"GetConnectClusterResponse":{"properties":{"cluster":{"$ref":"#/components/schemas/ConnectCluster"}},"type":"object"},"GetConnectorConfigResponse":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"GetConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"GetConnectorStatusResponse":{"properties":{"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"GetTopicConfigurationsResponse":{"properties":{"configurations":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"Help":{"description":"Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.","properties":{"links":{"description":"URL(s) pointing to additional information on handling the current error.","items":{"$ref":"#/components/schemas/Link"},"type":"array"}},"title":"Help","type":"object"},"Link":{"description":"Describes a URL link.","properties":{"description":{"description":"Describes what the link offers.","type":"string"},"url":{"description":"The URL of the link.","type":"string"}},"type":"object"},"ListACLsRequest.Filter":{"properties":{"host":{"nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"nullable":true,"type":"string"},"resource_name":{"nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ListACLsResponse":{"properties":{"resources":{"items":{"$ref":"#/components/schemas/Resource"},"type":"array"}},"type":"object"},"ListConnectClustersResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/ConnectCluster"},"type":"array"}},"type":"object"},"ListConnectorTopicsResponse":{"properties":{"topics":{"items":{"type":"string"},"type":"array"}},"type":"object"},"ListConnectorsResponse":{"properties":{"connectors":{"items":{"$ref":"#/components/schemas/ConnectorInfoStatus"},"title":"connectors is the list of connectors the key is the connector name","type":"array"},"next_page_token":{"description":"Page Token to fetch the next page. The value can be used as page_token in the next call to this endpoint.","type":"string"}},"type":"object"},"ListSecretsRequest.Filter":{"properties":{"labels[string]":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"}},"title":"Defines the filter for Secrets","type":"object"},"ListSecretsResponse":{"properties":{"next_page_token":{"description":"token to retrieve the next page.","type":"string"},"secrets":{"items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"title":"ListSecretsResponse is the response of ListSecrets","type":"object"},"ListTopicsRequest.Filter":{"properties":{"name":{"type":"string"}},"type":"object"},"ListTopicsResponse":{"properties":{"next_page_token":{"type":"string"},"topics":{"items":{"$ref":"#/components/schemas/v1alpha1.Topic"},"type":"array"}},"type":"object"},"ListUsersResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/ListUsersResponse.User"},"type":"array"}},"type":"object"},"ListUsersResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"MatchingACL":{"properties":{"error":{"$ref":"#/components/schemas/Status"},"host":{"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"type":"string"},"resource_name":{"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"Options":{"properties":{"include_tasks":{"type":"boolean"},"only_failed":{"type":"boolean"}},"type":"object"},"PermissionType":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"},"Policy":{"properties":{"host":{"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"type":"string"}},"type":"object"},"QuotaFailure":{"description":"Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.","properties":{"violations":{"description":"Describes all quota violations.","items":{"$ref":"#/components/schemas/QuotaFailure.Violation"},"type":"array"}},"title":"QuotaFailure","type":"object"},"QuotaFailure.Violation":{"description":"A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.","properties":{"description":{"description":"A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".","type":"string"},"subject":{"description":"The subject on which the quota check failed.\nFor example, \"clientip:\u003cip address of client\u003e\" or \"project:\u003cGoogle\ndeveloper project id\u003e\".","type":"string"}},"type":"object"},"ReplicaAssignment":{"properties":{"partition":{"description":"Partition is a partition to create.","format":"int32","type":"integer"},"replicas":{"description":"Replicas are broker IDs the partition must exist on.","items":{"format":"int32","type":"integer"},"type":"array"}},"type":"object"},"Resource":{"properties":{"acls":{"items":{"$ref":"#/components/schemas/Policy"},"type":"array"},"resource_name":{"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ResourcePatternType":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"},"ResourceType":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"},"SASLMechanism":{"enum":["SASL_MECHANISM_SCRAM_SHA_256","SASL_MECHANISM_SCRAM_SHA_512"],"type":"string"},"Secret":{"properties":{"id":{"readOnly":true,"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"}},"title":"Secret defienes the secret resource","type":"object"},"SecretInput":{"properties":{"id":{"type":"string"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"secret_data":{"format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"SetConfiguration":{"properties":{"key":{"type":"string"},"value":{"type":"string"}},"type":"object"},"SetTopicConfigurationResponse":{"properties":{"configuration":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"Status":{"description":"The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors).","properties":{"code":{"description":"RPC status code, as described [here](https://github.com/googleapis/googleapis/blob/b4c238feaa1097c53798ed77035bbfeb7fc72e96/google/rpc/code.proto#L32).","enum":["OK","CANCELLED","UNKNOWN","INVALID_ARGUMENT","DEADLINE_EXCEEDED","NOT_FOUND","ALREADY_EXISTS","PERMISSION_DENIED","UNAUTHENTICATED","RESOURCE_EXHAUSTED","FAILED_PRECONDITION","ABORTED","OUT_OF_RANGE","UNIMPLEMENTED","INTERNAL","UNAVAILABLE","DATA_LOSS"],"format":"int32","type":"string"},"details":{"items":{"description":"Details of the error.","oneOf":[{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.BadRequest"],"type":"string"}}},{"$ref":"#/components/schemas/BadRequest"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.ErrorInfo"],"type":"string"}}},{"$ref":"#/components/schemas/ErrorInfo"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.QuotaFailure"],"type":"string"}}},{"$ref":"#/components/schemas/QuotaFailure"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.Help"],"type":"string"}}},{"$ref":"#/components/schemas/Help"}]}]},"type":"array"},"message":{"description":"Detailed error message. No compatibility guarantees are given for the text contained in this message.","type":"string"}},"type":"object"},"TaskInfo":{"properties":{"connector":{"type":"string"},"task":{"format":"int32","type":"integer"}},"type":"object"},"TaskStatus":{"properties":{"id":{"format":"int32","type":"integer"},"state":{"type":"string"},"trace":{"type":"string"},"worker_id":{"type":"string"}},"type":"object"},"UpdateConfiguration":{"properties":{"key":{"type":"string"},"operation":{"$ref":"#/components/schemas/UpdateConfiguration.Operation"},"value":{"type":"string"}},"type":"object"},"UpdateConfiguration.Operation":{"enum":["OPERATION_SET","OPERATION_DELETE","OPERATION_APPEND","OPERATION_SUBTRACT"],"type":"string"},"UpdateSecretResponse":{"properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"title":"UpdateSecretResponse is the response of UpdateSecret","type":"object"},"UpdateTopicConfigurationResponse":{"properties":{"configuration":{"description":"Topic's complete set of configurations after this partial patch has been applied.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"UpdateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"},"password":{"type":"string"}},"type":"object"},"UpdateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/UpdateUserResponse.User"}},"type":"object"},"UpdateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"UpsertConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"v1alpha1.Topic":{"properties":{"configuration":{"description":"configurations is omitted in ListTopics.\n\nredpanda.api.common.v1alpha1.ErrorStatus x = 7;","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"},"is_internal":{"type":"boolean"},"name":{"type":"string"},"partition_count":{"format":"int32","type":"integer"},"replication_factor":{"format":"int32","type":"integer"}},"type":"object"}},"securitySchemes":{"auth0":{"description":"RedpandaCloud","flows":{"implicit":{"authorizationUrl":"https://prod-cloudv2.us.auth0.com/oauth/authorize","scopes":{},"x-client-id":"dQjapNIAHhF7EQqQToRla3yEII9sUSap"}},"type":"oauth2"}}},"info":{"description":"Welcome to Redpanda Cloud's Dataplane API documentation.","title":"Redpanda Cloud","version":"v1alpha1"},"openapi":"3.0.3","paths":{"/v1alpha1/acls":{"delete":{"description":"Delete all ACLs that match the given filter","operationId":"ACLService_DeleteACLs","parameters":[{"in":"query","name":"filter.resource_type","required":true,"schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"in":"query","name":"filter.resource_pattern_type","required":true,"schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"in":"query","name":"filter.principal","schema":{"type":"string"}},{"in":"query","name":"filter.host","schema":{"type":"string"}},{"in":"query","name":"filter.operation","required":true,"schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"in":"query","name":"filter.permission_type","required":true,"schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete ACLs","tags":["ACLService"]},"get":{"description":"List ACLs","operationId":"ACLService_ListACLs","parameters":[{"in":"query","name":"filter.resource_type","schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"in":"query","name":"filter.resource_pattern_type","schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"in":"query","name":"filter.principal","schema":{"type":"string"}},{"in":"query","name":"filter.host","schema":{"type":"string"}},{"in":"query","name":"filter.operation","schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"in":"query","name":"filter.permission_type","schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List ACLs","tags":["ACLService"]},"post":{"description":"Create ACL","operationId":"ACLService_CreateACL","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create ACL","tags":["ACLService"]}},"/v1alpha1/connect/clusters":{"get":{"description":"List connect clusters available for being consumed by the console's kafka-connect service.","operationId":"KafkaConnectService_ListConnectClusters","responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List connect clusters","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}":{"get":{"description":"Get information about an available kafka connect cluster, use the cluster_name defined in console's configuration file.","operationId":"KafkaConnectService_GetConnectCluster","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connect cluster","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors":{"get":{"description":"List connectors managed by the kafka-connect service, use the cluster_name defined in the configuration file.","operationId":"KafkaConnectService_ListConnectors","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List connectors","tags":["KafkaConnectService"]},"post":{"description":"Attempt to create a connector with the specific configuration.","operationId":"KafkaConnectService_CreateConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"required":true,"x-originalParamName":"connector"},"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}":{"delete":{"description":"Delete a connector forcefully stoping all tasks and deleting its configuration.","operationId":"KafkaConnectService_DeleteConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete connector","tags":["KafkaConnectService"]},"get":{"description":"Get information about a connector in a specific cluster.","operationId":"KafkaConnectService_GetConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/config":{"get":{"description":"Get the configuration for the connector.","operationId":"KafkaConnectService_GetConnectorConfig","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connector configuration","tags":["KafkaConnectService"]},"put":{"description":"Create a new connector using the given configuration, or update the configuration for an existing connector. Returns information about the connector after the change has been made.","operationId":"KafkaConnectService_UpsertConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"required":["config"],"type":"object"}}},"required":true,"x-originalParamName":"config"},"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Upsert connector configuration","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/pause":{"put":{"description":"Pause the connector and its tasks, which stops message processing until the connector is resumed. This call asynchronous.","operationId":"KafkaConnectService_PauseConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Pause connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/restart":{"post":{"description":"Restarts a connector, triggers a connector restart, you can specify the only_failed or/and the include_tasks options.","operationId":"KafkaConnectService_RestartConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Options"}}},"required":true,"x-originalParamName":"options"},"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Restart connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/resume":{"put":{"description":"Resume a paused connector and its tasks, resumes message processing after the connector has been paused. It won't do nothing if the connector is not paused.","operationId":"KafkaConnectService_ResumeConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Resume connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/status":{"get":{"description":"Gets the current status of the connector, including, The state of all of its tasks, error information etc.","operationId":"KafkaConnectService_GetConnectorStatus","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get connector status","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/stop":{"put":{"description":"Stops a connector, it stops the connector but does not delete the connector. All tasks for the connector are shut down completely.","operationId":"KafkaConnectService_StopConnector","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Stop connector","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/topics":{"get":{"description":"Returns a list of connector topic names, it will return an empty list if the connector is not running.","operationId":"KafkaConnectService_ListConnectorTopics","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List connector topics","tags":["KafkaConnectService"]}},"/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/topics/reset":{"put":{"description":"Resets the set of topic names that the connector has been using.","operationId":"KafkaConnectService_ResetConnectorTopics","parameters":[{"in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Reset connector topics","tags":["KafkaConnectService"]}},"/v1alpha1/secret/{secret.id}":{"put":{"description":"Update a Secret content.","operationId":"SecretService_UpdateSecret","parameters":[{"in":"path","name":"secret.id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"labels":{"additionalProperties":{"type":"string"},"type":"object"},"secret_data":{"format":"byte","type":"string"}},"required":["secret_data"],"type":"object"}}},"required":true,"x-originalParamName":"secret"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Update Secret","tags":["SecretService"]}},"/v1alpha1/secrets":{"get":{"description":"List Secrets","operationId":"SecretService_ListSecrets","parameters":[{"in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string]","schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List Secrets","tags":["SecretService"]},"post":{"description":"Create a Secret.","operationId":"SecretService_CreateSecret","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretInput"}}},"required":true,"x-originalParamName":"secret"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret Created."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create Secret","tags":["SecretService"]}},"/v1alpha1/secrets/{id}":{"delete":{"description":"Delete a Secret.","operationId":"SecretService_DeleteSecret","parameters":[{"description":"The id of the secret you want to delete","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret was deleted successfully."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete Secret","tags":["SecretService"]}},"/v1alpha1/topics":{"get":{"description":"List Topics","operationId":"TopicService_ListTopics","parameters":[{"in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List Topics","tags":["TopicService"]},"post":{"description":"Create a Topic.","operationId":"TopicService_CreateTopic","parameters":[{"description":"ValidateOnly makes this request a dry-run; everything is validated but\nno topics are actually created.","in":"query","name":"validate_only","schema":{"type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRequest.Topic"}}},"description":"Topic is the topic to attempt to create.","required":true,"x-originalParamName":"topic"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/v1alpha1.Topic"}}},"description":"Topic Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create Topic","tags":["TopicService"]}},"/v1alpha1/topics/{name}":{"delete":{"description":"Deletes the Kafka topic with the requested name.","operationId":"TopicService_DeleteTopic","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Topic was deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"The requested topic does not exist"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete a Kafka topic","tags":["TopicService"]}},"/v1alpha1/topics/{topic_name}/configuration":{"patch":{"description":"Updates a subset of the topic configuration.","operationId":"TopicService_UpdateTopicConfiguration","parameters":[{"in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UpdateConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configuration"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicConfigurationResponse"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Update Topic Configuration","tags":["TopicService"]},"put":{"description":"Set the entire configuration of a topic. Config entries not provided in the request are removed.","operationId":"TopicService_SetTopicConfiguration","parameters":[{"in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SetConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configuration"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicConfigurationResponse"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Configuration","tags":["TopicService"]}},"/v1alpha1/topics/{topic_name}/configurations":{"get":{"description":"Get Topic Configurations.","operationId":"TopicService_GetTopicConfigurations","parameters":[{"in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTopicConfigurationsResponse"}}},"description":"Ok"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Get Topic Configurations","tags":["TopicService"]}},"/v1alpha1/users":{"get":{"description":"List Users","operationId":"UserService_ListUsers","parameters":[{"in":"query","name":"name","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"users":[{"name":"payment-service"},{"name":"jane"}]},"schema":{"$ref":"#/components/schemas/ListUsersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"List Users","tags":["UserService"]},"post":{"description":"Create a User.","operationId":"UserService_CreateUser","requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service","password":"secure-password"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"required":true,"x-originalParamName":"user"},"responses":{"201":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"description":"Creates a user"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password"},{"description":"value is required","field":"user.mechanism"}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Bad Request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Create User","tags":["UserService"]}},"/v1alpha1/users/{name}":{"delete":{"description":"Delete Users","operationId":"UserService_DeleteUser","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"User was deleted successfully."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"example":{"code":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_RESOURCE_NOT_FOUND"}],"message":"user not found"},"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Delete Users","tags":["UserService"]}},"/v1alpha1/users/{user.name}":{"put":{"description":"Update a User.","operationId":"UserService_UpdateUser","parameters":[{"in":"path","name":"user.name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","password":"new-password"}},"schema":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"password":{"type":"string"}},"type":"object"}}},"required":true,"x-originalParamName":"user"},"responses":{"200":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/UpdateUserResponse.User"}}},"description":"Ok"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password"},{"description":"value is required","field":"user.mechanism"}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Bad Request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"An unexpected error response."}},"summary":"Update User","tags":["UserService"]}}},"security":[{"auth0":[]}],"servers":[{"description":"Dataplane API","url":"{dataplane_api_url}","variables":{"dataplane_api_url":{"default":"https://api-a4cb21.ck09ma3c4vs12cng3cig.fmc.prd.cloud.redpanda.com","description":"Dataplane API.\u003cbr\u003e\n\t\t\t\t\tThe Dataplane API allows management of Topics,ACLs,Service accounts. It is exposed by each individual cluster.\n\t\t\t\t\tRetrieve the Dataplane API URL of a cluster by using the dataplane_api.url field returned by the Get Cluster endpoint.\u003cbr\u003e\u003cbr\u003e\n\t\t\t\t\tExample (Dedicated): https://api-a4cb21.ck09mi9c4vs17hng9gig.fmc.prd.cloud.redpanda.com\u003cbr\u003e\n\t\t\t\t\tExample (BYOC): https://api-a4cb21.ck09mi9c4vs17hng9gig.byoc.prd.cloud.redpanda.com"}}}],"tags":[{"name":"ACLService"},{"name":"KafkaConnectService"},{"name":"SecretService"},{"name":"TopicService"},{"name":"UserService"}]} \ No newline at end of file diff --git a/proto/gen/openapi/openapi.yaml b/proto/gen/openapi/openapi.yaml index c39542914..fdd99b628 100644 --- a/proto/gen/openapi/openapi.yaml +++ b/proto/gen/openapi/openapi.yaml @@ -119,6 +119,8 @@ components: properties: state: type: string + trace: + type: string worker_id: type: string type: object @@ -174,13 +176,6 @@ components: type: string ConnectorInfoStatus: properties: - errors: - items: - $ref: '#/components/schemas/ConnectorError' - title: Errors is list of parsed connectors' and tasks' errors - type: array - holistic_state: - $ref: '#/components/schemas/ConnectorHolisticState' info: $ref: '#/components/schemas/ConnectorSpec' name: @@ -226,14 +221,19 @@ components: properties: connector: $ref: '#/components/schemas/Connector' + errors: + items: + $ref: '#/components/schemas/ConnectorError' + title: Errors is list of parsed connectors' and tasks' errors + type: array + holistic_state: + $ref: '#/components/schemas/ConnectorHolisticState' name: type: string tasks: items: $ref: '#/components/schemas/TaskStatus' type: array - trace: - type: string type: type: string type: object @@ -509,12 +509,11 @@ components: properties: connector: $ref: '#/components/schemas/ConnectorSpec' - errors: - items: - $ref: '#/components/schemas/ConnectorError' - type: array - holistic_state: - $ref: '#/components/schemas/ConnectorHolisticState' + type: object + GetConnectorStatusResponse: + properties: + status: + $ref: '#/components/schemas/ConnectorStatus' type: object GetTopicConfigurationsResponse: properties: @@ -1655,6 +1654,43 @@ paths: summary: Resume connector tags: - KafkaConnectService + /v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/status: + get: + description: Gets the current status of the connector, including, The state of all of its tasks, error information etc. + operationId: KafkaConnectService_GetConnectorStatus + parameters: + - in: path + name: cluster_name + required: true + schema: + type: string + - in: path + name: name + required: true + schema: + type: string + responses: + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/Status' + description: Unauthenticated. + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/Status' + description: An unexpected error response. + summary: Get connector status + tags: + - KafkaConnectService /v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/stop: put: description: Stops a connector, it stops the connector but does not delete the connector. All tasks for the connector are shut down completely. diff --git a/proto/redpanda/api/dataplane/v1alpha1/kafka_connect.proto b/proto/redpanda/api/dataplane/v1alpha1/kafka_connect.proto index 5a4614b1b..0e30bc36a 100644 --- a/proto/redpanda/api/dataplane/v1alpha1/kafka_connect.proto +++ b/proto/redpanda/api/dataplane/v1alpha1/kafka_connect.proto @@ -62,12 +62,17 @@ message ConnectorStatus { message Connector { string state = 1; string worker_id = 2; + string trace = 3; } string name = 1; Connector connector = 2; repeated TaskStatus tasks = 3; string type = 4; - string trace = 5; + // holistic_state of all the tasks within the connector this is our internal + // holistic state concept + ConnectorHolisticState holistic_state = 5; + // Errors is list of parsed connectors' and tasks' errors + repeated ConnectorError errors = 6; } message TaskStatus { @@ -203,8 +208,6 @@ message CreateConnectorRequest { message GetConnectorResponse { ConnectorSpec connector = 1; - ConnectorHolisticState holistic_state = 4; - repeated ConnectorError errors = 5; } message CreateConnectorResponse { @@ -217,11 +220,6 @@ message ListConnectorsResponse { string name = 1; ConnectorSpec info = 2; ConnectorStatus status = 3; - // holistic_state of all the tasks within the connector this is our internal - // holistic state concept - ConnectorHolisticState holistic_state = 4; - // Errors is list of parsed connectors' and tasks' errors - repeated ConnectorError errors = 5; } // connectors is the list of connectors the key is the connector name @@ -281,6 +279,21 @@ message GetConnectorConfigResponse { map config = 1; } +message GetConnectorStatusRequest { + string cluster_name = 1 [ + (google.api.field_behavior) = REQUIRED, + (buf.validate.field).required = true + ]; + string name = 2 [ + (google.api.field_behavior) = REQUIRED, + (buf.validate.field).required = true + ]; +} + +message GetConnectorStatusResponse { + ConnectorStatus status = 1; +} + message ListConnectorTopicsRequest { string cluster_name = 1 [ (google.api.field_behavior) = REQUIRED, @@ -386,6 +399,22 @@ service KafkaConnectService { }; } + // GetConnectorStatus implement the get status method, Gets the current status of the connector, including: + // Whether it is running or restarting, or if it has failed or paused + // Which worker it is assigned to + // Error information if it has failed + // The state of all its tasks + rpc GetConnectorStatus(GetConnectorStatusRequest) returns (GetConnectorStatusResponse) { + option (google.api.http) = { + get: "/v1alpha1/connect/clusters/{cluster_name}/connectors/{name}/status" + response_body: "status" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Get connector status" + description: "Gets the current status of the connector, including, The state of all of its tasks, error information etc." + }; + } + // PauseConnector implements the pause connector method, exposes a Kafka // connect equivalent REST endpoint rpc PauseConnector(PauseConnectorRequest) returns (google.protobuf.Empty) { @@ -395,6 +424,7 @@ service KafkaConnectService { description: "Pause the connector and its tasks, which stops message processing until the connector is resumed. This call asynchronous." }; } + // ResumeConnector implements the resume connector method, exposes a Kafka // connect equivalent REST endpoint rpc ResumeConnector(ResumeConnectorRequest) returns (google.protobuf.Empty) { From 99e2f34216699f0a253411bb3aa1406cb4d14d10 Mon Sep 17 00:00:00 2001 From: Santiago Jimenez Giraldo Date: Mon, 22 Jan 2024 17:07:06 +0100 Subject: [PATCH 2/5] test: tooling for improving testing Support a custom testcontainer for httpbin container to support easier testing Signed-off-by: Santiago Jimenez Giraldo --- .../handle_kafka_connect_integration_test.go | 24 +---------- backend/pkg/testutil/httpbin.go | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 backend/pkg/testutil/httpbin.go diff --git a/backend/pkg/api/handle_kafka_connect_integration_test.go b/backend/pkg/api/handle_kafka_connect_integration_test.go index bc8a831c0..b972857c8 100644 --- a/backend/pkg/api/handle_kafka_connect_integration_test.go +++ b/backend/pkg/api/handle_kafka_connect_integration_test.go @@ -25,7 +25,6 @@ import ( "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/modules/redpanda" "github.com/testcontainers/testcontainers-go/network" - "github.com/testcontainers/testcontainers-go/wait" "go.uber.org/zap" "github.com/redpanda-data/console/backend/pkg/config" @@ -58,7 +57,7 @@ func (s *APIIntegrationTestSuite) TestHandleCreateConnector() { require.NoError(err) // HTTPBin container - httpC, err := runHTTPBin(ctx, testNetwork.Name) + httpC, err := testutil.RunHTTPBinContainer(ctx, network.WithNetwork([]string{"httpbin", "local-httpbin"}, testNetwork)) require.NoError(err) httpBinContainer := httpC @@ -151,24 +150,3 @@ func (s *APIIntegrationTestSuite) TestHandleCreateConnector() { assert.Equal("1000", createConnectRes.Config["http.timer.interval.millis"]) }) } - -func runHTTPBin(ctx context.Context, network string) (testcontainers.Container, error) { - req := testcontainers.GenericContainerRequest{ - ContainerRequest: testcontainers.ContainerRequest{ - Hostname: "httpbin", - Networks: []string{network}, - NetworkAliases: map[string][]string{network: {"httpbin", "local-httpbin"}}, - Image: "kennethreitz/httpbin", - ExposedPorts: []string{"80/tcp"}, - WaitingFor: wait.ForHTTP("/"), - }, - Started: true, - } - - container, err := testcontainers.GenericContainer(ctx, req) - if err != nil { - return nil, err - } - - return container, nil -} diff --git a/backend/pkg/testutil/httpbin.go b/backend/pkg/testutil/httpbin.go new file mode 100644 index 000000000..b072fd107 --- /dev/null +++ b/backend/pkg/testutil/httpbin.go @@ -0,0 +1,42 @@ +// Copyright 2024 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file https://github.com/redpanda-data/redpanda/blob/dev/licenses/bsl.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +// Package testutil package holds common utility functions for testing +package testutil + +import ( + "context" + + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/wait" +) + +// RunHTTPBinContainer starts and httpbin (kennethreitz/httpbin) container it accepts the default testcontainers options like WithNetwork, WithImage +func RunHTTPBinContainer(ctx context.Context, opts ...testcontainers.ContainerCustomizer) (testcontainers.Container, error) { + req := testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Hostname: "httpbin", + Image: "kennethreitz/httpbin", + ExposedPorts: []string{"80/tcp"}, + WaitingFor: wait.ForHTTP("/"), + }, + Started: true, + } + + for _, opt := range opts { + opt.Customize(&req) + } + + container, err := testcontainers.GenericContainer(ctx, req) + if err != nil { + return nil, err + } + + return container, nil +} From a7ae9cb3447c476ef764e2ad2f357489590cae40 Mon Sep 17 00:00:00 2001 From: Santiago Jimenez Giraldo Date: Mon, 22 Jan 2024 17:09:49 +0100 Subject: [PATCH 3/5] test(kafka-connect): get connector/connector status Implement simple integration tests for get connector and get connector status TDD Signed-off-by: Santiago Jimenez Giraldo --- .../api/connect/integration/api_suite_test.go | 7 +- .../connect/integration/kafkaconnect_test.go | 152 +++++++++++++++++- 2 files changed, 155 insertions(+), 4 deletions(-) diff --git a/backend/pkg/api/connect/integration/api_suite_test.go b/backend/pkg/api/connect/integration/api_suite_test.go index 75a156ae4..240056760 100644 --- a/backend/pkg/api/connect/integration/api_suite_test.go +++ b/backend/pkg/api/connect/integration/api_suite_test.go @@ -86,7 +86,12 @@ func (s *APISuite) SetupSuite() { s.testSeedBroker = seedBroker // 3. Start Kafka Connect Docker container - kConnectContainer, err := testutil.RunRedpandaConnectorsContainer(ctx, []string{"redpanda:29092"}, network.WithNetwork([]string{"kconnect"}, s.network)) + kConnectContainer, err := testutil.RunRedpandaConnectorsContainer( + ctx, + []string{"redpanda:29092"}, + network.WithNetwork([]string{"kconnect"}, s.network), + testcontainers.WithImage("docker.cloudsmith.io/redpanda/connectors-unsupported/connectors:v1.0.0-44344ad"), + ) require.NoError(err) s.kConnectContainer = kConnectContainer diff --git a/backend/pkg/api/connect/integration/kafkaconnect_test.go b/backend/pkg/api/connect/integration/kafkaconnect_test.go index 367c03b58..03284e2f2 100644 --- a/backend/pkg/api/connect/integration/kafkaconnect_test.go +++ b/backend/pkg/api/connect/integration/kafkaconnect_test.go @@ -21,9 +21,11 @@ import ( "github.com/carlmjohnson/requests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go/network" v1alpha1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1" v1alpha1connect "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1alpha1/dataplanev1alpha1connect" + "github.com/redpanda-data/console/backend/pkg/testutil" ) func (s *APISuite) TestListConnectors() { @@ -55,7 +57,7 @@ func (s *APISuite) TestListConnectors() { })) require.NoError(err) assert.NotNil(res.Msg, "response message must not be nil") - assert.Equal(0, len(res.Msg.Connectors)) + assert.IsType([]*v1alpha1.ListConnectorsResponse_ConnectorInfoStatus{}, res.Msg.Connectors) }) } @@ -64,7 +66,7 @@ func (s *APISuite) TestListConnectClusters() { require := require.New(t) assert := assert.New(t) - t.Run("list connect clusters default request (connect-go)", func(t *testing.T) { + t.Run("list connect clusters request (connect-go)", func(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() @@ -77,7 +79,7 @@ func (s *APISuite) TestListConnectClusters() { assert.Equal("connect-cluster", res.Msg.Clusters[0].Name) }) - t.Run("list connect clusters with default request (http)", func(t *testing.T) { + t.Run("list connect clusters request (http)", func(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() @@ -114,3 +116,147 @@ func (s *APISuite) TestListConnectClusters() { assert.Equal("connect-cluster", response.Clusters[0].Name) }) } + +func (s *APISuite) TestGetConnectorAndStatus() { + t := s.T() + require := require.New(t) + assert := assert.New(t) + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel() + + // Run HTTPBin container + httpC, err := testutil.RunHTTPBinContainer(ctx, network.WithNetwork([]string{"httpbin", "local-httpbin"}, s.network)) + require.NoError(err) + + client := v1alpha1connect.NewKafkaConnectServiceClient(http.DefaultClient, s.httpAddress()) + + // Create Connector request + input := &v1alpha1.CreateConnectorRequest{ + ClusterName: "connect-cluster", + Connector: &v1alpha1.ConnectorSpec{ + Name: "http_connect_input", + Config: map[string]string{ + "connector.class": "com.github.castorm.kafka.connect.http.HttpSourceConnector", + "header.converter": "org.apache.kafka.connect.storage.SimpleHeaderConverter", + "http.request.url": "http://httpbin/uuid", + "http.timer.catchup.interval.millis": "10000", + "http.timer.interval.millis": "1000", + "kafka.topic": "httpbin-input", + "key.converter": "org.apache.kafka.connect.json.JsonConverter", + "key.converter.schemas.enable": "false", + "name": "http_connect_input", + "topic.creation.default.partitions": "1", + "topic.creation.default.replication.factor": "1", + "topic.creation.enable": "true", + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + "value.converter.schemas.enable": "false", + }, + }, + } + + _, err = client.CreateConnector(ctx, connect.NewRequest(input)) + + require.NoError(err) + + t.Cleanup(func() { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) + defer cancel() + + // delete connector + _, err := client.DeleteConnector(ctx, connect.NewRequest( + &v1alpha1.DeleteConnectorRequest{ + ClusterName: input.ClusterName, + Name: input.Connector.Name, + }, + )) + require.NoError(err) + + // Stop HTTPBin container + err = httpC.Terminate(ctx) + require.NoError(err) + }) + + t.Run("Get connector request (connect-go)", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + res, err := client.GetConnector(ctx, connect.NewRequest( + &v1alpha1.GetConnectorRequest{ + ClusterName: input.ClusterName, + Name: input.Connector.Name, + })) + require.NoError(err) + assert.NotNil(res.Msg, "response message must not be nil") + assert.Equal("http_connect_input", res.Msg.Connector.Name) + assert.Equal(input.Connector.Config, res.Msg.Connector.Config) + }) + + t.Run("Get connector request (http)", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + type getConnectorResponse struct { + Name string `json:"name"` + Config map[string]string `json:"config"` + Type string `json:"type"` + } + + var response getConnectorResponse + var errResponse string + err := requests. + URL(s.httpAddress() + "/v1alpha1/"). + Path("connect/clusters/connect-cluster/connectors/http_connect_input"). + AddValidator(requests.ValidatorHandler( + requests.CheckStatus(http.StatusOK), + requests.ToString(&errResponse), + )). + ToJSON(&response). + Fetch(ctx) + assert.Empty(errResponse) + require.NoError(err) + assert.Equal(input.Connector.Name, response.Name) + assert.Equal(input.Connector.Config, response.Config) + assert.Equal("source", response.Type) + }) + + t.Run("Get connector status (connect-go)", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + res, err := client.GetConnectorStatus(ctx, connect.NewRequest( + &v1alpha1.GetConnectorStatusRequest{ + ClusterName: input.ClusterName, + Name: input.Connector.Name, + })) + require.NoError(err) + assert.NotNil(res.Msg, "response message must not be nil") + assert.Equal("http_connect_input", res.Msg.Status.Name) + }) + + t.Run("Get connector status request (http)", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + type getConnectorStatusResponse struct { + Name string `json:"name"` + Type string `json:"type"` + } + + var response getConnectorStatusResponse + var errResponse string + err := requests. + URL(s.httpAddress() + "/v1alpha1/"). + Path("connect/clusters/connect-cluster/connectors/http_connect_input/status"). + AddValidator(requests.ValidatorHandler( + requests.CheckStatus(http.StatusOK), + requests.ToString(&errResponse), + )). + ToJSON(&response). + Fetch(ctx) + assert.Empty(errResponse) + require.NoError(err) + assert.Equal(input.Connector.Name, response.Name) + assert.Equal("source", response.Type) + }) +} From 0cbeec6294dfa5eb512fcf336f3990e50c036767 Mon Sep 17 00:00:00 2001 From: Santiago Jimenez Giraldo Date: Mon, 22 Jan 2024 17:14:16 +0100 Subject: [PATCH 4/5] refactor(kafka-connect): support get status method Implement get connector and get connector status method, refactor some internals to simplify the aggregation of statuses Signed-off-by: Santiago Jimenez Giraldo --- backend/pkg/connect/get_connectors.go | 220 ++++++++++++++++++++------ 1 file changed, 171 insertions(+), 49 deletions(-) diff --git a/backend/pkg/connect/get_connectors.go b/backend/pkg/connect/get_connectors.go index 1d8fdb3c7..b10cb99fa 100644 --- a/backend/pkg/connect/get_connectors.go +++ b/backend/pkg/connect/get_connectors.go @@ -126,6 +126,28 @@ type ClusterConnectorTaskInfo struct { // KafkaConnectToConsoleHook is a function that lets you modify the response before it is sent to the Console frontend. type KafkaConnectToConsoleHook = func(pluginClassName string, configs map[string]string) map[string]string +// ConnectorStatus contains information about a single connector and its tasks status +type ConnectorStatus struct { + Name string `json:"name"` + Connector con.ConnectorState `json:"connector"` + Tasks []ClusterConnectorTaskInfo `json:"tasks"` + Errors []ClusterConnectorInfoError `json:"errors"` + Type string `json:"type"` + State connectorState `json:"state"` +} + +// aggregatedConnectorTasksStatus contains information about the Task of a connectors, this is an intermediate state +type aggregatedConnectorTasksStatus struct { + Total int + Running int + Paused int + Restarting int + Unassigned int + Failed int + Tasks []ClusterConnectorTaskInfo + Errors []ClusterConnectorInfoError +} + // GetAllClusterConnectors returns the merged GET /connectors responses across all configured Connect clusters. Requests will be // sent concurrently. Context timeout should be configured correctly in order to not await responses from offline clusters // for too long. @@ -271,6 +293,64 @@ func (s *Service) GetConnector(ctx context.Context, clusterName string, connecto }, nil } +// GetConnectorInfo requests the connector info in the context of a single connect cluster. +func (s *Service) GetConnectorInfo(ctx context.Context, clusterName string, connector string) (con.ConnectorInfo, *rest.Error) { + c, restErr := s.getConnectClusterByName(clusterName) + if restErr != nil { + return con.ConnectorInfo{}, restErr + } + + cInfo, err := c.Client.GetConnector(ctx, connector) + if err != nil { + return con.ConnectorInfo{}, &rest.Error{ + Err: err, + Status: GetStatusCodeFromAPIError(err, http.StatusServiceUnavailable), + Message: fmt.Sprintf("Failed to get connector state: %v", err.Error()), + InternalLogs: []zapcore.Field{zap.String("cluster_name", clusterName), zap.String("connector", connector)}, + IsSilent: false, + } + } + connectorClass := getMapValueOrString(cInfo.Config, "connector.class", "unknown") + return con.ConnectorInfo{ + Name: cInfo.Name, + Config: s.Interceptor.KafkaConnectToConsole(connectorClass, cInfo.Config), + Tasks: cInfo.Tasks, + Type: cInfo.Type, + }, nil +} + +// GetConnectorStatus requests the connector info in the context of a single connect cluster. +func (s *Service) GetConnectorStatus(ctx context.Context, clusterName string, connector string) (ConnectorStatus, *rest.Error) { + c, restErr := s.getConnectClusterByName(clusterName) + if restErr != nil { + return ConnectorStatus{}, restErr + } + + cStatus, err := c.Client.GetConnectorStatus(ctx, connector) + if err != nil { + return ConnectorStatus{}, &rest.Error{ + Err: err, + Status: GetStatusCodeFromAPIError(err, http.StatusServiceUnavailable), + Message: fmt.Sprintf("Failed to get connector state: %v", err.Error()), + InternalLogs: []zapcore.Field{zap.String("cluster_name", clusterName), zap.String("connector", connector)}, + IsSilent: false, + } + } + + aggregatedTasksStatus := getAggregatedTasksStatus(cStatus.Name, cStatus.Tasks) + + holisticConnectorState := getHolisticStateFromConnector(cStatus, aggregatedTasksStatus) + + return ConnectorStatus{ + Name: cStatus.Name, + Connector: cStatus.Connector, + Tasks: aggregatedTasksStatus.Tasks, + Errors: append(holisticConnectorState.Errors, aggregatedTasksStatus.Errors...), + Type: cStatus.Type, + State: holisticConnectorState.State, + }, nil +} + func (s *Service) listConnectorsExpandedToClusterConnectorInfo(l map[string]con.ListConnectorsResponseExpanded) []ClusterConnectorInfo { if l == nil { return []ClusterConnectorInfo{} @@ -286,46 +366,56 @@ func (s *Service) listConnectorsExpandedToClusterConnectorInfo(l map[string]con. return connectorInfo } -//nolint:gocognit,cyclop,gocyclo // lots of inspection of state and tasks to determine status and errors -func connectorsResponseToClusterConnectorInfo(configHook KafkaConnectToConsoleHook, c *con.ListConnectorsResponseExpanded) *ClusterConnectorInfo { - totalTasks := len(c.Status.Tasks) - tasks := make([]ClusterConnectorTaskInfo, totalTasks) - connectorTaskErrors := make([]ClusterConnectorInfoError, 0, totalTasks) +func getAggregatedTasksStatus(connectorName string, tasks []con.TaskState) aggregatedConnectorTasksStatus { + aggregatedTasksStatus := aggregatedConnectorTasksStatus{ + Tasks: make([]ClusterConnectorTaskInfo, len(tasks)), + Total: len(tasks), + Running: 0, + Paused: 0, + Restarting: 0, + Unassigned: 0, + Failed: 0, + Errors: make([]ClusterConnectorInfoError, 0), + } - runningTasks := 0 - failedTasks := 0 - pausedTasks := 0 - restartingTasks := 0 - unassignedTasks := 0 - for i, task := range c.Status.Tasks { - tasks[i] = ClusterConnectorTaskInfo{ + for i, task := range tasks { + aggregatedTasksStatus.Tasks[i] = ClusterConnectorTaskInfo{ TaskID: task.ID, State: task.State, WorkerID: task.WorkerID, Trace: task.Trace, } - switch task.State { case connectorStateRunning: - runningTasks++ + aggregatedTasksStatus.Running++ case connectorStateFailed: - failedTasks++ + aggregatedTasksStatus.Failed++ - errTitle := fmt.Sprintf("Connector %s Task %d is in failed state.", c.Info.Name, task.ID) - connectorTaskErrors = append(connectorTaskErrors, ClusterConnectorInfoError{ + errTitle := fmt.Sprintf("Connector %s Task %d is in failed state.", connectorName, task.ID) + aggregatedTasksStatus.Errors = append(aggregatedTasksStatus.Errors, ClusterConnectorInfoError{ Type: connectorErrorTypeError, Title: errTitle, Content: traceToErrorContent(errTitle, task.Trace), }) case connectorStatePaused: - pausedTasks++ + aggregatedTasksStatus.Paused++ case connectorStateRestarting: - restartingTasks++ + aggregatedTasksStatus.Restarting++ case ConnectorStatusUnassigned: - unassignedTasks++ + aggregatedTasksStatus.Unassigned++ } } + return aggregatedTasksStatus +} + +type holisticConnectorState struct { + State string + Errors []ClusterConnectorInfoError +} + +//nolint:cyclop // lots of inspection of state and tasks to determine status and errors +func getHolisticStateFromConnector(status con.ConnectorStateInfo, aggregatedTasksStatus aggregatedConnectorTasksStatus) holisticConnectorState { // LOGIC: // HEALTHY: Connector is in running state, > 0 tasks, all of them in running state. // UNHEALTHY: Connector is failed state. @@ -341,40 +431,40 @@ func connectorsResponseToClusterConnectorInfo(configHook KafkaConnectToConsoleHo var connStatus connectorStatus var errDetailedContent string //nolint:gocritic,goconst // this if else is easier to read as they map to rules and logic specified above. - if (c.Status.Connector.State == connectorStateRunning) && - totalTasks > 0 && runningTasks == totalTasks { + if (status.Connector.State == connectorStateRunning) && + aggregatedTasksStatus.Total > 0 && aggregatedTasksStatus.Running == aggregatedTasksStatus.Total { connStatus = ConnectorStatusHealthy - } else if (c.Status.Connector.State == connectorStateFailed) || - ((c.Status.Connector.State == connectorStateRunning) && (totalTasks == 0 || totalTasks == failedTasks)) { + } else if (status.Connector.State == connectorStateFailed) || + ((status.Connector.State == connectorStateRunning) && (aggregatedTasksStatus.Total == 0 || aggregatedTasksStatus.Total == aggregatedTasksStatus.Failed)) { connStatus = ConnectorStatusUnhealthy - if c.Status.Connector.State == connectorStateFailed { - errDetailedContent = "Connector " + c.Info.Name + " is in failed state." - } else if totalTasks == 0 { - errDetailedContent = "Connector " + c.Info.Name + " is in " + strings.ToLower(c.Status.Connector.State) + " state but has no tasks." - } else if totalTasks == failedTasks { - errDetailedContent = "Connector " + c.Info.Name + " is in " + strings.ToLower(c.Status.Connector.State) + " state. All tasks are in failed state." + if status.Connector.State == connectorStateFailed { + errDetailedContent = "Connector " + status.Name + " is in failed state." + } else if aggregatedTasksStatus.Total == 0 { + errDetailedContent = "Connector " + status.Name + " is in " + strings.ToLower(status.Connector.State) + " state but has no tasks." + } else if aggregatedTasksStatus.Total == aggregatedTasksStatus.Failed { + errDetailedContent = "Connector " + status.Name + " is in " + strings.ToLower(status.Connector.State) + " state. All tasks are in failed state." } - } else if (c.Status.Connector.State == connectorStateRunning) && (totalTasks > 0 && failedTasks > 0 && failedTasks < totalTasks) { + } else if (status.Connector.State == connectorStateRunning) && (aggregatedTasksStatus.Total > 0 && aggregatedTasksStatus.Failed > 0 && aggregatedTasksStatus.Failed < aggregatedTasksStatus.Total) { connStatus = ConnectorStatusDegraded errDetailedContent = fmt.Sprintf("Connector %s is in %s state but has %d / %d failed tasks.", - c.Info.Name, strings.ToLower(c.Status.Connector.State), failedTasks, totalTasks) - } else if c.Status.Connector.State == connectorStatePaused { + status.Name, strings.ToLower(status.Connector.State), aggregatedTasksStatus.Failed, aggregatedTasksStatus.Total) + } else if status.Connector.State == connectorStatePaused { connStatus = ConnectorStatusPaused - } else if c.Status.Connector.State == connectorStateStopped { + } else if status.Connector.State == connectorStateStopped { connStatus = ConnectorStatusStopped - } else if (c.Status.Connector.State == connectorStateRestarting) || - (totalTasks > 0 && restartingTasks > 0) { + } else if (status.Connector.State == connectorStateRestarting) || + (aggregatedTasksStatus.Total > 0 && aggregatedTasksStatus.Restarting > 0) { connStatus = ConnectorStatusRestarting - } else if (c.Status.Connector.State == connectorStateUnassigned) || - ((c.Status.Connector.State == connectorStateRunning) && (totalTasks > 0 && unassignedTasks > 0)) { + } else if (status.Connector.State == connectorStateUnassigned) || + ((status.Connector.State == connectorStateRunning) && (aggregatedTasksStatus.Total > 0 && aggregatedTasksStatus.Unassigned > 0)) { connStatus = ConnectorStatusUnassigned - } else if c.Status.Connector.State == connectorStateDestroyed { + } else if status.Connector.State == connectorStateDestroyed { connStatus = ConnectorStatusDestroyed } else { connStatus = ConnectorStatusUnknown errDetailedContent = fmt.Sprintf("Unknown connector status. Connector %s is in %s state.", - c.Info.Name, strings.ToLower(c.Status.Connector.State)) + status.Name, strings.ToLower(status.Connector.State)) } connectorErrors := make([]ClusterConnectorInfoError, 0) @@ -385,7 +475,7 @@ func connectorsResponseToClusterConnectorInfo(configHook KafkaConnectToConsoleHo stateStr = "degraded" } - errTitle := "Connector " + c.Info.Name + " is in " + stateStr + " state." + errTitle := "Connector " + status.Name + " is in " + stateStr + " state." defaultContent := errTitle if errDetailedContent != "" { @@ -395,18 +485,50 @@ func connectorsResponseToClusterConnectorInfo(configHook KafkaConnectToConsoleHo connectorErrors = append(connectorErrors, ClusterConnectorInfoError{ Type: connectorErrorTypeError, Title: errTitle, - Content: traceToErrorContent(defaultContent, c.Status.Connector.Trace), + Content: traceToErrorContent(defaultContent, status.Connector.Trace), }) - } else if len(c.Status.Connector.Trace) > 0 { - errTitle := "Connector " + c.Info.Name + " has an error" + } else if len(status.Connector.Trace) > 0 { + errTitle := "Connector " + status.Name + " has an error" connectorErrors = append(connectorErrors, ClusterConnectorInfoError{ Type: connectorErrorTypeError, Title: errTitle, - Content: traceToErrorContent(errTitle, c.Status.Connector.Trace), + Content: traceToErrorContent(errTitle, status.Connector.Trace), }) } - connectorErrors = append(connectorErrors, connectorTaskErrors...) + return holisticConnectorState{ + State: connStatus, + Errors: connectorErrors, + } +} + +func connectorsResponseToClusterConnectorInfo(configHook KafkaConnectToConsoleHook, c *con.ListConnectorsResponseExpanded) *ClusterConnectorInfo { + // There seems to be a type missmatch for now I think it's ok to do this conversion looking for a fix in the upstream implementation + tasks := make([]con.TaskState, len(c.Status.Tasks)) + + for i, task := range c.Status.Tasks { + tasks[i] = con.TaskState{ + ID: task.ID, + State: task.State, + WorkerID: task.WorkerID, + Trace: task.Trace, + } + } + + status := con.ConnectorStateInfo{ + Name: c.Status.Name, + Connector: c.Status.Connector, + Tasks: tasks, + Type: c.Status.Type, + } + + aggregatedTasksStatus := getAggregatedTasksStatus(c.Info.Name, tasks) + + holisticState := getHolisticStateFromConnector(status, aggregatedTasksStatus) + + connectorErrors := holisticState.Errors + + connectorErrors = append(connectorErrors, aggregatedTasksStatus.Errors...) connectorClass := getMapValueOrString(c.Info.Config, "connector.class", "unknown") if configHook == nil { @@ -422,12 +544,12 @@ func connectorsResponseToClusterConnectorInfo(configHook KafkaConnectToConsoleHo Type: c.Info.Type, State: c.Status.Connector.State, WorkerID: c.Status.Connector.WorkerID, - Status: connStatus, - Tasks: tasks, + Status: holisticState.State, + Tasks: aggregatedTasksStatus.Tasks, Trace: c.Status.Connector.Trace, Errors: connectorErrors, TotalTasks: len(c.Status.Tasks), - RunningTasks: runningTasks, + RunningTasks: aggregatedTasksStatus.Running, } } From 1ce960b890583065b46713d9192aacbf29acdd95 Mon Sep 17 00:00:00 2001 From: Santiago Jimenez Giraldo Date: Mon, 22 Jan 2024 17:21:45 +0100 Subject: [PATCH 5/5] feat(kafka-connect): get connector / get connector status Implement get connector and get connector status on the connect-go services and gateway Signed-off-by: Santiago Jimenez Giraldo --- .../connect/service/kafkaconnect/mapper.go | 40 +++++++++--- .../connect/service/kafkaconnect/service.go | 61 ++++++++++++------- 2 files changed, 70 insertions(+), 31 deletions(-) diff --git a/backend/pkg/api/connect/service/kafkaconnect/mapper.go b/backend/pkg/api/connect/service/kafkaconnect/mapper.go index 00837f3c9..fe70fac5d 100644 --- a/backend/pkg/api/connect/service/kafkaconnect/mapper.go +++ b/backend/pkg/api/connect/service/kafkaconnect/mapper.go @@ -32,9 +32,7 @@ func (m mapper) connectorsHTTPResponseToProto(httpResponse kafkaconnect.ClusterC } connectors[i] = &dataplanev1alpha1.ListConnectorsResponse_ConnectorInfoStatus{ - Name: connector.Name, - HolisticState: m.holisticStateToProto(connector.Status), - Errors: errors, + Name: connector.Name, } connectors[i].Info = &dataplanev1alpha1.ConnectorSpec{ @@ -49,10 +47,12 @@ func (m mapper) connectorsHTTPResponseToProto(httpResponse kafkaconnect.ClusterC Connector: &dataplanev1alpha1.ConnectorStatus_Connector{ State: connector.State, WorkerId: connector.WorkerID, + Trace: connector.Trace, }, - Tasks: m.taskInfoListToProtoStatus(connector.Tasks), - Type: connector.Type, - Trace: connector.Trace, + Tasks: m.taskInfoListToProtoStatus(connector.Tasks), + Type: connector.Type, + Errors: errors, + HolisticState: m.holisticStateToProto(connector.State), } } @@ -162,7 +162,7 @@ func (mapper) createConnectorProtoToClientRequest(createConnector *dataplanev1al }, nil } -func (m mapper) ClusterInfoToProto(clusterInfo kafkaconnect.ClusterInfo) (*dataplanev1alpha1.ConnectCluster, error) { +func (m mapper) clusterInfoToProto(clusterInfo kafkaconnect.ClusterInfo) *dataplanev1alpha1.ConnectCluster { return &dataplanev1alpha1.ConnectCluster{ Name: clusterInfo.Name, Address: clusterInfo.Host, @@ -172,7 +172,7 @@ func (m mapper) ClusterInfoToProto(clusterInfo kafkaconnect.ClusterInfo) (*datap KafkaClusterId: clusterInfo.KafkaClusterID, }, Plugins: m.connectPluginsToProto(clusterInfo.Plugins), - }, nil + } } func (mapper) connectPluginsToProto(plugins []con.ConnectorPluginInfo) []*dataplanev1alpha1.ConnectorPlugin { @@ -212,8 +212,8 @@ func (m mapper) connectorInfoListToProto(connectorInfoList []kafkaconnect.Cluste return clusters, errs } -// ConnectorSpecToProto converts the http response to proto message -func (mapper) ConnectorSpecToProto(connector con.ConnectorInfo) *dataplanev1alpha1.ConnectorSpec { +// connectorSpecToProto converts the http response to proto message +func (mapper) connectorSpecToProto(connector con.ConnectorInfo) *dataplanev1alpha1.ConnectorSpec { tasks := make([]*dataplanev1alpha1.TaskInfo, len(connector.Tasks)) for i, task := range connector.Tasks { @@ -226,9 +226,29 @@ func (mapper) ConnectorSpecToProto(connector con.ConnectorInfo) *dataplanev1alph Name: connector.Name, Config: connector.Config, Tasks: tasks, + Type: connector.Type, } } +func (m mapper) connectorStatusToProto(status kafkaconnect.ConnectorStatus) (*dataplanev1alpha1.ConnectorStatus, error) { + errors, err := m.connectorErrorsToProto(status.Errors) + if err != nil { + return nil, fmt.Errorf("failed to map connector error to proto for connector %q: %w", status.Name, err) + } + return &dataplanev1alpha1.ConnectorStatus{ + Name: status.Name, + Connector: &dataplanev1alpha1.ConnectorStatus_Connector{ + State: status.Connector.State, + WorkerId: status.Connector.WorkerID, + Trace: status.Connector.Trace, + }, + Type: status.Type, + Errors: errors, + Tasks: m.taskInfoListToProtoStatus(status.Tasks), + HolisticState: m.holisticStateToProto(status.State), + }, nil +} + // convertStringMapToInterfaceMap converts interface map to string map func convertStringMapToInterfaceMap(stringMap map[string]string) map[string]any { interfaceMap := make(map[string]any, len(stringMap)) diff --git a/backend/pkg/api/connect/service/kafkaconnect/service.go b/backend/pkg/api/connect/service/kafkaconnect/service.go index 4f5c70f5b..637296ac0 100644 --- a/backend/pkg/api/connect/service/kafkaconnect/service.go +++ b/backend/pkg/api/connect/service/kafkaconnect/service.go @@ -110,12 +110,43 @@ func (s *Service) CreateConnector(ctx context.Context, req *connect.Request[v1al } // GetConnector implements the handler for the get connector operation -func (*Service) GetConnector(context.Context, *connect.Request[v1alpha1.GetConnectorRequest]) (*connect.Response[v1alpha1.GetConnectorResponse], error) { - return nil, apierrors.NewConnectError( - connect.CodeUnimplemented, - errors.New("endpoint is not implemented"), - apierrors.NewErrorInfo(v1alpha1.Reason_REASON_KAFKA_CONNECT_API_ERROR.String()), - ) +func (s *Service) GetConnector(ctx context.Context, req *connect.Request[v1alpha1.GetConnectorRequest]) (*connect.Response[v1alpha1.GetConnectorResponse], error) { + httpRes, err := s.connectSvc.GetConnectorInfo(ctx, req.Msg.ClusterName, req.Msg.Name) + if err != nil { + return nil, s.matchError(err) + } + + res := connect.NewResponse(&v1alpha1.GetConnectorResponse{ + Connector: s.mapper.connectorSpecToProto(httpRes), + }) + + return res, nil +} + +// GetConnectorStatus implements the handler for the get connector status operation +func (s *Service) GetConnectorStatus(ctx context.Context, req *connect.Request[v1alpha1.GetConnectorStatusRequest]) (*connect.Response[v1alpha1.GetConnectorStatusResponse], error) { + httpRes, restErr := s.connectSvc.GetConnectorStatus(ctx, req.Msg.ClusterName, req.Msg.Name) + if restErr != nil { + return nil, s.matchError(restErr) + } + + status, err := s.mapper.connectorStatusToProto(httpRes) + if err != nil { + s.logger.Error("error mapping response for connector", zap.Error(err), zap.String("cluster", req.Msg.ClusterName), zap.String("connector", req.Msg.Name)) + return nil, apierrors.NewConnectError( + connect.CodeInternal, + err, + apierrors.NewErrorInfo( + v1alpha1.Reason_REASON_KAFKA_CONNECT_API_ERROR.String(), + ), + ) + } + + res := connect.NewResponse(&v1alpha1.GetConnectorStatusResponse{ + Status: status, + }) + + return res, nil } // ResumeConnector implements the handler for the resume connector operation @@ -199,26 +230,14 @@ func (s *Service) ListConnectClusters(ctx context.Context, _ *connect.Request[v1 }), nil } -// GetConnectCluster implements the handler for the restart connector operation +// GetConnectCluster implements the get connector info operation func (s *Service) GetConnectCluster(ctx context.Context, req *connect.Request[v1alpha1.GetConnectClusterRequest]) (*connect.Response[v1alpha1.GetConnectClusterResponse], error) { response, httpErr := s.connectSvc.GetClusterInfo(ctx, req.Msg.ClusterName) if httpErr != nil { return nil, s.matchError(httpErr) } - - clusterInfoProto, err := s.mapper.ClusterInfoToProto(response) - if err != nil { - s.logger.Error("unable to map list connectors response", zap.Error(err)) - return nil, apierrors.NewConnectError( - connect.CodeInternal, - errors.New("not able to parse response"), - apierrors.NewErrorInfo( - v1alpha1.Reason_REASON_KAFKA_CONNECT_API_ERROR.String(), - ), - ) - } return connect.NewResponse(&v1alpha1.GetConnectClusterResponse{ - Cluster: clusterInfoProto, + Cluster: s.mapper.clusterInfoToProto(response), }), nil } @@ -242,7 +261,7 @@ func (s *Service) UpsertConnector(ctx context.Context, req *connect.Request[v1al } res := connect.NewResponse(&v1alpha1.UpsertConnectorResponse{ - Connector: s.mapper.ConnectorSpecToProto(conInfo), + Connector: s.mapper.connectorSpecToProto(conInfo), }) // Check if connector already exists, if not set header to 201 created