feature: support query record list

This commit is contained in:
pg
2025-02-16 22:37:19 +08:00
committed by pggiroro
parent a2dcb8a3ef
commit 34c4e9a18d
11 changed files with 1257 additions and 321 deletions
+86
View File
@@ -942,3 +942,89 @@ func (gb *GB28181ProPlugin) ListPlatforms(ctx context.Context, req *pb.ListPlatf
resp.Message = "success"
return resp, nil
}
// QueryRecord 实现录像查询接口
func (gb *GB28181ProPlugin) QueryRecord(ctx context.Context, req *pb.QueryRecordRequest) (*pb.QueryRecordResponse, error) {
resp := &pb.QueryRecordResponse{
Code: 0,
Message: "",
}
// 获取设备和通道
device, ok := gb.devices.Get(req.DeviceId)
if !ok {
resp.Code = 404
resp.Message = "device not found"
return resp, nil
}
channel, ok := device.channels.Get(req.ChannelId)
if !ok {
resp.Code = 404
resp.Message = "channel not found"
return resp, nil
}
// 生成随机序列号
sn := int(time.Now().UnixNano() / 1e6 % 1000000)
// 发送录像查询请求
promise, err := gb.RecordInfoQuery(req.DeviceId, req.ChannelId, req.Start, req.End, sn)
if err != nil {
resp.Code = 500
resp.Message = err.Error()
return resp, nil
}
// 等待响应
err = promise.Await()
if err != nil {
resp.Code = 500
resp.Message = fmt.Sprintf("query failed: %v", err)
return resp, nil
}
// 获取录像请求
recordReq, ok := channel.RecordReqs.Get(sn)
if !ok {
resp.Code = 500
resp.Message = "record request not found"
return resp, nil
}
// 转换结果
if len(recordReq.Response) > 0 {
firstResponse := recordReq.Response[0]
resp.DeviceId = req.DeviceId
resp.ChannelId = req.ChannelId
resp.Name = firstResponse.Name
resp.Count = int32(recordReq.ReceivedNum)
if !firstResponse.LastTime.IsZero() {
resp.LastTime = timestamppb.New(firstResponse.LastTime)
}
}
for _, record := range recordReq.Response {
for _, item := range record.RecordList.Item {
resp.Records = append(resp.Records, &pb.RecordItem{
DeviceId: item.DeviceID,
Name: item.Name,
FilePath: item.FilePath,
Address: item.Address,
StartTime: item.StartTime,
EndTime: item.EndTime,
Secrecy: int32(item.Secrecy),
Type: item.Type,
RecorderId: item.RecorderID,
})
}
}
resp.Code = 0
resp.Message = fmt.Sprintf("success, received %d/%d records", recordReq.ReceivedNum, recordReq.SumNum)
// 清理请求
channel.RecordReqs.Remove(recordReq)
return resp, nil
}
+11 -2
View File
@@ -11,8 +11,9 @@ import (
)
type RecordRequest struct {
SN, SumNum int
Response []gb28181.Record
SN, SumNum int
ReceivedNum int // 已接收的记录数
Response []gb28181.Message
*util.Promise
}
@@ -20,6 +21,14 @@ func (r *RecordRequest) GetKey() int {
return r.SN
}
// AddResponse 添加响应并检查是否完成
func (r *RecordRequest) AddResponse(msg gb28181.Message) bool {
r.Response = append(r.Response, msg)
r.ReceivedNum += msg.RecordList.Num
// 当接收到的记录数等于总数时,表示接收完成
return r.ReceivedNum >= msg.SumNum
}
type Channel struct {
Device *Device // 所属设备
State atomic.Int32 // 通道状态,0:空闲,1:正在invite,2:正在播放/对讲
+7 -4
View File
@@ -5,6 +5,8 @@ import (
"strings"
"time"
"m7s.live/v5"
"github.com/emiago/sipgo"
"github.com/emiago/sipgo/sip"
"m7s.live/v5/pkg/task"
@@ -129,8 +131,10 @@ func (d *Device) onMessage(req *sip.Request, tx sip.ServerTransaction, msg *gb28
case "RecordInfo":
if channel, ok := d.channels.Get(msg.DeviceID); ok {
if req, ok := channel.RecordReqs.Get(msg.SN); ok {
req.Response = msg.RecordList
req.Resolve()
// 添加响应并检查是否完成
if req.AddResponse(*msg) {
req.Resolve()
}
}
}
case "DeviceInfo":
@@ -239,8 +243,7 @@ func (d *Device) CreateRequest(Method sip.RequestMethod) *sip.Request {
req := sip.NewRequest(Method, d.Recipient)
req.AppendHeader(&d.fromHDR)
contentType := sip.ContentTypeHeader("Application/MANSCDP+xml")
//req.AppendHeader(sip.NewHeader("User-Agent", "M7S/"+m7s.Version))
req.AppendHeader(sip.NewHeader("User-Agent", "asdf"))
req.AppendHeader(sip.NewHeader("User-Agent", "M7S/"+m7s.Version))
req.AppendHeader(&contentType)
req.AppendHeader(&d.contactHDR)
return req
+648 -297
View File
@@ -3187,6 +3187,298 @@ func (x *PlatformsPageInfo) GetList() []*Platform {
return nil
}
type QueryRecordRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"`
ChannelId string `protobuf:"bytes,2,opt,name=channelId,proto3" json:"channelId,omitempty"`
Start string `protobuf:"bytes,3,opt,name=start,proto3" json:"start,omitempty"`
End string `protobuf:"bytes,4,opt,name=end,proto3" json:"end,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *QueryRecordRequest) Reset() {
*x = QueryRecordRequest{}
mi := &file_gb28181_proto_msgTypes[44]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *QueryRecordRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*QueryRecordRequest) ProtoMessage() {}
func (x *QueryRecordRequest) ProtoReflect() protoreflect.Message {
mi := &file_gb28181_proto_msgTypes[44]
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 QueryRecordRequest.ProtoReflect.Descriptor instead.
func (*QueryRecordRequest) Descriptor() ([]byte, []int) {
return file_gb28181_proto_rawDescGZIP(), []int{44}
}
func (x *QueryRecordRequest) GetDeviceId() string {
if x != nil {
return x.DeviceId
}
return ""
}
func (x *QueryRecordRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
func (x *QueryRecordRequest) GetStart() string {
if x != nil {
return x.Start
}
return ""
}
func (x *QueryRecordRequest) GetEnd() string {
if x != nil {
return x.End
}
return ""
}
type QueryRecordResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
Records []*RecordItem `protobuf:"bytes,3,rep,name=records,proto3" json:"records,omitempty"`
DeviceId string `protobuf:"bytes,4,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
ChannelId string `protobuf:"bytes,5,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
Sn string `protobuf:"bytes,6,opt,name=sn,proto3" json:"sn,omitempty"`
Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"`
SumNum int32 `protobuf:"varint,8,opt,name=sum_num,json=sumNum,proto3" json:"sum_num,omitempty"`
Count int32 `protobuf:"varint,9,opt,name=count,proto3" json:"count,omitempty"`
LastTime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=last_time,json=lastTime,proto3" json:"last_time,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *QueryRecordResponse) Reset() {
*x = QueryRecordResponse{}
mi := &file_gb28181_proto_msgTypes[45]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *QueryRecordResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*QueryRecordResponse) ProtoMessage() {}
func (x *QueryRecordResponse) ProtoReflect() protoreflect.Message {
mi := &file_gb28181_proto_msgTypes[45]
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 QueryRecordResponse.ProtoReflect.Descriptor instead.
func (*QueryRecordResponse) Descriptor() ([]byte, []int) {
return file_gb28181_proto_rawDescGZIP(), []int{45}
}
func (x *QueryRecordResponse) GetCode() int32 {
if x != nil {
return x.Code
}
return 0
}
func (x *QueryRecordResponse) GetMessage() string {
if x != nil {
return x.Message
}
return ""
}
func (x *QueryRecordResponse) GetRecords() []*RecordItem {
if x != nil {
return x.Records
}
return nil
}
func (x *QueryRecordResponse) GetDeviceId() string {
if x != nil {
return x.DeviceId
}
return ""
}
func (x *QueryRecordResponse) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
func (x *QueryRecordResponse) GetSn() string {
if x != nil {
return x.Sn
}
return ""
}
func (x *QueryRecordResponse) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *QueryRecordResponse) GetSumNum() int32 {
if x != nil {
return x.SumNum
}
return 0
}
func (x *QueryRecordResponse) GetCount() int32 {
if x != nil {
return x.Count
}
return 0
}
func (x *QueryRecordResponse) GetLastTime() *timestamppb.Timestamp {
if x != nil {
return x.LastTime
}
return nil
}
type RecordItem struct {
state protoimpl.MessageState `protogen:"open.v1"`
DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
FilePath string `protobuf:"bytes,3,opt,name=filePath,proto3" json:"filePath,omitempty"`
Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"`
StartTime string `protobuf:"bytes,5,opt,name=startTime,proto3" json:"startTime,omitempty"`
EndTime string `protobuf:"bytes,6,opt,name=endTime,proto3" json:"endTime,omitempty"`
Secrecy int32 `protobuf:"varint,7,opt,name=secrecy,proto3" json:"secrecy,omitempty"`
Type string `protobuf:"bytes,8,opt,name=type,proto3" json:"type,omitempty"`
RecorderId string `protobuf:"bytes,9,opt,name=recorderId,proto3" json:"recorderId,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *RecordItem) Reset() {
*x = RecordItem{}
mi := &file_gb28181_proto_msgTypes[46]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *RecordItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RecordItem) ProtoMessage() {}
func (x *RecordItem) ProtoReflect() protoreflect.Message {
mi := &file_gb28181_proto_msgTypes[46]
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 RecordItem.ProtoReflect.Descriptor instead.
func (*RecordItem) Descriptor() ([]byte, []int) {
return file_gb28181_proto_rawDescGZIP(), []int{46}
}
func (x *RecordItem) GetDeviceId() string {
if x != nil {
return x.DeviceId
}
return ""
}
func (x *RecordItem) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *RecordItem) GetFilePath() string {
if x != nil {
return x.FilePath
}
return ""
}
func (x *RecordItem) GetAddress() string {
if x != nil {
return x.Address
}
return ""
}
func (x *RecordItem) GetStartTime() string {
if x != nil {
return x.StartTime
}
return ""
}
func (x *RecordItem) GetEndTime() string {
if x != nil {
return x.EndTime
}
return ""
}
func (x *RecordItem) GetSecrecy() int32 {
if x != nil {
return x.Secrecy
}
return 0
}
func (x *RecordItem) GetType() string {
if x != nil {
return x.Type
}
return ""
}
func (x *RecordItem) GetRecorderId() string {
if x != nil {
return x.RecorderId
}
return ""
}
var File_gb28181_proto protoreflect.FileDescriptor
var file_gb28181_proto_rawDesc = string([]byte{
@@ -3609,234 +3901,286 @@ var file_gb28181_proto_rawDesc = string([]byte{
0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74,
0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x04, 0x6c, 0x69,
0x73, 0x74, 0x32, 0x84, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, 0x53, 0x0a, 0x04, 0x4c, 0x69,
0x73, 0x74, 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, 0x18, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x4c, 0x69, 0x73, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12,
0x6e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f,
0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12,
0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1d, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x16, 0x12, 0x14, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x7d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x68,
0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52,
0x73, 0x74, 0x22, 0x76, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x72,
0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18,
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xbd, 0x02, 0x0a, 0x13, 0x51,
0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
0x12, 0x30, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x52,
0x65, 0x63, 0x6f, 0x72, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72,
0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12,
0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20,
0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x0e,
0x0a, 0x02, 0x73, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x73, 0x6e, 0x12, 0x12,
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x08, 0x20,
0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x75, 0x6d, 0x4e, 0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf8, 0x01, 0x0a, 0x0a, 0x52,
0x65, 0x63, 0x6f, 0x72, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c,
0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,
0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01,
0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a,
0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65,
0x63, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x63,
0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x65,
0x72, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x6f, 0x72,
0x64, 0x65, 0x72, 0x49, 0x64, 0x32, 0x8e, 0x1d, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, 0x53, 0x0a,
0x04, 0x4c, 0x69, 0x73, 0x74, 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, 0x18, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12,
0x11, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x69,
0x73, 0x74, 0x12, 0x6e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12,
0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x21, 0x12, 0x1f, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x12, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73,
0x12, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65,
0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x1b, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x1c, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x7d, 0x0a, 0x0b, 0x47, 0x65,
0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50,
0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12,
0x28, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d,
0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x71, 0x0a, 0x0a, 0x53, 0x79, 0x6e,
0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2c,
0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65,
0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x81, 0x01, 0x0a,
0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65,
0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x2a, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
0x12, 0x94, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e,
0x65, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50, 0x61, 0x67, 0x65,
0x49, 0x6e, 0x66, 0x6f, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x63, 0x68,
0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x71, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72,
0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2c, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63,
0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x81, 0x01, 0x0a, 0x0c, 0x44, 0x65,
0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x28, 0x2a, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x94, 0x01,
0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73,
0x12, 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65,
0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66,
0x6f, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x61, 0x6e,
0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f,
0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e,
0x6e, 0x65, 0x6c, 0x73, 0x12, 0x6e, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x75,
0x64, 0x69, 0x6f, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x61,
0x75, 0x64, 0x69, 0x6f, 0x12, 0x90, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x65, 0x6e,
0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x1a,
0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61,
0x6d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x22, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54,
0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22,
0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x72,
0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x7d, 0x12,
0x5b, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c,
0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x61, 0x64, 0x64, 0x12, 0x61, 0x0a, 0x0c,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f,
0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12,
0x87, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7b, 0x0a, 0x0e, 0x47, 0x65, 0x74,
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x12, 0x21, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x2f, 0x7b, 0x64, 0x65, 0x76,
0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e,
0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74,
0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75,
0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8a,
0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49,
0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66,
0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49,
0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x75, 0x62,
0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x71, 0x0a, 0x07, 0x47,
0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e,
0x53, 0x6e, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x76,
0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72,
0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36,
0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f,
0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e,
0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x08, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6c,
0x61, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e,
0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79,
0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d,
0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x0b,
0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74,
0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23, 0x2f,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79,
0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x6b, 0x65,
0x79, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x72, 0x6f, 0x61,
0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70,
0x72, 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x22, 0x32, 0x2f, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x62, 0x72,
0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x88,
0x01, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74,
0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x72,
0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18,
0x49, 0x6e, 0x66, 0x6f, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x75, 0x62, 0x5f, 0x63,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49,
0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x2f, 0x63,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x6e, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67,
0x65, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
0x6c, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x90, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49,
0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e,
0x65, 0x6c, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e,
0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x73, 0x74,
0x72, 0x65, 0x61, 0x6d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x0f, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x22,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x30, 0x22, 0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64,
0x65, 0x7d, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12,
0x12, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x61, 0x64, 0x64, 0x12,
0x61, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12,
0x12, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76,
0x69, 0x63, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x64, 0x61,
0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7b, 0x0a, 0x0e,
0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x12, 0x21,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44,
0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x2f, 0x7b,
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x0d, 0x47, 0x65, 0x74,
0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75,
0x73, 0x12, 0x8a, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e,
0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x2f, 0x61, 0x70, 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f,
0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x71,
0x0a, 0x07, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70,
0x72, 0x6f, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64,
0x7d, 0x12, 0x76, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x17,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38,
0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x74, 0x61,
0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x08, 0x53, 0x74, 0x6f,
0x70, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70,
0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f,
0x12, 0x2d, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70,
0x6c, 0x61, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12,
0x74, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, 0x1e,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x76,
0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39,
0x22, 0x37, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70,
0x6c, 0x61, 0x79, 0x2f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x74,
0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74,
0x41, 0x6c, 0x6c, 0x53, 0x53, 0x52, 0x43, 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,
0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x53, 0x52,
0x43, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x73, 0x72, 0x63, 0x12, 0x68, 0x0a,
0x0d, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x20,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x52,
0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x13, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68,
0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e,
0x6e, 0x65, 0x6c, 0x2f, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x50, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x18, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01,
0x2a, 0x22, 0x19, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x12, 0x6f, 0x0a, 0x0b,
0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62,
0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f,
0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x69, 0x0a,
0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12,
0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61,
0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70,
0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
0x6d, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x71, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65,
0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x21, 0x2e, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a,
0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x0d, 0x4c,
0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x20, 0x2e, 0x67,
0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25,
0x22, 0x23, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70,
0x6c, 0x61, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x2f,
0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42,
0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x22, 0x32, 0x2f,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79,
0x2f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69,
0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64,
0x7d, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63,
0x61, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42,
0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4,
0x93, 0x02, 0x39, 0x22, 0x37, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74,
0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d,
0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x62, 0x0a, 0x0a,
0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x53, 0x52, 0x43, 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, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e,
0x53, 0x53, 0x52, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x73, 0x72, 0x63,
0x12, 0x68, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
0x6c, 0x12, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47,
0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a,
0x12, 0x18, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0b, 0x41, 0x64,
0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a,
0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x12,
0x6f, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1e,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50,
0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c,
0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x22, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x6c, 0x69, 0x73,
0x74, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x62,
0x61, 0x63, 0x6b, 0x12, 0x1b, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c,
0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f,
0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3,
0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61,
0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d,
0x12, 0x69, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
0x72, 0x6d, 0x12, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e,
0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x71, 0x0a, 0x0e, 0x44,
0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x21, 0x2e,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61,
0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x1c, 0x2a, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x74,
0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12,
0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x4c, 0x69, 0x73,
0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50,
0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f,
0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31,
0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
0x6c, 0x69, 0x73, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c,
0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31,
0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f,
0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82,
0xd3, 0xe4, 0x93, 0x02, 0x34, 0x22, 0x32, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x74, 0x61,
0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x42, 0x22, 0x5a, 0x20, 0x6d, 0x37, 0x73,
0x2e, 0x6c, 0x69, 0x76, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f,
0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x33,
0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x8a, 0x01, 0x0a, 0x0b, 0x51, 0x75,
0x65, 0x72, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x63, 0x6f,
0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x62, 0x32, 0x38,
0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x63, 0x6f,
0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93,
0x02, 0x34, 0x12, 0x32, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69,
0x2f, 0x67, 0x62, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f,
0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e,
0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x42, 0x22, 0x5a, 0x20, 0x6d, 0x37, 0x73, 0x2e, 0x6c, 0x69,
0x76, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x67, 0x62, 0x32,
0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
})
var (
@@ -3851,7 +4195,7 @@ func file_gb28181_proto_rawDescGZIP() []byte {
return file_gb28181_proto_rawDescData
}
var file_gb28181_proto_msgTypes = make([]protoimpl.MessageInfo, 45)
var file_gb28181_proto_msgTypes = make([]protoimpl.MessageInfo, 48)
var file_gb28181_proto_goTypes = []any{
(*BaseResponse)(nil), // 0: gb28181pro.BaseResponse
(*GetDeviceRequest)(nil), // 1: gb28181pro.GetDeviceRequest
@@ -3897,92 +4241,99 @@ var file_gb28181_proto_goTypes = []any{
(*ListPlatformsRequest)(nil), // 41: gb28181pro.ListPlatformsRequest
(*PlatformResponse)(nil), // 42: gb28181pro.PlatformResponse
(*PlatformsPageInfo)(nil), // 43: gb28181pro.PlatformsPageInfo
nil, // 44: gb28181pro.SubscribeInfoResponse.DialogStateEntry
(*timestamppb.Timestamp)(nil), // 45: google.protobuf.Timestamp
(*emptypb.Empty)(nil), // 46: google.protobuf.Empty
(*QueryRecordRequest)(nil), // 44: gb28181pro.QueryRecordRequest
(*QueryRecordResponse)(nil), // 45: gb28181pro.QueryRecordResponse
(*RecordItem)(nil), // 46: gb28181pro.RecordItem
nil, // 47: gb28181pro.SubscribeInfoResponse.DialogStateEntry
(*timestamppb.Timestamp)(nil), // 48: google.protobuf.Timestamp
(*emptypb.Empty)(nil), // 49: google.protobuf.Empty
}
var file_gb28181_proto_depIdxs = []int32{
12, // 0: gb28181pro.DevicesPageInfo.list:type_name -> gb28181pro.Device
11, // 1: gb28181pro.ChannelsPageInfo.list:type_name -> gb28181pro.Channel
45, // 2: gb28181pro.Channel.gpsTime:type_name -> google.protobuf.Timestamp
45, // 3: gb28181pro.Device.gpsTime:type_name -> google.protobuf.Timestamp
45, // 4: gb28181pro.Device.registerTime:type_name -> google.protobuf.Timestamp
45, // 5: gb28181pro.Device.updateTime:type_name -> google.protobuf.Timestamp
48, // 2: gb28181pro.Channel.gpsTime:type_name -> google.protobuf.Timestamp
48, // 3: gb28181pro.Device.gpsTime:type_name -> google.protobuf.Timestamp
48, // 4: gb28181pro.Device.registerTime:type_name -> google.protobuf.Timestamp
48, // 5: gb28181pro.Device.updateTime:type_name -> google.protobuf.Timestamp
11, // 6: gb28181pro.Device.channels:type_name -> gb28181pro.Channel
12, // 7: gb28181pro.ResponseList.data:type_name -> gb28181pro.Device
20, // 8: gb28181pro.DeviceAlarmResponse.alarms:type_name -> gb28181pro.AlarmInfo
44, // 9: gb28181pro.SubscribeInfoResponse.dialogState:type_name -> gb28181pro.SubscribeInfoResponse.DialogStateEntry
47, // 9: gb28181pro.SubscribeInfoResponse.dialogState:type_name -> gb28181pro.SubscribeInfoResponse.DialogStateEntry
12, // 10: gb28181pro.DeviceResponse.data:type_name -> gb28181pro.Device
11, // 11: gb28181pro.ChannelResponse.data:type_name -> gb28181pro.Channel
32, // 12: gb28181pro.PlayResponse.stream_info:type_name -> gb28181pro.StreamInfo
36, // 13: gb28181pro.SSRCListResponse.data:type_name -> gb28181pro.SSRCInfo
38, // 14: gb28181pro.PlatformResponse.data:type_name -> gb28181pro.Platform
38, // 15: gb28181pro.PlatformsPageInfo.list:type_name -> gb28181pro.Platform
46, // 16: gb28181pro.api.List:input_type -> google.protobuf.Empty
1, // 17: gb28181pro.api.GetDevice:input_type -> gb28181pro.GetDeviceRequest
2, // 18: gb28181pro.api.GetDevices:input_type -> gb28181pro.GetDevicesRequest
4, // 19: gb28181pro.api.GetChannels:input_type -> gb28181pro.GetChannelsRequest
6, // 20: gb28181pro.api.SyncDevice:input_type -> gb28181pro.SyncDeviceRequest
8, // 21: gb28181pro.api.DeleteDevice:input_type -> gb28181pro.DeleteDeviceRequest
10, // 22: gb28181pro.api.GetSubChannels:input_type -> gb28181pro.GetSubChannelsRequest
14, // 23: gb28181pro.api.ChangeAudio:input_type -> gb28181pro.ChangeAudioRequest
11, // 24: gb28181pro.api.UpdateChannelStreamIdentification:input_type -> gb28181pro.Channel
15, // 25: gb28181pro.api.UpdateTransport:input_type -> gb28181pro.UpdateTransportRequest
12, // 26: gb28181pro.api.AddDevice:input_type -> gb28181pro.Device
12, // 27: gb28181pro.api.UpdateDevice:input_type -> gb28181pro.Device
16, // 28: gb28181pro.api.GetDeviceStatus:input_type -> gb28181pro.GetDeviceStatusRequest
18, // 29: gb28181pro.api.GetDeviceAlarm:input_type -> gb28181pro.GetDeviceAlarmRequest
21, // 30: gb28181pro.api.GetSyncStatus:input_type -> gb28181pro.GetSyncStatusRequest
22, // 31: gb28181pro.api.GetSubscribeInfo:input_type -> gb28181pro.GetSubscribeInfoRequest
24, // 32: gb28181pro.api.GetSnap:input_type -> gb28181pro.GetSnapRequest
29, // 33: gb28181pro.api.StartPlay:input_type -> gb28181pro.PlayRequest
29, // 34: gb28181pro.api.StopPlay:input_type -> gb28181pro.PlayRequest
33, // 35: gb28181pro.api.StopConvert:input_type -> gb28181pro.ConvertStopRequest
34, // 36: gb28181pro.api.StartBroadcast:input_type -> gb28181pro.BroadcastRequest
34, // 37: gb28181pro.api.StopBroadcast:input_type -> gb28181pro.BroadcastRequest
46, // 38: gb28181pro.api.GetAllSSRC:input_type -> google.protobuf.Empty
26, // 39: gb28181pro.api.GetRawChannel:input_type -> gb28181pro.GetRawChannelRequest
38, // 40: gb28181pro.api.AddPlatform:input_type -> gb28181pro.Platform
39, // 41: gb28181pro.api.GetPlatform:input_type -> gb28181pro.GetPlatformRequest
38, // 42: gb28181pro.api.UpdatePlatform:input_type -> gb28181pro.Platform
40, // 43: gb28181pro.api.DeletePlatform:input_type -> gb28181pro.DeletePlatformRequest
41, // 44: gb28181pro.api.ListPlatforms:input_type -> gb28181pro.ListPlatformsRequest
30, // 45: gb28181pro.api.StartPlayback:input_type -> gb28181pro.PlaybackRequest
13, // 46: gb28181pro.api.List:output_type -> gb28181pro.ResponseList
27, // 47: gb28181pro.api.GetDevice:output_type -> gb28181pro.DeviceResponse
3, // 48: gb28181pro.api.GetDevices:output_type -> gb28181pro.DevicesPageInfo
5, // 49: gb28181pro.api.GetChannels:output_type -> gb28181pro.ChannelsPageInfo
7, // 50: gb28181pro.api.SyncDevice:output_type -> gb28181pro.SyncStatus
9, // 51: gb28181pro.api.DeleteDevice:output_type -> gb28181pro.DeleteDeviceResponse
5, // 52: gb28181pro.api.GetSubChannels:output_type -> gb28181pro.ChannelsPageInfo
0, // 53: gb28181pro.api.ChangeAudio:output_type -> gb28181pro.BaseResponse
0, // 54: gb28181pro.api.UpdateChannelStreamIdentification:output_type -> gb28181pro.BaseResponse
46, // 55: gb28181pro.api.UpdateTransport:output_type -> google.protobuf.Empty
46, // 56: gb28181pro.api.AddDevice:output_type -> google.protobuf.Empty
46, // 57: gb28181pro.api.UpdateDevice:output_type -> google.protobuf.Empty
17, // 58: gb28181pro.api.GetDeviceStatus:output_type -> gb28181pro.DeviceStatusResponse
19, // 59: gb28181pro.api.GetDeviceAlarm:output_type -> gb28181pro.DeviceAlarmResponse
7, // 60: gb28181pro.api.GetSyncStatus:output_type -> gb28181pro.SyncStatus
23, // 61: gb28181pro.api.GetSubscribeInfo:output_type -> gb28181pro.SubscribeInfoResponse
25, // 62: gb28181pro.api.GetSnap:output_type -> gb28181pro.SnapResponse
31, // 63: gb28181pro.api.StartPlay:output_type -> gb28181pro.PlayResponse
31, // 64: gb28181pro.api.StopPlay:output_type -> gb28181pro.PlayResponse
0, // 65: gb28181pro.api.StopConvert:output_type -> gb28181pro.BaseResponse
35, // 66: gb28181pro.api.StartBroadcast:output_type -> gb28181pro.BroadcastResponse
0, // 67: gb28181pro.api.StopBroadcast:output_type -> gb28181pro.BaseResponse
37, // 68: gb28181pro.api.GetAllSSRC:output_type -> gb28181pro.SSRCListResponse
11, // 69: gb28181pro.api.GetRawChannel:output_type -> gb28181pro.Channel
0, // 70: gb28181pro.api.AddPlatform:output_type -> gb28181pro.BaseResponse
42, // 71: gb28181pro.api.GetPlatform:output_type -> gb28181pro.PlatformResponse
0, // 72: gb28181pro.api.UpdatePlatform:output_type -> gb28181pro.BaseResponse
0, // 73: gb28181pro.api.DeletePlatform:output_type -> gb28181pro.BaseResponse
43, // 74: gb28181pro.api.ListPlatforms:output_type -> gb28181pro.PlatformsPageInfo
31, // 75: gb28181pro.api.StartPlayback:output_type -> gb28181pro.PlayResponse
46, // [46:76] is the sub-list for method output_type
16, // [16:46] is the sub-list for method input_type
16, // [16:16] is the sub-list for extension type_name
16, // [16:16] is the sub-list for extension extendee
0, // [0:16] is the sub-list for field type_name
46, // 16: gb28181pro.QueryRecordResponse.records:type_name -> gb28181pro.RecordItem
48, // 17: gb28181pro.QueryRecordResponse.last_time:type_name -> google.protobuf.Timestamp
49, // 18: gb28181pro.api.List:input_type -> google.protobuf.Empty
1, // 19: gb28181pro.api.GetDevice:input_type -> gb28181pro.GetDeviceRequest
2, // 20: gb28181pro.api.GetDevices:input_type -> gb28181pro.GetDevicesRequest
4, // 21: gb28181pro.api.GetChannels:input_type -> gb28181pro.GetChannelsRequest
6, // 22: gb28181pro.api.SyncDevice:input_type -> gb28181pro.SyncDeviceRequest
8, // 23: gb28181pro.api.DeleteDevice:input_type -> gb28181pro.DeleteDeviceRequest
10, // 24: gb28181pro.api.GetSubChannels:input_type -> gb28181pro.GetSubChannelsRequest
14, // 25: gb28181pro.api.ChangeAudio:input_type -> gb28181pro.ChangeAudioRequest
11, // 26: gb28181pro.api.UpdateChannelStreamIdentification:input_type -> gb28181pro.Channel
15, // 27: gb28181pro.api.UpdateTransport:input_type -> gb28181pro.UpdateTransportRequest
12, // 28: gb28181pro.api.AddDevice:input_type -> gb28181pro.Device
12, // 29: gb28181pro.api.UpdateDevice:input_type -> gb28181pro.Device
16, // 30: gb28181pro.api.GetDeviceStatus:input_type -> gb28181pro.GetDeviceStatusRequest
18, // 31: gb28181pro.api.GetDeviceAlarm:input_type -> gb28181pro.GetDeviceAlarmRequest
21, // 32: gb28181pro.api.GetSyncStatus:input_type -> gb28181pro.GetSyncStatusRequest
22, // 33: gb28181pro.api.GetSubscribeInfo:input_type -> gb28181pro.GetSubscribeInfoRequest
24, // 34: gb28181pro.api.GetSnap:input_type -> gb28181pro.GetSnapRequest
29, // 35: gb28181pro.api.StartPlay:input_type -> gb28181pro.PlayRequest
29, // 36: gb28181pro.api.StopPlay:input_type -> gb28181pro.PlayRequest
33, // 37: gb28181pro.api.StopConvert:input_type -> gb28181pro.ConvertStopRequest
34, // 38: gb28181pro.api.StartBroadcast:input_type -> gb28181pro.BroadcastRequest
34, // 39: gb28181pro.api.StopBroadcast:input_type -> gb28181pro.BroadcastRequest
49, // 40: gb28181pro.api.GetAllSSRC:input_type -> google.protobuf.Empty
26, // 41: gb28181pro.api.GetRawChannel:input_type -> gb28181pro.GetRawChannelRequest
38, // 42: gb28181pro.api.AddPlatform:input_type -> gb28181pro.Platform
39, // 43: gb28181pro.api.GetPlatform:input_type -> gb28181pro.GetPlatformRequest
38, // 44: gb28181pro.api.UpdatePlatform:input_type -> gb28181pro.Platform
40, // 45: gb28181pro.api.DeletePlatform:input_type -> gb28181pro.DeletePlatformRequest
41, // 46: gb28181pro.api.ListPlatforms:input_type -> gb28181pro.ListPlatformsRequest
30, // 47: gb28181pro.api.StartPlayback:input_type -> gb28181pro.PlaybackRequest
44, // 48: gb28181pro.api.QueryRecord:input_type -> gb28181pro.QueryRecordRequest
13, // 49: gb28181pro.api.List:output_type -> gb28181pro.ResponseList
27, // 50: gb28181pro.api.GetDevice:output_type -> gb28181pro.DeviceResponse
3, // 51: gb28181pro.api.GetDevices:output_type -> gb28181pro.DevicesPageInfo
5, // 52: gb28181pro.api.GetChannels:output_type -> gb28181pro.ChannelsPageInfo
7, // 53: gb28181pro.api.SyncDevice:output_type -> gb28181pro.SyncStatus
9, // 54: gb28181pro.api.DeleteDevice:output_type -> gb28181pro.DeleteDeviceResponse
5, // 55: gb28181pro.api.GetSubChannels:output_type -> gb28181pro.ChannelsPageInfo
0, // 56: gb28181pro.api.ChangeAudio:output_type -> gb28181pro.BaseResponse
0, // 57: gb28181pro.api.UpdateChannelStreamIdentification:output_type -> gb28181pro.BaseResponse
49, // 58: gb28181pro.api.UpdateTransport:output_type -> google.protobuf.Empty
49, // 59: gb28181pro.api.AddDevice:output_type -> google.protobuf.Empty
49, // 60: gb28181pro.api.UpdateDevice:output_type -> google.protobuf.Empty
17, // 61: gb28181pro.api.GetDeviceStatus:output_type -> gb28181pro.DeviceStatusResponse
19, // 62: gb28181pro.api.GetDeviceAlarm:output_type -> gb28181pro.DeviceAlarmResponse
7, // 63: gb28181pro.api.GetSyncStatus:output_type -> gb28181pro.SyncStatus
23, // 64: gb28181pro.api.GetSubscribeInfo:output_type -> gb28181pro.SubscribeInfoResponse
25, // 65: gb28181pro.api.GetSnap:output_type -> gb28181pro.SnapResponse
31, // 66: gb28181pro.api.StartPlay:output_type -> gb28181pro.PlayResponse
31, // 67: gb28181pro.api.StopPlay:output_type -> gb28181pro.PlayResponse
0, // 68: gb28181pro.api.StopConvert:output_type -> gb28181pro.BaseResponse
35, // 69: gb28181pro.api.StartBroadcast:output_type -> gb28181pro.BroadcastResponse
0, // 70: gb28181pro.api.StopBroadcast:output_type -> gb28181pro.BaseResponse
37, // 71: gb28181pro.api.GetAllSSRC:output_type -> gb28181pro.SSRCListResponse
11, // 72: gb28181pro.api.GetRawChannel:output_type -> gb28181pro.Channel
0, // 73: gb28181pro.api.AddPlatform:output_type -> gb28181pro.BaseResponse
42, // 74: gb28181pro.api.GetPlatform:output_type -> gb28181pro.PlatformResponse
0, // 75: gb28181pro.api.UpdatePlatform:output_type -> gb28181pro.BaseResponse
0, // 76: gb28181pro.api.DeletePlatform:output_type -> gb28181pro.BaseResponse
43, // 77: gb28181pro.api.ListPlatforms:output_type -> gb28181pro.PlatformsPageInfo
31, // 78: gb28181pro.api.StartPlayback:output_type -> gb28181pro.PlayResponse
45, // 79: gb28181pro.api.QueryRecord:output_type -> gb28181pro.QueryRecordResponse
49, // [49:80] is the sub-list for method output_type
18, // [18:49] is the sub-list for method input_type
18, // [18:18] is the sub-list for extension type_name
18, // [18:18] is the sub-list for extension extendee
0, // [0:18] is the sub-list for field type_name
}
func init() { file_gb28181_proto_init() }
@@ -3996,7 +4347,7 @@ func file_gb28181_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_gb28181_proto_rawDesc), len(file_gb28181_proto_rawDesc)),
NumEnums: 0,
NumMessages: 45,
NumMessages: 48,
NumExtensions: 0,
NumServices: 1,
},
+157 -6
View File
@@ -1534,14 +1534,14 @@ func local_request_Api_ListPlatforms_0(ctx context.Context, marshaler runtime.Ma
}
var (
filter_Api_StartPlayback_0 = &utilities.DoubleArray{Encoding: map[string]int{"deviceId": 0, "channelId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
)
func request_Api_StartPlayback_0(ctx context.Context, marshaler runtime.Marshaler, client ApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq PlaybackRequest
var metadata runtime.ServerMetadata
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
var (
val string
ok bool
@@ -1569,6 +1569,13 @@ func request_Api_StartPlayback_0(ctx context.Context, marshaler runtime.Marshale
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channelId", err)
}
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Api_StartPlayback_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.StartPlayback(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
@@ -1578,9 +1585,52 @@ func local_request_Api_StartPlayback_0(ctx context.Context, marshaler runtime.Ma
var protoReq PlaybackRequest
var metadata runtime.ServerMetadata
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF {
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["deviceId"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deviceId")
}
protoReq.DeviceId, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deviceId", err)
}
val, ok = pathParams["channelId"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channelId")
}
protoReq.ChannelId, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channelId", err)
}
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Api_StartPlayback_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.StartPlayback(ctx, &protoReq)
return msg, metadata, err
}
var (
filter_Api_QueryRecord_0 = &utilities.DoubleArray{Encoding: map[string]int{"deviceId": 0, "channelId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
)
func request_Api_QueryRecord_0(ctx context.Context, marshaler runtime.Marshaler, client ApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryRecordRequest
var metadata runtime.ServerMetadata
var (
val string
@@ -1609,7 +1659,57 @@ func local_request_Api_StartPlayback_0(ctx context.Context, marshaler runtime.Ma
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channelId", err)
}
msg, err := server.StartPlayback(ctx, &protoReq)
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Api_QueryRecord_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.QueryRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Api_QueryRecord_0(ctx context.Context, marshaler runtime.Marshaler, server ApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryRecordRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["deviceId"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deviceId")
}
protoReq.DeviceId, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deviceId", err)
}
val, ok = pathParams["channelId"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channelId")
}
protoReq.ChannelId, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channelId", err)
}
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Api_QueryRecord_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.QueryRecord(ctx, &protoReq)
return msg, metadata, err
}
@@ -2371,6 +2471,31 @@ func RegisterApiHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
})
mux.Handle("GET", pattern_Api_QueryRecord_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, "/gb28181pro.Api/QueryRecord", runtime.WithHTTPPathPattern("/gb28181/api/gbrecord/query/{deviceId}/{channelId}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Api_QueryRecord_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_Api_QueryRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@@ -3072,6 +3197,28 @@ func RegisterApiHandlerClient(ctx context.Context, mux *runtime.ServeMux, client
})
mux.Handle("GET", pattern_Api_QueryRecord_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, "/gb28181pro.Api/QueryRecord", runtime.WithHTTPPathPattern("/gb28181/api/gbrecord/query/{deviceId}/{channelId}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Api_QueryRecord_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_Api_QueryRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@@ -3135,6 +3282,8 @@ var (
pattern_Api_ListPlatforms_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"gb28181", "api", "platform", "list"}, ""))
pattern_Api_StartPlayback_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"gb28181", "api", "playback", "start", "deviceId", "channelId"}, ""))
pattern_Api_QueryRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"gb28181", "api", "gbrecord", "query", "deviceId", "channelId"}, ""))
)
var (
@@ -3197,4 +3346,6 @@ var (
forward_Api_ListPlatforms_0 = runtime.ForwardResponseMessage
forward_Api_StartPlayback_0 = runtime.ForwardResponseMessage
forward_Api_QueryRecord_0 = runtime.ForwardResponseMessage
)
+39
View File
@@ -228,6 +228,13 @@ service api {
post: "/gb28181/api/playback/start/{deviceId}/{channelId}"
};
}
//
rpc QueryRecord (QueryRecordRequest) returns (QueryRecordResponse) {
option (google.api.http) = {
get: "/gb28181/api/gbrecord/query/{deviceId}/{channelId}"
};
}
}
//
@@ -559,4 +566,36 @@ message PlatformsPageInfo {
string message = 2;
int32 total = 3;
repeated Platform list = 4;
}
message QueryRecordRequest {
string deviceId = 1;
string channelId = 2;
string start = 3;
string end = 4;
}
message QueryRecordResponse {
int32 code = 1;
string message = 2;
repeated RecordItem records = 3;
string device_id = 4;
string channel_id = 5;
string sn = 6;
string name = 7;
int32 sum_num = 8;
int32 count = 9;
google.protobuf.Timestamp last_time = 10;
}
message RecordItem {
string deviceId = 1;
string name = 2;
string filePath = 3;
string address = 4;
string startTime = 5;
string endTime = 6;
int32 secrecy = 7;
string type = 8;
string recorderId = 9;
}
+40
View File
@@ -52,6 +52,7 @@ const (
Api_DeletePlatform_FullMethodName = "/gb28181pro.api/DeletePlatform"
Api_ListPlatforms_FullMethodName = "/gb28181pro.api/ListPlatforms"
Api_StartPlayback_FullMethodName = "/gb28181pro.api/StartPlayback"
Api_QueryRecord_FullMethodName = "/gb28181pro.api/QueryRecord"
)
// ApiClient is the client API for Api service.
@@ -118,6 +119,8 @@ type ApiClient interface {
ListPlatforms(ctx context.Context, in *ListPlatformsRequest, opts ...grpc.CallOption) (*PlatformsPageInfo, error)
// 开始回放
StartPlayback(ctx context.Context, in *PlaybackRequest, opts ...grpc.CallOption) (*PlayResponse, error)
// 查询录像记录
QueryRecord(ctx context.Context, in *QueryRecordRequest, opts ...grpc.CallOption) (*QueryRecordResponse, error)
}
type apiClient struct {
@@ -428,6 +431,16 @@ func (c *apiClient) StartPlayback(ctx context.Context, in *PlaybackRequest, opts
return out, nil
}
func (c *apiClient) QueryRecord(ctx context.Context, in *QueryRecordRequest, opts ...grpc.CallOption) (*QueryRecordResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(QueryRecordResponse)
err := c.cc.Invoke(ctx, Api_QueryRecord_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
// ApiServer is the server API for Api service.
// All implementations must embed UnimplementedApiServer
// for forward compatibility.
@@ -492,6 +505,8 @@ type ApiServer interface {
ListPlatforms(context.Context, *ListPlatformsRequest) (*PlatformsPageInfo, error)
// 开始回放
StartPlayback(context.Context, *PlaybackRequest) (*PlayResponse, error)
// 查询录像记录
QueryRecord(context.Context, *QueryRecordRequest) (*QueryRecordResponse, error)
mustEmbedUnimplementedApiServer()
}
@@ -592,6 +607,9 @@ func (UnimplementedApiServer) ListPlatforms(context.Context, *ListPlatformsReque
func (UnimplementedApiServer) StartPlayback(context.Context, *PlaybackRequest) (*PlayResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method StartPlayback not implemented")
}
func (UnimplementedApiServer) QueryRecord(context.Context, *QueryRecordRequest) (*QueryRecordResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method QueryRecord not implemented")
}
func (UnimplementedApiServer) mustEmbedUnimplementedApiServer() {}
func (UnimplementedApiServer) testEmbeddedByValue() {}
@@ -1153,6 +1171,24 @@ func _Api_StartPlayback_Handler(srv interface{}, ctx context.Context, dec func(i
return interceptor(ctx, in, info, handler)
}
func _Api_QueryRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryRecordRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ApiServer).QueryRecord(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Api_QueryRecord_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ApiServer).QueryRecord(ctx, req.(*QueryRecordRequest))
}
return interceptor(ctx, in, info, handler)
}
// Api_ServiceDesc is the grpc.ServiceDesc for Api service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -1280,6 +1316,10 @@ var Api_ServiceDesc = grpc.ServiceDesc{
MethodName: "StartPlayback",
Handler: _Api_StartPlayback_Handler,
},
{
MethodName: "QueryRecord",
Handler: _Api_QueryRecord_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "gb28181.proto",
+7 -12
View File
@@ -110,16 +110,6 @@ func BuildKeepAliveXML(sn int, id string) []byte {
}
type (
Record struct {
DeviceID string
Name string
FilePath string
Address string
StartTime string
EndTime string
Secrecy int
Type string
}
Message struct {
XMLName xml.Name
CmdType string
@@ -130,8 +120,13 @@ type (
Model string
Channel string
DeviceList []DeviceChannel `xml:"DeviceList>Item"`
RecordList []Record `xml:"RecordList>Item"`
SumNum int // 录像结果的总数 SumNum,录像结果会按照多条消息返回,可用于判断是否全部返回
RecordList struct {
Num int `xml:"Num,attr"`
Item []RecordItem `xml:"Item"`
} `xml:"RecordList"`
SumNum int // 录像结果的总数 SumNum,录像结果会按照多条消息返回,可用于判断是否全部返回
Name string // 设备/通道名称
LastTime time.Time `xml:"LastTime"` // 最后时间
}
)
+117
View File
@@ -0,0 +1,117 @@
package gb28181
import "time"
// RecordInfo 设备录像信息
type RecordInfo struct {
// 设备编号
DeviceID string `json:"deviceId"`
// 通道编号
ChannelID string `json:"channelId"`
// 命令序列号
SN string `json:"sn"`
// 设备名称
Name string `json:"name"`
// 列表总数
SumNum int `json:"sumNum"`
// 计数
Count int `json:"count"`
// 最后时间
LastTime time.Time `json:"lastTime"`
// 录像列表
RecordList []RecordItem `json:"recordList"`
}
// NewRecordInfo 创建新的 RecordInfo 实例
func NewRecordInfo() *RecordInfo {
return &RecordInfo{
RecordList: make([]RecordItem, 0),
}
}
// GetDeviceID 获取设备编号
func (r *RecordInfo) GetDeviceID() string {
return r.DeviceID
}
// SetDeviceID 设置设备编号
func (r *RecordInfo) SetDeviceID(deviceID string) {
r.DeviceID = deviceID
}
// GetName 获取设备名称
func (r *RecordInfo) GetName() string {
return r.Name
}
// SetName 设置设备名称
func (r *RecordInfo) SetName(name string) {
r.Name = name
}
// GetSumNum 获取列表总数
func (r *RecordInfo) GetSumNum() int {
return r.SumNum
}
// SetSumNum 设置列表总数
func (r *RecordInfo) SetSumNum(sumNum int) {
r.SumNum = sumNum
}
// GetRecordList 获取录像列表
func (r *RecordInfo) GetRecordList() []RecordItem {
return r.RecordList
}
// SetRecordList 设置录像列表
func (r *RecordInfo) SetRecordList(recordList []RecordItem) {
r.RecordList = recordList
}
// GetChannelID 获取通道编号
func (r *RecordInfo) GetChannelID() string {
return r.ChannelID
}
// SetChannelID 设置通道编号
func (r *RecordInfo) SetChannelID(channelID string) {
r.ChannelID = channelID
}
// GetSN 获取命令序列号
func (r *RecordInfo) GetSN() string {
return r.SN
}
// SetSN 设置命令序列号
func (r *RecordInfo) SetSN(sn string) {
r.SN = sn
}
// GetLastTime 获取最后时间
func (r *RecordInfo) GetLastTime() time.Time {
return r.LastTime
}
// SetLastTime 设置最后时间
func (r *RecordInfo) SetLastTime(lastTime time.Time) {
r.LastTime = lastTime
}
// GetCount 获取计数
func (r *RecordInfo) GetCount() int {
return r.Count
}
// SetCount 设置计数
func (r *RecordInfo) SetCount(count int) {
r.Count = count
}
+77
View File
@@ -0,0 +1,77 @@
package gb28181
import (
"strings"
"time"
)
// RecordItem 设备录像信息
type RecordItem struct {
// 设备编号
DeviceID string `xml:"DeviceID" json:"deviceId"`
// 名称
Name string `xml:"Name" json:"name"`
// 文件路径名 (可选)
FilePath string `xml:"FilePath" json:"filePath"`
// 录像文件大小,单位:Byte(可选)
FileSize string `xml:"FileSize" json:"fileSize"`
// 录像地址(可选)
Address string `xml:"Address" json:"address"`
// 录像开始时间(可选)
StartTime string `xml:"StartTime" json:"startTime"`
// 录像结束时间(可选)
EndTime string `xml:"EndTime" json:"endTime"`
// 保密属性(必选)缺省为0;0:不涉密,1:涉密
Secrecy int `xml:"Secrecy" json:"secrecy"`
// 录像产生类型(可选)time或alarm或manual
Type string `xml:"Type" json:"type"`
// 录像触发者ID(可选)
RecorderID string `xml:"RecorderId" json:"recorderId"`
}
// CompareTo 比较两个录像记录的开始时间
// 返回值:
// -1: r < other
//
// 0: r = other
// 1: r > other
func (r *RecordItem) CompareTo(other *RecordItem) int {
startTimeNow, err := time.Parse("2006-01-02T15:04:05", r.StartTime)
if err != nil {
return 0
}
startTimeParam, err := time.Parse("2006-01-02T15:04:05", other.StartTime)
if err != nil {
return 0
}
if startTimeNow.Equal(startTimeParam) {
return 0
} else if startTimeParam.After(startTimeNow) {
return -1
} else {
return 1
}
}
// Less 用于排序
func (r *RecordItem) Less(other *RecordItem) bool {
return r.CompareTo(other) < 0
}
// Equal 判断两个录像记录是否相等
func (r *RecordItem) Equal(other *RecordItem) bool {
if other == nil {
return false
}
return strings.EqualFold(r.StartTime, other.StartTime)
}
+68
View File
@@ -0,0 +1,68 @@
package plugin_gb28181pro
import (
"context"
"fmt"
"github.com/emiago/sipgo/sip"
"m7s.live/v5/pkg/util"
)
// RecordInfoQuery 发送录像查询请求
// startTime 和 endTime 的格式为 "2006-01-02 15:04:05"
func (gb *GB28181ProPlugin) RecordInfoQuery(deviceID string, channelID string, startTime string, endTime string, sn int) (*util.Promise, error) {
device, ok := gb.devices.Get(deviceID)
if !ok {
return nil, fmt.Errorf("device not found: %s", deviceID)
}
channel, ok := device.channels.Get(channelID)
if !ok {
return nil, fmt.Errorf("channel not found: %s", channelID)
}
// 构建XML消息
charset := "GB2312"
if device.Charset != "" {
charset = device.Charset
}
msgBody := fmt.Sprintf(`<?xml version="1.0" encoding="%s"?>
<Query>
<CmdType>RecordInfo</CmdType>
<SN>%d</SN>
<DeviceID>%s</DeviceID>
<StartTime>%s</StartTime>
<EndTime>%s</EndTime>
<Secrecy>0</Secrecy>
<Type>all</Type>
</Query>`, charset, sn, channelID, startTime, endTime)
// 创建 MESSAGE 请求
request := device.CreateRequest(sip.MESSAGE)
if request == nil {
return nil, fmt.Errorf("create request failed")
}
// 设置消息体
request.SetBody([]byte(msgBody))
// 创建Promise并保存到channel的RecordReqs中
promise := util.NewPromise(context.Background())
recordReq := &RecordRequest{
SN: sn,
Promise: promise,
}
// 先保存请求到RecordReqs,确保能接收到响应
channel.RecordReqs.Set(recordReq)
// 发送请求
_, err := device.send(request)
if err != nil {
channel.RecordReqs.Remove(recordReq)
return nil, err
}
return promise, nil
}