diff --git a/README.md b/README.md index d04be96..06d37e7 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,15 @@ ![Goproxy.cn](https://goproxy.cn/stats/github.com/hduhelp/api_open_sdk/badges/download-count.svg) ![buf lint](https://github.com/hduhelp/api_open_sdk/actions/workflows/buf.yml/badge.svg) +### 配置网络 + +https://goproxy.cn/ + + + ## 前置步骤 -#### linux +### linux ```shell //安装 编译所需的插件 @@ -14,10 +20,22 @@ make install-tools ``` -#### windows +### windows 如果使用goland,建议安装插件:buf、Protocol Buffers Support,以消除proto无法识别到的报警。 +以下操作,开发前或开发后执行皆可 + +``` +go get github.com/bufbuild/buf/cmd/buf@latest +go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest +go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest +go get google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest +go get google.golang.org/protobuf/cmd/protoc-gen-go@latest +``` + +然后刷新一下。 + ``` go mod tidy buf generate @@ -25,9 +43,7 @@ buf generate -### 配置网络 -https://goproxy.cn/ ## 依赖 @@ -40,6 +56,8 @@ https://goproxy.cn/ 2. 运行 `buf generate` 3. 开启 swagger-ui 实时预览 + + ## 预览 swagger 效果 (多数情况下没必要预览) (感觉还有更简单的) ### 公开文档 @@ -71,8 +89,6 @@ http://localhost:8080/campusapis/staff/v1/freshman.swagger.json 4. 每次改动 proto 后需要重新运行 `buf generate`,并且「清空缓存并进行硬刷新」网页 -## Code Lint - ## 接口注释 diff --git a/campusapis/staff/v1/campus.pb.go b/campusapis/staff/v1/campus.pb.go index b5fb991..81adb38 100644 --- a/campusapis/staff/v1/campus.pb.go +++ b/campusapis/staff/v1/campus.pb.go @@ -3915,6 +3915,239 @@ func (x *FreshmanRoommate) GetPhone() string { return "" } +// 请求消息,添加年级筛选条件 +type GetStudentCountByDivisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Grade []string `protobuf:"bytes,1,rep,name=grade,proto3" json:"grade,omitempty"` // 年级:如 2022 +} + +func (x *GetStudentCountByDivisionRequest) Reset() { + *x = GetStudentCountByDivisionRequest{} + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetStudentCountByDivisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStudentCountByDivisionRequest) ProtoMessage() {} + +func (x *GetStudentCountByDivisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[50] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStudentCountByDivisionRequest.ProtoReflect.Descriptor instead. +func (*GetStudentCountByDivisionRequest) Descriptor() ([]byte, []int) { + return file_campusapis_staff_v1_campus_proto_rawDescGZIP(), []int{50} +} + +func (x *GetStudentCountByDivisionRequest) GetGrade() []string { + if x != nil { + return x.Grade + } + return nil +} + +// 定义响应消息 +type GetStudentCountByDivisionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Error int32 `protobuf:"varint,1,opt,name=error,proto3" json:"error,omitempty"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` + // 学院信息列表 + Data []*CollegeInfo `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty"` +} + +func (x *GetStudentCountByDivisionResponse) Reset() { + *x = GetStudentCountByDivisionResponse{} + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetStudentCountByDivisionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStudentCountByDivisionResponse) ProtoMessage() {} + +func (x *GetStudentCountByDivisionResponse) ProtoReflect() protoreflect.Message { + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[51] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStudentCountByDivisionResponse.ProtoReflect.Descriptor instead. +func (*GetStudentCountByDivisionResponse) Descriptor() ([]byte, []int) { + return file_campusapis_staff_v1_campus_proto_rawDescGZIP(), []int{51} +} + +func (x *GetStudentCountByDivisionResponse) GetError() int32 { + if x != nil { + return x.Error + } + return 0 +} + +func (x *GetStudentCountByDivisionResponse) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *GetStudentCountByDivisionResponse) GetData() []*CollegeInfo { + if x != nil { + return x.Data + } + return nil +} + +type CollegeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // 学院代码 + UnitCode string `protobuf:"bytes,1,opt,name=unitCode,proto3" json:"unitCode,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // 学院名称 + Majors []*MajorInfo `protobuf:"bytes,3,rep,name=majors,proto3" json:"majors,omitempty"` +} + +func (x *CollegeInfo) Reset() { + *x = CollegeInfo{} + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CollegeInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollegeInfo) ProtoMessage() {} + +func (x *CollegeInfo) ProtoReflect() protoreflect.Message { + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[52] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CollegeInfo.ProtoReflect.Descriptor instead. +func (*CollegeInfo) Descriptor() ([]byte, []int) { + return file_campusapis_staff_v1_campus_proto_rawDescGZIP(), []int{52} +} + +func (x *CollegeInfo) GetUnitCode() string { + if x != nil { + return x.UnitCode + } + return "" +} + +func (x *CollegeInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollegeInfo) GetMajors() []*MajorInfo { + if x != nil { + return x.Majors + } + return nil +} + +type MajorInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // 学生专业编号 + MajorId string `protobuf:"bytes,1,opt,name=majorId,proto3" json:"majorId,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // 专业名称 + Count int32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` // 学生人数 +} + +func (x *MajorInfo) Reset() { + *x = MajorInfo{} + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MajorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MajorInfo) ProtoMessage() {} + +func (x *MajorInfo) ProtoReflect() protoreflect.Message { + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[53] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MajorInfo.ProtoReflect.Descriptor instead. +func (*MajorInfo) Descriptor() ([]byte, []int) { + return file_campusapis_staff_v1_campus_proto_rawDescGZIP(), []int{53} +} + +func (x *MajorInfo) GetMajorId() string { + if x != nil { + return x.MajorId + } + return "" +} + +func (x *MajorInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MajorInfo) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + // 某年贫困详情 type StudentNeedyInfo_Nested struct { state protoimpl.MessageState @@ -3929,7 +4162,7 @@ type StudentNeedyInfo_Nested struct { func (x *StudentNeedyInfo_Nested) Reset() { *x = StudentNeedyInfo_Nested{} - mi := &file_campusapis_staff_v1_campus_proto_msgTypes[50] + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3941,7 +4174,7 @@ func (x *StudentNeedyInfo_Nested) String() string { func (*StudentNeedyInfo_Nested) ProtoMessage() {} func (x *StudentNeedyInfo_Nested) ProtoReflect() protoreflect.Message { - mi := &file_campusapis_staff_v1_campus_proto_msgTypes[50] + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3982,7 +4215,7 @@ type PostStudentGateAccessResponse_Data struct { func (x *PostStudentGateAccessResponse_Data) Reset() { *x = PostStudentGateAccessResponse_Data{} - mi := &file_campusapis_staff_v1_campus_proto_msgTypes[51] + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3994,7 +4227,7 @@ func (x *PostStudentGateAccessResponse_Data) String() string { func (*PostStudentGateAccessResponse_Data) ProtoMessage() {} func (x *PostStudentGateAccessResponse_Data) ProtoReflect() protoreflect.Message { - mi := &file_campusapis_staff_v1_campus_proto_msgTypes[51] + mi := &file_campusapis_staff_v1_campus_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4560,205 +4793,241 @@ var file_campusapis_staff_v1_campus_proto_rawDesc = []byte{ 0x52, 0x09, 0x73, 0x74, 0x61, 0x66, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x71, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x71, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, - 0x65, 0x32, 0x86, 0x17, 0x0a, 0x0d, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2a, 0x2e, - 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x27, 0x5a, 0x0e, 0x12, 0x0c, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2f, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0x15, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, - 0x73, 0x6f, 0x6e, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x86, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x65, 0x22, 0x38, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x79, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x21, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x42, + 0x79, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, + 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x75, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, + 0x0a, 0x06, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, + 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, + 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x73, 0x22, 0x4f, 0x0a, 0x09, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xc6, 0x18, 0x0a, 0x0d, 0x43, 0x61, 0x6d, 0x70, + 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, - 0x64, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x5a, 0x0f, 0x12, 0x0d, 0x2f, 0x73, 0x74, 0x75, - 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2f, 0x73, 0x74, 0x61, 0x66, - 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0xb6, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, - 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x52, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, - 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x52, - 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x5a, 0x1b, 0x12, 0x19, 0x2f, 0x73, 0x74, - 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x52, 0x6f, 0x6c, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, - 0x52, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x72, 0x6d, 0x49, 0x6e, 0x66, + 0x70, 0x74, 0x79, 0x1a, 0x2a, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x5a, 0x0e, 0x12, 0x0c, 0x2f, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x15, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, + 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x86, + 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6d, 0x70, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x6f, 0x72, 0x6d, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x29, 0x5a, 0x0f, 0x12, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, - 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, - 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f, 0x72, 0x6d, 0x12, 0x9e, 0x01, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, - 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x33, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x5a, 0x0f, + 0x12, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, + 0x16, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, + 0x6e, 0x74, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0xbd, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x79, 0x44, 0x69, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x79, 0x44, 0x69, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x63, + 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x42, 0x79, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, 0x12, 0x0e, + 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x17, + 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, + 0x74, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xb6, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x52, 0x6f, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, - 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, - 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x5a, 0x13, 0x12, 0x11, 0x2f, + 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, + 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x52, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x5a, + 0x1b, 0x12, 0x19, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x68, 0x6f, + 0x6f, 0x6c, 0x52, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2f, 0x73, + 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, + 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x52, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x8e, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x44, + 0x6f, 0x72, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x2f, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x44, 0x6f, 0x72, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x5a, 0x0f, 0x12, 0x0d, 0x2f, 0x73, 0x74, 0x75, + 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x2f, 0x73, 0x74, 0x61, 0x66, + 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x6f, 0x72, + 0x6d, 0x12, 0x9e, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x33, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x31, 0x5a, 0x13, 0x12, 0x11, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x69, + 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x12, 0x1a, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, + 0x61, 0x79, 0x12, 0xb9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, + 0x74, 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, 0x49, 0x6e, 0x12, 0x31, 0x2e, 0x63, + 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x72, + 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x32, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x14, 0x12, 0x12, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, - 0x12, 0x1a, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, - 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x12, 0xb9, 0x01, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x72, 0x74, 0x68, - 0x64, 0x61, 0x79, 0x73, 0x49, 0x6e, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, - 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6d, 0x70, - 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x42, 0x69, 0x72, 0x74, 0x68, 0x64, - 0x61, 0x79, 0x73, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x14, 0x12, 0x12, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, - 0x74, 0x2f, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, 0x12, 0x1b, 0x2f, 0x73, 0x74, - 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x62, - 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, 0x12, 0xa7, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2d, - 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, - 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x5a, 0x11, 0x12, 0x0f, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, - 0x74, 0x2f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x18, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, - 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x12, 0xc2, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, + 0x73, 0x12, 0x1b, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, + 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, 0x12, 0xa7, + 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x75, 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, + 0x64, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x5a, 0x11, 0x12, 0x0f, 0x2f, + 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x18, + 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, + 0x74, 0x2f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0xc2, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, + 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x37, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, + 0x5a, 0x11, 0x12, 0x0f, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x12, 0x18, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, + 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x9f, 0x01, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, + 0x65, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6d, 0x70, + 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, + 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, + 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, 0x12, 0x0e, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x2f, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x17, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, + 0xae, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x75, + 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x72, 0x73, 0x65, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x5a, 0x11, 0x12, 0x0f, 0x2f, 0x73, - 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x18, 0x2f, - 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, - 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x12, 0x2b, 0x2e, 0x63, 0x61, - 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, + 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x47, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, + 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x75, 0x64, + 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x45, + 0x78, 0x61, 0x6d, 0x12, 0x2a, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, + 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, + 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x45, 0x78, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x29, 0x5a, 0x0f, 0x12, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, + 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x12, 0x16, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, + 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x12, 0x9e, 0x01, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x12, 0x28, + 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, + 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, - 0x12, 0x0e, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x12, 0x17, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, - 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0xae, 0x01, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, - 0x61, 0x64, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, - 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x28, 0x12, 0x26, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x73, 0x74, 0x61, - 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2f, 0x73, 0x74, 0x75, - 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x12, 0x2a, 0x2e, - 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6d, 0x70, - 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x5a, 0x0f, - 0x12, 0x0d, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x12, - 0x16, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, - 0x6e, 0x74, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x12, 0x9e, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x44, - 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, + 0x65, 0x74, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x14, 0x12, 0x12, 0x2f, + 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, + 0x6d, 0x12, 0x1b, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, + 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x12, 0x82, + 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x50, 0x41, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2a, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x69, 0x6c, - 0x79, 0x45, 0x78, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x14, 0x12, 0x12, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, - 0x74, 0x2f, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x12, 0x1b, 0x2f, 0x73, 0x74, - 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x64, - 0x61, 0x69, 0x6c, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x50, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x2a, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, - 0x65, 0x6e, 0x74, 0x47, 0x50, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x5a, 0x0e, 0x12, 0x0c, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, - 0x6e, 0x74, 0x2f, 0x67, 0x70, 0x61, 0x12, 0x15, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, - 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x70, 0x61, 0x12, 0x80, 0x01, - 0x0a, 0x15, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x74, - 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, - 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, - 0x73, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6d, - 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x74, 0x65, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0xa8, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x79, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, - 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x79, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x37, 0x5a, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, - 0x2f, 0x68, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x79, 0x53, 0x74, 0x61, 0x79, 0x12, 0x1d, 0x2f, 0x73, + 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, 0x50, 0x41, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x5a, 0x0e, 0x12, 0x0c, + 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x70, 0x61, 0x12, 0x15, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, - 0x68, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x79, 0x53, 0x74, 0x61, 0x79, 0x12, 0xab, 0x01, 0x0a, 0x13, + 0x67, 0x70, 0x61, 0x12, 0x80, 0x01, 0x0a, 0x15, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x74, 0x75, 0x64, + 0x65, 0x6e, 0x74, 0x47, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x31, 0x2e, + 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x47, + 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, + 0x6e, 0x74, 0x47, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa8, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x79, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x35, 0x2e, 0x63, 0x61, + 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x79, + 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x5a, 0x16, 0x12, 0x14, 0x2f, 0x73, + 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x68, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x79, 0x53, 0x74, + 0x61, 0x79, 0x12, 0x1d, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, + 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x68, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x79, 0x53, 0x74, 0x61, + 0x79, 0x12, 0xab, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, + 0x6e, 0x42, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6d, 0x70, + 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x42, 0x61, 0x73, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, - 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x42, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, - 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x42, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, - 0x12, 0x0e, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x17, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x12, 0xa5, 0x01, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, - 0x2d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, - 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, - 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, - 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, - 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, 0x12, 0x0e, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x6d, 0x61, 0x6e, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, - 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0xb6, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, - 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6d, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, - 0x6d, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x63, - 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x52, 0x6f, - 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x14, 0x12, 0x12, 0x2f, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2f, - 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, - 0x6e, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x42, 0xd1, 0x01, 0x0a, 0x17, 0x63, - 0x6f, 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, - 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x68, 0x64, 0x75, 0x68, 0x65, 0x6c, 0x70, 0x2f, 0x61, 0x70, 0x69, 0x5f, 0x6f, 0x70, - 0x65, 0x6e, 0x5f, 0x73, 0x64, 0x6b, 0x2f, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, - 0x73, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x66, 0x66, - 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x13, 0x43, 0x61, 0x6d, 0x70, 0x75, - 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x56, 0x31, 0xca, 0x02, - 0x13, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x66, - 0x66, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1f, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, - 0x73, 0x5c, 0x53, 0x74, 0x61, 0x66, 0x66, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, - 0x70, 0x69, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x66, 0x66, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x42, 0x61, 0x73, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, 0x12, 0x0e, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, + 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, + 0x31, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x12, + 0xa5, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, + 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x5a, 0x10, 0x12, 0x0e, + 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x17, + 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, + 0x61, 0x6e, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0xb6, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, 0x68, 0x6d, + 0x61, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, + 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x65, 0x73, + 0x68, 0x6d, 0x61, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x5a, 0x14, 0x12, + 0x12, 0x2f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x6d, + 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, 0x2f, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x6d, 0x61, 0x6e, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x6d, 0x61, 0x74, 0x65, + 0x42, 0xd1, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, + 0x70, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x61, + 0x6d, 0x70, 0x75, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x64, 0x75, 0x68, 0x65, 0x6c, 0x70, 0x2f, + 0x61, 0x70, 0x69, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x64, 0x6b, 0x2f, 0x63, 0x61, 0x6d, + 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x66, 0x66, 0x2f, 0x76, 0x31, + 0x3b, 0x73, 0x74, 0x61, 0x66, 0x66, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, + 0x13, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x66, + 0x66, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, + 0x73, 0x5c, 0x53, 0x74, 0x61, 0x66, 0x66, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1f, 0x43, 0x61, 0x6d, + 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x66, 0x66, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15, 0x43, + 0x61, 0x6d, 0x70, 0x75, 0x73, 0x61, 0x70, 0x69, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x66, 0x66, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4773,7 +5042,7 @@ func file_campusapis_staff_v1_campus_proto_rawDescGZIP() []byte { return file_campusapis_staff_v1_campus_proto_rawDescData } -var file_campusapis_staff_v1_campus_proto_msgTypes = make([]protoimpl.MessageInfo, 52) +var file_campusapis_staff_v1_campus_proto_msgTypes = make([]protoimpl.MessageInfo, 56) var file_campusapis_staff_v1_campus_proto_goTypes = []any{ (*GetPersonInfoResponse)(nil), // 0: campusapis.staff.v1.GetPersonInfoResponse (*PersonInfo)(nil), // 1: campusapis.staff.v1.PersonInfo @@ -4825,20 +5094,24 @@ var file_campusapis_staff_v1_campus_proto_goTypes = []any{ (*FreshmanDetail)(nil), // 47: campusapis.staff.v1.FreshmanDetail (*GetFreshmanRoommatesResponse)(nil), // 48: campusapis.staff.v1.GetFreshmanRoommatesResponse (*FreshmanRoommate)(nil), // 49: campusapis.staff.v1.FreshmanRoommate - (*StudentNeedyInfo_Nested)(nil), // 50: campusapis.staff.v1.StudentNeedyInfo.Nested - (*PostStudentGateAccessResponse_Data)(nil), // 51: campusapis.staff.v1.PostStudentGateAccessResponse.Data - (staff.Type)(0), // 52: campusapis.staff.Type - (*emptypb.Empty)(nil), // 53: google.protobuf.Empty + (*GetStudentCountByDivisionRequest)(nil), // 50: campusapis.staff.v1.GetStudentCountByDivisionRequest + (*GetStudentCountByDivisionResponse)(nil), // 51: campusapis.staff.v1.GetStudentCountByDivisionResponse + (*CollegeInfo)(nil), // 52: campusapis.staff.v1.CollegeInfo + (*MajorInfo)(nil), // 53: campusapis.staff.v1.MajorInfo + (*StudentNeedyInfo_Nested)(nil), // 54: campusapis.staff.v1.StudentNeedyInfo.Nested + (*PostStudentGateAccessResponse_Data)(nil), // 55: campusapis.staff.v1.PostStudentGateAccessResponse.Data + (staff.Type)(0), // 56: campusapis.staff.Type + (*emptypb.Empty)(nil), // 57: google.protobuf.Empty } var file_campusapis_staff_v1_campus_proto_depIdxs = []int32{ 1, // 0: campusapis.staff.v1.GetPersonInfoResponse.data:type_name -> campusapis.staff.v1.PersonInfo 10, // 1: campusapis.staff.v1.GetStudentInfoResponse.data:type_name -> campusapis.staff.v1.StudentInfo 12, // 2: campusapis.staff.v1.GetStudentSchoolRollStatusResponse.data:type_name -> campusapis.staff.v1.StudentSchoolRollStatus 14, // 3: campusapis.staff.v1.GetStudentNeedyInfoResponse.data:type_name -> campusapis.staff.v1.StudentNeedyInfo - 50, // 4: campusapis.staff.v1.StudentNeedyInfo.items:type_name -> campusapis.staff.v1.StudentNeedyInfo.Nested + 54, // 4: campusapis.staff.v1.StudentNeedyInfo.items:type_name -> campusapis.staff.v1.StudentNeedyInfo.Nested 16, // 5: campusapis.staff.v1.GetStudentDormInfoResponse.data:type_name -> campusapis.staff.v1.DormInfo 18, // 6: campusapis.staff.v1.GetStudentBirthdayInfoResponse.data:type_name -> campusapis.staff.v1.StudentBirthdayInfo - 52, // 7: campusapis.staff.v1.GetStudentBirthdaysInRequest.type:type_name -> campusapis.staff.Type + 56, // 7: campusapis.staff.v1.GetStudentBirthdaysInRequest.type:type_name -> campusapis.staff.Type 18, // 8: campusapis.staff.v1.GetStudentBirthdaysInResponse.data:type_name -> campusapis.staff.v1.StudentBirthdayInfo 22, // 9: campusapis.staff.v1.GetStudentRewardsResponse.data:type_name -> campusapis.staff.v1.StudentReward 24, // 10: campusapis.staff.v1.GetStudentCourseSelectionsResponse.data:type_name -> campusapis.staff.v1.StudentCourseSelection @@ -4849,52 +5122,56 @@ var file_campusapis_staff_v1_campus_proto_depIdxs = []int32{ 33, // 15: campusapis.staff.v1.GetStudentGPAResponse.data:type_name -> campusapis.staff.v1.StudentGPA 34, // 16: campusapis.staff.v1.StudentGPA.perSemester:type_name -> campusapis.staff.v1.GPAPerSemester 35, // 17: campusapis.staff.v1.StudentGPA.total:type_name -> campusapis.staff.v1.GPATotal - 51, // 18: campusapis.staff.v1.PostStudentGateAccessResponse.data:type_name -> campusapis.staff.v1.PostStudentGateAccessResponse.Data + 55, // 18: campusapis.staff.v1.PostStudentGateAccessResponse.data:type_name -> campusapis.staff.v1.PostStudentGateAccessResponse.Data 39, // 19: campusapis.staff.v1.GetStudentStaySchoolInfoResponse.data:type_name -> campusapis.staff.v1.StudentStaySchoolInfo 45, // 20: campusapis.staff.v1.GetFreshmanBaseInfoResponse.data:type_name -> campusapis.staff.v1.FreshmanBaseInfo 47, // 21: campusapis.staff.v1.GetFreshmanDetailResponse.data:type_name -> campusapis.staff.v1.FreshmanDetail 49, // 22: campusapis.staff.v1.GetFreshmanRoommatesResponse.data:type_name -> campusapis.staff.v1.FreshmanRoommate - 53, // 23: campusapis.staff.v1.CampusService.GetPersonInfo:input_type -> google.protobuf.Empty - 53, // 24: campusapis.staff.v1.CampusService.GetStudentInfo:input_type -> google.protobuf.Empty - 53, // 25: campusapis.staff.v1.CampusService.GetStudentSchoolRollStatus:input_type -> google.protobuf.Empty - 53, // 26: campusapis.staff.v1.CampusService.GetStudentDormInfo:input_type -> google.protobuf.Empty - 53, // 27: campusapis.staff.v1.CampusService.GetStudentBirthdayInfo:input_type -> google.protobuf.Empty - 19, // 28: campusapis.staff.v1.CampusService.GetStudentBirthdaysIn:input_type -> campusapis.staff.v1.GetStudentBirthdaysInRequest - 2, // 29: campusapis.staff.v1.CampusService.GetStudentRewards:input_type -> campusapis.staff.v1.GetStudentRewardsRequest - 3, // 30: campusapis.staff.v1.CampusService.GetStudentCourseSelections:input_type -> campusapis.staff.v1.GetStudentCourseSelectionsRequest - 4, // 31: campusapis.staff.v1.CampusService.GetStudentGrade:input_type -> campusapis.staff.v1.GetStudentGradeRequest - 5, // 32: campusapis.staff.v1.CampusService.GetGlobalStudentGrade:input_type -> campusapis.staff.v1.GetGlobalStudentGradeRequest - 6, // 33: campusapis.staff.v1.CampusService.GetStudentExam:input_type -> campusapis.staff.v1.GetStudentExamRequest - 7, // 34: campusapis.staff.v1.CampusService.GetDailyExam:input_type -> campusapis.staff.v1.GetDailyExamRequest - 53, // 35: campusapis.staff.v1.CampusService.GetStudentGPA:input_type -> google.protobuf.Empty - 36, // 36: campusapis.staff.v1.CampusService.PostStudentGateAccess:input_type -> campusapis.staff.v1.PostStudentGateAccessRequest - 53, // 37: campusapis.staff.v1.CampusService.GetStudentStaySchoolInfo:input_type -> google.protobuf.Empty - 40, // 38: campusapis.staff.v1.CampusService.GetFreshmanBaseInfo:input_type -> campusapis.staff.v1.GetFreshmanBaseInfoRequest - 41, // 39: campusapis.staff.v1.CampusService.GetFreshmanDetail:input_type -> campusapis.staff.v1.GetFreshmanDetailRequest - 42, // 40: campusapis.staff.v1.CampusService.GetFreshmanRoommates:input_type -> campusapis.staff.v1.GetFreshmanRoommatesRequest - 0, // 41: campusapis.staff.v1.CampusService.GetPersonInfo:output_type -> campusapis.staff.v1.GetPersonInfoResponse - 9, // 42: campusapis.staff.v1.CampusService.GetStudentInfo:output_type -> campusapis.staff.v1.GetStudentInfoResponse - 11, // 43: campusapis.staff.v1.CampusService.GetStudentSchoolRollStatus:output_type -> campusapis.staff.v1.GetStudentSchoolRollStatusResponse - 15, // 44: campusapis.staff.v1.CampusService.GetStudentDormInfo:output_type -> campusapis.staff.v1.GetStudentDormInfoResponse - 17, // 45: campusapis.staff.v1.CampusService.GetStudentBirthdayInfo:output_type -> campusapis.staff.v1.GetStudentBirthdayInfoResponse - 20, // 46: campusapis.staff.v1.CampusService.GetStudentBirthdaysIn:output_type -> campusapis.staff.v1.GetStudentBirthdaysInResponse - 21, // 47: campusapis.staff.v1.CampusService.GetStudentRewards:output_type -> campusapis.staff.v1.GetStudentRewardsResponse - 23, // 48: campusapis.staff.v1.CampusService.GetStudentCourseSelections:output_type -> campusapis.staff.v1.GetStudentCourseSelectionsResponse - 25, // 49: campusapis.staff.v1.CampusService.GetStudentGrade:output_type -> campusapis.staff.v1.GetStudentGradeResponse - 27, // 50: campusapis.staff.v1.CampusService.GetGlobalStudentGrade:output_type -> campusapis.staff.v1.GetGlobalStudentGradeResponse - 30, // 51: campusapis.staff.v1.CampusService.GetStudentExam:output_type -> campusapis.staff.v1.GetStudentExamResponse - 28, // 52: campusapis.staff.v1.CampusService.GetDailyExam:output_type -> campusapis.staff.v1.GetDailyExamResponse - 32, // 53: campusapis.staff.v1.CampusService.GetStudentGPA:output_type -> campusapis.staff.v1.GetStudentGPAResponse - 37, // 54: campusapis.staff.v1.CampusService.PostStudentGateAccess:output_type -> campusapis.staff.v1.PostStudentGateAccessResponse - 38, // 55: campusapis.staff.v1.CampusService.GetStudentStaySchoolInfo:output_type -> campusapis.staff.v1.GetStudentStaySchoolInfoResponse - 44, // 56: campusapis.staff.v1.CampusService.GetFreshmanBaseInfo:output_type -> campusapis.staff.v1.GetFreshmanBaseInfoResponse - 46, // 57: campusapis.staff.v1.CampusService.GetFreshmanDetail:output_type -> campusapis.staff.v1.GetFreshmanDetailResponse - 48, // 58: campusapis.staff.v1.CampusService.GetFreshmanRoommates:output_type -> campusapis.staff.v1.GetFreshmanRoommatesResponse - 41, // [41:59] is the sub-list for method output_type - 23, // [23:41] 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 + 52, // 23: campusapis.staff.v1.GetStudentCountByDivisionResponse.data:type_name -> campusapis.staff.v1.CollegeInfo + 53, // 24: campusapis.staff.v1.CollegeInfo.majors:type_name -> campusapis.staff.v1.MajorInfo + 57, // 25: campusapis.staff.v1.CampusService.GetPersonInfo:input_type -> google.protobuf.Empty + 57, // 26: campusapis.staff.v1.CampusService.GetStudentInfo:input_type -> google.protobuf.Empty + 50, // 27: campusapis.staff.v1.CampusService.GetStudentCountByDivision:input_type -> campusapis.staff.v1.GetStudentCountByDivisionRequest + 57, // 28: campusapis.staff.v1.CampusService.GetStudentSchoolRollStatus:input_type -> google.protobuf.Empty + 57, // 29: campusapis.staff.v1.CampusService.GetStudentDormInfo:input_type -> google.protobuf.Empty + 57, // 30: campusapis.staff.v1.CampusService.GetStudentBirthdayInfo:input_type -> google.protobuf.Empty + 19, // 31: campusapis.staff.v1.CampusService.GetStudentBirthdaysIn:input_type -> campusapis.staff.v1.GetStudentBirthdaysInRequest + 2, // 32: campusapis.staff.v1.CampusService.GetStudentRewards:input_type -> campusapis.staff.v1.GetStudentRewardsRequest + 3, // 33: campusapis.staff.v1.CampusService.GetStudentCourseSelections:input_type -> campusapis.staff.v1.GetStudentCourseSelectionsRequest + 4, // 34: campusapis.staff.v1.CampusService.GetStudentGrade:input_type -> campusapis.staff.v1.GetStudentGradeRequest + 5, // 35: campusapis.staff.v1.CampusService.GetGlobalStudentGrade:input_type -> campusapis.staff.v1.GetGlobalStudentGradeRequest + 6, // 36: campusapis.staff.v1.CampusService.GetStudentExam:input_type -> campusapis.staff.v1.GetStudentExamRequest + 7, // 37: campusapis.staff.v1.CampusService.GetDailyExam:input_type -> campusapis.staff.v1.GetDailyExamRequest + 57, // 38: campusapis.staff.v1.CampusService.GetStudentGPA:input_type -> google.protobuf.Empty + 36, // 39: campusapis.staff.v1.CampusService.PostStudentGateAccess:input_type -> campusapis.staff.v1.PostStudentGateAccessRequest + 57, // 40: campusapis.staff.v1.CampusService.GetStudentStaySchoolInfo:input_type -> google.protobuf.Empty + 40, // 41: campusapis.staff.v1.CampusService.GetFreshmanBaseInfo:input_type -> campusapis.staff.v1.GetFreshmanBaseInfoRequest + 41, // 42: campusapis.staff.v1.CampusService.GetFreshmanDetail:input_type -> campusapis.staff.v1.GetFreshmanDetailRequest + 42, // 43: campusapis.staff.v1.CampusService.GetFreshmanRoommates:input_type -> campusapis.staff.v1.GetFreshmanRoommatesRequest + 0, // 44: campusapis.staff.v1.CampusService.GetPersonInfo:output_type -> campusapis.staff.v1.GetPersonInfoResponse + 9, // 45: campusapis.staff.v1.CampusService.GetStudentInfo:output_type -> campusapis.staff.v1.GetStudentInfoResponse + 51, // 46: campusapis.staff.v1.CampusService.GetStudentCountByDivision:output_type -> campusapis.staff.v1.GetStudentCountByDivisionResponse + 11, // 47: campusapis.staff.v1.CampusService.GetStudentSchoolRollStatus:output_type -> campusapis.staff.v1.GetStudentSchoolRollStatusResponse + 15, // 48: campusapis.staff.v1.CampusService.GetStudentDormInfo:output_type -> campusapis.staff.v1.GetStudentDormInfoResponse + 17, // 49: campusapis.staff.v1.CampusService.GetStudentBirthdayInfo:output_type -> campusapis.staff.v1.GetStudentBirthdayInfoResponse + 20, // 50: campusapis.staff.v1.CampusService.GetStudentBirthdaysIn:output_type -> campusapis.staff.v1.GetStudentBirthdaysInResponse + 21, // 51: campusapis.staff.v1.CampusService.GetStudentRewards:output_type -> campusapis.staff.v1.GetStudentRewardsResponse + 23, // 52: campusapis.staff.v1.CampusService.GetStudentCourseSelections:output_type -> campusapis.staff.v1.GetStudentCourseSelectionsResponse + 25, // 53: campusapis.staff.v1.CampusService.GetStudentGrade:output_type -> campusapis.staff.v1.GetStudentGradeResponse + 27, // 54: campusapis.staff.v1.CampusService.GetGlobalStudentGrade:output_type -> campusapis.staff.v1.GetGlobalStudentGradeResponse + 30, // 55: campusapis.staff.v1.CampusService.GetStudentExam:output_type -> campusapis.staff.v1.GetStudentExamResponse + 28, // 56: campusapis.staff.v1.CampusService.GetDailyExam:output_type -> campusapis.staff.v1.GetDailyExamResponse + 32, // 57: campusapis.staff.v1.CampusService.GetStudentGPA:output_type -> campusapis.staff.v1.GetStudentGPAResponse + 37, // 58: campusapis.staff.v1.CampusService.PostStudentGateAccess:output_type -> campusapis.staff.v1.PostStudentGateAccessResponse + 38, // 59: campusapis.staff.v1.CampusService.GetStudentStaySchoolInfo:output_type -> campusapis.staff.v1.GetStudentStaySchoolInfoResponse + 44, // 60: campusapis.staff.v1.CampusService.GetFreshmanBaseInfo:output_type -> campusapis.staff.v1.GetFreshmanBaseInfoResponse + 46, // 61: campusapis.staff.v1.CampusService.GetFreshmanDetail:output_type -> campusapis.staff.v1.GetFreshmanDetailResponse + 48, // 62: campusapis.staff.v1.CampusService.GetFreshmanRoommates:output_type -> campusapis.staff.v1.GetFreshmanRoommatesResponse + 44, // [44:63] is the sub-list for method output_type + 25, // [25:44] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_campusapis_staff_v1_campus_proto_init() } @@ -4908,7 +5185,7 @@ func file_campusapis_staff_v1_campus_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_campusapis_staff_v1_campus_proto_rawDesc, NumEnums: 0, - NumMessages: 52, + NumMessages: 56, NumExtensions: 0, NumServices: 1, }, diff --git a/campusapis/staff/v1/campus.pb.gw.go b/campusapis/staff/v1/campus.pb.gw.go index c6a3533..e2a08ad 100644 --- a/campusapis/staff/v1/campus.pb.gw.go +++ b/campusapis/staff/v1/campus.pb.gw.go @@ -104,6 +104,78 @@ func local_request_CampusService_GetStudentInfo_1(ctx context.Context, marshaler } +var ( + filter_CampusService_GetStudentCountByDivision_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_CampusService_GetStudentCountByDivision_0(ctx context.Context, marshaler runtime.Marshaler, client CampusServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetStudentCountByDivisionRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CampusService_GetStudentCountByDivision_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetStudentCountByDivision(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_CampusService_GetStudentCountByDivision_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetStudentCountByDivisionRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CampusService_GetStudentCountByDivision_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetStudentCountByDivision(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_CampusService_GetStudentCountByDivision_1 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_CampusService_GetStudentCountByDivision_1(ctx context.Context, marshaler runtime.Marshaler, client CampusServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetStudentCountByDivisionRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CampusService_GetStudentCountByDivision_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetStudentCountByDivision(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_CampusService_GetStudentCountByDivision_1(ctx context.Context, marshaler runtime.Marshaler, server CampusServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetStudentCountByDivisionRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CampusService_GetStudentCountByDivision_1); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetStudentCountByDivision(ctx, &protoReq) + return msg, metadata, err + +} + func request_CampusService_GetStudentSchoolRollStatus_0(ctx context.Context, marshaler runtime.Marshaler, client CampusServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq emptypb.Empty var metadata runtime.ServerMetadata @@ -1101,6 +1173,56 @@ func RegisterCampusServiceHandlerServer(ctx context.Context, mux *runtime.ServeM }) + mux.Handle("GET", pattern_CampusService_GetStudentCountByDivision_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, "/campusapis.staff.v1.CampusService/GetStudentCountByDivision", runtime.WithHTTPPathPattern("/staff/v1/student/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_CampusService_GetStudentCountByDivision_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_CampusService_GetStudentCountByDivision_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_CampusService_GetStudentCountByDivision_1, 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, "/campusapis.staff.v1.CampusService/GetStudentCountByDivision", runtime.WithHTTPPathPattern("/student/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_CampusService_GetStudentCountByDivision_1(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_CampusService_GetStudentCountByDivision_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_CampusService_GetStudentSchoolRollStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1980,6 +2102,50 @@ func RegisterCampusServiceHandlerClient(ctx context.Context, mux *runtime.ServeM }) + mux.Handle("GET", pattern_CampusService_GetStudentCountByDivision_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, "/campusapis.staff.v1.CampusService/GetStudentCountByDivision", runtime.WithHTTPPathPattern("/staff/v1/student/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_CampusService_GetStudentCountByDivision_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_CampusService_GetStudentCountByDivision_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_CampusService_GetStudentCountByDivision_1, 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, "/campusapis.staff.v1.CampusService/GetStudentCountByDivision", runtime.WithHTTPPathPattern("/student/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_CampusService_GetStudentCountByDivision_1(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_CampusService_GetStudentCountByDivision_1(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_CampusService_GetStudentSchoolRollStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2652,6 +2818,10 @@ var ( pattern_CampusService_GetStudentInfo_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"student", "info"}, "")) + pattern_CampusService_GetStudentCountByDivision_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"staff", "v1", "student", "count"}, "")) + + pattern_CampusService_GetStudentCountByDivision_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"student", "count"}, "")) + pattern_CampusService_GetStudentSchoolRollStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"staff", "v1", "student", "schoolRollStatus"}, "")) pattern_CampusService_GetStudentSchoolRollStatus_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"student", "schoolRollStatus"}, "")) @@ -2722,6 +2892,10 @@ var ( forward_CampusService_GetStudentInfo_1 = runtime.ForwardResponseMessage + forward_CampusService_GetStudentCountByDivision_0 = runtime.ForwardResponseMessage + + forward_CampusService_GetStudentCountByDivision_1 = runtime.ForwardResponseMessage + forward_CampusService_GetStudentSchoolRollStatus_0 = runtime.ForwardResponseMessage forward_CampusService_GetStudentSchoolRollStatus_1 = runtime.ForwardResponseMessage diff --git a/campusapis/staff/v1/campus.proto b/campusapis/staff/v1/campus.proto index 8f8f0af..fc06696 100644 --- a/campusapis/staff/v1/campus.proto +++ b/campusapis/staff/v1/campus.proto @@ -39,12 +39,15 @@ service CampusService { // }; // } // -// // 获取每个学院和专业的学生人数,按年级过滤 -// rpc GetStudentCountByDivision(GetStudentCountRequest) returns (GetStudentCountByDivisionResponse) { -// option (google.api.http) = { -// get: "/staff/v1/student/count/by-division" -// }; -// } + // 获取每个学院和专业的学生人数,按年级过滤 + rpc GetStudentCountByDivision(GetStudentCountByDivisionRequest) returns (GetStudentCountByDivisionResponse) { + option (google.api.http) = { + get: "/staff/v1/student/count" + additional_bindings{ + get: "/student/count" + } + }; + } //获取学生学籍状态 @@ -818,29 +821,29 @@ message FreshmanRoommate { string phone = 3; } -//todo -//// 请求消息,添加年级筛选条件 -//message GetStudentCountRequest { -// repeated string grade = 1; // 年级:如 2022 -//} -// -//// 定义响应消息 -//message GetStudentCountByDivisionResponse { -// int32 error = 1; -// string msg = 2; -// // 学院信息列表 -// repeated CollegeInfo data = 3; -//} -// -//message CollegeInfo { -// //学院代码 -// string unitCode = 1; -// string name = 2; // 学院名称 -// repeated MajorInfo majors = 3; -//} -// -//message MajorInfo { -// //学院代码 -// string name = 1; // 专业名称 -// int32 count = 2; // 学生人数 -//} \ No newline at end of file +// 请求消息,添加年级筛选条件 +message GetStudentCountByDivisionRequest { + repeated string grade = 1; // 年级:如 2022 +} + +// 定义响应消息 +message GetStudentCountByDivisionResponse { + int32 error = 1; + string msg = 2; + // 学院信息列表 + repeated CollegeInfo data = 3; +} + +message CollegeInfo { + //学院代码 + string unitCode = 1; + string name = 2; // 学院名称 + repeated MajorInfo majors = 3; +} + +message MajorInfo { + //学生专业编号 + string majorId = 1; + string name = 2; // 专业名称 + int32 count = 3; // 学生人数 +} \ No newline at end of file diff --git a/campusapis/staff/v1/campus_grpc.pb.go b/campusapis/staff/v1/campus_grpc.pb.go index 4b9a75c..78f7d97 100644 --- a/campusapis/staff/v1/campus_grpc.pb.go +++ b/campusapis/staff/v1/campus_grpc.pb.go @@ -22,6 +22,7 @@ const _ = grpc.SupportPackageIsVersion9 const ( CampusService_GetPersonInfo_FullMethodName = "/campusapis.staff.v1.CampusService/GetPersonInfo" CampusService_GetStudentInfo_FullMethodName = "/campusapis.staff.v1.CampusService/GetStudentInfo" + CampusService_GetStudentCountByDivision_FullMethodName = "/campusapis.staff.v1.CampusService/GetStudentCountByDivision" CampusService_GetStudentSchoolRollStatus_FullMethodName = "/campusapis.staff.v1.CampusService/GetStudentSchoolRollStatus" CampusService_GetStudentDormInfo_FullMethodName = "/campusapis.staff.v1.CampusService/GetStudentDormInfo" CampusService_GetStudentBirthdayInfo_FullMethodName = "/campusapis.staff.v1.CampusService/GetStudentBirthdayInfo" @@ -50,6 +51,17 @@ type CampusServiceClient interface { GetPersonInfo(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetPersonInfoResponse, error) // 获取学生基本信息 GetStudentInfo(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetStudentInfoResponse, error) + // todo: 未实现 + // + // //获取全体学生基本信息 + // rpc GetAllStudentInfo(google.protobuf.Empty) returns (GetAllStudentInfoResponse) { + // option (google.api.http) = { + // get: "/staff/v1/all/student/info" + // }; + // } + // + // 获取每个学院和专业的学生人数,按年级过滤 + GetStudentCountByDivision(ctx context.Context, in *GetStudentCountByDivisionRequest, opts ...grpc.CallOption) (*GetStudentCountByDivisionResponse, error) // 获取学生学籍状态 GetStudentSchoolRollStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetStudentSchoolRollStatusResponse, error) // 迁移至校外部分 @@ -123,6 +135,16 @@ func (c *campusServiceClient) GetStudentInfo(ctx context.Context, in *emptypb.Em return out, nil } +func (c *campusServiceClient) GetStudentCountByDivision(ctx context.Context, in *GetStudentCountByDivisionRequest, opts ...grpc.CallOption) (*GetStudentCountByDivisionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetStudentCountByDivisionResponse) + err := c.cc.Invoke(ctx, CampusService_GetStudentCountByDivision_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *campusServiceClient) GetStudentSchoolRollStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetStudentSchoolRollStatusResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetStudentSchoolRollStatusResponse) @@ -293,6 +315,17 @@ type CampusServiceServer interface { GetPersonInfo(context.Context, *emptypb.Empty) (*GetPersonInfoResponse, error) // 获取学生基本信息 GetStudentInfo(context.Context, *emptypb.Empty) (*GetStudentInfoResponse, error) + // todo: 未实现 + // + // //获取全体学生基本信息 + // rpc GetAllStudentInfo(google.protobuf.Empty) returns (GetAllStudentInfoResponse) { + // option (google.api.http) = { + // get: "/staff/v1/all/student/info" + // }; + // } + // + // 获取每个学院和专业的学生人数,按年级过滤 + GetStudentCountByDivision(context.Context, *GetStudentCountByDivisionRequest) (*GetStudentCountByDivisionResponse, error) // 获取学生学籍状态 GetStudentSchoolRollStatus(context.Context, *emptypb.Empty) (*GetStudentSchoolRollStatusResponse, error) // 迁移至校外部分 @@ -352,6 +385,9 @@ func (UnimplementedCampusServiceServer) GetPersonInfo(context.Context, *emptypb. func (UnimplementedCampusServiceServer) GetStudentInfo(context.Context, *emptypb.Empty) (*GetStudentInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetStudentInfo not implemented") } +func (UnimplementedCampusServiceServer) GetStudentCountByDivision(context.Context, *GetStudentCountByDivisionRequest) (*GetStudentCountByDivisionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetStudentCountByDivision not implemented") +} func (UnimplementedCampusServiceServer) GetStudentSchoolRollStatus(context.Context, *emptypb.Empty) (*GetStudentSchoolRollStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetStudentSchoolRollStatus not implemented") } @@ -457,6 +493,24 @@ func _CampusService_GetStudentInfo_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _CampusService_GetStudentCountByDivision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStudentCountByDivisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CampusServiceServer).GetStudentCountByDivision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: CampusService_GetStudentCountByDivision_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CampusServiceServer).GetStudentCountByDivision(ctx, req.(*GetStudentCountByDivisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _CampusService_GetStudentSchoolRollStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(emptypb.Empty) if err := dec(in); err != nil { @@ -760,6 +814,10 @@ var CampusService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetStudentInfo", Handler: _CampusService_GetStudentInfo_Handler, }, + { + MethodName: "GetStudentCountByDivision", + Handler: _CampusService_GetStudentCountByDivision_Handler, + }, { MethodName: "GetStudentSchoolRollStatus", Handler: _CampusService_GetStudentSchoolRollStatus_Handler, diff --git a/docs/swagger/campusapis/staff/v1/campus.swagger.json b/docs/swagger/campusapis/staff/v1/campus.swagger.json index 5066dd5..66f634f 100644 --- a/docs/swagger/campusapis/staff/v1/campus.swagger.json +++ b/docs/swagger/campusapis/staff/v1/campus.swagger.json @@ -471,6 +471,43 @@ ] } }, + "/staff/v1/student/count": { + "get": { + "summary": "todo: 未实现\n //获取全体学生基本信息\n rpc GetAllStudentInfo(google.protobuf.Empty) returns (GetAllStudentInfoResponse) {\n option (google.api.http) = {\n get: \"/staff/v1/all/student/info\"\n };\n }", + "description": "获取每个学院和专业的学生人数,按年级过滤", + "operationId": "CampusService_GetStudentCountByDivision", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetStudentCountByDivisionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "grade", + "description": "年级:如 2022", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "tags": [ + "CampusService" + ] + } + }, "/staff/v1/student/dailyExam": { "get": { "summary": "获取某一天的考试信息", @@ -852,6 +889,43 @@ ] } }, + "/student/count": { + "get": { + "summary": "todo: 未实现\n //获取全体学生基本信息\n rpc GetAllStudentInfo(google.protobuf.Empty) returns (GetAllStudentInfoResponse) {\n option (google.api.http) = {\n get: \"/staff/v1/all/student/info\"\n };\n }", + "description": "获取每个学院和专业的学生人数,按年级过滤", + "operationId": "CampusService_GetStudentCountByDivision2", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetStudentCountByDivisionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "grade", + "description": "年级:如 2022", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "tags": [ + "CampusService" + ] + } + }, "/student/dailyExam": { "get": { "summary": "获取某一天的考试信息", @@ -1210,6 +1284,26 @@ } } }, + "v1CollegeInfo": { + "type": "object", + "properties": { + "unitCode": { + "type": "string", + "title": "学院代码" + }, + "name": { + "type": "string", + "title": "学院名称" + }, + "majors": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1MajorInfo" + } + } + } + }, "v1DormInfo": { "type": "object", "properties": { @@ -1552,6 +1646,27 @@ }, "title": "GetStudentBirthdaysInResponse 查询某天生日所有人员-返回体" }, + "v1GetStudentCountByDivisionResponse": { + "type": "object", + "properties": { + "error": { + "type": "integer", + "format": "int32" + }, + "msg": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1CollegeInfo" + }, + "title": "学院信息列表" + } + }, + "title": "定义响应消息" + }, "v1GetStudentCourseSelectionsResponse": { "type": "object", "properties": { @@ -1751,6 +1866,24 @@ }, "title": "成绩详情" }, + "v1MajorInfo": { + "type": "object", + "properties": { + "majorId": { + "type": "string", + "title": "学生专业编号" + }, + "name": { + "type": "string", + "title": "专业名称" + }, + "count": { + "type": "integer", + "format": "int32", + "title": "学生人数" + } + } + }, "v1PersonInfo": { "type": "object", "properties": {