Add grpc interface for replica Search/Query in QueryNode (#16197)

Resolves #16195
Add Search and Query grpc interface in query proto and types/types.go

Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
pull/16309/head
congqixia 2022-03-30 12:03:27 +08:00 committed by GitHub
parent b6b3c9863c
commit 18a3e9f265
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 513 additions and 177 deletions

View File

@ -241,6 +241,34 @@ func (c *Client) ReleaseSegments(ctx context.Context, req *querypb.ReleaseSegmen
return ret.(*commonpb.Status), err
}
// Search performs replica search tasks in QueryNode.
func (c *Client) Search(ctx context.Context, req *querypb.SearchRequest) (*milvuspb.SearchResults, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client interface{}) (interface{}, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
return client.(querypb.QueryNodeClient).Search(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*milvuspb.SearchResults), err
}
// Query performs replica query tasks in QueryNode.
func (c *Client) Query(ctx context.Context, req *querypb.QueryRequest) (*milvuspb.QueryResults, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client interface{}) (interface{}, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
return client.(querypb.QueryNodeClient).Query(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*milvuspb.QueryResults), err
}
// GetSegmentInfo gets the information of the specified segments in QueryNode.
func (c *Client) GetSegmentInfo(ctx context.Context, req *querypb.GetSegmentInfoRequest) (*querypb.GetSegmentInfoResponse, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client interface{}) (interface{}, error) {

View File

@ -48,6 +48,8 @@ func Test_NewClient(t *testing.T) {
err = client.Register()
assert.Nil(t, err)
ctx, cancel := context.WithCancel(ctx)
checkFunc := func(retNotNil bool) {
retCheck := func(notNil bool, ret interface{}, err error) {
if notNil {
@ -97,6 +99,12 @@ func Test_NewClient(t *testing.T) {
r13, err := client.WatchDeltaChannels(ctx, nil)
retCheck(retNotNil, r13, err)
r14, err := client.Search(ctx, nil)
retCheck(retNotNil, r14, err)
r15, err := client.Query(ctx, nil)
retCheck(retNotNil, r15, err)
}
client.grpcClient = &mock.ClientBase{
@ -132,6 +140,15 @@ func Test_NewClient(t *testing.T) {
client.grpcClient.SetNewGrpcClientFunc(newFunc3)
checkFunc(true)
// ctx canceled
client.grpcClient = &mock.ClientBase{
GetGrpcClientErr: nil,
}
client.grpcClient.SetNewGrpcClientFunc(newFunc1)
cancel() // make context canceled
checkFunc(false)
err = client.Stop()
assert.Nil(t, err)
}

View File

@ -304,6 +304,16 @@ func (s *Server) GetSegmentInfo(ctx context.Context, req *querypb.GetSegmentInfo
return s.querynode.GetSegmentInfo(ctx, req)
}
// Search performs search of streaming/historical replica on QueryNode.
func (s *Server) Search(ctx context.Context, req *querypb.SearchRequest) (*milvuspb.SearchResults, error) {
return s.querynode.Search(ctx, req)
}
// Query performs query of streaming/historical replica on QueryNode.
func (s *Server) Query(ctx context.Context, req *querypb.QueryRequest) (*milvuspb.QueryResults, error) {
return s.querynode.Query(ctx, req)
}
// GetMetrics gets the metrics information of QueryNode.
func (s *Server) GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error) {
return s.querynode.GetMetrics(ctx, req)

View File

@ -43,6 +43,8 @@ type MockQueryNode struct {
strResp *milvuspb.StringResponse
infoResp *querypb.GetSegmentInfoResponse
metricResp *milvuspb.GetMetricsResponse
searchResp *milvuspb.SearchResults
queryResp *milvuspb.QueryResults
}
func (m *MockQueryNode) Init() error {
@ -113,6 +115,14 @@ func (m *MockQueryNode) GetMetrics(ctx context.Context, req *milvuspb.GetMetrics
return m.metricResp, m.err
}
func (m *MockQueryNode) Search(ctx context.Context, req *querypb.SearchRequest) (*milvuspb.SearchResults, error) {
return m.searchResp, m.err
}
func (m *MockQueryNode) Query(ctx context.Context, req *querypb.QueryRequest) (*milvuspb.QueryResults, error) {
return m.queryResp, m.err
}
func (m *MockQueryNode) SetEtcdClient(client *clientv3.Client) {
}
@ -307,6 +317,20 @@ func Test_NewServer(t *testing.T) {
assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
})
t.Run("Search", func(t *testing.T) {
req := &querypb.SearchRequest{}
resp, err := server.Search(ctx, req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
})
t.Run("Query", func(t *testing.T) {
req := &querypb.QueryRequest{}
resp, err := server.Query(ctx, req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
})
err = server.Stop()
assert.Nil(t, err)
}

View File

@ -47,6 +47,9 @@ service QueryNode {
rpc ReleaseSegments(ReleaseSegmentsRequest) returns (common.Status) {}
rpc GetSegmentInfo(GetSegmentInfoRequest) returns (GetSegmentInfoResponse) {}
rpc Search(SearchRequest) returns (milvus.SearchResults) {}
rpc Query(QueryRequest) returns (milvus.QueryResults) {}
// https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
rpc GetMetrics(milvus.GetMetricsRequest) returns (milvus.GetMetricsResponse) {}
}
@ -233,6 +236,18 @@ message ReleaseSegmentsRequest {
repeated int64 segmentIDs = 6;
}
message SearchRequest {
milvus.SearchRequest req = 1;
string dml_channel = 2;
repeated int64 segmentIDs = 3;
}
message QueryRequest {
milvus.QueryRequest req = 1;
string dml_channel = 2;
repeated int64 segmentIDs = 3;
}
//----------------request auto triggered by QueryCoord-----------------
message HandoffSegmentsRequest {
common.MsgBase base = 1;
@ -355,4 +370,5 @@ message ReplicaInfo { // ReplicaGroup
message ShardReplica {
int64 leader = 1;
string dm_channel_name = 2;
}
}

View File

@ -1721,6 +1721,116 @@ func (m *ReleaseSegmentsRequest) GetSegmentIDs() []int64 {
return nil
}
type SearchRequest struct {
Req *milvuspb.SearchRequest `protobuf:"bytes,1,opt,name=req,proto3" json:"req,omitempty"`
DmlChannel string `protobuf:"bytes,2,opt,name=dml_channel,json=dmlChannel,proto3" json:"dml_channel,omitempty"`
SegmentIDs []int64 `protobuf:"varint,3,rep,packed,name=segmentIDs,proto3" json:"segmentIDs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SearchRequest) Reset() { *m = SearchRequest{} }
func (m *SearchRequest) String() string { return proto.CompactTextString(m) }
func (*SearchRequest) ProtoMessage() {}
func (*SearchRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{23}
}
func (m *SearchRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchRequest.Unmarshal(m, b)
}
func (m *SearchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SearchRequest.Marshal(b, m, deterministic)
}
func (m *SearchRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_SearchRequest.Merge(m, src)
}
func (m *SearchRequest) XXX_Size() int {
return xxx_messageInfo_SearchRequest.Size(m)
}
func (m *SearchRequest) XXX_DiscardUnknown() {
xxx_messageInfo_SearchRequest.DiscardUnknown(m)
}
var xxx_messageInfo_SearchRequest proto.InternalMessageInfo
func (m *SearchRequest) GetReq() *milvuspb.SearchRequest {
if m != nil {
return m.Req
}
return nil
}
func (m *SearchRequest) GetDmlChannel() string {
if m != nil {
return m.DmlChannel
}
return ""
}
func (m *SearchRequest) GetSegmentIDs() []int64 {
if m != nil {
return m.SegmentIDs
}
return nil
}
type QueryRequest struct {
Req *milvuspb.QueryRequest `protobuf:"bytes,1,opt,name=req,proto3" json:"req,omitempty"`
DmlChannel string `protobuf:"bytes,2,opt,name=dml_channel,json=dmlChannel,proto3" json:"dml_channel,omitempty"`
SegmentIDs []int64 `protobuf:"varint,3,rep,packed,name=segmentIDs,proto3" json:"segmentIDs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryRequest) Reset() { *m = QueryRequest{} }
func (m *QueryRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRequest) ProtoMessage() {}
func (*QueryRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{24}
}
func (m *QueryRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryRequest.Unmarshal(m, b)
}
func (m *QueryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryRequest.Marshal(b, m, deterministic)
}
func (m *QueryRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryRequest.Merge(m, src)
}
func (m *QueryRequest) XXX_Size() int {
return xxx_messageInfo_QueryRequest.Size(m)
}
func (m *QueryRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryRequest proto.InternalMessageInfo
func (m *QueryRequest) GetReq() *milvuspb.QueryRequest {
if m != nil {
return m.Req
}
return nil
}
func (m *QueryRequest) GetDmlChannel() string {
if m != nil {
return m.DmlChannel
}
return ""
}
func (m *QueryRequest) GetSegmentIDs() []int64 {
if m != nil {
return m.SegmentIDs
}
return nil
}
//----------------request auto triggered by QueryCoord-----------------
type HandoffSegmentsRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
@ -1734,7 +1844,7 @@ func (m *HandoffSegmentsRequest) Reset() { *m = HandoffSegmentsRequest{}
func (m *HandoffSegmentsRequest) String() string { return proto.CompactTextString(m) }
func (*HandoffSegmentsRequest) ProtoMessage() {}
func (*HandoffSegmentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{23}
return fileDescriptor_aab7cc9a69ed26e8, []int{25}
}
func (m *HandoffSegmentsRequest) XXX_Unmarshal(b []byte) error {
@ -1784,7 +1894,7 @@ func (m *LoadBalanceRequest) Reset() { *m = LoadBalanceRequest{} }
func (m *LoadBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*LoadBalanceRequest) ProtoMessage() {}
func (*LoadBalanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{24}
return fileDescriptor_aab7cc9a69ed26e8, []int{26}
}
func (m *LoadBalanceRequest) XXX_Unmarshal(b []byte) error {
@ -1853,7 +1963,7 @@ func (m *DmChannelWatchInfo) Reset() { *m = DmChannelWatchInfo{} }
func (m *DmChannelWatchInfo) String() string { return proto.CompactTextString(m) }
func (*DmChannelWatchInfo) ProtoMessage() {}
func (*DmChannelWatchInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{25}
return fileDescriptor_aab7cc9a69ed26e8, []int{27}
}
func (m *DmChannelWatchInfo) XXX_Unmarshal(b []byte) error {
@ -1910,7 +2020,7 @@ func (m *QueryChannelInfo) Reset() { *m = QueryChannelInfo{} }
func (m *QueryChannelInfo) String() string { return proto.CompactTextString(m) }
func (*QueryChannelInfo) ProtoMessage() {}
func (*QueryChannelInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{26}
return fileDescriptor_aab7cc9a69ed26e8, []int{28}
}
func (m *QueryChannelInfo) XXX_Unmarshal(b []byte) error {
@ -1979,7 +2089,7 @@ func (m *PartitionStates) Reset() { *m = PartitionStates{} }
func (m *PartitionStates) String() string { return proto.CompactTextString(m) }
func (*PartitionStates) ProtoMessage() {}
func (*PartitionStates) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{27}
return fileDescriptor_aab7cc9a69ed26e8, []int{29}
}
func (m *PartitionStates) XXX_Unmarshal(b []byte) error {
@ -2046,7 +2156,7 @@ func (m *SegmentInfo) Reset() { *m = SegmentInfo{} }
func (m *SegmentInfo) String() string { return proto.CompactTextString(m) }
func (*SegmentInfo) ProtoMessage() {}
func (*SegmentInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{28}
return fileDescriptor_aab7cc9a69ed26e8, []int{30}
}
func (m *SegmentInfo) XXX_Unmarshal(b []byte) error {
@ -2190,7 +2300,7 @@ func (m *CollectionInfo) Reset() { *m = CollectionInfo{} }
func (m *CollectionInfo) String() string { return proto.CompactTextString(m) }
func (*CollectionInfo) ProtoMessage() {}
func (*CollectionInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{29}
return fileDescriptor_aab7cc9a69ed26e8, []int{31}
}
func (m *CollectionInfo) XXX_Unmarshal(b []byte) error {
@ -2279,7 +2389,7 @@ func (m *UnsubscribeChannels) Reset() { *m = UnsubscribeChannels{} }
func (m *UnsubscribeChannels) String() string { return proto.CompactTextString(m) }
func (*UnsubscribeChannels) ProtoMessage() {}
func (*UnsubscribeChannels) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{30}
return fileDescriptor_aab7cc9a69ed26e8, []int{32}
}
func (m *UnsubscribeChannels) XXX_Unmarshal(b []byte) error {
@ -2326,7 +2436,7 @@ func (m *UnsubscribeChannelInfo) Reset() { *m = UnsubscribeChannelInfo{}
func (m *UnsubscribeChannelInfo) String() string { return proto.CompactTextString(m) }
func (*UnsubscribeChannelInfo) ProtoMessage() {}
func (*UnsubscribeChannelInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{31}
return fileDescriptor_aab7cc9a69ed26e8, []int{33}
}
func (m *UnsubscribeChannelInfo) XXX_Unmarshal(b []byte) error {
@ -2376,7 +2486,7 @@ func (m *SegmentChangeInfo) Reset() { *m = SegmentChangeInfo{} }
func (m *SegmentChangeInfo) String() string { return proto.CompactTextString(m) }
func (*SegmentChangeInfo) ProtoMessage() {}
func (*SegmentChangeInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{32}
return fileDescriptor_aab7cc9a69ed26e8, []int{34}
}
func (m *SegmentChangeInfo) XXX_Unmarshal(b []byte) error {
@ -2437,7 +2547,7 @@ func (m *SealedSegmentsChangeInfo) Reset() { *m = SealedSegmentsChangeIn
func (m *SealedSegmentsChangeInfo) String() string { return proto.CompactTextString(m) }
func (*SealedSegmentsChangeInfo) ProtoMessage() {}
func (*SealedSegmentsChangeInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{33}
return fileDescriptor_aab7cc9a69ed26e8, []int{35}
}
func (m *SealedSegmentsChangeInfo) XXX_Unmarshal(b []byte) error {
@ -2487,7 +2597,7 @@ func (m *ReplicaInfo) Reset() { *m = ReplicaInfo{} }
func (m *ReplicaInfo) String() string { return proto.CompactTextString(m) }
func (*ReplicaInfo) ProtoMessage() {}
func (*ReplicaInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{34}
return fileDescriptor_aab7cc9a69ed26e8, []int{36}
}
func (m *ReplicaInfo) XXX_Unmarshal(b []byte) error {
@ -2555,7 +2665,7 @@ func (m *ShardReplica) Reset() { *m = ShardReplica{} }
func (m *ShardReplica) String() string { return proto.CompactTextString(m) }
func (*ShardReplica) ProtoMessage() {}
func (*ShardReplica) Descriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{35}
return fileDescriptor_aab7cc9a69ed26e8, []int{37}
}
func (m *ShardReplica) XXX_Unmarshal(b []byte) error {
@ -2617,6 +2727,8 @@ func init() {
proto.RegisterType((*VecFieldIndexInfo)(nil), "milvus.proto.query.VecFieldIndexInfo")
proto.RegisterType((*LoadSegmentsRequest)(nil), "milvus.proto.query.LoadSegmentsRequest")
proto.RegisterType((*ReleaseSegmentsRequest)(nil), "milvus.proto.query.ReleaseSegmentsRequest")
proto.RegisterType((*SearchRequest)(nil), "milvus.proto.query.SearchRequest")
proto.RegisterType((*QueryRequest)(nil), "milvus.proto.query.QueryRequest")
proto.RegisterType((*HandoffSegmentsRequest)(nil), "milvus.proto.query.HandoffSegmentsRequest")
proto.RegisterType((*LoadBalanceRequest)(nil), "milvus.proto.query.LoadBalanceRequest")
proto.RegisterType((*DmChannelWatchInfo)(nil), "milvus.proto.query.DmChannelWatchInfo")
@ -2635,167 +2747,174 @@ func init() {
func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) }
var fileDescriptor_aab7cc9a69ed26e8 = []byte{
// 2560 bytes of a gzipped FileDescriptorProto
// 2666 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3a, 0xcd, 0x6f, 0x1c, 0x49,
0xf5, 0xee, 0xf9, 0xb0, 0x3d, 0x6f, 0x3e, 0x5d, 0x4e, 0xfc, 0x9b, 0xcc, 0x6f, 0x37, 0xf1, 0x76,
0xd6, 0x49, 0xc8, 0xb2, 0x4e, 0x70, 0x40, 0x62, 0x05, 0x1c, 0xd6, 0x36, 0xf1, 0x9a, 0x6c, 0xbc,
0xa6, 0xed, 0x04, 0x88, 0x22, 0x35, 0x3d, 0xd3, 0x35, 0xe3, 0x56, 0xfa, 0x63, 0xd2, 0xd5, 0xb3,
0x89, 0xc3, 0x95, 0x03, 0x20, 0x21, 0xc4, 0x15, 0x21, 0x4e, 0x20, 0xc8, 0x61, 0x2f, 0x9c, 0x39,
0x70, 0xe1, 0x9f, 0xe0, 0x80, 0x38, 0x20, 0xc1, 0x3f, 0xc0, 0x11, 0x81, 0xea, 0xa3, 0x7b, 0xfa,
0xa3, 0xda, 0xee, 0xb1, 0x95, 0x4d, 0x84, 0xb8, 0x4d, 0xbd, 0x7e, 0xf5, 0xde, 0xab, 0xf7, 0x5d,
0xf5, 0x06, 0x96, 0x9e, 0x4e, 0xb0, 0x7f, 0xac, 0x0f, 0x3c, 0xcf, 0x37, 0xd7, 0xc7, 0xbe, 0x17,
0x78, 0x08, 0x39, 0x96, 0xfd, 0xe9, 0x84, 0xf0, 0xd5, 0x3a, 0xfb, 0xde, 0x6b, 0x0c, 0x3c, 0xc7,
0xf1, 0x5c, 0x0e, 0xeb, 0x35, 0xe2, 0x18, 0xbd, 0x96, 0xe5, 0x06, 0xd8, 0x77, 0x0d, 0x3b, 0xfc,
0x4a, 0x06, 0x47, 0xd8, 0x31, 0xc4, 0xaa, 0x63, 0x1a, 0x81, 0x11, 0xa7, 0xaf, 0xfe, 0x50, 0x81,
0x95, 0x83, 0x23, 0xef, 0xd9, 0x96, 0x67, 0xdb, 0x78, 0x10, 0x58, 0x9e, 0x4b, 0x34, 0xfc, 0x74,
0x82, 0x49, 0x80, 0x6e, 0x43, 0xa5, 0x6f, 0x10, 0xdc, 0x55, 0x56, 0x95, 0x1b, 0xf5, 0x8d, 0xb7,
0xd6, 0x13, 0x92, 0x08, 0x11, 0xee, 0x93, 0xd1, 0xa6, 0x41, 0xb0, 0xc6, 0x30, 0x11, 0x82, 0x8a,
0xd9, 0xdf, 0xdd, 0xee, 0x96, 0x56, 0x95, 0x1b, 0x65, 0x8d, 0xfd, 0x46, 0xef, 0x42, 0x73, 0x10,
0xd1, 0xde, 0xdd, 0x26, 0xdd, 0xf2, 0x6a, 0xf9, 0x46, 0x59, 0x4b, 0x02, 0xd5, 0xdf, 0x2a, 0xf0,
0x7f, 0x19, 0x31, 0xc8, 0xd8, 0x73, 0x09, 0x46, 0x77, 0x60, 0x9e, 0x04, 0x46, 0x30, 0x21, 0x42,
0x92, 0xff, 0x97, 0x4a, 0x72, 0xc0, 0x50, 0x34, 0x81, 0x9a, 0x65, 0x5b, 0x92, 0xb0, 0x45, 0x5f,
0x82, 0x0b, 0x96, 0x7b, 0x1f, 0x3b, 0x9e, 0x7f, 0xac, 0x8f, 0xb1, 0x3f, 0xc0, 0x6e, 0x60, 0x8c,
0x70, 0x28, 0xe3, 0x72, 0xf8, 0x6d, 0x7f, 0xfa, 0x49, 0xfd, 0x8d, 0x02, 0x17, 0xa9, 0xa4, 0xfb,
0x86, 0x1f, 0x58, 0xaf, 0x40, 0x5f, 0x2a, 0x34, 0xe2, 0x32, 0x76, 0xcb, 0xec, 0x5b, 0x02, 0x46,
0x71, 0xc6, 0x21, 0x7b, 0x7a, 0xb6, 0x0a, 0x13, 0x37, 0x01, 0x53, 0x7f, 0x2d, 0x0c, 0x1b, 0x97,
0xf3, 0x3c, 0x0a, 0x4d, 0xf3, 0x2c, 0x65, 0x79, 0x9e, 0x45, 0x9d, 0x7f, 0x57, 0xe0, 0xe2, 0xc7,
0x9e, 0x61, 0x4e, 0x0d, 0xff, 0xf9, 0xab, 0xf3, 0x1b, 0x30, 0xcf, 0xa3, 0xa4, 0x5b, 0x61, 0xbc,
0xd6, 0x92, 0xbc, 0x44, 0x04, 0x4d, 0x25, 0x3c, 0x60, 0x00, 0x4d, 0x6c, 0x42, 0x6b, 0xd0, 0xf2,
0xf1, 0xd8, 0xb6, 0x06, 0x86, 0xee, 0x4e, 0x9c, 0x3e, 0xf6, 0xbb, 0xd5, 0x55, 0xe5, 0x46, 0x55,
0x6b, 0x0a, 0xe8, 0x1e, 0x03, 0xaa, 0xbf, 0x54, 0xa0, 0xab, 0x61, 0x1b, 0x1b, 0x04, 0xbf, 0xce,
0xc3, 0xae, 0xc0, 0xbc, 0xeb, 0x99, 0x78, 0x77, 0x9b, 0x1d, 0xb6, 0xac, 0x89, 0x95, 0xfa, 0x37,
0x61, 0x88, 0x37, 0xdc, 0xaf, 0x63, 0xc6, 0xaa, 0x9e, 0xc1, 0x58, 0xea, 0x1f, 0xa7, 0x56, 0x78,
0xd3, 0x4f, 0x3a, 0xb5, 0x54, 0x35, 0x61, 0xa9, 0xef, 0xc1, 0xa5, 0x2d, 0x1f, 0x1b, 0x01, 0xfe,
0x36, 0xad, 0x06, 0x5b, 0x47, 0x86, 0xeb, 0x62, 0x3b, 0x3c, 0x42, 0x9a, 0xb9, 0x22, 0x61, 0xde,
0x85, 0x85, 0xb1, 0xef, 0x3d, 0x3f, 0x8e, 0xe4, 0x0e, 0x97, 0xea, 0xef, 0x14, 0xe8, 0xc9, 0x68,
0x9f, 0x27, 0x71, 0x5c, 0x85, 0xa6, 0x28, 0x6b, 0x9c, 0x1a, 0xe3, 0x59, 0xd3, 0x1a, 0x4f, 0x63,
0x1c, 0xd0, 0x6d, 0xb8, 0xc0, 0x91, 0x7c, 0x4c, 0x26, 0x76, 0x10, 0xe1, 0x96, 0x19, 0x2e, 0x62,
0xdf, 0x34, 0xf6, 0x49, 0xec, 0x50, 0x5f, 0x2a, 0x70, 0x69, 0x07, 0x07, 0x91, 0x11, 0x29, 0x57,
0xfc, 0x86, 0xe6, 0xe2, 0xcf, 0x14, 0xe8, 0xc9, 0x64, 0x3d, 0x8f, 0x5a, 0x1f, 0xc1, 0x4a, 0xc4,
0x43, 0x37, 0x31, 0x19, 0xf8, 0xd6, 0x98, 0x39, 0x33, 0xcb, 0xcc, 0xf5, 0x8d, 0xab, 0xeb, 0xd9,
0xce, 0x61, 0x3d, 0x2d, 0xc1, 0xc5, 0x88, 0xc4, 0x76, 0x8c, 0x82, 0xfa, 0x53, 0x05, 0x2e, 0xee,
0xe0, 0xe0, 0x00, 0x8f, 0x1c, 0xec, 0x06, 0xbb, 0xee, 0xd0, 0x3b, 0xbb, 0x5e, 0x2f, 0x03, 0x10,
0x41, 0x27, 0xaa, 0x1a, 0x31, 0x48, 0x11, 0x1d, 0xb3, 0x26, 0x25, 0x2d, 0xcf, 0x79, 0x74, 0xf7,
0x15, 0xa8, 0x5a, 0xee, 0xd0, 0x0b, 0x55, 0x75, 0x45, 0xa6, 0xaa, 0x38, 0x33, 0x8e, 0xad, 0xfe,
0xab, 0x04, 0x2b, 0x1f, 0x9a, 0xa6, 0x2c, 0xec, 0x66, 0xd7, 0xcb, 0x34, 0xba, 0x4b, 0xf1, 0xe8,
0x2e, 0xe4, 0x73, 0x99, 0x90, 0xaa, 0xcc, 0x10, 0x52, 0xd5, 0xbc, 0x90, 0x42, 0x3b, 0xd0, 0x24,
0x18, 0x3f, 0xd1, 0xc7, 0x1e, 0x61, 0x3e, 0xd1, 0x9d, 0x67, 0xa7, 0x51, 0x93, 0xa7, 0x89, 0x1a,
0xcc, 0xfb, 0x64, 0xb4, 0x2f, 0x30, 0xb5, 0x06, 0xdd, 0x18, 0xae, 0xd0, 0x03, 0x58, 0x19, 0xd9,
0x5e, 0xdf, 0xb0, 0x75, 0x82, 0x0d, 0x1b, 0x9b, 0xba, 0xb0, 0x37, 0xe9, 0x2e, 0x14, 0x53, 0xf8,
0x05, 0xbe, 0xfd, 0x80, 0xed, 0x16, 0x1f, 0x88, 0xfa, 0x57, 0x05, 0x2e, 0x69, 0xd8, 0xf1, 0x3e,
0xc5, 0xff, 0xad, 0x26, 0x50, 0x7f, 0xae, 0x40, 0x83, 0x56, 0xe1, 0xfb, 0x38, 0x30, 0xa8, 0x26,
0xd0, 0x07, 0x50, 0xb3, 0x3d, 0xc3, 0xd4, 0x83, 0xe3, 0x31, 0x3f, 0x5a, 0x2b, 0x7d, 0x34, 0xae,
0x3d, 0xba, 0xe9, 0xf0, 0x78, 0x8c, 0xb5, 0x45, 0x5b, 0xfc, 0xca, 0x1c, 0xa3, 0x54, 0x20, 0x7b,
0x95, 0x65, 0x9d, 0x64, 0x19, 0x56, 0xbe, 0x63, 0x04, 0x83, 0xa3, 0x6d, 0x47, 0x88, 0x49, 0x5e,
0x8f, 0xce, 0x8b, 0x14, 0xcd, 0x28, 0xb4, 0xab, 0x32, 0x4f, 0xa3, 0xd7, 0x9f, 0xf5, 0x87, 0xc2,
0x0c, 0xb1, 0xd0, 0x8e, 0x75, 0x15, 0xf3, 0x67, 0x69, 0x01, 0xb7, 0xa0, 0x89, 0x9f, 0x0f, 0xec,
0x89, 0x89, 0x75, 0xce, 0x9d, 0xfb, 0xf9, 0x65, 0x09, 0xf7, 0xb8, 0x9b, 0x37, 0xc4, 0xa6, 0x5d,
0x21, 0x03, 0x37, 0xb5, 0x83, 0x03, 0xa3, 0xbb, 0xc8, 0xc4, 0x58, 0xcd, 0x33, 0x75, 0xe8, 0x1f,
0xdc, 0xdc, 0x74, 0xa5, 0xfe, 0x5b, 0x81, 0x4b, 0xdc, 0x4c, 0xd8, 0x0e, 0x8c, 0xd7, 0x6b, 0xa9,
0xc8, 0x0a, 0x95, 0x19, 0xad, 0x10, 0xd3, 0x40, 0x6d, 0x66, 0x0d, 0xfc, 0xa2, 0x02, 0x6d, 0xa1,
0x5e, 0x8a, 0xc1, 0xe2, 0xe7, 0x2d, 0xa8, 0x45, 0xc5, 0x46, 0x34, 0x43, 0x53, 0x00, 0x5a, 0x85,
0x7a, 0xcc, 0x7b, 0xc4, 0x41, 0xe3, 0xa0, 0x42, 0xa7, 0x0d, 0x5b, 0x87, 0x4a, 0xac, 0x75, 0x78,
0x1b, 0x60, 0x68, 0x4f, 0xc8, 0x91, 0x1e, 0x58, 0x0e, 0x16, 0x0d, 0x5c, 0x8d, 0x41, 0x0e, 0x2d,
0x07, 0xa3, 0x0f, 0xa1, 0xd1, 0xb7, 0x5c, 0xdb, 0x1b, 0xe9, 0x63, 0x23, 0x38, 0x22, 0xdd, 0xf9,
0x5c, 0x7f, 0xb9, 0x6b, 0x61, 0xdb, 0xdc, 0x64, 0xb8, 0x5a, 0x9d, 0xef, 0xd9, 0xa7, 0x5b, 0xd0,
0x65, 0xa8, 0xbb, 0x13, 0x47, 0xf7, 0x86, 0xba, 0xef, 0x3d, 0xa3, 0x1e, 0xc7, 0x58, 0xb8, 0x13,
0xe7, 0x93, 0xa1, 0xe6, 0x3d, 0x23, 0xe8, 0xeb, 0x50, 0xa3, 0xe5, 0x8e, 0xd8, 0xde, 0x88, 0x74,
0x17, 0x0b, 0xd1, 0x9f, 0x6e, 0xa0, 0xbb, 0x4d, 0xea, 0x47, 0x6c, 0x77, 0xad, 0xd8, 0xee, 0x68,
0x03, 0xba, 0x06, 0xad, 0x81, 0xe7, 0x8c, 0x0d, 0xa6, 0xa1, 0xbb, 0xbe, 0xe7, 0x74, 0x81, 0xc5,
0x6a, 0x0a, 0x8a, 0xee, 0x42, 0xdd, 0x72, 0x4d, 0xfc, 0x5c, 0x44, 0x4d, 0x9d, 0xf1, 0x59, 0x93,
0x99, 0xfc, 0x21, 0x1e, 0x30, 0x5e, 0xbb, 0x14, 0x9d, 0xd9, 0x1d, 0xac, 0xf0, 0x27, 0x41, 0xef,
0x40, 0x43, 0x18, 0x55, 0x27, 0xd6, 0x0b, 0xdc, 0x6d, 0x70, 0x43, 0x0a, 0xd8, 0x81, 0xf5, 0x02,
0xab, 0xbf, 0x2f, 0xc1, 0x52, 0x86, 0x08, 0x6d, 0x85, 0x87, 0x0c, 0x12, 0x3a, 0x47, 0xb8, 0xa4,
0x24, 0xb1, 0x6b, 0xf4, 0x6d, 0x1a, 0xd1, 0x26, 0x7e, 0xce, 0x7c, 0x63, 0x51, 0xab, 0x73, 0x18,
0x23, 0x40, 0x6d, 0xcc, 0xa5, 0x77, 0x0d, 0x07, 0x8b, 0x56, 0xb5, 0xc6, 0x20, 0x7b, 0x86, 0x83,
0x29, 0x6d, 0x2e, 0x62, 0xe8, 0x19, 0xe1, 0x92, 0x7e, 0xe9, 0x4f, 0x2c, 0xc6, 0x95, 0x7b, 0x46,
0xb8, 0x44, 0xdb, 0xd0, 0xe0, 0x24, 0xc7, 0x86, 0x6f, 0x38, 0xa1, 0x5f, 0xbc, 0x23, 0x0d, 0xd7,
0x7b, 0xf8, 0xf8, 0xa1, 0x61, 0x4f, 0xf0, 0xbe, 0x61, 0xf9, 0x1a, 0xd7, 0xe3, 0x3e, 0xdb, 0x85,
0x6e, 0x40, 0x87, 0x53, 0x19, 0x5a, 0x36, 0x16, 0x1e, 0x46, 0x33, 0x52, 0x4d, 0x6b, 0x31, 0xf8,
0x5d, 0xcb, 0xc6, 0xdc, 0x89, 0xa2, 0x23, 0x30, 0xb5, 0x2d, 0x72, 0x1f, 0x62, 0x10, 0xa6, 0xb4,
0x7f, 0x94, 0x60, 0x99, 0x86, 0x52, 0x58, 0x82, 0xcf, 0x9e, 0x4d, 0xde, 0x06, 0x30, 0x49, 0xa0,
0x27, 0x32, 0x4a, 0xcd, 0x24, 0xc1, 0x1e, 0x4f, 0x2a, 0x1f, 0x84, 0x09, 0xa3, 0x9c, 0xdf, 0xbc,
0xa6, 0x42, 0x3b, 0x9b, 0xba, 0xcf, 0x74, 0x7b, 0xbf, 0x0a, 0x4d, 0xe2, 0x4d, 0xfc, 0x01, 0xd6,
0x13, 0x97, 0xad, 0x06, 0x07, 0xee, 0xc9, 0x73, 0xde, 0xbc, 0xf4, 0x15, 0x21, 0x96, 0xbc, 0x16,
0x66, 0x4e, 0x5e, 0x7f, 0x51, 0x60, 0x45, 0x5c, 0x4c, 0xcf, 0xaf, 0xed, 0xbc, 0xdc, 0x1d, 0x66,
0xaa, 0xf2, 0x09, 0x97, 0x9c, 0x4a, 0x81, 0xca, 0x5b, 0x95, 0x54, 0xde, 0x64, 0xa3, 0x3f, 0x9f,
0x6e, 0xf4, 0xd5, 0x9f, 0x29, 0xb0, 0xf2, 0x91, 0xe1, 0x9a, 0xde, 0x70, 0x78, 0xfe, 0x03, 0x6e,
0x45, 0x01, 0xbf, 0x3b, 0x4b, 0x23, 0x9f, 0xd8, 0xa4, 0xfe, 0xa8, 0x04, 0x88, 0x5a, 0x63, 0xd3,
0xb0, 0x0d, 0x77, 0x80, 0xcf, 0x2e, 0xcd, 0x1a, 0xb4, 0x12, 0x3e, 0x14, 0xbd, 0x36, 0xc6, 0x9d,
0x88, 0xa0, 0x7b, 0xd0, 0xea, 0x73, 0x56, 0xba, 0x8f, 0x0d, 0xe2, 0xb9, 0xcc, 0x0e, 0xad, 0x8d,
0x77, 0x65, 0x62, 0x1f, 0xfa, 0xd6, 0x68, 0x84, 0xfd, 0x2d, 0xcf, 0x35, 0x79, 0x8b, 0xdd, 0xec,
0x87, 0x62, 0xd2, 0xad, 0xe8, 0x0a, 0xd4, 0xa7, 0x01, 0x15, 0xf6, 0x42, 0x10, 0x45, 0x14, 0x41,
0xef, 0xc1, 0x52, 0xb2, 0xfb, 0x9e, 0x1a, 0xae, 0x43, 0xe2, 0x8d, 0x35, 0x35, 0xce, 0x0f, 0x00,
0x45, 0xdd, 0x1d, 0x6b, 0x22, 0x58, 0x76, 0x2c, 0xf2, 0x98, 0xf0, 0x16, 0xd4, 0xcc, 0x70, 0xa7,
0xb8, 0xda, 0x4f, 0x01, 0x34, 0xba, 0xb8, 0x84, 0x3a, 0x75, 0x74, 0x6c, 0x86, 0xf5, 0x93, 0x03,
0x3f, 0x66, 0x30, 0xf5, 0xb3, 0x12, 0x74, 0xe2, 0x1d, 0x7d, 0x61, 0xde, 0xaf, 0xe6, 0x69, 0xe1,
0x84, 0xeb, 0x4b, 0xe5, 0x1c, 0xd7, 0x97, 0xec, 0xf5, 0xaa, 0x7a, 0xb6, 0xeb, 0x95, 0xfa, 0x2b,
0x05, 0xda, 0xa9, 0x9b, 0x7c, 0xba, 0x93, 0x51, 0xb2, 0x9d, 0xcc, 0x57, 0xa1, 0x4a, 0xcb, 0x3b,
0x66, 0x4a, 0x6a, 0xa5, 0xd9, 0xca, 0xde, 0x07, 0x34, 0xbe, 0x01, 0xdd, 0x82, 0x65, 0xc9, 0xb3,
0xae, 0x30, 0x25, 0xca, 0xbe, 0xea, 0xaa, 0x7f, 0xa8, 0x40, 0x3d, 0xa6, 0x8f, 0x53, 0x9a, 0xb0,
0x22, 0xf7, 0x94, 0xd4, 0xf1, 0xca, 0xd9, 0xe3, 0xe5, 0xbc, 0x6b, 0xa2, 0x4b, 0xb0, 0xe8, 0x60,
0x87, 0xd7, 0x37, 0x51, 0x6c, 0x1d, 0xec, 0xd0, 0xea, 0x46, 0x3f, 0xd1, 0x0e, 0x8a, 0xb5, 0x4f,
0x3c, 0xa3, 0x2f, 0xb8, 0x13, 0x87, 0x35, 0x4f, 0xc9, 0xd2, 0xbe, 0x70, 0x42, 0x69, 0x5f, 0x4c,
0x96, 0xf6, 0x44, 0x38, 0xd4, 0xd2, 0xe1, 0x50, 0xb4, 0x2f, 0xba, 0x0d, 0xcb, 0x03, 0xf6, 0x0c,
0x67, 0x6e, 0x1e, 0x6f, 0x45, 0x9f, 0xba, 0x75, 0xd6, 0x83, 0xc8, 0x3e, 0xa1, 0xbb, 0xd4, 0xb9,
0x44, 0x07, 0xc4, 0xac, 0xdc, 0x60, 0x56, 0x96, 0x77, 0x0e, 0xc2, 0x36, 0xdc, 0xc8, 0x61, 0x4e,
0x64, 0xab, 0x74, 0x47, 0xd6, 0x3c, 0x6b, 0x47, 0x76, 0x05, 0xea, 0xe1, 0xa3, 0xb8, 0x65, 0x92,
0x6e, 0x8b, 0xa7, 0x27, 0x01, 0xda, 0x35, 0x09, 0x53, 0xbe, 0x47, 0xef, 0x4b, 0x26, 0xe9, 0xb6,
0xd9, 0xd7, 0x05, 0x66, 0x31, 0x93, 0xa8, 0x2f, 0xcb, 0xd0, 0x9a, 0xd6, 0xeb, 0xc2, 0xd9, 0xa0,
0xc8, 0x84, 0x62, 0x0f, 0x3a, 0xd3, 0x57, 0x33, 0xa6, 0xa8, 0x13, 0x5b, 0x8e, 0xf4, 0x7b, 0x59,
0x7b, 0x9c, 0x0a, 0xbb, 0xc4, 0xf5, 0xbc, 0x32, 0xd3, 0xf5, 0xfc, 0x7c, 0x0f, 0xd9, 0xe8, 0x0e,
0x5c, 0xf4, 0x79, 0xbb, 0x60, 0xea, 0x89, 0x63, 0xf3, 0xca, 0x7b, 0x21, 0xfc, 0xb8, 0x1f, 0x3f,
0x7e, 0x4e, 0x24, 0x2f, 0xe4, 0x45, 0x72, 0xda, 0x8c, 0x8b, 0x69, 0x33, 0xaa, 0x0f, 0x60, 0xf9,
0x81, 0x4b, 0x26, 0x7d, 0x32, 0xf0, 0xad, 0x3e, 0x0e, 0x6f, 0x9d, 0x85, 0xec, 0xd5, 0x83, 0x45,
0x91, 0x8b, 0xb9, 0xad, 0x6a, 0x5a, 0xb4, 0x56, 0x7f, 0xa2, 0xc0, 0x4a, 0x96, 0x2e, 0x73, 0x85,
0x69, 0xa0, 0x2b, 0x89, 0x40, 0xff, 0x2e, 0x2c, 0x4f, 0xc9, 0xeb, 0x09, 0xca, 0xf5, 0x8d, 0xeb,
0x32, 0xa3, 0x48, 0x04, 0xd7, 0xd0, 0x94, 0x46, 0x08, 0x53, 0xff, 0xa9, 0xc0, 0x92, 0x08, 0x19,
0x0a, 0x1b, 0xb1, 0xfb, 0x3a, 0x2d, 0x3e, 0x9e, 0x6b, 0x5b, 0x6e, 0xd4, 0x38, 0x8a, 0x33, 0x72,
0xa0, 0x68, 0x1c, 0x3f, 0x82, 0xb6, 0x40, 0x8a, 0x6a, 0x48, 0xc1, 0x56, 0xa5, 0xc5, 0xf7, 0x45,
0xd5, 0x63, 0x0d, 0x5a, 0xde, 0x70, 0x18, 0xe7, 0xc7, 0x93, 0x60, 0x53, 0x40, 0x05, 0xc3, 0x6f,
0x41, 0x27, 0x44, 0x9b, 0xb5, 0x6a, 0xb5, 0xc5, 0xc6, 0xe8, 0xbd, 0xed, 0xc7, 0x0a, 0x74, 0x93,
0x35, 0x2c, 0x76, 0xfc, 0xd9, 0xbb, 0xa4, 0xaf, 0x25, 0x5f, 0x5d, 0xd7, 0x4e, 0x90, 0x67, 0xca,
0x27, 0x7c, 0x7b, 0xfd, 0xb3, 0x02, 0x75, 0x4d, 0xb8, 0x1d, 0x65, 0xff, 0x36, 0xc0, 0xd4, 0x31,
0xc3, 0x9a, 0x12, 0xf9, 0x25, 0x35, 0x4e, 0xcc, 0x19, 0x2c, 0x53, 0x52, 0x54, 0x18, 0xd2, 0x34,
0x19, 0x50, 0xf7, 0xce, 0xbc, 0x7e, 0x99, 0xb4, 0x6a, 0xb7, 0xc8, 0x91, 0xe1, 0x9b, 0xba, 0x20,
0x1e, 0xaa, 0x53, 0xda, 0xdb, 0x1f, 0x50, 0x4c, 0x21, 0xa6, 0xd6, 0x24, 0xb1, 0x55, 0x32, 0xe1,
0x55, 0x93, 0x09, 0x6f, 0x0f, 0x1a, 0xf1, 0x9d, 0xd4, 0xc5, 0x6d, 0x6c, 0x98, 0xd8, 0x0f, 0x5d,
0x9c, 0xaf, 0xd0, 0x35, 0x68, 0x9b, 0x4e, 0xe8, 0xda, 0xbc, 0x34, 0xf1, 0x8e, 0xa7, 0x19, 0x95,
0x18, 0x5a, 0x9e, 0x6e, 0xbe, 0x80, 0x56, 0x32, 0x73, 0xa1, 0x06, 0x2c, 0xee, 0x79, 0xc1, 0x37,
0x9f, 0x5b, 0x24, 0xe8, 0xcc, 0xa1, 0x16, 0xc0, 0x9e, 0x17, 0xec, 0xfb, 0x98, 0x60, 0x37, 0xe8,
0x28, 0x08, 0x60, 0xfe, 0x13, 0x77, 0xdb, 0x22, 0x4f, 0x3a, 0x25, 0xb4, 0x2c, 0x7a, 0x0b, 0xc3,
0xde, 0x15, 0xe9, 0xa0, 0x53, 0xa6, 0xdb, 0xa3, 0x55, 0x05, 0x75, 0xa0, 0x11, 0xa1, 0xec, 0xec,
0x3f, 0xe8, 0x54, 0x51, 0x0d, 0xaa, 0xfc, 0xe7, 0xfc, 0x4d, 0x13, 0x3a, 0xe9, 0xd6, 0x95, 0xd2,
0x7c, 0xe0, 0xde, 0x73, 0xbd, 0x67, 0x11, 0xa8, 0x33, 0x87, 0xea, 0xb0, 0x20, 0xae, 0x03, 0x1d,
0x05, 0xb5, 0xa1, 0x1e, 0xeb, 0xc4, 0x3b, 0x25, 0x0a, 0xd8, 0xf1, 0xc7, 0x03, 0xd1, 0x93, 0x73,
0x11, 0xa8, 0x8b, 0x6f, 0x7b, 0xcf, 0xdc, 0x4e, 0xe5, 0xe6, 0x26, 0x2c, 0x86, 0x29, 0x95, 0xa2,
0x72, 0xea, 0x2e, 0x5d, 0x76, 0xe6, 0xd0, 0x12, 0x34, 0x13, 0x93, 0xcc, 0x8e, 0x82, 0x10, 0xb4,
0x92, 0x53, 0xe6, 0x4e, 0x69, 0xe3, 0x4f, 0x75, 0x00, 0xde, 0x76, 0x7a, 0x9e, 0x6f, 0xa2, 0x31,
0xa0, 0x1d, 0x1c, 0xd0, 0x92, 0xea, 0xb9, 0x61, 0x39, 0x24, 0xe8, 0x76, 0x4e, 0x77, 0x96, 0x45,
0x15, 0xa2, 0xf6, 0xae, 0xe5, 0xec, 0x48, 0xa1, 0xab, 0x73, 0xc8, 0x61, 0x1c, 0x0f, 0x2d, 0x07,
0x1f, 0x5a, 0x83, 0x27, 0x51, 0xbf, 0x9a, 0xcf, 0x31, 0x85, 0x1a, 0x72, 0x4c, 0x95, 0x2e, 0xb1,
0x38, 0x08, 0x7c, 0xcb, 0x1d, 0x85, 0x83, 0x12, 0x75, 0x0e, 0x3d, 0x85, 0x0b, 0x3b, 0x98, 0x71,
0xb7, 0x48, 0x60, 0x0d, 0x48, 0xc8, 0x70, 0x23, 0x9f, 0x61, 0x06, 0x79, 0x46, 0x96, 0x36, 0xb4,
0x53, 0xff, 0xea, 0x40, 0x37, 0xe5, 0x71, 0x23, 0xfb, 0x07, 0x4a, 0xef, 0xbd, 0x42, 0xb8, 0x11,
0x37, 0x0b, 0x5a, 0xc9, 0x7f, 0x3c, 0xa0, 0x2f, 0xe4, 0x11, 0xc8, 0xcc, 0x7e, 0x7b, 0x37, 0x8b,
0xa0, 0x46, 0xac, 0x1e, 0x71, 0x7f, 0x3a, 0x8d, 0x95, 0x74, 0xa0, 0xde, 0x3b, 0x69, 0x46, 0xa5,
0xce, 0xa1, 0xef, 0xc3, 0x52, 0x66, 0x42, 0x8d, 0xbe, 0x28, 0x23, 0x9f, 0x37, 0xc8, 0x3e, 0x8d,
0xc3, 0xa3, 0x74, 0x34, 0xe4, 0x4b, 0x9f, 0xf9, 0xab, 0x42, 0x71, 0xe9, 0x63, 0xe4, 0x4f, 0x92,
0x7e, 0x66, 0x0e, 0x13, 0x40, 0xd9, 0x19, 0x35, 0x7a, 0x5f, 0xc6, 0x22, 0x77, 0x4e, 0xde, 0x5b,
0x2f, 0x8a, 0x1e, 0x99, 0x7c, 0xc2, 0xa2, 0x35, 0x7d, 0xef, 0x92, 0xb2, 0xcd, 0x9d, 0x4b, 0xcb,
0xd9, 0xe6, 0x8f, 0x86, 0xb9, 0x53, 0x27, 0x47, 0x9f, 0x72, 0x5b, 0x49, 0xc7, 0xb5, 0x72, 0xa7,
0x96, 0x4f, 0x52, 0xd5, 0x39, 0x74, 0x98, 0x48, 0xc2, 0xe8, 0x5a, 0x9e, 0x4f, 0x24, 0xdf, 0x4b,
0x4e, 0x33, 0x97, 0x0e, 0xb0, 0x83, 0x83, 0xfb, 0x38, 0xf0, 0xad, 0x01, 0x49, 0x13, 0x15, 0x8b,
0x29, 0x42, 0x48, 0xf4, 0xfa, 0xa9, 0x78, 0xa1, 0xd8, 0x1b, 0x2f, 0x01, 0x6a, 0xcc, 0x66, 0xb4,
0x3e, 0xfc, 0x2f, 0x8d, 0xbf, 0x82, 0x34, 0xfe, 0x18, 0xda, 0xa9, 0xb9, 0xb7, 0x3c, 0x8d, 0xcb,
0x87, 0xe3, 0xa7, 0x39, 0x48, 0x1f, 0x50, 0x76, 0xaa, 0x2b, 0x0f, 0xac, 0xdc, 0xe9, 0xef, 0x69,
0x3c, 0x1e, 0x43, 0x3b, 0x35, 0xc2, 0x94, 0x9f, 0x40, 0x3e, 0xe7, 0x2c, 0x70, 0x82, 0xec, 0xe4,
0x4d, 0x7e, 0x82, 0xdc, 0x09, 0xdd, 0x69, 0x3c, 0x1e, 0xf2, 0xc1, 0x70, 0x74, 0x1f, 0xb8, 0x9e,
0x17, 0x9d, 0xa9, 0xc7, 0xd5, 0xd7, 0x9f, 0xaf, 0x5f, 0x7d, 0x3d, 0x7b, 0x0c, 0xed, 0xd4, 0xd3,
0xb9, 0xdc, 0xba, 0xf2, 0xf7, 0xf5, 0xd3, 0xa8, 0x7f, 0x8e, 0x19, 0xf8, 0x55, 0xe7, 0xca, 0xcd,
0x2f, 0x3f, 0xda, 0x18, 0x59, 0xc1, 0xd1, 0xa4, 0x4f, 0x4f, 0x79, 0x8b, 0x63, 0xbe, 0x6f, 0x79,
0xe2, 0xd7, 0xad, 0x30, 0x69, 0xdc, 0x62, 0x94, 0x6e, 0x31, 0x69, 0xc7, 0xfd, 0xfe, 0x3c, 0x5b,
0xde, 0xf9, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x52, 0x32, 0xc1, 0x89, 0xa0, 0x2c, 0x00, 0x00,
0xf5, 0xee, 0xf9, 0xb2, 0xe7, 0xcd, 0xa7, 0xcb, 0x89, 0x7f, 0x93, 0xf9, 0xed, 0x26, 0x4e, 0x67,
0x9d, 0x84, 0x2c, 0xeb, 0x04, 0x67, 0x91, 0x58, 0x01, 0x87, 0xb5, 0x4d, 0xbc, 0x26, 0x1b, 0xaf,
0xd3, 0x76, 0x02, 0x44, 0x91, 0x86, 0x9e, 0xe9, 0xf2, 0xb8, 0x95, 0xfe, 0x98, 0x74, 0xf5, 0x6c,
0xe2, 0x70, 0x5d, 0x21, 0x40, 0x42, 0x88, 0x2b, 0x42, 0x9c, 0x40, 0xb0, 0x87, 0xbd, 0x70, 0xe6,
0xc0, 0x85, 0x1b, 0x7f, 0x01, 0x07, 0xc4, 0x01, 0x09, 0xfe, 0x01, 0x8e, 0x08, 0x54, 0x5f, 0x3d,
0xfd, 0x51, 0x63, 0xb7, 0x6d, 0xb2, 0x89, 0x10, 0xb7, 0xa9, 0xd7, 0xaf, 0xde, 0x7b, 0xf5, 0xbe,
0xab, 0xde, 0xc0, 0xfc, 0xd3, 0x31, 0x0e, 0x0e, 0x7b, 0x03, 0xdf, 0x0f, 0xac, 0x95, 0x51, 0xe0,
0x87, 0x3e, 0x42, 0xae, 0xed, 0x7c, 0x3c, 0x26, 0x7c, 0xb5, 0xc2, 0xbe, 0x77, 0xeb, 0x03, 0xdf,
0x75, 0x7d, 0x8f, 0xc3, 0xba, 0xf5, 0x38, 0x46, 0xb7, 0x69, 0x7b, 0x21, 0x0e, 0x3c, 0xd3, 0x91,
0x5f, 0xc9, 0xe0, 0x00, 0xbb, 0xa6, 0x58, 0xb5, 0x2d, 0x33, 0x34, 0xe3, 0xf4, 0xf5, 0x4f, 0x34,
0x58, 0xdc, 0x3d, 0xf0, 0x9f, 0xad, 0xfb, 0x8e, 0x83, 0x07, 0xa1, 0xed, 0x7b, 0xc4, 0xc0, 0x4f,
0xc7, 0x98, 0x84, 0xe8, 0x16, 0x94, 0xfa, 0x26, 0xc1, 0x1d, 0x6d, 0x49, 0xbb, 0x5e, 0x5b, 0x7d,
0x63, 0x25, 0x21, 0x89, 0x10, 0xe1, 0x1e, 0x19, 0xae, 0x99, 0x04, 0x1b, 0x0c, 0x13, 0x21, 0x28,
0x59, 0xfd, 0xad, 0x8d, 0x4e, 0x61, 0x49, 0xbb, 0x5e, 0x34, 0xd8, 0x6f, 0xf4, 0x16, 0x34, 0x06,
0x11, 0xed, 0xad, 0x0d, 0xd2, 0x29, 0x2e, 0x15, 0xaf, 0x17, 0x8d, 0x24, 0x50, 0xff, 0xb5, 0x06,
0xff, 0x97, 0x11, 0x83, 0x8c, 0x7c, 0x8f, 0x60, 0x74, 0x1b, 0x2a, 0x24, 0x34, 0xc3, 0x31, 0x11,
0x92, 0xfc, 0xbf, 0x52, 0x92, 0x5d, 0x86, 0x62, 0x08, 0xd4, 0x2c, 0xdb, 0x82, 0x82, 0x2d, 0xfa,
0x12, 0x9c, 0xb3, 0xbd, 0x7b, 0xd8, 0xf5, 0x83, 0xc3, 0xde, 0x08, 0x07, 0x03, 0xec, 0x85, 0xe6,
0x10, 0x4b, 0x19, 0x17, 0xe4, 0xb7, 0x9d, 0xc9, 0x27, 0xfd, 0x57, 0x1a, 0x9c, 0xa7, 0x92, 0xee,
0x98, 0x41, 0x68, 0xbf, 0x04, 0x7d, 0xe9, 0x50, 0x8f, 0xcb, 0xd8, 0x29, 0xb2, 0x6f, 0x09, 0x18,
0xc5, 0x19, 0x49, 0xf6, 0xf4, 0x6c, 0x25, 0x26, 0x6e, 0x02, 0xa6, 0xff, 0x52, 0x18, 0x36, 0x2e,
0xe7, 0x59, 0x14, 0x9a, 0xe6, 0x59, 0xc8, 0xf2, 0x3c, 0x8d, 0x3a, 0xff, 0xa6, 0xc1, 0xf9, 0x0f,
0x7d, 0xd3, 0x9a, 0x18, 0xfe, 0xf3, 0x57, 0xe7, 0xd7, 0xa1, 0xc2, 0xa3, 0xa4, 0x53, 0x62, 0xbc,
0x96, 0x93, 0xbc, 0x44, 0x04, 0x4d, 0x24, 0xdc, 0x65, 0x00, 0x43, 0x6c, 0x42, 0xcb, 0xd0, 0x0c,
0xf0, 0xc8, 0xb1, 0x07, 0x66, 0xcf, 0x1b, 0xbb, 0x7d, 0x1c, 0x74, 0xca, 0x4b, 0xda, 0xf5, 0xb2,
0xd1, 0x10, 0xd0, 0x6d, 0x06, 0xd4, 0x7f, 0xae, 0x41, 0xc7, 0xc0, 0x0e, 0x36, 0x09, 0x7e, 0x95,
0x87, 0x5d, 0x84, 0x8a, 0xe7, 0x5b, 0x78, 0x6b, 0x83, 0x1d, 0xb6, 0x68, 0x88, 0x95, 0xfe, 0x57,
0x61, 0x88, 0xd7, 0xdc, 0xaf, 0x63, 0xc6, 0x2a, 0x9f, 0xc2, 0x58, 0xfa, 0xef, 0x27, 0x56, 0x78,
0xdd, 0x4f, 0x3a, 0xb1, 0x54, 0x39, 0x61, 0xa9, 0xef, 0xc0, 0x85, 0xf5, 0x00, 0x9b, 0x21, 0xbe,
0x4f, 0xab, 0xc1, 0xfa, 0x81, 0xe9, 0x79, 0xd8, 0x91, 0x47, 0x48, 0x33, 0xd7, 0x14, 0xcc, 0x3b,
0x30, 0x3b, 0x0a, 0xfc, 0xe7, 0x87, 0x91, 0xdc, 0x72, 0xa9, 0xff, 0x46, 0x83, 0xae, 0x8a, 0xf6,
0x59, 0x12, 0xc7, 0x15, 0x68, 0x88, 0xb2, 0xc6, 0xa9, 0x31, 0x9e, 0x55, 0xa3, 0xfe, 0x34, 0xc6,
0x01, 0xdd, 0x82, 0x73, 0x1c, 0x29, 0xc0, 0x64, 0xec, 0x84, 0x11, 0x6e, 0x91, 0xe1, 0x22, 0xf6,
0xcd, 0x60, 0x9f, 0xc4, 0x0e, 0xfd, 0x53, 0x0d, 0x2e, 0x6c, 0xe2, 0x30, 0x32, 0x22, 0xe5, 0x8a,
0x5f, 0xd3, 0x5c, 0xfc, 0x99, 0x06, 0x5d, 0x95, 0xac, 0x67, 0x51, 0xeb, 0x23, 0x58, 0x8c, 0x78,
0xf4, 0x2c, 0x4c, 0x06, 0x81, 0x3d, 0x62, 0xce, 0xcc, 0x32, 0x73, 0x6d, 0xf5, 0xca, 0x4a, 0xb6,
0x73, 0x58, 0x49, 0x4b, 0x70, 0x3e, 0x22, 0xb1, 0x11, 0xa3, 0xa0, 0xff, 0x58, 0x83, 0xf3, 0x9b,
0x38, 0xdc, 0xc5, 0x43, 0x17, 0x7b, 0xe1, 0x96, 0xb7, 0xef, 0x9f, 0x5e, 0xaf, 0x17, 0x01, 0x88,
0xa0, 0x13, 0x55, 0x8d, 0x18, 0x24, 0x8f, 0x8e, 0x59, 0x93, 0x92, 0x96, 0xe7, 0x2c, 0xba, 0xfb,
0x32, 0x94, 0x6d, 0x6f, 0xdf, 0x97, 0xaa, 0xba, 0xa4, 0x52, 0x55, 0x9c, 0x19, 0xc7, 0xd6, 0xff,
0x59, 0x80, 0xc5, 0xf7, 0x2d, 0x4b, 0x15, 0x76, 0x27, 0xd7, 0xcb, 0x24, 0xba, 0x0b, 0xf1, 0xe8,
0xce, 0xe5, 0x73, 0x99, 0x90, 0x2a, 0x9d, 0x20, 0xa4, 0xca, 0xd3, 0x42, 0x0a, 0x6d, 0x42, 0x83,
0x60, 0xfc, 0xa4, 0x37, 0xf2, 0x09, 0xf3, 0x89, 0x4e, 0x85, 0x9d, 0x46, 0x4f, 0x9e, 0x26, 0x6a,
0x30, 0xef, 0x91, 0xe1, 0x8e, 0xc0, 0x34, 0xea, 0x74, 0xa3, 0x5c, 0xa1, 0x07, 0xb0, 0x38, 0x74,
0xfc, 0xbe, 0xe9, 0xf4, 0x08, 0x36, 0x1d, 0x6c, 0xf5, 0x84, 0xbd, 0x49, 0x67, 0x36, 0x9f, 0xc2,
0xcf, 0xf1, 0xed, 0xbb, 0x6c, 0xb7, 0xf8, 0x40, 0xf4, 0xbf, 0x68, 0x70, 0xc1, 0xc0, 0xae, 0xff,
0x31, 0xfe, 0x6f, 0x35, 0x81, 0xfe, 0x53, 0x0d, 0xea, 0xb4, 0x0a, 0xdf, 0xc3, 0xa1, 0x49, 0x35,
0x81, 0xde, 0x83, 0xaa, 0xe3, 0x9b, 0x56, 0x2f, 0x3c, 0x1c, 0xf1, 0xa3, 0x35, 0xd3, 0x47, 0xe3,
0xda, 0xa3, 0x9b, 0xf6, 0x0e, 0x47, 0xd8, 0x98, 0x73, 0xc4, 0xaf, 0xcc, 0x31, 0x0a, 0x39, 0xb2,
0x57, 0x51, 0xd5, 0x49, 0x16, 0x61, 0xf1, 0x5b, 0x66, 0x38, 0x38, 0xd8, 0x70, 0x85, 0x98, 0xe4,
0xd5, 0xe8, 0x3c, 0x4f, 0xd1, 0x8c, 0x42, 0xbb, 0xac, 0xf2, 0x34, 0x7a, 0xfd, 0x59, 0x79, 0x28,
0xcc, 0x10, 0x0b, 0xed, 0x58, 0x57, 0x51, 0x39, 0x4d, 0x0b, 0xb8, 0x0e, 0x0d, 0xfc, 0x7c, 0xe0,
0x8c, 0x2d, 0xdc, 0xe3, 0xdc, 0xb9, 0x9f, 0x5f, 0x54, 0x70, 0x8f, 0xbb, 0x79, 0x5d, 0x6c, 0xda,
0x12, 0x32, 0x70, 0x53, 0xbb, 0x38, 0x34, 0x3b, 0x73, 0x4c, 0x8c, 0xa5, 0x69, 0xa6, 0x96, 0xfe,
0xc1, 0xcd, 0x4d, 0x57, 0xfa, 0xbf, 0x34, 0xb8, 0xc0, 0xcd, 0x84, 0x9d, 0xd0, 0x7c, 0xb5, 0x96,
0x8a, 0xac, 0x50, 0x3a, 0xa1, 0x15, 0x62, 0x1a, 0xa8, 0x9e, 0x58, 0x03, 0x3f, 0x2b, 0x41, 0x4b,
0xa8, 0x97, 0x62, 0xb0, 0xf8, 0x79, 0x03, 0xaa, 0x51, 0xb1, 0x11, 0xcd, 0xd0, 0x04, 0x80, 0x96,
0xa0, 0x16, 0xf3, 0x1e, 0x71, 0xd0, 0x38, 0x28, 0xd7, 0x69, 0x65, 0xeb, 0x50, 0x8a, 0xb5, 0x0e,
0x6f, 0x02, 0xec, 0x3b, 0x63, 0x72, 0xd0, 0x0b, 0x6d, 0x17, 0x8b, 0x06, 0xae, 0xca, 0x20, 0x7b,
0xb6, 0x8b, 0xd1, 0xfb, 0x50, 0xef, 0xdb, 0x9e, 0xe3, 0x0f, 0x7b, 0x23, 0x33, 0x3c, 0x20, 0x9d,
0xca, 0x54, 0x7f, 0xb9, 0x63, 0x63, 0xc7, 0x5a, 0x63, 0xb8, 0x46, 0x8d, 0xef, 0xd9, 0xa1, 0x5b,
0xd0, 0x45, 0xa8, 0x79, 0x63, 0xb7, 0xe7, 0xef, 0xf7, 0x02, 0xff, 0x19, 0xf5, 0x38, 0xc6, 0xc2,
0x1b, 0xbb, 0x1f, 0xed, 0x1b, 0xfe, 0x33, 0x82, 0xbe, 0x06, 0x55, 0x5a, 0xee, 0x88, 0xe3, 0x0f,
0x49, 0x67, 0x2e, 0x17, 0xfd, 0xc9, 0x06, 0xba, 0xdb, 0xa2, 0x7e, 0xc4, 0x76, 0x57, 0xf3, 0xed,
0x8e, 0x36, 0xa0, 0xab, 0xd0, 0x1c, 0xf8, 0xee, 0xc8, 0x64, 0x1a, 0xba, 0x13, 0xf8, 0x6e, 0x07,
0x58, 0xac, 0xa6, 0xa0, 0xe8, 0x0e, 0xd4, 0x6c, 0xcf, 0xc2, 0xcf, 0x45, 0xd4, 0xd4, 0x18, 0x9f,
0x65, 0x95, 0xc9, 0x1f, 0xe2, 0x01, 0xe3, 0xb5, 0x45, 0xd1, 0x99, 0xdd, 0xc1, 0x96, 0x3f, 0x09,
0xba, 0x0c, 0x75, 0x61, 0xd4, 0x1e, 0xb1, 0x5f, 0xe0, 0x4e, 0x9d, 0x1b, 0x52, 0xc0, 0x76, 0xed,
0x17, 0x58, 0xff, 0x6d, 0x01, 0xe6, 0x33, 0x44, 0x68, 0x2b, 0xbc, 0xcf, 0x20, 0xd2, 0x39, 0xe4,
0x92, 0x92, 0xc4, 0x9e, 0xd9, 0x77, 0x68, 0x44, 0x5b, 0xf8, 0x39, 0xf3, 0x8d, 0x39, 0xa3, 0xc6,
0x61, 0x8c, 0x00, 0xb5, 0x31, 0x97, 0xde, 0x33, 0x5d, 0x2c, 0x5a, 0xd5, 0x2a, 0x83, 0x6c, 0x9b,
0x2e, 0xa6, 0xb4, 0xb9, 0x88, 0xd2, 0x33, 0xe4, 0x92, 0x7e, 0xe9, 0x8f, 0x6d, 0xc6, 0x95, 0x7b,
0x86, 0x5c, 0xa2, 0x0d, 0xa8, 0x73, 0x92, 0x23, 0x33, 0x30, 0x5d, 0xe9, 0x17, 0x97, 0x95, 0xe1,
0x7a, 0x17, 0x1f, 0x3e, 0x34, 0x9d, 0x31, 0xde, 0x31, 0xed, 0xc0, 0xe0, 0x7a, 0xdc, 0x61, 0xbb,
0xd0, 0x75, 0x68, 0x73, 0x2a, 0xfb, 0xb6, 0x83, 0x85, 0x87, 0xd1, 0x8c, 0x54, 0x35, 0x9a, 0x0c,
0x7e, 0xc7, 0x76, 0x30, 0x77, 0xa2, 0xe8, 0x08, 0x4c, 0x6d, 0x73, 0xdc, 0x87, 0x18, 0x84, 0x29,
0xed, 0xef, 0x05, 0x58, 0xa0, 0xa1, 0x24, 0x4b, 0xf0, 0xe9, 0xb3, 0xc9, 0x9b, 0x00, 0x16, 0x09,
0x7b, 0x89, 0x8c, 0x52, 0xb5, 0x48, 0xb8, 0xcd, 0x93, 0xca, 0x7b, 0x32, 0x61, 0x14, 0xa7, 0x37,
0xaf, 0xa9, 0xd0, 0xce, 0xa6, 0xee, 0x53, 0xdd, 0xde, 0xaf, 0x40, 0x83, 0xf8, 0xe3, 0x60, 0x80,
0x7b, 0x89, 0xcb, 0x56, 0x9d, 0x03, 0xb7, 0xd5, 0x39, 0xaf, 0xa2, 0x7c, 0x45, 0x88, 0x25, 0xaf,
0xd9, 0x13, 0x27, 0xaf, 0x3f, 0x6b, 0xb0, 0x28, 0x2e, 0xa6, 0x67, 0xd7, 0xf6, 0xb4, 0xdc, 0x2d,
0x33, 0x55, 0xf1, 0x88, 0x4b, 0x4e, 0x29, 0x47, 0xe5, 0x2d, 0x2b, 0x2a, 0x6f, 0xb2, 0xd1, 0xaf,
0xa4, 0x1b, 0x7d, 0xfd, 0xfb, 0x1a, 0x34, 0x76, 0xb1, 0x19, 0x0c, 0x0e, 0xe4, 0xb9, 0xde, 0x85,
0x62, 0x80, 0x9f, 0x8a, 0x63, 0xa5, 0xba, 0x4c, 0xb1, 0x48, 0x6c, 0x30, 0x28, 0x3a, 0xba, 0x04,
0x35, 0xcb, 0x75, 0x52, 0xb7, 0x49, 0xb0, 0x5c, 0x47, 0x76, 0x5d, 0x49, 0x41, 0x8a, 0x19, 0x41,
0x3e, 0xd1, 0xa0, 0x7e, 0x9f, 0xb7, 0x5e, 0x5c, 0x8e, 0xdb, 0x71, 0x39, 0x2e, 0x2b, 0xe5, 0x88,
0xe3, 0xff, 0x87, 0xc4, 0xf8, 0x89, 0x06, 0x8b, 0x1f, 0x98, 0x9e, 0xe5, 0xef, 0xef, 0x9f, 0xdd,
0xe0, 0xeb, 0x51, 0x02, 0xdc, 0x3a, 0xc9, 0xc5, 0x26, 0xb1, 0x49, 0xff, 0x41, 0x01, 0x10, 0xf5,
0xce, 0x35, 0xd3, 0x31, 0xbd, 0x01, 0x3e, 0xbd, 0x34, 0xcb, 0xd0, 0x4c, 0xc4, 0x54, 0xf4, 0xfa,
0x1a, 0x0f, 0x2a, 0x82, 0xee, 0x42, 0xb3, 0xcf, 0x59, 0xf5, 0x02, 0x6c, 0x12, 0xdf, 0x63, 0x7e,
0xd9, 0x5c, 0x7d, 0x4b, 0x25, 0xf6, 0x5e, 0x60, 0x0f, 0x87, 0x38, 0x58, 0xf7, 0x3d, 0x8b, 0x5f,
0x39, 0x1a, 0x7d, 0x29, 0x26, 0xdd, 0xca, 0xec, 0x11, 0x25, 0x18, 0xd9, 0x1b, 0x42, 0x94, 0x61,
0x08, 0x7a, 0x1b, 0xe6, 0x93, 0xb7, 0x91, 0x89, 0x23, 0xb7, 0x49, 0xfc, 0xa2, 0x41, 0x8d, 0xf3,
0x3d, 0x40, 0x51, 0xb7, 0xcb, 0x9a, 0x2a, 0x56, 0x2d, 0xf2, 0x3c, 0xae, 0xbc, 0x01, 0x55, 0x4b,
0xee, 0x14, 0x5e, 0x31, 0x01, 0xd0, 0x6c, 0xc3, 0x25, 0xec, 0xd1, 0xc0, 0xc7, 0x96, 0xec, 0x27,
0x38, 0xf0, 0x43, 0x06, 0xd3, 0x3f, 0x2b, 0x40, 0x3b, 0x7e, 0xc3, 0xc9, 0xcd, 0xfb, 0xe5, 0x3c,
0xb5, 0x1c, 0x71, 0x9d, 0x2b, 0x9d, 0xe1, 0x3a, 0x97, 0xbd, 0x6e, 0x96, 0x4f, 0x77, 0xdd, 0xd4,
0x7f, 0xa1, 0x41, 0x2b, 0xf5, 0xb2, 0x91, 0xee, 0xec, 0xb4, 0x6c, 0x67, 0xf7, 0x15, 0x28, 0xd3,
0x76, 0x07, 0x33, 0x25, 0x35, 0xd3, 0x6c, 0x55, 0xef, 0x25, 0x06, 0xdf, 0x80, 0x6e, 0xc2, 0x82,
0xe2, 0x99, 0x5b, 0x98, 0x12, 0x65, 0x5f, 0xb9, 0xf5, 0xdf, 0x95, 0xa0, 0x16, 0xd3, 0xc7, 0x31,
0x4d, 0x69, 0x9e, 0x7b, 0x5b, 0xea, 0x78, 0xc5, 0xec, 0xf1, 0xa6, 0xbc, 0xf3, 0xa2, 0x0b, 0x30,
0xe7, 0x62, 0x97, 0xd7, 0x7b, 0xd1, 0x7c, 0xb8, 0xd8, 0xa5, 0xd5, 0x9e, 0x7e, 0xa2, 0x1d, 0x25,
0x6b, 0x27, 0x79, 0x85, 0x9b, 0xf5, 0xc6, 0x2e, 0x6b, 0x26, 0x93, 0xad, 0xce, 0xec, 0x11, 0xad,
0xce, 0x5c, 0xb2, 0xd5, 0x49, 0x84, 0x43, 0x35, 0x1d, 0x0e, 0x79, 0xfb, 0xc4, 0x5b, 0xb0, 0x30,
0x60, 0xcf, 0x92, 0xd6, 0xda, 0xe1, 0x7a, 0xf4, 0xa9, 0x53, 0x63, 0x3d, 0x99, 0xea, 0x13, 0xba,
0x43, 0x9d, 0x4b, 0x74, 0x84, 0xcc, 0xca, 0x75, 0x66, 0x65, 0x75, 0x27, 0x25, 0x6c, 0xc3, 0x8d,
0x2c, 0x73, 0x22, 0x5b, 0xa5, 0x3b, 0xd4, 0xc6, 0x69, 0x3b, 0xd4, 0x4b, 0x50, 0x93, 0x43, 0x02,
0xdb, 0x22, 0x9d, 0x26, 0x4f, 0x4f, 0x02, 0xb4, 0x65, 0x11, 0xa6, 0x7c, 0x9f, 0xde, 0x1f, 0x2d,
0xd2, 0x69, 0xb1, 0xaf, 0xb3, 0xcc, 0x62, 0x16, 0xd1, 0x3f, 0x2d, 0x42, 0x73, 0xd2, 0xbf, 0xe4,
0xce, 0x06, 0x79, 0x26, 0x36, 0xdb, 0xd0, 0x9e, 0xbc, 0x22, 0x32, 0x45, 0x1d, 0xd9, 0x82, 0xa5,
0xdf, 0x0f, 0x5b, 0xa3, 0x54, 0xd8, 0x25, 0x9e, 0x2b, 0x4a, 0x27, 0x7a, 0xae, 0x38, 0xdb, 0xc3,
0x3e, 0xba, 0x0d, 0xe7, 0x03, 0xde, 0x3e, 0x59, 0xbd, 0xc4, 0xb1, 0x79, 0x27, 0x72, 0x4e, 0x7e,
0xdc, 0x89, 0x1f, 0x7f, 0x4a, 0x24, 0xcf, 0x4e, 0x8b, 0xe4, 0xb4, 0x19, 0xe7, 0xd2, 0x66, 0xd4,
0x1f, 0xc0, 0xc2, 0x03, 0x8f, 0x8c, 0xfb, 0x64, 0x10, 0xd8, 0x7d, 0x2c, 0x6f, 0xe1, 0xb9, 0xec,
0xd5, 0x85, 0x39, 0x91, 0x8b, 0xb9, 0xad, 0xaa, 0x46, 0xb4, 0xd6, 0x7f, 0xa4, 0xc1, 0x62, 0x96,
0x2e, 0x73, 0x85, 0x49, 0xa0, 0x6b, 0x89, 0x40, 0xff, 0x36, 0x2c, 0x4c, 0xc8, 0xf7, 0x12, 0x94,
0x6b, 0xab, 0xd7, 0x54, 0x46, 0x51, 0x08, 0x6e, 0xa0, 0x09, 0x0d, 0x09, 0xd3, 0xff, 0xa1, 0xc1,
0xbc, 0x08, 0x19, 0x0a, 0x1b, 0xb2, 0xf7, 0x0b, 0x5a, 0x7c, 0x7c, 0xcf, 0xb1, 0xbd, 0xa8, 0x91,
0x16, 0x67, 0xe4, 0x40, 0xd1, 0x48, 0x7f, 0x00, 0x2d, 0x81, 0x14, 0xd5, 0x90, 0x9c, 0xad, 0x4a,
0x93, 0xef, 0x8b, 0xaa, 0xc7, 0x32, 0x34, 0xfd, 0xfd, 0xfd, 0x38, 0x3f, 0x9e, 0x04, 0x1b, 0x02,
0x2a, 0x18, 0x7e, 0x13, 0xda, 0x12, 0xed, 0xa4, 0x55, 0xab, 0x25, 0x36, 0x46, 0xef, 0x8f, 0x3f,
0xd4, 0xa0, 0x93, 0xac, 0x61, 0xb1, 0xe3, 0x9f, 0xbc, 0x4b, 0xfa, 0x6a, 0xf2, 0x15, 0x7a, 0xf9,
0x08, 0x79, 0x26, 0x7c, 0xe4, 0x5b, 0xf4, 0x9f, 0x34, 0xa8, 0x19, 0xc2, 0xed, 0x28, 0xfb, 0x37,
0x01, 0x26, 0x8e, 0x29, 0x6b, 0x4a, 0xe4, 0x97, 0xd4, 0x38, 0x31, 0x67, 0xb0, 0x2d, 0x45, 0x51,
0x61, 0x48, 0x93, 0x64, 0x40, 0xdd, 0x3b, 0xf3, 0x1a, 0x68, 0xd1, 0xaa, 0xdd, 0x24, 0x07, 0x66,
0x60, 0xf5, 0x04, 0x71, 0xa9, 0x4e, 0xe5, 0x5d, 0x67, 0x97, 0x62, 0x0a, 0x31, 0x8d, 0x06, 0x89,
0xad, 0x92, 0x09, 0xaf, 0x9c, 0x4c, 0x78, 0xdb, 0x50, 0x8f, 0xef, 0xa4, 0x2e, 0xee, 0x60, 0xd3,
0xc2, 0x81, 0x74, 0x71, 0xbe, 0x42, 0x57, 0xa1, 0x65, 0xb9, 0xd2, 0xb5, 0x79, 0x69, 0xe2, 0x1d,
0x4f, 0x23, 0x2a, 0x31, 0xb4, 0x3c, 0xdd, 0x78, 0x01, 0xcd, 0x64, 0xe6, 0x42, 0x75, 0x98, 0xdb,
0xf6, 0xc3, 0x6f, 0x3c, 0xb7, 0x49, 0xd8, 0x9e, 0x41, 0x4d, 0x80, 0x6d, 0x3f, 0xdc, 0x09, 0x30,
0xc1, 0x5e, 0xd8, 0xd6, 0x10, 0x40, 0xe5, 0x23, 0x6f, 0xc3, 0x26, 0x4f, 0xda, 0x05, 0xb4, 0x20,
0x7a, 0x0b, 0xd3, 0xd9, 0x12, 0xe9, 0xa0, 0x5d, 0xa4, 0xdb, 0xa3, 0x55, 0x09, 0xb5, 0xa1, 0x1e,
0xa1, 0x6c, 0xee, 0x3c, 0x68, 0x97, 0x51, 0x15, 0xca, 0xfc, 0x67, 0xe5, 0x86, 0x05, 0xed, 0x74,
0xeb, 0x4a, 0x69, 0x3e, 0xf0, 0xee, 0x7a, 0xfe, 0xb3, 0x08, 0xd4, 0x9e, 0x41, 0x35, 0x98, 0x15,
0xd7, 0x81, 0xb6, 0x86, 0x5a, 0x50, 0x8b, 0x75, 0xe2, 0xed, 0x02, 0x05, 0x6c, 0x06, 0xa3, 0x81,
0xe8, 0xc9, 0xb9, 0x08, 0xd4, 0xc5, 0x37, 0xfc, 0x67, 0x5e, 0xbb, 0x74, 0x63, 0x0d, 0xe6, 0x64,
0x4a, 0xa5, 0xa8, 0x9c, 0xba, 0x47, 0x97, 0xed, 0x19, 0x34, 0x0f, 0x8d, 0xc4, 0x64, 0xb7, 0xad,
0x21, 0x04, 0xcd, 0xe4, 0xd4, 0xbd, 0x5d, 0x58, 0xfd, 0x43, 0x0d, 0x80, 0xb7, 0x9d, 0xbe, 0x1f,
0x58, 0x68, 0x04, 0x68, 0x13, 0x87, 0xb4, 0xa4, 0xfa, 0x9e, 0x2c, 0x87, 0x04, 0xdd, 0x9a, 0xd2,
0x9d, 0x65, 0x51, 0x85, 0xa8, 0xdd, 0xab, 0x53, 0x76, 0xa4, 0xd0, 0xf5, 0x19, 0xe4, 0x32, 0x8e,
0x7b, 0xb6, 0x8b, 0xf7, 0xec, 0xc1, 0x93, 0xa8, 0x5f, 0x9d, 0xce, 0x31, 0x85, 0x2a, 0x39, 0x5e,
0x51, 0x5f, 0x25, 0xc3, 0xc0, 0xf6, 0x86, 0x72, 0x70, 0xa4, 0xcf, 0xa0, 0xa7, 0x70, 0x6e, 0x13,
0x33, 0xee, 0x36, 0x09, 0xed, 0x01, 0x91, 0x0c, 0x57, 0xa7, 0x33, 0xcc, 0x20, 0x9f, 0x90, 0xa5,
0x03, 0xad, 0xd4, 0xbf, 0x5c, 0xd0, 0x0d, 0x75, 0xdc, 0xa8, 0xfe, 0x91, 0xd3, 0x7d, 0x3b, 0x17,
0x6e, 0xc4, 0xcd, 0x86, 0x66, 0xf2, 0x1f, 0x20, 0xe8, 0x0b, 0xd3, 0x08, 0x64, 0x66, 0xe1, 0xdd,
0x1b, 0x79, 0x50, 0x23, 0x56, 0x8f, 0xb8, 0x3f, 0x1d, 0xc7, 0x4a, 0xf9, 0x07, 0x83, 0xee, 0x51,
0x33, 0x3b, 0x7d, 0x06, 0x7d, 0x17, 0xe6, 0x33, 0x13, 0x7b, 0xf4, 0x45, 0x15, 0xf9, 0x69, 0x83,
0xfd, 0xe3, 0x38, 0x3c, 0x4a, 0x47, 0xc3, 0x74, 0xe9, 0x33, 0x7f, 0xdd, 0xc8, 0x2f, 0x7d, 0x8c,
0xfc, 0x51, 0xd2, 0x9f, 0x98, 0xc3, 0x18, 0x50, 0x76, 0x66, 0x8f, 0xde, 0x51, 0xb1, 0x98, 0xfa,
0xbf, 0x81, 0xee, 0x4a, 0x5e, 0xf4, 0xc8, 0xe4, 0x63, 0x16, 0xad, 0xe9, 0x7b, 0x97, 0x92, 0xed,
0xd4, 0x39, 0xbd, 0x9a, 0xed, 0xf4, 0x51, 0x39, 0x77, 0xea, 0xe4, 0x28, 0x58, 0x6d, 0x2b, 0xe5,
0xf8, 0x5a, 0xed, 0xd4, 0xea, 0xc9, 0xb2, 0x3e, 0x83, 0xf6, 0x12, 0x49, 0x18, 0x5d, 0x9d, 0xe6,
0x13, 0xc9, 0xf7, 0x92, 0xe3, 0xcc, 0xd5, 0x03, 0xd8, 0xc4, 0xe1, 0x3d, 0x1c, 0x06, 0xf6, 0x80,
0xa4, 0x89, 0x8a, 0xc5, 0x04, 0x41, 0x12, 0xbd, 0x76, 0x2c, 0x9e, 0x14, 0x7b, 0xf5, 0x8f, 0x35,
0xa8, 0x32, 0x9b, 0xd1, 0xfa, 0xf0, 0xbf, 0x34, 0xfe, 0x12, 0xd2, 0xf8, 0x63, 0x68, 0xa5, 0xfe,
0x07, 0xa0, 0x4e, 0xe3, 0xea, 0x3f, 0x0b, 0x1c, 0xe7, 0x20, 0x7d, 0x40, 0xd9, 0x29, 0xb7, 0x3a,
0xb0, 0xa6, 0x4e, 0xc3, 0x8f, 0xe3, 0xf1, 0x18, 0x5a, 0xa9, 0x91, 0xae, 0xfa, 0x04, 0xea, 0xb9,
0x6f, 0x8e, 0x13, 0x64, 0x27, 0x91, 0xea, 0x13, 0x4c, 0x9d, 0x58, 0x1e, 0xc7, 0xe3, 0x21, 0x1f,
0x94, 0x47, 0xf7, 0x81, 0x6b, 0xd3, 0xa2, 0x33, 0xf5, 0xb8, 0xfa, 0xea, 0xf3, 0xf5, 0xcb, 0xaf,
0x67, 0x8f, 0xa1, 0x95, 0x1a, 0x25, 0xa8, 0xad, 0xab, 0x9e, 0x37, 0x1c, 0x47, 0xfd, 0x73, 0xcc,
0xc0, 0xf7, 0xa1, 0xc2, 0x27, 0x00, 0xe8, 0xb2, 0xfa, 0x76, 0x14, 0x9b, 0x0e, 0x74, 0x8f, 0x9e,
0x20, 0x90, 0xb1, 0x13, 0x52, 0xe9, 0xb7, 0xa1, 0xcc, 0xe2, 0x05, 0x29, 0x2f, 0x2c, 0xf1, 0x77,
0xfe, 0xee, 0x91, 0xa3, 0x00, 0x49, 0xef, 0x65, 0xa7, 0xf3, 0xb5, 0x77, 0x1f, 0xad, 0x0e, 0xed,
0xf0, 0x60, 0xdc, 0xa7, 0x86, 0xb8, 0xc9, 0x31, 0xdf, 0xb1, 0x7d, 0xf1, 0xeb, 0xa6, 0xcc, 0x6b,
0x37, 0x19, 0xa5, 0x9b, 0xec, 0x18, 0xa3, 0x7e, 0xbf, 0xc2, 0x96, 0xb7, 0xff, 0x1d, 0x00, 0x00,
0xff, 0xff, 0xa6, 0x19, 0x8e, 0x8c, 0x53, 0x2e, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -3364,6 +3483,8 @@ type QueryNodeClient interface {
ReleasePartitions(ctx context.Context, in *ReleasePartitionsRequest, opts ...grpc.CallOption) (*commonpb.Status, error)
ReleaseSegments(ctx context.Context, in *ReleaseSegmentsRequest, opts ...grpc.CallOption) (*commonpb.Status, error)
GetSegmentInfo(ctx context.Context, in *GetSegmentInfoRequest, opts ...grpc.CallOption) (*GetSegmentInfoResponse, error)
Search(ctx context.Context, in *SearchRequest, opts ...grpc.CallOption) (*milvuspb.SearchResults, error)
Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*milvuspb.QueryResults, error)
// https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
GetMetrics(ctx context.Context, in *milvuspb.GetMetricsRequest, opts ...grpc.CallOption) (*milvuspb.GetMetricsResponse, error)
}
@ -3484,6 +3605,24 @@ func (c *queryNodeClient) GetSegmentInfo(ctx context.Context, in *GetSegmentInfo
return out, nil
}
func (c *queryNodeClient) Search(ctx context.Context, in *SearchRequest, opts ...grpc.CallOption) (*milvuspb.SearchResults, error) {
out := new(milvuspb.SearchResults)
err := c.cc.Invoke(ctx, "/milvus.proto.query.QueryNode/Search", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *queryNodeClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (*milvuspb.QueryResults, error) {
out := new(milvuspb.QueryResults)
err := c.cc.Invoke(ctx, "/milvus.proto.query.QueryNode/Query", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *queryNodeClient) GetMetrics(ctx context.Context, in *milvuspb.GetMetricsRequest, opts ...grpc.CallOption) (*milvuspb.GetMetricsResponse, error) {
out := new(milvuspb.GetMetricsResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.query.QueryNode/GetMetrics", in, out, opts...)
@ -3507,6 +3646,8 @@ type QueryNodeServer interface {
ReleasePartitions(context.Context, *ReleasePartitionsRequest) (*commonpb.Status, error)
ReleaseSegments(context.Context, *ReleaseSegmentsRequest) (*commonpb.Status, error)
GetSegmentInfo(context.Context, *GetSegmentInfoRequest) (*GetSegmentInfoResponse, error)
Search(context.Context, *SearchRequest) (*milvuspb.SearchResults, error)
Query(context.Context, *QueryRequest) (*milvuspb.QueryResults, error)
// https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
GetMetrics(context.Context, *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error)
}
@ -3551,6 +3692,12 @@ func (*UnimplementedQueryNodeServer) ReleaseSegments(ctx context.Context, req *R
func (*UnimplementedQueryNodeServer) GetSegmentInfo(ctx context.Context, req *GetSegmentInfoRequest) (*GetSegmentInfoResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetSegmentInfo not implemented")
}
func (*UnimplementedQueryNodeServer) Search(ctx context.Context, req *SearchRequest) (*milvuspb.SearchResults, error) {
return nil, status.Errorf(codes.Unimplemented, "method Search not implemented")
}
func (*UnimplementedQueryNodeServer) Query(ctx context.Context, req *QueryRequest) (*milvuspb.QueryResults, error) {
return nil, status.Errorf(codes.Unimplemented, "method Query not implemented")
}
func (*UnimplementedQueryNodeServer) GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetMetrics not implemented")
}
@ -3775,6 +3922,42 @@ func _QueryNode_GetSegmentInfo_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _QueryNode_Search_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SearchRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryNodeServer).Search(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.query.QueryNode/Search",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryNodeServer).Search(ctx, req.(*SearchRequest))
}
return interceptor(ctx, in, info, handler)
}
func _QueryNode_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryNodeServer).Query(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.query.QueryNode/Query",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryNodeServer).Query(ctx, req.(*QueryRequest))
}
return interceptor(ctx, in, info, handler)
}
func _QueryNode_GetMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(milvuspb.GetMetricsRequest)
if err := dec(in); err != nil {
@ -3845,6 +4028,14 @@ var _QueryNode_serviceDesc = grpc.ServiceDesc{
MethodName: "GetSegmentInfo",
Handler: _QueryNode_GetSegmentInfo_Handler,
},
{
MethodName: "Search",
Handler: _QueryNode_Search_Handler,
},
{
MethodName: "Query",
Handler: _QueryNode_Query_Handler,
},
{
MethodName: "GetMetrics",
Handler: _QueryNode_GetMetrics_Handler,

View File

@ -157,3 +157,11 @@ func (client *queryNodeClientMock) GetSegmentInfo(ctx context.Context, req *quer
func (client *queryNodeClientMock) GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error) {
return client.grpcClient.GetMetrics(ctx, req)
}
func (client *queryNodeClientMock) Search(ctx context.Context, req *querypb.SearchRequest) (*milvuspb.SearchResults, error) {
return client.grpcClient.Search(ctx, req)
}
func (client *queryNodeClientMock) Query(ctx context.Context, req *querypb.QueryRequest) (*milvuspb.QueryResults, error) {
return client.grpcClient.Query(ctx, req)
}

View File

@ -18,6 +18,7 @@ package querynode
import (
"context"
"errors"
"fmt"
"go.uber.org/zap"
@ -554,6 +555,16 @@ func (node *QueryNode) isHealthy() bool {
return code == internalpb.StateCode_Healthy
}
// Search performs replica search tasks.
func (node *QueryNode) Search(ctx context.Context, req *queryPb.SearchRequest) (*milvuspb.SearchResults, error) {
return nil, errors.New("not implemented")
}
// Query performs replica query tasks.
func (node *QueryNode) Query(ctx context.Context, req *queryPb.QueryRequest) (*milvuspb.QueryResults, error) {
return nil, errors.New("not implemented")
}
// GetMetrics return system infos of the query node, such as total memory, memory usage, cpu usage ...
// TODO(dragondriver): cache the Metrics and set a retention to the cache
func (node *QueryNode) GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error) {

View File

@ -25,6 +25,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
@ -575,3 +576,25 @@ func TestImpl_ReleaseSegments(t *testing.T) {
})
wg.Wait()
}
func TestImpl_Search(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
node, err := genSimpleQueryNode(ctx)
require.NoError(t, err)
_, err = node.Search(ctx, nil)
assert.Error(t, err)
}
func TestImpl_Query(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
node, err := genSimpleQueryNode(ctx)
require.NoError(t, err)
_, err = node.Query(ctx, nil)
assert.Error(t, err)
}

View File

@ -1130,6 +1130,9 @@ type QueryNode interface {
ReleaseSegments(ctx context.Context, req *querypb.ReleaseSegmentsRequest) (*commonpb.Status, error)
GetSegmentInfo(ctx context.Context, req *querypb.GetSegmentInfoRequest) (*querypb.GetSegmentInfoResponse, error)
Search(ctx context.Context, req *querypb.SearchRequest) (*milvuspb.SearchResults, error)
Query(ctx context.Context, req *querypb.QueryRequest) (*milvuspb.QueryResults, error)
// GetMetrics gets the metrics about QueryNode.
GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error)
}

View File

@ -119,9 +119,7 @@ func (c *ClientBase) Call(ctx context.Context, caller func(client interface{}) (
}
func (c *ClientBase) ReCall(ctx context.Context, caller func(client interface{}) (interface{}, error)) (interface{}, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
// omit ctx check in mock first time to let each function has failed context
ret, err := c.callOnce(ctx, caller)
if err == nil {
return ret, nil

View File

@ -78,6 +78,13 @@ func (m *QueryNodeClient) GetSegmentInfo(ctx context.Context, in *querypb.GetSeg
return &querypb.GetSegmentInfoResponse{}, m.Err
}
func (m *QueryNodeClient) Search(ctx context.Context, in *querypb.SearchRequest, opts ...grpc.CallOption) (*milvuspb.SearchResults, error) {
return &milvuspb.SearchResults{}, m.Err
}
func (m *QueryNodeClient) Query(ctx context.Context, in *querypb.QueryRequest, opts ...grpc.CallOption) (*milvuspb.QueryResults, error) {
return &milvuspb.QueryResults{}, m.Err
}
func (m *QueryNodeClient) GetMetrics(ctx context.Context, in *milvuspb.GetMetricsRequest, opts ...grpc.CallOption) (*milvuspb.GetMetricsResponse, error) {
return &milvuspb.GetMetricsResponse{}, m.Err
}