Fix retrieve search error (#11501)

Signed-off-by: godchen <qingxiang.chen@zilliz.com>
This commit is contained in:
godchen 2021-11-11 00:54:45 +08:00 committed by GitHub
parent f01063a020
commit 5357e301f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 480 additions and 169 deletions

View File

@ -779,3 +779,34 @@ func getCompactionState(tasks []*compactionTask) (state commonpb.CompactionState
}
return
}
func (s *Server) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
log.Debug("receive watch channels request", zap.Any("channels", req.GetChannelNames()))
resp := &datapb.WatchChannelsResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
},
}
if s.isClosed() {
log.Warn("failed to watch channels request", zap.Any("channels", req.GetChannelNames()),
zap.Error(errDataCoordIsUnhealthy(Params.NodeID)))
resp.Status.Reason = msgDataCoordIsUnhealthy(Params.NodeID)
return resp, nil
}
for _, channelName := range req.GetChannelNames() {
ch := &channel{
Name: channelName,
CollectionID: req.GetCollectionID(),
}
err := s.channelManager.Watch(ch)
if err != nil {
log.Warn("fail to watch channelName", zap.String("channelName", channelName), zap.Error(err))
resp.Status.Reason = err.Error()
return resp, nil
}
}
resp.Status.ErrorCode = commonpb.ErrorCode_Success
return resp, nil
}

View File

