diff --git a/cmd/root.go b/cmd/root.go index 4ac259b2..c17cd818 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -6,6 +6,7 @@ import ( _ "net/http/pprof" // enable pprof via a flag "os" + "github.com/bmeg/grip/cmd/caliperload" "github.com/bmeg/grip/cmd/create" "github.com/bmeg/grip/cmd/delete" "github.com/bmeg/grip/cmd/drop" @@ -60,6 +61,7 @@ func init() { RootCmd.AddCommand(job.Cmd) RootCmd.AddCommand(load.Cmd) RootCmd.AddCommand(mongoload.Cmd) + RootCmd.AddCommand(caliperload.Cmd) RootCmd.AddCommand(query.Cmd) RootCmd.AddCommand(erclient.Cmd) RootCmd.AddCommand(rdf.Cmd) diff --git a/cmd/schema/main.go b/cmd/schema/main.go index 1afdc411..d40c3b2e 100644 --- a/cmd/schema/main.go +++ b/cmd/schema/main.go @@ -63,7 +63,7 @@ var getCmd = &cobra.Command{ }, } -var loadPrimitiveSchemafromJsonSchema = &cobra.Command{ +var loadGqlSchemafromJsonSchema = &cobra.Command{ Use: "load", Short: "Load graph schemas", Long: ``, @@ -221,12 +221,12 @@ func init() { pflags.StringVar(&yamlSchemaDir, "yamlSchemaDir", "", "Name of YAML schemas dir") pflags.StringVar(&graphName, "graphName", "", "Name of schemaGraph") - sflags := loadPrimitiveSchemafromJsonSchema.Flags() - sflags.StringVar(&jsonSchemaFile, "jsonSchema", "", "Json Schema") - sflags.StringVar(&yamlSchemaDir, "yamlSchemaDir", "", "Name of YAML schemas dir") - sflags.StringVar(&graphName, "graphName", "", "Name of schemaGraph") + gqlflags := loadGqlSchemafromJsonSchema.Flags() + gqlflags.StringVar(&jsonSchemaFile, "jsonSchema", "", "Json Schema") + gqlflags.StringVar(&yamlSchemaDir, "yamlSchemaDir", "", "Name of YAML schemas dir") + gqlflags.StringVar(&graphName, "graphName", "", "Name of schemaGraph") - Cmd.AddCommand(loadPrimitiveSchemafromJsonSchema) + Cmd.AddCommand(loadGqlSchemafromJsonSchema) Cmd.AddCommand(getCmd) Cmd.AddCommand(postCmd) } diff --git a/gripql/.DS_Store b/gripql/.DS_Store new file mode 100644 index 00000000..58751a71 Binary files /dev/null and b/gripql/.DS_Store differ diff --git a/gripql/client.go b/gripql/client.go index dc994e92..535e8d27 100644 --- a/gripql/client.go +++ b/gripql/client.go @@ -181,6 +181,21 @@ func (client Client) BulkAdd(elemChan chan *GraphElement) error { return err } +func (client Client) BulkAddRaw(elemChan chan *RawJson) error { + sc, err := client.EditC.BulkAddRaw(context.Background()) + if err != nil { + return err + } + for elem := range elemChan { + err := sc.Send(elem) + if err != nil { + return err + } + } + _, err = sc.CloseAndRecv() + return err +} + func (client Client) BulkDelete(delete *DeleteData) error { _, err := client.EditC.BulkDelete(context.Background(), delete) return err diff --git a/gripql/gripql.pb.dgw.go b/gripql/gripql.pb.dgw.go index 126a8ca6..075ea8f6 100644 --- a/gripql/gripql.pb.dgw.go +++ b/gripql/gripql.pb.dgw.go @@ -874,6 +874,84 @@ func (shim *EditDirectClient) BulkAdd(ctx context.Context, opts ...grpc.CallOpti } +// Streaming data 'server' shim. Provides the Send/Recv funcs expected by the +// user server code when dealing with a streaming input + +/* Start EditBulkAddRaw streaming input server */ +type directEditBulkAddRaw struct { + ctx context.Context + c chan *RawJson + out chan *BulkEditResult +} + +func (dsm *directEditBulkAddRaw) Recv() (*RawJson, error) { + value, ok := <-dsm.c + if !ok { + return nil, io.EOF + } + return value, nil +} + +func (dsm *directEditBulkAddRaw) Send(a *RawJson) error { + dsm.c <- a + return nil +} + +func (dsm *directEditBulkAddRaw) Context() context.Context { + return dsm.ctx +} + +func (dsm *directEditBulkAddRaw) SendAndClose(o *BulkEditResult) error { + dsm.out <- o + close(dsm.out) + return nil +} + +func (dsm *directEditBulkAddRaw) CloseAndRecv() (*BulkEditResult, error) { + //close(dsm.c) + out := <- dsm.out + return out, nil +} + +func (dsm *directEditBulkAddRaw) CloseSend() error { close(dsm.c); return nil } +func (dsm *directEditBulkAddRaw) SetTrailer(metadata.MD) {} +func (dsm *directEditBulkAddRaw) SetHeader(metadata.MD) error { return nil } +func (dsm *directEditBulkAddRaw) SendHeader(metadata.MD) error { return nil } +func (dsm *directEditBulkAddRaw) SendMsg(m interface{}) error { dsm.out <- m.(*BulkEditResult); return nil } + +func (dsm *directEditBulkAddRaw) RecvMsg(m interface{}) error { + t, err := dsm.Recv() + mPtr := m.(*RawJson) + if t != nil { + *mPtr = *t + } + return err +} + +func (dsm *directEditBulkAddRaw) Header() (metadata.MD, error) { return nil, nil } +func (dsm *directEditBulkAddRaw) Trailer() metadata.MD { return nil } +/* End EditBulkAddRaw streaming input server */ + + +func (shim *EditDirectClient) BulkAddRaw(ctx context.Context, opts ...grpc.CallOption) (Edit_BulkAddRawClient, error) { + md, _ := metadata.FromOutgoingContext(ctx) + ictx := metadata.NewIncomingContext(ctx, md) + w := &directEditBulkAddRaw{ictx, make(chan *RawJson, 100), make(chan *BulkEditResult, 3)} + if shim.streamServerInt != nil { + info := grpc.StreamServerInfo{ + FullMethod: "/gripql.Edit/BulkAddRaw", + IsClientStream: true, + } + go shim.streamServerInt(shim.server, w, &info, _Edit_BulkAddRaw_Handler) + return w, nil + } + go func() { + shim.server.BulkAddRaw(w) + }() + return w, nil +} + + //AddGraph shim func (shim *EditDirectClient) AddGraph(ctx context.Context, in *GraphID, opts ...grpc.CallOption) (*EditResult, error) { md, _ := metadata.FromOutgoingContext(ctx) diff --git a/gripql/gripql.pb.go b/gripql/gripql.pb.go index 50626d24..f79eb7ea 100644 --- a/gripql/gripql.pb.go +++ b/gripql/gripql.pb.go @@ -3193,6 +3193,53 @@ func (x *DeleteData) GetEdges() []string { return nil } +type RawJson struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data *structpb.Struct `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *RawJson) Reset() { + *x = RawJson{} + if protoimpl.UnsafeEnabled { + mi := &file_gripql_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RawJson) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RawJson) ProtoMessage() {} + +func (x *RawJson) ProtoReflect() protoreflect.Message { + mi := &file_gripql_proto_msgTypes[41] + 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 RawJson.ProtoReflect.Descriptor instead. +func (*RawJson) Descriptor() ([]byte, []int) { + return file_gripql_proto_rawDescGZIP(), []int{41} +} + +func (x *RawJson) GetData() *structpb.Struct { + if x != nil { + return x.Data + } + return nil +} + type PluginConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3206,7 +3253,7 @@ type PluginConfig struct { func (x *PluginConfig) Reset() { *x = PluginConfig{} if protoimpl.UnsafeEnabled { - mi := &file_gripql_proto_msgTypes[41] + mi := &file_gripql_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3219,7 +3266,7 @@ func (x *PluginConfig) String() string { func (*PluginConfig) ProtoMessage() {} func (x *PluginConfig) ProtoReflect() protoreflect.Message { - mi := &file_gripql_proto_msgTypes[41] + mi := &file_gripql_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3232,7 +3279,7 @@ func (x *PluginConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginConfig.ProtoReflect.Descriptor instead. func (*PluginConfig) Descriptor() ([]byte, []int) { - return file_gripql_proto_rawDescGZIP(), []int{41} + return file_gripql_proto_rawDescGZIP(), []int{42} } func (x *PluginConfig) GetName() string { @@ -3268,7 +3315,7 @@ type PluginStatus struct { func (x *PluginStatus) Reset() { *x = PluginStatus{} if protoimpl.UnsafeEnabled { - mi := &file_gripql_proto_msgTypes[42] + mi := &file_gripql_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3281,7 +3328,7 @@ func (x *PluginStatus) String() string { func (*PluginStatus) ProtoMessage() {} func (x *PluginStatus) ProtoReflect() protoreflect.Message { - mi := &file_gripql_proto_msgTypes[42] + mi := &file_gripql_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3294,7 +3341,7 @@ func (x *PluginStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginStatus.ProtoReflect.Descriptor instead. func (*PluginStatus) Descriptor() ([]byte, []int) { - return file_gripql_proto_rawDescGZIP(), []int{42} + return file_gripql_proto_rawDescGZIP(), []int{43} } func (x *PluginStatus) GetName() string { @@ -3322,7 +3369,7 @@ type ListDriversResponse struct { func (x *ListDriversResponse) Reset() { *x = ListDriversResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gripql_proto_msgTypes[43] + mi := &file_gripql_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3335,7 +3382,7 @@ func (x *ListDriversResponse) String() string { func (*ListDriversResponse) ProtoMessage() {} func (x *ListDriversResponse) ProtoReflect() protoreflect.Message { - mi := &file_gripql_proto_msgTypes[43] + mi := &file_gripql_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3348,7 +3395,7 @@ func (x *ListDriversResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDriversResponse.ProtoReflect.Descriptor instead. func (*ListDriversResponse) Descriptor() ([]byte, []int) { - return file_gripql_proto_rawDescGZIP(), []int{43} + return file_gripql_proto_rawDescGZIP(), []int{44} } func (x *ListDriversResponse) GetDrivers() []string { @@ -3369,7 +3416,7 @@ type ListPluginsResponse struct { func (x *ListPluginsResponse) Reset() { *x = ListPluginsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gripql_proto_msgTypes[44] + mi := &file_gripql_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3382,7 +3429,7 @@ func (x *ListPluginsResponse) String() string { func (*ListPluginsResponse) ProtoMessage() {} func (x *ListPluginsResponse) ProtoReflect() protoreflect.Message { - mi := &file_gripql_proto_msgTypes[44] + mi := &file_gripql_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3395,7 +3442,7 @@ func (x *ListPluginsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPluginsResponse.ProtoReflect.Descriptor instead. func (*ListPluginsResponse) Descriptor() ([]byte, []int) { - return file_gripql_proto_rawDescGZIP(), []int{44} + return file_gripql_proto_rawDescGZIP(), []int{45} } func (x *ListPluginsResponse) GetPlugins() []string { @@ -3743,230 +3790,238 @@ var file_gripql_proto_rawDesc = []byte{ 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x38, 0x0a, 0x0c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 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, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x2f, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x22, 0x2f, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x2a, 0xa2, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x15, 0x0a, 0x11, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x01, 0x12, 0x07, - 0x0a, 0x03, 0x4e, 0x45, 0x51, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x05, - 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, - 0x49, 0x44, 0x45, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x55, 0x54, 0x53, 0x49, 0x44, 0x45, - 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x45, 0x54, 0x57, 0x45, 0x45, 0x4e, 0x10, 0x09, 0x12, - 0x0a, 0x0a, 0x06, 0x57, 0x49, 0x54, 0x48, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x0b, 0x0a, 0x07, 0x57, - 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x10, 0x0b, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x54, - 0x41, 0x49, 0x4e, 0x53, 0x10, 0x0c, 0x2a, 0x49, 0x0a, 0x08, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, - 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, - 0x04, 0x2a, 0x4f, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, - 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x55, 0x4d, 0x45, 0x52, - 0x49, 0x43, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x52, 0x52, 0x41, 0x59, - 0x10, 0x05, 0x32, 0xcf, 0x06, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x5a, 0x0a, 0x09, - 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, - 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, - 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, - 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, - 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x0e, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, - 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, - 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x11, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x0c, 0x2e, - 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0x57, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, - 0x44, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, - 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4d, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, - 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, - 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x7d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x4f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, - 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, - 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x7d, 0x2f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x4a, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x5c, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x1b, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x5a, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x49, 0x44, 0x1a, 0x1a, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x0d, 0x2e, - 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x67, - 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x30, 0x01, 0x32, 0xed, 0x04, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x50, 0x0a, 0x06, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x10, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x12, 0x4e, - 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x10, 0x2e, 0x67, 0x72, - 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x30, 0x01, 0x12, 0x5e, - 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x12, 0x2e, 0x67, - 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, + 0x67, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x07, 0x52, 0x61, 0x77, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x2b, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaf, 0x01, 0x0a, 0x0c, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x38, 0x0a, + 0x0c, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 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, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x22, 0x2f, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2a, 0xa2, 0x01, 0x0a, 0x09, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x06, + 0x0a, 0x02, 0x45, 0x51, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x45, 0x51, 0x10, 0x02, 0x12, + 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x04, + 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, + 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x49, 0x44, 0x45, 0x10, 0x07, 0x12, 0x0b, 0x0a, + 0x07, 0x4f, 0x55, 0x54, 0x53, 0x49, 0x44, 0x45, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x45, + 0x54, 0x57, 0x45, 0x45, 0x4e, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x49, 0x54, 0x48, 0x49, + 0x4e, 0x10, 0x0a, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x10, 0x0b, + 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, 0x0c, 0x2a, 0x49, + 0x0a, 0x08, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, + 0x45, 0x55, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, + 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x4f, 0x0a, 0x09, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, + 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, + 0x09, 0x0a, 0x05, 0x41, 0x52, 0x52, 0x41, 0x59, 0x10, 0x05, 0x32, 0xcf, 0x06, 0x0a, 0x05, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x5a, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x6c, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, + 0x12, 0x55, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x11, 0x2e, + 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, + 0x1a, 0x0e, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x45, 0x64, + 0x67, 0x65, 0x12, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, + 0x64, 0x67, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, + 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x65, + 0x64, 0x67, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x23, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, + 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x4d, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x0f, + 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, + 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x12, 0x4f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x0f, + 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, + 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x21, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x4a, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x73, 0x12, + 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, + 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x5c, 0x0a, + 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x67, + 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x1b, 0x2e, + 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x5a, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x1a, 0x2e, 0x67, 0x72, 0x69, + 0x70, 0x71, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x30, 0x01, 0x12, 0x54, - 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x10, 0x2e, 0x67, 0x72, - 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x1a, 0x11, 0x2e, - 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x51, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x10, - 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4a, 0x6f, 0x62, - 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x76, 0x31, - 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, - 0x6f, 0x62, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x59, 0x0a, 0x07, 0x56, 0x69, 0x65, 0x77, 0x4a, - 0x6f, 0x62, 0x12, 0x10, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4a, 0x6f, 0x62, 0x1a, 0x13, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, - 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x30, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x4a, 0x6f, 0x62, 0x12, - 0x13, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, - 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2d, 0x72, 0x65, 0x73, 0x75, - 0x6d, 0x65, 0x30, 0x01, 0x32, 0xf6, 0x08, 0x0a, 0x04, 0x45, 0x64, 0x69, 0x74, 0x12, 0x5f, 0x0a, - 0x09, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x06, 0x76, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, - 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x59, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, - 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, - 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x04, 0x65, 0x64, 0x67, - 0x65, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x42, 0x75, 0x6c, - 0x6b, 0x41, 0x64, 0x64, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x76, 0x31, 0x2f, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x28, 0x01, 0x12, 0x4a, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x7d, 0x12, 0x4d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, - 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x7d, 0x12, 0x4a, 0x0a, 0x0a, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x3a, 0x01, 0x2a, 0x2a, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x5c, - 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x11, - 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x2a, 0x1d, 0x2f, + 0x7d, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, + 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x30, 0x01, 0x32, 0xed, 0x04, 0x0a, + 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x50, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x1a, 0x10, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4a, 0x6f, 0x62, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, + 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x12, 0x4e, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, + 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x49, 0x44, 0x1a, 0x10, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, - 0x2f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x11, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x12, 0x2e, - 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x67, + 0x2f, 0x6a, 0x6f, 0x62, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x27, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2d, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x12, 0x10, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4a, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x2a, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x51, 0x0a, 0x06, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x10, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x22, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, + 0x59, 0x0a, 0x07, 0x56, 0x69, 0x65, 0x77, 0x4a, 0x6f, 0x62, 0x12, 0x10, 0x2e, 0x67, 0x72, 0x69, + 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x1a, 0x13, 0x2e, 0x67, + 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, + 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, + 0x6a, 0x6f, 0x62, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x30, 0x01, 0x12, 0x60, 0x0a, 0x09, 0x52, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x13, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x67, + 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, + 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, + 0x6a, 0x6f, 0x62, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x30, 0x01, 0x32, 0xc4, 0x09, 0x0a, + 0x04, 0x45, 0x64, 0x69, 0x74, 0x12, 0x5f, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x06, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x18, 0x2f, 0x76, + 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x12, 0x59, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x45, 0x64, 0x67, + 0x65, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, + 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x24, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1e, 0x3a, 0x04, 0x65, 0x64, 0x67, 0x65, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x65, 0x64, 0x67, - 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x5b, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, - 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x7b, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x7d, 0x12, 0x63, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x2a, - 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, - 0x2f, 0x7b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x7d, 0x12, 0x53, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, - 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x57, 0x0a, - 0x0c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x0f, 0x2e, - 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x0d, - 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x27, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2d, - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x55, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, - 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x32, 0x82, 0x02, - 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x57, 0x0a, 0x0b, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, - 0x70, 0x71, 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, - 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x4d, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x73, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x12, 0x4d, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1b, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x42, 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x62, 0x6d, 0x65, 0x67, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x71, - 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x42, 0x75, 0x6c, 0x6b, 0x41, 0x64, 0x64, 0x12, 0x14, 0x2e, 0x67, + 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x42, 0x75, 0x6c, 0x6b, + 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x28, 0x01, 0x12, + 0x4c, 0x0a, 0x0a, 0x42, 0x75, 0x6c, 0x6b, 0x41, 0x64, 0x64, 0x52, 0x61, 0x77, 0x12, 0x0f, 0x2e, + 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x52, 0x61, 0x77, 0x4a, 0x73, 0x6f, 0x6e, 0x1a, 0x16, + 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x45, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x0b, + 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x61, 0x77, 0x4a, 0x73, 0x6f, 0x6e, 0x28, 0x01, 0x12, 0x4a, 0x0a, + 0x08, 0x41, 0x64, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, + 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x19, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x12, 0x4d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x19, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x12, 0x4a, 0x0a, 0x0a, 0x42, 0x75, 0x6c, 0x6b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, + 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x2a, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x12, 0x5c, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x12, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, + 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1f, 0x2a, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, + 0x12, 0x11, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x2a, + 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x7d, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x5b, 0x0a, 0x08, + 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2f, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x12, 0x63, 0x0a, 0x0b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x44, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x2a, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x7b, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x7d, 0x2f, 0x7b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x7d, 0x12, 0x53, + 0x0a, 0x09, 0x41, 0x64, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x0d, 0x2e, 0x67, 0x72, + 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, + 0x70, 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x23, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x57, 0x0a, 0x0c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x0f, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x49, 0x44, 0x1a, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, + 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x55, 0x0a, 0x0a, + 0x41, 0x64, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, + 0x70, 0x71, 0x6c, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x24, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x70, 0x68, 0x7d, 0x2f, 0x6d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x32, 0x82, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x12, 0x57, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x12, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x14, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x2e, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x4d, 0x0a, 0x0b, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, + 0x71, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, + 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x4d, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, + 0x31, 0x2f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x1d, 0x5a, 0x1b, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6d, 0x65, 0x67, 0x2f, 0x67, 0x72, 0x69, 0x70, + 0x2f, 0x67, 0x72, 0x69, 0x70, 0x71, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3982,7 +4037,7 @@ func file_gripql_proto_rawDescGZIP() []byte { } var file_gripql_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_gripql_proto_msgTypes = make([]protoimpl.MessageInfo, 47) +var file_gripql_proto_msgTypes = make([]protoimpl.MessageInfo, 48) var file_gripql_proto_goTypes = []any{ (Condition)(0), // 0: gripql.Condition (JobState)(0), // 1: gripql.JobState @@ -4028,44 +4083,45 @@ var file_gripql_proto_goTypes = []any{ (*ListLabelsResponse)(nil), // 41: gripql.ListLabelsResponse (*TableInfo)(nil), // 42: gripql.TableInfo (*DeleteData)(nil), // 43: gripql.DeleteData - (*PluginConfig)(nil), // 44: gripql.PluginConfig - (*PluginStatus)(nil), // 45: gripql.PluginStatus - (*ListDriversResponse)(nil), // 46: gripql.ListDriversResponse - (*ListPluginsResponse)(nil), // 47: gripql.ListPluginsResponse - nil, // 48: gripql.TableInfo.LinkMapEntry - nil, // 49: gripql.PluginConfig.ConfigEntry - (*structpb.ListValue)(nil), // 50: google.protobuf.ListValue - (*structpb.Value)(nil), // 51: google.protobuf.Value - (*structpb.Struct)(nil), // 52: google.protobuf.Struct + (*RawJson)(nil), // 44: gripql.RawJson + (*PluginConfig)(nil), // 45: gripql.PluginConfig + (*PluginStatus)(nil), // 46: gripql.PluginStatus + (*ListDriversResponse)(nil), // 47: gripql.ListDriversResponse + (*ListPluginsResponse)(nil), // 48: gripql.ListPluginsResponse + nil, // 49: gripql.TableInfo.LinkMapEntry + nil, // 50: gripql.PluginConfig.ConfigEntry + (*structpb.ListValue)(nil), // 51: google.protobuf.ListValue + (*structpb.Value)(nil), // 52: google.protobuf.Value + (*structpb.Struct)(nil), // 53: google.protobuf.Struct } var file_gripql_proto_depIdxs = []int32{ 25, // 0: gripql.Graph.vertices:type_name -> gripql.Vertex 26, // 1: gripql.Graph.edges:type_name -> gripql.Edge 6, // 2: gripql.GraphQuery.query:type_name -> gripql.GraphStatement 6, // 3: gripql.QuerySet.query:type_name -> gripql.GraphStatement - 50, // 4: gripql.GraphStatement.v:type_name -> google.protobuf.ListValue - 50, // 5: gripql.GraphStatement.e:type_name -> google.protobuf.ListValue - 50, // 6: gripql.GraphStatement.in:type_name -> google.protobuf.ListValue - 50, // 7: gripql.GraphStatement.out:type_name -> google.protobuf.ListValue - 50, // 8: gripql.GraphStatement.both:type_name -> google.protobuf.ListValue - 50, // 9: gripql.GraphStatement.in_e:type_name -> google.protobuf.ListValue - 50, // 10: gripql.GraphStatement.out_e:type_name -> google.protobuf.ListValue - 50, // 11: gripql.GraphStatement.both_e:type_name -> google.protobuf.ListValue - 50, // 12: gripql.GraphStatement.in_null:type_name -> google.protobuf.ListValue - 50, // 13: gripql.GraphStatement.out_null:type_name -> google.protobuf.ListValue - 50, // 14: gripql.GraphStatement.in_e_null:type_name -> google.protobuf.ListValue - 50, // 15: gripql.GraphStatement.out_e_null:type_name -> google.protobuf.ListValue + 51, // 4: gripql.GraphStatement.v:type_name -> google.protobuf.ListValue + 51, // 5: gripql.GraphStatement.e:type_name -> google.protobuf.ListValue + 51, // 6: gripql.GraphStatement.in:type_name -> google.protobuf.ListValue + 51, // 7: gripql.GraphStatement.out:type_name -> google.protobuf.ListValue + 51, // 8: gripql.GraphStatement.both:type_name -> google.protobuf.ListValue + 51, // 9: gripql.GraphStatement.in_e:type_name -> google.protobuf.ListValue + 51, // 10: gripql.GraphStatement.out_e:type_name -> google.protobuf.ListValue + 51, // 11: gripql.GraphStatement.both_e:type_name -> google.protobuf.ListValue + 51, // 12: gripql.GraphStatement.in_null:type_name -> google.protobuf.ListValue + 51, // 13: gripql.GraphStatement.out_null:type_name -> google.protobuf.ListValue + 51, // 14: gripql.GraphStatement.in_e_null:type_name -> google.protobuf.ListValue + 51, // 15: gripql.GraphStatement.out_e_null:type_name -> google.protobuf.ListValue 7, // 16: gripql.GraphStatement.range:type_name -> gripql.Range 20, // 17: gripql.GraphStatement.has:type_name -> gripql.HasExpression - 50, // 18: gripql.GraphStatement.has_label:type_name -> google.protobuf.ListValue - 50, // 19: gripql.GraphStatement.has_key:type_name -> google.protobuf.ListValue - 50, // 20: gripql.GraphStatement.has_id:type_name -> google.protobuf.ListValue - 50, // 21: gripql.GraphStatement.distinct:type_name -> google.protobuf.ListValue + 51, // 18: gripql.GraphStatement.has_label:type_name -> google.protobuf.ListValue + 51, // 19: gripql.GraphStatement.has_key:type_name -> google.protobuf.ListValue + 51, // 20: gripql.GraphStatement.has_id:type_name -> google.protobuf.ListValue + 51, // 21: gripql.GraphStatement.distinct:type_name -> google.protobuf.ListValue 17, // 22: gripql.GraphStatement.pivot:type_name -> gripql.PivotStep - 50, // 23: gripql.GraphStatement.fields:type_name -> google.protobuf.ListValue + 51, // 23: gripql.GraphStatement.fields:type_name -> google.protobuf.ListValue 9, // 24: gripql.GraphStatement.aggregate:type_name -> gripql.Aggregations - 51, // 25: gripql.GraphStatement.render:type_name -> google.protobuf.Value - 50, // 26: gripql.GraphStatement.path:type_name -> google.protobuf.ListValue + 52, // 25: gripql.GraphStatement.render:type_name -> google.protobuf.Value + 51, // 26: gripql.GraphStatement.path:type_name -> google.protobuf.ListValue 22, // 27: gripql.GraphStatement.jump:type_name -> gripql.Jump 23, // 28: gripql.GraphStatement.set:type_name -> gripql.Set 24, // 29: gripql.GraphStatement.increment:type_name -> gripql.Increment @@ -4077,102 +4133,105 @@ var file_gripql_proto_depIdxs = []int32{ 14, // 35: gripql.Aggregate.field:type_name -> gripql.FieldAggregation 15, // 36: gripql.Aggregate.type:type_name -> gripql.TypeAggregation 16, // 37: gripql.Aggregate.count:type_name -> gripql.CountAggregation - 51, // 38: gripql.NamedAggregationResult.key:type_name -> google.protobuf.Value + 52, // 38: gripql.NamedAggregationResult.key:type_name -> google.protobuf.Value 20, // 39: gripql.HasExpressionList.expressions:type_name -> gripql.HasExpression 19, // 40: gripql.HasExpression.and:type_name -> gripql.HasExpressionList 19, // 41: gripql.HasExpression.or:type_name -> gripql.HasExpressionList 20, // 42: gripql.HasExpression.not:type_name -> gripql.HasExpression 21, // 43: gripql.HasExpression.condition:type_name -> gripql.HasCondition - 51, // 44: gripql.HasCondition.value:type_name -> google.protobuf.Value + 52, // 44: gripql.HasCondition.value:type_name -> google.protobuf.Value 0, // 45: gripql.HasCondition.condition:type_name -> gripql.Condition 20, // 46: gripql.Jump.expression:type_name -> gripql.HasExpression - 51, // 47: gripql.Set.value:type_name -> google.protobuf.Value - 52, // 48: gripql.Vertex.data:type_name -> google.protobuf.Struct - 52, // 49: gripql.Edge.data:type_name -> google.protobuf.Struct + 52, // 47: gripql.Set.value:type_name -> google.protobuf.Value + 53, // 48: gripql.Vertex.data:type_name -> google.protobuf.Struct + 53, // 49: gripql.Edge.data:type_name -> google.protobuf.Struct 25, // 50: gripql.QueryResult.vertex:type_name -> gripql.Vertex 26, // 51: gripql.QueryResult.edge:type_name -> gripql.Edge 18, // 52: gripql.QueryResult.aggregations:type_name -> gripql.NamedAggregationResult - 51, // 53: gripql.QueryResult.render:type_name -> google.protobuf.Value - 50, // 54: gripql.QueryResult.path:type_name -> google.protobuf.ListValue + 52, // 53: gripql.QueryResult.render:type_name -> google.protobuf.Value + 51, // 54: gripql.QueryResult.path:type_name -> google.protobuf.ListValue 6, // 55: gripql.ExtendQuery.query:type_name -> gripql.GraphStatement 1, // 56: gripql.JobStatus.state:type_name -> gripql.JobState 6, // 57: gripql.JobStatus.query:type_name -> gripql.GraphStatement 25, // 58: gripql.GraphElement.vertex:type_name -> gripql.Vertex 26, // 59: gripql.GraphElement.edge:type_name -> gripql.Edge 36, // 60: gripql.ListIndicesResponse.indices:type_name -> gripql.IndexID - 48, // 61: gripql.TableInfo.link_map:type_name -> gripql.TableInfo.LinkMapEntry - 49, // 62: gripql.PluginConfig.config:type_name -> gripql.PluginConfig.ConfigEntry - 4, // 63: gripql.Query.Traversal:input_type -> gripql.GraphQuery - 35, // 64: gripql.Query.GetVertex:input_type -> gripql.ElementID - 35, // 65: gripql.Query.GetEdge:input_type -> gripql.ElementID - 34, // 66: gripql.Query.GetTimestamp:input_type -> gripql.GraphID - 34, // 67: gripql.Query.GetSchema:input_type -> gripql.GraphID - 34, // 68: gripql.Query.GetMapping:input_type -> gripql.GraphID - 38, // 69: gripql.Query.ListGraphs:input_type -> gripql.Empty - 34, // 70: gripql.Query.ListIndices:input_type -> gripql.GraphID - 34, // 71: gripql.Query.ListLabels:input_type -> gripql.GraphID - 38, // 72: gripql.Query.ListTables:input_type -> gripql.Empty - 4, // 73: gripql.Job.Submit:input_type -> gripql.GraphQuery - 34, // 74: gripql.Job.ListJobs:input_type -> gripql.GraphID - 4, // 75: gripql.Job.SearchJobs:input_type -> gripql.GraphQuery - 28, // 76: gripql.Job.DeleteJob:input_type -> gripql.QueryJob - 28, // 77: gripql.Job.GetJob:input_type -> gripql.QueryJob - 28, // 78: gripql.Job.ViewJob:input_type -> gripql.QueryJob - 29, // 79: gripql.Job.ResumeJob:input_type -> gripql.ExtendQuery - 33, // 80: gripql.Edit.AddVertex:input_type -> gripql.GraphElement - 33, // 81: gripql.Edit.AddEdge:input_type -> gripql.GraphElement - 33, // 82: gripql.Edit.BulkAdd:input_type -> gripql.GraphElement - 34, // 83: gripql.Edit.AddGraph:input_type -> gripql.GraphID - 34, // 84: gripql.Edit.DeleteGraph:input_type -> gripql.GraphID - 43, // 85: gripql.Edit.BulkDelete:input_type -> gripql.DeleteData - 35, // 86: gripql.Edit.DeleteVertex:input_type -> gripql.ElementID - 35, // 87: gripql.Edit.DeleteEdge:input_type -> gripql.ElementID - 36, // 88: gripql.Edit.AddIndex:input_type -> gripql.IndexID - 36, // 89: gripql.Edit.DeleteIndex:input_type -> gripql.IndexID - 3, // 90: gripql.Edit.AddSchema:input_type -> gripql.Graph - 34, // 91: gripql.Edit.SampleSchema:input_type -> gripql.GraphID - 3, // 92: gripql.Edit.AddMapping:input_type -> gripql.Graph - 44, // 93: gripql.Configure.StartPlugin:input_type -> gripql.PluginConfig - 38, // 94: gripql.Configure.ListPlugins:input_type -> gripql.Empty - 38, // 95: gripql.Configure.ListDrivers:input_type -> gripql.Empty - 27, // 96: gripql.Query.Traversal:output_type -> gripql.QueryResult - 25, // 97: gripql.Query.GetVertex:output_type -> gripql.Vertex - 26, // 98: gripql.Query.GetEdge:output_type -> gripql.Edge - 37, // 99: gripql.Query.GetTimestamp:output_type -> gripql.Timestamp - 3, // 100: gripql.Query.GetSchema:output_type -> gripql.Graph - 3, // 101: gripql.Query.GetMapping:output_type -> gripql.Graph - 39, // 102: gripql.Query.ListGraphs:output_type -> gripql.ListGraphsResponse - 40, // 103: gripql.Query.ListIndices:output_type -> gripql.ListIndicesResponse - 41, // 104: gripql.Query.ListLabels:output_type -> gripql.ListLabelsResponse - 42, // 105: gripql.Query.ListTables:output_type -> gripql.TableInfo - 28, // 106: gripql.Job.Submit:output_type -> gripql.QueryJob - 28, // 107: gripql.Job.ListJobs:output_type -> gripql.QueryJob - 30, // 108: gripql.Job.SearchJobs:output_type -> gripql.JobStatus - 30, // 109: gripql.Job.DeleteJob:output_type -> gripql.JobStatus - 30, // 110: gripql.Job.GetJob:output_type -> gripql.JobStatus - 27, // 111: gripql.Job.ViewJob:output_type -> gripql.QueryResult - 27, // 112: gripql.Job.ResumeJob:output_type -> gripql.QueryResult - 31, // 113: gripql.Edit.AddVertex:output_type -> gripql.EditResult - 31, // 114: gripql.Edit.AddEdge:output_type -> gripql.EditResult - 32, // 115: gripql.Edit.BulkAdd:output_type -> gripql.BulkEditResult - 31, // 116: gripql.Edit.AddGraph:output_type -> gripql.EditResult - 31, // 117: gripql.Edit.DeleteGraph:output_type -> gripql.EditResult - 31, // 118: gripql.Edit.BulkDelete:output_type -> gripql.EditResult - 31, // 119: gripql.Edit.DeleteVertex:output_type -> gripql.EditResult - 31, // 120: gripql.Edit.DeleteEdge:output_type -> gripql.EditResult - 31, // 121: gripql.Edit.AddIndex:output_type -> gripql.EditResult - 31, // 122: gripql.Edit.DeleteIndex:output_type -> gripql.EditResult - 31, // 123: gripql.Edit.AddSchema:output_type -> gripql.EditResult - 3, // 124: gripql.Edit.SampleSchema:output_type -> gripql.Graph - 31, // 125: gripql.Edit.AddMapping:output_type -> gripql.EditResult - 45, // 126: gripql.Configure.StartPlugin:output_type -> gripql.PluginStatus - 47, // 127: gripql.Configure.ListPlugins:output_type -> gripql.ListPluginsResponse - 46, // 128: gripql.Configure.ListDrivers:output_type -> gripql.ListDriversResponse - 96, // [96:129] is the sub-list for method output_type - 63, // [63:96] is the sub-list for method input_type - 63, // [63:63] is the sub-list for extension type_name - 63, // [63:63] is the sub-list for extension extendee - 0, // [0:63] is the sub-list for field type_name + 49, // 61: gripql.TableInfo.link_map:type_name -> gripql.TableInfo.LinkMapEntry + 53, // 62: gripql.RawJson.data:type_name -> google.protobuf.Struct + 50, // 63: gripql.PluginConfig.config:type_name -> gripql.PluginConfig.ConfigEntry + 4, // 64: gripql.Query.Traversal:input_type -> gripql.GraphQuery + 35, // 65: gripql.Query.GetVertex:input_type -> gripql.ElementID + 35, // 66: gripql.Query.GetEdge:input_type -> gripql.ElementID + 34, // 67: gripql.Query.GetTimestamp:input_type -> gripql.GraphID + 34, // 68: gripql.Query.GetSchema:input_type -> gripql.GraphID + 34, // 69: gripql.Query.GetMapping:input_type -> gripql.GraphID + 38, // 70: gripql.Query.ListGraphs:input_type -> gripql.Empty + 34, // 71: gripql.Query.ListIndices:input_type -> gripql.GraphID + 34, // 72: gripql.Query.ListLabels:input_type -> gripql.GraphID + 38, // 73: gripql.Query.ListTables:input_type -> gripql.Empty + 4, // 74: gripql.Job.Submit:input_type -> gripql.GraphQuery + 34, // 75: gripql.Job.ListJobs:input_type -> gripql.GraphID + 4, // 76: gripql.Job.SearchJobs:input_type -> gripql.GraphQuery + 28, // 77: gripql.Job.DeleteJob:input_type -> gripql.QueryJob + 28, // 78: gripql.Job.GetJob:input_type -> gripql.QueryJob + 28, // 79: gripql.Job.ViewJob:input_type -> gripql.QueryJob + 29, // 80: gripql.Job.ResumeJob:input_type -> gripql.ExtendQuery + 33, // 81: gripql.Edit.AddVertex:input_type -> gripql.GraphElement + 33, // 82: gripql.Edit.AddEdge:input_type -> gripql.GraphElement + 33, // 83: gripql.Edit.BulkAdd:input_type -> gripql.GraphElement + 44, // 84: gripql.Edit.BulkAddRaw:input_type -> gripql.RawJson + 34, // 85: gripql.Edit.AddGraph:input_type -> gripql.GraphID + 34, // 86: gripql.Edit.DeleteGraph:input_type -> gripql.GraphID + 43, // 87: gripql.Edit.BulkDelete:input_type -> gripql.DeleteData + 35, // 88: gripql.Edit.DeleteVertex:input_type -> gripql.ElementID + 35, // 89: gripql.Edit.DeleteEdge:input_type -> gripql.ElementID + 36, // 90: gripql.Edit.AddIndex:input_type -> gripql.IndexID + 36, // 91: gripql.Edit.DeleteIndex:input_type -> gripql.IndexID + 3, // 92: gripql.Edit.AddSchema:input_type -> gripql.Graph + 34, // 93: gripql.Edit.SampleSchema:input_type -> gripql.GraphID + 3, // 94: gripql.Edit.AddMapping:input_type -> gripql.Graph + 45, // 95: gripql.Configure.StartPlugin:input_type -> gripql.PluginConfig + 38, // 96: gripql.Configure.ListPlugins:input_type -> gripql.Empty + 38, // 97: gripql.Configure.ListDrivers:input_type -> gripql.Empty + 27, // 98: gripql.Query.Traversal:output_type -> gripql.QueryResult + 25, // 99: gripql.Query.GetVertex:output_type -> gripql.Vertex + 26, // 100: gripql.Query.GetEdge:output_type -> gripql.Edge + 37, // 101: gripql.Query.GetTimestamp:output_type -> gripql.Timestamp + 3, // 102: gripql.Query.GetSchema:output_type -> gripql.Graph + 3, // 103: gripql.Query.GetMapping:output_type -> gripql.Graph + 39, // 104: gripql.Query.ListGraphs:output_type -> gripql.ListGraphsResponse + 40, // 105: gripql.Query.ListIndices:output_type -> gripql.ListIndicesResponse + 41, // 106: gripql.Query.ListLabels:output_type -> gripql.ListLabelsResponse + 42, // 107: gripql.Query.ListTables:output_type -> gripql.TableInfo + 28, // 108: gripql.Job.Submit:output_type -> gripql.QueryJob + 28, // 109: gripql.Job.ListJobs:output_type -> gripql.QueryJob + 30, // 110: gripql.Job.SearchJobs:output_type -> gripql.JobStatus + 30, // 111: gripql.Job.DeleteJob:output_type -> gripql.JobStatus + 30, // 112: gripql.Job.GetJob:output_type -> gripql.JobStatus + 27, // 113: gripql.Job.ViewJob:output_type -> gripql.QueryResult + 27, // 114: gripql.Job.ResumeJob:output_type -> gripql.QueryResult + 31, // 115: gripql.Edit.AddVertex:output_type -> gripql.EditResult + 31, // 116: gripql.Edit.AddEdge:output_type -> gripql.EditResult + 32, // 117: gripql.Edit.BulkAdd:output_type -> gripql.BulkEditResult + 32, // 118: gripql.Edit.BulkAddRaw:output_type -> gripql.BulkEditResult + 31, // 119: gripql.Edit.AddGraph:output_type -> gripql.EditResult + 31, // 120: gripql.Edit.DeleteGraph:output_type -> gripql.EditResult + 31, // 121: gripql.Edit.BulkDelete:output_type -> gripql.EditResult + 31, // 122: gripql.Edit.DeleteVertex:output_type -> gripql.EditResult + 31, // 123: gripql.Edit.DeleteEdge:output_type -> gripql.EditResult + 31, // 124: gripql.Edit.AddIndex:output_type -> gripql.EditResult + 31, // 125: gripql.Edit.DeleteIndex:output_type -> gripql.EditResult + 31, // 126: gripql.Edit.AddSchema:output_type -> gripql.EditResult + 3, // 127: gripql.Edit.SampleSchema:output_type -> gripql.Graph + 31, // 128: gripql.Edit.AddMapping:output_type -> gripql.EditResult + 46, // 129: gripql.Configure.StartPlugin:output_type -> gripql.PluginStatus + 48, // 130: gripql.Configure.ListPlugins:output_type -> gripql.ListPluginsResponse + 47, // 131: gripql.Configure.ListDrivers:output_type -> gripql.ListDriversResponse + 98, // [98:132] is the sub-list for method output_type + 64, // [64:98] is the sub-list for method input_type + 64, // [64:64] is the sub-list for extension type_name + 64, // [64:64] is the sub-list for extension extendee + 0, // [0:64] is the sub-list for field type_name } func init() { file_gripql_proto_init() } @@ -4674,7 +4733,7 @@ func file_gripql_proto_init() { } } file_gripql_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*PluginConfig); i { + switch v := v.(*RawJson); i { case 0: return &v.state case 1: @@ -4686,7 +4745,7 @@ func file_gripql_proto_init() { } } file_gripql_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*PluginStatus); i { + switch v := v.(*PluginConfig); i { case 0: return &v.state case 1: @@ -4698,7 +4757,7 @@ func file_gripql_proto_init() { } } file_gripql_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*ListDriversResponse); i { + switch v := v.(*PluginStatus); i { case 0: return &v.state case 1: @@ -4710,6 +4769,18 @@ func file_gripql_proto_init() { } } file_gripql_proto_msgTypes[44].Exporter = func(v any, i int) any { + switch v := v.(*ListDriversResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gripql_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*ListPluginsResponse); i { case 0: return &v.state @@ -4785,7 +4856,7 @@ func file_gripql_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gripql_proto_rawDesc, NumEnums: 3, - NumMessages: 47, + NumMessages: 48, NumExtensions: 0, NumServices: 4, }, diff --git a/gripql/gripql.pb.gw.go b/gripql/gripql.pb.gw.go index 74aa9dde..ff2547f2 100644 --- a/gripql/gripql.pb.gw.go +++ b/gripql/gripql.pb.gw.go @@ -1070,6 +1070,50 @@ func request_Edit_BulkAdd_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func request_Edit_BulkAddRaw_0(ctx context.Context, marshaler runtime.Marshaler, client EditClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var metadata runtime.ServerMetadata + stream, err := client.BulkAddRaw(ctx) + if err != nil { + grpclog.Errorf("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + for { + var protoReq RawJson + err = dec.Decode(&protoReq) + if err == io.EOF { + break + } + if err != nil { + grpclog.Errorf("Failed to decode request: %v", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err = stream.Send(&protoReq); err != nil { + if err == io.EOF { + break + } + grpclog.Errorf("Failed to send request: %v", err) + return nil, metadata, err + } + } + + if err := stream.CloseSend(); err != nil { + grpclog.Errorf("Failed to terminate client stream: %v", err) + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + grpclog.Errorf("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + + msg, err := stream.CloseAndRecv() + metadata.TrailerMD = stream.Trailer() + return msg, metadata, err + +} + func request_Edit_AddGraph_0(ctx context.Context, marshaler runtime.Marshaler, client EditClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq GraphID var metadata runtime.ServerMetadata @@ -2185,6 +2229,13 @@ func RegisterEditHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve return }) + mux.Handle("POST", pattern_Edit_BulkAddRaw_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + mux.Handle("POST", pattern_Edit_AddGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3159,6 +3210,28 @@ func RegisterEditHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien }) + mux.Handle("POST", pattern_Edit_BulkAddRaw_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, "/gripql.Edit/BulkAddRaw", runtime.WithHTTPPathPattern("/v1/rawJson")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Edit_BulkAddRaw_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Edit_BulkAddRaw_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Edit_AddGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3389,6 +3462,8 @@ var ( pattern_Edit_BulkAdd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "graph"}, "")) + pattern_Edit_BulkAddRaw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "rawJson"}, "")) + pattern_Edit_AddGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 1}, []string{"v1", "graph"}, "")) pattern_Edit_DeleteGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 1}, []string{"v1", "graph"}, "")) @@ -3417,6 +3492,8 @@ var ( forward_Edit_BulkAdd_0 = runtime.ForwardResponseMessage + forward_Edit_BulkAddRaw_0 = runtime.ForwardResponseMessage + forward_Edit_AddGraph_0 = runtime.ForwardResponseMessage forward_Edit_DeleteGraph_0 = runtime.ForwardResponseMessage diff --git a/gripql/gripql.proto b/gripql/gripql.proto index 7845e162..0f7390bb 100644 --- a/gripql/gripql.proto +++ b/gripql/gripql.proto @@ -307,6 +307,10 @@ message DeleteData { repeated string edges = 3; } +message RawJson { + google.protobuf.Struct data = 1; +} + service Query { rpc Traversal(GraphQuery) returns (stream QueryResult) { option (google.api.http) = { @@ -440,6 +444,12 @@ service Edit { }; } + rpc BulkAddRaw (stream RawJson) returns (BulkEditResult) { + option (google.api.http) = { + post: "/v1/rawJson" + }; + } + rpc AddGraph(GraphID) returns (EditResult) { option (google.api.http) = { post: "/v1/graph/{graph}" diff --git a/gripql/gripql_grpc.pb.go b/gripql/gripql_grpc.pb.go index ef146e6e..edad35cd 100644 --- a/gripql/gripql_grpc.pb.go +++ b/gripql/gripql_grpc.pb.go @@ -938,6 +938,7 @@ const ( Edit_AddVertex_FullMethodName = "/gripql.Edit/AddVertex" Edit_AddEdge_FullMethodName = "/gripql.Edit/AddEdge" Edit_BulkAdd_FullMethodName = "/gripql.Edit/BulkAdd" + Edit_BulkAddRaw_FullMethodName = "/gripql.Edit/BulkAddRaw" Edit_AddGraph_FullMethodName = "/gripql.Edit/AddGraph" Edit_DeleteGraph_FullMethodName = "/gripql.Edit/DeleteGraph" Edit_BulkDelete_FullMethodName = "/gripql.Edit/BulkDelete" @@ -957,6 +958,7 @@ type EditClient interface { AddVertex(ctx context.Context, in *GraphElement, opts ...grpc.CallOption) (*EditResult, error) AddEdge(ctx context.Context, in *GraphElement, opts ...grpc.CallOption) (*EditResult, error) BulkAdd(ctx context.Context, opts ...grpc.CallOption) (Edit_BulkAddClient, error) + BulkAddRaw(ctx context.Context, opts ...grpc.CallOption) (Edit_BulkAddRawClient, error) AddGraph(ctx context.Context, in *GraphID, opts ...grpc.CallOption) (*EditResult, error) DeleteGraph(ctx context.Context, in *GraphID, opts ...grpc.CallOption) (*EditResult, error) BulkDelete(ctx context.Context, in *DeleteData, opts ...grpc.CallOption) (*EditResult, error) @@ -1032,6 +1034,41 @@ func (x *editBulkAddClient) CloseAndRecv() (*BulkEditResult, error) { return m, nil } +func (c *editClient) BulkAddRaw(ctx context.Context, opts ...grpc.CallOption) (Edit_BulkAddRawClient, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Edit_ServiceDesc.Streams[1], Edit_BulkAddRaw_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &editBulkAddRawClient{ClientStream: stream} + return x, nil +} + +type Edit_BulkAddRawClient interface { + Send(*RawJson) error + CloseAndRecv() (*BulkEditResult, error) + grpc.ClientStream +} + +type editBulkAddRawClient struct { + grpc.ClientStream +} + +func (x *editBulkAddRawClient) Send(m *RawJson) error { + return x.ClientStream.SendMsg(m) +} + +func (x *editBulkAddRawClient) CloseAndRecv() (*BulkEditResult, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(BulkEditResult) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *editClient) AddGraph(ctx context.Context, in *GraphID, opts ...grpc.CallOption) (*EditResult, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EditResult) @@ -1139,6 +1176,7 @@ type EditServer interface { AddVertex(context.Context, *GraphElement) (*EditResult, error) AddEdge(context.Context, *GraphElement) (*EditResult, error) BulkAdd(Edit_BulkAddServer) error + BulkAddRaw(Edit_BulkAddRawServer) error AddGraph(context.Context, *GraphID) (*EditResult, error) DeleteGraph(context.Context, *GraphID) (*EditResult, error) BulkDelete(context.Context, *DeleteData) (*EditResult, error) @@ -1165,6 +1203,9 @@ func (UnimplementedEditServer) AddEdge(context.Context, *GraphElement) (*EditRes func (UnimplementedEditServer) BulkAdd(Edit_BulkAddServer) error { return status.Errorf(codes.Unimplemented, "method BulkAdd not implemented") } +func (UnimplementedEditServer) BulkAddRaw(Edit_BulkAddRawServer) error { + return status.Errorf(codes.Unimplemented, "method BulkAddRaw not implemented") +} func (UnimplementedEditServer) AddGraph(context.Context, *GraphID) (*EditResult, error) { return nil, status.Errorf(codes.Unimplemented, "method AddGraph not implemented") } @@ -1270,6 +1311,32 @@ func (x *editBulkAddServer) Recv() (*GraphElement, error) { return m, nil } +func _Edit_BulkAddRaw_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(EditServer).BulkAddRaw(&editBulkAddRawServer{ServerStream: stream}) +} + +type Edit_BulkAddRawServer interface { + SendAndClose(*BulkEditResult) error + Recv() (*RawJson, error) + grpc.ServerStream +} + +type editBulkAddRawServer struct { + grpc.ServerStream +} + +func (x *editBulkAddRawServer) SendAndClose(m *BulkEditResult) error { + return x.ServerStream.SendMsg(m) +} + +func (x *editBulkAddRawServer) Recv() (*RawJson, error) { + m := new(RawJson) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func _Edit_AddGraph_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GraphID) if err := dec(in); err != nil { @@ -1512,6 +1579,11 @@ var Edit_ServiceDesc = grpc.ServiceDesc{ Handler: _Edit_BulkAdd_Handler, ClientStreams: true, }, + { + StreamName: "BulkAddRaw", + Handler: _Edit_BulkAddRaw_Handler, + ClientStreams: true, + }, }, Metadata: "gripql.proto", } diff --git a/server/api.go b/server/api.go index 758d26a7..66ccdec7 100644 --- a/server/api.go +++ b/server/api.go @@ -218,6 +218,64 @@ func (server *GripServer) addEdge(ctx context.Context, elem *gripql.GraphElement return &gripql.EditResult{Id: edge.Gid}, nil } +func (server *GripServer) BulkAddRaw(stream gripql.Edit_BulkAddRawServer) error { + var insertCount int32 + var errorCount int32 + elementStream := make(chan *gripql.RawJson, 100) + wg := &sync.WaitGroup{} + + /* sch, err := server.GetSchema(context.Background(), &gripql.GraphID{Graph: "CALIPER__schema__"}) + if err != nil { + return err + } + schcompiler := jsonschema.NewCompiler() + schcompiler.ExtractAnnotations = true + schcompiler.RegisterExtension(compile.GraphExtensionTag, compile.GraphExtMeta, compile.GraphExtCompiler{}) + //out := graph.GraphSchema{Classes: map[string]*jsonschema.Schema{}, Compiler: schcompiler} + + for _, v := range sch.Vertices { + mapped_data := v.Data.String() + log.Info("MAPPED DATA: ", mapped_data) + _, err := json.Marshal(mapped_data) + if err != nil { + log.Errorf("Error marshaling schema: %v", err) + } + + log.Infoln("HELLO : ", mapped_data) + vertexData, ok := mapped_data["vertex"].(map[string]any) + if !ok { + return fmt.Errorf("ERR") + } + if err := schcompiler.AddResourceJSON(vertexData["data"].(map[string]any)["id"].(string), schemaJSON); err == nil { + if sch.Title != "" { + out.Classes[sch.Title] = sch + } else { + log.Infof("Title not found: %s %#v\n", f, sch) + } + } + + }*/ + + for { + _, err := stream.Recv() + //log.Info("ROW: ", row) + if err == io.EOF { + break + } + + //class := graph.GetClass("Observation") + if err != nil { + log.WithFields(log.Fields{"error": err}).Error("BulkAdd: streaming error") + errorCount++ + break + } + } + close(elementStream) + wg.Wait() + return stream.SendAndClose(&gripql.BulkEditResult{InsertCount: insertCount, ErrorCount: errorCount}) + +} + // BulkAdd a stream of inputs and loads them into the graph func (server *GripServer) BulkAdd(stream gripql.Edit_BulkAddServer) error { var graphName string diff --git a/util/file_reader.go b/util/file_reader.go index 820c136f..9c8698b2 100644 --- a/util/file_reader.go +++ b/util/file_reader.go @@ -4,6 +4,7 @@ import ( "bufio" "compress/gzip" "context" + "encoding/json" "fmt" "io" "net/url" @@ -18,6 +19,7 @@ import ( "github.com/minio/minio-go/v7/pkg/credentials" "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/structpb" ) func getS3Client(u *url.URL) (*minio.Client, error) { @@ -113,6 +115,51 @@ func StreamLines(file string, chanSize int) (chan string, error) { return lineChan, nil } +func StreamRawJsonFromFile(file string, workers int) (chan *gripql.RawJson, error) { + if workers < 1 { + workers = 1 + } + if workers > 99 { + workers = 99 + } + lineChan, err := StreamLines(file, workers) + if err != nil { + return nil, err + } + jsonChan := make(chan *gripql.RawJson, workers) + var wg sync.WaitGroup + //jum := protojson.UnmarshalOptions{DiscardUnknown: true} + + for i := 0; i < workers; i++ { + wg.Add(1) + go func() { + for line := range lineChan { + rawData := &gripql.RawJson{} + var tempData map[string]any + err := json.Unmarshal([]byte(line), &tempData) + if err != nil { + log.WithFields(log.Fields{"error": err}).Errorf("Unmarshaling vertex: %s", line) + return + } + + structData, err := structpb.NewStruct(tempData) + if err != nil { + log.WithFields(log.Fields{"error": err}).Errorf("Converting to structpb.Struct: %s", line) + return + } + rawData.Data = structData + jsonChan <- rawData + } + wg.Done() + }() + } + go func() { + wg.Wait() + close(jsonChan) + }() + return jsonChan, nil +} + // StreamVerticesFromFile reads a file containing a vertex per line and // streams *gripql.Vertex objects out on a channel func StreamVerticesFromFile(file string, workers int) (chan *gripql.Vertex, error) {