Compare commits

...

15 Commits

Author SHA1 Message Date
skiffer-git 9d29d49ada group dismissed 2022-03-24 15:33:30 +08:00
wangchuxiao e7b95892ff minio upload api 2022-03-23 17:40:51 +08:00
wangchuxiao 4bf5c77374 mongo 2022-03-23 17:18:40 +08:00
wangchuxiao df4a75f4b0 mongo 2022-03-23 17:15:46 +08:00
wangchuxiao 4bdb4cbbb5 mongo 2022-03-23 16:13:18 +08:00
wangchuxiao 4cdcdee8e4 Merge branch 'tuoyun' of github.com:OpenIMSDK/Open-IM-Server into tuoyun 2022-03-23 15:44:59 +08:00
wangchuxiao e6c36411cb mongo 2022-03-23 15:44:34 +08:00
Gordon b5de638c0b ws remove log 2022-03-23 11:32:58 +08:00
Gordon 1d09ffa529 Merge remote-tracking branch 'origin/tuoyun' into tuoyun 2022-03-22 18:13:48 +08:00
Gordon eef9d15aaa ws remove log 2022-03-22 18:13:34 +08:00
wangchuxiao 8034ddc413 mongo 2022-03-22 14:30:07 +08:00
wangchuxiao e75adb165a mongo 2022-03-21 19:36:10 +08:00
wangchuxiao 09ce0d5285 mongo 2022-03-21 19:19:33 +08:00
wangchuxiao cc1ad41e94 Merge branch 'tuoyun' of github.com:OpenIMSDK/Open-IM-Server into tuoyun 2022-03-21 16:57:14 +08:00
wangchuxiao 8a38646bc5 mongo 2022-03-21 16:56:52 +08:00
22 changed files with 2802 additions and 4083 deletions
+2
View File
@@ -66,6 +66,7 @@ func main() {
groupRouterGroup.POST("/get_group_members_info", group.GetGroupMembersInfo) //1
groupRouterGroup.POST("/invite_user_to_group", group.InviteUserToGroup) //1
groupRouterGroup.POST("/get_joined_group_list", group.GetJoinedGroupList) //1
groupRouterGroup.POST("/dismiss_group", group.DismissGroup)
}
//certificate
authRouterGroup := r.Group("/auth")
@@ -78,6 +79,7 @@ func main() {
{
thirdGroup.POST("/tencent_cloud_storage_credential", apiThird.TencentCloudStorageCredential)
thirdGroup.POST("/minio_storage_credential", apiThird.MinioStorageCredential)
thirdGroup.POST("/minio_upload", apiThird.MinioUploadFile)
}
//Message
chatGroup := r.Group("/msg")
+12 -1
View File
@@ -90,7 +90,7 @@ credential: #腾讯cos,发送图片、视频、文件时需要,请自行申
minio: #MinIO 发送图片、视频、文件时需要,请自行申请后替换,必须修改。 客户端初始化InitSDK,中 object_storage参数为minio
bucket: openim
location: us-east-1
endpoint: http://127.0.0.1:9000
endpoint: http://43.128.5.63:9000
accessKeyID: user12345
secretAccessKey: key12345
@@ -340,6 +340,17 @@ notification:
defaultTips:
tips: "entered the group" # group info changed by xx
groupDismissed:
conversation:
reliabilityLevel: 3
unreadCount: true
offlinePush:
switch: false
title: "groupDismissed title"
desc: "groupDismissed desc"
ext: "groupDismissed ext"
defaultTips:
tips: "group dismissed"
#############################friend#################################
friendApplicationAdded:
+32
View File
@@ -536,3 +536,35 @@ func TransferGroupOwner(c *gin.Context) {
log.NewInfo(req.OperationID, "TransferGroupOwner api return ", resp)
c.JSON(http.StatusOK, resp)
}
func DismissGroup(c *gin.Context) {
params := api.DismissGroupReq{}
if err := c.BindJSON(&params); err != nil {
log.NewError("0", "BindJSON failed ", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
return
}
req := &rpc.DismissGroupReq{}
utils.CopyStructFields(req, &params)
var ok bool
ok, req.OpUserID = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID)
if !ok {
log.NewError(req.OperationID, "GetUserIDFromToken false ", c.Request.Header.Get("token"))
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"})
return
}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " args ", req.String())
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName)
client := rpc.NewGroupClient(etcdConn)
reply, err := client.DismissGroup(context.Background(), req)
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), " failed ", req.String())
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
return
}
resp := api.DismissGroupResp{CommResp: api.CommResp{ErrCode: reply.CommonResp.ErrCode, ErrMsg: reply.CommonResp.ErrMsg}}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api return ", resp)
c.JSON(http.StatusOK, resp)
}
+12 -2
View File
@@ -40,6 +40,8 @@ func newUserSendMsgReq(params *ManagementSendMsgReq) *pbChat.SendMsgReq {
fallthrough
case constant.File:
newContent = utils.StructToJsonString(params.Content)
case constant.Revoke:
newContent = params.Content["revokeMsgClientID"].(string)
default:
}
var options map[string]bool
@@ -103,7 +105,8 @@ func ManagementSendMsg(c *gin.Context) {
//case constant.Location:
case constant.Custom:
data = CustomElem{}
//case constant.Revoke:
case constant.Revoke:
data = RevokeElem{}
//case constant.HasReadReceipt:
//case constant.Typing:
//case constant.Quote:
@@ -121,12 +124,13 @@ func ManagementSendMsg(c *gin.Context) {
log.ErrorByKv("data args validate err", "", "err", err.Error())
return
}
log.NewInfo("", data, params)
token := c.Request.Header.Get("token")
claims, err := token_verify.ParseToken(token)
if err != nil {
log.NewError(params.OperationID, "parse token failed", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "parse token failed", "sendTime": 0, "MsgID": ""})
return
}
if !utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "not authorized", "sendTime": 0, "MsgID": ""})
@@ -138,11 +142,13 @@ func ManagementSendMsg(c *gin.Context) {
if len(params.RecvID) == 0 {
log.NewError(params.OperationID, "recvID is a null string")
c.JSON(http.StatusBadRequest, gin.H{"errCode": 405, "errMsg": "recvID is a null string", "sendTime": 0, "MsgID": ""})
return
}
case constant.GroupChatType:
if len(params.GroupID) == 0 {
log.NewError(params.OperationID, "groupID is a null string")
c.JSON(http.StatusBadRequest, gin.H{"errCode": 405, "errMsg": "groupID is a null string", "sendTime": 0, "MsgID": ""})
return
}
}
@@ -257,3 +263,7 @@ type CustomElem struct {
type TextElem struct {
Text string `mapstructure:"text" validate:"required"`
}
type RevokeElem struct {
RevokeMsgClientID string `mapstructure:"revokeMsgClientID" validate:"required"`
}
+6 -1
View File
@@ -10,13 +10,18 @@ import (
url2 "net/url"
)
var (
minioClient *minio.Client
)
func MinioInit() {
log.NewInfo("", utils.GetSelfFuncName())
minioUrl, err := url2.Parse(config.Config.Credential.Minio.Endpoint)
if err != nil {
log.NewError("", utils.GetSelfFuncName(), "parse failed, please check config/config.yaml", err.Error())
return
}
minioClient, err := minio.New(minioUrl.Host, &minio.Options{
minioClient, err = minio.New(minioUrl.Host, &minio.Options{
Creds: credentials.NewStaticV4(config.Config.Credential.Minio.AccessKeyID, config.Config.Credential.Minio.SecretAccessKey, ""),
Secure: false,
})
@@ -8,12 +8,82 @@ import (
"Open_IM/pkg/common/token_verify"
_ "Open_IM/pkg/common/token_verify"
"Open_IM/pkg/utils"
"context"
"github.com/gin-gonic/gin"
"github.com/minio/minio-go/v7"
_ "github.com/minio/minio-go/v7"
cr "github.com/minio/minio-go/v7/pkg/credentials"
"net/http"
)
func MinioUploadFile(c *gin.Context) {
var (
req apiStruct.MinioUploadFileReq
resp apiStruct.MinioUploadFileResp
)
defer func() {
if r := recover(); r != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), r)
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing file or snapShot args"})
return
}
}()
if err := c.Bind(&req); err != nil {
log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
return
}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), req)
switch req.FileType {
case constant.VideoType:
snapShotFile, err := c.FormFile("snapShot")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing snapshot arg: " + err.Error()})
return
}
snapShotFileObj, err := snapShotFile.Open()
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "Open file error", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
return
}
snapShotNewName, snapShotNewType := utils.GetNewFileNameAndContentType(snapShotFile.Filename, constant.ImageType)
log.Debug(req.OperationID, utils.GetSelfFuncName(), snapShotNewName, snapShotNewType)
_, err = minioClient.PutObject(context.Background(), config.Config.Credential.Minio.Bucket, snapShotNewName, snapShotFileObj, snapShotFile.Size, minio.PutObjectOptions{ContentType: snapShotNewType})
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "PutObject snapShotFile error", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
return
}
resp.SnapshotURL = config.Config.Credential.Minio.Endpoint + "/" + config.Config.Credential.Minio.Bucket + "/" + snapShotNewName
resp.SnapshotNewName = snapShotNewName
}
file, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "missing file arg: " + err.Error()})
return
}
fileObj, err := file.Open()
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "Open file error", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "invalid file path" + err.Error()})
return
}
newName, newType := utils.GetNewFileNameAndContentType(file.Filename, req.FileType)
log.Debug(req.OperationID, utils.GetSelfFuncName(), newName, newType)
_, err = minioClient.PutObject(context.Background(), config.Config.Credential.Minio.Bucket, newName, fileObj, file.Size, minio.PutObjectOptions{ContentType: newType})
if err != nil {
log.NewError(req.OperationID, utils.GetSelfFuncName(), "open file error")
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "invalid file path" + err.Error()})
return
}
resp.NewName = newName
resp.URL = config.Config.Credential.Minio.Endpoint + "/" + config.Config.Credential.Minio.Bucket + "/" + newName
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp})
return
}
func MinioStorageCredential(c *gin.Context) {
var (
req apiStruct.MinioStorageCredentialReq
+31 -33
View File
@@ -28,7 +28,7 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
dec := gob.NewDecoder(b)
err := dec.Decode(&m)
if err != nil {
log.ErrorByKv("ws Decode err", "", "err", err.Error())
log.NewError("", "ws Decode err", err.Error())
ws.sendErrMsg(conn, 200, err.Error(), constant.WSDataError, "", "")
err = conn.Close()
if err != nil {
@@ -37,7 +37,7 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
return
}
if err := validate.Struct(m); err != nil {
log.ErrorByKv("ws args validate err", "", "err", err.Error())
log.NewError("", "ws args validate err", err.Error())
ws.sendErrMsg(conn, 201, err.Error(), m.ReqIdentifier, m.MsgIncr, m.OperationID)
return
}
@@ -45,7 +45,7 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
// ws.sendErrMsg(conn, 202, "token validate err", m.ReqIdentifier, m.MsgIncr,m.OperationID)
// return
//}
log.InfoByKv("Basic Info Authentication Success", m.OperationID, "reqIdentifier", m.ReqIdentifier, "sendID", m.SendID, "msgIncr", m.MsgIncr)
log.NewInfo(m.OperationID, "Basic Info Authentication Success", m)
switch m.ReqIdentifier {
case constant.WSGetNewestSeq:
@@ -61,7 +61,7 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
log.NewInfo("", "goroutine num is ", runtime.NumGoroutine())
}
func (ws *WServer) getSeqReq(conn *UserConn, m *Req) {
log.NewInfo(m.OperationID, "Ws call success to getNewSeq", m.MsgIncr, m.SendID, m.ReqIdentifier)
log.NewInfo(m.OperationID, "Ws call success to getNewSeq", m.MsgIncr, m.SendID, m.ReqIdentifier, m.Data)
rpcReq := pbChat.GetMaxAndMinSeqReq{}
nReply := new(pbChat.GetMaxAndMinSeqResp)
rpcReq.UserID = m.SendID
@@ -99,15 +99,15 @@ func (ws *WServer) getSeqResp(conn *UserConn, m *Req, pb *pbChat.GetMaxAndMinSeq
}
func (ws *WServer) pullMsgBySeqListReq(conn *UserConn, m *Req) {
log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq start", m.SendID, m.ReqIdentifier, m.MsgIncr)
log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq start", m.SendID, m.ReqIdentifier, m.MsgIncr, m.Data)
nReply := new(sdk_ws.PullMessageBySeqListResp)
isPass, errCode, errMsg, data := ws.argsValidate(m, constant.WSPullMsgBySeqList)
log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq middle", m.SendID, m.ReqIdentifier, m.MsgIncr, data.(sdk_ws.PullMessageBySeqListReq).SeqList)
if isPass {
rpcReq := sdk_ws.PullMessageBySeqListReq{}
rpcReq.SeqList = data.(sdk_ws.PullMessageBySeqListReq).SeqList
rpcReq.UserID = m.SendID
rpcReq.OperationID = m.OperationID
log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq middle", m.SendID, m.ReqIdentifier, m.MsgIncr, data.(sdk_ws.PullMessageBySeqListReq).SeqList)
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
msgClient := pbChat.NewChatClient(grpcConn)
reply, err := msgClient.PullMessageBySeqList(context.Background(), &rpcReq)
@@ -145,7 +145,7 @@ func (ws *WServer) pullMsgBySeqListResp(conn *UserConn, m *Req, pb *sdk_ws.PullM
}
func (ws *WServer) sendMsgReq(conn *UserConn, m *Req) {
sendMsgCount++
log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID)
log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID, m.Data)
nReply := new(pbChat.SendMsgResp)
isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendMsg)
if isPass {
@@ -196,38 +196,36 @@ func (ws *WServer) sendMsgResp(conn *UserConn, m *Req, pb *pbChat.SendMsgResp) {
}
func (ws *WServer) sendSignalMsgReq(conn *UserConn, m *Req) {
log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID)
log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID, m.Data)
nReply := new(pbChat.SendMsgResp)
isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendSignalMsg)
log.NewInfo(m.OperationID, "args is ", pData.(*sdk_ws.SignalReq))
isPass2, errCode2, errMsg2, signalResp, msgData := ws.signalMessageAssemble(pData.(*sdk_ws.SignalReq), m.OperationID)
if isPass && isPass2 {
pbData := pbChat.SendMsgReq{
Token: m.Token,
OperationID: m.OperationID,
MsgData: msgData,
}
log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq middle", m.ReqIdentifier, m.SendID, m.MsgIncr, msgData)
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
client := pbChat.NewChatClient(etcdConn)
reply, err := client.SendMsg(context.Background(), &pbData)
if err != nil {
log.NewError(pbData.OperationID, "rpc sendMsg err", err.Error())
nReply.ErrCode = 200
nReply.ErrMsg = err.Error()
ws.sendSignalMsgResp(conn, 200, err.Error(), m, signalResp)
if isPass {
isPass2, errCode2, errMsg2, signalResp, msgData := ws.signalMessageAssemble(pData.(*sdk_ws.SignalReq), m.OperationID)
if isPass2 {
pbData := pbChat.SendMsgReq{
Token: m.Token,
OperationID: m.OperationID,
MsgData: msgData,
}
log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq middle", m.ReqIdentifier, m.SendID, m.MsgIncr, msgData)
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
client := pbChat.NewChatClient(etcdConn)
reply, err := client.SendMsg(context.Background(), &pbData)
if err != nil {
log.NewError(pbData.OperationID, "rpc sendMsg err", err.Error())
nReply.ErrCode = 200
nReply.ErrMsg = err.Error()
ws.sendSignalMsgResp(conn, 200, err.Error(), m, signalResp)
} else {
log.NewInfo(pbData.OperationID, "rpc call success to sendMsgReq", reply.String())
ws.sendSignalMsgResp(conn, 0, "", m, signalResp)
}
} else {
log.NewInfo(pbData.OperationID, "rpc call success to sendMsgReq", reply.String())
ws.sendSignalMsgResp(conn, 0, "", m, signalResp)
}
} else {
if isPass {
log.NewError(m.OperationID, isPass2, errCode2, errMsg2)
ws.sendSignalMsgResp(conn, errCode2, errMsg2, m, signalResp)
} else {
ws.sendSignalMsgResp(conn, errCode, errMsg, m, signalResp)
}
} else {
ws.sendSignalMsgResp(conn, errCode, errMsg, m, nil)
}
}
+24
View File
@@ -937,3 +937,27 @@ func (s *groupServer) GetUserReqApplicationList(_ context.Context, req *pbGroup.
}
return resp, nil
}
func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGroupReq) (*pbGroup.DismissGroupResp, error) {
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc args ", req.String())
if !token_verify.IsMangerUserID(req.OpUserID) && !imdb.IsGroupOwnerAdmin(req.GroupID, req.OpUserID) {
log.NewError(req.OperationID, "verify failed ", req.OpUserID, req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
}
err := imdb.OperateGroupStatus(req.GroupID, constant.GroupStatusDismissed)
if err != nil {
log.NewError(req.OperationID, "OperateGroupStatus failed ", req.GroupID, constant.GroupStatusDismissed)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
chat.GroupDismissedNotification(req)
err = imdb.DeleteGroupMemberByGroupID(req.GroupID)
if err != nil {
log.NewError(req.OperationID, "DeleteGroupMemberByGroupID failed ", req.GroupID)
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""})
return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
}
+16 -1
View File
@@ -157,7 +157,9 @@ func groupNotification(contentType int32, m proto.Message, sendID, groupID, recv
case constant.MemberInvitedNotification: //
tips.DefaultTips = toNickname + " " + cn.MemberInvited.DefaultTips.Tips
case constant.MemberEnterNotification:
tips.DefaultTips = toNickname + " " + cn.MemberInvited.DefaultTips.Tips
tips.DefaultTips = toNickname + " " + cn.MemberEnter.DefaultTips.Tips
case constant.GroupDismissedNotification:
tips.DefaultTips = toNickname + "" + cn.GroupDismissed.DefaultTips.Tips
default:
log.Error(operationID, "contentType failed ", contentType)
return
@@ -324,6 +326,19 @@ func GroupOwnerTransferredNotification(req *pbGroup.TransferGroupOwnerReq) {
groupNotification(constant.GroupOwnerTransferredNotification, &GroupOwnerTransferredTips, req.OpUserID, req.GroupID, "", req.OperationID)
}
func GroupDismissedNotification(req *pbGroup.DismissGroupReq) {
tips := open_im_sdk.GroupDismissedTips{Group: &open_im_sdk.GroupInfo{}, OpUser: &open_im_sdk.GroupMemberFullInfo{}}
if err := setGroupInfo(req.GroupID, tips.Group); err != nil {
log.NewError(req.OperationID, "setGroupInfo failed ", err.Error(), req.GroupID)
return
}
if err := setOpUserInfo(req.OpUserID, req.GroupID, tips.OpUser); err != nil {
log.Error(req.OperationID, "setOpUserInfo failed", req.OpUserID, req.GroupID)
return
}
groupNotification(constant.GroupDismissedNotification, &tips, req.OpUserID, req.GroupID, "", req.OperationID)
}
//message MemberKickedTips{
// GroupInfo Group = 1;
// GroupMemberFullInfo OpUser = 2;
+8
View File
@@ -503,6 +503,14 @@ func Notification(n *NotificationMsg) {
ex = config.Config.Notification.ConversationOptUpdate.OfflinePush.Ext
reliabilityLevel = config.Config.Notification.ConversationOptUpdate.Conversation.ReliabilityLevel
unReadCount = config.Config.Notification.ConversationOptUpdate.Conversation.UnreadCount
case constant.GroupDismissedNotification:
pushSwitch = config.Config.Notification.GroupDismissed.OfflinePush.PushSwitch
title = config.Config.Notification.GroupDismissed.OfflinePush.Title
desc = config.Config.Notification.GroupDismissed.OfflinePush.Desc
ex = config.Config.Notification.GroupDismissed.OfflinePush.Ext
reliabilityLevel = config.Config.Notification.GroupDismissed.Conversation.ReliabilityLevel
unReadCount = config.Config.Notification.GroupDismissed.Conversation.UnreadCount
}
switch reliabilityLevel {
case constant.UnreliableNotification:
+8
View File
@@ -177,3 +177,11 @@ type TransferGroupOwnerReq struct {
type TransferGroupOwnerResp struct {
CommResp
}
type DismissGroupReq struct {
GroupID string `json:"groupID" binding:"required"`
OperationID string `json:"operationID" binding:"required"`
}
type DismissGroupResp struct {
CommResp
}
+16 -4
View File
@@ -6,8 +6,20 @@ type MinioStorageCredentialReq struct {
type MiniostorageCredentialResp struct {
SecretAccessKey string `json:"secretAccessKey"`
AccessKeyID string `json:"accessKeyID"`
SessionToken string `json:"sessionToken"`
BucketName string `json:"bucketName"`
StsEndpointURL string `json:"stsEndpointURL"`
AccessKeyID string `json:"accessKeyID"`
SessionToken string `json:"sessionToken"`
BucketName string `json:"bucketName"`
StsEndpointURL string `json:"stsEndpointURL"`
}
type MinioUploadFileReq struct {
OperationID string `form:"operationID"`
FileType int `form:"fileType"`
}
type MinioUploadFileResp struct {
URL string `json:"URL"`
NewName string `json:"newName"`
SnapshotURL string `json:"snapshotURL,omitempty"`
SnapshotNewName string `json:"snapshotName,omitempty"`
}
+7
View File
@@ -250,6 +250,13 @@ type config struct {
OfflinePush POfflinePush `yaml:"offlinePush"`
DefaultTips PDefaultTips `yaml:"defaultTips"`
} `yaml:"memberEnter"`
GroupDismissed struct {
Conversation PConversation `yaml:"conversation"`
OfflinePush POfflinePush `yaml:"offlinePush"`
DefaultTips PDefaultTips `yaml:"defaultTips"`
} `yaml:"groupDismissed"`
////////////////////////user///////////////////////
UserInfoUpdated struct {
Conversation PConversation `yaml:"conversation"`
+10 -3
View File
@@ -77,6 +77,7 @@ const (
MemberKickedNotification = 1508
MemberInvitedNotification = 1509
MemberEnterNotification = 1510
GroupDismissedNotification = 1511
SignalingNotificationBegin = 1600
SignalingNotification = 1601
@@ -129,9 +130,10 @@ const (
IsSenderSync = "senderSync"
//GroupStatus
GroupOk = 0
GroupBanChat = 1
GroupDisband = 2
GroupOk = 0
GroupBanChat = 1
GroupStatusDismissed = 2
GroupBaned = 3
GroupBanPrivateChat = 4
@@ -159,6 +161,11 @@ const (
//callback callbackHandleCode
CallbackHandleSuccess = 0
CallbackHandleFailed = 1
// minioUpload
OtherType = 1
VideoType = 2
ImageType = 3
)
var ContentType2PushContent = map[int64]string{
+10 -4
View File
@@ -78,9 +78,10 @@ func (d *DataBases) DelMsgLogic(uid string, seqList []uint32, operationID string
sortkeys.Uint32s(seqList)
seqMsgs, err := d.GetMsgBySeqListMongo2(uid, seqList, operationID)
if err != nil {
return err
return utils.Wrap(err, "")
}
for _, seqMsg := range seqMsgs {
log.NewDebug(operationID, utils.GetSelfFuncName(), *seqMsg)
seqMsg.Status = constant.MsgDeleted
if err = d.ReplaceMsgBySeq(uid, seqMsg, operationID); err != nil {
log.NewError(operationID, utils.GetSelfFuncName(), "ReplaceMsgListBySeq error", err.Error())
@@ -90,20 +91,25 @@ func (d *DataBases) DelMsgLogic(uid string, seqList []uint32, operationID string
}
func (d *DataBases) ReplaceMsgBySeq(uid string, msg *open_im_sdk.MsgData, operationID string) error {
log.NewInfo(operationID, utils.GetSelfFuncName(), uid, msg)
log.NewInfo(operationID, utils.GetSelfFuncName(), uid, *msg)
ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second)
c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cChat)
uid = getSeqUid(uid, msg.Seq)
seqIndex := getMsgIndex(msg.Seq)
s := fmt.Sprintf("msg.%d.msg", seqIndex)
log.NewDebug(operationID, utils.GetSelfFuncName(), seqIndex, s)
bytes, err := proto.Marshal(msg)
if err != nil {
log.NewError(operationID, utils.GetSelfFuncName(), "proto marshal", err.Error())
return utils.Wrap(err, "")
}
updateResult, err := c.UpdateOne(
ctx, bson.M{"uid": uid},
bson.M{"$set": bson.M{s: msg}})
bson.M{"$set": bson.M{s: bytes}})
log.NewInfo(operationID, utils.GetSelfFuncName(), updateResult)
if err != nil {
log.NewError(operationID, utils.GetSelfFuncName(), "UpdateOne", err.Error())
return err
return utils.Wrap(err, "")
}
return nil
}
@@ -103,6 +103,18 @@ func DeleteGroupMemberByGroupIDAndUserID(groupID, userID string) error {
return nil
}
func DeleteGroupMemberByGroupID(groupID string) error {
dbConn, err := db.DB.MysqlDB.DefaultGormDB()
if err != nil {
return err
}
err = dbConn.Table("group_members").Where("group_id=? ", groupID).Delete(db.GroupMember{}).Error
if err != nil {
return err
}
return nil
}
func UpdateGroupMemberInfo(groupMemberInfo db.GroupMember) error {
dbConn, err := db.DB.MysqlDB.DefaultGormDB()
if err != nil {
+2213 -3811
View File
File diff suppressed because it is too large Load Diff
+11
View File
@@ -318,6 +318,15 @@ message AddGroupMembersCMSResp {
repeated string failed = 2;
}
message DismissGroupReq{
string opUserID = 1; //group member or app manager
string operationID = 2;
string groupID = 3;
}
message DismissGroupResp{
CommonResp commonResp = 1;
}
service group{
rpc createGroup(CreateGroupReq) returns(CreateGroupResp);
@@ -345,6 +354,8 @@ service group{
rpc GetGroupMembersCMS(GetGroupMembersCMSReq) returns(GetGroupMembersCMSResp);
rpc RemoveGroupMembersCMS(RemoveGroupMembersCMSReq) returns(RemoveGroupMembersCMSResp);
rpc AddGroupMembersCMS(AddGroupMembersCMSReq) returns(AddGroupMembersCMSResp);
rpc DismissGroup(DismissGroupReq) returns(DismissGroupResp);
}
+278 -222
View File
@@ -40,7 +40,7 @@ func (m *GroupInfo) Reset() { *m = GroupInfo{} }
func (m *GroupInfo) String() string { return proto.CompactTextString(m) }
func (*GroupInfo) ProtoMessage() {}
func (*GroupInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{0}
return fileDescriptor_ws_489fb152692e30da, []int{0}
}
func (m *GroupInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupInfo.Unmarshal(m, b)
@@ -164,7 +164,7 @@ func (m *GroupMemberFullInfo) Reset() { *m = GroupMemberFullInfo{} }
func (m *GroupMemberFullInfo) String() string { return proto.CompactTextString(m) }
func (*GroupMemberFullInfo) ProtoMessage() {}
func (*GroupMemberFullInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{1}
return fileDescriptor_ws_489fb152692e30da, []int{1}
}
func (m *GroupMemberFullInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupMemberFullInfo.Unmarshal(m, b)
@@ -269,7 +269,7 @@ func (m *PublicUserInfo) Reset() { *m = PublicUserInfo{} }
func (m *PublicUserInfo) String() string { return proto.CompactTextString(m) }
func (*PublicUserInfo) ProtoMessage() {}
func (*PublicUserInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{2}
return fileDescriptor_ws_489fb152692e30da, []int{2}
}
func (m *PublicUserInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PublicUserInfo.Unmarshal(m, b)
@@ -344,7 +344,7 @@ func (m *UserInfo) Reset() { *m = UserInfo{} }
func (m *UserInfo) String() string { return proto.CompactTextString(m) }
func (*UserInfo) ProtoMessage() {}
func (*UserInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{3}
return fileDescriptor_ws_489fb152692e30da, []int{3}
}
func (m *UserInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UserInfo.Unmarshal(m, b)
@@ -451,7 +451,7 @@ func (m *FriendInfo) Reset() { *m = FriendInfo{} }
func (m *FriendInfo) String() string { return proto.CompactTextString(m) }
func (*FriendInfo) ProtoMessage() {}
func (*FriendInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{4}
return fileDescriptor_ws_489fb152692e30da, []int{4}
}
func (m *FriendInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendInfo.Unmarshal(m, b)
@@ -536,7 +536,7 @@ func (m *BlackInfo) Reset() { *m = BlackInfo{} }
func (m *BlackInfo) String() string { return proto.CompactTextString(m) }
func (*BlackInfo) ProtoMessage() {}
func (*BlackInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{5}
return fileDescriptor_ws_489fb152692e30da, []int{5}
}
func (m *BlackInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BlackInfo.Unmarshal(m, b)
@@ -617,7 +617,7 @@ func (m *GroupRequest) Reset() { *m = GroupRequest{} }
func (m *GroupRequest) String() string { return proto.CompactTextString(m) }
func (*GroupRequest) ProtoMessage() {}
func (*GroupRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{6}
return fileDescriptor_ws_489fb152692e30da, []int{6}
}
func (m *GroupRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupRequest.Unmarshal(m, b)
@@ -725,7 +725,7 @@ func (m *FriendRequest) Reset() { *m = FriendRequest{} }
func (m *FriendRequest) String() string { return proto.CompactTextString(m) }
func (*FriendRequest) ProtoMessage() {}
func (*FriendRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{7}
return fileDescriptor_ws_489fb152692e30da, []int{7}
}
func (m *FriendRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendRequest.Unmarshal(m, b)
@@ -863,7 +863,7 @@ func (m *PullMessageBySeqListResp) Reset() { *m = PullMessageBySeqListRe
func (m *PullMessageBySeqListResp) String() string { return proto.CompactTextString(m) }
func (*PullMessageBySeqListResp) ProtoMessage() {}
func (*PullMessageBySeqListResp) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{8}
return fileDescriptor_ws_489fb152692e30da, []int{8}
}
func (m *PullMessageBySeqListResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PullMessageBySeqListResp.Unmarshal(m, b)
@@ -917,7 +917,7 @@ func (m *PullMessageBySeqListReq) Reset() { *m = PullMessageBySeqListReq
func (m *PullMessageBySeqListReq) String() string { return proto.CompactTextString(m) }
func (*PullMessageBySeqListReq) ProtoMessage() {}
func (*PullMessageBySeqListReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{9}
return fileDescriptor_ws_489fb152692e30da, []int{9}
}
func (m *PullMessageBySeqListReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PullMessageBySeqListReq.Unmarshal(m, b)
@@ -968,7 +968,7 @@ func (m *GetMaxAndMinSeqReq) Reset() { *m = GetMaxAndMinSeqReq{} }
func (m *GetMaxAndMinSeqReq) String() string { return proto.CompactTextString(m) }
func (*GetMaxAndMinSeqReq) ProtoMessage() {}
func (*GetMaxAndMinSeqReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{10}
return fileDescriptor_ws_489fb152692e30da, []int{10}
}
func (m *GetMaxAndMinSeqReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetMaxAndMinSeqReq.Unmarshal(m, b)
@@ -1000,7 +1000,7 @@ func (m *GetMaxAndMinSeqResp) Reset() { *m = GetMaxAndMinSeqResp{} }
func (m *GetMaxAndMinSeqResp) String() string { return proto.CompactTextString(m) }
func (*GetMaxAndMinSeqResp) ProtoMessage() {}
func (*GetMaxAndMinSeqResp) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{11}
return fileDescriptor_ws_489fb152692e30da, []int{11}
}
func (m *GetMaxAndMinSeqResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetMaxAndMinSeqResp.Unmarshal(m, b)
@@ -1047,7 +1047,7 @@ func (m *UserSendMsgResp) Reset() { *m = UserSendMsgResp{} }
func (m *UserSendMsgResp) String() string { return proto.CompactTextString(m) }
func (*UserSendMsgResp) ProtoMessage() {}
func (*UserSendMsgResp) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{12}
return fileDescriptor_ws_489fb152692e30da, []int{12}
}
func (m *UserSendMsgResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UserSendMsgResp.Unmarshal(m, b)
@@ -1116,7 +1116,7 @@ func (m *MsgData) Reset() { *m = MsgData{} }
func (m *MsgData) String() string { return proto.CompactTextString(m) }
func (*MsgData) ProtoMessage() {}
func (*MsgData) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{13}
return fileDescriptor_ws_489fb152692e30da, []int{13}
}
func (m *MsgData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MsgData.Unmarshal(m, b)
@@ -1277,7 +1277,7 @@ func (m *OfflinePushInfo) Reset() { *m = OfflinePushInfo{} }
func (m *OfflinePushInfo) String() string { return proto.CompactTextString(m) }
func (*OfflinePushInfo) ProtoMessage() {}
func (*OfflinePushInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{14}
return fileDescriptor_ws_489fb152692e30da, []int{14}
}
func (m *OfflinePushInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OfflinePushInfo.Unmarshal(m, b)
@@ -1345,7 +1345,7 @@ func (m *TipsComm) Reset() { *m = TipsComm{} }
func (m *TipsComm) String() string { return proto.CompactTextString(m) }
func (*TipsComm) ProtoMessage() {}
func (*TipsComm) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{15}
return fileDescriptor_ws_489fb152692e30da, []int{15}
}
func (m *TipsComm) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TipsComm.Unmarshal(m, b)
@@ -1402,7 +1402,7 @@ func (m *GroupCreatedTips) Reset() { *m = GroupCreatedTips{} }
func (m *GroupCreatedTips) String() string { return proto.CompactTextString(m) }
func (*GroupCreatedTips) ProtoMessage() {}
func (*GroupCreatedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{16}
return fileDescriptor_ws_489fb152692e30da, []int{16}
}
func (m *GroupCreatedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupCreatedTips.Unmarshal(m, b)
@@ -1471,7 +1471,7 @@ func (m *GroupInfoSetTips) Reset() { *m = GroupInfoSetTips{} }
func (m *GroupInfoSetTips) String() string { return proto.CompactTextString(m) }
func (*GroupInfoSetTips) ProtoMessage() {}
func (*GroupInfoSetTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{17}
return fileDescriptor_ws_489fb152692e30da, []int{17}
}
func (m *GroupInfoSetTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupInfoSetTips.Unmarshal(m, b)
@@ -1526,7 +1526,7 @@ func (m *JoinGroupApplicationTips) Reset() { *m = JoinGroupApplicationTi
func (m *JoinGroupApplicationTips) String() string { return proto.CompactTextString(m) }
func (*JoinGroupApplicationTips) ProtoMessage() {}
func (*JoinGroupApplicationTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{18}
return fileDescriptor_ws_489fb152692e30da, []int{18}
}
func (m *JoinGroupApplicationTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_JoinGroupApplicationTips.Unmarshal(m, b)
@@ -1582,7 +1582,7 @@ func (m *MemberQuitTips) Reset() { *m = MemberQuitTips{} }
func (m *MemberQuitTips) String() string { return proto.CompactTextString(m) }
func (*MemberQuitTips) ProtoMessage() {}
func (*MemberQuitTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{19}
return fileDescriptor_ws_489fb152692e30da, []int{19}
}
func (m *MemberQuitTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemberQuitTips.Unmarshal(m, b)
@@ -1637,7 +1637,7 @@ func (m *GroupApplicationAcceptedTips) Reset() { *m = GroupApplicationAc
func (m *GroupApplicationAcceptedTips) String() string { return proto.CompactTextString(m) }
func (*GroupApplicationAcceptedTips) ProtoMessage() {}
func (*GroupApplicationAcceptedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{20}
return fileDescriptor_ws_489fb152692e30da, []int{20}
}
func (m *GroupApplicationAcceptedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupApplicationAcceptedTips.Unmarshal(m, b)
@@ -1692,7 +1692,7 @@ func (m *GroupApplicationRejectedTips) Reset() { *m = GroupApplicationRe
func (m *GroupApplicationRejectedTips) String() string { return proto.CompactTextString(m) }
func (*GroupApplicationRejectedTips) ProtoMessage() {}
func (*GroupApplicationRejectedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{21}
return fileDescriptor_ws_489fb152692e30da, []int{21}
}
func (m *GroupApplicationRejectedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupApplicationRejectedTips.Unmarshal(m, b)
@@ -1748,7 +1748,7 @@ func (m *GroupOwnerTransferredTips) Reset() { *m = GroupOwnerTransferred
func (m *GroupOwnerTransferredTips) String() string { return proto.CompactTextString(m) }
func (*GroupOwnerTransferredTips) ProtoMessage() {}
func (*GroupOwnerTransferredTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{22}
return fileDescriptor_ws_489fb152692e30da, []int{22}
}
func (m *GroupOwnerTransferredTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupOwnerTransferredTips.Unmarshal(m, b)
@@ -1811,7 +1811,7 @@ func (m *MemberKickedTips) Reset() { *m = MemberKickedTips{} }
func (m *MemberKickedTips) String() string { return proto.CompactTextString(m) }
func (*MemberKickedTips) ProtoMessage() {}
func (*MemberKickedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{23}
return fileDescriptor_ws_489fb152692e30da, []int{23}
}
func (m *MemberKickedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemberKickedTips.Unmarshal(m, b)
@@ -1874,7 +1874,7 @@ func (m *MemberInvitedTips) Reset() { *m = MemberInvitedTips{} }
func (m *MemberInvitedTips) String() string { return proto.CompactTextString(m) }
func (*MemberInvitedTips) ProtoMessage() {}
func (*MemberInvitedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{24}
return fileDescriptor_ws_489fb152692e30da, []int{24}
}
func (m *MemberInvitedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemberInvitedTips.Unmarshal(m, b)
@@ -1936,7 +1936,7 @@ func (m *MemberEnterTips) Reset() { *m = MemberEnterTips{} }
func (m *MemberEnterTips) String() string { return proto.CompactTextString(m) }
func (*MemberEnterTips) ProtoMessage() {}
func (*MemberEnterTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{25}
return fileDescriptor_ws_489fb152692e30da, []int{25}
}
func (m *MemberEnterTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemberEnterTips.Unmarshal(m, b)
@@ -1977,6 +1977,60 @@ func (m *MemberEnterTips) GetOperationTime() int64 {
return 0
}
type GroupDismissedTips struct {
Group *GroupInfo `protobuf:"bytes,1,opt,name=group" json:"group,omitempty"`
OpUser *GroupMemberFullInfo `protobuf:"bytes,2,opt,name=opUser" json:"opUser,omitempty"`
OperationTime int64 `protobuf:"varint,3,opt,name=operationTime" json:"operationTime,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupDismissedTips) Reset() { *m = GroupDismissedTips{} }
func (m *GroupDismissedTips) String() string { return proto.CompactTextString(m) }
func (*GroupDismissedTips) ProtoMessage() {}
func (*GroupDismissedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_489fb152692e30da, []int{26}
}
func (m *GroupDismissedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupDismissedTips.Unmarshal(m, b)
}
func (m *GroupDismissedTips) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupDismissedTips.Marshal(b, m, deterministic)
}
func (dst *GroupDismissedTips) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupDismissedTips.Merge(dst, src)
}
func (m *GroupDismissedTips) XXX_Size() int {
return xxx_messageInfo_GroupDismissedTips.Size(m)
}
func (m *GroupDismissedTips) XXX_DiscardUnknown() {
xxx_messageInfo_GroupDismissedTips.DiscardUnknown(m)
}
var xxx_messageInfo_GroupDismissedTips proto.InternalMessageInfo
func (m *GroupDismissedTips) GetGroup() *GroupInfo {
if m != nil {
return m.Group
}
return nil
}
func (m *GroupDismissedTips) GetOpUser() *GroupMemberFullInfo {
if m != nil {
return m.OpUser
}
return nil
}
func (m *GroupDismissedTips) GetOperationTime() int64 {
if m != nil {
return m.OperationTime
}
return 0
}
type FriendApplication struct {
AddTime int64 `protobuf:"varint,1,opt,name=addTime" json:"addTime,omitempty"`
AddSource string `protobuf:"bytes,2,opt,name=addSource" json:"addSource,omitempty"`
@@ -1990,7 +2044,7 @@ func (m *FriendApplication) Reset() { *m = FriendApplication{} }
func (m *FriendApplication) String() string { return proto.CompactTextString(m) }
func (*FriendApplication) ProtoMessage() {}
func (*FriendApplication) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{26}
return fileDescriptor_ws_489fb152692e30da, []int{27}
}
func (m *FriendApplication) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendApplication.Unmarshal(m, b)
@@ -2043,7 +2097,7 @@ func (m *FromToUserID) Reset() { *m = FromToUserID{} }
func (m *FromToUserID) String() string { return proto.CompactTextString(m) }
func (*FromToUserID) ProtoMessage() {}
func (*FromToUserID) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{27}
return fileDescriptor_ws_489fb152692e30da, []int{28}
}
func (m *FromToUserID) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FromToUserID.Unmarshal(m, b)
@@ -2089,7 +2143,7 @@ func (m *FriendApplicationTips) Reset() { *m = FriendApplicationTips{} }
func (m *FriendApplicationTips) String() string { return proto.CompactTextString(m) }
func (*FriendApplicationTips) ProtoMessage() {}
func (*FriendApplicationTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{28}
return fileDescriptor_ws_489fb152692e30da, []int{29}
}
func (m *FriendApplicationTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendApplicationTips.Unmarshal(m, b)
@@ -2129,7 +2183,7 @@ func (m *FriendApplicationApprovedTips) Reset() { *m = FriendApplication
func (m *FriendApplicationApprovedTips) String() string { return proto.CompactTextString(m) }
func (*FriendApplicationApprovedTips) ProtoMessage() {}
func (*FriendApplicationApprovedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{29}
return fileDescriptor_ws_489fb152692e30da, []int{30}
}
func (m *FriendApplicationApprovedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendApplicationApprovedTips.Unmarshal(m, b)
@@ -2176,7 +2230,7 @@ func (m *FriendApplicationRejectedTips) Reset() { *m = FriendApplication
func (m *FriendApplicationRejectedTips) String() string { return proto.CompactTextString(m) }
func (*FriendApplicationRejectedTips) ProtoMessage() {}
func (*FriendApplicationRejectedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{30}
return fileDescriptor_ws_489fb152692e30da, []int{31}
}
func (m *FriendApplicationRejectedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendApplicationRejectedTips.Unmarshal(m, b)
@@ -2224,7 +2278,7 @@ func (m *FriendAddedTips) Reset() { *m = FriendAddedTips{} }
func (m *FriendAddedTips) String() string { return proto.CompactTextString(m) }
func (*FriendAddedTips) ProtoMessage() {}
func (*FriendAddedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{31}
return fileDescriptor_ws_489fb152692e30da, []int{32}
}
func (m *FriendAddedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendAddedTips.Unmarshal(m, b)
@@ -2277,7 +2331,7 @@ func (m *FriendDeletedTips) Reset() { *m = FriendDeletedTips{} }
func (m *FriendDeletedTips) String() string { return proto.CompactTextString(m) }
func (*FriendDeletedTips) ProtoMessage() {}
func (*FriendDeletedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{32}
return fileDescriptor_ws_489fb152692e30da, []int{33}
}
func (m *FriendDeletedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendDeletedTips.Unmarshal(m, b)
@@ -2315,7 +2369,7 @@ func (m *BlackAddedTips) Reset() { *m = BlackAddedTips{} }
func (m *BlackAddedTips) String() string { return proto.CompactTextString(m) }
func (*BlackAddedTips) ProtoMessage() {}
func (*BlackAddedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{33}
return fileDescriptor_ws_489fb152692e30da, []int{34}
}
func (m *BlackAddedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BlackAddedTips.Unmarshal(m, b)
@@ -2353,7 +2407,7 @@ func (m *BlackDeletedTips) Reset() { *m = BlackDeletedTips{} }
func (m *BlackDeletedTips) String() string { return proto.CompactTextString(m) }
func (*BlackDeletedTips) ProtoMessage() {}
func (*BlackDeletedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{34}
return fileDescriptor_ws_489fb152692e30da, []int{35}
}
func (m *BlackDeletedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BlackDeletedTips.Unmarshal(m, b)
@@ -2391,7 +2445,7 @@ func (m *FriendInfoChangedTips) Reset() { *m = FriendInfoChangedTips{} }
func (m *FriendInfoChangedTips) String() string { return proto.CompactTextString(m) }
func (*FriendInfoChangedTips) ProtoMessage() {}
func (*FriendInfoChangedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{35}
return fileDescriptor_ws_489fb152692e30da, []int{36}
}
func (m *FriendInfoChangedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FriendInfoChangedTips.Unmarshal(m, b)
@@ -2430,7 +2484,7 @@ func (m *UserInfoUpdatedTips) Reset() { *m = UserInfoUpdatedTips{} }
func (m *UserInfoUpdatedTips) String() string { return proto.CompactTextString(m) }
func (*UserInfoUpdatedTips) ProtoMessage() {}
func (*UserInfoUpdatedTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{36}
return fileDescriptor_ws_489fb152692e30da, []int{37}
}
func (m *UserInfoUpdatedTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UserInfoUpdatedTips.Unmarshal(m, b)
@@ -2469,7 +2523,7 @@ func (m *ConversationUpdateTips) Reset() { *m = ConversationUpdateTips{}
func (m *ConversationUpdateTips) String() string { return proto.CompactTextString(m) }
func (*ConversationUpdateTips) ProtoMessage() {}
func (*ConversationUpdateTips) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{37}
return fileDescriptor_ws_489fb152692e30da, []int{38}
}
func (m *ConversationUpdateTips) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConversationUpdateTips.Unmarshal(m, b)
@@ -2509,7 +2563,7 @@ func (m *RequestPagination) Reset() { *m = RequestPagination{} }
func (m *RequestPagination) String() string { return proto.CompactTextString(m) }
func (*RequestPagination) ProtoMessage() {}
func (*RequestPagination) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{38}
return fileDescriptor_ws_489fb152692e30da, []int{39}
}
func (m *RequestPagination) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RequestPagination.Unmarshal(m, b)
@@ -2555,7 +2609,7 @@ func (m *ResponsePagination) Reset() { *m = ResponsePagination{} }
func (m *ResponsePagination) String() string { return proto.CompactTextString(m) }
func (*ResponsePagination) ProtoMessage() {}
func (*ResponsePagination) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{39}
return fileDescriptor_ws_489fb152692e30da, []int{40}
}
func (m *ResponsePagination) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponsePagination.Unmarshal(m, b)
@@ -2608,7 +2662,7 @@ func (m *SignalReq) Reset() { *m = SignalReq{} }
func (m *SignalReq) String() string { return proto.CompactTextString(m) }
func (*SignalReq) ProtoMessage() {}
func (*SignalReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{40}
return fileDescriptor_ws_489fb152692e30da, []int{41}
}
func (m *SignalReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalReq.Unmarshal(m, b)
@@ -2875,7 +2929,7 @@ func (m *SignalResp) Reset() { *m = SignalResp{} }
func (m *SignalResp) String() string { return proto.CompactTextString(m) }
func (*SignalResp) ProtoMessage() {}
func (*SignalResp) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{41}
return fileDescriptor_ws_489fb152692e30da, []int{42}
}
func (m *SignalResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalResp.Unmarshal(m, b)
@@ -3143,7 +3197,7 @@ func (m *InvitationInfo) Reset() { *m = InvitationInfo{} }
func (m *InvitationInfo) String() string { return proto.CompactTextString(m) }
func (*InvitationInfo) ProtoMessage() {}
func (*InvitationInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{42}
return fileDescriptor_ws_489fb152692e30da, []int{43}
}
func (m *InvitationInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvitationInfo.Unmarshal(m, b)
@@ -3239,7 +3293,7 @@ func (m *ParticipantMetaData) Reset() { *m = ParticipantMetaData{} }
func (m *ParticipantMetaData) String() string { return proto.CompactTextString(m) }
func (*ParticipantMetaData) ProtoMessage() {}
func (*ParticipantMetaData) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{43}
return fileDescriptor_ws_489fb152692e30da, []int{44}
}
func (m *ParticipantMetaData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ParticipantMetaData.Unmarshal(m, b)
@@ -3294,7 +3348,7 @@ func (m *SignalInviteReq) Reset() { *m = SignalInviteReq{} }
func (m *SignalInviteReq) String() string { return proto.CompactTextString(m) }
func (*SignalInviteReq) ProtoMessage() {}
func (*SignalInviteReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{44}
return fileDescriptor_ws_489fb152692e30da, []int{45}
}
func (m *SignalInviteReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalInviteReq.Unmarshal(m, b)
@@ -3355,7 +3409,7 @@ func (m *SignalInviteReply) Reset() { *m = SignalInviteReply{} }
func (m *SignalInviteReply) String() string { return proto.CompactTextString(m) }
func (*SignalInviteReply) ProtoMessage() {}
func (*SignalInviteReply) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{45}
return fileDescriptor_ws_489fb152692e30da, []int{46}
}
func (m *SignalInviteReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalInviteReply.Unmarshal(m, b)
@@ -3410,7 +3464,7 @@ func (m *SignalInviteInGroupReq) Reset() { *m = SignalInviteInGroupReq{}
func (m *SignalInviteInGroupReq) String() string { return proto.CompactTextString(m) }
func (*SignalInviteInGroupReq) ProtoMessage() {}
func (*SignalInviteInGroupReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{46}
return fileDescriptor_ws_489fb152692e30da, []int{47}
}
func (m *SignalInviteInGroupReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalInviteInGroupReq.Unmarshal(m, b)
@@ -3471,7 +3525,7 @@ func (m *SignalInviteInGroupReply) Reset() { *m = SignalInviteInGroupRep
func (m *SignalInviteInGroupReply) String() string { return proto.CompactTextString(m) }
func (*SignalInviteInGroupReply) ProtoMessage() {}
func (*SignalInviteInGroupReply) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{47}
return fileDescriptor_ws_489fb152692e30da, []int{48}
}
func (m *SignalInviteInGroupReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalInviteInGroupReply.Unmarshal(m, b)
@@ -3526,7 +3580,7 @@ func (m *SignalCancelReq) Reset() { *m = SignalCancelReq{} }
func (m *SignalCancelReq) String() string { return proto.CompactTextString(m) }
func (*SignalCancelReq) ProtoMessage() {}
func (*SignalCancelReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{48}
return fileDescriptor_ws_489fb152692e30da, []int{49}
}
func (m *SignalCancelReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalCancelReq.Unmarshal(m, b)
@@ -3584,7 +3638,7 @@ func (m *SignalCancelReply) Reset() { *m = SignalCancelReply{} }
func (m *SignalCancelReply) String() string { return proto.CompactTextString(m) }
func (*SignalCancelReply) ProtoMessage() {}
func (*SignalCancelReply) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{49}
return fileDescriptor_ws_489fb152692e30da, []int{50}
}
func (m *SignalCancelReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalCancelReply.Unmarshal(m, b)
@@ -3619,7 +3673,7 @@ func (m *SignalAcceptReq) Reset() { *m = SignalAcceptReq{} }
func (m *SignalAcceptReq) String() string { return proto.CompactTextString(m) }
func (*SignalAcceptReq) ProtoMessage() {}
func (*SignalAcceptReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{50}
return fileDescriptor_ws_489fb152692e30da, []int{51}
}
func (m *SignalAcceptReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalAcceptReq.Unmarshal(m, b)
@@ -3687,7 +3741,7 @@ func (m *SignalAcceptReply) Reset() { *m = SignalAcceptReply{} }
func (m *SignalAcceptReply) String() string { return proto.CompactTextString(m) }
func (*SignalAcceptReply) ProtoMessage() {}
func (*SignalAcceptReply) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{51}
return fileDescriptor_ws_489fb152692e30da, []int{52}
}
func (m *SignalAcceptReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalAcceptReply.Unmarshal(m, b)
@@ -3741,7 +3795,7 @@ func (m *SignalHungUpReq) Reset() { *m = SignalHungUpReq{} }
func (m *SignalHungUpReq) String() string { return proto.CompactTextString(m) }
func (*SignalHungUpReq) ProtoMessage() {}
func (*SignalHungUpReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{52}
return fileDescriptor_ws_489fb152692e30da, []int{53}
}
func (m *SignalHungUpReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalHungUpReq.Unmarshal(m, b)
@@ -3792,7 +3846,7 @@ func (m *SignalHungUpReply) Reset() { *m = SignalHungUpReply{} }
func (m *SignalHungUpReply) String() string { return proto.CompactTextString(m) }
func (*SignalHungUpReply) ProtoMessage() {}
func (*SignalHungUpReply) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{53}
return fileDescriptor_ws_489fb152692e30da, []int{54}
}
func (m *SignalHungUpReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalHungUpReply.Unmarshal(m, b)
@@ -3827,7 +3881,7 @@ func (m *SignalRejectReq) Reset() { *m = SignalRejectReq{} }
func (m *SignalRejectReq) String() string { return proto.CompactTextString(m) }
func (*SignalRejectReq) ProtoMessage() {}
func (*SignalRejectReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{54}
return fileDescriptor_ws_489fb152692e30da, []int{55}
}
func (m *SignalRejectReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalRejectReq.Unmarshal(m, b)
@@ -3892,7 +3946,7 @@ func (m *SignalRejectReply) Reset() { *m = SignalRejectReply{} }
func (m *SignalRejectReply) String() string { return proto.CompactTextString(m) }
func (*SignalRejectReply) ProtoMessage() {}
func (*SignalRejectReply) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{55}
return fileDescriptor_ws_489fb152692e30da, []int{56}
}
func (m *SignalRejectReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalRejectReply.Unmarshal(m, b)
@@ -3926,7 +3980,7 @@ func (m *DelMsgListReq) Reset() { *m = DelMsgListReq{} }
func (m *DelMsgListReq) String() string { return proto.CompactTextString(m) }
func (*DelMsgListReq) ProtoMessage() {}
func (*DelMsgListReq) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{56}
return fileDescriptor_ws_489fb152692e30da, []int{57}
}
func (m *DelMsgListReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DelMsgListReq.Unmarshal(m, b)
@@ -3986,7 +4040,7 @@ func (m *DelMsgListResp) Reset() { *m = DelMsgListResp{} }
func (m *DelMsgListResp) String() string { return proto.CompactTextString(m) }
func (*DelMsgListResp) ProtoMessage() {}
func (*DelMsgListResp) Descriptor() ([]byte, []int) {
return fileDescriptor_ws_c5c79ae5b343c043, []int{57}
return fileDescriptor_ws_489fb152692e30da, []int{58}
}
func (m *DelMsgListResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DelMsgListResp.Unmarshal(m, b)
@@ -4048,6 +4102,7 @@ func init() {
proto.RegisterType((*MemberKickedTips)(nil), "server_api_params.MemberKickedTips")
proto.RegisterType((*MemberInvitedTips)(nil), "server_api_params.MemberInvitedTips")
proto.RegisterType((*MemberEnterTips)(nil), "server_api_params.MemberEnterTips")
proto.RegisterType((*GroupDismissedTips)(nil), "server_api_params.GroupDismissedTips")
proto.RegisterType((*FriendApplication)(nil), "server_api_params.FriendApplication")
proto.RegisterType((*FromToUserID)(nil), "server_api_params.FromToUserID")
proto.RegisterType((*FriendApplicationTips)(nil), "server_api_params.FriendApplicationTips")
@@ -4082,169 +4137,170 @@ func init() {
proto.RegisterType((*DelMsgListResp)(nil), "server_api_params.DelMsgListResp")
}
func init() { proto.RegisterFile("sdk_ws/ws.proto", fileDescriptor_ws_c5c79ae5b343c043) }
func init() { proto.RegisterFile("sdk_ws/ws.proto", fileDescriptor_ws_489fb152692e30da) }
var fileDescriptor_ws_c5c79ae5b343c043 = []byte{
// 2572 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x6f, 0x24, 0x49,
0xd1, 0xff, 0xaa, 0xda, 0xdd, 0x76, 0x87, 0xdd, 0x7e, 0x94, 0xf7, 0x33, 0xcd, 0x30, 0x3b, 0x98,
0x92, 0xb5, 0x0c, 0x0b, 0x78, 0xd1, 0x20, 0x24, 0x98, 0x85, 0x41, 0x7e, 0xcc, 0x6b, 0xb1, 0x67,
0xbc, 0xd5, 0x33, 0x2c, 0x02, 0xa4, 0x51, 0xba, 0x2b, 0xdd, 0xae, 0x75, 0x75, 0x66, 0x75, 0x3d,
0x3c, 0x63, 0x09, 0x09, 0x09, 0x24, 0xc4, 0x8d, 0x13, 0x5c, 0x91, 0xb8, 0x20, 0x24, 0x84, 0xf6,
0x00, 0xe2, 0x82, 0x38, 0xf1, 0x0f, 0x70, 0xe6, 0xc6, 0x99, 0x2b, 0x07, 0x24, 0x24, 0x50, 0x66,
0x64, 0x55, 0x65, 0x56, 0x75, 0xdb, 0xbd, 0x96, 0xb5, 0x03, 0x1a, 0x6e, 0x1d, 0x51, 0x19, 0x91,
0x91, 0xf1, 0x8b, 0x88, 0x8c, 0xcc, 0x6c, 0x58, 0x4a, 0xfc, 0x93, 0x67, 0xcf, 0x93, 0xb7, 0x9e,
0x27, 0x9b, 0x51, 0xcc, 0x53, 0xee, 0xac, 0x24, 0x34, 0x3e, 0xa5, 0xf1, 0x33, 0x12, 0x05, 0xcf,
0x22, 0x12, 0x93, 0x61, 0xe2, 0xfe, 0xdd, 0x86, 0xf6, 0xfd, 0x98, 0x67, 0xd1, 0x43, 0x76, 0xc4,
0x9d, 0x2e, 0xcc, 0x0e, 0x24, 0xb1, 0xdb, 0xb5, 0xd6, 0xad, 0x9b, 0x6d, 0x2f, 0x27, 0x9d, 0xeb,
0xd0, 0x96, 0x3f, 0x1f, 0x91, 0x21, 0xed, 0xda, 0xf2, 0x5b, 0xc9, 0x70, 0x5c, 0x58, 0x60, 0x3c,
0x0d, 0x8e, 0x82, 0x3e, 0x49, 0x03, 0xce, 0xba, 0x0d, 0x39, 0xc0, 0xe0, 0x89, 0x31, 0x01, 0x4b,
0x63, 0xee, 0x67, 0x7d, 0x39, 0x66, 0x06, 0xc7, 0xe8, 0x3c, 0x31, 0xff, 0x11, 0xe9, 0xd3, 0xa7,
0xde, 0x5e, 0xb7, 0x89, 0xf3, 0x2b, 0xd2, 0x59, 0x87, 0x79, 0xfe, 0x9c, 0xd1, 0xf8, 0x69, 0x42,
0xe3, 0x87, 0xbb, 0xdd, 0x96, 0xfc, 0xaa, 0xb3, 0x9c, 0x1b, 0x00, 0xfd, 0x98, 0x92, 0x94, 0x3e,
0x09, 0x86, 0xb4, 0x3b, 0xbb, 0x6e, 0xdd, 0xec, 0x78, 0x1a, 0x47, 0x68, 0x18, 0xd2, 0xe1, 0x21,
0x8d, 0x77, 0x78, 0xc6, 0xd2, 0xee, 0x9c, 0x1c, 0xa0, 0xb3, 0x9c, 0x45, 0xb0, 0xe9, 0x8b, 0x6e,
0x5b, 0xaa, 0xb6, 0xe9, 0x0b, 0x67, 0x0d, 0x5a, 0x49, 0x4a, 0xd2, 0x2c, 0xe9, 0xc2, 0xba, 0x75,
0xb3, 0xe9, 0x29, 0xca, 0xd9, 0x80, 0x8e, 0xd4, 0xcb, 0x73, 0x6b, 0xe6, 0xa5, 0x88, 0xc9, 0x2c,
0x3c, 0xf6, 0xe4, 0x2c, 0xa2, 0xdd, 0x05, 0xa9, 0xa0, 0x64, 0xb8, 0xbf, 0xb7, 0x61, 0x55, 0xfa,
0x7d, 0x5f, 0x1a, 0x70, 0x2f, 0x0b, 0xc3, 0x0b, 0x10, 0x58, 0x83, 0x56, 0x86, 0xd3, 0xa1, 0xfb,
0x15, 0x25, 0xe6, 0x89, 0x79, 0x48, 0xf7, 0xe8, 0x29, 0x0d, 0xa5, 0xe3, 0x9b, 0x5e, 0xc9, 0x70,
0xae, 0xc1, 0xdc, 0xfb, 0x3c, 0x60, 0xd2, 0x27, 0x33, 0xf2, 0x63, 0x41, 0x8b, 0x6f, 0x2c, 0xe8,
0x9f, 0x30, 0x01, 0x29, 0xba, 0xbb, 0xa0, 0x75, 0x24, 0x5a, 0x26, 0x12, 0x6f, 0xc0, 0x22, 0x89,
0xa2, 0x7d, 0xc2, 0x06, 0x34, 0xc6, 0x49, 0x67, 0xa5, 0xde, 0x0a, 0x57, 0xe0, 0x21, 0x66, 0xea,
0xf1, 0x2c, 0xee, 0x53, 0xe9, 0xee, 0xa6, 0xa7, 0x71, 0x84, 0x1e, 0x1e, 0xd1, 0x58, 0x73, 0x23,
0x7a, 0xbe, 0xc2, 0x55, 0xa8, 0x40, 0x8e, 0x8a, 0xfb, 0x23, 0x0b, 0x16, 0x0f, 0xb2, 0xc3, 0x30,
0xe8, 0xcb, 0x01, 0xc2, 0x69, 0xa5, 0x6b, 0x2c, 0xc3, 0x35, 0xfa, 0x02, 0xed, 0xc9, 0x0b, 0x6c,
0x98, 0x0b, 0x5c, 0x83, 0xd6, 0x80, 0x32, 0x9f, 0xc6, 0xca, 0x61, 0x8a, 0x52, 0x86, 0x34, 0x0b,
0x43, 0x7e, 0x66, 0xc3, 0xdc, 0x47, 0x6c, 0xc2, 0x3a, 0xcc, 0x47, 0xc7, 0x9c, 0xd1, 0x47, 0x99,
0x08, 0x1a, 0x65, 0x8b, 0xce, 0x72, 0x5e, 0x83, 0xe6, 0x61, 0x10, 0xa7, 0xc7, 0x12, 0xb5, 0x8e,
0x87, 0x84, 0xe0, 0xd2, 0x21, 0x09, 0x10, 0xaa, 0xb6, 0x87, 0x84, 0x5a, 0xd0, 0x5c, 0x11, 0xef,
0x66, 0x06, 0xb5, 0x6b, 0x19, 0x54, 0x47, 0x1e, 0xc6, 0x21, 0xef, 0xfe, 0xc3, 0x02, 0xb8, 0x17,
0x07, 0x94, 0xf9, 0xd2, 0x35, 0x95, 0xd4, 0xb5, 0xea, 0xa9, 0xbb, 0x06, 0xad, 0x98, 0x0e, 0x49,
0x7c, 0x92, 0x87, 0x36, 0x52, 0x15, 0x83, 0x1a, 0x35, 0x83, 0xde, 0x06, 0x38, 0x92, 0xf3, 0x08,
0x3d, 0xd2, 0x55, 0xf3, 0xb7, 0x3e, 0xb1, 0x59, 0x2b, 0x72, 0x9b, 0x39, 0x4a, 0x9e, 0x36, 0x5c,
0xe4, 0x0d, 0xf1, 0x7d, 0x15, 0x9e, 0x4d, 0xcc, 0x9b, 0x82, 0x31, 0x26, 0x3a, 0x5b, 0xe7, 0x44,
0xe7, 0x6c, 0x11, 0x14, 0x7f, 0xb3, 0xa0, 0xbd, 0x1d, 0x92, 0xfe, 0xc9, 0x94, 0x4b, 0x37, 0x97,
0x68, 0xd7, 0x96, 0x78, 0x1f, 0x3a, 0x87, 0x42, 0x5d, 0xbe, 0x04, 0xe9, 0x85, 0xf9, 0x5b, 0x9f,
0x1a, 0xb3, 0x4a, 0x33, 0x29, 0x3c, 0x53, 0xce, 0x5c, 0xee, 0xcc, 0xc5, 0xcb, 0x6d, 0x9e, 0xb3,
0xdc, 0x56, 0xb1, 0xdc, 0x3f, 0xdb, 0xb0, 0x20, 0xcb, 0x98, 0x47, 0x47, 0x19, 0x4d, 0x52, 0xe7,
0x6b, 0x30, 0x97, 0xe5, 0xa6, 0x5a, 0xd3, 0x9a, 0x5a, 0x88, 0x38, 0xb7, 0x55, 0xd1, 0x94, 0xf2,
0xb6, 0x94, 0xbf, 0x3e, 0x46, 0xbe, 0xd8, 0xb1, 0xbc, 0x72, 0xb8, 0xd8, 0x60, 0x8e, 0x09, 0xf3,
0x43, 0xea, 0xd1, 0x24, 0x0b, 0x53, 0x55, 0x0b, 0x0d, 0x1e, 0x46, 0xda, 0x68, 0x3f, 0x19, 0xa8,
0xed, 0x47, 0x51, 0xc2, 0x3b, 0x38, 0x4e, 0x7c, 0xc2, 0xa5, 0x97, 0x0c, 0x91, 0xa8, 0x31, 0x1d,
0x49, 0x84, 0x30, 0xad, 0x72, 0xb2, 0x9c, 0x53, 0x79, 0x0d, 0x03, 0xc1, 0xe0, 0x09, 0x88, 0x91,
0x96, 0x0a, 0x70, 0xdf, 0xd1, 0x38, 0xd5, 0x6d, 0xc7, 0xfd, 0x4b, 0x03, 0x3a, 0x98, 0x3e, 0xb9,
0x53, 0x6f, 0x88, 0x38, 0xe7, 0x43, 0x23, 0x8a, 0x34, 0x8e, 0xb0, 0x42, 0x50, 0x8f, 0xcc, 0x42,
0x63, 0xf0, 0x44, 0x28, 0x0a, 0xfa, 0x9e, 0x51, 0x70, 0x74, 0x56, 0x3e, 0xcb, 0x7d, 0xbd, 0xf0,
0x68, 0x1c, 0x51, 0xca, 0x52, 0x6e, 0x44, 0x47, 0x41, 0x0b, 0xd9, 0x94, 0x17, 0xf3, 0x63, 0x7c,
0x68, 0x1c, 0xe1, 0xdf, 0x94, 0xe7, 0x73, 0xa3, 0x93, 0x4a, 0x06, 0x6a, 0x56, 0xf3, 0xe2, 0x46,
0x51, 0xd0, 0x35, 0x54, 0xdb, 0xe7, 0xa2, 0x0a, 0x06, 0xaa, 0x66, 0x72, 0xcd, 0xd7, 0x92, 0x6b,
0x03, 0x3a, 0xa8, 0x27, 0x0f, 0xfa, 0x05, 0xdc, 0xc8, 0x0d, 0xa6, 0x19, 0x1b, 0x9d, 0x6a, 0x6c,
0x98, 0xe8, 0x2e, 0x4e, 0x40, 0x77, 0xa9, 0x40, 0xf7, 0x7b, 0xd0, 0x3d, 0xc8, 0xc2, 0x70, 0x9f,
0x26, 0x09, 0x19, 0xd0, 0xed, 0xb3, 0x1e, 0x1d, 0xed, 0x05, 0x49, 0xea, 0xd1, 0x24, 0x12, 0x71,
0x46, 0xe3, 0x78, 0x87, 0xfb, 0x54, 0x82, 0xdc, 0xf4, 0x72, 0x52, 0xac, 0x90, 0xc6, 0xb1, 0x30,
0x40, 0x55, 0x48, 0xa4, 0x9c, 0x4d, 0x98, 0x09, 0x83, 0x44, 0xc4, 0x7a, 0xe3, 0xe6, 0xfc, 0xad,
0x6b, 0x63, 0x52, 0x65, 0x3f, 0x19, 0xec, 0x92, 0x94, 0x78, 0x72, 0x9c, 0x3b, 0x84, 0x8f, 0x8d,
0x9f, 0x7d, 0x34, 0x71, 0x07, 0x13, 0x35, 0x4c, 0x16, 0x81, 0x80, 0xb3, 0xa2, 0xf9, 0xd0, 0x59,
0xc2, 0xec, 0x04, 0xf5, 0x48, 0x3b, 0x3a, 0x5e, 0x4e, 0xba, 0xaf, 0x81, 0x73, 0x9f, 0xa6, 0xfb,
0xe4, 0xc5, 0x16, 0xf3, 0xf7, 0x03, 0xd6, 0xa3, 0x23, 0x8f, 0x8e, 0xdc, 0xbb, 0xb0, 0x5a, 0xe3,
0x26, 0x91, 0x30, 0x60, 0x48, 0x5e, 0xf4, 0xe8, 0x48, 0x1a, 0xd0, 0xf1, 0x14, 0x25, 0xf9, 0x72,
0x94, 0x2a, 0x8f, 0x8a, 0x72, 0x47, 0xb0, 0x24, 0x10, 0xea, 0x51, 0xe6, 0xef, 0x27, 0x03, 0xa9,
0x62, 0x1d, 0xe6, 0xd1, 0x03, 0xfb, 0xc9, 0xa0, 0xac, 0xb7, 0x1a, 0x4b, 0x8c, 0xe8, 0x87, 0x01,
0x65, 0x29, 0x8e, 0x50, 0xab, 0xd1, 0x58, 0x22, 0x18, 0x13, 0xca, 0xfc, 0x62, 0xcb, 0x69, 0x78,
0x05, 0xed, 0xfe, 0xa1, 0x09, 0xb3, 0xca, 0xa1, 0xb2, 0x3b, 0x14, 0x5b, 0x5c, 0xe1, 0x2f, 0xa4,
0x30, 0x18, 0xfb, 0xa7, 0x65, 0x9f, 0x86, 0x94, 0xde, 0xd9, 0x35, 0xcc, 0xce, 0xae, 0x62, 0xd3,
0x4c, 0xdd, 0xa6, 0xca, 0xba, 0x9a, 0xf5, 0x75, 0xbd, 0x09, 0xcb, 0x89, 0x4c, 0x98, 0x83, 0x90,
0xa4, 0x47, 0x3c, 0x1e, 0xaa, 0x1d, 0xab, 0xe9, 0xd5, 0xf8, 0xa2, 0xd8, 0x23, 0xaf, 0x48, 0x58,
0xcc, 0xc8, 0x0a, 0x57, 0xa4, 0x07, 0x72, 0xf2, 0xc4, 0xc5, 0x56, 0xc1, 0x64, 0xa2, 0x6d, 0x49,
0x12, 0x70, 0x26, 0x3b, 0x5d, 0xcc, 0x4f, 0x9d, 0x25, 0x56, 0x3e, 0x4c, 0x06, 0xf7, 0x62, 0x3e,
0x54, 0x0d, 0x43, 0x4e, 0xca, 0x95, 0x73, 0x96, 0x52, 0x96, 0x4a, 0xd9, 0x79, 0x94, 0xd5, 0x58,
0x42, 0x56, 0x91, 0x32, 0x39, 0x17, 0xbc, 0x9c, 0x74, 0x96, 0xa1, 0x91, 0xd0, 0x91, 0xca, 0x38,
0xf1, 0xd3, 0x40, 0x6e, 0xc9, 0x44, 0xae, 0x52, 0x0a, 0x96, 0xe5, 0x57, 0xbd, 0x14, 0x94, 0xbd,
0xfe, 0x8a, 0xd1, 0xeb, 0x6f, 0xc1, 0x2c, 0x8f, 0x44, 0x9c, 0x27, 0x5d, 0x47, 0xe6, 0xd8, 0xa7,
0x27, 0xe7, 0xd8, 0xe6, 0x63, 0x1c, 0x79, 0x97, 0xa5, 0xf1, 0x99, 0x97, 0xcb, 0x39, 0x7b, 0xb0,
0xc4, 0x8f, 0x8e, 0xc2, 0x80, 0xd1, 0x83, 0x2c, 0x39, 0x96, 0x3b, 0xdb, 0xaa, 0xdc, 0xd9, 0xdc,
0x31, 0xaa, 0x1e, 0x9b, 0x23, 0xbd, 0xaa, 0xe8, 0xb5, 0xdb, 0xb0, 0xa0, 0x4f, 0x23, 0xdc, 0x70,
0x42, 0xcf, 0x54, 0x0c, 0x8a, 0x9f, 0xa2, 0xd9, 0x3b, 0x25, 0x61, 0x86, 0xdb, 0xc0, 0x9c, 0x87,
0xc4, 0x6d, 0xfb, 0xcb, 0x96, 0xfb, 0x53, 0x0b, 0x96, 0x2a, 0x13, 0x88, 0xd1, 0x69, 0x90, 0x86,
0x54, 0x69, 0x40, 0xc2, 0x71, 0x60, 0xc6, 0xa7, 0x49, 0x5f, 0x85, 0xb0, 0xfc, 0xad, 0x2a, 0x59,
0xa3, 0x68, 0x17, 0xc5, 0x81, 0xee, 0x71, 0x4f, 0x28, 0xea, 0xf1, 0x8c, 0xf9, 0xc5, 0x81, 0x4e,
0xe3, 0x89, 0x10, 0x0a, 0x1e, 0xf7, 0xb6, 0x89, 0x3f, 0xa0, 0x78, 0xec, 0x6a, 0x4a, 0x9b, 0x4c,
0xa6, 0xeb, 0xc3, 0xdc, 0x93, 0x20, 0x4a, 0x76, 0xf8, 0x70, 0x28, 0x80, 0xf0, 0x69, 0x2a, 0x7a,
0x55, 0x4b, 0xe2, 0xad, 0x28, 0x11, 0x2a, 0x3e, 0x3d, 0x22, 0x59, 0x98, 0x8a, 0xa1, 0x79, 0xe2,
0x6a, 0x2c, 0x79, 0xe0, 0x48, 0x38, 0xdb, 0x45, 0x69, 0xb4, 0x53, 0xe3, 0xb8, 0x7f, 0xb2, 0x61,
0x59, 0x36, 0x0e, 0x3b, 0x12, 0x76, 0x5f, 0x0a, 0xdd, 0x82, 0xa6, 0x4c, 0x43, 0xd5, 0xac, 0x9c,
0xdf, 0x6c, 0xe0, 0x50, 0xe7, 0x0e, 0xb4, 0x78, 0x24, 0x5b, 0x4e, 0xec, 0x50, 0xde, 0x98, 0x24,
0x64, 0x9e, 0xed, 0x3c, 0x25, 0xe5, 0xdc, 0x03, 0xc0, 0x63, 0xe7, 0x5e, 0x59, 0xba, 0xa7, 0xd5,
0xa1, 0x49, 0x0a, 0xe7, 0x16, 0x65, 0xb8, 0x38, 0xe0, 0x35, 0x3c, 0x93, 0xe9, 0x3c, 0x82, 0x45,
0x69, 0xf6, 0xe3, 0xbc, 0xeb, 0x94, 0x18, 0x4c, 0x3f, 0x63, 0x45, 0xda, 0xfd, 0x85, 0xa5, 0xdc,
0x28, 0xbe, 0xf6, 0x28, 0xfa, 0xbe, 0x74, 0x89, 0x75, 0x29, 0x97, 0x5c, 0x83, 0xb9, 0x61, 0xa6,
0x35, 0xc1, 0x0d, 0xaf, 0xa0, 0x4b, 0x88, 0x1a, 0x53, 0x43, 0xe4, 0xfe, 0xd2, 0x82, 0xee, 0x3b,
0x3c, 0x60, 0xf2, 0xc3, 0x56, 0x14, 0x85, 0xea, 0x16, 0xe2, 0xd2, 0x98, 0x7f, 0x1d, 0xda, 0x04,
0xd5, 0xb0, 0x54, 0xc1, 0x3e, 0x45, 0x63, 0x5b, 0xca, 0x68, 0x3d, 0x4a, 0x43, 0xef, 0x51, 0xdc,
0xdf, 0x58, 0xb0, 0x88, 0x4e, 0x79, 0x37, 0x0b, 0xd2, 0x4b, 0xdb, 0xb7, 0x0d, 0x73, 0xa3, 0x2c,
0x48, 0x2f, 0x11, 0x95, 0x85, 0x5c, 0x3d, 0x9e, 0x1a, 0x63, 0xe2, 0xc9, 0xfd, 0xc0, 0x82, 0xeb,
0x55, 0xb7, 0x6e, 0xf5, 0xfb, 0x34, 0x7a, 0x99, 0x29, 0x65, 0xf4, 0x68, 0x33, 0x95, 0x1e, 0x6d,
0xac, 0xc9, 0x1e, 0x7d, 0x9f, 0xf6, 0xff, 0x73, 0x4d, 0xfe, 0xa1, 0x0d, 0x1f, 0xbf, 0x5f, 0x24,
0xde, 0x93, 0x98, 0xb0, 0xe4, 0x88, 0xc6, 0xf1, 0x4b, 0xb4, 0x77, 0x0f, 0x3a, 0x8c, 0x3e, 0x2f,
0x6d, 0x52, 0xe9, 0x38, 0xad, 0x1a, 0x53, 0x78, 0xba, 0xda, 0xe5, 0xfe, 0xd3, 0x82, 0x65, 0xd4,
0xf3, 0x8d, 0xa0, 0x7f, 0xf2, 0x12, 0x17, 0xff, 0x08, 0x16, 0x4f, 0xa4, 0x05, 0x82, 0xba, 0x44,
0xd9, 0xae, 0x48, 0x4f, 0xb9, 0xfc, 0x7f, 0x59, 0xb0, 0x82, 0x8a, 0x1e, 0xb2, 0xd3, 0xe0, 0x65,
0x06, 0xeb, 0x01, 0x2c, 0x05, 0x68, 0xc2, 0x25, 0x1d, 0x50, 0x15, 0x9f, 0xd2, 0x03, 0xbf, 0xb3,
0x60, 0x09, 0x35, 0xdd, 0x65, 0x29, 0x8d, 0x2f, 0xbd, 0xfe, 0x07, 0x30, 0x4f, 0x59, 0x1a, 0x13,
0x76, 0x99, 0x0a, 0xa9, 0x8b, 0x4e, 0x59, 0x24, 0x4f, 0x60, 0x05, 0x8f, 0xf0, 0x5a, 0xc5, 0x11,
0xbd, 0x2c, 0xf1, 0xb1, 0x3d, 0xb5, 0xa4, 0x50, 0x4e, 0x9a, 0x97, 0x33, 0xea, 0x76, 0xbd, 0xbc,
0x9c, 0xb9, 0x01, 0x40, 0x7c, 0xff, 0x3d, 0x1e, 0xfb, 0x01, 0xcb, 0xb7, 0x0f, 0x8d, 0xe3, 0xbe,
0x03, 0x0b, 0xa2, 0x9b, 0x7e, 0xa2, 0x1d, 0xc6, 0xcf, 0xbd, 0x2e, 0xd0, 0x0f, 0xf2, 0xb6, 0x79,
0x90, 0x77, 0xbf, 0x0b, 0xff, 0x5f, 0x33, 0x5c, 0x7a, 0x7d, 0x07, 0xef, 0x18, 0xf2, 0x49, 0x94,
0xf3, 0x3f, 0x39, 0xc6, 0x85, 0xba, 0x2d, 0x9e, 0x21, 0xe4, 0xfe, 0xc0, 0x82, 0xd7, 0x6b, 0xea,
0xb7, 0xa2, 0x28, 0xe6, 0xa7, 0x2a, 0xb8, 0xaf, 0x62, 0x1a, 0xb3, 0xb4, 0xda, 0xd5, 0xd2, 0x3a,
0xd6, 0x08, 0x63, 0x3b, 0xf8, 0x08, 0x8c, 0xf8, 0x95, 0x05, 0x4b, 0xca, 0x08, 0xdf, 0x57, 0xd3,
0x7e, 0x09, 0x5a, 0x78, 0x3f, 0xa9, 0x26, 0x7c, 0x7d, 0xec, 0x84, 0xf9, 0xbd, 0xaa, 0xa7, 0x06,
0xd7, 0x23, 0xd2, 0x1e, 0xd7, 0x06, 0x7e, 0xa5, 0xa8, 0x00, 0x53, 0xdf, 0x20, 0x2a, 0x01, 0xf7,
0x5b, 0x79, 0x30, 0xef, 0xd2, 0x90, 0x5e, 0xa5, 0x8f, 0xdc, 0xa7, 0xb0, 0x28, 0x2f, 0x4b, 0x4b,
0x1f, 0x5c, 0x89, 0xda, 0xf7, 0x60, 0x59, 0xaa, 0xbd, 0x72, 0x7b, 0x8b, 0xec, 0x10, 0xfe, 0xd9,
0x39, 0x26, 0x6c, 0x70, 0x95, 0xda, 0x3f, 0x0f, 0xab, 0xb9, 0xef, 0x9f, 0x46, 0x7e, 0x71, 0x44,
0x99, 0x70, 0x31, 0xe3, 0x7e, 0x01, 0xd6, 0x76, 0x38, 0x3b, 0xa5, 0x71, 0x22, 0x51, 0x46, 0x91,
0x5c, 0xc2, 0x48, 0x7e, 0x45, 0xb9, 0x3d, 0x58, 0x51, 0x57, 0x8a, 0x07, 0x64, 0x10, 0x30, 0xac,
0x4a, 0x37, 0x00, 0x22, 0x32, 0xc8, 0x9f, 0x14, 0xf0, 0xde, 0x49, 0xe3, 0x88, 0xef, 0xc9, 0x31,
0x7f, 0xae, 0xbe, 0xdb, 0xf8, 0xbd, 0xe4, 0xb8, 0xdf, 0x04, 0xc7, 0xa3, 0x49, 0xc4, 0x59, 0x42,
0x35, 0xad, 0xeb, 0x30, 0xbf, 0x93, 0xc5, 0x31, 0x65, 0x62, 0xaa, 0xfc, 0x7e, 0x5d, 0x67, 0x09,
0xbd, 0xbd, 0x52, 0x2f, 0xde, 0x55, 0x68, 0x1c, 0xf7, 0xe7, 0x0d, 0x68, 0xf7, 0x82, 0x01, 0x23,
0xa1, 0x47, 0x47, 0xce, 0x57, 0xa1, 0x85, 0x3b, 0x88, 0x72, 0xed, 0xb8, 0xb3, 0x33, 0x8e, 0xc6,
0xad, 0xd2, 0xa3, 0xa3, 0x07, 0xff, 0xe7, 0x29, 0x19, 0xe7, 0x5d, 0xe8, 0xe0, 0xaf, 0x87, 0x78,
0x22, 0x50, 0x1b, 0xc0, 0x67, 0x2e, 0x50, 0xa2, 0x46, 0xa3, 0x2e, 0x53, 0x83, 0x30, 0xa8, 0x4f,
0x58, 0x5f, 0xbd, 0xb9, 0x9d, 0x67, 0xd0, 0x8e, 0x1c, 0xa6, 0x0c, 0x42, 0x19, 0x21, 0x4d, 0x64,
0xcf, 0xac, 0x5e, 0x2d, 0x26, 0x4b, 0x63, 0x6b, 0xad, 0xa4, 0x51, 0x46, 0x48, 0x1f, 0x67, 0x6c,
0xf0, 0x34, 0x52, 0x47, 0xb9, 0xc9, 0xd2, 0x0f, 0xe4, 0x30, 0x25, 0x8d, 0x32, 0x42, 0x3a, 0x96,
0xd5, 0x4e, 0x3a, 0xfd, 0x3c, 0x69, 0x2c, 0x8a, 0x4a, 0x1a, 0x65, 0xb6, 0xdb, 0x30, 0x1b, 0x91,
0xb3, 0x90, 0x13, 0xdf, 0xfd, 0x75, 0x03, 0x20, 0x1f, 0x98, 0xc8, 0x1e, 0xc3, 0x80, 0x68, 0xe3,
0x42, 0x88, 0xa2, 0xf0, 0x4c, 0x03, 0xa9, 0x37, 0x1e, 0xa4, 0xcf, 0x4e, 0x0b, 0x12, 0x6a, 0xab,
0xc0, 0x74, 0xa7, 0x02, 0xd3, 0xc6, 0x85, 0x30, 0x29, 0xa3, 0x14, 0x50, 0x77, 0x2a, 0x40, 0x6d,
0x5c, 0x08, 0x94, 0x92, 0x57, 0x50, 0xdd, 0xa9, 0x40, 0xb5, 0x71, 0x21, 0x54, 0x4a, 0x5e, 0x81,
0x75, 0xa7, 0x02, 0xd6, 0xc6, 0x85, 0x60, 0x29, 0xf9, 0x3a, 0x5c, 0x1f, 0xd8, 0xb0, 0x28, 0x5d,
0x86, 0xf7, 0xb6, 0xec, 0x88, 0xcb, 0xeb, 0x19, 0xe9, 0x2e, 0xf3, 0x85, 0xca, 0x64, 0x3a, 0x9f,
0x83, 0x15, 0x64, 0xa8, 0x17, 0x0d, 0xd9, 0xfe, 0xd9, 0xeb, 0x8d, 0x9b, 0x6d, 0xaf, 0xfe, 0x41,
0xde, 0xb4, 0x65, 0x49, 0xca, 0x87, 0xbb, 0x24, 0x25, 0x79, 0xb7, 0x52, 0x72, 0xf4, 0x7b, 0xd0,
0x99, 0xda, 0x0b, 0x77, 0xcc, 0xf9, 0xb0, 0xb8, 0xe0, 0x54, 0x94, 0x90, 0x48, 0x83, 0x21, 0xe5,
0x59, 0xaa, 0xca, 0x44, 0x4e, 0x8a, 0x3d, 0x76, 0x48, 0xfd, 0x80, 0xc8, 0xdb, 0x43, 0xf5, 0xac,
0x50, 0x30, 0x64, 0x65, 0x2b, 0x6f, 0x43, 0xd5, 0x0b, 0x74, 0xc9, 0xb9, 0xf8, 0xe6, 0xd2, 0xfd,
0xab, 0x05, 0xab, 0x07, 0x24, 0x4e, 0x83, 0x7e, 0x10, 0x11, 0x96, 0xee, 0xd3, 0x94, 0xc8, 0x35,
0x18, 0xcf, 0x54, 0xd6, 0x87, 0x7b, 0xa6, 0x3a, 0x80, 0xa5, 0x41, 0xd9, 0x64, 0x6a, 0x0f, 0x5d,
0x53, 0xb7, 0xd2, 0x15, 0x71, 0xe3, 0xcd, 0xad, 0xf1, 0xa1, 0xdf, 0xdc, 0xdc, 0x1f, 0xdb, 0xb0,
0x54, 0x29, 0x9d, 0xa2, 0x45, 0xc4, 0xcd, 0xbf, 0x88, 0x89, 0x82, 0x76, 0xb6, 0x00, 0x82, 0x22,
0x8c, 0xce, 0xb9, 0x0b, 0x31, 0x63, 0xcd, 0xd3, 0x84, 0xc6, 0x5d, 0x89, 0x36, 0x2e, 0x7d, 0x25,
0x2a, 0x9a, 0xfb, 0xa8, 0x04, 0x49, 0x25, 0xea, 0x38, 0x6f, 0x8e, 0x81, 0xd2, 0xd3, 0x45, 0xdd,
0xef, 0xc0, 0x4a, 0xad, 0x42, 0xc9, 0x1b, 0x52, 0x7e, 0x42, 0x59, 0x71, 0x43, 0x2a, 0x08, 0x2d,
0x58, 0xed, 0x6a, 0xb0, 0x86, 0xc1, 0xa9, 0xfe, 0xa8, 0xaf, 0x48, 0xf7, 0x27, 0x36, 0xac, 0x8d,
0xdf, 0x5d, 0x5e, 0x55, 0x77, 0x1f, 0x42, 0x77, 0x52, 0x25, 0xbf, 0x32, 0xaf, 0x97, 0xd1, 0x5d,
0xec, 0xc3, 0xaf, 0xaa, 0xbb, 0x57, 0xf3, 0xe8, 0xd6, 0xb6, 0x3a, 0xf7, 0xb7, 0x85, 0x7f, 0x8a,
0x4e, 0xe3, 0x15, 0xf5, 0x8f, 0xf3, 0x26, 0x2c, 0xe3, 0x32, 0xb5, 0x37, 0x34, 0x6c, 0x5c, 0x6b,
0xfc, 0xb2, 0x52, 0x68, 0xdb, 0xfe, 0x95, 0xc5, 0xec, 0x1f, 0xad, 0x1c, 0x93, 0xa2, 0x7f, 0xfb,
0xaf, 0xc2, 0xa4, 0x8c, 0x34, 0xad, 0xa9, 0xd1, 0x22, 0xad, 0xe8, 0x2b, 0xff, 0x17, 0x69, 0x17,
0x47, 0x5a, 0xe1, 0x4b, 0xad, 0xc1, 0x73, 0xbf, 0x0f, 0x9d, 0x5d, 0x1a, 0xee, 0x27, 0x83, 0xfc,
0xf5, 0xfe, 0x3c, 0x47, 0x4e, 0xfa, 0xe7, 0xe0, 0xc4, 0x77, 0xfb, 0xea, 0x9b, 0xff, 0x4c, 0xed,
0xcd, 0xdf, 0xdd, 0x86, 0x45, 0xdd, 0x80, 0xcb, 0xfc, 0x79, 0x61, 0xfb, 0xfa, 0xb7, 0xaf, 0x6d,
0xbe, 0x85, 0xff, 0x51, 0x7d, 0xbb, 0xe6, 0xc4, 0xc3, 0x96, 0xfc, 0xcf, 0xea, 0x17, 0xff, 0x1d,
0x00, 0x00, 0xff, 0xff, 0x62, 0x4e, 0xe4, 0x43, 0xc6, 0x2a, 0x00, 0x00,
var fileDescriptor_ws_489fb152692e30da = []byte{
// 2589 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0xe4, 0x48,
0x15, 0xc7, 0xee, 0x74, 0x27, 0xfd, 0x92, 0x4e, 0x27, 0xce, 0x12, 0x9a, 0x61, 0x76, 0x08, 0x56,
0xb4, 0x0c, 0x0b, 0x64, 0xd1, 0x20, 0x24, 0xd8, 0x85, 0x41, 0xf9, 0x98, 0xaf, 0x25, 0x3d, 0x93,
0x75, 0xcf, 0xb0, 0x08, 0x90, 0x46, 0x95, 0x76, 0xa5, 0xe3, 0x8d, 0x5d, 0xe5, 0x76, 0xd9, 0x99,
0x89, 0x84, 0x84, 0x04, 0x12, 0xe2, 0xc6, 0x09, 0xae, 0x48, 0x5c, 0x10, 0x12, 0x5a, 0xed, 0x01,
0xc4, 0x05, 0x71, 0xe2, 0x1f, 0xe0, 0xcc, 0x8d, 0x33, 0x57, 0x0e, 0x48, 0x48, 0xa0, 0xfa, 0xb0,
0x5d, 0x65, 0x77, 0x27, 0xbd, 0x51, 0xb4, 0x03, 0x1a, 0x6e, 0xfd, 0x9e, 0xeb, 0xbd, 0x7a, 0xf5,
0x7e, 0xef, 0xbd, 0x7a, 0x7e, 0x6e, 0xe8, 0x32, 0xff, 0xe4, 0xe9, 0x33, 0xf6, 0xc6, 0x33, 0xb6,
0x15, 0x27, 0x34, 0xa5, 0xce, 0x2a, 0xc3, 0xc9, 0x29, 0x4e, 0x9e, 0xa2, 0x38, 0x78, 0x1a, 0xa3,
0x04, 0x45, 0xcc, 0xfd, 0x87, 0x0d, 0xed, 0x7b, 0x09, 0xcd, 0xe2, 0x07, 0xe4, 0x88, 0x3a, 0x3d,
0x98, 0x1f, 0x09, 0x62, 0xaf, 0x67, 0x6d, 0x58, 0x37, 0xdb, 0x5e, 0x4e, 0x3a, 0xd7, 0xa1, 0x2d,
0x7e, 0x3e, 0x44, 0x11, 0xee, 0xd9, 0xe2, 0x59, 0xc9, 0x70, 0x5c, 0x58, 0x22, 0x34, 0x0d, 0x8e,
0x82, 0x21, 0x4a, 0x03, 0x4a, 0x7a, 0x0d, 0xb1, 0xc0, 0xe0, 0xf1, 0x35, 0x01, 0x49, 0x13, 0xea,
0x67, 0x43, 0xb1, 0x66, 0x4e, 0xae, 0xd1, 0x79, 0x7c, 0xff, 0x23, 0x34, 0xc4, 0x4f, 0xbc, 0xfd,
0x5e, 0x53, 0xee, 0xaf, 0x48, 0x67, 0x03, 0x16, 0xe9, 0x33, 0x82, 0x93, 0x27, 0x0c, 0x27, 0x0f,
0xf6, 0x7a, 0x2d, 0xf1, 0x54, 0x67, 0x39, 0x37, 0x00, 0x86, 0x09, 0x46, 0x29, 0x7e, 0x1c, 0x44,
0xb8, 0x37, 0xbf, 0x61, 0xdd, 0xec, 0x78, 0x1a, 0x87, 0x6b, 0x88, 0x70, 0x74, 0x88, 0x93, 0x5d,
0x9a, 0x91, 0xb4, 0xb7, 0x20, 0x16, 0xe8, 0x2c, 0x67, 0x19, 0x6c, 0xfc, 0xbc, 0xd7, 0x16, 0xaa,
0x6d, 0xfc, 0xdc, 0x59, 0x87, 0x16, 0x4b, 0x51, 0x9a, 0xb1, 0x1e, 0x6c, 0x58, 0x37, 0x9b, 0x9e,
0xa2, 0x9c, 0x4d, 0xe8, 0x08, 0xbd, 0x34, 0xb7, 0x66, 0x51, 0x88, 0x98, 0xcc, 0xc2, 0x63, 0x8f,
0xcf, 0x62, 0xdc, 0x5b, 0x12, 0x0a, 0x4a, 0x86, 0xfb, 0x07, 0x1b, 0xd6, 0x84, 0xdf, 0xfb, 0xc2,
0x80, 0xbb, 0x59, 0x18, 0x5e, 0x80, 0xc0, 0x3a, 0xb4, 0x32, 0xb9, 0x9d, 0x74, 0xbf, 0xa2, 0xf8,
0x3e, 0x09, 0x0d, 0xf1, 0x3e, 0x3e, 0xc5, 0xa1, 0x70, 0x7c, 0xd3, 0x2b, 0x19, 0xce, 0x35, 0x58,
0x78, 0x8f, 0x06, 0x44, 0xf8, 0x64, 0x4e, 0x3c, 0x2c, 0x68, 0xfe, 0x8c, 0x04, 0xc3, 0x13, 0xc2,
0x21, 0x95, 0xee, 0x2e, 0x68, 0x1d, 0x89, 0x96, 0x89, 0xc4, 0x6b, 0xb0, 0x8c, 0xe2, 0xb8, 0x8f,
0xc8, 0x08, 0x27, 0x72, 0xd3, 0x79, 0xa1, 0xb7, 0xc2, 0xe5, 0x78, 0xf0, 0x9d, 0x06, 0x34, 0x4b,
0x86, 0x58, 0xb8, 0xbb, 0xe9, 0x69, 0x1c, 0xae, 0x87, 0xc6, 0x38, 0xd1, 0xdc, 0x28, 0x3d, 0x5f,
0xe1, 0x2a, 0x54, 0x20, 0x47, 0xc5, 0xfd, 0x89, 0x05, 0xcb, 0x07, 0xd9, 0x61, 0x18, 0x0c, 0xc5,
0x02, 0xee, 0xb4, 0xd2, 0x35, 0x96, 0xe1, 0x1a, 0xfd, 0x80, 0xf6, 0xf4, 0x03, 0x36, 0xcc, 0x03,
0xae, 0x43, 0x6b, 0x84, 0x89, 0x8f, 0x13, 0xe5, 0x30, 0x45, 0x29, 0x43, 0x9a, 0x85, 0x21, 0xbf,
0xb0, 0x61, 0xe1, 0x23, 0x36, 0x61, 0x03, 0x16, 0xe3, 0x63, 0x4a, 0xf0, 0xc3, 0x8c, 0x07, 0x8d,
0xb2, 0x45, 0x67, 0x39, 0xaf, 0x40, 0xf3, 0x30, 0x48, 0xd2, 0x63, 0x81, 0x5a, 0xc7, 0x93, 0x04,
0xe7, 0xe2, 0x08, 0x05, 0x12, 0xaa, 0xb6, 0x27, 0x09, 0x75, 0xa0, 0x85, 0x22, 0xde, 0xcd, 0x0c,
0x6a, 0xd7, 0x32, 0xa8, 0x8e, 0x3c, 0x4c, 0x42, 0xde, 0xfd, 0xa7, 0x05, 0x70, 0x37, 0x09, 0x30,
0xf1, 0x85, 0x6b, 0x2a, 0xa9, 0x6b, 0xd5, 0x53, 0x77, 0x1d, 0x5a, 0x09, 0x8e, 0x50, 0x72, 0x92,
0x87, 0xb6, 0xa4, 0x2a, 0x06, 0x35, 0x6a, 0x06, 0xbd, 0x05, 0x70, 0x24, 0xf6, 0xe1, 0x7a, 0x84,
0xab, 0x16, 0x6f, 0x7d, 0x6a, 0xab, 0x56, 0xe4, 0xb6, 0x72, 0x94, 0x3c, 0x6d, 0x39, 0xcf, 0x1b,
0xe4, 0xfb, 0x2a, 0x3c, 0x9b, 0x32, 0x6f, 0x0a, 0xc6, 0x84, 0xe8, 0x6c, 0x9d, 0x13, 0x9d, 0xf3,
0x45, 0x50, 0xfc, 0xdd, 0x82, 0xf6, 0x4e, 0x88, 0x86, 0x27, 0x33, 0x1e, 0xdd, 0x3c, 0xa2, 0x5d,
0x3b, 0xe2, 0x3d, 0xe8, 0x1c, 0x72, 0x75, 0xf9, 0x11, 0x84, 0x17, 0x16, 0x6f, 0x7d, 0x66, 0xc2,
0x29, 0xcd, 0xa4, 0xf0, 0x4c, 0x39, 0xf3, 0xb8, 0x73, 0x17, 0x1f, 0xb7, 0x79, 0xce, 0x71, 0x5b,
0xc5, 0x71, 0xff, 0x62, 0xc3, 0x92, 0x28, 0x63, 0x1e, 0x1e, 0x67, 0x98, 0xa5, 0xce, 0x37, 0x60,
0x21, 0xcb, 0x4d, 0xb5, 0x66, 0x35, 0xb5, 0x10, 0x71, 0xde, 0x54, 0x45, 0x53, 0xc8, 0xdb, 0x42,
0xfe, 0xfa, 0x04, 0xf9, 0xe2, 0xc6, 0xf2, 0xca, 0xe5, 0xfc, 0x82, 0x39, 0x46, 0xc4, 0x0f, 0xb1,
0x87, 0x59, 0x16, 0xa6, 0xaa, 0x16, 0x1a, 0x3c, 0x19, 0x69, 0xe3, 0x3e, 0x1b, 0xa9, 0xeb, 0x47,
0x51, 0xdc, 0x3b, 0x72, 0x1d, 0x7f, 0x24, 0x8f, 0x5e, 0x32, 0x78, 0xa2, 0x26, 0x78, 0x2c, 0x10,
0x92, 0x69, 0x95, 0x93, 0xe5, 0x9e, 0xca, 0x6b, 0x32, 0x10, 0x0c, 0x1e, 0x87, 0x58, 0xd2, 0x42,
0x81, 0xbc, 0x77, 0x34, 0x4e, 0xf5, 0xda, 0x71, 0xff, 0xda, 0x80, 0x8e, 0x4c, 0x9f, 0xdc, 0xa9,
0x37, 0x78, 0x9c, 0xd3, 0xc8, 0x88, 0x22, 0x8d, 0xc3, 0xad, 0xe0, 0xd4, 0x43, 0xb3, 0xd0, 0x18,
0x3c, 0x1e, 0x8a, 0x9c, 0xbe, 0x6b, 0x14, 0x1c, 0x9d, 0x95, 0xef, 0x72, 0x4f, 0x2f, 0x3c, 0x1a,
0x87, 0x97, 0xb2, 0x94, 0x1a, 0xd1, 0x51, 0xd0, 0x5c, 0x36, 0xa5, 0xc5, 0xfe, 0x32, 0x3e, 0x34,
0x0e, 0xf7, 0x6f, 0x4a, 0xf3, 0xbd, 0xa5, 0x93, 0x4a, 0x86, 0xd4, 0xac, 0xf6, 0x95, 0x17, 0x45,
0x41, 0xd7, 0x50, 0x6d, 0x9f, 0x8b, 0x2a, 0x18, 0xa8, 0x9a, 0xc9, 0xb5, 0x58, 0x4b, 0xae, 0x4d,
0xe8, 0x48, 0x3d, 0x79, 0xd0, 0x2f, 0xc9, 0x8b, 0xdc, 0x60, 0x9a, 0xb1, 0xd1, 0xa9, 0xc6, 0x86,
0x89, 0xee, 0xf2, 0x14, 0x74, 0xbb, 0x05, 0xba, 0x3f, 0x80, 0xde, 0x41, 0x16, 0x86, 0x7d, 0xcc,
0x18, 0x1a, 0xe1, 0x9d, 0xb3, 0x01, 0x1e, 0xef, 0x07, 0x2c, 0xf5, 0x30, 0x8b, 0x79, 0x9c, 0xe1,
0x24, 0xd9, 0xa5, 0x3e, 0x16, 0x20, 0x37, 0xbd, 0x9c, 0xe4, 0x27, 0xc4, 0x49, 0xc2, 0x0d, 0x50,
0x15, 0x52, 0x52, 0xce, 0x16, 0xcc, 0x85, 0x01, 0xe3, 0xb1, 0xde, 0xb8, 0xb9, 0x78, 0xeb, 0xda,
0x84, 0x54, 0xe9, 0xb3, 0xd1, 0x1e, 0x4a, 0x91, 0x27, 0xd6, 0xb9, 0x11, 0x7c, 0x62, 0xf2, 0xee,
0xe3, 0xa9, 0x37, 0x18, 0xaf, 0x61, 0xa2, 0x08, 0x04, 0x94, 0x14, 0xcd, 0x87, 0xce, 0xe2, 0x66,
0x33, 0xa9, 0x47, 0xd8, 0xd1, 0xf1, 0x72, 0xd2, 0x7d, 0x05, 0x9c, 0x7b, 0x38, 0xed, 0xa3, 0xe7,
0xdb, 0xc4, 0xef, 0x07, 0x64, 0x80, 0xc7, 0x1e, 0x1e, 0xbb, 0x77, 0x60, 0xad, 0xc6, 0x65, 0x31,
0x37, 0x20, 0x42, 0xcf, 0x07, 0x78, 0x2c, 0x0c, 0xe8, 0x78, 0x8a, 0x12, 0x7c, 0xb1, 0x4a, 0x95,
0x47, 0x45, 0xb9, 0x63, 0xe8, 0x72, 0x84, 0x06, 0x98, 0xf8, 0x7d, 0x36, 0x12, 0x2a, 0x36, 0x60,
0x51, 0x7a, 0xa0, 0xcf, 0x46, 0x65, 0xbd, 0xd5, 0x58, 0x7c, 0xc5, 0x30, 0x0c, 0x30, 0x49, 0xe5,
0x0a, 0x75, 0x1a, 0x8d, 0xc5, 0x83, 0x91, 0x61, 0xe2, 0x17, 0x57, 0x4e, 0xc3, 0x2b, 0x68, 0xf7,
0x8f, 0x4d, 0x98, 0x57, 0x0e, 0x15, 0xdd, 0x21, 0xbf, 0xe2, 0x0a, 0x7f, 0x49, 0x4a, 0x06, 0xe3,
0xf0, 0xb4, 0xec, 0xd3, 0x24, 0xa5, 0x77, 0x76, 0x0d, 0xb3, 0xb3, 0xab, 0xd8, 0x34, 0x57, 0xb7,
0xa9, 0x72, 0xae, 0x66, 0xfd, 0x5c, 0xaf, 0xc3, 0x0a, 0x13, 0x09, 0x73, 0x10, 0xa2, 0xf4, 0x88,
0x26, 0x91, 0xba, 0xb1, 0x9a, 0x5e, 0x8d, 0xcf, 0x8b, 0xbd, 0xe4, 0x15, 0x09, 0x2b, 0x33, 0xb2,
0xc2, 0xe5, 0xe9, 0x21, 0x39, 0x79, 0xe2, 0xca, 0x56, 0xc1, 0x64, 0x4a, 0xdb, 0x18, 0x0b, 0x28,
0x11, 0x9d, 0xae, 0xcc, 0x4f, 0x9d, 0xc5, 0x4f, 0x1e, 0xb1, 0xd1, 0xdd, 0x84, 0x46, 0xaa, 0x61,
0xc8, 0x49, 0x71, 0x72, 0x4a, 0x52, 0x4c, 0x52, 0x21, 0xbb, 0x28, 0x65, 0x35, 0x16, 0x97, 0x55,
0xa4, 0x48, 0xce, 0x25, 0x2f, 0x27, 0x9d, 0x15, 0x68, 0x30, 0x3c, 0x56, 0x19, 0xc7, 0x7f, 0x1a,
0xc8, 0x75, 0x4d, 0xe4, 0x2a, 0xa5, 0x60, 0x45, 0x3c, 0xd5, 0x4b, 0x41, 0xd9, 0xeb, 0xaf, 0x1a,
0xbd, 0xfe, 0x36, 0xcc, 0xd3, 0x98, 0xc7, 0x39, 0xeb, 0x39, 0x22, 0xc7, 0x3e, 0x3b, 0x3d, 0xc7,
0xb6, 0x1e, 0xc9, 0x95, 0x77, 0x48, 0x9a, 0x9c, 0x79, 0xb9, 0x9c, 0xb3, 0x0f, 0x5d, 0x7a, 0x74,
0x14, 0x06, 0x04, 0x1f, 0x64, 0xec, 0x58, 0xdc, 0x6c, 0x6b, 0xe2, 0x66, 0x73, 0x27, 0xa8, 0x7a,
0x64, 0xae, 0xf4, 0xaa, 0xa2, 0xd7, 0xde, 0x84, 0x25, 0x7d, 0x1b, 0xee, 0x86, 0x13, 0x7c, 0xa6,
0x62, 0x90, 0xff, 0xe4, 0xcd, 0xde, 0x29, 0x0a, 0x33, 0x79, 0x0d, 0x2c, 0x78, 0x92, 0x78, 0xd3,
0xfe, 0xaa, 0xe5, 0xfe, 0xdc, 0x82, 0x6e, 0x65, 0x03, 0xbe, 0x3a, 0x0d, 0xd2, 0x10, 0x2b, 0x0d,
0x92, 0x70, 0x1c, 0x98, 0xf3, 0x31, 0x1b, 0xaa, 0x10, 0x16, 0xbf, 0x55, 0x25, 0x6b, 0x14, 0xed,
0x22, 0x7f, 0xa1, 0x7b, 0x34, 0xe0, 0x8a, 0x06, 0x34, 0x23, 0x7e, 0xf1, 0x42, 0xa7, 0xf1, 0x78,
0x08, 0x05, 0x8f, 0x06, 0x3b, 0xc8, 0x1f, 0x61, 0xf9, 0xda, 0xd5, 0x14, 0x36, 0x99, 0x4c, 0xd7,
0x87, 0x85, 0xc7, 0x41, 0xcc, 0x76, 0x69, 0x14, 0x71, 0x20, 0x7c, 0x9c, 0xf2, 0x5e, 0xd5, 0x12,
0x78, 0x2b, 0x8a, 0x87, 0x8a, 0x8f, 0x8f, 0x50, 0x16, 0xa6, 0x7c, 0x69, 0x9e, 0xb8, 0x1a, 0x4b,
0xbc, 0x70, 0x30, 0x4a, 0xf6, 0xa4, 0xb4, 0xb4, 0x53, 0xe3, 0xb8, 0x7f, 0xb6, 0x61, 0x45, 0x34,
0x0e, 0xbb, 0x02, 0x76, 0x5f, 0x08, 0xdd, 0x82, 0xa6, 0x48, 0x43, 0xd5, 0xac, 0x9c, 0xdf, 0x6c,
0xc8, 0xa5, 0xce, 0x6d, 0x68, 0xd1, 0x58, 0xb4, 0x9c, 0xb2, 0x43, 0x79, 0x6d, 0x9a, 0x90, 0xf9,
0x6e, 0xe7, 0x29, 0x29, 0xe7, 0x2e, 0x80, 0x7c, 0xed, 0xdc, 0x2f, 0x4b, 0xf7, 0xac, 0x3a, 0x34,
0x49, 0xee, 0xdc, 0xa2, 0x0c, 0x17, 0x2f, 0x78, 0x0d, 0xcf, 0x64, 0x3a, 0x0f, 0x61, 0x59, 0x98,
0xfd, 0x28, 0xef, 0x3a, 0x05, 0x06, 0xb3, 0xef, 0x58, 0x91, 0x76, 0x7f, 0x65, 0x29, 0x37, 0xf2,
0xa7, 0x03, 0x2c, 0x7d, 0x5f, 0xba, 0xc4, 0xba, 0x94, 0x4b, 0xae, 0xc1, 0x42, 0x94, 0x69, 0x4d,
0x70, 0xc3, 0x2b, 0xe8, 0x12, 0xa2, 0xc6, 0xcc, 0x10, 0xb9, 0xbf, 0xb6, 0xa0, 0xf7, 0x36, 0x0d,
0x88, 0x78, 0xb0, 0x1d, 0xc7, 0xa1, 0x9a, 0x42, 0x5c, 0x1a, 0xf3, 0x6f, 0x42, 0x1b, 0x49, 0x35,
0x24, 0x55, 0xb0, 0xcf, 0xd0, 0xd8, 0x96, 0x32, 0x5a, 0x8f, 0xd2, 0xd0, 0x7b, 0x14, 0xf7, 0x7d,
0x0b, 0x96, 0xa5, 0x53, 0xde, 0xc9, 0x82, 0xf4, 0xd2, 0xf6, 0xed, 0xc0, 0xc2, 0x38, 0x0b, 0xd2,
0x4b, 0x44, 0x65, 0x21, 0x57, 0x8f, 0xa7, 0xc6, 0x84, 0x78, 0x72, 0x3f, 0xb0, 0xe0, 0x7a, 0xd5,
0xad, 0xdb, 0xc3, 0x21, 0x8e, 0x5f, 0x64, 0x4a, 0x19, 0x3d, 0xda, 0x5c, 0xa5, 0x47, 0x9b, 0x68,
0xb2, 0x87, 0xdf, 0xc3, 0xc3, 0xff, 0x5e, 0x93, 0x7f, 0x6c, 0xc3, 0x27, 0xef, 0x15, 0x89, 0xf7,
0x38, 0x41, 0x84, 0x1d, 0xe1, 0x24, 0x79, 0x81, 0xf6, 0xee, 0x43, 0x87, 0xe0, 0x67, 0xa5, 0x4d,
0x2a, 0x1d, 0x67, 0x55, 0x63, 0x0a, 0xcf, 0x56, 0xbb, 0xdc, 0x7f, 0x59, 0xb0, 0x22, 0xf5, 0x7c,
0x2b, 0x18, 0x9e, 0xbc, 0xc0, 0xc3, 0x3f, 0x84, 0xe5, 0x13, 0x61, 0x01, 0xa7, 0x2e, 0x51, 0xb6,
0x2b, 0xd2, 0x33, 0x1e, 0xff, 0xdf, 0x16, 0xac, 0x4a, 0x45, 0x0f, 0xc8, 0x69, 0xf0, 0x22, 0x83,
0xf5, 0x00, 0xba, 0x81, 0x34, 0xe1, 0x92, 0x0e, 0xa8, 0x8a, 0xcf, 0xe8, 0x81, 0xdf, 0x5b, 0xd0,
0x95, 0x9a, 0xee, 0x90, 0x14, 0x27, 0x97, 0x3e, 0xff, 0x7d, 0x58, 0xc4, 0x24, 0x4d, 0x10, 0xb9,
0x4c, 0x85, 0xd4, 0x45, 0x67, 0x2c, 0x92, 0xef, 0x5b, 0xe0, 0x08, 0x55, 0x7b, 0x01, 0x8b, 0x02,
0xc6, 0x5e, 0x20, 0x74, 0xb3, 0x19, 0x7c, 0x02, 0xab, 0x72, 0xe6, 0xa0, 0x95, 0x48, 0xde, 0x7c,
0x23, 0x5f, 0xf6, 0xd3, 0x96, 0x10, 0xca, 0x49, 0x73, 0x9a, 0xa4, 0x3e, 0x07, 0x94, 0xd3, 0xa4,
0x1b, 0x00, 0xc8, 0xf7, 0xdf, 0xa5, 0x89, 0x1f, 0x90, 0xfc, 0xbe, 0xd3, 0x38, 0xee, 0xdb, 0xb0,
0xc4, 0xdb, 0xff, 0xc7, 0xda, 0xf4, 0xe0, 0xdc, 0xf9, 0x86, 0x3e, 0x79, 0xb0, 0xcd, 0xc9, 0x83,
0xfb, 0x7d, 0xf8, 0x78, 0xcd, 0x70, 0xe1, 0xeb, 0x5d, 0x39, 0x14, 0xc9, 0x37, 0x51, 0x2e, 0xff,
0xf4, 0x04, 0xef, 0xe9, 0xb6, 0x78, 0x86, 0x90, 0xfb, 0x23, 0x0b, 0x5e, 0xad, 0xa9, 0xdf, 0x8e,
0xe3, 0x84, 0x9e, 0x2a, 0x48, 0xaf, 0x62, 0x1b, 0xf3, 0x2e, 0xb0, 0xab, 0x77, 0xc1, 0x44, 0x23,
0x8c, 0xfb, 0xeb, 0x23, 0x30, 0xe2, 0x37, 0x16, 0x74, 0x95, 0x11, 0xbe, 0xaf, 0xb6, 0xfd, 0x0a,
0xb4, 0xe4, 0x40, 0x55, 0x6d, 0xf8, 0xea, 0xc4, 0x0d, 0xf3, 0x41, 0xb0, 0xa7, 0x16, 0xd7, 0x23,
0xd2, 0x9e, 0xd4, 0xb7, 0x7e, 0xad, 0x88, 0xfb, 0x99, 0x47, 0x9e, 0x4a, 0xc0, 0xfd, 0x4e, 0x1e,
0xcc, 0x7b, 0x38, 0xc4, 0x57, 0xe9, 0x23, 0xf7, 0x09, 0x2c, 0x8b, 0xe9, 0x6e, 0xe9, 0x83, 0x2b,
0x51, 0xfb, 0x2e, 0xac, 0x08, 0xb5, 0x57, 0x6e, 0x6f, 0x91, 0x1d, 0xdc, 0x3f, 0xbb, 0xc7, 0x88,
0x8c, 0xae, 0x52, 0xfb, 0x17, 0x61, 0x2d, 0xf7, 0xfd, 0x93, 0xd8, 0x2f, 0xde, 0xa9, 0xa6, 0x4c,
0x92, 0xdc, 0x2f, 0xc1, 0xfa, 0x2e, 0x25, 0xa7, 0x38, 0x61, 0x02, 0x65, 0x29, 0x92, 0x4b, 0x18,
0xc9, 0xaf, 0x28, 0x77, 0x00, 0xab, 0x6a, 0x06, 0x7a, 0x80, 0x46, 0x01, 0x91, 0x55, 0xe9, 0x06,
0x40, 0x8c, 0x46, 0xf9, 0x37, 0x10, 0x39, 0x28, 0xd3, 0x38, 0xfc, 0x39, 0x3b, 0xa6, 0xcf, 0xd4,
0x73, 0x5b, 0x3e, 0x2f, 0x39, 0xee, 0xb7, 0xc1, 0xf1, 0x30, 0x8b, 0x29, 0x61, 0x58, 0xd3, 0xba,
0x01, 0x8b, 0xbb, 0x59, 0x92, 0x60, 0xc2, 0xb7, 0xca, 0x3f, 0x08, 0xe8, 0x2c, 0xae, 0x77, 0x50,
0xea, 0x95, 0xc3, 0x15, 0x8d, 0xe3, 0xfe, 0xb2, 0x01, 0xed, 0x41, 0x30, 0x22, 0x28, 0xf4, 0xf0,
0xd8, 0xf9, 0x3a, 0xb4, 0xe4, 0x95, 0xa7, 0x5c, 0x3b, 0xe9, 0x65, 0x5f, 0xae, 0x96, 0x77, 0xbb,
0x87, 0xc7, 0xf7, 0x3f, 0xe6, 0x29, 0x19, 0xe7, 0x1d, 0xe8, 0xc8, 0x5f, 0x0f, 0xe4, 0x2b, 0x8c,
0xaa, 0xfd, 0x9f, 0xbb, 0x40, 0x89, 0x5a, 0x2d, 0x75, 0x99, 0x1a, 0xb8, 0x41, 0x43, 0x44, 0x86,
0xea, 0x23, 0xe1, 0x79, 0x06, 0xed, 0x8a, 0x65, 0xca, 0x20, 0x29, 0xc3, 0xa5, 0x91, 0x68, 0xf2,
0xd5, 0x67, 0x96, 0xe9, 0xd2, 0xf2, 0x5d, 0x40, 0x49, 0x4b, 0x19, 0x2e, 0x7d, 0x9c, 0x91, 0xd1,
0x93, 0x58, 0xbd, 0x7b, 0x4e, 0x97, 0xbe, 0x2f, 0x96, 0x29, 0x69, 0x29, 0xc3, 0xa5, 0x13, 0x51,
0xed, 0x84, 0xd3, 0xcf, 0x93, 0x96, 0x45, 0x51, 0x49, 0x4b, 0x99, 0x9d, 0x36, 0xcc, 0xc7, 0xe8,
0x2c, 0xa4, 0xc8, 0x77, 0x7f, 0xdb, 0x00, 0xc8, 0x17, 0x32, 0x71, 0xb3, 0x1a, 0x10, 0x6d, 0x5e,
0x08, 0x51, 0x1c, 0x9e, 0x69, 0x20, 0x0d, 0x26, 0x83, 0xf4, 0xf9, 0x59, 0x41, 0x92, 0xda, 0x2a,
0x30, 0xdd, 0xae, 0xc0, 0xb4, 0x79, 0x21, 0x4c, 0xca, 0x28, 0x05, 0xd4, 0xed, 0x0a, 0x50, 0x9b,
0x17, 0x02, 0xa5, 0xe4, 0x15, 0x54, 0xb7, 0x2b, 0x50, 0x6d, 0x5e, 0x08, 0x95, 0x92, 0x57, 0x60,
0xdd, 0xae, 0x80, 0xb5, 0x79, 0x21, 0x58, 0x4a, 0xbe, 0x0e, 0xd7, 0x07, 0x36, 0x2c, 0x0b, 0x97,
0xc9, 0x41, 0x33, 0x39, 0xa2, 0x62, 0x9e, 0x24, 0xdc, 0x65, 0x7e, 0x52, 0x33, 0x99, 0xce, 0x17,
0x60, 0x55, 0x32, 0xd4, 0x27, 0x18, 0xd1, 0xaf, 0xda, 0x1b, 0x8d, 0x9b, 0x6d, 0xaf, 0xfe, 0x40,
0x8c, 0x06, 0x33, 0x96, 0xd2, 0x68, 0x0f, 0xa5, 0x28, 0xef, 0x56, 0x4a, 0x8e, 0x3e, 0xb8, 0x9d,
0xab, 0x7d, 0x92, 0x4f, 0x28, 0x8d, 0x8a, 0x89, 0xac, 0xa2, 0xb8, 0x44, 0x1a, 0x44, 0x98, 0x66,
0xa9, 0x2a, 0x13, 0x39, 0xc9, 0xef, 0xd8, 0x08, 0xfb, 0x01, 0x12, 0xe3, 0x4e, 0xf5, 0x1d, 0xa4,
0x60, 0x88, 0xca, 0x56, 0x8e, 0x6f, 0xd5, 0x27, 0xf3, 0x92, 0x73, 0xf1, 0xa8, 0xd5, 0xfd, 0x9b,
0x05, 0x6b, 0x07, 0x28, 0x49, 0x83, 0x61, 0x10, 0x23, 0x92, 0xf6, 0x71, 0x8a, 0xc4, 0x19, 0x8c,
0xef, 0x6a, 0xd6, 0x87, 0xfb, 0xae, 0x76, 0x00, 0xdd, 0x51, 0xd9, 0x5f, 0x6a, 0x5f, 0xe6, 0x66,
0xee, 0xfd, 0x2b, 0xe2, 0xc6, 0x47, 0xc2, 0xc6, 0x87, 0xfe, 0x48, 0xe8, 0xfe, 0xd4, 0x86, 0x6e,
0xa5, 0x74, 0xf2, 0x16, 0x51, 0x5e, 0xfe, 0x45, 0x4c, 0x14, 0xb4, 0xb3, 0x0d, 0x10, 0x14, 0x61,
0x74, 0xce, 0xf0, 0xc6, 0x8c, 0x35, 0x4f, 0x13, 0x9a, 0x34, 0xc3, 0x6d, 0x5c, 0x7a, 0x86, 0xcb,
0xdf, 0x46, 0xe2, 0x12, 0x24, 0x95, 0xa8, 0x93, 0xbc, 0x39, 0x01, 0x4a, 0x4f, 0x17, 0x75, 0xbf,
0x07, 0xab, 0xb5, 0x0a, 0x25, 0x46, 0xba, 0xf4, 0x04, 0x93, 0x62, 0xa4, 0xcb, 0x09, 0x2d, 0x58,
0xed, 0x6a, 0xb0, 0x86, 0xc1, 0xa9, 0xfe, 0x2f, 0x04, 0x45, 0xba, 0x3f, 0xb3, 0x61, 0x7d, 0xf2,
0xed, 0xf2, 0xb2, 0xba, 0xfb, 0x10, 0x7a, 0xd3, 0x2a, 0xf9, 0x95, 0x79, 0xbd, 0x8c, 0xee, 0xe2,
0x1e, 0x7e, 0x59, 0xdd, 0xbd, 0x96, 0x47, 0xb7, 0x76, 0xd5, 0xb9, 0xbf, 0x2b, 0xfc, 0x53, 0x74,
0x1a, 0x2f, 0xa9, 0x7f, 0x9c, 0xd7, 0x61, 0x45, 0x1e, 0x53, 0xfb, 0xe8, 0x27, 0x1b, 0xd7, 0x1a,
0xbf, 0xac, 0x14, 0xda, 0xb5, 0x7f, 0x65, 0x31, 0xfb, 0x27, 0x2b, 0xc7, 0xa4, 0xe8, 0xdf, 0xfe,
0xa7, 0x30, 0x29, 0x23, 0x4d, 0x6b, 0x6a, 0xb4, 0x48, 0x2b, 0xfa, 0xca, 0xff, 0x47, 0xda, 0xc5,
0x91, 0x56, 0xf8, 0x52, 0x6b, 0xf0, 0xdc, 0x1f, 0x42, 0x67, 0x0f, 0x87, 0x7d, 0x36, 0xca, 0xff,
0x6e, 0x70, 0x9e, 0x23, 0xa7, 0xfd, 0xd5, 0x71, 0xea, 0x1f, 0x0d, 0xaa, 0x7f, 0x52, 0x98, 0xab,
0xfd, 0x49, 0xc1, 0xdd, 0x81, 0x65, 0xdd, 0x80, 0xcb, 0xfc, 0xdb, 0x62, 0xe7, 0xfa, 0x77, 0xaf,
0x6d, 0xbd, 0x21, 0xff, 0x54, 0xfb, 0x56, 0xcd, 0x89, 0x87, 0x2d, 0xf1, 0x27, 0xdb, 0x2f, 0xff,
0x27, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x98, 0x6b, 0xf4, 0x77, 0x2b, 0x00, 0x00,
}
+6
View File
@@ -254,6 +254,12 @@ message MemberEnterTips{
int64 operationTime = 3;
}
message GroupDismissedTips{
GroupInfo group = 1;
GroupMemberFullInfo opUser = 2;
int64 operationTime = 3;
}
//////////////////////friend/////////////////////
//message FriendInfo{
View File
+18 -1
View File
@@ -1,6 +1,13 @@
package utils
import "os"
import (
"Open_IM/pkg/common/constant"
"fmt"
"math/rand"
"os"
"path"
"time"
)
// Determine whether the given path is a folder
func IsDir(path string) bool {
@@ -20,3 +27,13 @@ func IsFile(path string) bool {
func MkDir(path string) error {
return os.MkdirAll(path, os.ModePerm)
}
func GetNewFileNameAndContentType(fileName string, fileType int) (string, string) {
suffix := path.Ext(fileName)
newName := fmt.Sprintf("%d-%d%s", time.Now().UnixNano(), rand.Int(), fileName)
contentType := ""
if fileType == constant.ImageType {
contentType = "image/" + suffix[1:]
}
return newName, contentType
}