@ -184,9 +184,6 @@ func (ddn *ddNode) isFlushed(segmentID UniqueID) bool {
}
func (ddn *ddNode) forwardDeleteMsg(msgs []msgstream.TsMsg, minTs Timestamp, maxTs Timestamp) error {
if err := ddn.sendDeltaTimeTick(minTs); err != nil {
return err
}
if len(msgs) != 0 {
var msgPack = msgstream.MsgPack{
Msgs: msgs,

View File

@ -590,3 +590,18 @@ func (c *Client) GetCompactionStateWithPlans(ctx context.Context, req *milvuspb.
}
return ret.(*milvuspb.GetCompactionPlansResponse), err
}
func (c *Client) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
ret, err := c.recall(func() (interface{}, error) {
client, err := c.getGrpcClient()
if err != nil {
return nil, err
}
return client.WatchChannels(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*datapb.WatchChannelsResponse), err
}

View File

@ -110,6 +110,10 @@ func (m *MockDataCoordClient) GetCompactionStateWithPlans(ctx context.Context, r
return &milvuspb.GetCompactionPlansResponse{}, m.err
}
func (m *MockDataCoordClient) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest, opts ...grpc.CallOption) (*datapb.WatchChannelsResponse, error) {
return &datapb.WatchChannelsResponse{}, m.err
}
func Test_NewClient(t *testing.T) {
proxy.Params.InitOnce()
@ -194,6 +198,9 @@ func Test_NewClient(t *testing.T) {
r19, err := client.GetCompactionStateWithPlans(ctx, nil)
retCheck(retNotNil, r19, err)
r20, err := client.WatchChannels(ctx, nil)
retCheck(retNotNil, r20, err)
}
client.getGrpcClient = func() (datapb.DataCoordClient, error) {

View File

@ -278,3 +278,7 @@ func (s *Server) GetCompactionState(ctx context.Context, req *milvuspb.GetCompac
func (s *Server) GetCompactionStateWithPlans(ctx context.Context, req *milvuspb.GetCompactionPlansRequest) (*milvuspb.GetCompactionPlansResponse, error) {
return s.dataCoord.GetCompactionStateWithPlans(ctx, req)
}
func (s *Server) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
return s.dataCoord.WatchChannels(ctx, req)
}

View File

@ -51,6 +51,7 @@ type MockDataCoord struct {
compactionStateResp *milvuspb.GetCompactionStateResponse
manualCompactionResp *milvuspb.ManualCompactionResponse
compactionPlansResp *milvuspb.GetCompactionPlansResponse
watchChannelsResp *datapb.WatchChannelsResponse
}
func (m *MockDataCoord) Init() error {
@ -145,6 +146,10 @@ func (m *MockDataCoord) GetCompactionStateWithPlans(ctx context.Context, req *mi
return m.compactionPlansResp, m.err
}
func (m *MockDataCoord) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
return m.watchChannelsResp, m.err
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
func Test_NewServer(t *testing.T) {
ctx := context.Background()
@ -293,6 +298,15 @@ func Test_NewServer(t *testing.T) {
assert.NotNil(t, resp)
})
t.Run("WatchChannels", func(t *testing.T) {
server.dataCoord = &MockDataCoord{
watchChannelsResp: &datapb.WatchChannelsResponse{},
}
resp, err := server.WatchChannels(ctx, nil)
assert.Nil(t, err)
assert.NotNil(t, resp)
})
err = server.Stop()
assert.Nil(t, err)
}

View File

@ -395,6 +395,10 @@ func (m *MockDataCoord) GetCompactionStateWithPlans(ctx context.Context, req *mi
return nil, nil
}
func (m *MockDataCoord) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
return nil, nil
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type MockProxy struct {
MockBase

View File

@ -165,6 +165,10 @@ func TestGrpcService(t *testing.T) {
core.CallGetNumRowsService = func(ctx context.Context, segID typeutil.UniqueID, isFromFlushedChan bool) (int64, error) {
return rootcoord.Params.MinSegmentSizeToEnableIndex, nil
}
core.CallWatchChannels = func(ctx context.Context, collectionID int64, channelNames []string) error {
return nil
}
segs := []typeutil.UniqueID{}
segLock := sync.Mutex{}
core.CallGetFlushedSegmentsService = func(ctx context.Context, collID, partID typeutil.UniqueID) ([]typeutil.UniqueID, error) {

View File

@ -37,6 +37,8 @@ service DataCoord {
rpc ManualCompaction(milvus.ManualCompactionRequest) returns (milvus.ManualCompactionResponse) {}
rpc GetCompactionState(milvus.GetCompactionStateRequest) returns (milvus.GetCompactionStateResponse) {}
rpc GetCompactionStateWithPlans(milvus.GetCompactionPlansRequest) returns (milvus.GetCompactionPlansResponse) {}
rpc WatchChannels(WatchChannelsRequest) returns (WatchChannelsResponse) {}
}
service DataNode {
@ -350,3 +352,12 @@ message SegmentFieldBinlogMeta {
int64 fieldID = 1;
string binlog_path = 2;
}
message WatchChannelsRequest {
int64 collectionID = 1;
repeated string channelNames = 2;
}
message WatchChannelsResponse {
common.Status status = 1;
}

View File

@ -2664,6 +2664,92 @@ func (m *SegmentFieldBinlogMeta) GetBinlogPath() string {
return ""
}
type WatchChannelsRequest struct {
CollectionID int64 `protobuf:"varint,1,opt,name=collectionID,proto3" json:"collectionID,omitempty"`
ChannelNames []string `protobuf:"bytes,2,rep,name=channelNames,proto3" json:"channelNames,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *WatchChannelsRequest) Reset() { *m = WatchChannelsRequest{} }
func (m *WatchChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*WatchChannelsRequest) ProtoMessage() {}
func (*WatchChannelsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{43}
}
func (m *WatchChannelsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WatchChannelsRequest.Unmarshal(m, b)
}
func (m *WatchChannelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WatchChannelsRequest.Marshal(b, m, deterministic)
}
func (m *WatchChannelsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_WatchChannelsRequest.Merge(m, src)
}
func (m *WatchChannelsRequest) XXX_Size() int {
return xxx_messageInfo_WatchChannelsRequest.Size(m)
}
func (m *WatchChannelsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_WatchChannelsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_WatchChannelsRequest proto.InternalMessageInfo
func (m *WatchChannelsRequest) GetCollectionID() int64 {
if m != nil {
return m.CollectionID
}
return 0
}
func (m *WatchChannelsRequest) GetChannelNames() []string {
if m != nil {
return m.ChannelNames
}
return nil
}
type WatchChannelsResponse struct {
Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *WatchChannelsResponse) Reset() { *m = WatchChannelsResponse{} }
func (m *WatchChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*WatchChannelsResponse) ProtoMessage() {}
func (*WatchChannelsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_82cd95f524594f49, []int{44}
}
func (m *WatchChannelsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WatchChannelsResponse.Unmarshal(m, b)
}
func (m *WatchChannelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WatchChannelsResponse.Marshal(b, m, deterministic)
}
func (m *WatchChannelsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_WatchChannelsResponse.Merge(m, src)
}
func (m *WatchChannelsResponse) XXX_Size() int {
return xxx_messageInfo_WatchChannelsResponse.Size(m)
}
func (m *WatchChannelsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_WatchChannelsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_WatchChannelsResponse proto.InternalMessageInfo
func (m *WatchChannelsResponse) GetStatus() *commonpb.Status {
if m != nil {
return m.Status
}
return nil
}
func init() {
proto.RegisterEnum("milvus.proto.data.ChannelWatchState", ChannelWatchState_name, ChannelWatchState_value)
proto.RegisterEnum("milvus.proto.data.CompactionType", CompactionType_name, CompactionType_value)
@ -2710,171 +2796,176 @@ func init() {
proto.RegisterType((*CompactionPlan)(nil), "milvus.proto.data.CompactionPlan")
proto.RegisterType((*CompactionResult)(nil), "milvus.proto.data.CompactionResult")
proto.RegisterType((*SegmentFieldBinlogMeta)(nil), "milvus.proto.data.SegmentFieldBinlogMeta")
proto.RegisterType((*WatchChannelsRequest)(nil), "milvus.proto.data.WatchChannelsRequest")
proto.RegisterType((*WatchChannelsResponse)(nil), "milvus.proto.data.WatchChannelsResponse")
}
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
var fileDescriptor_82cd95f524594f49 = []byte{
// 2534 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x1a, 0x4b, 0x6f, 0x1b, 0xc7,
0xd9, 0xcb, 0x87, 0x44, 0x7e, 0xa4, 0x28, 0x7a, 0xec, 0xca, 0x2c, 0x6d, 0xcb, 0xf2, 0x26, 0xb1,
0x15, 0xc7, 0x91, 0x6c, 0xb9, 0x41, 0x83, 0x3a, 0x69, 0x10, 0x59, 0xb6, 0x2a, 0x54, 0x72, 0xd5,
0xa5, 0x12, 0x17, 0xcd, 0x81, 0x58, 0x71, 0x47, 0xd4, 0xd6, 0xfb, 0xa0, 0x77, 0x86, 0xb2, 0x95,
0x4b, 0x8c, 0x14, 0x28, 0xd0, 0xa2, 0x6d, 0x5a, 0xf4, 0x5a, 0xa0, 0x45, 0x4f, 0x05, 0x7a, 0x29,
0x0a, 0xf4, 0xd2, 0xfe, 0x81, 0xa2, 0xb9, 0xf4, 0xd4, 0xdf, 0x13, 0xcc, 0x63, 0x67, 0x97, 0xcb,
0x25, 0xb9, 0x94, 0xfc, 0xb8, 0x71, 0xbe, 0xfd, 0x5e, 0xf3, 0xcd, 0xf7, 0x9c, 0x21, 0xd4, 0x2d,
0x93, 0x9a, 0xed, 0x8e, 0xef, 0x07, 0xd6, 0x4a, 0x2f, 0xf0, 0xa9, 0x8f, 0xce, 0xba, 0xb6, 0x73,
0xd4, 0x27, 0x62, 0xb5, 0xc2, 0x3e, 0x37, 0xab, 0x1d, 0xdf, 0x75, 0x7d, 0x4f, 0x80, 0x9a, 0x35,
0xdb, 0xa3, 0x38, 0xf0, 0x4c, 0x47, 0xae, 0xab, 0x71, 0x82, 0x66, 0x95, 0x74, 0x0e, 0xb1, 0x6b,
0x8a, 0x95, 0xfe, 0x0c, 0xaa, 0x0f, 0x9c, 0x3e, 0x39, 0x34, 0xf0, 0x93, 0x3e, 0x26, 0x14, 0xdd,
0x82, 0xc2, 0xbe, 0x49, 0x70, 0x43, 0x5b, 0xd2, 0x96, 0x2b, 0x6b, 0x97, 0x56, 0x06, 0x64, 0x49,
0x29, 0x3b, 0xa4, 0xbb, 0x6e, 0x12, 0x6c, 0x70, 0x4c, 0x84, 0xa0, 0x60, 0xed, 0x6f, 0x6d, 0x34,
0x72, 0x4b, 0xda, 0x72, 0xde, 0xe0, 0xbf, 0x91, 0x0e, 0xd5, 0x8e, 0xef, 0x38, 0xb8, 0x43, 0x6d,
0xdf, 0xdb, 0xda, 0x68, 0x14, 0xf8, 0xb7, 0x01, 0x98, 0xfe, 0x47, 0x0d, 0xe6, 0xa4, 0x68, 0xd2,
0xf3, 0x3d, 0x82, 0xd1, 0x1d, 0x98, 0x21, 0xd4, 0xa4, 0x7d, 0x22, 0xa5, 0x5f, 0x4c, 0x95, 0xde,
0xe2, 0x28, 0x86, 0x44, 0xcd, 0x24, 0x3e, 0x3f, 0x2c, 0x1e, 0x2d, 0x02, 0x10, 0xdc, 0x75, 0xb1,
0x47, 0xb7, 0x36, 0x48, 0xa3, 0xb0, 0x94, 0x5f, 0xce, 0x1b, 0x31, 0x88, 0xfe, 0x7b, 0x0d, 0xea,
0xad, 0x70, 0x19, 0x5a, 0xe7, 0x3c, 0x14, 0x3b, 0x7e, 0xdf, 0xa3, 0x5c, 0xc1, 0x39, 0x43, 0x2c,
0xd0, 0x55, 0xa8, 0x76, 0x0e, 0x4d, 0xcf, 0xc3, 0x4e, 0xdb, 0x33, 0x5d, 0xcc, 0x55, 0x29, 0x1b,
0x15, 0x09, 0x7b, 0x68, 0xba, 0x38, 0x93, 0x46, 0x4b, 0x50, 0xe9, 0x99, 0x01, 0xb5, 0x07, 0x6c,
0x16, 0x07, 0xe9, 0x7f, 0xd6, 0x60, 0xe1, 0x63, 0x42, 0xec, 0xae, 0x37, 0xa4, 0xd9, 0x02, 0xcc,
0x78, 0xbe, 0x85, 0xb7, 0x36, 0xb8, 0x6a, 0x79, 0x43, 0xae, 0xd0, 0x45, 0x28, 0xf7, 0x30, 0x0e,
0xda, 0x81, 0xef, 0x84, 0x8a, 0x95, 0x18, 0xc0, 0xf0, 0x1d, 0x8c, 0x7e, 0x0c, 0x67, 0x49, 0x82,
0x11, 0x69, 0xe4, 0x97, 0xf2, 0xcb, 0x95, 0xb5, 0x37, 0x56, 0x86, 0xbc, 0x6c, 0x25, 0x29, 0xd4,
0x18, 0xa6, 0xd6, 0x9f, 0xe7, 0xe0, 0x9c, 0xc2, 0x13, 0xba, 0xb2, 0xdf, 0xcc, 0x72, 0x04, 0x77,
0x95, 0x7a, 0x62, 0x91, 0xc5, 0x72, 0xca, 0xe4, 0xf9, 0xb8, 0xc9, 0x33, 0x38, 0x58, 0xd2, 0x9e,
0xc5, 0x21, 0x7b, 0xa2, 0x2b, 0x50, 0xc1, 0xcf, 0x7a, 0x76, 0x80, 0xdb, 0xd4, 0x76, 0x71, 0x63,
0x66, 0x49, 0x5b, 0x2e, 0x18, 0x20, 0x40, 0x7b, 0xb6, 0x1b, 0xf7, 0xc8, 0xd9, 0xcc, 0x1e, 0xa9,
0xff, 0x45, 0x83, 0x0b, 0x43, 0xa7, 0x24, 0x5d, 0xdc, 0x80, 0x3a, 0xdf, 0x79, 0x64, 0x19, 0xe6,
0xec, 0xcc, 0xe0, 0xd7, 0xc6, 0x19, 0x3c, 0x42, 0x37, 0x86, 0xe8, 0x63, 0x4a, 0xe6, 0xb2, 0x2b,
0xf9, 0x18, 0x2e, 0x6c, 0x62, 0x2a, 0x05, 0xb0, 0x6f, 0x98, 0x9c, 0x3c, 0x05, 0x0c, 0xc6, 0x52,
0x6e, 0x28, 0x96, 0xfe, 0x9e, 0x53, 0xb1, 0xc4, 0x45, 0x6d, 0x79, 0x07, 0x3e, 0xba, 0x04, 0x65,
0x85, 0x22, 0xbd, 0x22, 0x02, 0xa0, 0xef, 0x42, 0x91, 0x69, 0x2a, 0x5c, 0xa2, 0xb6, 0x76, 0x35,
0x7d, 0x4f, 0x31, 0x9e, 0x86, 0xc0, 0x47, 0x5b, 0x50, 0x23, 0xd4, 0x0c, 0x68, 0xbb, 0xe7, 0x13,
0x7e, 0xce, 0xdc, 0x71, 0x2a, 0x6b, 0xfa, 0x20, 0x07, 0x95, 0x22, 0x77, 0x48, 0x77, 0x57, 0x62,
0x1a, 0x73, 0x9c, 0x32, 0x5c, 0xa2, 0xfb, 0x50, 0xc5, 0x9e, 0x15, 0x31, 0x2a, 0x64, 0x66, 0x54,
0xc1, 0x9e, 0xa5, 0xd8, 0x44, 0xe7, 0x53, 0xcc, 0x7e, 0x3e, 0xbf, 0xd6, 0xa0, 0x31, 0x7c, 0x40,
0xa7, 0x49, 0x94, 0x77, 0x05, 0x11, 0x16, 0x07, 0x34, 0x36, 0xc2, 0xd5, 0x21, 0x19, 0x92, 0x44,
0xb7, 0xe1, 0x5b, 0x91, 0x36, 0xfc, 0xcb, 0x4b, 0x73, 0x96, 0x9f, 0x6b, 0xb0, 0x90, 0x94, 0x75,
0x9a, 0x7d, 0x7f, 0x07, 0x8a, 0xb6, 0x77, 0xe0, 0x87, 0xdb, 0x5e, 0x1c, 0x13, 0x67, 0x4c, 0x96,
0x40, 0xd6, 0x5d, 0xb8, 0xb8, 0x89, 0xe9, 0x96, 0x47, 0x70, 0x40, 0xd7, 0x6d, 0xcf, 0xf1, 0xbb,
0xbb, 0x26, 0x3d, 0x3c, 0x45, 0x8c, 0x0c, 0xb8, 0x7b, 0x2e, 0xe1, 0xee, 0xfa, 0x5f, 0x35, 0xb8,
0x94, 0x2e, 0x4f, 0x6e, 0xbd, 0x09, 0xa5, 0x03, 0x1b, 0x3b, 0x16, 0xb3, 0x99, 0xc6, 0x6d, 0xa6,
0xd6, 0x2c, 0x56, 0x7a, 0x0c, 0x59, 0xee, 0xf0, 0xea, 0x08, 0x07, 0x6d, 0xd1, 0xc0, 0xf6, 0xba,
0xdb, 0x36, 0xa1, 0x86, 0xc0, 0x8f, 0xd9, 0x33, 0x9f, 0xdd, 0x33, 0x7f, 0xa5, 0xc1, 0xe2, 0x26,
0xa6, 0xf7, 0x54, 0xaa, 0x65, 0xdf, 0x6d, 0x42, 0xed, 0x0e, 0x79, 0xb9, 0x4d, 0x44, 0x4a, 0xcd,
0xd4, 0xbf, 0xd2, 0xe0, 0xca, 0x48, 0x65, 0xa4, 0xe9, 0x64, 0x2a, 0x09, 0x13, 0x6d, 0x7a, 0x2a,
0xf9, 0x21, 0x3e, 0xfe, 0xd4, 0x74, 0xfa, 0x78, 0xd7, 0xb4, 0x03, 0x91, 0x4a, 0x4e, 0x98, 0x58,
0xff, 0xa6, 0xc1, 0xe5, 0x4d, 0x4c, 0x77, 0xc3, 0x32, 0xf3, 0x1a, 0xad, 0x93, 0xa1, 0xa3, 0xf8,
0xad, 0x38, 0xcc, 0x54, 0x6d, 0x5f, 0x8b, 0xf9, 0x16, 0x79, 0x1c, 0xc4, 0x02, 0xf2, 0x9e, 0xe8,
0x05, 0xa4, 0xf1, 0xf4, 0x7f, 0xe6, 0xa0, 0xfa, 0xa9, 0xec, 0x0f, 0x78, 0x19, 0x49, 0xda, 0x41,
0x4b, 0xb7, 0x43, 0xac, 0xa5, 0x48, 0xeb, 0x32, 0x36, 0x61, 0x8e, 0x60, 0xfc, 0xf8, 0x24, 0x45,
0xa3, 0xca, 0x08, 0x55, 0xb2, 0xdf, 0x86, 0xb3, 0x7d, 0xef, 0x80, 0xb5, 0xb5, 0xd8, 0x92, 0xbb,
0x10, 0xdd, 0xe5, 0xe4, 0xcc, 0x33, 0x4c, 0x88, 0x7e, 0x00, 0xf3, 0x49, 0x5e, 0xc5, 0x4c, 0xbc,
0x92, 0x64, 0xfa, 0x2f, 0x35, 0x58, 0x78, 0x64, 0xd2, 0xce, 0xe1, 0x86, 0x2b, 0x2d, 0x7a, 0x0a,
0x7f, 0xfc, 0x10, 0xca, 0x47, 0xd2, 0x7a, 0x61, 0xd2, 0xb9, 0x92, 0xa2, 0x50, 0xfc, 0x9c, 0x8c,
0x88, 0x42, 0xff, 0x8f, 0x06, 0xe7, 0x79, 0xe7, 0x1f, 0x6a, 0xf7, 0xea, 0x23, 0x63, 0x42, 0xf7,
0x8f, 0xae, 0x41, 0xcd, 0x35, 0x83, 0xc7, 0xad, 0x08, 0xa7, 0xc8, 0x71, 0x12, 0x50, 0xfd, 0x19,
0x80, 0x5c, 0xed, 0x90, 0xee, 0x09, 0xf4, 0x7f, 0x1f, 0x66, 0xa5, 0x54, 0x19, 0x24, 0x93, 0x0e,
0x36, 0x44, 0xd7, 0xff, 0xab, 0x41, 0x2d, 0x4a, 0x7b, 0x3c, 0x14, 0x6a, 0x90, 0x53, 0x01, 0x90,
0xdb, 0xda, 0x40, 0x1f, 0xc2, 0x8c, 0x98, 0xf5, 0x24, 0xef, 0xb7, 0x06, 0x79, 0xcb, 0x39, 0x30,
0x96, 0x3b, 0x39, 0xc0, 0x90, 0x44, 0xcc, 0x46, 0x2a, 0x55, 0x88, 0xb1, 0x20, 0x6f, 0xc4, 0x20,
0x68, 0x0b, 0xe6, 0x07, 0x3b, 0xad, 0xd0, 0xd1, 0x97, 0x46, 0xa5, 0x88, 0x0d, 0x93, 0x9a, 0x3c,
0x43, 0xd4, 0x06, 0x1a, 0x2d, 0xa2, 0xff, 0xaf, 0x08, 0x95, 0xd8, 0x2e, 0x87, 0x76, 0x92, 0x3c,
0xd2, 0xdc, 0xe4, 0x64, 0x97, 0x1f, 0x6e, 0xf7, 0xdf, 0x82, 0x9a, 0xcd, 0x0b, 0x6c, 0x5b, 0xba,
0x22, 0xcf, 0x88, 0x65, 0x63, 0x4e, 0x40, 0x65, 0x5c, 0xa0, 0x45, 0xa8, 0x78, 0x7d, 0xb7, 0xed,
0x1f, 0xb4, 0x03, 0xff, 0x29, 0x91, 0x73, 0x43, 0xd9, 0xeb, 0xbb, 0x3f, 0x3a, 0x30, 0xfc, 0xa7,
0x24, 0x6a, 0x4d, 0x67, 0xa6, 0x6c, 0x4d, 0x17, 0xa1, 0xe2, 0x9a, 0xcf, 0x18, 0xd7, 0xb6, 0xd7,
0x77, 0xf9, 0x48, 0x91, 0x37, 0xca, 0xae, 0xf9, 0xcc, 0xf0, 0x9f, 0x3e, 0xec, 0xbb, 0x68, 0x19,
0xea, 0x8e, 0x49, 0x68, 0x3b, 0x3e, 0x93, 0x94, 0xf8, 0x4c, 0x52, 0x63, 0xf0, 0xfb, 0xd1, 0x5c,
0x32, 0xdc, 0xe4, 0x96, 0x4f, 0xd1, 0xe4, 0x5a, 0xae, 0x13, 0x31, 0x82, 0xec, 0x4d, 0xae, 0xe5,
0x3a, 0x8a, 0xcd, 0xfb, 0x30, 0xbb, 0xcf, 0xdb, 0x16, 0xd2, 0xa8, 0x8c, 0xcc, 0x50, 0x0f, 0x58,
0xc7, 0x22, 0xba, 0x1b, 0x23, 0x44, 0x47, 0x1f, 0x40, 0x99, 0xd7, 0x0b, 0x4e, 0x5b, 0xcd, 0x44,
0x1b, 0x11, 0xb0, 0x54, 0x64, 0x61, 0x87, 0x9a, 0x9c, 0x7a, 0x6e, 0x64, 0x2a, 0xda, 0x60, 0x38,
0xdb, 0x7e, 0x57, 0xa4, 0x22, 0x45, 0x81, 0x6e, 0xc1, 0xb9, 0x4e, 0x80, 0x4d, 0x8a, 0xad, 0xf5,
0xe3, 0x7b, 0xbe, 0xdb, 0x33, 0xb9, 0x37, 0x35, 0x6a, 0x4b, 0xda, 0x72, 0xc9, 0x48, 0xfb, 0xc4,
0x32, 0x43, 0x47, 0xad, 0x1e, 0x04, 0xbe, 0xdb, 0x98, 0x17, 0x99, 0x61, 0x10, 0xaa, 0x7f, 0x01,
0xe7, 0x23, 0x1f, 0x88, 0xd9, 0x7b, 0xf8, 0xe8, 0xb4, 0x93, 0x1e, 0xdd, 0xf8, 0x96, 0xf2, 0x1f,
0x05, 0x58, 0x68, 0x99, 0x47, 0xf8, 0xe5, 0x77, 0xaf, 0x99, 0x32, 0xee, 0x36, 0x9c, 0xe5, 0x0d,
0xeb, 0x5a, 0x4c, 0x9f, 0x31, 0x85, 0x31, 0x7e, 0xdc, 0xc3, 0x84, 0xe8, 0x23, 0x56, 0xd1, 0x71,
0xe7, 0xf1, 0xae, 0x6f, 0x47, 0x45, 0xf1, 0x72, 0x0a, 0x9f, 0x7b, 0x0a, 0xcb, 0x88, 0x53, 0xa0,
0xdd, 0xe1, 0xe4, 0x35, 0xc3, 0x99, 0x5c, 0x1f, 0x3b, 0x16, 0x45, 0xd6, 0x4f, 0xe6, 0x30, 0xd4,
0x80, 0x59, 0x59, 0x74, 0x79, 0x64, 0x97, 0x8c, 0x70, 0x89, 0x76, 0xe1, 0x9c, 0xd8, 0x41, 0x4b,
0xba, 0xad, 0xd8, 0x7c, 0x29, 0xd3, 0xe6, 0xd3, 0x48, 0x07, 0xbd, 0xbe, 0x3c, 0xb5, 0xd7, 0x37,
0x60, 0xd6, 0x0a, 0xfc, 0x5e, 0x0f, 0x5b, 0x3c, 0xdc, 0x4b, 0x46, 0xb8, 0x64, 0xcd, 0x3d, 0x44,
0x26, 0x9b, 0x30, 0xa3, 0x7f, 0x1f, 0x4a, 0xca, 0x89, 0x73, 0x99, 0x9d, 0x58, 0xd1, 0x24, 0x13,
0x6d, 0x3e, 0x91, 0x68, 0xf5, 0xaf, 0x35, 0xa8, 0xc6, 0xb7, 0xc0, 0x12, 0x78, 0x80, 0x3b, 0x7e,
0x60, 0xb5, 0xb1, 0x47, 0x03, 0x1b, 0x8b, 0x39, 0xb0, 0x60, 0xcc, 0x09, 0xe8, 0x7d, 0x01, 0x64,
0x68, 0x2c, 0x77, 0x12, 0x6a, 0xba, 0xbd, 0xf6, 0x01, 0x0b, 0xd1, 0x9c, 0x40, 0x53, 0x50, 0x16,
0xa1, 0xe8, 0x2a, 0x54, 0x23, 0x34, 0xea, 0x73, 0xf9, 0x05, 0xa3, 0xa2, 0x60, 0x7b, 0x3e, 0x7a,
0x13, 0x6a, 0xdc, 0x6a, 0x6d, 0xc7, 0xef, 0xb6, 0xd9, 0xcc, 0x24, 0x2b, 0x46, 0xd5, 0x92, 0x6a,
0xb1, 0xe3, 0x18, 0xc4, 0x22, 0xf6, 0xe7, 0x58, 0xd6, 0x0c, 0x85, 0xd5, 0xb2, 0x3f, 0xc7, 0xfa,
0x97, 0x1a, 0xcc, 0xb1, 0x02, 0xf8, 0xd0, 0xb7, 0xf0, 0xde, 0x09, 0xdb, 0x85, 0x0c, 0xf7, 0x65,
0x97, 0xa0, 0xac, 0x76, 0x20, 0xb7, 0x14, 0x01, 0xd8, 0x70, 0x3d, 0x27, 0xeb, 0x5c, 0x4b, 0xdd,
0x9f, 0x72, 0x56, 0x1a, 0x67, 0xc5, 0x7f, 0xa3, 0xef, 0x0d, 0x5e, 0xbe, 0xbc, 0x99, 0x1a, 0x57,
0x9c, 0x09, 0x6f, 0x29, 0x07, 0x8a, 0x5c, 0x96, 0xa9, 0xed, 0x39, 0x3b, 0x58, 0x69, 0x0a, 0x7e,
0xb0, 0x0d, 0x98, 0x35, 0x2d, 0x2b, 0xc0, 0x84, 0x48, 0x3d, 0xc2, 0x25, 0xfb, 0x72, 0x84, 0x03,
0x12, 0xba, 0x58, 0xde, 0x08, 0x97, 0xe8, 0x03, 0x28, 0xa9, 0x1e, 0x34, 0x9f, 0xd6, 0x77, 0xc4,
0xf5, 0x94, 0x53, 0x86, 0xa2, 0xd0, 0xbf, 0xca, 0x41, 0x4d, 0x86, 0xf5, 0xba, 0x2c, 0x44, 0xe3,
0x9d, 0x7d, 0x1d, 0xaa, 0x07, 0x51, 0x58, 0x8e, 0xbb, 0x4d, 0x88, 0x47, 0xef, 0x00, 0xcd, 0x24,
0x87, 0x1f, 0x2c, 0x85, 0x85, 0x53, 0x95, 0xc2, 0xe2, 0xb4, 0x49, 0x41, 0xff, 0x18, 0x2a, 0x31,
0xc6, 0x3c, 0x9d, 0x89, 0x0b, 0x06, 0x69, 0x8b, 0x70, 0xc9, 0xbe, 0xec, 0xc7, 0x8c, 0x50, 0x56,
0xa5, 0x9c, 0x35, 0xf6, 0x17, 0x36, 0x31, 0x35, 0x70, 0xc7, 0x3f, 0xc2, 0xc1, 0xf1, 0xe9, 0xef,
0x6e, 0xee, 0xc6, 0xce, 0x38, 0xe3, 0x9c, 0xa1, 0x08, 0xd0, 0xdd, 0x48, 0xcf, 0x7c, 0xda, 0xe8,
0x1a, 0x4f, 0xed, 0xf2, 0x84, 0xa2, 0xad, 0xfc, 0x4e, 0xdc, 0x42, 0x0d, 0x6e, 0xe5, 0xa4, 0xd5,
0xf3, 0x85, 0xb4, 0xaf, 0xfa, 0x1f, 0x34, 0xf8, 0xf6, 0x26, 0xa6, 0x0f, 0x06, 0x27, 0xbb, 0xd7,
0xad, 0x95, 0x0b, 0xcd, 0x34, 0xa5, 0x4e, 0x73, 0xea, 0x4d, 0x28, 0x91, 0x70, 0xdc, 0x15, 0xf7,
0x83, 0x6a, 0xad, 0xff, 0x42, 0x83, 0x86, 0x94, 0xc2, 0x65, 0xb2, 0xce, 0xcc, 0xc1, 0x14, 0x5b,
0xaf, 0x7a, 0xfe, 0xfa, 0x93, 0x06, 0xf5, 0x78, 0x12, 0xe4, 0x79, 0xec, 0x3d, 0x28, 0xf2, 0x31,
0x57, 0x6a, 0x30, 0xd1, 0x59, 0x05, 0x36, 0x8b, 0x28, 0xde, 0x4c, 0xec, 0x91, 0x30, 0xc9, 0xc9,
0x65, 0x94, 0x89, 0xf3, 0x53, 0x67, 0x62, 0xfd, 0x37, 0x39, 0x68, 0x44, 0x8d, 0xeb, 0x2b, 0x4f,
0x76, 0x23, 0xba, 0x9e, 0xfc, 0x0b, 0xea, 0x7a, 0x0a, 0x53, 0x27, 0xb8, 0x7f, 0xe7, 0xd8, 0xc4,
0x1c, 0xda, 0x63, 0xd7, 0x31, 0x3d, 0xb4, 0x00, 0x33, 0x3d, 0xc7, 0x8c, 0xae, 0x8d, 0xe4, 0x0a,
0xb5, 0xa0, 0x46, 0x06, 0xec, 0x25, 0x2d, 0xf0, 0x4e, 0x9a, 0xfd, 0x47, 0x98, 0xd8, 0x48, 0xb0,
0x40, 0x97, 0x01, 0x44, 0xcb, 0xc9, 0x07, 0x3b, 0x59, 0x9a, 0xc5, 0x41, 0xb3, 0x99, 0xee, 0x26,
0x20, 0xf6, 0xc1, 0xef, 0xd3, 0xb6, 0xed, 0xb5, 0x09, 0xee, 0xf8, 0x9e, 0x45, 0x78, 0xbf, 0x51,
0x34, 0xea, 0xf2, 0xcb, 0x96, 0xd7, 0x12, 0x70, 0xf4, 0x1e, 0x14, 0xe8, 0x71, 0x4f, 0x74, 0x1a,
0xb5, 0xd4, 0xcc, 0x16, 0xe9, 0xb5, 0x77, 0xdc, 0xc3, 0x06, 0x47, 0x67, 0x33, 0x3d, 0x63, 0x45,
0x03, 0xf3, 0x08, 0x3b, 0xe1, 0x83, 0x57, 0x04, 0x61, 0x9e, 0x18, 0xce, 0xc6, 0xb3, 0xa2, 0x10,
0xcb, 0xa5, 0xfe, 0xaf, 0x1c, 0xd4, 0x23, 0x96, 0x06, 0x26, 0x7d, 0x87, 0x8e, 0xb4, 0xdf, 0xf8,
0x71, 0x61, 0x52, 0x19, 0xfc, 0x08, 0x2a, 0x72, 0x4e, 0x9f, 0xa2, 0x10, 0x82, 0x20, 0xd9, 0x1e,
0xe3, 0x7a, 0xc5, 0x17, 0xe4, 0x7a, 0x33, 0x53, 0xbb, 0x5e, 0x0b, 0x16, 0xc2, 0xa4, 0x15, 0x49,
0xda, 0xc1, 0xd4, 0x1c, 0x53, 0x66, 0xaf, 0x40, 0x45, 0x14, 0x23, 0xd1, 0x78, 0x8a, 0x56, 0x0f,
0xf6, 0xd5, 0x10, 0x74, 0xe3, 0x36, 0x9c, 0x1d, 0x8a, 0x7d, 0x54, 0x03, 0xf8, 0xc4, 0xeb, 0xc8,
0xa4, 0x58, 0x3f, 0x83, 0xaa, 0x50, 0x0a, 0x53, 0x64, 0x5d, 0xbb, 0xd1, 0x8a, 0x47, 0x00, 0x73,
0x0b, 0x74, 0x01, 0xce, 0x7d, 0xe2, 0x59, 0xf8, 0xc0, 0xf6, 0xb0, 0x15, 0x7d, 0xaa, 0x9f, 0x41,
0xe7, 0x60, 0x7e, 0xcb, 0xf3, 0x70, 0x10, 0x03, 0x6a, 0x0c, 0xb8, 0x83, 0x83, 0x2e, 0x8e, 0x01,
0x73, 0x6b, 0x5f, 0xd7, 0xa1, 0xcc, 0xba, 0xb9, 0x7b, 0xbe, 0x1f, 0x58, 0xa8, 0x07, 0x88, 0x5f,
0xc8, 0xbb, 0x3d, 0xdf, 0x53, 0x2f, 0x57, 0xe8, 0xd6, 0x88, 0xc1, 0x60, 0x18, 0x55, 0xd6, 0xb3,
0xe6, 0xb5, 0x11, 0x14, 0x09, 0x74, 0xfd, 0x0c, 0x72, 0xb9, 0x44, 0x16, 0x43, 0x7b, 0x76, 0xe7,
0x71, 0x78, 0x8b, 0x33, 0x46, 0x62, 0x02, 0x35, 0x94, 0x98, 0x78, 0x10, 0x93, 0x0b, 0xf1, 0x6a,
0x12, 0x16, 0x34, 0xfd, 0x0c, 0x7a, 0x02, 0xe7, 0x37, 0x31, 0x8d, 0x2e, 0xca, 0x43, 0x81, 0x6b,
0xa3, 0x05, 0x0e, 0x21, 0x4f, 0x29, 0x72, 0x1b, 0x8a, 0xbc, 0xd8, 0xa1, 0x34, 0x9f, 0x8b, 0xff,
0x7d, 0xa3, 0xb9, 0x34, 0x1a, 0x41, 0x71, 0xfb, 0x19, 0xcc, 0x27, 0x9e, 0xa7, 0xd1, 0xdb, 0x29,
0x64, 0xe9, 0x7f, 0x34, 0x68, 0xde, 0xc8, 0x82, 0xaa, 0x64, 0x75, 0xa1, 0x36, 0x78, 0x9d, 0x8f,
0x96, 0x53, 0xe8, 0x53, 0x9f, 0x16, 0x9b, 0x6f, 0x67, 0xc0, 0x54, 0x82, 0x5c, 0xa8, 0x27, 0x9f,
0x4b, 0xd1, 0x8d, 0xb1, 0x0c, 0x06, 0xdd, 0xed, 0x9d, 0x4c, 0xb8, 0x4a, 0xdc, 0x31, 0x77, 0x82,
0xa1, 0xe7, 0x3a, 0xb4, 0x92, 0xce, 0x66, 0xd4, 0x3b, 0x62, 0x73, 0x35, 0x33, 0xbe, 0x12, 0xfd,
0xa5, 0x68, 0xb2, 0xd3, 0x9e, 0xbc, 0xd0, 0xed, 0x74, 0x76, 0x63, 0xde, 0xea, 0x9a, 0x6b, 0xd3,
0x90, 0x28, 0x25, 0xbe, 0xe0, 0xdd, 0x71, 0xca, 0xb3, 0x51, 0x32, 0xee, 0x42, 0x7e, 0xa3, 0xdf,
0xc3, 0x9a, 0xb7, 0xa7, 0xa0, 0x50, 0x0a, 0xf8, 0xc9, 0x07, 0xe9, 0x30, 0x0c, 0x57, 0x27, 0x7a,
0xcd, 0xc9, 0x62, 0xf0, 0x33, 0x98, 0x4f, 0xdc, 0xa6, 0xa5, 0x46, 0x4d, 0xfa, 0x8d, 0x5b, 0x73,
0x5c, 0xdf, 0x2b, 0x42, 0x32, 0x31, 0x6c, 0xa0, 0x11, 0xde, 0x9f, 0x32, 0x90, 0x34, 0x6f, 0x64,
0x41, 0x55, 0x1b, 0x21, 0x3c, 0x5d, 0x26, 0x1a, 0x76, 0x74, 0x33, 0x9d, 0x47, 0xfa, 0xb0, 0xd1,
0x7c, 0x37, 0x23, 0xb6, 0x12, 0xda, 0x06, 0xd8, 0xc4, 0x74, 0x07, 0xd3, 0x80, 0xf9, 0xc8, 0xb5,
0x54, 0x93, 0x47, 0x08, 0xa1, 0x98, 0xeb, 0x13, 0xf1, 0x94, 0x80, 0x9f, 0x00, 0x0a, 0xeb, 0x5c,
0xec, 0xb2, 0xf6, 0x8d, 0xb1, 0x7d, 0x91, 0x68, 0x62, 0x26, 0x9d, 0xcd, 0x13, 0xa8, 0xef, 0x98,
0x5e, 0xdf, 0x74, 0x62, 0x7c, 0x6f, 0xa6, 0x2a, 0x96, 0x44, 0x1b, 0x61, 0xad, 0x91, 0xd8, 0x6a,
0x33, 0x4f, 0x55, 0x0d, 0x35, 0x55, 0x08, 0xe2, 0x64, 0x6e, 0x89, 0xac, 0x91, 0x40, 0x1c, 0x91,
0x5b, 0xc6, 0xe0, 0x2b, 0xc1, 0xcf, 0x35, 0xfe, 0xb7, 0x87, 0x04, 0xc2, 0x23, 0x9b, 0x1e, 0xb2,
0x76, 0x99, 0x64, 0x51, 0x81, 0x23, 0x4e, 0xa1, 0x82, 0xc4, 0x0f, 0x55, 0x58, 0xfb, 0x7f, 0x01,
0x4a, 0xe1, 0xdd, 0xd0, 0x6b, 0x68, 0x26, 0x5e, 0x43, 0x75, 0xff, 0x0c, 0xe6, 0x13, 0x2f, 0xb3,
0xa9, 0xc1, 0x9f, 0xfe, 0x7a, 0x3b, 0xc9, 0x7b, 0x1f, 0xc9, 0x3f, 0x59, 0xaa, 0x40, 0xbf, 0x3e,
0xaa, 0x43, 0x48, 0xc6, 0xf8, 0x04, 0xc6, 0x2f, 0x3d, 0xa2, 0x1f, 0x02, 0xc4, 0x22, 0x6e, 0xfc,
0x84, 0xc3, 0x9c, 0x68, 0x82, 0xc2, 0xeb, 0x77, 0x7e, 0x7a, 0xbb, 0x6b, 0xd3, 0xc3, 0xfe, 0x3e,
0xfb, 0xb2, 0x2a, 0x50, 0xdf, 0xb5, 0x7d, 0xf9, 0x6b, 0x35, 0x3c, 0xd1, 0x55, 0x4e, 0xbd, 0xca,
0x04, 0xf4, 0xf6, 0xf7, 0x67, 0xf8, 0xea, 0xce, 0x37, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x28,
0x3c, 0x59, 0x86, 0x2b, 0x00, 0x00,
// 2588 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdf, 0x6f, 0x1b, 0xc7,
0xf1, 0xf7, 0xf1, 0x87, 0x44, 0x0e, 0x29, 0x8a, 0x5a, 0x3b, 0x32, 0xbf, 0xb4, 0x2d, 0xcb, 0x97,
0xc4, 0x56, 0x1c, 0x47, 0xb2, 0xe5, 0x6f, 0xd0, 0xa0, 0x4e, 0x1a, 0x44, 0x96, 0xad, 0x12, 0x95,
0x5c, 0xf5, 0xa8, 0xc4, 0x45, 0x03, 0x94, 0x38, 0xf1, 0x56, 0xd4, 0xd5, 0xf7, 0x83, 0xbe, 0x3d,
0xca, 0x56, 0x5e, 0x62, 0xa4, 0x40, 0x81, 0x16, 0x6d, 0xd3, 0xa2, 0xaf, 0x05, 0x5a, 0xf4, 0xa9,
0x40, 0x5f, 0xda, 0x02, 0x7d, 0x69, 0xff, 0x81, 0xa2, 0x7d, 0xe9, 0x53, 0xff, 0x9e, 0x62, 0x7f,
0xdc, 0xde, 0x0f, 0x1e, 0xc9, 0xa3, 0x64, 0x5b, 0x6f, 0xdc, 0xbd, 0xd9, 0x99, 0xd9, 0xd9, 0x99,
0xcf, 0xcc, 0xec, 0x12, 0xea, 0x86, 0xee, 0xeb, 0x9d, 0xae, 0xeb, 0x7a, 0xc6, 0x6a, 0xdf, 0x73,
0x7d, 0x17, 0x2d, 0xd8, 0xa6, 0x75, 0x34, 0x20, 0x7c, 0xb4, 0x4a, 0x3f, 0x37, 0xab, 0x5d, 0xd7,
0xb6, 0x5d, 0x87, 0x4f, 0x35, 0x6b, 0xa6, 0xe3, 0x63, 0xcf, 0xd1, 0x2d, 0x31, 0xae, 0x46, 0x17,
0x34, 0xab, 0xa4, 0x7b, 0x88, 0x6d, 0x9d, 0x8f, 0xd4, 0xe7, 0x50, 0x7d, 0x68, 0x0d, 0xc8, 0xa1,
0x86, 0x9f, 0x0e, 0x30, 0xf1, 0xd1, 0x6d, 0x28, 0xec, 0xeb, 0x04, 0x37, 0x94, 0x65, 0x65, 0xa5,
0xb2, 0x7e, 0x79, 0x35, 0x26, 0x4b, 0x48, 0xd9, 0x21, 0xbd, 0x0d, 0x9d, 0x60, 0x8d, 0x51, 0x22,
0x04, 0x05, 0x63, 0xbf, 0xb5, 0xd9, 0xc8, 0x2d, 0x2b, 0x2b, 0x79, 0x8d, 0xfd, 0x46, 0x2a, 0x54,
0xbb, 0xae, 0x65, 0xe1, 0xae, 0x6f, 0xba, 0x4e, 0x6b, 0xb3, 0x51, 0x60, 0xdf, 0x62, 0x73, 0xea,
0x6f, 0x15, 0x98, 0x13, 0xa2, 0x49, 0xdf, 0x75, 0x08, 0x46, 0x77, 0x61, 0x86, 0xf8, 0xba, 0x3f,
0x20, 0x42, 0xfa, 0xa5, 0x54, 0xe9, 0x6d, 0x46, 0xa2, 0x09, 0xd2, 0x4c, 0xe2, 0xf3, 0xc3, 0xe2,
0xd1, 0x12, 0x00, 0xc1, 0x3d, 0x1b, 0x3b, 0x7e, 0x6b, 0x93, 0x34, 0x0a, 0xcb, 0xf9, 0x95, 0xbc,
0x16, 0x99, 0x51, 0x7f, 0xad, 0x40, 0xbd, 0x1d, 0x0c, 0x03, 0xeb, 0x5c, 0x80, 0x62, 0xd7, 0x1d,
0x38, 0x3e, 0x53, 0x70, 0x4e, 0xe3, 0x03, 0x74, 0x0d, 0xaa, 0xdd, 0x43, 0xdd, 0x71, 0xb0, 0xd5,
0x71, 0x74, 0x1b, 0x33, 0x55, 0xca, 0x5a, 0x45, 0xcc, 0x3d, 0xd2, 0x6d, 0x9c, 0x49, 0xa3, 0x65,
0xa8, 0xf4, 0x75, 0xcf, 0x37, 0x63, 0x36, 0x8b, 0x4e, 0xa9, 0xbf, 0x57, 0x60, 0xf1, 0x13, 0x42,
0xcc, 0x9e, 0x33, 0xa4, 0xd9, 0x22, 0xcc, 0x38, 0xae, 0x81, 0x5b, 0x9b, 0x4c, 0xb5, 0xbc, 0x26,
0x46, 0xe8, 0x12, 0x94, 0xfb, 0x18, 0x7b, 0x1d, 0xcf, 0xb5, 0x02, 0xc5, 0x4a, 0x74, 0x42, 0x73,
0x2d, 0x8c, 0xbe, 0x07, 0x0b, 0x24, 0xc1, 0x88, 0x34, 0xf2, 0xcb, 0xf9, 0x95, 0xca, 0xfa, 0x9b,
0xab, 0x43, 0x5e, 0xb6, 0x9a, 0x14, 0xaa, 0x0d, 0xaf, 0x56, 0x5f, 0xe4, 0xe0, 0xbc, 0xa4, 0xe3,
0xba, 0xd2, 0xdf, 0xd4, 0x72, 0x04, 0xf7, 0xa4, 0x7a, 0x7c, 0x90, 0xc5, 0x72, 0xd2, 0xe4, 0xf9,
0xa8, 0xc9, 0x33, 0x38, 0x58, 0xd2, 0x9e, 0xc5, 0x21, 0x7b, 0xa2, 0xab, 0x50, 0xc1, 0xcf, 0xfb,
0xa6, 0x87, 0x3b, 0xbe, 0x69, 0xe3, 0xc6, 0xcc, 0xb2, 0xb2, 0x52, 0xd0, 0x80, 0x4f, 0xed, 0x99,
0x76, 0xd4, 0x23, 0x67, 0x33, 0x7b, 0xa4, 0xfa, 0x07, 0x05, 0x2e, 0x0e, 0x9d, 0x92, 0x70, 0x71,
0x0d, 0xea, 0x6c, 0xe7, 0xa1, 0x65, 0xa8, 0xb3, 0x53, 0x83, 0x5f, 0x1f, 0x67, 0xf0, 0x90, 0x5c,
0x1b, 0x5a, 0x1f, 0x51, 0x32, 0x97, 0x5d, 0xc9, 0x27, 0x70, 0x71, 0x0b, 0xfb, 0x42, 0x00, 0xfd,
0x86, 0xc9, 0xc9, 0x21, 0x20, 0x1e, 0x4b, 0xb9, 0xa1, 0x58, 0xfa, 0x73, 0x4e, 0xc6, 0x12, 0x13,
0xd5, 0x72, 0x0e, 0x5c, 0x74, 0x19, 0xca, 0x92, 0x44, 0x78, 0x45, 0x38, 0x81, 0xbe, 0x01, 0x45,
0xaa, 0x29, 0x77, 0x89, 0xda, 0xfa, 0xb5, 0xf4, 0x3d, 0x45, 0x78, 0x6a, 0x9c, 0x1e, 0xb5, 0xa0,
0x46, 0x7c, 0xdd, 0xf3, 0x3b, 0x7d, 0x97, 0xb0, 0x73, 0x66, 0x8e, 0x53, 0x59, 0x57, 0xe3, 0x1c,
0x24, 0x44, 0xee, 0x90, 0xde, 0xae, 0xa0, 0xd4, 0xe6, 0xd8, 0xca, 0x60, 0x88, 0x1e, 0x40, 0x15,
0x3b, 0x46, 0xc8, 0xa8, 0x90, 0x99, 0x51, 0x05, 0x3b, 0x86, 0x64, 0x13, 0x9e, 0x4f, 0x31, 0xfb,
0xf9, 0xfc, 0x5c, 0x81, 0xc6, 0xf0, 0x01, 0x9d, 0x06, 0x28, 0xef, 0xf1, 0x45, 0x98, 0x1f, 0xd0,
0xd8, 0x08, 0x97, 0x87, 0xa4, 0x89, 0x25, 0xaa, 0x09, 0x6f, 0x84, 0xda, 0xb0, 0x2f, 0xaf, 0xcc,
0x59, 0x7e, 0xac, 0xc0, 0x62, 0x52, 0xd6, 0x69, 0xf6, 0xfd, 0xff, 0x50, 0x34, 0x9d, 0x03, 0x37,
0xd8, 0xf6, 0xd2, 0x98, 0x38, 0xa3, 0xb2, 0x38, 0xb1, 0x6a, 0xc3, 0xa5, 0x2d, 0xec, 0xb7, 0x1c,
0x82, 0x3d, 0x7f, 0xc3, 0x74, 0x2c, 0xb7, 0xb7, 0xab, 0xfb, 0x87, 0xa7, 0x88, 0x91, 0x98, 0xbb,
0xe7, 0x12, 0xee, 0xae, 0xfe, 0x51, 0x81, 0xcb, 0xe9, 0xf2, 0xc4, 0xd6, 0x9b, 0x50, 0x3a, 0x30,
0xb1, 0x65, 0x50, 0x9b, 0x29, 0xcc, 0x66, 0x72, 0x4c, 0x63, 0xa5, 0x4f, 0x89, 0xc5, 0x0e, 0xaf,
0x8d, 0x70, 0xd0, 0xb6, 0xef, 0x99, 0x4e, 0x6f, 0xdb, 0x24, 0xbe, 0xc6, 0xe9, 0x23, 0xf6, 0xcc,
0x67, 0xf7, 0xcc, 0x9f, 0x29, 0xb0, 0xb4, 0x85, 0xfd, 0xfb, 0x12, 0x6a, 0xe9, 0x77, 0x93, 0xf8,
0x66, 0x97, 0xbc, 0xda, 0x22, 0x22, 0x25, 0x67, 0xaa, 0x5f, 0x2b, 0x70, 0x75, 0xa4, 0x32, 0xc2,
0x74, 0x02, 0x4a, 0x02, 0xa0, 0x4d, 0x87, 0x92, 0xef, 0xe0, 0xe3, 0xcf, 0x74, 0x6b, 0x80, 0x77,
0x75, 0xd3, 0xe3, 0x50, 0x72, 0x42, 0x60, 0xfd, 0x93, 0x02, 0x57, 0xb6, 0xb0, 0xbf, 0x1b, 0xa4,
0x99, 0x33, 0xb4, 0x4e, 0x86, 0x8a, 0xe2, 0x97, 0xfc, 0x30, 0x53, 0xb5, 0x3d, 0x13, 0xf3, 0x2d,
0xb1, 0x38, 0x88, 0x04, 0xe4, 0x7d, 0x5e, 0x0b, 0x08, 0xe3, 0xa9, 0x7f, 0xcb, 0x41, 0xf5, 0x33,
0x51, 0x1f, 0xb0, 0x34, 0x92, 0xb4, 0x83, 0x92, 0x6e, 0x87, 0x48, 0x49, 0x91, 0x56, 0x65, 0x6c,
0xc1, 0x1c, 0xc1, 0xf8, 0xc9, 0x49, 0x92, 0x46, 0x95, 0x2e, 0x94, 0x60, 0xbf, 0x0d, 0x0b, 0x03,
0xe7, 0x80, 0x96, 0xb5, 0xd8, 0x10, 0xbb, 0xe0, 0xd5, 0xe5, 0x64, 0xe4, 0x19, 0x5e, 0x88, 0xbe,
0x0d, 0xf3, 0x49, 0x5e, 0xc5, 0x4c, 0xbc, 0x92, 0xcb, 0xd4, 0x9f, 0x2a, 0xb0, 0xf8, 0x58, 0xf7,
0xbb, 0x87, 0x9b, 0xb6, 0xb0, 0xe8, 0x29, 0xfc, 0xf1, 0x23, 0x28, 0x1f, 0x09, 0xeb, 0x05, 0xa0,
0x73, 0x35, 0x45, 0xa1, 0xe8, 0x39, 0x69, 0xe1, 0x0a, 0xf5, 0x9f, 0x0a, 0x5c, 0x60, 0x95, 0x7f,
0xa0, 0xdd, 0xeb, 0x8f, 0x8c, 0x09, 0xd5, 0x3f, 0xba, 0x0e, 0x35, 0x5b, 0xf7, 0x9e, 0xb4, 0x43,
0x9a, 0x22, 0xa3, 0x49, 0xcc, 0xaa, 0xcf, 0x01, 0xc4, 0x68, 0x87, 0xf4, 0x4e, 0xa0, 0xff, 0x07,
0x30, 0x2b, 0xa4, 0x8a, 0x20, 0x99, 0x74, 0xb0, 0x01, 0xb9, 0xfa, 0x2f, 0x05, 0x6a, 0x21, 0xec,
0xb1, 0x50, 0xa8, 0x41, 0x4e, 0x06, 0x40, 0xae, 0xb5, 0x89, 0x3e, 0x82, 0x19, 0xde, 0xeb, 0x09,
0xde, 0x6f, 0xc7, 0x79, 0x8b, 0x3e, 0x30, 0x82, 0x9d, 0x6c, 0x42, 0x13, 0x8b, 0xa8, 0x8d, 0x24,
0x54, 0xf0, 0xb6, 0x20, 0xaf, 0x45, 0x66, 0x50, 0x0b, 0xe6, 0xe3, 0x95, 0x56, 0xe0, 0xe8, 0xcb,
0xa3, 0x20, 0x62, 0x53, 0xf7, 0x75, 0x86, 0x10, 0xb5, 0x58, 0xa1, 0x45, 0xd4, 0xff, 0x14, 0xa1,
0x12, 0xd9, 0xe5, 0xd0, 0x4e, 0x92, 0x47, 0x9a, 0x9b, 0x0c, 0x76, 0xf9, 0xe1, 0x72, 0xff, 0x6d,
0xa8, 0x99, 0x2c, 0xc1, 0x76, 0x84, 0x2b, 0x32, 0x44, 0x2c, 0x6b, 0x73, 0x7c, 0x56, 0xc4, 0x05,
0x5a, 0x82, 0x8a, 0x33, 0xb0, 0x3b, 0xee, 0x41, 0xc7, 0x73, 0x9f, 0x11, 0xd1, 0x37, 0x94, 0x9d,
0x81, 0xfd, 0xdd, 0x03, 0xcd, 0x7d, 0x46, 0xc2, 0xd2, 0x74, 0x66, 0xca, 0xd2, 0x74, 0x09, 0x2a,
0xb6, 0xfe, 0x9c, 0x72, 0xed, 0x38, 0x03, 0x9b, 0xb5, 0x14, 0x79, 0xad, 0x6c, 0xeb, 0xcf, 0x35,
0xf7, 0xd9, 0xa3, 0x81, 0x8d, 0x56, 0xa0, 0x6e, 0xe9, 0xc4, 0xef, 0x44, 0x7b, 0x92, 0x12, 0xeb,
0x49, 0x6a, 0x74, 0xfe, 0x41, 0xd8, 0x97, 0x0c, 0x17, 0xb9, 0xe5, 0x53, 0x14, 0xb9, 0x86, 0x6d,
0x85, 0x8c, 0x20, 0x7b, 0x91, 0x6b, 0xd8, 0x96, 0x64, 0xf3, 0x01, 0xcc, 0xee, 0xb3, 0xb2, 0x85,
0x34, 0x2a, 0x23, 0x11, 0xea, 0x21, 0xad, 0x58, 0x78, 0x75, 0xa3, 0x05, 0xe4, 0xe8, 0x43, 0x28,
0xb3, 0x7c, 0xc1, 0xd6, 0x56, 0x33, 0xad, 0x0d, 0x17, 0x50, 0x28, 0x32, 0xb0, 0xe5, 0xeb, 0x6c,
0xf5, 0xdc, 0x48, 0x28, 0xda, 0xa4, 0x34, 0xdb, 0x6e, 0x8f, 0x43, 0x91, 0x5c, 0x81, 0x6e, 0xc3,
0xf9, 0xae, 0x87, 0x75, 0x1f, 0x1b, 0x1b, 0xc7, 0xf7, 0x5d, 0xbb, 0xaf, 0x33, 0x6f, 0x6a, 0xd4,
0x96, 0x95, 0x95, 0x92, 0x96, 0xf6, 0x89, 0x22, 0x43, 0x57, 0x8e, 0x1e, 0x7a, 0xae, 0xdd, 0x98,
0xe7, 0xc8, 0x10, 0x9f, 0x55, 0xbf, 0x84, 0x0b, 0xa1, 0x0f, 0x44, 0xec, 0x3d, 0x7c, 0x74, 0xca,
0x49, 0x8f, 0x6e, 0x7c, 0x49, 0xf9, 0xd7, 0x02, 0x2c, 0xb6, 0xf5, 0x23, 0xfc, 0xea, 0xab, 0xd7,
0x4c, 0x88, 0xbb, 0x0d, 0x0b, 0xac, 0x60, 0x5d, 0x8f, 0xe8, 0x33, 0x26, 0x31, 0x46, 0x8f, 0x7b,
0x78, 0x21, 0xfa, 0x98, 0x66, 0x74, 0xdc, 0x7d, 0xb2, 0xeb, 0x9a, 0x61, 0x52, 0xbc, 0x92, 0xc2,
0xe7, 0xbe, 0xa4, 0xd2, 0xa2, 0x2b, 0xd0, 0xee, 0x30, 0x78, 0xcd, 0x30, 0x26, 0x37, 0xc6, 0xb6,
0x45, 0xa1, 0xf5, 0x93, 0x18, 0x86, 0x1a, 0x30, 0x2b, 0x92, 0x2e, 0x8b, 0xec, 0x92, 0x16, 0x0c,
0xd1, 0x2e, 0x9c, 0xe7, 0x3b, 0x68, 0x0b, 0xb7, 0xe5, 0x9b, 0x2f, 0x65, 0xda, 0x7c, 0xda, 0xd2,
0xb8, 0xd7, 0x97, 0xa7, 0xf6, 0xfa, 0x06, 0xcc, 0x1a, 0x9e, 0xdb, 0xef, 0x63, 0x83, 0x85, 0x7b,
0x49, 0x0b, 0x86, 0xb4, 0xb8, 0x87, 0xd0, 0x64, 0x13, 0x7a, 0xf4, 0x6f, 0x41, 0x49, 0x3a, 0x71,
0x2e, 0xb3, 0x13, 0xcb, 0x35, 0x49, 0xa0, 0xcd, 0x27, 0x80, 0x56, 0xfd, 0xb7, 0x02, 0xd5, 0xe8,
0x16, 0x28, 0x80, 0x7b, 0xb8, 0xeb, 0x7a, 0x46, 0x07, 0x3b, 0xbe, 0x67, 0x62, 0xde, 0x07, 0x16,
0xb4, 0x39, 0x3e, 0xfb, 0x80, 0x4f, 0x52, 0x32, 0x8a, 0x9d, 0xc4, 0xd7, 0xed, 0x7e, 0xe7, 0x80,
0x86, 0x68, 0x8e, 0x93, 0xc9, 0x59, 0x1a, 0xa1, 0xe8, 0x1a, 0x54, 0x43, 0x32, 0xdf, 0x65, 0xf2,
0x0b, 0x5a, 0x45, 0xce, 0xed, 0xb9, 0xe8, 0x2d, 0xa8, 0x31, 0xab, 0x75, 0x2c, 0xb7, 0xd7, 0xa1,
0x3d, 0x93, 0xc8, 0x18, 0x55, 0x43, 0xa8, 0x45, 0x8f, 0x23, 0x4e, 0x45, 0xcc, 0x2f, 0xb0, 0xc8,
0x19, 0x92, 0xaa, 0x6d, 0x7e, 0x81, 0xd5, 0xaf, 0x14, 0x98, 0xa3, 0x09, 0xf0, 0x91, 0x6b, 0xe0,
0xbd, 0x13, 0x96, 0x0b, 0x19, 0xee, 0xcb, 0x2e, 0x43, 0x59, 0xee, 0x40, 0x6c, 0x29, 0x9c, 0xa0,
0xcd, 0xf5, 0x9c, 0xc8, 0x73, 0x6d, 0x79, 0x7f, 0xca, 0x58, 0x29, 0x8c, 0x15, 0xfb, 0x8d, 0xbe,
0x19, 0xbf, 0x7c, 0x79, 0x2b, 0x35, 0xae, 0x18, 0x13, 0x56, 0x52, 0xc6, 0x92, 0x5c, 0x96, 0xae,
0xed, 0x05, 0x3d, 0x58, 0x61, 0x0a, 0x76, 0xb0, 0x0d, 0x98, 0xd5, 0x0d, 0xc3, 0xc3, 0x84, 0x08,
0x3d, 0x82, 0x21, 0xfd, 0x72, 0x84, 0x3d, 0x12, 0xb8, 0x58, 0x5e, 0x0b, 0x86, 0xe8, 0x43, 0x28,
0xc9, 0x1a, 0x34, 0x9f, 0x56, 0x77, 0x44, 0xf5, 0x14, 0x5d, 0x86, 0x5c, 0xa1, 0x7e, 0x9d, 0x83,
0x9a, 0x08, 0xeb, 0x0d, 0x91, 0x88, 0xc6, 0x3b, 0xfb, 0x06, 0x54, 0x0f, 0xc2, 0xb0, 0x1c, 0x77,
0x9b, 0x10, 0x8d, 0xde, 0xd8, 0x9a, 0x49, 0x0e, 0x1f, 0x4f, 0x85, 0x85, 0x53, 0xa5, 0xc2, 0xe2,
0xb4, 0xa0, 0xa0, 0x7e, 0x02, 0x95, 0x08, 0x63, 0x06, 0x67, 0xfc, 0x82, 0x41, 0xd8, 0x22, 0x18,
0xd2, 0x2f, 0xfb, 0x11, 0x23, 0x94, 0x65, 0x2a, 0xa7, 0x85, 0xfd, 0xc5, 0x2d, 0xec, 0x6b, 0xb8,
0xeb, 0x1e, 0x61, 0xef, 0xf8, 0xf4, 0x77, 0x37, 0xf7, 0x22, 0x67, 0x9c, 0xb1, 0xcf, 0x90, 0x0b,
0xd0, 0xbd, 0x50, 0xcf, 0x7c, 0x5a, 0xeb, 0x1a, 0x85, 0x76, 0x71, 0x42, 0xe1, 0x56, 0x7e, 0xc5,
0x6f, 0xa1, 0xe2, 0x5b, 0x39, 0x69, 0xf6, 0x7c, 0x29, 0xe5, 0xab, 0xfa, 0x1b, 0x05, 0xfe, 0x6f,
0x0b, 0xfb, 0x0f, 0xe3, 0x9d, 0xdd, 0x59, 0x6b, 0x65, 0x43, 0x33, 0x4d, 0xa9, 0xd3, 0x9c, 0x7a,
0x13, 0x4a, 0x24, 0x68, 0x77, 0xf9, 0xfd, 0xa0, 0x1c, 0xab, 0x3f, 0x51, 0xa0, 0x21, 0xa4, 0x30,
0x99, 0xb4, 0x32, 0xb3, 0xb0, 0x8f, 0x8d, 0xd7, 0xdd, 0x7f, 0xfd, 0x4e, 0x81, 0x7a, 0x14, 0x04,
0x19, 0x8e, 0xbd, 0x0f, 0x45, 0xd6, 0xe6, 0x0a, 0x0d, 0x26, 0x3a, 0x2b, 0xa7, 0xa6, 0x11, 0xc5,
0x8a, 0x89, 0x3d, 0x12, 0x80, 0x9c, 0x18, 0x86, 0x48, 0x9c, 0x9f, 0x1a, 0x89, 0xd5, 0x5f, 0xe4,
0xa0, 0x11, 0x16, 0xae, 0xaf, 0x1d, 0xec, 0x46, 0x54, 0x3d, 0xf9, 0x97, 0x54, 0xf5, 0x14, 0xa6,
0x06, 0xb8, 0x7f, 0xe4, 0x68, 0xc7, 0x1c, 0xd8, 0x63, 0xd7, 0xd2, 0x1d, 0xb4, 0x08, 0x33, 0x7d,
0x4b, 0x0f, 0xaf, 0x8d, 0xc4, 0x08, 0xb5, 0xa1, 0x46, 0x62, 0xf6, 0x12, 0x16, 0x78, 0x37, 0xcd,
0xfe, 0x23, 0x4c, 0xac, 0x25, 0x58, 0xa0, 0x2b, 0x00, 0xbc, 0xe4, 0x64, 0x8d, 0x9d, 0x48, 0xcd,
0xfc, 0xa0, 0x69, 0x4f, 0x77, 0x0b, 0x10, 0xfd, 0xe0, 0x0e, 0xfc, 0x8e, 0xe9, 0x74, 0x08, 0xee,
0xba, 0x8e, 0x41, 0x58, 0xbd, 0x51, 0xd4, 0xea, 0xe2, 0x4b, 0xcb, 0x69, 0xf3, 0x79, 0xf4, 0x3e,
0x14, 0xfc, 0xe3, 0x3e, 0xaf, 0x34, 0x6a, 0xa9, 0xc8, 0x16, 0xea, 0xb5, 0x77, 0xdc, 0xc7, 0x1a,
0x23, 0xa7, 0x3d, 0x3d, 0x65, 0xe5, 0x7b, 0xfa, 0x11, 0xb6, 0x82, 0x07, 0xaf, 0x70, 0x86, 0x7a,
0x62, 0xd0, 0x1b, 0xcf, 0xf2, 0x44, 0x2c, 0x86, 0xea, 0xdf, 0x73, 0x50, 0x0f, 0x59, 0x6a, 0x98,
0x0c, 0x2c, 0x7f, 0xa4, 0xfd, 0xc6, 0xb7, 0x0b, 0x93, 0xd2, 0xe0, 0xc7, 0x50, 0x11, 0x7d, 0xfa,
0x14, 0x89, 0x10, 0xf8, 0x92, 0xed, 0x31, 0xae, 0x57, 0x7c, 0x49, 0xae, 0x37, 0x33, 0xb5, 0xeb,
0xb5, 0x61, 0x31, 0x00, 0xad, 0x50, 0xd2, 0x0e, 0xf6, 0xf5, 0x31, 0x69, 0xf6, 0x2a, 0x54, 0x78,
0x32, 0xe2, 0x85, 0x27, 0x2f, 0xf5, 0x60, 0x5f, 0x36, 0x41, 0xea, 0x0f, 0xe1, 0x02, 0x0b, 0xfa,
0xe4, 0x7d, 0x5e, 0x96, 0x1b, 0x51, 0x55, 0x16, 0x92, 0xb4, 0x68, 0x0c, 0x12, 0x79, 0x6c, 0x4e,
0xdd, 0x86, 0x37, 0x12, 0xfc, 0x4f, 0x01, 0xea, 0x37, 0xef, 0xc0, 0xc2, 0x10, 0x52, 0xa1, 0x1a,
0xc0, 0xa7, 0x4e, 0x57, 0x40, 0x78, 0xfd, 0x1c, 0xaa, 0x42, 0x29, 0x00, 0xf4, 0xba, 0x72, 0xb3,
0x1d, 0x8d, 0x57, 0xea, 0xc4, 0xe8, 0x22, 0x9c, 0xff, 0xd4, 0x31, 0xf0, 0x81, 0xe9, 0x60, 0x23,
0xfc, 0x54, 0x3f, 0x87, 0xce, 0xc3, 0x7c, 0xcb, 0x71, 0xb0, 0x17, 0x99, 0x54, 0xe8, 0xe4, 0x0e,
0xf6, 0x7a, 0x38, 0x32, 0x99, 0x5b, 0xff, 0xcb, 0x02, 0x94, 0x69, 0xed, 0x79, 0xdf, 0x75, 0x3d,
0x03, 0xf5, 0x01, 0xb1, 0xe7, 0x03, 0xbb, 0xef, 0x3a, 0xf2, 0x9d, 0x0d, 0xdd, 0x1e, 0xd1, 0xc6,
0x0c, 0x93, 0x0a, 0x9b, 0x37, 0xaf, 0x8f, 0x58, 0x91, 0x20, 0x57, 0xcf, 0x21, 0x9b, 0x49, 0xa4,
0x11, 0xbf, 0x67, 0x76, 0x9f, 0x04, 0x77, 0x4e, 0x63, 0x24, 0x26, 0x48, 0x03, 0x89, 0x89, 0xe7,
0x3b, 0x31, 0xe0, 0x6f, 0x3c, 0xc1, 0x49, 0xa9, 0xe7, 0xd0, 0x53, 0xb8, 0xb0, 0x85, 0xfd, 0xf0,
0x5a, 0x3f, 0x10, 0xb8, 0x3e, 0x5a, 0xe0, 0x10, 0xf1, 0x94, 0x22, 0xb7, 0xa1, 0xc8, 0x52, 0x33,
0x4a, 0x8b, 0x90, 0xe8, 0x9f, 0x4d, 0x9a, 0xcb, 0xa3, 0x09, 0x24, 0xb7, 0x1f, 0xc1, 0x7c, 0xe2,
0x31, 0x1d, 0xbd, 0x93, 0xb2, 0x2c, 0xfd, 0x6f, 0x11, 0xcd, 0x9b, 0x59, 0x48, 0xa5, 0xac, 0x1e,
0xd4, 0xe2, 0x8f, 0x0f, 0x68, 0x25, 0x65, 0x7d, 0xea, 0x43, 0x68, 0xf3, 0x9d, 0x0c, 0x94, 0x52,
0x90, 0x0d, 0xf5, 0xe4, 0xe3, 0x2e, 0xba, 0x39, 0x96, 0x41, 0xdc, 0xdd, 0xde, 0xcd, 0x44, 0x2b,
0xc5, 0x1d, 0x33, 0x27, 0x18, 0x7a, 0x5c, 0x44, 0xab, 0xe9, 0x6c, 0x46, 0xbd, 0x7a, 0x36, 0xd7,
0x32, 0xd3, 0x4b, 0xd1, 0x5f, 0xf1, 0x96, 0x20, 0xed, 0x81, 0x0e, 0xdd, 0x49, 0x67, 0x37, 0xe6,
0x65, 0xb1, 0xb9, 0x3e, 0xcd, 0x12, 0xa9, 0xc4, 0x97, 0xac, 0x96, 0x4f, 0x79, 0xe4, 0x4a, 0xc6,
0x5d, 0xc0, 0x6f, 0xf4, 0xeb, 0x5d, 0xf3, 0xce, 0x14, 0x2b, 0xa4, 0x02, 0x6e, 0xf2, 0xf9, 0x3c,
0x08, 0xc3, 0xb5, 0x89, 0x5e, 0x73, 0xb2, 0x18, 0xfc, 0x1c, 0xe6, 0x13, 0x77, 0x7f, 0xa9, 0x51,
0x93, 0x7e, 0x3f, 0xd8, 0x1c, 0x07, 0xe8, 0x3c, 0x24, 0x13, 0xad, 0x11, 0x1a, 0xe1, 0xfd, 0x29,
0xed, 0x53, 0xf3, 0x66, 0x16, 0x52, 0xb9, 0x11, 0xc2, 0xe0, 0x32, 0xd1, 0x5e, 0xa0, 0x5b, 0xe9,
0x3c, 0xd2, 0x5b, 0xa3, 0xe6, 0x7b, 0x19, 0xa9, 0xa5, 0xd0, 0x0e, 0xc0, 0x16, 0xf6, 0x77, 0xb0,
0xef, 0x51, 0x1f, 0xb9, 0x9e, 0x6a, 0xf2, 0x90, 0x20, 0x10, 0x73, 0x63, 0x22, 0x9d, 0x14, 0xf0,
0x7d, 0x40, 0x41, 0x9e, 0x8b, 0x5c, 0x2d, 0xbf, 0x39, 0xb6, 0x8a, 0xe3, 0x25, 0xd7, 0xa4, 0xb3,
0x79, 0x0a, 0xf5, 0x1d, 0xdd, 0x19, 0xe8, 0x56, 0x84, 0xef, 0xad, 0x54, 0xc5, 0x92, 0x64, 0x23,
0xac, 0x35, 0x92, 0x5a, 0x6e, 0xe6, 0x99, 0xcc, 0xa1, 0xba, 0x0c, 0x41, 0x9c, 0xc4, 0x96, 0xd0,
0x1a, 0x09, 0xc2, 0x11, 0xd8, 0x32, 0x86, 0x5e, 0x0a, 0x7e, 0xa1, 0xb0, 0x3f, 0x69, 0x24, 0x08,
0x1e, 0x9b, 0xfe, 0x21, 0x2d, 0xee, 0x49, 0x16, 0x15, 0x18, 0xe1, 0x14, 0x2a, 0x08, 0x7a, 0xa9,
0x82, 0x01, 0x73, 0xb1, 0x1a, 0x09, 0xa5, 0x5d, 0x1f, 0xa7, 0x55, 0x69, 0xcd, 0x95, 0xc9, 0x84,
0x81, 0x94, 0xf5, 0xff, 0x16, 0xa0, 0x14, 0xdc, 0x97, 0x9d, 0x41, 0xc9, 0x72, 0x06, 0x35, 0xc4,
0xe7, 0x30, 0x9f, 0x78, 0xad, 0x4e, 0x85, 0x98, 0xf4, 0x17, 0xed, 0x49, 0x31, 0xf2, 0x58, 0xfc,
0xf1, 0x54, 0xc2, 0xc9, 0x8d, 0x51, 0x75, 0x48, 0x12, 0x49, 0x26, 0x30, 0x7e, 0xe5, 0xb8, 0xf1,
0x08, 0x20, 0x12, 0xd7, 0xe3, 0xbb, 0x3e, 0xea, 0xaa, 0x13, 0x14, 0xde, 0xb8, 0xfb, 0x83, 0x3b,
0x3d, 0xd3, 0x3f, 0x1c, 0xec, 0xd3, 0x2f, 0x6b, 0x9c, 0xf4, 0x3d, 0xd3, 0x15, 0xbf, 0xd6, 0x82,
0x13, 0x5d, 0x63, 0xab, 0xd7, 0xa8, 0x80, 0xfe, 0xfe, 0xfe, 0x0c, 0x1b, 0xdd, 0xfd, 0x5f, 0x00,
0x00, 0x00, 0xff, 0xff, 0x15, 0x42, 0x87, 0xcd, 0x9a, 0x2c, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -2909,6 +3000,7 @@ type DataCoordClient interface {
ManualCompaction(ctx context.Context, in *milvuspb.ManualCompactionRequest, opts ...grpc.CallOption) (*milvuspb.ManualCompactionResponse, error)
GetCompactionState(ctx context.Context, in *milvuspb.GetCompactionStateRequest, opts ...grpc.CallOption) (*milvuspb.GetCompactionStateResponse, error)
GetCompactionStateWithPlans(ctx context.Context, in *milvuspb.GetCompactionPlansRequest, opts ...grpc.CallOption) (*milvuspb.GetCompactionPlansResponse, error)
WatchChannels(ctx context.Context, in *WatchChannelsRequest, opts ...grpc.CallOption) (*WatchChannelsResponse, error)
}
type dataCoordClient struct {
@ -3090,6 +3182,15 @@ func (c *dataCoordClient) GetCompactionStateWithPlans(ctx context.Context, in *m
return out, nil
}
func (c *dataCoordClient) WatchChannels(ctx context.Context, in *WatchChannelsRequest, opts ...grpc.CallOption) (*WatchChannelsResponse, error) {
out := new(WatchChannelsResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.data.DataCoord/WatchChannels", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// DataCoordServer is the server API for DataCoord service.
type DataCoordServer interface {
GetComponentStates(context.Context, *internalpb.GetComponentStatesRequest) (*internalpb.ComponentStates, error)
@ -3112,6 +3213,7 @@ type DataCoordServer interface {
ManualCompaction(context.Context, *milvuspb.ManualCompactionRequest) (*milvuspb.ManualCompactionResponse, error)
GetCompactionState(context.Context, *milvuspb.GetCompactionStateRequest) (*milvuspb.GetCompactionStateResponse, error)
GetCompactionStateWithPlans(context.Context, *milvuspb.GetCompactionPlansRequest) (*milvuspb.GetCompactionPlansResponse, error)
WatchChannels(context.Context, *WatchChannelsRequest) (*WatchChannelsResponse, error)
}
// UnimplementedDataCoordServer can be embedded to have forward compatible implementations.
@ -3175,6 +3277,9 @@ func (*UnimplementedDataCoordServer) GetCompactionState(ctx context.Context, req
func (*UnimplementedDataCoordServer) GetCompactionStateWithPlans(ctx context.Context, req *milvuspb.GetCompactionPlansRequest) (*milvuspb.GetCompactionPlansResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetCompactionStateWithPlans not implemented")
}
func (*UnimplementedDataCoordServer) WatchChannels(ctx context.Context, req *WatchChannelsRequest) (*WatchChannelsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method WatchChannels not implemented")
}
func RegisterDataCoordServer(s *grpc.Server, srv DataCoordServer) {
s.RegisterService(&_DataCoord_serviceDesc, srv)
@ -3522,6 +3627,24 @@ func _DataCoord_GetCompactionStateWithPlans_Handler(srv interface{}, ctx context
return interceptor(ctx, in, info, handler)
}
func _DataCoord_WatchChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(WatchChannelsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DataCoordServer).WatchChannels(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.data.DataCoord/WatchChannels",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DataCoordServer).WatchChannels(ctx, req.(*WatchChannelsRequest))
}
return interceptor(ctx, in, info, handler)
}
var _DataCoord_serviceDesc = grpc.ServiceDesc{
ServiceName: "milvus.proto.data.DataCoord",
HandlerType: (*DataCoordServer)(nil),
@ -3602,6 +3725,10 @@ var _DataCoord_serviceDesc = grpc.ServiceDesc{
MethodName: "GetCompactionStateWithPlans",
Handler: _DataCoord_GetCompactionStateWithPlans_Handler,
},
{
MethodName: "WatchChannels",
Handler: _DataCoord_WatchChannels_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "data_coord.proto",

View File

@ -194,6 +194,10 @@ func (coord *DataCoordMock) GetCompactionStateWithPlans(ctx context.Context, req
return &milvuspb.GetCompactionPlansResponse{}, nil
}
func (coord *DataCoordMock) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
return &datapb.WatchChannelsResponse{}, nil
}
func NewDataCoordMock() *DataCoordMock {
return &DataCoordMock{
nodeID: typeutil.UniqueID(uniquegenerator.GetUniqueIntGeneratorIns().GetInt()),

View File

@ -342,11 +342,8 @@ type dqTaskQueue struct {
}
func (queue *ddTaskQueue) Enqueue(t task) error {
log.Debug("get mutex")
queue.lock.Lock()
log.Debug("get mutex end")
defer queue.lock.Unlock()
log.Debug("get mutex enqueue")
return queue.baseTaskQueue.Enqueue(t)
}

View File

@ -161,7 +161,7 @@ func (q *queryCollection) registerCollectionTSafe() error {
if err != nil {
return err
}
for _, channel := range historicalCollection.getVChannels() {
for _, channel := range historicalCollection.getVDeltaChannels() {
err := q.addTSafeWatcher(channel)
if err != nil {
return err
@ -169,7 +169,7 @@ func (q *queryCollection) registerCollectionTSafe() error {
}
log.Debug("register tSafe watcher and init watcher select case",
zap.Any("collectionID", historicalCollection.ID()),
zap.Any("delta channels", historicalCollection.getVChannels()))
zap.Any("delta channels", historicalCollection.getVDeltaChannels()))
return nil
}
@ -426,7 +426,7 @@ func (q *queryCollection) receiveQueryMsg(msg queryMsg) error {
serviceTime := q.getServiceableTime()
gt, _ := tsoutil.ParseTS(guaranteeTs)
st, _ := tsoutil.ParseTS(serviceTime)
if guaranteeTs > serviceTime && len(collection.getVChannels()) > 0 {
if guaranteeTs > serviceTime && (len(collection.getVChannels()) > 0 || len(collection.getVDeltaChannels()) > 0) {
log.Debug("query node::receiveQueryMsg: add to unsolvedMsg",
zap.Any("collectionID", q.collectionID),
zap.Any("sm.GuaranteeTimestamp", gt),

View File

@ -172,14 +172,28 @@ func (w *watchDmChannelsTask) Execute(ctx context.Context) error {
sCol.addVChannels(vChannels)
sCol.addPChannels(pChannels)
sCol.setLoadType(l)
hCol, err := w.node.historical.replica.getCollectionByID(collectionID)
if err != nil {
return err
}
hCol.addVChannels(vChannels)
hCol.addPChannels(pChannels)
hCol.setLoadType(l)
if loadPartition {
sCol.deleteReleasedPartition(partitionID)
hCol.deleteReleasedPartition(partitionID)
if hasPartitionInStreaming := w.node.streaming.replica.hasPartition(partitionID); !hasPartitionInStreaming {
err := w.node.streaming.replica.addPartition(collectionID, partitionID)
if err != nil {
return err
}
}
if hasPartitionInHistorical := w.node.historical.replica.hasPartition(partitionID); !hasPartitionInHistorical {
err := w.node.historical.replica.addPartition(collectionID, partitionID)
if err != nil {
return err
}
}
}
log.Debug("watchDMChannel, init replica done", zap.Any("collectionID", collectionID))
@ -366,6 +380,16 @@ func (w *watchDeltaChannelsTask) Execute(ctx context.Context) error {
hCol.addVDeltaChannels(vDeltaChannels)
hCol.addPDeltaChannels(pDeltaChannels)
if hasCollectionInStreaming := w.node.streaming.replica.hasCollection(collectionID); !hasCollectionInStreaming {
return fmt.Errorf("cannot find collection with collectionID, %d", collectionID)
}
sCol, err := w.node.streaming.replica.getCollectionByID(collectionID)
if err != nil {
return err
}
sCol.addVDeltaChannels(vDeltaChannels)
sCol.addPDeltaChannels(pDeltaChannels)
// get subscription name
getUniqueSubName := func() string {
prefixName := Params.MsgChannelSubName
@ -582,12 +606,14 @@ const (
func (r *releaseCollectionTask) Execute(ctx context.Context) error {
log.Debug("Execute release collection task", zap.Any("collectionID", r.req.CollectionID))
errMsg := "release collection failed, collectionID = " + strconv.FormatInt(r.req.CollectionID, 10) + ", err = "
log.Debug("release streaming", zap.Any("collectionID", r.req.CollectionID))
err := r.releaseReplica(r.node.streaming.replica, replicaStreaming)
if err != nil {
return errors.New(errMsg + err.Error())
}
// remove collection metas in streaming and historical
log.Debug("release historical", zap.Any("collectionID", r.req.CollectionID))
err = r.releaseReplica(r.node.historical.replica, replicaHistorical)
if err != nil {
return errors.New(errMsg + err.Error())
@ -606,6 +632,7 @@ func (r *releaseCollectionTask) releaseReplica(replica ReplicaInterface, replica
return err
}
// set release time
log.Debug("set release time", zap.Any("collectionID", r.req.CollectionID))
collection.setReleaseTime(r.req.Base.Timestamp)
// sleep to wait for query tasks done
@ -706,6 +733,7 @@ func (r *releasePartitionsTask) Execute(ctx context.Context) error {
if err != nil {
return err
}
log.Debug("start release partition", zap.Any("collectionID", r.req.CollectionID))
// release partitions
vChannels := sCol.getVChannels()
@ -748,6 +776,26 @@ func (r *releasePartitionsTask) Execute(ctx context.Context) error {
hCol.addReleasedPartition(id)
sCol.addReleasedPartition(id)
}
pids, err := r.node.historical.replica.getPartitionIDs(r.req.CollectionID)
if err != nil {
return err
}
log.Debug("start release history pids", zap.Any("pids", pids))
if len(pids) == 0 && hCol.getLoadType() == loadTypePartition {
r.node.dataSyncService.removeCollectionDeltaFlowGraph(r.req.CollectionID)
vChannels := hCol.getVDeltaChannels()
for _, channel := range vChannels {
log.Debug("Releasing tSafe in releasePartitionTask...",
zap.Any("collectionID", r.req.CollectionID),
zap.Any("vChannel", channel),
)
// no tSafe in tSafeReplica, don't return error
err = r.node.tSafeReplica.removeTSafe(channel)
if err != nil {
log.Warn(err.Error())
}
}
}
// release global segment info
r.node.historical.removeGlobalSegmentIDsByPartitionIds(r.req.PartitionIDs)

View File

@ -79,6 +79,7 @@ func newTSafe(ctx context.Context, channel Channel) tSafer {
watcherList: make([]*tSafeWatcher, 0),
tSafeChan: make(chan tSafeMsg, channelSize),
tSafeRecord: make(map[UniqueID]Timestamp),
tSafe: math.MaxUint64,
}
return t
}

View File

@ -124,6 +124,8 @@ type Core struct {
CallReleaseCollectionService func(ctx context.Context, ts typeutil.Timestamp, dbID, collectionID typeutil.UniqueID) error
CallReleasePartitionService func(ctx context.Context, ts typeutil.Timestamp, dbID, collectionID typeutil.UniqueID, partitionIDs []typeutil.UniqueID) error
CallWatchChannels func(ctx context.Context, collectionID int64, channelNames []string) error
// dml channels used for insert
dmlChannels *dmlChannels
@ -233,6 +235,9 @@ func (c *Core) checkInit() error {
if c.CallGetFlushedSegmentsService == nil {
return fmt.Errorf("CallGetFlushedSegments is nil")
}
if c.CallWatchChannels == nil {
return fmt.Errorf("WatchChannelReq is nil")
}
if c.NewProxyClient == nil {
return fmt.Errorf("NewProxyClient is nil")
}
@ -672,6 +677,26 @@ func (c *Core) SetDataCoord(ctx context.Context, s types.DataCoord) error {
return rsp.Segments, nil
}
c.CallWatchChannels = func(ctx context.Context, collectionID int64, channelNames []string) (retErr error) {
defer func() {
if err := recover(); err != nil {
retErr = fmt.Errorf("watch channels panic, msg = %v", err)
}
}()
<-initCh
req := &datapb.WatchChannelsRequest{
CollectionID: collectionID,
ChannelNames: channelNames,
}
rsp, err := s.WatchChannels(ctx, req)
if err != nil {
return err
}
if rsp.Status.ErrorCode != commonpb.ErrorCode_Success {
return fmt.Errorf("data coord watch channels failed, reason = %s", rsp.Status.Reason)
}
return nil
}
return nil
}

View File

@ -148,6 +148,13 @@ func (d *dataMock) GetFlushedSegments(ctx context.Context, req *datapb.GetFlushe
return rsp, nil
}
func (d *dataMock) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error) {
return &datapb.WatchChannelsResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
}}, nil
}
type queryMock struct {
types.QueryCoord
collID []typeutil.UniqueID
@ -2438,7 +2445,14 @@ func TestCheckInit(t *testing.T) {
return nil
}
err = c.checkInit()
assert.NotNil(t, err)
c.CallWatchChannels = func(ctx context.Context, collectionID int64, channelNames []string) error {
return nil
}
err = c.checkInit()
assert.Nil(t, err)
err = c.Stop()
assert.Nil(t, err)
}

View File

@ -231,6 +231,7 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
t.core.chanTimeTick.RemoveDdlTimeTick(ts, reason)
t.core.SendTimeTick(ts, reason)
return nil
}
@ -239,6 +240,11 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
return err
}
err = t.core.CallWatchChannels(ctx, collID, vchanNames)
if err != nil {
return err
}
// Update DDOperation in etcd
return t.core.setDdMsgSendFlag(true)
}

View File

@ -228,6 +228,8 @@ type DataCoord interface {
// GetCompactionState gets the state of a compaction
GetCompactionState(ctx context.Context, req *milvuspb.GetCompactionStateRequest) (*milvuspb.GetCompactionStateResponse, error)
GetCompactionStateWithPlans(ctx context.Context, req *milvuspb.GetCompactionPlansRequest) (*milvuspb.GetCompactionPlansResponse, error)
WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error)
}
// IndexNode is the interface `indexnode` package implements