Implement ReportImport related logic. (#16312)

/kind feature

issue: #15604
Signed-off-by: Yuchen Gao <yuchen.gao@zilliz.com>
pull/16315/head
Ten Thousand Leaves 2022-03-31 13:51:28 +08:00 committed by GitHub
parent baa745b83e
commit 0d54697d42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 839 additions and 611 deletions

View File

@ -265,7 +265,7 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"ceID\030\004 \001(\003\"7\n\tMsgHeader\022*\n\004base\030\001 \001(\0132\034."
"milvus.proto.common.MsgBase\"M\n\014DMLMsgHea"
"der\022*\n\004base\030\001 \001(\0132\034.milvus.proto.common."
"MsgBase\022\021\n\tshardName\030\002 \001(\t*\272\004\n\tErrorCode"
"MsgBase\022\021\n\tshardName\030\002 \001(\t*\363\004\n\tErrorCode"
"\022\013\n\007Success\020\000\022\023\n\017UnexpectedError\020\001\022\021\n\rCo"
"nnectFailed\020\002\022\024\n\020PermissionDenied\020\003\022\027\n\023C"
"ollectionNotExists\020\004\022\023\n\017IllegalArgument\020"
@ -279,54 +279,56 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"\n\020CannotDeleteFile\020\024\022\023\n\017BuildIndexError\020"
"\025\022\020\n\014IllegalNLIST\020\026\022\025\n\021IllegalMetricType"
"\020\027\022\017\n\013OutOfMemory\020\030\022\021\n\rIndexNotExist\020\031\022\023"
"\n\017EmptyCollection\020\032\022\022\n\rDDRequestRace\020\350\007*"
"X\n\nIndexState\022\022\n\016IndexStateNone\020\000\022\014\n\010Uni"
"ssued\020\001\022\016\n\nInProgress\020\002\022\014\n\010Finished\020\003\022\n\n"
"\006Failed\020\004*s\n\014SegmentState\022\024\n\020SegmentStat"
"eNone\020\000\022\014\n\010NotExist\020\001\022\013\n\007Growing\020\002\022\n\n\006Se"
"aled\020\003\022\013\n\007Flushed\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dro"
"pped\020\006*\300\t\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020Cre"
"ateCollection\020d\022\022\n\016DropCollection\020e\022\021\n\rH"
"asCollection\020f\022\026\n\022DescribeCollection\020g\022\023"
"\n\017ShowCollections\020h\022\024\n\020GetSystemConfigs\020"
"i\022\022\n\016LoadCollection\020j\022\025\n\021ReleaseCollecti"
"on\020k\022\017\n\013CreateAlias\020l\022\r\n\tDropAlias\020m\022\016\n\n"
"AlterAlias\020n\022\024\n\017CreatePartition\020\310\001\022\022\n\rDr"
"opPartition\020\311\001\022\021\n\014HasPartition\020\312\001\022\026\n\021Des"
"cribePartition\020\313\001\022\023\n\016ShowPartitions\020\314\001\022\023"
"\n\016LoadPartitions\020\315\001\022\026\n\021ReleasePartitions"
"\020\316\001\022\021\n\014ShowSegments\020\372\001\022\024\n\017DescribeSegmen"
"t\020\373\001\022\021\n\014LoadSegments\020\374\001\022\024\n\017ReleaseSegmen"
"ts\020\375\001\022\024\n\017HandoffSegments\020\376\001\022\030\n\023LoadBalan"
"ceSegments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\020\n\013"
"CreateIndex\020\254\002\022\022\n\rDescribeIndex\020\255\002\022\016\n\tDr"
"opIndex\020\256\002\022\013\n\006Insert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005"
"Flush\020\222\003\022\013\n\006Search\020\364\003\022\021\n\014SearchResult\020\365\003"
"\022\022\n\rGetIndexState\020\366\003\022\032\n\025GetIndexBuildPro"
"gress\020\367\003\022\034\n\027GetCollectionStatistics\020\370\003\022\033"
"\n\026GetPartitionStatistics\020\371\003\022\r\n\010Retrieve\020"
"\372\003\022\023\n\016RetrieveResult\020\373\003\022\024\n\017WatchDmChanne"
"ls\020\374\003\022\025\n\020RemoveDmChannels\020\375\003\022\027\n\022WatchQue"
"ryChannels\020\376\003\022\030\n\023RemoveQueryChannels\020\377\003\022"
"\035\n\030SealedSegmentsChangeInfo\020\200\004\022\027\n\022WatchD"
"eltaChannels\020\201\004\022\020\n\013SegmentInfo\020\330\004\022\017\n\nSys"
"temInfo\020\331\004\022\024\n\017GetRecoveryInfo\020\332\004\022\024\n\017GetS"
"egmentState\020\333\004\022\r\n\010TimeTick\020\260\t\022\023\n\016QueryNo"
"deStats\020\261\t\022\016\n\tLoadIndex\020\262\t\022\016\n\tRequestID\020"
"\263\t\022\017\n\nRequestTSO\020\264\t\022\024\n\017AllocateSegment\020\265"
"\t\022\026\n\021SegmentStatistics\020\266\t\022\025\n\020SegmentFlus"
"hDone\020\267\t\022\017\n\nDataNodeTt\020\270\t*\"\n\007DslType\022\007\n\003"
"Dsl\020\000\022\016\n\nBoolExprV1\020\001*B\n\017CompactionState"
"\022\021\n\rUndefiedState\020\000\022\r\n\tExecuting\020\001\022\r\n\tCo"
"mpleted\020\002*X\n\020ConsistencyLevel\022\n\n\006Strong\020"
"\000\022\013\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\nEventuall"
"y\020\003\022\016\n\nCustomized\020\004*\227\001\n\013ImportState\022\021\n\rI"
"mportPending\020\000\022\020\n\014ImportFailed\020\001\022\021\n\rImpo"
"rtStarted\020\002\022\024\n\020ImportDownloaded\020\003\022\020\n\014Imp"
"ortParsed\020\004\022\023\n\017ImportPersisted\020\005\022\023\n\017Impo"
"rtCompleted\020\006BW\n\016io.milvus.grpcB\013CommonP"
"rotoP\001Z3github.com/milvus-io/milvus/inte"
"rnal/proto/commonpb\240\001\001b\006proto3"
"\n\017EmptyCollection\020\032\022\033\n\027UpdateImportTaskF"
"ailure\020\033\022\032\n\026CollectionNameNotFound\020\034\022\022\n\r"
"DDRequestRace\020\350\007*X\n\nIndexState\022\022\n\016IndexS"
"tateNone\020\000\022\014\n\010Unissued\020\001\022\016\n\nInProgress\020\002"
"\022\014\n\010Finished\020\003\022\n\n\006Failed\020\004*s\n\014SegmentSta"
"te\022\024\n\020SegmentStateNone\020\000\022\014\n\010NotExist\020\001\022\013"
"\n\007Growing\020\002\022\n\n\006Sealed\020\003\022\013\n\007Flushed\020\004\022\014\n\010"
"Flushing\020\005\022\013\n\007Dropped\020\006*\300\t\n\007MsgType\022\r\n\tU"
"ndefined\020\000\022\024\n\020CreateCollection\020d\022\022\n\016Drop"
"Collection\020e\022\021\n\rHasCollection\020f\022\026\n\022Descr"
"ibeCollection\020g\022\023\n\017ShowCollections\020h\022\024\n\020"
"GetSystemConfigs\020i\022\022\n\016LoadCollection\020j\022\025"
"\n\021ReleaseCollection\020k\022\017\n\013CreateAlias\020l\022\r"
"\n\tDropAlias\020m\022\016\n\nAlterAlias\020n\022\024\n\017CreateP"
"artition\020\310\001\022\022\n\rDropPartition\020\311\001\022\021\n\014HasPa"
"rtition\020\312\001\022\026\n\021DescribePartition\020\313\001\022\023\n\016Sh"
"owPartitions\020\314\001\022\023\n\016LoadPartitions\020\315\001\022\026\n\021"
"ReleasePartitions\020\316\001\022\021\n\014ShowSegments\020\372\001\022"
"\024\n\017DescribeSegment\020\373\001\022\021\n\014LoadSegments\020\374\001"
"\022\024\n\017ReleaseSegments\020\375\001\022\024\n\017HandoffSegment"
"s\020\376\001\022\030\n\023LoadBalanceSegments\020\377\001\022\025\n\020Descri"
"beSegments\020\200\002\022\020\n\013CreateIndex\020\254\002\022\022\n\rDescr"
"ibeIndex\020\255\002\022\016\n\tDropIndex\020\256\002\022\013\n\006Insert\020\220\003"
"\022\013\n\006Delete\020\221\003\022\n\n\005Flush\020\222\003\022\013\n\006Search\020\364\003\022\021"
"\n\014SearchResult\020\365\003\022\022\n\rGetIndexState\020\366\003\022\032\n"
"\025GetIndexBuildProgress\020\367\003\022\034\n\027GetCollecti"
"onStatistics\020\370\003\022\033\n\026GetPartitionStatistic"
"s\020\371\003\022\r\n\010Retrieve\020\372\003\022\023\n\016RetrieveResult\020\373\003"
"\022\024\n\017WatchDmChannels\020\374\003\022\025\n\020RemoveDmChanne"
"ls\020\375\003\022\027\n\022WatchQueryChannels\020\376\003\022\030\n\023Remove"
"QueryChannels\020\377\003\022\035\n\030SealedSegmentsChange"
"Info\020\200\004\022\027\n\022WatchDeltaChannels\020\201\004\022\020\n\013Segm"
"entInfo\020\330\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRecove"
"ryInfo\020\332\004\022\024\n\017GetSegmentState\020\333\004\022\r\n\010TimeT"
"ick\020\260\t\022\023\n\016QueryNodeStats\020\261\t\022\016\n\tLoadIndex"
"\020\262\t\022\016\n\tRequestID\020\263\t\022\017\n\nRequestTSO\020\264\t\022\024\n\017"
"AllocateSegment\020\265\t\022\026\n\021SegmentStatistics\020"
"\266\t\022\025\n\020SegmentFlushDone\020\267\t\022\017\n\nDataNodeTt\020"
"\270\t*\"\n\007DslType\022\007\n\003Dsl\020\000\022\016\n\nBoolExprV1\020\001*B"
"\n\017CompactionState\022\021\n\rUndefiedState\020\000\022\r\n\t"
"Executing\020\001\022\r\n\tCompleted\020\002*X\n\020Consistenc"
"yLevel\022\n\n\006Strong\020\000\022\013\n\007Session\020\001\022\013\n\007Bound"
"ed\020\002\022\016\n\nEventually\020\003\022\016\n\nCustomized\020\004*\227\001\n"
"\013ImportState\022\021\n\rImportPending\020\000\022\020\n\014Impor"
"tFailed\020\001\022\021\n\rImportStarted\020\002\022\024\n\020ImportDo"
"wnloaded\020\003\022\020\n\014ImportParsed\020\004\022\023\n\017ImportPe"
"rsisted\020\005\022\023\n\017ImportCompleted\020\006BW\n\016io.mil"
"vus.grpcB\013CommonProtoP\001Z3github.com/milv"
"us-io/milvus/internal/proto/commonpb\240\001\001b"
"\006proto3"
;
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = {
};
@ -343,7 +345,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_com
static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once;
static bool descriptor_table_common_2eproto_initialized = false;
const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = {
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 2950,
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 3007,
&descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 8, 0,
schemas, file_default_instances, TableStruct_common_2eproto::offsets,
file_level_metadata_common_2eproto, 8, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto,
@ -386,6 +388,8 @@ bool ErrorCode_IsValid(int value) {
case 24:
case 25:
case 26:
case 27:
case 28:
case 1000:
return true;
default:

View File

@ -126,6 +126,8 @@ enum ErrorCode : int {
OutOfMemory = 24,
IndexNotExist = 25,
EmptyCollection = 26,
UpdateImportTaskFailure = 27,
CollectionNameNotFound = 28,
DDRequestRace = 1000,
ErrorCode_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
ErrorCode_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()

View File

@ -2267,7 +2267,8 @@ func TestImport(t *testing.T) {
defer closeTestServer(t, svr)
resp, err := svr.Import(svr.ctx, &datapb.ImportTask{
CollectionName: "dummy",
CollectionId: 100,
PartitionId: 100,
})
assert.Nil(t, err)
assert.EqualValues(t, commonpb.ErrorCode_Success, resp.Status.GetErrorCode())
@ -2280,7 +2281,8 @@ func TestImport(t *testing.T) {
closeTestServer(t, svr)
resp, err := svr.Import(svr.ctx, &datapb.ImportTask{
CollectionName: "dummy",
CollectionId: 100,
PartitionId: 100,
})
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.Status.GetErrorCode())

View File

@ -969,7 +969,7 @@ func (s *Server) Import(ctx context.Context, req *datapb.ImportTask) (*datapb.Im
}
if s.isClosed() {
log.Warn("failed to import because of closed server", zap.String("collectionName", req.GetCollectionName()))
log.Warn("failed to import because of closed server", zap.Int64("collection ID", req.GetCollectionId()))
resp.Status.Reason = msgDataCoordIsUnhealthy(Params.DataCoordCfg.NodeID)
return resp, nil
}

View File

@ -781,8 +781,8 @@ func (node *DataNode) Import(ctx context.Context, req *datapb.ImportTask) (*comm
if !node.isHealthy() {
log.Warn("DataNode.Import failed",
zap.String("collectionName", req.GetCollectionName()),
zap.String("partitionName", req.GetPartitionName()),
zap.Int64("collection ID", req.GetCollectionId()),
zap.Int64("partition ID", req.GetPartitionId()),
zap.Int64("taskID", req.GetTaskId()),
zap.Error(errDataNodeIsUnhealthy(Params.DataNodeCfg.NodeID)))

View File

@ -318,7 +318,8 @@ func TestDataNode(t *testing.T) {
t.Run("Test Import", func(t *testing.T) {
req := &datapb.ImportTask{
CollectionName: "dummy",
CollectionId: 100,
PartitionId: 100,
}
stat, err := node.Import(node.ctx, req)
assert.NoError(t, err)

View File

@ -35,6 +35,8 @@ enum ErrorCode {
OutOfMemory = 24;
IndexNotExist = 25;
EmptyCollection = 26;
UpdateImportTaskFailure = 27;
CollectionNameNotFound = 28;
// internal error code.
DDRequestRace = 1000;

View File

@ -23,32 +23,34 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type ErrorCode int32
const (
ErrorCode_Success ErrorCode = 0
ErrorCode_UnexpectedError ErrorCode = 1
ErrorCode_ConnectFailed ErrorCode = 2
ErrorCode_PermissionDenied ErrorCode = 3
ErrorCode_CollectionNotExists ErrorCode = 4
ErrorCode_IllegalArgument ErrorCode = 5
ErrorCode_IllegalDimension ErrorCode = 7
ErrorCode_IllegalIndexType ErrorCode = 8
ErrorCode_IllegalCollectionName ErrorCode = 9
ErrorCode_IllegalTOPK ErrorCode = 10
ErrorCode_IllegalRowRecord ErrorCode = 11
ErrorCode_IllegalVectorID ErrorCode = 12
ErrorCode_IllegalSearchResult ErrorCode = 13
ErrorCode_FileNotFound ErrorCode = 14
ErrorCode_MetaFailed ErrorCode = 15
ErrorCode_CacheFailed ErrorCode = 16
ErrorCode_CannotCreateFolder ErrorCode = 17
ErrorCode_CannotCreateFile ErrorCode = 18
ErrorCode_CannotDeleteFolder ErrorCode = 19
ErrorCode_CannotDeleteFile ErrorCode = 20
ErrorCode_BuildIndexError ErrorCode = 21
ErrorCode_IllegalNLIST ErrorCode = 22
ErrorCode_IllegalMetricType ErrorCode = 23
ErrorCode_OutOfMemory ErrorCode = 24
ErrorCode_IndexNotExist ErrorCode = 25
ErrorCode_EmptyCollection ErrorCode = 26
ErrorCode_Success ErrorCode = 0
ErrorCode_UnexpectedError ErrorCode = 1
ErrorCode_ConnectFailed ErrorCode = 2
ErrorCode_PermissionDenied ErrorCode = 3
ErrorCode_CollectionNotExists ErrorCode = 4
ErrorCode_IllegalArgument ErrorCode = 5
ErrorCode_IllegalDimension ErrorCode = 7
ErrorCode_IllegalIndexType ErrorCode = 8
ErrorCode_IllegalCollectionName ErrorCode = 9
ErrorCode_IllegalTOPK ErrorCode = 10
ErrorCode_IllegalRowRecord ErrorCode = 11
ErrorCode_IllegalVectorID ErrorCode = 12
ErrorCode_IllegalSearchResult ErrorCode = 13
ErrorCode_FileNotFound ErrorCode = 14
ErrorCode_MetaFailed ErrorCode = 15
ErrorCode_CacheFailed ErrorCode = 16
ErrorCode_CannotCreateFolder ErrorCode = 17
ErrorCode_CannotCreateFile ErrorCode = 18
ErrorCode_CannotDeleteFolder ErrorCode = 19
ErrorCode_CannotDeleteFile ErrorCode = 20
ErrorCode_BuildIndexError ErrorCode = 21
ErrorCode_IllegalNLIST ErrorCode = 22
ErrorCode_IllegalMetricType ErrorCode = 23
ErrorCode_OutOfMemory ErrorCode = 24
ErrorCode_IndexNotExist ErrorCode = 25
ErrorCode_EmptyCollection ErrorCode = 26
ErrorCode_UpdateImportTaskFailure ErrorCode = 27
ErrorCode_CollectionNameNotFound ErrorCode = 28
// internal error code.
ErrorCode_DDRequestRace ErrorCode = 1000
)
@ -80,37 +82,41 @@ var ErrorCode_name = map[int32]string{
24: "OutOfMemory",
25: "IndexNotExist",
26: "EmptyCollection",
27: "UpdateImportTaskFailure",
28: "CollectionNameNotFound",
1000: "DDRequestRace",
}
var ErrorCode_value = map[string]int32{
"Success": 0,
"UnexpectedError": 1,
"ConnectFailed": 2,
"PermissionDenied": 3,
"CollectionNotExists": 4,
"IllegalArgument": 5,
"IllegalDimension": 7,
"IllegalIndexType": 8,
"IllegalCollectionName": 9,
"IllegalTOPK": 10,
"IllegalRowRecord": 11,
"IllegalVectorID": 12,
"IllegalSearchResult": 13,
"FileNotFound": 14,
"MetaFailed": 15,
"CacheFailed": 16,
"CannotCreateFolder": 17,
"CannotCreateFile": 18,
"CannotDeleteFolder": 19,
"CannotDeleteFile": 20,
"BuildIndexError": 21,
"IllegalNLIST": 22,
"IllegalMetricType": 23,
"OutOfMemory": 24,
"IndexNotExist": 25,
"EmptyCollection": 26,
"DDRequestRace": 1000,
"Success": 0,
"UnexpectedError": 1,
"ConnectFailed": 2,
"PermissionDenied": 3,
"CollectionNotExists": 4,
"IllegalArgument": 5,
"IllegalDimension": 7,
"IllegalIndexType": 8,
"IllegalCollectionName": 9,
"IllegalTOPK": 10,
"IllegalRowRecord": 11,
"IllegalVectorID": 12,
"IllegalSearchResult": 13,
"FileNotFound": 14,
"MetaFailed": 15,
"CacheFailed": 16,
"CannotCreateFolder": 17,
"CannotCreateFile": 18,
"CannotDeleteFolder": 19,
"CannotDeleteFile": 20,
"BuildIndexError": 21,
"IllegalNLIST": 22,
"IllegalMetricType": 23,
"OutOfMemory": 24,
"IndexNotExist": 25,
"EmptyCollection": 26,
"UpdateImportTaskFailure": 27,
"CollectionNameNotFound": 28,
"DDRequestRace": 1000,
}
func (x ErrorCode) String() string {
@ -926,106 +932,107 @@ func init() {
func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) }
var fileDescriptor_555bd8c177793206 = []byte{
// 1602 bytes of a gzipped FileDescriptorProto
// 1630 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4b, 0x73, 0x1b, 0xb9,
0x11, 0xd6, 0x70, 0x28, 0x51, 0x04, 0x29, 0x0a, 0x86, 0x1e, 0xd6, 0x3a, 0x4e, 0xca, 0xa5, 0x93,
0x4b, 0x55, 0x6b, 0x27, 0x71, 0x55, 0x72, 0xda, 0x83, 0xc8, 0x91, 0x64, 0x96, 0x2d, 0x99, 0x21,
0x65, 0xef, 0x56, 0x0e, 0x71, 0x41, 0x33, 0x2d, 0x12, 0x31, 0x06, 0x60, 0x00, 0x8c, 0x2c, 0xe6,
0xb4, 0xf9, 0x07, 0xc9, 0x5e, 0x72, 0xcd, 0x0f, 0x48, 0x52, 0x79, 0x27, 0x95, 0x53, 0x8e, 0x79,
0x9f, 0xf3, 0xf8, 0x03, 0xf9, 0x01, 0x79, 0xee, 0x33, 0xd5, 0x98, 0xe1, 0xcc, 0x6c, 0x6a, 0x7d,
0xca, 0x0d, 0xfd, 0xa1, 0xfb, 0x43, 0xa3, 0xbb, 0xd1, 0x68, 0xd2, 0x8d, 0x75, 0x9a, 0x6a, 0x75,
0x6f, 0x6e, 0xb4, 0xd3, 0x6c, 0x2b, 0x15, 0xf2, 0x2a, 0xb3, 0xb9, 0x74, 0x2f, 0xdf, 0xda, 0x7f,
0x4e, 0xd6, 0x26, 0x8e, 0xbb, 0xcc, 0xb2, 0x37, 0x08, 0x01, 0x63, 0xb4, 0x79, 0x1e, 0xeb, 0x04,
0xf6, 0x82, 0x3b, 0xc1, 0xdd, 0xde, 0xe7, 0x3f, 0x73, 0xef, 0x13, 0x6c, 0xee, 0x1d, 0xa1, 0xda,
0x40, 0x27, 0x30, 0x6e, 0xc3, 0x72, 0xc9, 0x76, 0xc9, 0x9a, 0x01, 0x6e, 0xb5, 0xda, 0x6b, 0xdc,
0x09, 0xee, 0xb6, 0xc7, 0x85, 0xb4, 0xff, 0x05, 0xd2, 0x7d, 0x04, 0x8b, 0x67, 0x5c, 0x66, 0x30,
0xe2, 0xc2, 0x30, 0x4a, 0xc2, 0x17, 0xb0, 0xf0, 0xfc, 0xed, 0x31, 0x2e, 0xd9, 0x36, 0x59, 0xbd,
0xc2, 0xed, 0xc2, 0x30, 0x17, 0xf6, 0x1f, 0x90, 0xce, 0x23, 0x58, 0x44, 0xdc, 0xf1, 0x57, 0x98,
0x31, 0xd2, 0x4c, 0xb8, 0xe3, 0xde, 0xaa, 0x3b, 0xf6, 0xeb, 0xfd, 0xdb, 0xa4, 0xd9, 0x97, 0xfa,
0xa2, 0xa2, 0x0c, 0xfc, 0x66, 0x41, 0xf9, 0x3a, 0x69, 0x1d, 0x26, 0x89, 0x01, 0x6b, 0x59, 0x8f,
0x34, 0xc4, 0xbc, 0x60, 0x6b, 0x88, 0x39, 0x92, 0xcd, 0xb5, 0x71, 0x9e, 0x2c, 0x1c, 0xfb, 0xf5,
0xfe, 0x3b, 0x01, 0x69, 0x9d, 0xda, 0x69, 0x9f, 0x5b, 0x60, 0x5f, 0x24, 0xeb, 0xa9, 0x9d, 0x3e,
0x77, 0x8b, 0xf9, 0x32, 0x34, 0xb7, 0x3f, 0x31, 0x34, 0xa7, 0x76, 0x7a, 0xbe, 0x98, 0xc3, 0xb8,
0x95, 0xe6, 0x0b, 0xf4, 0x24, 0xb5, 0xd3, 0x61, 0x54, 0x30, 0xe7, 0x02, 0xbb, 0x4d, 0xda, 0x4e,
0xa4, 0x60, 0x1d, 0x4f, 0xe7, 0x7b, 0xe1, 0x9d, 0xe0, 0x6e, 0x73, 0x5c, 0x01, 0xec, 0x16, 0x59,
0xb7, 0x3a, 0x33, 0x31, 0x0c, 0xa3, 0xbd, 0xa6, 0x37, 0x2b, 0xe5, 0xfd, 0x37, 0x48, 0xfb, 0xd4,
0x4e, 0x1f, 0x02, 0x4f, 0xc0, 0xb0, 0xcf, 0x92, 0xe6, 0x05, 0xb7, 0xb9, 0x47, 0x9d, 0x57, 0x7b,
0x84, 0x37, 0x18, 0x7b, 0xcd, 0xfd, 0xaf, 0x90, 0x6e, 0x74, 0xfa, 0xf8, 0xff, 0x60, 0x40, 0xd7,
0xed, 0x8c, 0x9b, 0xe4, 0x8c, 0xa7, 0xcb, 0x8c, 0x55, 0xc0, 0xc1, 0x2f, 0x9b, 0xa4, 0x5d, 0x96,
0x07, 0xeb, 0x90, 0xd6, 0x24, 0x8b, 0x63, 0xb0, 0x96, 0xae, 0xb0, 0x2d, 0xb2, 0xf9, 0x54, 0xc1,
0xf5, 0x1c, 0x62, 0x07, 0x89, 0xd7, 0xa1, 0x01, 0xbb, 0x41, 0x36, 0x06, 0x5a, 0x29, 0x88, 0xdd,
0x31, 0x17, 0x12, 0x12, 0xda, 0x60, 0xdb, 0x84, 0x8e, 0xc0, 0xa4, 0xc2, 0x5a, 0xa1, 0x55, 0x04,
0x4a, 0x40, 0x42, 0x43, 0x76, 0x93, 0x6c, 0x0d, 0xb4, 0x94, 0x10, 0x3b, 0xa1, 0xd5, 0x99, 0x76,
0x47, 0xd7, 0xc2, 0x3a, 0x4b, 0x9b, 0x48, 0x3b, 0x94, 0x12, 0xa6, 0x5c, 0x1e, 0x9a, 0x69, 0x96,
0x82, 0x72, 0x74, 0x15, 0x39, 0x0a, 0x30, 0x12, 0x29, 0x28, 0x64, 0xa2, 0xad, 0x1a, 0x3a, 0x54,
0x09, 0x5c, 0x63, 0x7e, 0xe8, 0x3a, 0x7b, 0x8d, 0xec, 0x14, 0x68, 0xed, 0x00, 0x9e, 0x02, 0x6d,
0xb3, 0x4d, 0xd2, 0x29, 0xb6, 0xce, 0x9f, 0x8c, 0x1e, 0x51, 0x52, 0x63, 0x18, 0xeb, 0x97, 0x63,
0x88, 0xb5, 0x49, 0x68, 0xa7, 0xe6, 0xc2, 0x33, 0x88, 0x9d, 0x36, 0xc3, 0x88, 0x76, 0xd1, 0xe1,
0x02, 0x9c, 0x00, 0x37, 0xf1, 0x6c, 0x0c, 0x36, 0x93, 0x8e, 0x6e, 0x30, 0x4a, 0xba, 0xc7, 0x42,
0xc2, 0x99, 0x76, 0xc7, 0x3a, 0x53, 0x09, 0xed, 0xb1, 0x1e, 0x21, 0xa7, 0xe0, 0x78, 0x11, 0x81,
0x4d, 0x3c, 0x76, 0xc0, 0xe3, 0x19, 0x14, 0x00, 0x65, 0xbb, 0x84, 0x0d, 0xb8, 0x52, 0xda, 0x0d,
0x0c, 0x70, 0x07, 0xc7, 0x5a, 0x26, 0x60, 0xe8, 0x0d, 0x74, 0xe7, 0x63, 0xb8, 0x90, 0x40, 0x59,
0xa5, 0x1d, 0x81, 0x84, 0x52, 0x7b, 0xab, 0xd2, 0x2e, 0x70, 0xd4, 0xde, 0x46, 0xe7, 0xfb, 0x99,
0x90, 0x89, 0x0f, 0x49, 0x9e, 0x96, 0x1d, 0xf4, 0xb1, 0x70, 0xfe, 0xec, 0xf1, 0x70, 0x72, 0x4e,
0x77, 0xd9, 0x0e, 0xb9, 0x51, 0x20, 0xa7, 0xe0, 0x8c, 0x88, 0x7d, 0xf0, 0x6e, 0xa2, 0xab, 0x4f,
0x32, 0xf7, 0xe4, 0xf2, 0x14, 0x52, 0x6d, 0x16, 0x74, 0x0f, 0x13, 0xea, 0x99, 0x96, 0x29, 0xa2,
0xaf, 0xe1, 0x09, 0x47, 0xe9, 0xdc, 0x2d, 0xaa, 0xf0, 0xd2, 0x5b, 0x8c, 0x91, 0x8d, 0x28, 0x1a,
0xc3, 0xd7, 0x32, 0xb0, 0x6e, 0xcc, 0x63, 0xa0, 0x7f, 0x6b, 0x1d, 0xbc, 0x45, 0x88, 0xb7, 0xc5,
0x86, 0x04, 0x8c, 0x91, 0x5e, 0x25, 0x9d, 0x69, 0x05, 0x74, 0x85, 0x75, 0xc9, 0xfa, 0x53, 0x25,
0xac, 0xcd, 0x20, 0xa1, 0x01, 0xc6, 0x6d, 0xa8, 0x46, 0x46, 0x4f, 0xf1, 0x49, 0xd3, 0x06, 0xee,
0x1e, 0x0b, 0x25, 0xec, 0xcc, 0x57, 0x0c, 0x21, 0x6b, 0x45, 0x00, 0x9b, 0x07, 0x96, 0x74, 0x27,
0x30, 0xc5, 0xe2, 0xc8, 0xb9, 0xb7, 0x09, 0xad, 0xcb, 0x15, 0x7b, 0xe9, 0x76, 0x80, 0xc5, 0x7b,
0x62, 0xf4, 0x4b, 0xa1, 0xa6, 0xb4, 0x81, 0x64, 0x13, 0xe0, 0xd2, 0x13, 0x77, 0x48, 0xeb, 0x58,
0x66, 0xfe, 0x94, 0xa6, 0x3f, 0x13, 0x05, 0x54, 0x5b, 0xc5, 0xad, 0xc8, 0xe8, 0xf9, 0x1c, 0x12,
0xba, 0x76, 0xf0, 0xab, 0xb6, 0xef, 0x1f, 0xbe, 0x0d, 0x6c, 0x90, 0xf6, 0x53, 0x95, 0xc0, 0xa5,
0x50, 0x90, 0xd0, 0x15, 0x9f, 0x0a, 0x9f, 0xb2, 0x5a, 0x4c, 0x12, 0xbc, 0x31, 0x5a, 0xd7, 0x30,
0xc0, 0x78, 0x3e, 0xe4, 0xb6, 0x06, 0x5d, 0x62, 0x7e, 0x23, 0xb0, 0xb1, 0x11, 0x17, 0x75, 0xf3,
0x29, 0xc6, 0x79, 0x32, 0xd3, 0x2f, 0x2b, 0xcc, 0xd2, 0x19, 0x9e, 0x74, 0x02, 0x6e, 0xb2, 0xb0,
0x0e, 0xd2, 0x81, 0x56, 0x97, 0x62, 0x6a, 0xa9, 0xc0, 0x93, 0x1e, 0x6b, 0x9e, 0xd4, 0xcc, 0xbf,
0x8a, 0x19, 0x1e, 0x83, 0x04, 0x6e, 0xeb, 0xac, 0x2f, 0x7c, 0x31, 0x7a, 0x57, 0x0f, 0xa5, 0xe0,
0x96, 0x4a, 0xbc, 0x0a, 0x7a, 0x99, 0x8b, 0x29, 0x26, 0xe1, 0x50, 0x3a, 0x30, 0xb9, 0xac, 0xd8,
0x36, 0xd9, 0xcc, 0xf5, 0x47, 0xdc, 0x38, 0xe1, 0x49, 0x7e, 0x1d, 0xf8, 0x74, 0x1b, 0x3d, 0xaf,
0xb0, 0xdf, 0xe0, 0xdb, 0xef, 0x3e, 0xe4, 0xb6, 0x82, 0x7e, 0x1b, 0xb0, 0x5d, 0x72, 0x63, 0x79,
0xb5, 0x0a, 0xff, 0x5d, 0xc0, 0xb6, 0x48, 0x0f, 0xaf, 0x56, 0x62, 0x96, 0xfe, 0xde, 0x83, 0x78,
0x89, 0x1a, 0xf8, 0x07, 0xcf, 0x50, 0xdc, 0xa2, 0x86, 0xff, 0xd1, 0x1f, 0x86, 0x0c, 0x45, 0xd6,
0x2d, 0x7d, 0x37, 0x40, 0x4f, 0x97, 0x87, 0x15, 0x30, 0x7d, 0xcf, 0x2b, 0x22, 0x6b, 0xa9, 0xf8,
0xbe, 0x57, 0x2c, 0x38, 0x4b, 0xf4, 0x03, 0x8f, 0x3e, 0xe4, 0x2a, 0xd1, 0x97, 0x97, 0x25, 0xfa,
0x61, 0xc0, 0xf6, 0xc8, 0x16, 0x9a, 0xf7, 0xb9, 0xe4, 0x2a, 0xae, 0xf4, 0x3f, 0x0a, 0xd8, 0x0e,
0xa1, 0xff, 0x73, 0x9c, 0xa5, 0x6f, 0x37, 0x18, 0x5d, 0xc6, 0xd7, 0x17, 0x3b, 0xfd, 0x6e, 0xc3,
0xc7, 0xaa, 0x50, 0xcc, 0xb1, 0xef, 0x35, 0x58, 0x2f, 0x0f, 0x7a, 0x2e, 0x7f, 0xbf, 0xc1, 0x3a,
0x64, 0x6d, 0xa8, 0x2c, 0x18, 0x47, 0xbf, 0x89, 0x05, 0xb9, 0x96, 0x3f, 0x69, 0xfa, 0x2d, 0x2c,
0xfb, 0x55, 0x5f, 0x90, 0xf4, 0x1d, 0xbf, 0x91, 0x37, 0x1f, 0xfa, 0xf7, 0xd0, 0x47, 0xa0, 0xde,
0x89, 0xfe, 0x11, 0xe2, 0x49, 0x27, 0xe0, 0xaa, 0x57, 0x46, 0xff, 0x19, 0xb2, 0x5b, 0x64, 0x67,
0x89, 0xf9, 0xbe, 0x50, 0xbe, 0xaf, 0x7f, 0x85, 0xec, 0x36, 0xb9, 0x79, 0x02, 0xae, 0x2a, 0x0f,
0x34, 0x12, 0xd6, 0x89, 0xd8, 0xd2, 0x7f, 0x87, 0xec, 0x53, 0x64, 0xf7, 0x04, 0x5c, 0x19, 0xf6,
0xda, 0xe6, 0x7f, 0x42, 0xb6, 0x41, 0xd6, 0xc7, 0xd8, 0x38, 0xe0, 0x0a, 0xe8, 0xbb, 0x21, 0xe6,
0x6e, 0x29, 0x16, 0xee, 0xbc, 0x17, 0x62, 0x44, 0xdf, 0xe4, 0x2e, 0x9e, 0x45, 0xe9, 0x60, 0xc6,
0x95, 0x02, 0x69, 0xe9, 0xfb, 0x21, 0xc6, 0x6d, 0x0c, 0xa9, 0xbe, 0x82, 0x1a, 0xfc, 0x01, 0x7e,
0x08, 0xcc, 0x2b, 0x7f, 0x29, 0x03, 0xb3, 0x28, 0x37, 0x3e, 0x0c, 0x31, 0x03, 0xb9, 0xfe, 0xc7,
0x77, 0x3e, 0x0a, 0xd9, 0xa7, 0xc9, 0x5e, 0xfe, 0x88, 0x97, 0xf1, 0xc7, 0xcd, 0x29, 0x0c, 0xd5,
0xa5, 0xa6, 0x6f, 0x37, 0x4b, 0xc6, 0x08, 0xa4, 0xe3, 0xa5, 0xdd, 0x37, 0x9a, 0x98, 0xa2, 0xc2,
0xc2, 0xab, 0xfe, 0xa9, 0xc9, 0x36, 0x09, 0xc9, 0x9f, 0x94, 0x07, 0xfe, 0xdc, 0x44, 0xd7, 0x4f,
0xc0, 0xe1, 0x8f, 0x70, 0x05, 0x66, 0xe1, 0xd1, 0xbf, 0x2c, 0xd1, 0x7a, 0xa7, 0xa1, 0x7f, 0x6d,
0x62, 0x28, 0xce, 0x45, 0x0a, 0xe7, 0x22, 0x7e, 0x41, 0x7f, 0xd0, 0xc6, 0x50, 0x78, 0x4f, 0xcf,
0x74, 0x02, 0xa8, 0x63, 0xe9, 0x0f, 0xdb, 0x98, 0x6f, 0x2c, 0xa3, 0x3c, 0xdf, 0x3f, 0xf2, 0x72,
0xd1, 0x2c, 0x87, 0x11, 0xfd, 0x31, 0xfe, 0x4c, 0xa4, 0x90, 0xcf, 0x27, 0x4f, 0xe8, 0x4f, 0xda,
0x78, 0xd4, 0xa1, 0x94, 0x3a, 0xe6, 0xae, 0x2c, 0xe6, 0x9f, 0xb6, 0xf1, 0x35, 0xd4, 0x4e, 0x2f,
0xb2, 0xf1, 0xb3, 0x36, 0xc6, 0xb4, 0xc0, 0x7d, 0xad, 0x44, 0xd8, 0xff, 0x7e, 0xee, 0x59, 0x71,
0xe0, 0x42, 0x4f, 0xce, 0x1d, 0xfd, 0x45, 0xfb, 0x60, 0x9f, 0xb4, 0x22, 0x2b, 0x7d, 0x07, 0x6b,
0x91, 0x30, 0xb2, 0x92, 0xae, 0xe0, 0x83, 0xef, 0x6b, 0x2d, 0x8f, 0xae, 0xe7, 0xe6, 0xd9, 0xe7,
0x68, 0x70, 0xd0, 0x27, 0x9b, 0x03, 0x9d, 0xce, 0x79, 0x59, 0x11, 0xbe, 0x69, 0xe5, 0xdd, 0x0e,
0x92, 0xfc, 0xd6, 0x2b, 0xd8, 0x35, 0x8e, 0xae, 0x21, 0xce, 0x1c, 0x36, 0xca, 0x00, 0x45, 0x34,
0xc2, 0xa2, 0x4d, 0x68, 0xe3, 0xe0, 0x2d, 0x42, 0x07, 0x5a, 0x59, 0x61, 0x1d, 0xa8, 0x78, 0xf1,
0x18, 0xae, 0x40, 0xfa, 0x96, 0xeb, 0x8c, 0x56, 0x53, 0xba, 0xe2, 0x07, 0x09, 0xf0, 0x03, 0x41,
0xde, 0x98, 0xfb, 0xf8, 0x73, 0xfa, 0x69, 0xa1, 0x47, 0xc8, 0xd1, 0x15, 0x28, 0x97, 0x71, 0x29,
0x17, 0x34, 0x44, 0x79, 0x90, 0x59, 0xa7, 0x53, 0xf1, 0x75, 0xdf, 0xf9, 0xbf, 0x1d, 0x90, 0xce,
0x30, 0xc5, 0x79, 0xae, 0x74, 0x2d, 0x17, 0x47, 0xa0, 0x12, 0xe1, 0xc9, 0xf1, 0xb3, 0xf3, 0x50,
0xf1, 0x5d, 0x04, 0x95, 0xd2, 0xc4, 0x71, 0xe3, 0x96, 0x53, 0x49, 0x0e, 0x45, 0xfa, 0xa5, 0x92,
0x9a, 0x27, 0xfe, 0x2b, 0x28, 0x4d, 0x47, 0xdc, 0x58, 0xff, 0x1f, 0xe0, 0x2c, 0x50, 0xf0, 0x1b,
0x7f, 0x9f, 0x84, 0xae, 0x56, 0x60, 0x75, 0xe7, 0xb5, 0xfe, 0x9b, 0xa4, 0x27, 0xf4, 0x72, 0xe0,
0x9a, 0x9a, 0x79, 0xdc, 0xef, 0x0c, 0xfc, 0xc0, 0x35, 0xc2, 0xe1, 0x6b, 0x14, 0x7c, 0xf9, 0xc1,
0x54, 0xb8, 0x59, 0x76, 0x81, 0x63, 0xd8, 0xfd, 0x5c, 0xed, 0x75, 0xa1, 0x8b, 0xd5, 0x7d, 0xa1,
0x1c, 0x18, 0xc5, 0xe5, 0x7d, 0x3f, 0xaa, 0xdd, 0xcf, 0x47, 0xb5, 0xf9, 0xc5, 0x77, 0x82, 0xe0,
0x62, 0xcd, 0x43, 0x0f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x5a, 0x7d, 0x9d, 0x36, 0xfe, 0x0b,
0x00, 0x00,
0x11, 0xd6, 0x90, 0xd4, 0x83, 0x2d, 0x89, 0x82, 0xa1, 0x87, 0xb5, 0xb6, 0x92, 0x72, 0xe9, 0xe4,
0x52, 0xd5, 0xda, 0x49, 0x5c, 0x95, 0x9c, 0xf6, 0x20, 0x72, 0x24, 0x99, 0x65, 0x4b, 0x66, 0x48,
0xd9, 0xbb, 0x95, 0x43, 0x5c, 0xd0, 0x4c, 0x8b, 0x44, 0x3c, 0x03, 0x30, 0x00, 0x46, 0x16, 0x73,
0xda, 0xfc, 0x83, 0x64, 0x2f, 0xb9, 0xe6, 0x07, 0x24, 0xa9, 0xbc, 0x93, 0x63, 0x8e, 0x79, 0x9f,
0xf3, 0xf8, 0x03, 0xb9, 0xe7, 0xbd, 0xcf, 0x54, 0x63, 0x86, 0x33, 0xe3, 0xd4, 0xee, 0x69, 0x6f,
0xe8, 0x0f, 0xdd, 0x5f, 0x37, 0xba, 0x1b, 0x0d, 0xc0, 0x5a, 0xa4, 0xd3, 0x54, 0xab, 0x7b, 0x53,
0xa3, 0x9d, 0xe6, 0x9b, 0xa9, 0x4c, 0xae, 0x32, 0x9b, 0x4b, 0xf7, 0xf2, 0xad, 0xfd, 0xe7, 0xb0,
0x34, 0x72, 0xc2, 0x65, 0x96, 0xbf, 0x01, 0x80, 0xc6, 0x68, 0xf3, 0x3c, 0xd2, 0x31, 0xee, 0x06,
0x77, 0x82, 0xbb, 0x9d, 0x2f, 0x7c, 0xf6, 0xde, 0xc7, 0xd8, 0xdc, 0x3b, 0x22, 0xb5, 0x9e, 0x8e,
0x71, 0xd8, 0xc6, 0xf9, 0x92, 0xef, 0xc0, 0x92, 0x41, 0x61, 0xb5, 0xda, 0x6d, 0xdc, 0x09, 0xee,
0xb6, 0x87, 0x85, 0xb4, 0xff, 0x45, 0x58, 0x7b, 0x84, 0xb3, 0x67, 0x22, 0xc9, 0x70, 0x20, 0xa4,
0xe1, 0x0c, 0x9a, 0x2f, 0x70, 0xe6, 0xf9, 0xdb, 0x43, 0x5a, 0xf2, 0x2d, 0x58, 0xbc, 0xa2, 0xed,
0xc2, 0x30, 0x17, 0xf6, 0x1f, 0xc0, 0xea, 0x23, 0x9c, 0x85, 0xc2, 0x89, 0x4f, 0x30, 0xe3, 0xd0,
0x8a, 0x85, 0x13, 0xde, 0x6a, 0x6d, 0xe8, 0xd7, 0xfb, 0x7b, 0xd0, 0xea, 0x26, 0xfa, 0xa2, 0xa2,
0x0c, 0xfc, 0x66, 0x41, 0xf9, 0x3a, 0x2c, 0x1f, 0xc6, 0xb1, 0x41, 0x6b, 0x79, 0x07, 0x1a, 0x72,
0x5a, 0xb0, 0x35, 0xe4, 0x94, 0xc8, 0xa6, 0xda, 0x38, 0x4f, 0xd6, 0x1c, 0xfa, 0xf5, 0xfe, 0x3b,
0x01, 0x2c, 0x9f, 0xda, 0x71, 0x57, 0x58, 0xe4, 0x5f, 0x82, 0x95, 0xd4, 0x8e, 0x9f, 0xbb, 0xd9,
0x74, 0x9e, 0x9a, 0xbd, 0x8f, 0x4d, 0xcd, 0xa9, 0x1d, 0x9f, 0xcf, 0xa6, 0x38, 0x5c, 0x4e, 0xf3,
0x05, 0x45, 0x92, 0xda, 0x71, 0x3f, 0x2c, 0x98, 0x73, 0x81, 0xef, 0x41, 0xdb, 0xc9, 0x14, 0xad,
0x13, 0xe9, 0x74, 0xb7, 0x79, 0x27, 0xb8, 0xdb, 0x1a, 0x56, 0x00, 0xbf, 0x05, 0x2b, 0x56, 0x67,
0x26, 0xc2, 0x7e, 0xb8, 0xdb, 0xf2, 0x66, 0xa5, 0xbc, 0xff, 0x06, 0xb4, 0x4f, 0xed, 0xf8, 0x21,
0x8a, 0x18, 0x0d, 0xff, 0x1c, 0xb4, 0x2e, 0x84, 0xcd, 0x23, 0x5a, 0xfd, 0xe4, 0x88, 0xe8, 0x04,
0x43, 0xaf, 0xb9, 0xff, 0x55, 0x58, 0x0b, 0x4f, 0x1f, 0x7f, 0x0a, 0x06, 0x0a, 0xdd, 0x4e, 0x84,
0x89, 0xcf, 0x44, 0x3a, 0xaf, 0x58, 0x05, 0x1c, 0xfc, 0xbd, 0x05, 0xed, 0xb2, 0x3d, 0xf8, 0x2a,
0x2c, 0x8f, 0xb2, 0x28, 0x42, 0x6b, 0xd9, 0x02, 0xdf, 0x84, 0x8d, 0xa7, 0x0a, 0xaf, 0xa7, 0x18,
0x39, 0x8c, 0xbd, 0x0e, 0x0b, 0xf8, 0x0d, 0x58, 0xef, 0x69, 0xa5, 0x30, 0x72, 0xc7, 0x42, 0x26,
0x18, 0xb3, 0x06, 0xdf, 0x02, 0x36, 0x40, 0x93, 0x4a, 0x6b, 0xa5, 0x56, 0x21, 0x2a, 0x89, 0x31,
0x6b, 0xf2, 0x9b, 0xb0, 0xd9, 0xd3, 0x49, 0x82, 0x91, 0x93, 0x5a, 0x9d, 0x69, 0x77, 0x74, 0x2d,
0xad, 0xb3, 0xac, 0x45, 0xb4, 0xfd, 0x24, 0xc1, 0xb1, 0x48, 0x0e, 0xcd, 0x38, 0x4b, 0x51, 0x39,
0xb6, 0x48, 0x1c, 0x05, 0x18, 0xca, 0x14, 0x15, 0x31, 0xb1, 0xe5, 0x1a, 0xda, 0x57, 0x31, 0x5e,
0x53, 0x7d, 0xd8, 0x0a, 0x7f, 0x0d, 0xb6, 0x0b, 0xb4, 0xe6, 0x40, 0xa4, 0xc8, 0xda, 0x7c, 0x03,
0x56, 0x8b, 0xad, 0xf3, 0x27, 0x83, 0x47, 0x0c, 0x6a, 0x0c, 0x43, 0xfd, 0x72, 0x88, 0x91, 0x36,
0x31, 0x5b, 0xad, 0x85, 0xf0, 0x0c, 0x23, 0xa7, 0x4d, 0x3f, 0x64, 0x6b, 0x14, 0x70, 0x01, 0x8e,
0x50, 0x98, 0x68, 0x32, 0x44, 0x9b, 0x25, 0x8e, 0xad, 0x73, 0x06, 0x6b, 0xc7, 0x32, 0xc1, 0x33,
0xed, 0x8e, 0x75, 0xa6, 0x62, 0xd6, 0xe1, 0x1d, 0x80, 0x53, 0x74, 0xa2, 0xc8, 0xc0, 0x06, 0xb9,
0xed, 0x89, 0x68, 0x82, 0x05, 0xc0, 0xf8, 0x0e, 0xf0, 0x9e, 0x50, 0x4a, 0xbb, 0x9e, 0x41, 0xe1,
0xf0, 0x58, 0x27, 0x31, 0x1a, 0x76, 0x83, 0xc2, 0x79, 0x05, 0x97, 0x09, 0x32, 0x5e, 0x69, 0x87,
0x98, 0x60, 0xa9, 0xbd, 0x59, 0x69, 0x17, 0x38, 0x69, 0x6f, 0x51, 0xf0, 0xdd, 0x4c, 0x26, 0xb1,
0x4f, 0x49, 0x5e, 0x96, 0x6d, 0x8a, 0xb1, 0x08, 0xfe, 0xec, 0x71, 0x7f, 0x74, 0xce, 0x76, 0xf8,
0x36, 0xdc, 0x28, 0x90, 0x53, 0x74, 0x46, 0x46, 0x3e, 0x79, 0x37, 0x29, 0xd4, 0x27, 0x99, 0x7b,
0x72, 0x79, 0x8a, 0xa9, 0x36, 0x33, 0xb6, 0x4b, 0x05, 0xf5, 0x4c, 0xf3, 0x12, 0xb1, 0xd7, 0xc8,
0xc3, 0x51, 0x3a, 0x75, 0xb3, 0x2a, 0xbd, 0xec, 0x16, 0xbf, 0x0d, 0x37, 0x9f, 0x4e, 0x63, 0xe1,
0xb0, 0x9f, 0xd2, 0x65, 0x3b, 0x17, 0xf6, 0x05, 0x1d, 0x37, 0x33, 0xc8, 0x6e, 0xf3, 0x5b, 0xb0,
0xf3, 0x6a, 0x2d, 0xca, 0x64, 0xed, 0x71, 0x0e, 0xeb, 0x61, 0x38, 0xc4, 0xaf, 0x67, 0x68, 0xdd,
0x50, 0x44, 0xc8, 0xfe, 0xb6, 0x7c, 0xf0, 0x16, 0x80, 0x77, 0x4a, 0x93, 0x0c, 0x39, 0x87, 0x4e,
0x25, 0x9d, 0x69, 0x85, 0x6c, 0x81, 0xaf, 0xc1, 0xca, 0x53, 0x25, 0xad, 0xcd, 0x30, 0x66, 0x01,
0x25, 0xbc, 0xaf, 0x06, 0x46, 0x8f, 0x69, 0x16, 0xb0, 0x06, 0xed, 0x1e, 0x4b, 0x25, 0xed, 0xc4,
0xb7, 0x1a, 0xc0, 0x52, 0x91, 0xf9, 0xd6, 0x81, 0x85, 0xb5, 0x11, 0x8e, 0xa9, 0xab, 0x72, 0xee,
0x2d, 0x60, 0x75, 0xb9, 0x62, 0x2f, 0xcf, 0x1b, 0x50, 0xd7, 0x9f, 0x18, 0xfd, 0x52, 0xaa, 0x31,
0x6b, 0x10, 0xd9, 0x08, 0x45, 0xe2, 0x89, 0x57, 0x61, 0xf9, 0x38, 0xc9, 0xbc, 0x97, 0x96, 0xf7,
0x49, 0x02, 0xa9, 0x2d, 0xd2, 0x56, 0x68, 0xf4, 0x74, 0x8a, 0x31, 0x5b, 0x3a, 0xf8, 0x55, 0xdb,
0x0f, 0x1e, 0x3f, 0x3f, 0xd6, 0xa1, 0xfd, 0x54, 0xc5, 0x78, 0x29, 0x15, 0xc6, 0x6c, 0xc1, 0xd7,
0xd0, 0xd7, 0xba, 0x96, 0xcc, 0x98, 0x4e, 0x4c, 0xd6, 0x35, 0x0c, 0xa9, 0x10, 0x0f, 0x85, 0xad,
0x41, 0x97, 0xd4, 0x18, 0x21, 0xda, 0xc8, 0xc8, 0x8b, 0xba, 0xf9, 0x98, 0x0a, 0x34, 0x9a, 0xe8,
0x97, 0x15, 0x66, 0xd9, 0x84, 0x3c, 0x9d, 0xa0, 0x1b, 0xcd, 0xac, 0xc3, 0xb4, 0xa7, 0xd5, 0xa5,
0x1c, 0x5b, 0x26, 0xc9, 0xd3, 0x63, 0x2d, 0xe2, 0x9a, 0xf9, 0xd7, 0xa8, 0x35, 0x86, 0x98, 0xa0,
0xb0, 0x75, 0xd6, 0x17, 0xbe, 0x8b, 0x7d, 0xa8, 0x87, 0x89, 0x14, 0x96, 0x25, 0x74, 0x14, 0x8a,
0x32, 0x17, 0x53, 0x2a, 0xc2, 0x61, 0xe2, 0xd0, 0xe4, 0xb2, 0xe2, 0x5b, 0xb0, 0x91, 0xeb, 0x0f,
0x84, 0x71, 0xd2, 0x93, 0xfc, 0x3a, 0xf0, 0xe5, 0x36, 0x7a, 0x5a, 0x61, 0xbf, 0xa1, 0xa1, 0xb1,
0xf6, 0x50, 0xd8, 0x0a, 0xfa, 0x6d, 0xc0, 0x77, 0xe0, 0xc6, 0xfc, 0x68, 0x15, 0xfe, 0xbb, 0x80,
0x6f, 0x42, 0x87, 0x8e, 0x56, 0x62, 0x96, 0xfd, 0xde, 0x83, 0x74, 0x88, 0x1a, 0xf8, 0x07, 0xcf,
0x50, 0x9c, 0xa2, 0x86, 0xff, 0xd1, 0x3b, 0x23, 0x86, 0xa2, 0xea, 0x96, 0xbd, 0x1b, 0x50, 0xa4,
0x73, 0x67, 0x05, 0xcc, 0xde, 0xf3, 0x8a, 0xc4, 0x5a, 0x2a, 0xbe, 0xef, 0x15, 0x0b, 0xce, 0x12,
0xfd, 0xc0, 0xa3, 0x0f, 0x85, 0x8a, 0xf5, 0xe5, 0x65, 0x89, 0x7e, 0x18, 0xf0, 0x5d, 0xd8, 0x24,
0xf3, 0xae, 0x48, 0x84, 0x8a, 0x2a, 0xfd, 0x8f, 0x02, 0xbe, 0x0d, 0xec, 0xff, 0xdc, 0x59, 0xf6,
0x76, 0x83, 0xb3, 0x79, 0x7e, 0x7d, 0xb3, 0xb3, 0xef, 0x35, 0x7c, 0xae, 0x0a, 0xc5, 0x1c, 0xfb,
0x7e, 0x83, 0x77, 0xf2, 0xa4, 0xe7, 0xf2, 0x0f, 0x1a, 0x7c, 0x15, 0x96, 0xfa, 0xca, 0xa2, 0x71,
0xec, 0x5b, 0xd4, 0x90, 0x4b, 0xf9, 0x2c, 0x60, 0xdf, 0xa6, 0xb6, 0x5f, 0xf4, 0x0d, 0xc9, 0xde,
0xf1, 0x1b, 0xf9, 0xd4, 0x62, 0xff, 0x68, 0xfa, 0x0c, 0xd4, 0x47, 0xd8, 0x3f, 0x9b, 0xe4, 0xe9,
0x04, 0x5d, 0x75, 0xcb, 0xd8, 0xbf, 0x9a, 0xfc, 0x16, 0x6c, 0xcf, 0x31, 0x3f, 0x50, 0xca, 0xfb,
0xf5, 0xef, 0x26, 0xdf, 0x83, 0x9b, 0x27, 0xe8, 0xaa, 0xf6, 0x20, 0x23, 0x69, 0x9d, 0x8c, 0x2c,
0xfb, 0x4f, 0x93, 0xdf, 0x86, 0x9d, 0x13, 0x74, 0x65, 0xda, 0x6b, 0x9b, 0xff, 0x6d, 0xf2, 0x75,
0x58, 0x19, 0xd2, 0xc4, 0xc1, 0x2b, 0x64, 0xef, 0x36, 0xa9, 0x76, 0x73, 0xb1, 0x08, 0xe7, 0xbd,
0x26, 0x65, 0xf4, 0x4d, 0xe1, 0xa2, 0x49, 0x98, 0xf6, 0x26, 0x42, 0x29, 0x4c, 0x2c, 0x7b, 0xbf,
0x49, 0x79, 0x1b, 0x62, 0xaa, 0xaf, 0xb0, 0x06, 0x7f, 0x40, 0x2f, 0x09, 0xf7, 0xca, 0x5f, 0xce,
0xd0, 0xcc, 0xca, 0x8d, 0x0f, 0x9b, 0x54, 0x81, 0x5c, 0xff, 0xd5, 0x9d, 0x8f, 0x9a, 0xfc, 0x33,
0xb0, 0x9b, 0x5f, 0xe2, 0x79, 0xfe, 0x69, 0x73, 0x8c, 0x7d, 0x75, 0xa9, 0xd9, 0xdb, 0xad, 0x92,
0x31, 0xc4, 0xc4, 0x89, 0xd2, 0xee, 0x9b, 0x2d, 0x2a, 0x51, 0x61, 0xe1, 0x55, 0xff, 0xd4, 0xe2,
0x1b, 0x00, 0xf9, 0x95, 0xf2, 0xc0, 0x9f, 0x5b, 0x14, 0xfa, 0x09, 0x3a, 0x7a, 0x4a, 0xae, 0xd0,
0xcc, 0x3c, 0xfa, 0x97, 0x39, 0x5a, 0x9f, 0x34, 0xec, 0xaf, 0x2d, 0x4a, 0xc5, 0xb9, 0x4c, 0xf1,
0x5c, 0x46, 0x2f, 0xd8, 0x0f, 0xdb, 0x94, 0x0a, 0x1f, 0xe9, 0x99, 0x8e, 0x91, 0x74, 0x2c, 0xfb,
0x51, 0x9b, 0xea, 0x4d, 0x6d, 0x94, 0xd7, 0xfb, 0xc7, 0x5e, 0x2e, 0x86, 0x65, 0x3f, 0x64, 0x3f,
0xa1, 0x27, 0x0d, 0x0a, 0xf9, 0x7c, 0xf4, 0x84, 0xfd, 0xb4, 0x4d, 0xae, 0x0e, 0x93, 0x44, 0x47,
0xc2, 0x95, 0xcd, 0xfc, 0xb3, 0x36, 0xdd, 0x86, 0x9a, 0xf7, 0xa2, 0x1a, 0x3f, 0x6f, 0x53, 0x4e,
0x0b, 0xdc, 0xf7, 0x4a, 0x48, 0xf3, 0xef, 0x17, 0x9e, 0x95, 0x7e, 0x6a, 0x14, 0xc9, 0xb9, 0x63,
0xbf, 0x6c, 0x1f, 0xec, 0xc3, 0x72, 0x68, 0x13, 0x3f, 0xc1, 0x96, 0xa1, 0x19, 0xda, 0x84, 0x2d,
0xd0, 0x85, 0xef, 0x6a, 0x9d, 0x1c, 0x5d, 0x4f, 0xcd, 0xb3, 0xcf, 0xb3, 0xe0, 0xa0, 0x0b, 0x1b,
0x3d, 0x9d, 0x4e, 0x45, 0xd9, 0x11, 0x7e, 0x68, 0xe5, 0xd3, 0x0e, 0xe3, 0xfc, 0xd4, 0x0b, 0x34,
0x35, 0x8e, 0xae, 0x31, 0xca, 0x1c, 0x0d, 0xca, 0x80, 0x44, 0x32, 0xa2, 0xa6, 0x8d, 0x59, 0xe3,
0xe0, 0x2d, 0x60, 0x3d, 0xad, 0xac, 0xb4, 0x0e, 0x55, 0x34, 0x7b, 0x8c, 0x57, 0x98, 0xf8, 0x91,
0xeb, 0x8c, 0x56, 0x63, 0xb6, 0xe0, 0x7f, 0x20, 0xe8, 0x7f, 0x12, 0xf9, 0x60, 0xee, 0xd2, 0x2b,
0xe2, 0xbf, 0x19, 0x1d, 0x80, 0xa3, 0x2b, 0x54, 0x2e, 0x13, 0x49, 0x32, 0x63, 0x4d, 0x92, 0x7b,
0x99, 0x75, 0x3a, 0x95, 0xdf, 0xf0, 0x93, 0xff, 0x3b, 0x01, 0xac, 0xe6, 0x6f, 0x53, 0x19, 0x5a,
0x2e, 0x0e, 0x50, 0xc5, 0xd2, 0x93, 0xd3, 0x2b, 0xe9, 0xa1, 0xe2, 0xb9, 0x08, 0x2a, 0xa5, 0x91,
0x13, 0xc6, 0xcd, 0xbf, 0x33, 0x39, 0x14, 0xea, 0x97, 0x2a, 0xd1, 0x22, 0xf6, 0x4f, 0x41, 0x69,
0x3a, 0x10, 0xc6, 0xfa, 0xf7, 0x80, 0x3e, 0x11, 0x05, 0xbf, 0xf1, 0xe7, 0x89, 0xd9, 0x62, 0x05,
0x56, 0x67, 0x5e, 0xea, 0xbe, 0x09, 0x1d, 0xa9, 0xe7, 0x3f, 0xb5, 0xb1, 0x99, 0x46, 0xdd, 0xd5,
0x9e, 0xff, 0xa9, 0x0d, 0xe8, 0xd7, 0x36, 0x08, 0xbe, 0xf2, 0x60, 0x2c, 0xdd, 0x24, 0xbb, 0xa0,
0xff, 0xdb, 0xfd, 0x5c, 0xed, 0x75, 0xa9, 0x8b, 0xd5, 0x7d, 0xa9, 0x1c, 0x1a, 0x25, 0x92, 0xfb,
0xfe, 0x8f, 0x77, 0x3f, 0xff, 0xe3, 0x4d, 0x2f, 0xbe, 0x1b, 0x04, 0x17, 0x4b, 0x1e, 0x7a, 0xf0,
0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x2a, 0xbb, 0x0b, 0x37, 0x0c, 0x00, 0x00,
}

View File

@ -420,8 +420,8 @@ message DropVirtualChannelResponse {
message ImportTask {
common.Status status = 1;
string collection_name = 2; // target collection
string partition_name = 3; // target partition
int64 collection_id = 2; // target collection ID
int64 partition_id = 3; // target partition ID
bool row_based = 4; // the file is row-based or column-based
int64 task_id = 5; // id of the task
repeated string files = 6; // file paths to be imported
@ -440,13 +440,13 @@ message ImportTaskInfo {
int64 id = 1; // Task ID.
int64 request_id = 2; // Request ID of the import task.
int64 datanode_id = 3; // ID of DataNode that processes the task.
string collection_id = 4; // Collection ID for the import task.
string partition_id = 5; // Partition ID for the import task.
int64 collection_id = 4; // Collection ID for the import task.
int64 partition_id = 5; // Partition ID for the import task.
string bucket = 6; // Bucket for the import task.
bool row_based = 7; // Boolean indicating whether import files are row-based or column-based.
repeated string files = 8; // A list of files to import.
int64 create_ts = 9; // Timestamp when the import task is created.
ImportTaskState state = 10; // State of the import task.
ImportTaskState state = 10; // State of the import task.
}
message ImportTaskResponse {

View File

@ -3115,8 +3115,8 @@ func (m *DropVirtualChannelResponse) GetStatus() *commonpb.Status {
type ImportTask struct {
Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
CollectionName string `protobuf:"bytes,2,opt,name=collection_name,json=collectionName,proto3" json:"collection_name,omitempty"`
PartitionName string `protobuf:"bytes,3,opt,name=partition_name,json=partitionName,proto3" json:"partition_name,omitempty"`
CollectionId int64 `protobuf:"varint,2,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
PartitionId int64 `protobuf:"varint,3,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"`
RowBased bool `protobuf:"varint,4,opt,name=row_based,json=rowBased,proto3" json:"row_based,omitempty"`
TaskId int64 `protobuf:"varint,5,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"`
Files []string `protobuf:"bytes,6,rep,name=files,proto3" json:"files,omitempty"`
@ -3158,18 +3158,18 @@ func (m *ImportTask) GetStatus() *commonpb.Status {
return nil
}
func (m *ImportTask) GetCollectionName() string {
func (m *ImportTask) GetCollectionId() int64 {
if m != nil {
return m.CollectionName
return m.CollectionId
}
return ""
return 0
}
func (m *ImportTask) GetPartitionName() string {
func (m *ImportTask) GetPartitionId() int64 {
if m != nil {
return m.PartitionName
return m.PartitionId
}
return ""
return 0
}
func (m *ImportTask) GetRowBased() bool {
@ -3275,8 +3275,8 @@ type ImportTaskInfo struct {
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
RequestId int64 `protobuf:"varint,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
DatanodeId int64 `protobuf:"varint,3,opt,name=datanode_id,json=datanodeId,proto3" json:"datanode_id,omitempty"`
CollectionId string `protobuf:"bytes,4,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
PartitionId string `protobuf:"bytes,5,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"`
CollectionId int64 `protobuf:"varint,4,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
PartitionId int64 `protobuf:"varint,5,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"`
Bucket string `protobuf:"bytes,6,opt,name=bucket,proto3" json:"bucket,omitempty"`
RowBased bool `protobuf:"varint,7,opt,name=row_based,json=rowBased,proto3" json:"row_based,omitempty"`
Files []string `protobuf:"bytes,8,rep,name=files,proto3" json:"files,omitempty"`
@ -3333,18 +3333,18 @@ func (m *ImportTaskInfo) GetDatanodeId() int64 {
return 0
}
func (m *ImportTaskInfo) GetCollectionId() string {
func (m *ImportTaskInfo) GetCollectionId() int64 {
if m != nil {
return m.CollectionId
}
return ""
return 0
}
func (m *ImportTaskInfo) GetPartitionId() string {
func (m *ImportTaskInfo) GetPartitionId() int64 {
if m != nil {
return m.PartitionId
}
return ""
return 0
}
func (m *ImportTaskInfo) GetBucket() string {
@ -3491,210 +3491,209 @@ func init() {
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
var fileDescriptor_82cd95f524594f49 = []byte{
// 3241 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x1b, 0x5d, 0x6f, 0x1c, 0x57,
0x35, 0xb3, 0xdf, 0x7b, 0xf6, 0xc3, 0x9b, 0x9b, 0x34, 0xd9, 0x6c, 0x12, 0xc7, 0x99, 0x36, 0x89,
0x9b, 0xa6, 0x49, 0xeb, 0x50, 0xb5, 0xa2, 0x5f, 0xaa, 0xed, 0xda, 0x5d, 0x61, 0x07, 0x77, 0xec,
0xb6, 0x88, 0x22, 0x56, 0xe3, 0x9d, 0xeb, 0xf5, 0xd4, 0xf3, 0xb1, 0x9d, 0x3b, 0x1b, 0x27, 0x7d,
0x69, 0x44, 0x25, 0x24, 0x50, 0x55, 0x40, 0x48, 0x48, 0x48, 0x08, 0x21, 0x9e, 0x40, 0xbc, 0xc0,
0x23, 0x20, 0xde, 0xab, 0xf2, 0x2f, 0x78, 0xe1, 0x8d, 0xdf, 0x80, 0xee, 0xc7, 0xdc, 0xf9, 0xd8,
0xd9, 0xdd, 0xb1, 0x9d, 0x34, 0x6f, 0xbe, 0x67, 0xce, 0x39, 0xf7, 0xdc, 0x73, 0xcf, 0xf7, 0x5e,
0x43, 0xcb, 0xd0, 0x7d, 0xbd, 0xd7, 0x77, 0x5d, 0xcf, 0xb8, 0x3d, 0xf4, 0x5c, 0xdf, 0x45, 0xa7,
0x6d, 0xd3, 0xba, 0x3f, 0x22, 0x7c, 0x75, 0x9b, 0x7e, 0xee, 0xd4, 0xfb, 0xae, 0x6d, 0xbb, 0x0e,
0x07, 0x75, 0x9a, 0xa6, 0xe3, 0x63, 0xcf, 0xd1, 0x2d, 0xb1, 0xae, 0x47, 0x09, 0x3a, 0x75, 0xd2,
0xdf, 0xc7, 0xb6, 0xce, 0x57, 0xea, 0x03, 0xa8, 0xaf, 0x59, 0x23, 0xb2, 0xaf, 0xe1, 0x4f, 0x47,
0x98, 0xf8, 0xe8, 0x25, 0x28, 0xec, 0xea, 0x04, 0xb7, 0x95, 0x05, 0x65, 0xb1, 0xb6, 0x74, 0xe9,
0x76, 0x6c, 0x2f, 0xb1, 0xcb, 0x26, 0x19, 0x2c, 0xeb, 0x04, 0x6b, 0x0c, 0x13, 0x21, 0x28, 0x18,
0xbb, 0xdd, 0xd5, 0x76, 0x6e, 0x41, 0x59, 0xcc, 0x6b, 0xec, 0x6f, 0xa4, 0x42, 0xbd, 0xef, 0x5a,
0x16, 0xee, 0xfb, 0xa6, 0xeb, 0x74, 0x57, 0xdb, 0x05, 0xf6, 0x2d, 0x06, 0x53, 0x7f, 0xa7, 0x40,
0x43, 0x6c, 0x4d, 0x86, 0xae, 0x43, 0x30, 0xba, 0x0b, 0x25, 0xe2, 0xeb, 0xfe, 0x88, 0x88, 0xdd,
0x2f, 0xa6, 0xee, 0xbe, 0xcd, 0x50, 0x34, 0x81, 0x9a, 0x69, 0xfb, 0xfc, 0xf8, 0xf6, 0x68, 0x1e,
0x80, 0xe0, 0x81, 0x8d, 0x1d, 0xbf, 0xbb, 0x4a, 0xda, 0x85, 0x85, 0xfc, 0x62, 0x5e, 0x8b, 0x40,
0xd4, 0x5f, 0x29, 0xd0, 0xda, 0x0e, 0x96, 0x81, 0x76, 0xce, 0x42, 0xb1, 0xef, 0x8e, 0x1c, 0x9f,
0x09, 0xd8, 0xd0, 0xf8, 0x02, 0x5d, 0x85, 0x7a, 0x7f, 0x5f, 0x77, 0x1c, 0x6c, 0xf5, 0x1c, 0xdd,
0xc6, 0x4c, 0x94, 0xaa, 0x56, 0x13, 0xb0, 0x7b, 0xba, 0x8d, 0x33, 0x49, 0xb4, 0x00, 0xb5, 0xa1,
0xee, 0xf9, 0x66, 0x4c, 0x67, 0x51, 0x90, 0xfa, 0x07, 0x05, 0xce, 0xbd, 0x43, 0x88, 0x39, 0x70,
0xc6, 0x24, 0x3b, 0x07, 0x25, 0xc7, 0x35, 0x70, 0x77, 0x95, 0x89, 0x96, 0xd7, 0xc4, 0x0a, 0x5d,
0x84, 0xea, 0x10, 0x63, 0xaf, 0xe7, 0xb9, 0x56, 0x20, 0x58, 0x85, 0x02, 0x34, 0xd7, 0xc2, 0xe8,
0x7d, 0x38, 0x4d, 0x12, 0x8c, 0x48, 0x3b, 0xbf, 0x90, 0x5f, 0xac, 0x2d, 0x3d, 0x7b, 0x7b, 0xcc,
0xca, 0x6e, 0x27, 0x37, 0xd5, 0xc6, 0xa9, 0xd5, 0x47, 0x39, 0x38, 0x23, 0xf1, 0xb8, 0xac, 0xf4,
0x6f, 0xaa, 0x39, 0x82, 0x07, 0x52, 0x3c, 0xbe, 0xc8, 0xa2, 0x39, 0xa9, 0xf2, 0x7c, 0x54, 0xe5,
0x19, 0x0c, 0x2c, 0xa9, 0xcf, 0xe2, 0x98, 0x3e, 0xd1, 0x15, 0xa8, 0xe1, 0x07, 0x43, 0xd3, 0xc3,
0x3d, 0xdf, 0xb4, 0x71, 0xbb, 0xb4, 0xa0, 0x2c, 0x16, 0x34, 0xe0, 0xa0, 0x1d, 0xd3, 0x8e, 0x5a,
0x64, 0x39, 0xb3, 0x45, 0xaa, 0x7f, 0x54, 0xe0, 0xfc, 0xd8, 0x2d, 0x09, 0x13, 0xd7, 0xa0, 0xc5,
0x4e, 0x1e, 0x6a, 0x86, 0x1a, 0x3b, 0x55, 0xf8, 0xf5, 0x69, 0x0a, 0x0f, 0xd1, 0xb5, 0x31, 0xfa,
0x88, 0x90, 0xb9, 0xec, 0x42, 0x1e, 0xc0, 0xf9, 0x75, 0xec, 0x8b, 0x0d, 0xe8, 0x37, 0x4c, 0x8e,
0x1f, 0x02, 0xe2, 0xbe, 0x94, 0x1b, 0xf3, 0xa5, 0xbf, 0xe6, 0xa4, 0x2f, 0xb1, 0xad, 0xba, 0xce,
0x9e, 0x8b, 0x2e, 0x41, 0x55, 0xa2, 0x08, 0xab, 0x08, 0x01, 0xe8, 0x55, 0x28, 0x52, 0x49, 0xb9,
0x49, 0x34, 0x97, 0xae, 0xa6, 0x9f, 0x29, 0xc2, 0x53, 0xe3, 0xf8, 0xa8, 0x0b, 0x4d, 0xe2, 0xeb,
0x9e, 0xdf, 0x1b, 0xba, 0x84, 0xdd, 0x33, 0x33, 0x9c, 0xda, 0x92, 0x1a, 0xe7, 0x20, 0x43, 0xe4,
0x26, 0x19, 0x6c, 0x09, 0x4c, 0xad, 0xc1, 0x28, 0x83, 0x25, 0x7a, 0x17, 0xea, 0xd8, 0x31, 0x42,
0x46, 0x85, 0xcc, 0x8c, 0x6a, 0xd8, 0x31, 0x24, 0x9b, 0xf0, 0x7e, 0x8a, 0xd9, 0xef, 0xe7, 0x4b,
0x05, 0xda, 0xe3, 0x17, 0x74, 0x92, 0x40, 0xf9, 0x3a, 0x27, 0xc2, 0xfc, 0x82, 0xa6, 0x7a, 0xb8,
0xbc, 0x24, 0x4d, 0x90, 0xa8, 0x26, 0x3c, 0x13, 0x4a, 0xc3, 0xbe, 0x3c, 0x31, 0x63, 0xf9, 0x42,
0x81, 0x73, 0xc9, 0xbd, 0x4e, 0x72, 0xee, 0xef, 0x40, 0xd1, 0x74, 0xf6, 0xdc, 0xe0, 0xd8, 0xf3,
0x53, 0xfc, 0x8c, 0xee, 0xc5, 0x91, 0x55, 0x1b, 0x2e, 0xae, 0x63, 0xbf, 0xeb, 0x10, 0xec, 0xf9,
0xcb, 0xa6, 0x63, 0xb9, 0x83, 0x2d, 0xdd, 0xdf, 0x3f, 0x81, 0x8f, 0xc4, 0xcc, 0x3d, 0x97, 0x30,
0x77, 0xf5, 0x4f, 0x0a, 0x5c, 0x4a, 0xdf, 0x4f, 0x1c, 0xbd, 0x03, 0x95, 0x3d, 0x13, 0x5b, 0x06,
0xd5, 0x99, 0xc2, 0x74, 0x26, 0xd7, 0xd4, 0x57, 0x86, 0x14, 0x59, 0x9c, 0xf0, 0xea, 0x04, 0x03,
0xdd, 0xf6, 0x3d, 0xd3, 0x19, 0x6c, 0x98, 0xc4, 0xd7, 0x38, 0x7e, 0x44, 0x9f, 0xf9, 0xec, 0x96,
0xf9, 0x73, 0x05, 0xe6, 0xd7, 0xb1, 0xbf, 0x22, 0x43, 0x2d, 0xfd, 0x6e, 0x12, 0xdf, 0xec, 0x93,
0x27, 0x5b, 0x44, 0xa4, 0xe4, 0x4c, 0xf5, 0x17, 0x0a, 0x5c, 0x99, 0x28, 0x8c, 0x50, 0x9d, 0x08,
0x25, 0x41, 0xa0, 0x4d, 0x0f, 0x25, 0xdf, 0xc3, 0x0f, 0x3f, 0xd4, 0xad, 0x11, 0xde, 0xd2, 0x4d,
0x8f, 0x87, 0x92, 0x63, 0x06, 0xd6, 0xbf, 0x28, 0x70, 0x79, 0x1d, 0xfb, 0x5b, 0x41, 0x9a, 0x79,
0x8a, 0xda, 0xc9, 0x50, 0x51, 0x7c, 0xc5, 0x2f, 0x33, 0x55, 0xda, 0xa7, 0xa2, 0xbe, 0x79, 0xe6,
0x07, 0x11, 0x87, 0x5c, 0xe1, 0xb5, 0x80, 0x50, 0x9e, 0xfa, 0x28, 0x0f, 0xf5, 0x0f, 0x45, 0x7d,
0xc0, 0xd2, 0x48, 0x52, 0x0f, 0x4a, 0xba, 0x1e, 0x22, 0x25, 0x45, 0x5a, 0x95, 0xb1, 0x0e, 0x0d,
0x82, 0xf1, 0xc1, 0x71, 0x92, 0x46, 0x9d, 0x12, 0xca, 0x60, 0xbf, 0x01, 0xa7, 0x47, 0xce, 0x1e,
0x2d, 0x6b, 0xb1, 0x21, 0x4e, 0xc1, 0xab, 0xcb, 0xd9, 0x91, 0x67, 0x9c, 0x10, 0xbd, 0x07, 0x73,
0x49, 0x5e, 0xc5, 0x4c, 0xbc, 0x92, 0x64, 0xa8, 0x0b, 0x2d, 0xc3, 0x73, 0x87, 0x43, 0x6c, 0xf4,
0x48, 0xc0, 0xaa, 0x94, 0x8d, 0x95, 0xa0, 0x0b, 0x58, 0xa9, 0x3f, 0x53, 0xe0, 0xdc, 0x47, 0xba,
0xdf, 0xdf, 0x5f, 0xb5, 0xc5, 0xe5, 0x9c, 0xc0, 0xb4, 0xdf, 0x84, 0xea, 0x7d, 0x71, 0x11, 0x41,
0xfc, 0xba, 0x92, 0x22, 0x50, 0xf4, 0xca, 0xb5, 0x90, 0x42, 0xfd, 0x5a, 0x81, 0xb3, 0xac, 0x89,
0x08, 0xa4, 0xfb, 0xf6, 0x9d, 0x6c, 0x46, 0x23, 0x81, 0xae, 0x43, 0xd3, 0xd6, 0xbd, 0x83, 0xed,
0x10, 0xa7, 0xc8, 0x70, 0x12, 0x50, 0xf5, 0x01, 0x80, 0x58, 0x6d, 0x92, 0xc1, 0x31, 0xe4, 0x7f,
0x0d, 0xca, 0x62, 0x57, 0xe1, 0x6f, 0xb3, 0x2e, 0x36, 0x40, 0x57, 0xbf, 0x51, 0xa0, 0x19, 0x46,
0x50, 0xe6, 0x55, 0x4d, 0xc8, 0x49, 0x5f, 0xca, 0x75, 0x57, 0xd1, 0x9b, 0x50, 0xe2, 0x6d, 0xa3,
0xe0, 0x7d, 0x2d, 0xce, 0x5b, 0xb4, 0x94, 0x91, 0x30, 0xcc, 0x00, 0x9a, 0x20, 0xa2, 0x3a, 0x92,
0x51, 0x87, 0x77, 0x18, 0x79, 0x2d, 0x02, 0x41, 0x5d, 0x98, 0x8b, 0x17, 0x6d, 0x81, 0xcf, 0x2c,
0x4c, 0x8a, 0x36, 0xab, 0xba, 0xaf, 0xb3, 0x60, 0xd3, 0x8c, 0xd5, 0x6c, 0x44, 0xfd, 0x5f, 0x11,
0x6a, 0x91, 0x53, 0x8e, 0x9d, 0x24, 0x79, 0xa5, 0xb9, 0xd9, 0x71, 0x33, 0x3f, 0xde, 0x39, 0x5c,
0x83, 0xa6, 0xc9, 0x72, 0x75, 0x4f, 0x98, 0x22, 0x0b, 0xae, 0x55, 0xad, 0xc1, 0xa1, 0xc2, 0x2f,
0xd0, 0x3c, 0xd4, 0x9c, 0x91, 0xdd, 0x73, 0xf7, 0x7a, 0x9e, 0x7b, 0x48, 0x44, 0x0b, 0x52, 0x75,
0x46, 0xf6, 0xf7, 0xf7, 0x34, 0xf7, 0x90, 0x84, 0x55, 0x6e, 0xe9, 0x88, 0x55, 0xee, 0x3c, 0xd4,
0x6c, 0xfd, 0x01, 0xe5, 0xda, 0x73, 0x46, 0x36, 0xeb, 0x4e, 0xf2, 0x5a, 0xd5, 0xd6, 0x1f, 0x68,
0xee, 0xe1, 0xbd, 0x91, 0x8d, 0x16, 0xa1, 0x65, 0xe9, 0xc4, 0xef, 0x45, 0xdb, 0x9b, 0x0a, 0x6b,
0x6f, 0x9a, 0x14, 0xfe, 0x6e, 0xd8, 0xe2, 0x8c, 0xd7, 0xcb, 0xd5, 0x13, 0xd4, 0xcb, 0x86, 0x6d,
0x85, 0x8c, 0x20, 0x7b, 0xbd, 0x6c, 0xd8, 0x96, 0x64, 0xf3, 0x1a, 0x94, 0x77, 0x59, 0x05, 0x44,
0xda, 0xb5, 0x89, 0x11, 0x6a, 0x8d, 0x16, 0x3f, 0xbc, 0x50, 0xd2, 0x02, 0x74, 0xf4, 0x06, 0x54,
0x59, 0xea, 0x61, 0xb4, 0xf5, 0x4c, 0xb4, 0x21, 0x01, 0xa5, 0x36, 0xb0, 0xe5, 0xeb, 0x8c, 0xba,
0x91, 0x8d, 0x5a, 0x12, 0xa0, 0x97, 0xe0, 0x4c, 0xdf, 0xc3, 0xba, 0x8f, 0x8d, 0xe5, 0x87, 0x2b,
0xae, 0x3d, 0xd4, 0x99, 0x31, 0xb5, 0x9b, 0x0b, 0xca, 0x62, 0x45, 0x4b, 0xfb, 0x44, 0x03, 0x43,
0x5f, 0xae, 0xd6, 0x3c, 0xd7, 0x6e, 0xcf, 0xf1, 0xc0, 0x10, 0x87, 0xa2, 0xcb, 0x00, 0x41, 0xe8,
0xd6, 0xfd, 0x76, 0x8b, 0xdd, 0x62, 0x55, 0x40, 0xde, 0xf1, 0xd5, 0xcf, 0xe1, 0x6c, 0x68, 0x21,
0x91, 0xdb, 0x18, 0xbf, 0x58, 0xe5, 0xb8, 0x17, 0x3b, 0xbd, 0x76, 0xfd, 0x5b, 0x01, 0xce, 0x6d,
0xeb, 0xf7, 0xf1, 0x93, 0x2f, 0x93, 0x33, 0xc5, 0xe3, 0x0d, 0x38, 0xcd, 0x2a, 0xe3, 0xa5, 0x88,
0x3c, 0x53, 0x32, 0x70, 0xf4, 0x3a, 0xc7, 0x09, 0xd1, 0xdb, 0xb4, 0x74, 0xc0, 0xfd, 0x83, 0x2d,
0xd7, 0x0c, 0xb3, 0xef, 0xe5, 0x14, 0x3e, 0x2b, 0x12, 0x4b, 0x8b, 0x52, 0xa0, 0xad, 0xf1, 0xd0,
0xc6, 0xf3, 0xee, 0x8d, 0xa9, 0xfd, 0x57, 0xa8, 0xfd, 0x64, 0x84, 0x43, 0x6d, 0x28, 0x8b, 0xec,
0xce, 0xfc, 0xbe, 0xa2, 0x05, 0x4b, 0xb4, 0x05, 0x67, 0xf8, 0x09, 0xb6, 0x85, 0x51, 0xf3, 0xc3,
0x57, 0x32, 0x1d, 0x3e, 0x8d, 0x34, 0xee, 0x13, 0xd5, 0xa3, 0xfa, 0x44, 0x1b, 0xca, 0xc2, 0x4e,
0x59, 0x2c, 0xa8, 0x68, 0xc1, 0x92, 0x36, 0x11, 0x10, 0x6a, 0x6c, 0xc6, 0x2c, 0xe0, 0x2d, 0xa8,
0x48, 0x1b, 0xce, 0x65, 0xb6, 0x61, 0x49, 0x93, 0x8c, 0xc2, 0xf9, 0x44, 0x14, 0x56, 0xff, 0xad,
0x40, 0x7d, 0x95, 0x0a, 0xbd, 0xe1, 0x0e, 0x58, 0xce, 0xb8, 0x06, 0x4d, 0x0f, 0xf7, 0x5d, 0xcf,
0xe8, 0x61, 0xc7, 0xf7, 0x4c, 0xcc, 0xfb, 0xcd, 0x82, 0xd6, 0xe0, 0xd0, 0x77, 0x39, 0x90, 0xa2,
0xd1, 0xc0, 0x4a, 0x7c, 0xdd, 0x1e, 0xf6, 0xf6, 0xa8, 0x03, 0xe7, 0x38, 0x9a, 0x84, 0x32, 0xff,
0xbd, 0x0a, 0xf5, 0x10, 0xcd, 0x77, 0xd9, 0xfe, 0x05, 0xad, 0x26, 0x61, 0x3b, 0x2e, 0x7a, 0x0e,
0x9a, 0x4c, 0x6b, 0x3d, 0xcb, 0x1d, 0xf4, 0x68, 0x6f, 0x26, 0xd2, 0x49, 0xdd, 0x10, 0x62, 0xd1,
0xdb, 0x88, 0x63, 0x11, 0xf3, 0x33, 0x2c, 0x12, 0x8a, 0xc4, 0xda, 0x36, 0x3f, 0xc3, 0x34, 0x9b,
0x37, 0x68, 0x76, 0xbc, 0xe7, 0x1a, 0x78, 0xe7, 0x98, 0xb5, 0x44, 0x86, 0xb9, 0xdc, 0x25, 0xa8,
0xca, 0x13, 0x88, 0x23, 0x85, 0x00, 0xb4, 0x06, 0xcd, 0xa0, 0xcc, 0xec, 0xf1, 0xee, 0xa1, 0x30,
0xb1, 0xb6, 0x8b, 0xe4, 0x37, 0xa2, 0x35, 0x02, 0x32, 0xb6, 0x54, 0xd7, 0xa0, 0x1e, 0xfd, 0x4c,
0x77, 0xdd, 0x4e, 0x1a, 0x8a, 0x04, 0x50, 0x7b, 0xbb, 0x37, 0xb2, 0xe9, 0x9d, 0x8a, 0xd0, 0x11,
0x2c, 0xd5, 0x2f, 0x14, 0x68, 0x88, 0xa4, 0xbc, 0x2d, 0xe7, 0xc6, 0xec, 0x68, 0x0a, 0x3b, 0x1a,
0xfb, 0x1b, 0x7d, 0x37, 0x3e, 0x74, 0x7a, 0x2e, 0xd5, 0xcd, 0x19, 0x13, 0x56, 0xff, 0xc6, 0x32,
0x72, 0x96, 0x6e, 0xf5, 0x11, 0x35, 0x34, 0x71, 0x35, 0xcc, 0xd0, 0xda, 0x50, 0xd6, 0x0d, 0xc3,
0xc3, 0x84, 0x08, 0x39, 0x82, 0x25, 0xfd, 0x72, 0x1f, 0x7b, 0x24, 0x30, 0xf9, 0xbc, 0x16, 0x2c,
0xd1, 0x1b, 0x50, 0x91, 0x05, 0x73, 0x3e, 0xad, 0x48, 0x8a, 0xca, 0x29, 0xba, 0x2b, 0x49, 0xa1,
0x7e, 0x95, 0x83, 0xa6, 0x50, 0xd8, 0xb2, 0xc8, 0x9a, 0xd3, 0x9d, 0x6f, 0x19, 0xea, 0x7b, 0xa1,
0x77, 0x4f, 0x9b, 0xa2, 0x44, 0x83, 0x40, 0x8c, 0x66, 0x96, 0x03, 0xc6, 0xf3, 0x76, 0xe1, 0x44,
0x79, 0xbb, 0x78, 0xc4, 0x18, 0xa5, 0xfe, 0x08, 0x6a, 0x91, 0x2f, 0x2c, 0xb8, 0xf2, 0xb9, 0x8a,
0x50, 0x45, 0xb0, 0x44, 0x77, 0xc3, 0xb2, 0x84, 0xeb, 0xe0, 0x42, 0xca, 0x26, 0x89, 0x8a, 0x44,
0xfd, 0xb3, 0x02, 0x25, 0xc1, 0xf9, 0x0a, 0xd4, 0x44, 0x34, 0x61, 0x25, 0x1b, 0xe7, 0x0e, 0x02,
0x44, 0x6b, 0xb6, 0xc7, 0x17, 0x4e, 0x2e, 0x40, 0x25, 0x11, 0x48, 0xca, 0x22, 0xa2, 0x07, 0x9f,
0x22, 0xd1, 0x83, 0x7e, 0x62, 0x81, 0xe3, 0x6b, 0x85, 0xcd, 0x84, 0x35, 0xdc, 0x77, 0xef, 0x63,
0xef, 0xe1, 0xc9, 0x27, 0x6f, 0xaf, 0x47, 0x2c, 0x35, 0x63, 0x6b, 0x27, 0x09, 0xd0, 0xeb, 0xa1,
0xba, 0xf3, 0x69, 0x83, 0x87, 0x68, 0xe8, 0x10, 0x76, 0x16, 0xaa, 0xfd, 0x97, 0x7c, 0x86, 0x18,
0x3f, 0xca, 0x71, 0x4b, 0x92, 0xc7, 0xd2, 0x31, 0xa8, 0xbf, 0x56, 0xe0, 0xc2, 0x3a, 0xf6, 0xd7,
0xe2, 0x7d, 0xf9, 0xd3, 0x96, 0xca, 0x86, 0x4e, 0x9a, 0x50, 0x27, 0xb9, 0xf5, 0x0e, 0x54, 0xe4,
0x84, 0x81, 0x4f, 0x77, 0xe5, 0x5a, 0xfd, 0xa9, 0x02, 0x6d, 0xb1, 0x0b, 0xdb, 0x93, 0x56, 0xc3,
0x16, 0xf6, 0xb1, 0xf1, 0x6d, 0xb7, 0xbc, 0xff, 0x52, 0xa0, 0x15, 0x0d, 0xe5, 0x2c, 0x1a, 0xbf,
0x02, 0x45, 0x36, 0x59, 0x10, 0x12, 0xcc, 0x34, 0x56, 0x8e, 0x4d, 0x43, 0x06, 0xab, 0xd0, 0x76,
0x64, 0xd6, 0x11, 0xcb, 0x30, 0x9f, 0xe4, 0x8f, 0x9e, 0x4f, 0x44, 0x7e, 0x75, 0x47, 0x94, 0x2f,
0x9f, 0xdc, 0x85, 0x00, 0xf5, 0xcb, 0x1c, 0xb4, 0xc3, 0x56, 0xe2, 0x5b, 0x0f, 0xe8, 0x13, 0x0a,
0xcd, 0xfc, 0x63, 0x2a, 0x34, 0x0b, 0x47, 0x0d, 0xe2, 0xff, 0xcc, 0x41, 0x33, 0x54, 0xc7, 0x96,
0xa5, 0x3b, 0xe8, 0x1c, 0x94, 0x86, 0x96, 0x1e, 0x4e, 0x04, 0xc5, 0x0a, 0x6d, 0xcb, 0xca, 0x24,
0xae, 0x80, 0x17, 0xd2, 0x2e, 0x67, 0x82, 0x86, 0xb5, 0x04, 0x0b, 0xda, 0xa2, 0xf1, 0x22, 0x9f,
0x35, 0xda, 0xa2, 0x1a, 0xe2, 0x56, 0x40, 0x7b, 0xec, 0x5b, 0x80, 0xc4, 0xd5, 0xf5, 0x4c, 0xa7,
0x47, 0x70, 0xdf, 0x75, 0x0c, 0x7e, 0xa9, 0x45, 0xad, 0x25, 0xbe, 0x74, 0x9d, 0x6d, 0x0e, 0x47,
0xaf, 0x40, 0xc1, 0x7f, 0x38, 0xe4, 0xe1, 0xb9, 0x99, 0x1a, 0xf6, 0x42, 0xb9, 0x76, 0x1e, 0x0e,
0xb1, 0xc6, 0xd0, 0xd1, 0x3c, 0x00, 0x65, 0xe5, 0x7b, 0xfa, 0x7d, 0x6c, 0x05, 0xbf, 0x65, 0x86,
0x10, 0x6a, 0xa6, 0xc1, 0xac, 0xa2, 0xcc, 0x73, 0x82, 0x58, 0xaa, 0x7f, 0xcf, 0x41, 0x2b, 0x64,
0xa9, 0x61, 0x32, 0xb2, 0xfc, 0x89, 0xfa, 0x9b, 0xde, 0xa0, 0xcd, 0xca, 0xf4, 0x6f, 0x43, 0x4d,
0xcc, 0x4d, 0x8e, 0x70, 0xd1, 0xc0, 0x49, 0x36, 0xa6, 0x58, 0x5e, 0xf1, 0x31, 0x59, 0x5e, 0xe9,
0xa8, 0x96, 0xb7, 0x0d, 0xe7, 0x82, 0x80, 0x16, 0x22, 0x6c, 0x62, 0x5f, 0x9f, 0x52, 0x49, 0x5c,
0x81, 0x1a, 0x4f, 0x54, 0x3c, 0x43, 0xf3, 0xe2, 0x1a, 0x76, 0x65, 0xd7, 0xa9, 0xfe, 0x18, 0xce,
0xb2, 0x80, 0x90, 0x1c, 0xaf, 0x66, 0x99, 0x75, 0xab, 0xb2, 0x74, 0xa7, 0x65, 0x3a, 0xb7, 0xee,
0xaa, 0x16, 0x83, 0xa9, 0x1b, 0xf0, 0x4c, 0x82, 0xff, 0x09, 0x02, 0xbe, 0xfa, 0x0f, 0x05, 0x2e,
0xac, 0x7a, 0xee, 0xf0, 0x43, 0xd3, 0xf3, 0x47, 0xba, 0x15, 0x1f, 0xd8, 0x3f, 0x99, 0xe6, 0xe3,
0xbd, 0x48, 0x8e, 0xe1, 0x41, 0xe7, 0x56, 0xca, 0x95, 0x8d, 0x0b, 0x25, 0xae, 0x2a, 0x92, 0x91,
0xfe, 0x9b, 0x4f, 0x13, 0x5e, 0xe0, 0xcd, 0x88, 0xa4, 0x59, 0x52, 0x70, 0xea, 0x34, 0x22, 0x7f,
0xdc, 0x69, 0xc4, 0x04, 0xeb, 0x2f, 0x3c, 0x26, 0xeb, 0x3f, 0x6a, 0xf1, 0x8c, 0xde, 0x83, 0xf8,
0xa4, 0x88, 0x85, 0x9d, 0x63, 0x8d, 0x98, 0x96, 0x01, 0xc2, 0xa9, 0x89, 0x78, 0x6d, 0x91, 0x85,
0x4d, 0x84, 0x8a, 0xde, 0x96, 0x8c, 0x34, 0x6c, 0xda, 0x19, 0xeb, 0xf2, 0xdf, 0x87, 0x4e, 0x9a,
0x95, 0x9e, 0xc4, 0xf2, 0x7f, 0x93, 0x03, 0xe8, 0xda, 0x43, 0xd7, 0xf3, 0x77, 0x74, 0x72, 0x70,
0xbc, 0x72, 0xe9, 0x06, 0xcc, 0x85, 0x06, 0x13, 0x35, 0xf8, 0x66, 0x08, 0x66, 0x36, 0x7f, 0x0d,
0x9a, 0xb2, 0x72, 0xe3, 0x78, 0x79, 0x3e, 0x72, 0x96, 0x50, 0x86, 0x76, 0x11, 0xaa, 0x9e, 0x7b,
0xd8, 0xa3, 0x9e, 0x64, 0xb0, 0x14, 0x53, 0xd1, 0x2a, 0x9e, 0x7b, 0x48, 0xfd, 0xcb, 0x40, 0xe7,
0xa1, 0xec, 0xeb, 0xe4, 0xa0, 0x67, 0x1a, 0xa2, 0xf8, 0x2f, 0xd1, 0x65, 0xd7, 0x40, 0x67, 0xa1,
0xb8, 0x67, 0x5a, 0x98, 0x07, 0xc0, 0xaa, 0xc6, 0x17, 0xe8, 0xd5, 0xe0, 0xa7, 0xf3, 0x72, 0xe6,
0x9f, 0xfe, 0xf8, 0xaf, 0xe7, 0x5f, 0x2b, 0x30, 0x17, 0x2a, 0x86, 0xd5, 0x35, 0xe8, 0x2d, 0xde,
0xe4, 0xe1, 0x15, 0xd7, 0xe0, 0xd1, 0xa0, 0x39, 0x61, 0xba, 0xcf, 0x09, 0x79, 0x31, 0x14, 0x92,
0x4c, 0xab, 0x2b, 0xe9, 0xb9, 0xe8, 0xa1, 0x4d, 0x23, 0xf8, 0x71, 0xa1, 0xe4, 0xb9, 0x87, 0x5d,
0x83, 0x04, 0xda, 0xe0, 0x2f, 0x88, 0x78, 0x15, 0x45, 0xb5, 0xb1, 0xc2, 0x1e, 0x11, 0x3d, 0x0b,
0x0d, 0xec, 0x79, 0xae, 0xd7, 0xb3, 0x31, 0x21, 0xfa, 0x80, 0x67, 0xdc, 0xaa, 0x56, 0x67, 0xc0,
0x4d, 0x0e, 0x53, 0xbf, 0xc9, 0x41, 0x33, 0x3c, 0x4a, 0xf0, 0x93, 0x82, 0x69, 0x04, 0x3f, 0x29,
0x98, 0x06, 0xcd, 0xfe, 0x1e, 0x8f, 0x76, 0x54, 0xb1, 0x22, 0x27, 0x0a, 0x48, 0xd7, 0xa0, 0xe1,
0x9e, 0xfa, 0x90, 0xe3, 0x1a, 0x98, 0x7e, 0xe7, 0x39, 0x11, 0x02, 0x50, 0xd7, 0xa0, 0x72, 0x44,
0x4c, 0xc0, 0x34, 0x82, 0xe1, 0x4f, 0x24, 0x90, 0x18, 0x34, 0x2a, 0x86, 0xd7, 0x2f, 0xee, 0xaf,
0x1a, 0x2d, 0xe6, 0x0d, 0x9a, 0xb2, 0x77, 0x47, 0xfd, 0x03, 0xec, 0x33, 0x37, 0xac, 0x6a, 0x62,
0x15, 0x37, 0x89, 0x72, 0xc2, 0x24, 0xe4, 0xcd, 0x57, 0xa2, 0x37, 0x7f, 0x11, 0xaa, 0x7c, 0x64,
0xdd, 0xf3, 0x09, 0xfb, 0x41, 0x20, 0xaf, 0x55, 0x38, 0x60, 0x87, 0xa0, 0xd7, 0x82, 0xb2, 0x36,
0x75, 0xc0, 0xcf, 0xe2, 0x45, 0xe2, 0xf2, 0x45, 0x51, 0xab, 0x7e, 0x02, 0x28, 0xfc, 0x72, 0xb2,
0x36, 0x23, 0xa1, 0xd5, 0x5c, 0x52, 0xab, 0x37, 0x7f, 0xab, 0xc0, 0xe9, 0xb1, 0xea, 0x1a, 0x35,
0x01, 0x3e, 0x70, 0xfa, 0xa2, 0xed, 0x68, 0x9d, 0x42, 0x75, 0xa8, 0x04, 0x4d, 0x48, 0x4b, 0x41,
0x35, 0x28, 0xef, 0xb8, 0x0c, 0xbb, 0x95, 0x43, 0x2d, 0xa8, 0x73, 0xc2, 0x51, 0xbf, 0x8f, 0x09,
0x69, 0xe5, 0x25, 0x64, 0x4d, 0x37, 0xad, 0x91, 0x87, 0x5b, 0x05, 0xd4, 0x80, 0xea, 0x8e, 0xab,
0x61, 0x0b, 0xeb, 0x04, 0xb7, 0x8a, 0x08, 0x41, 0x53, 0x2c, 0x02, 0xa2, 0x52, 0x04, 0x16, 0x90,
0x95, 0x6f, 0xee, 0x45, 0xcb, 0x55, 0x5a, 0xc3, 0xa1, 0xf3, 0x70, 0xe6, 0x03, 0xc7, 0xc0, 0x7b,
0xa6, 0x83, 0x8d, 0xf0, 0x53, 0xeb, 0x14, 0x3a, 0x03, 0x73, 0x5d, 0xc7, 0xc1, 0x5e, 0x04, 0xa8,
0x50, 0xe0, 0x26, 0xf6, 0x06, 0x38, 0x02, 0xcc, 0xa1, 0xd3, 0xd0, 0xd8, 0x34, 0x1f, 0x44, 0x40,
0xf9, 0xa5, 0xff, 0x9c, 0x81, 0xea, 0xaa, 0xee, 0xeb, 0x2b, 0xae, 0xeb, 0x19, 0x68, 0x08, 0x88,
0xbd, 0x95, 0xb0, 0x87, 0xae, 0x23, 0x1f, 0x15, 0xa1, 0x97, 0x26, 0x44, 0xd9, 0x71, 0x54, 0x91,
0xd2, 0x3b, 0xd7, 0x27, 0x50, 0x24, 0xd0, 0xd5, 0x53, 0xc8, 0x66, 0x3b, 0xd2, 0x1a, 0x78, 0xc7,
0xec, 0x1f, 0x04, 0xbf, 0x8a, 0x4d, 0xd9, 0x31, 0x81, 0x1a, 0xec, 0x98, 0x78, 0xab, 0x24, 0x16,
0xfc, 0x41, 0x4b, 0x60, 0x46, 0xea, 0x29, 0xf4, 0x29, 0x9c, 0x5d, 0xc7, 0x7e, 0xf8, 0x86, 0x21,
0xd8, 0x70, 0x69, 0xf2, 0x86, 0x63, 0xc8, 0x47, 0xdc, 0x72, 0x03, 0x8a, 0xac, 0x93, 0x45, 0x69,
0xdd, 0x62, 0xf4, 0x65, 0x6d, 0x67, 0x61, 0x32, 0x82, 0xe4, 0xf6, 0x09, 0xcc, 0x25, 0x5e, 0x0e,
0xa2, 0xe7, 0x53, 0xc8, 0xd2, 0xdf, 0x80, 0x76, 0x6e, 0x66, 0x41, 0x95, 0x7b, 0x0d, 0xa0, 0x19,
0x7f, 0x69, 0x81, 0x16, 0x53, 0xe8, 0x53, 0x5f, 0x7d, 0x75, 0x9e, 0xcf, 0x80, 0x29, 0x37, 0xb2,
0xa1, 0x95, 0x7c, 0xc9, 0x86, 0x6e, 0x4e, 0x65, 0x10, 0x37, 0xb7, 0x17, 0x32, 0xe1, 0xca, 0xed,
0x1e, 0x32, 0x23, 0x18, 0x7b, 0x49, 0x85, 0x6e, 0xa7, 0xb3, 0x99, 0xf4, 0xc4, 0xab, 0x73, 0x27,
0x33, 0xbe, 0xdc, 0xfa, 0x27, 0x7c, 0x82, 0x96, 0xf6, 0x1a, 0x09, 0xbd, 0x9c, 0xce, 0x6e, 0xca,
0x33, 0xaa, 0xce, 0xd2, 0x51, 0x48, 0xa4, 0x10, 0x9f, 0xb3, 0xd1, 0x57, 0xca, 0x8b, 0x9e, 0xa4,
0xdf, 0x05, 0xfc, 0x26, 0x3f, 0x55, 0xea, 0xbc, 0x7c, 0x04, 0x0a, 0x29, 0x80, 0x9b, 0x7c, 0x2b,
0x18, 0xb8, 0xe1, 0x9d, 0x99, 0x56, 0x73, 0x3c, 0x1f, 0xfc, 0x18, 0xe6, 0x12, 0xbf, 0x3f, 0xa6,
0x7a, 0x4d, 0xfa, 0x6f, 0x94, 0x9d, 0x69, 0xd9, 0x86, 0xbb, 0x64, 0x62, 0x92, 0x88, 0x26, 0x58,
0x7f, 0xca, 0xb4, 0xb1, 0x73, 0x33, 0x0b, 0xaa, 0x3c, 0x08, 0x61, 0xe1, 0x32, 0x31, 0x8d, 0x43,
0xb7, 0xd2, 0x79, 0xa4, 0x4f, 0x12, 0x3b, 0x2f, 0x66, 0xc4, 0x96, 0x9b, 0xf6, 0x00, 0xd6, 0xb1,
0xbf, 0x89, 0x7d, 0x8f, 0xda, 0xc8, 0xf5, 0x54, 0x95, 0x87, 0x08, 0xc1, 0x36, 0x37, 0x66, 0xe2,
0xc9, 0x0d, 0x7e, 0x00, 0x28, 0x48, 0xb1, 0x91, 0x5f, 0xbf, 0x9f, 0x9d, 0x3a, 0xd7, 0xe0, 0x43,
0x88, 0x59, 0x77, 0xf3, 0x29, 0xb4, 0x36, 0x75, 0x87, 0x56, 0xf3, 0x21, 0xdf, 0x5b, 0xa9, 0x82,
0x25, 0xd1, 0x26, 0x68, 0x6b, 0x22, 0xb6, 0x3c, 0xcc, 0xa1, 0xcc, 0xa1, 0xba, 0x74, 0x41, 0x9c,
0x8c, 0x2d, 0xa1, 0x36, 0x12, 0x88, 0x13, 0x62, 0xcb, 0x14, 0x7c, 0xb9, 0xf1, 0x23, 0x85, 0xbd,
0x48, 0x4d, 0x20, 0x7c, 0x64, 0xfa, 0xfb, 0x5b, 0x96, 0xee, 0x90, 0x2c, 0x22, 0x30, 0xc4, 0x23,
0x88, 0x20, 0xf0, 0xa5, 0x08, 0x06, 0x34, 0x62, 0x63, 0x03, 0x94, 0xf6, 0x13, 0x76, 0xda, 0xe0,
0xa2, 0xb3, 0x38, 0x1b, 0x51, 0xee, 0xb2, 0x0f, 0x8d, 0xc0, 0x5e, 0xb9, 0x72, 0x9f, 0x9f, 0x24,
0x69, 0x88, 0x33, 0xc1, 0xdd, 0xd2, 0x51, 0xa3, 0xee, 0x36, 0xde, 0x11, 0xa2, 0x6c, 0x93, 0x84,
0x69, 0xee, 0x36, 0xb9, 0xcd, 0x54, 0x4f, 0xa1, 0x2d, 0x28, 0xf1, 0x12, 0x18, 0x5d, 0x9e, 0x5a,
0x37, 0x77, 0xae, 0x4d, 0xfd, 0x1c, 0x72, 0x5c, 0xfa, 0x7d, 0x11, 0x2a, 0xc1, 0xaf, 0x8a, 0x4f,
0xa1, 0xc6, 0x7b, 0x0a, 0x45, 0xd7, 0xc7, 0x30, 0x97, 0x78, 0x80, 0x98, 0x1a, 0x93, 0xd3, 0x1f,
0x29, 0xce, 0x0a, 0x2a, 0x1f, 0x89, 0x7f, 0x4b, 0x92, 0xf1, 0xf7, 0xc6, 0xa4, 0xc2, 0x2d, 0x19,
0x7a, 0x67, 0x30, 0x7e, 0xe2, 0x81, 0xf6, 0x1e, 0x40, 0x24, 0x10, 0x4e, 0x1f, 0x1c, 0x53, 0xdf,
0x9e, 0x25, 0xf0, 0x5a, 0x56, 0x53, 0x9d, 0xce, 0x67, 0xf9, 0xee, 0x0f, 0x5f, 0x1e, 0x98, 0xfe,
0xfe, 0x68, 0x97, 0x7e, 0xb9, 0xc3, 0x51, 0x5f, 0x34, 0x5d, 0xf1, 0xd7, 0x9d, 0xc0, 0x32, 0xee,
0x30, 0xea, 0x3b, 0x94, 0xf9, 0x70, 0x77, 0xb7, 0xc4, 0x56, 0x77, 0xff, 0x1f, 0x00, 0x00, 0xff,
0xff, 0x5d, 0x32, 0x73, 0x00, 0x00, 0x37, 0x00, 0x00,
// 3222 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3b, 0x5b, 0x6f, 0x1b, 0xc7,
0xd5, 0x5e, 0xde, 0x79, 0x78, 0x11, 0x3d, 0x76, 0x64, 0x9a, 0xb6, 0x65, 0x79, 0x1d, 0x3b, 0x8a,
0xe3, 0xd8, 0x89, 0xfc, 0x05, 0x09, 0xbe, 0xdc, 0x10, 0x49, 0x91, 0x42, 0x7c, 0x92, 0x3f, 0x65,
0xa5, 0x24, 0x1f, 0xbe, 0x14, 0x25, 0x56, 0xdc, 0x11, 0xb5, 0xd1, 0x5e, 0x98, 0x9d, 0xa5, 0x65,
0xe7, 0x25, 0x46, 0x03, 0x14, 0x68, 0x11, 0xa4, 0x2d, 0xfa, 0x54, 0xa0, 0x28, 0x8a, 0x3e, 0xb5,
0xe8, 0x4b, 0xfb, 0xd8, 0x16, 0x7d, 0x0f, 0xd2, 0x7f, 0xd1, 0x97, 0xbe, 0xf5, 0x37, 0x14, 0x73,
0xd9, 0xd9, 0x0b, 0x97, 0xe4, 0x4a, 0xb2, 0xe3, 0x37, 0xcd, 0xd9, 0x73, 0xce, 0xcc, 0x9c, 0xfb,
0x39, 0x1c, 0x41, 0xcb, 0xd0, 0x7d, 0xbd, 0xd7, 0x77, 0x5d, 0xcf, 0xb8, 0x33, 0xf4, 0x5c, 0xdf,
0x45, 0x67, 0x6d, 0xd3, 0x7a, 0x30, 0x22, 0x7c, 0x75, 0x87, 0x7e, 0xee, 0xd4, 0xfb, 0xae, 0x6d,
0xbb, 0x0e, 0x07, 0x75, 0x9a, 0xa6, 0xe3, 0x63, 0xcf, 0xd1, 0x2d, 0xb1, 0xae, 0x47, 0x09, 0x3a,
0x75, 0xd2, 0x3f, 0xc0, 0xb6, 0xce, 0x57, 0xea, 0x43, 0xa8, 0xaf, 0x5b, 0x23, 0x72, 0xa0, 0xe1,
0xcf, 0x47, 0x98, 0xf8, 0xe8, 0x15, 0x28, 0xec, 0xe9, 0x04, 0xb7, 0x95, 0x45, 0x65, 0xa9, 0xb6,
0x7c, 0xf9, 0x4e, 0x6c, 0x2f, 0xb1, 0xcb, 0x16, 0x19, 0xac, 0xe8, 0x04, 0x6b, 0x0c, 0x13, 0x21,
0x28, 0x18, 0x7b, 0xdd, 0xb5, 0x76, 0x6e, 0x51, 0x59, 0xca, 0x6b, 0xec, 0x6f, 0xa4, 0x42, 0xbd,
0xef, 0x5a, 0x16, 0xee, 0xfb, 0xa6, 0xeb, 0x74, 0xd7, 0xda, 0x05, 0xf6, 0x2d, 0x06, 0x53, 0x7f,
0xad, 0x40, 0x43, 0x6c, 0x4d, 0x86, 0xae, 0x43, 0x30, 0xba, 0x07, 0x25, 0xe2, 0xeb, 0xfe, 0x88,
0x88, 0xdd, 0x2f, 0xa5, 0xee, 0xbe, 0xc3, 0x50, 0x34, 0x81, 0x9a, 0x69, 0xfb, 0xfc, 0xf8, 0xf6,
0x68, 0x01, 0x80, 0xe0, 0x81, 0x8d, 0x1d, 0xbf, 0xbb, 0x46, 0xda, 0x85, 0xc5, 0xfc, 0x52, 0x5e,
0x8b, 0x40, 0xd4, 0x5f, 0x28, 0xd0, 0xda, 0x09, 0x96, 0x81, 0x74, 0xce, 0x43, 0xb1, 0xef, 0x8e,
0x1c, 0x9f, 0x1d, 0xb0, 0xa1, 0xf1, 0x05, 0xba, 0x06, 0xf5, 0xfe, 0x81, 0xee, 0x38, 0xd8, 0xea,
0x39, 0xba, 0x8d, 0xd9, 0x51, 0xaa, 0x5a, 0x4d, 0xc0, 0xee, 0xeb, 0x36, 0xce, 0x74, 0xa2, 0x45,
0xa8, 0x0d, 0x75, 0xcf, 0x37, 0x63, 0x32, 0x8b, 0x82, 0xd4, 0xdf, 0x2a, 0x30, 0xff, 0x1e, 0x21,
0xe6, 0xc0, 0x19, 0x3b, 0xd9, 0x3c, 0x94, 0x1c, 0xd7, 0xc0, 0xdd, 0x35, 0x76, 0xb4, 0xbc, 0x26,
0x56, 0xe8, 0x12, 0x54, 0x87, 0x18, 0x7b, 0x3d, 0xcf, 0xb5, 0x82, 0x83, 0x55, 0x28, 0x40, 0x73,
0x2d, 0x8c, 0x3e, 0x84, 0xb3, 0x24, 0xc1, 0x88, 0xb4, 0xf3, 0x8b, 0xf9, 0xa5, 0xda, 0xf2, 0xf5,
0x3b, 0x63, 0x56, 0x76, 0x27, 0xb9, 0xa9, 0x36, 0x4e, 0xad, 0x3e, 0xce, 0xc1, 0x39, 0x89, 0xc7,
0xcf, 0x4a, 0xff, 0xa6, 0x92, 0x23, 0x78, 0x20, 0x8f, 0xc7, 0x17, 0x59, 0x24, 0x27, 0x45, 0x9e,
0x8f, 0x8a, 0x3c, 0x83, 0x81, 0x25, 0xe5, 0x59, 0x1c, 0x93, 0x27, 0xba, 0x0a, 0x35, 0xfc, 0x70,
0x68, 0x7a, 0xb8, 0xe7, 0x9b, 0x36, 0x6e, 0x97, 0x16, 0x95, 0xa5, 0x82, 0x06, 0x1c, 0xb4, 0x6b,
0xda, 0x51, 0x8b, 0x2c, 0x67, 0xb6, 0x48, 0xf5, 0x77, 0x0a, 0x5c, 0x18, 0xd3, 0x92, 0x30, 0x71,
0x0d, 0x5a, 0xec, 0xe6, 0xa1, 0x64, 0xa8, 0xb1, 0x53, 0x81, 0xdf, 0x9c, 0x26, 0xf0, 0x10, 0x5d,
0x1b, 0xa3, 0x8f, 0x1c, 0x32, 0x97, 0xfd, 0x90, 0x87, 0x70, 0x61, 0x03, 0xfb, 0x62, 0x03, 0xfa,
0x0d, 0x93, 0x93, 0x87, 0x80, 0xb8, 0x2f, 0xe5, 0xc6, 0x7c, 0xe9, 0x4f, 0x39, 0xe9, 0x4b, 0x6c,
0xab, 0xae, 0xb3, 0xef, 0xa2, 0xcb, 0x50, 0x95, 0x28, 0xc2, 0x2a, 0x42, 0x00, 0x7a, 0x1d, 0x8a,
0xf4, 0xa4, 0xdc, 0x24, 0x9a, 0xcb, 0xd7, 0xd2, 0xef, 0x14, 0xe1, 0xa9, 0x71, 0x7c, 0xd4, 0x85,
0x26, 0xf1, 0x75, 0xcf, 0xef, 0x0d, 0x5d, 0xc2, 0xf4, 0xcc, 0x0c, 0xa7, 0xb6, 0xac, 0xc6, 0x39,
0xc8, 0x10, 0xb9, 0x45, 0x06, 0xdb, 0x02, 0x53, 0x6b, 0x30, 0xca, 0x60, 0x89, 0xde, 0x87, 0x3a,
0x76, 0x8c, 0x90, 0x51, 0x21, 0x33, 0xa3, 0x1a, 0x76, 0x0c, 0xc9, 0x26, 0xd4, 0x4f, 0x31, 0xbb,
0x7e, 0xbe, 0x56, 0xa0, 0x3d, 0xae, 0xa0, 0xd3, 0x04, 0xca, 0x37, 0x39, 0x11, 0xe6, 0x0a, 0x9a,
0xea, 0xe1, 0x52, 0x49, 0x9a, 0x20, 0x51, 0x4d, 0x78, 0x2e, 0x3c, 0x0d, 0xfb, 0xf2, 0xd4, 0x8c,
0xe5, 0x2b, 0x05, 0xe6, 0x93, 0x7b, 0x9d, 0xe6, 0xde, 0xff, 0x05, 0x45, 0xd3, 0xd9, 0x77, 0x83,
0x6b, 0x2f, 0x4c, 0xf1, 0x33, 0xba, 0x17, 0x47, 0x56, 0x6d, 0xb8, 0xb4, 0x81, 0xfd, 0xae, 0x43,
0xb0, 0xe7, 0xaf, 0x98, 0x8e, 0xe5, 0x0e, 0xb6, 0x75, 0xff, 0xe0, 0x14, 0x3e, 0x12, 0x33, 0xf7,
0x5c, 0xc2, 0xdc, 0xd5, 0xdf, 0x2b, 0x70, 0x39, 0x7d, 0x3f, 0x71, 0xf5, 0x0e, 0x54, 0xf6, 0x4d,
0x6c, 0x19, 0x54, 0x66, 0x0a, 0x93, 0x99, 0x5c, 0x53, 0x5f, 0x19, 0x52, 0x64, 0x71, 0xc3, 0x6b,
0x13, 0x0c, 0x74, 0xc7, 0xf7, 0x4c, 0x67, 0xb0, 0x69, 0x12, 0x5f, 0xe3, 0xf8, 0x11, 0x79, 0xe6,
0xb3, 0x5b, 0xe6, 0x4f, 0x15, 0x58, 0xd8, 0xc0, 0xfe, 0xaa, 0x0c, 0xb5, 0xf4, 0xbb, 0x49, 0x7c,
0xb3, 0x4f, 0x9e, 0x6e, 0x11, 0x91, 0x92, 0x33, 0xd5, 0x9f, 0x29, 0x70, 0x75, 0xe2, 0x61, 0x84,
0xe8, 0x44, 0x28, 0x09, 0x02, 0x6d, 0x7a, 0x28, 0xf9, 0x1f, 0xfc, 0xe8, 0x63, 0xdd, 0x1a, 0xe1,
0x6d, 0xdd, 0xf4, 0x78, 0x28, 0x39, 0x61, 0x60, 0xfd, 0xa3, 0x02, 0x57, 0x36, 0xb0, 0xbf, 0x1d,
0xa4, 0x99, 0x67, 0x28, 0x9d, 0x0c, 0x15, 0xc5, 0x37, 0x5c, 0x99, 0xa9, 0xa7, 0x7d, 0x26, 0xe2,
0x5b, 0x60, 0x7e, 0x10, 0x71, 0xc8, 0x55, 0x5e, 0x0b, 0x08, 0xe1, 0xa9, 0x8f, 0xf3, 0x50, 0xff,
0x58, 0xd4, 0x07, 0x2c, 0x8d, 0x24, 0xe5, 0xa0, 0xa4, 0xcb, 0x21, 0x52, 0x52, 0xa4, 0x55, 0x19,
0x1b, 0xd0, 0x20, 0x18, 0x1f, 0x9e, 0x24, 0x69, 0xd4, 0x29, 0xa1, 0x0c, 0xf6, 0x9b, 0x70, 0x76,
0xe4, 0xec, 0xd3, 0xb2, 0x16, 0x1b, 0xe2, 0x16, 0xbc, 0xba, 0x9c, 0x1d, 0x79, 0xc6, 0x09, 0xd1,
0x07, 0x30, 0x97, 0xe4, 0x55, 0xcc, 0xc4, 0x2b, 0x49, 0x86, 0xba, 0xd0, 0x32, 0x3c, 0x77, 0x38,
0xc4, 0x46, 0x8f, 0x04, 0xac, 0x4a, 0xd9, 0x58, 0x09, 0xba, 0x80, 0x95, 0xfa, 0x13, 0x05, 0xe6,
0x3f, 0xd1, 0xfd, 0xfe, 0xc1, 0x9a, 0x2d, 0x94, 0x73, 0x0a, 0xd3, 0x7e, 0x1b, 0xaa, 0x0f, 0x84,
0x22, 0x82, 0xf8, 0x75, 0x35, 0xe5, 0x40, 0x51, 0x95, 0x6b, 0x21, 0x85, 0xfa, 0xad, 0x02, 0xe7,
0x59, 0x13, 0x11, 0x9c, 0xee, 0xfb, 0x77, 0xb2, 0x19, 0x8d, 0x04, 0xba, 0x09, 0x4d, 0x5b, 0xf7,
0x0e, 0x77, 0x42, 0x9c, 0x22, 0xc3, 0x49, 0x40, 0xd5, 0x87, 0x00, 0x62, 0xb5, 0x45, 0x06, 0x27,
0x38, 0xff, 0x1b, 0x50, 0x16, 0xbb, 0x0a, 0x7f, 0x9b, 0xa5, 0xd8, 0x00, 0x5d, 0xfd, 0x4e, 0x81,
0x66, 0x18, 0x41, 0x99, 0x57, 0x35, 0x21, 0x27, 0x7d, 0x29, 0xd7, 0x5d, 0x43, 0x6f, 0x43, 0x89,
0xb7, 0x8d, 0x82, 0xf7, 0x8d, 0x38, 0x6f, 0xd1, 0x52, 0x46, 0xc2, 0x30, 0x03, 0x68, 0x82, 0x88,
0xca, 0x48, 0x46, 0x1d, 0xde, 0x61, 0xe4, 0xb5, 0x08, 0x04, 0x75, 0x61, 0x2e, 0x5e, 0xb4, 0x05,
0x3e, 0xb3, 0x38, 0x29, 0xda, 0xac, 0xe9, 0xbe, 0xce, 0x82, 0x4d, 0x33, 0x56, 0xb3, 0x11, 0xf5,
0xdf, 0x45, 0xa8, 0x45, 0x6e, 0x39, 0x76, 0x93, 0xa4, 0x4a, 0x73, 0xb3, 0xe3, 0x66, 0x7e, 0xbc,
0x73, 0xb8, 0x01, 0x4d, 0x93, 0xe5, 0xea, 0x9e, 0x30, 0x45, 0x16, 0x5c, 0xab, 0x5a, 0x83, 0x43,
0x85, 0x5f, 0xa0, 0x05, 0xa8, 0x39, 0x23, 0xbb, 0xe7, 0xee, 0xf7, 0x3c, 0xf7, 0x88, 0x88, 0x16,
0xa4, 0xea, 0x8c, 0xec, 0xff, 0xdd, 0xd7, 0xdc, 0x23, 0x12, 0x56, 0xb9, 0xa5, 0x63, 0x56, 0xb9,
0x0b, 0x50, 0xb3, 0xf5, 0x87, 0x94, 0x6b, 0xcf, 0x19, 0xd9, 0xac, 0x3b, 0xc9, 0x6b, 0x55, 0x5b,
0x7f, 0xa8, 0xb9, 0x47, 0xf7, 0x47, 0x36, 0x5a, 0x82, 0x96, 0xa5, 0x13, 0xbf, 0x17, 0x6d, 0x6f,
0x2a, 0xac, 0xbd, 0x69, 0x52, 0xf8, 0xfb, 0x61, 0x8b, 0x33, 0x5e, 0x2f, 0x57, 0x4f, 0x51, 0x2f,
0x1b, 0xb6, 0x15, 0x32, 0x82, 0xec, 0xf5, 0xb2, 0x61, 0x5b, 0x92, 0xcd, 0x1b, 0x50, 0xde, 0x63,
0x15, 0x10, 0x69, 0xd7, 0x26, 0x46, 0xa8, 0x75, 0x5a, 0xfc, 0xf0, 0x42, 0x49, 0x0b, 0xd0, 0xd1,
0x5b, 0x50, 0x65, 0xa9, 0x87, 0xd1, 0xd6, 0x33, 0xd1, 0x86, 0x04, 0x94, 0xda, 0xc0, 0x96, 0xaf,
0x33, 0xea, 0x46, 0x36, 0x6a, 0x49, 0x80, 0x5e, 0x81, 0x73, 0x7d, 0x0f, 0xeb, 0x3e, 0x36, 0x56,
0x1e, 0xad, 0xba, 0xf6, 0x50, 0x67, 0xc6, 0xd4, 0x6e, 0x2e, 0x2a, 0x4b, 0x15, 0x2d, 0xed, 0x13,
0x0d, 0x0c, 0x7d, 0xb9, 0x5a, 0xf7, 0x5c, 0xbb, 0x3d, 0xc7, 0x03, 0x43, 0x1c, 0x8a, 0xae, 0x00,
0x04, 0xa1, 0x5b, 0xf7, 0xdb, 0x2d, 0xa6, 0xc5, 0xaa, 0x80, 0xbc, 0xe7, 0xab, 0x5f, 0xc2, 0xf9,
0xd0, 0x42, 0x22, 0xda, 0x18, 0x57, 0xac, 0x72, 0x52, 0xc5, 0x4e, 0xaf, 0x5d, 0xff, 0x5c, 0x80,
0xf9, 0x1d, 0xfd, 0x01, 0x7e, 0xfa, 0x65, 0x72, 0xa6, 0x78, 0xbc, 0x09, 0x67, 0x59, 0x65, 0xbc,
0x1c, 0x39, 0xcf, 0x94, 0x0c, 0x1c, 0x55, 0xe7, 0x38, 0x21, 0x7a, 0x97, 0x96, 0x0e, 0xb8, 0x7f,
0xb8, 0xed, 0x9a, 0x61, 0xf6, 0xbd, 0x92, 0xc2, 0x67, 0x55, 0x62, 0x69, 0x51, 0x0a, 0xb4, 0x3d,
0x1e, 0xda, 0x78, 0xde, 0x7d, 0x61, 0x6a, 0xff, 0x15, 0x4a, 0x3f, 0x19, 0xe1, 0x50, 0x1b, 0xca,
0x22, 0xbb, 0x33, 0xbf, 0xaf, 0x68, 0xc1, 0x12, 0x6d, 0xc3, 0x39, 0x7e, 0x83, 0x1d, 0x61, 0xd4,
0xfc, 0xf2, 0x95, 0x4c, 0x97, 0x4f, 0x23, 0x8d, 0xfb, 0x44, 0xf5, 0xb8, 0x3e, 0xd1, 0x86, 0xb2,
0xb0, 0x53, 0x16, 0x0b, 0x2a, 0x5a, 0xb0, 0xa4, 0x4d, 0x04, 0x84, 0x12, 0x9b, 0x31, 0x0b, 0x78,
0x07, 0x2a, 0xd2, 0x86, 0x73, 0x99, 0x6d, 0x58, 0xd2, 0x24, 0xa3, 0x70, 0x3e, 0x11, 0x85, 0xd5,
0x7f, 0x28, 0x50, 0x5f, 0xa3, 0x87, 0xde, 0x74, 0x07, 0x2c, 0x67, 0xdc, 0x80, 0xa6, 0x87, 0xfb,
0xae, 0x67, 0xf4, 0xb0, 0xe3, 0x7b, 0x26, 0xe6, 0xfd, 0x66, 0x41, 0x6b, 0x70, 0xe8, 0xfb, 0x1c,
0x48, 0xd1, 0x68, 0x60, 0x25, 0xbe, 0x6e, 0x0f, 0x7b, 0xfb, 0xd4, 0x81, 0x73, 0x1c, 0x4d, 0x42,
0x99, 0xff, 0x5e, 0x83, 0x7a, 0x88, 0xe6, 0xbb, 0x6c, 0xff, 0x82, 0x56, 0x93, 0xb0, 0x5d, 0x17,
0x3d, 0x0f, 0x4d, 0x26, 0xb5, 0x9e, 0xe5, 0x0e, 0x7a, 0xb4, 0x37, 0x13, 0xe9, 0xa4, 0x6e, 0x88,
0x63, 0x51, 0x6d, 0xc4, 0xb1, 0x88, 0xf9, 0x05, 0x16, 0x09, 0x45, 0x62, 0xed, 0x98, 0x5f, 0x60,
0x9a, 0xcd, 0x1b, 0x34, 0x3b, 0xde, 0x77, 0x0d, 0xbc, 0x7b, 0xc2, 0x5a, 0x22, 0xc3, 0x5c, 0xee,
0x32, 0x54, 0xe5, 0x0d, 0xc4, 0x95, 0x42, 0x00, 0x5a, 0x87, 0x66, 0x50, 0x66, 0xf6, 0x78, 0xf7,
0x50, 0x98, 0x58, 0xdb, 0x45, 0xf2, 0x1b, 0xd1, 0x1a, 0x01, 0x19, 0x5b, 0xaa, 0xeb, 0x50, 0x8f,
0x7e, 0xa6, 0xbb, 0xee, 0x24, 0x0d, 0x45, 0x02, 0xa8, 0xbd, 0xdd, 0x1f, 0xd9, 0x54, 0xa7, 0x22,
0x74, 0x04, 0x4b, 0xf5, 0x2b, 0x05, 0x1a, 0x22, 0x29, 0xef, 0xc8, 0xb9, 0x31, 0xbb, 0x9a, 0xc2,
0xae, 0xc6, 0xfe, 0x46, 0xff, 0x1d, 0x1f, 0x3a, 0x3d, 0x9f, 0xea, 0xe6, 0x8c, 0x09, 0xab, 0x7f,
0x63, 0x19, 0x39, 0x4b, 0xb7, 0xfa, 0x98, 0x1a, 0x9a, 0x50, 0x0d, 0x33, 0xb4, 0x36, 0x94, 0x75,
0xc3, 0xf0, 0x30, 0x21, 0xe2, 0x1c, 0xc1, 0x92, 0x7e, 0x79, 0x80, 0x3d, 0x12, 0x98, 0x7c, 0x5e,
0x0b, 0x96, 0xe8, 0x2d, 0xa8, 0xc8, 0x82, 0x39, 0x9f, 0x56, 0x24, 0x45, 0xcf, 0x29, 0xba, 0x2b,
0x49, 0xa1, 0x7e, 0x93, 0x83, 0xa6, 0x10, 0xd8, 0x8a, 0xc8, 0x9a, 0xd3, 0x9d, 0x6f, 0x05, 0xea,
0xfb, 0xa1, 0x77, 0x4f, 0x9b, 0xa2, 0x44, 0x83, 0x40, 0x8c, 0x66, 0x96, 0x03, 0xc6, 0xf3, 0x76,
0xe1, 0x54, 0x79, 0xbb, 0x78, 0xcc, 0x18, 0xa5, 0xfe, 0x00, 0x6a, 0x91, 0x2f, 0x2c, 0xb8, 0xf2,
0xb9, 0x8a, 0x10, 0x45, 0xb0, 0x44, 0xf7, 0xc2, 0xb2, 0x84, 0xcb, 0xe0, 0x62, 0xca, 0x26, 0x89,
0x8a, 0x44, 0xfd, 0x83, 0x02, 0x25, 0xc1, 0xf9, 0x2a, 0xd4, 0x44, 0x34, 0x61, 0x25, 0x1b, 0xe7,
0x0e, 0x02, 0x44, 0x6b, 0xb6, 0x27, 0x17, 0x4e, 0x2e, 0x42, 0x25, 0x11, 0x48, 0xca, 0x22, 0xa2,
0x07, 0x9f, 0x22, 0xd1, 0x83, 0x7e, 0x62, 0x81, 0xe3, 0x5b, 0x85, 0xcd, 0x84, 0x35, 0xdc, 0x77,
0x1f, 0x60, 0xef, 0xd1, 0xe9, 0x27, 0x6f, 0x6f, 0x46, 0x2c, 0x35, 0x63, 0x6b, 0x27, 0x09, 0xd0,
0x9b, 0xa1, 0xb8, 0xf3, 0x69, 0x83, 0x87, 0x68, 0xe8, 0x10, 0x76, 0x16, 0x8a, 0xfd, 0xe7, 0x7c,
0x86, 0x18, 0xbf, 0xca, 0x49, 0x4b, 0x92, 0x27, 0xd2, 0x31, 0xa8, 0xbf, 0x54, 0xe0, 0xe2, 0x06,
0xf6, 0xd7, 0xe3, 0x7d, 0xf9, 0xb3, 0x3e, 0x95, 0x0d, 0x9d, 0xb4, 0x43, 0x9d, 0x46, 0xeb, 0x1d,
0xa8, 0xc8, 0x09, 0x03, 0x9f, 0xee, 0xca, 0xb5, 0xfa, 0x63, 0x05, 0xda, 0x62, 0x17, 0xb6, 0x27,
0xad, 0x86, 0x2d, 0xec, 0x63, 0xe3, 0xfb, 0x6e, 0x79, 0xff, 0xae, 0x40, 0x2b, 0x1a, 0xca, 0x59,
0x34, 0x7e, 0x0d, 0x8a, 0x6c, 0xb2, 0x20, 0x4e, 0x30, 0xd3, 0x58, 0x39, 0x36, 0x0d, 0x19, 0xac,
0x42, 0xdb, 0x95, 0x59, 0x47, 0x2c, 0xc3, 0x7c, 0x92, 0x3f, 0x7e, 0x3e, 0x11, 0xf9, 0xd5, 0x1d,
0x51, 0xbe, 0x7c, 0x72, 0x17, 0x02, 0xd4, 0xaf, 0x73, 0xd0, 0x0e, 0x5b, 0x89, 0xef, 0x3d, 0xa0,
0x4f, 0x28, 0x34, 0xf3, 0x4f, 0xa8, 0xd0, 0x2c, 0x1c, 0x37, 0x88, 0xff, 0x2d, 0x07, 0xcd, 0x50,
0x1c, 0xdb, 0x96, 0xee, 0xa0, 0x79, 0x28, 0x0d, 0x2d, 0x3d, 0x9c, 0x08, 0x8a, 0x15, 0xda, 0x91,
0x95, 0x49, 0x5c, 0x00, 0x2f, 0xa5, 0x29, 0x67, 0x82, 0x84, 0xb5, 0x04, 0x0b, 0xda, 0xa2, 0xf1,
0x22, 0x9f, 0x35, 0xda, 0xa2, 0x1a, 0xe2, 0x56, 0x40, 0x7b, 0xec, 0xdb, 0x80, 0x84, 0xea, 0x7a,
0xa6, 0xd3, 0x23, 0xb8, 0xef, 0x3a, 0x06, 0x57, 0x6a, 0x51, 0x6b, 0x89, 0x2f, 0x5d, 0x67, 0x87,
0xc3, 0xd1, 0x6b, 0x50, 0xf0, 0x1f, 0x0d, 0x79, 0x78, 0x6e, 0xa6, 0x86, 0xbd, 0xf0, 0x5c, 0xbb,
0x8f, 0x86, 0x58, 0x63, 0xe8, 0x68, 0x01, 0x80, 0xb2, 0xf2, 0x3d, 0xfd, 0x01, 0xb6, 0x82, 0xdf,
0x32, 0x43, 0x08, 0x35, 0xd3, 0x60, 0x56, 0x51, 0xe6, 0x39, 0x41, 0x2c, 0xd5, 0xbf, 0xe4, 0xa0,
0x15, 0xb2, 0xd4, 0x30, 0x19, 0x59, 0xfe, 0x44, 0xf9, 0x4d, 0x6f, 0xd0, 0x66, 0x65, 0xfa, 0x77,
0xa1, 0x26, 0xe6, 0x26, 0xc7, 0x50, 0x34, 0x70, 0x92, 0xcd, 0x29, 0x96, 0x57, 0x7c, 0x42, 0x96,
0x57, 0x3a, 0xae, 0xe5, 0xed, 0xc0, 0x7c, 0x10, 0xd0, 0x42, 0x84, 0x2d, 0xec, 0xeb, 0x53, 0x2a,
0x89, 0xab, 0x50, 0xe3, 0x89, 0x8a, 0x67, 0x68, 0x5e, 0x5c, 0xc3, 0x9e, 0xec, 0x3a, 0xd5, 0x1f,
0xc2, 0x79, 0x16, 0x10, 0x92, 0xe3, 0xd5, 0x2c, 0xb3, 0x6e, 0x55, 0x96, 0xee, 0xb4, 0x4c, 0xe7,
0xd6, 0x5d, 0xd5, 0x62, 0x30, 0x75, 0x13, 0x9e, 0x4b, 0xf0, 0x3f, 0x45, 0xc0, 0x57, 0xff, 0xaa,
0xc0, 0xc5, 0x35, 0xcf, 0x1d, 0x7e, 0x6c, 0x7a, 0xfe, 0x48, 0xb7, 0xe2, 0x03, 0xfb, 0xa7, 0xd3,
0x7c, 0x7c, 0x10, 0xc9, 0x31, 0x3c, 0xe8, 0xdc, 0x4e, 0x51, 0xd9, 0xf8, 0xa1, 0x84, 0xaa, 0x22,
0x19, 0xe9, 0x5f, 0xf9, 0xb4, 0xc3, 0x0b, 0xbc, 0x19, 0x91, 0x34, 0x4b, 0x0a, 0x4e, 0x9d, 0x46,
0xe4, 0x4f, 0x3a, 0x8d, 0x98, 0x60, 0xfd, 0x85, 0x27, 0x64, 0xfd, 0xc7, 0x2d, 0x9e, 0xd1, 0x07,
0x10, 0x9f, 0x14, 0xb1, 0xb0, 0x73, 0xa2, 0x11, 0xd3, 0x0a, 0x40, 0x38, 0x35, 0x11, 0xaf, 0x2d,
0xb2, 0xb0, 0x89, 0x50, 0x51, 0x6d, 0xc9, 0x48, 0xc3, 0xa6, 0x9d, 0xb1, 0x2e, 0xff, 0x43, 0xe8,
0xa4, 0x59, 0xe9, 0x69, 0x2c, 0xff, 0x9b, 0x1c, 0x40, 0xd7, 0x1e, 0xba, 0x9e, 0xbf, 0xab, 0x93,
0xc3, 0x93, 0x95, 0x4b, 0xd7, 0xa1, 0x11, 0x1a, 0x4c, 0xcf, 0x34, 0x52, 0xac, 0xc8, 0xa0, 0x2e,
0x21, 0xab, 0x36, 0x8a, 0x33, 0x56, 0xc9, 0x19, 0xe8, 0x12, 0x54, 0x3d, 0xf7, 0xa8, 0x47, 0x3d,
0xc8, 0x60, 0xa9, 0xa5, 0xa2, 0x55, 0x3c, 0xf7, 0x88, 0xfa, 0x95, 0x81, 0x2e, 0x40, 0xd9, 0xd7,
0xc9, 0x21, 0x25, 0xe5, 0x45, 0x7f, 0x89, 0x2e, 0xbb, 0x06, 0x3a, 0x0f, 0xc5, 0x7d, 0xd3, 0xc2,
0x3c, 0xf0, 0x55, 0x35, 0xbe, 0x40, 0xaf, 0x07, 0x3f, 0x99, 0x97, 0x33, 0xff, 0xe4, 0xc7, 0x7f,
0x35, 0xff, 0x56, 0x81, 0xb9, 0x50, 0x20, 0xac, 0x9e, 0x41, 0xef, 0xf0, 0xe6, 0x0e, 0xaf, 0xba,
0x06, 0x8f, 0x02, 0xcd, 0x09, 0x53, 0x7d, 0x4e, 0xc8, 0x8b, 0xa0, 0x90, 0x64, 0x5a, 0x3d, 0x49,
0xef, 0x45, 0x2f, 0x6d, 0x1a, 0xc1, 0x8f, 0x0a, 0x25, 0xcf, 0x3d, 0xea, 0x1a, 0x24, 0x90, 0x06,
0x7f, 0x39, 0xc4, 0xab, 0x27, 0x2a, 0x8d, 0x55, 0xf6, 0x78, 0xe8, 0x3a, 0x34, 0xb0, 0xe7, 0xb9,
0x5e, 0xcf, 0xc6, 0x84, 0xe8, 0x03, 0x9e, 0x69, 0xab, 0x5a, 0x9d, 0x01, 0xb7, 0x38, 0x4c, 0xfd,
0x2e, 0x07, 0xcd, 0xf0, 0x2a, 0xc1, 0x4f, 0x09, 0xa6, 0x11, 0xfc, 0x94, 0x60, 0x1a, 0x34, 0xeb,
0x7b, 0x3c, 0xca, 0x85, 0x7a, 0xab, 0x0a, 0x48, 0xd7, 0xa0, 0x61, 0x9e, 0xfa, 0x8e, 0xe3, 0x1a,
0x38, 0xd4, 0x19, 0x04, 0xa0, 0xae, 0x31, 0xae, 0xfa, 0x42, 0x06, 0xd5, 0x17, 0xc7, 0x55, 0x3f,
0x0f, 0xa5, 0xbd, 0x51, 0xff, 0x10, 0xfb, 0xcc, 0xfd, 0xaa, 0x9a, 0x58, 0xc5, 0x4d, 0xa2, 0x9c,
0x30, 0x09, 0xa9, 0xf9, 0x4a, 0x54, 0xf3, 0x97, 0xa0, 0xca, 0x47, 0xd5, 0x3d, 0x9f, 0xb0, 0x1f,
0x02, 0xf2, 0x5a, 0x85, 0x03, 0x76, 0x09, 0x7a, 0x23, 0x28, 0x67, 0x53, 0x07, 0xfb, 0x2c, 0x4e,
0x24, 0x94, 0x2f, 0x8a, 0x59, 0xf5, 0x33, 0x40, 0xe1, 0x97, 0xd3, 0xb5, 0x17, 0x09, 0xa9, 0xe6,
0x92, 0x52, 0xbd, 0xf5, 0x2b, 0x05, 0xce, 0x8e, 0x55, 0xd5, 0xa8, 0x09, 0xf0, 0x91, 0xd3, 0x17,
0xed, 0x46, 0xeb, 0x0c, 0xaa, 0x43, 0x25, 0x68, 0x3e, 0x5a, 0x0a, 0xaa, 0x41, 0x79, 0xd7, 0x65,
0xd8, 0xad, 0x1c, 0x6a, 0x41, 0x9d, 0x13, 0x8e, 0xfa, 0x7d, 0x4c, 0x48, 0x2b, 0x2f, 0x21, 0xeb,
0xba, 0x69, 0x8d, 0x3c, 0xdc, 0x2a, 0xa0, 0x06, 0x54, 0x77, 0x5d, 0x0d, 0x5b, 0x58, 0x27, 0xb8,
0x55, 0x44, 0x08, 0x9a, 0x62, 0x11, 0x10, 0x95, 0x22, 0xb0, 0x80, 0xac, 0x7c, 0x6b, 0x3f, 0x5a,
0xa6, 0xd2, 0xda, 0x0d, 0x5d, 0x80, 0x73, 0x1f, 0x39, 0x06, 0xde, 0x37, 0x1d, 0x6c, 0x84, 0x9f,
0x5a, 0x67, 0xd0, 0x39, 0x98, 0xeb, 0x3a, 0x0e, 0xf6, 0x22, 0x40, 0x85, 0x02, 0xb7, 0xb0, 0x37,
0xc0, 0x11, 0x60, 0x0e, 0x9d, 0x85, 0xc6, 0x96, 0xf9, 0x30, 0x02, 0xca, 0x2f, 0xff, 0xf3, 0x1c,
0x54, 0xd7, 0x74, 0x5f, 0x5f, 0x75, 0x5d, 0xcf, 0x40, 0x43, 0x40, 0xec, 0x8d, 0x84, 0x3d, 0x74,
0x1d, 0xf9, 0x98, 0x08, 0xbd, 0x32, 0x21, 0xba, 0x8e, 0xa3, 0x8a, 0x54, 0xde, 0xb9, 0x39, 0x81,
0x22, 0x81, 0xae, 0x9e, 0x41, 0x36, 0xdb, 0x91, 0xd6, 0xbe, 0xbb, 0x66, 0xff, 0x30, 0xf8, 0x35,
0x6c, 0xca, 0x8e, 0x09, 0xd4, 0x60, 0xc7, 0xc4, 0x1b, 0x25, 0xb1, 0xe0, 0x0f, 0x59, 0x02, 0x33,
0x52, 0xcf, 0xa0, 0xcf, 0xe1, 0xfc, 0x06, 0xf6, 0xc3, 0xb7, 0x0b, 0xc1, 0x86, 0xcb, 0x93, 0x37,
0x1c, 0x43, 0x3e, 0xe6, 0x96, 0x9b, 0x50, 0x64, 0x1d, 0x2c, 0x4a, 0xeb, 0x12, 0xa3, 0x2f, 0x6a,
0x3b, 0x8b, 0x93, 0x11, 0x24, 0xb7, 0xcf, 0x60, 0x2e, 0xf1, 0x62, 0x10, 0xbd, 0x98, 0x42, 0x96,
0xfe, 0xf6, 0xb3, 0x73, 0x2b, 0x0b, 0xaa, 0xdc, 0x6b, 0x00, 0xcd, 0xf8, 0x0b, 0x0b, 0xb4, 0x94,
0x42, 0x9f, 0xfa, 0xda, 0xab, 0xf3, 0x62, 0x06, 0x4c, 0xb9, 0x91, 0x0d, 0xad, 0xe4, 0x0b, 0x36,
0x74, 0x6b, 0x2a, 0x83, 0xb8, 0xb9, 0xbd, 0x94, 0x09, 0x57, 0x6e, 0xf7, 0x88, 0x19, 0xc1, 0xd8,
0x0b, 0x2a, 0x74, 0x27, 0x9d, 0xcd, 0xa4, 0xa7, 0x5d, 0x9d, 0xbb, 0x99, 0xf1, 0xe5, 0xd6, 0x3f,
0xe2, 0x93, 0xb3, 0xb4, 0x57, 0x48, 0xe8, 0xd5, 0x74, 0x76, 0x53, 0x9e, 0x4f, 0x75, 0x96, 0x8f,
0x43, 0x22, 0x0f, 0xf1, 0x25, 0x1b, 0x79, 0xa5, 0xbc, 0xe4, 0x49, 0xfa, 0x5d, 0xc0, 0x6f, 0xf2,
0x13, 0xa5, 0xce, 0xab, 0xc7, 0xa0, 0x90, 0x07, 0x70, 0x93, 0x6f, 0x04, 0x03, 0x37, 0xbc, 0x3b,
0xd3, 0x6a, 0x4e, 0xe6, 0x83, 0x9f, 0xc2, 0x5c, 0xe2, 0x77, 0xc7, 0x54, 0xaf, 0x49, 0xff, 0x6d,
0xb2, 0x33, 0x2d, 0xdb, 0x70, 0x97, 0x4c, 0x4c, 0x10, 0xd1, 0x04, 0xeb, 0x4f, 0x99, 0x32, 0x76,
0x6e, 0x65, 0x41, 0x95, 0x17, 0x21, 0x2c, 0x5c, 0x26, 0xa6, 0x70, 0xe8, 0x76, 0x3a, 0x8f, 0xf4,
0x09, 0x62, 0xe7, 0xe5, 0x8c, 0xd8, 0x72, 0xd3, 0x1e, 0xc0, 0x06, 0xf6, 0xb7, 0xb0, 0xef, 0x51,
0x1b, 0xb9, 0x99, 0x2a, 0xf2, 0x10, 0x21, 0xd8, 0xe6, 0x85, 0x99, 0x78, 0x72, 0x83, 0xff, 0x03,
0x14, 0xa4, 0xd8, 0xc8, 0xaf, 0xde, 0xd7, 0xa7, 0xce, 0x33, 0xf8, 0xf0, 0x61, 0x96, 0x6e, 0x3e,
0x87, 0xd6, 0x96, 0xee, 0xd0, 0x2a, 0x3e, 0xe4, 0x7b, 0x3b, 0xf5, 0x60, 0x49, 0xb4, 0x09, 0xd2,
0x9a, 0x88, 0x2d, 0x2f, 0x73, 0x24, 0x73, 0xa8, 0x2e, 0x5d, 0x10, 0x27, 0x63, 0x4b, 0x28, 0x8d,
0x04, 0xe2, 0x84, 0xd8, 0x32, 0x05, 0x5f, 0x6e, 0xfc, 0x58, 0x61, 0x2f, 0x51, 0x13, 0x08, 0x9f,
0x98, 0xfe, 0xc1, 0xb6, 0xa5, 0x3b, 0x24, 0xcb, 0x11, 0x18, 0xe2, 0x31, 0x8e, 0x20, 0xf0, 0xe5,
0x11, 0x0c, 0x68, 0xc4, 0xc6, 0x05, 0x28, 0xed, 0xa7, 0xeb, 0xb4, 0x81, 0x45, 0x67, 0x69, 0x36,
0xa2, 0xdc, 0xe5, 0x00, 0x1a, 0x81, 0xbd, 0x72, 0xe1, 0xbe, 0x38, 0xe9, 0xa4, 0x21, 0xce, 0x04,
0x77, 0x4b, 0x47, 0x8d, 0xba, 0xdb, 0x78, 0x27, 0x88, 0xb2, 0x4d, 0x10, 0xa6, 0xb9, 0xdb, 0xe4,
0xf6, 0x52, 0x3d, 0x83, 0xb6, 0xa1, 0xc4, 0x4b, 0x60, 0x74, 0x65, 0x6a, 0xdd, 0xdc, 0xb9, 0x31,
0xf5, 0x73, 0xc8, 0x71, 0xf9, 0x37, 0x45, 0xa8, 0x04, 0xbf, 0x26, 0x3e, 0x83, 0x1a, 0xef, 0x19,
0x14, 0x5d, 0x9f, 0xc2, 0x5c, 0xe2, 0xe1, 0x61, 0x6a, 0x4c, 0x4e, 0x7f, 0x9c, 0x38, 0x2b, 0xa8,
0x7c, 0x22, 0xfe, 0x1d, 0x49, 0xc6, 0xdf, 0x17, 0x26, 0x15, 0x6e, 0xc9, 0xd0, 0x3b, 0x83, 0xf1,
0x53, 0x0f, 0xb4, 0xf7, 0x01, 0x22, 0x81, 0x70, 0xfa, 0xc0, 0x98, 0xfa, 0xf6, 0xac, 0x03, 0xaf,
0x67, 0x35, 0xd5, 0xe9, 0x7c, 0x56, 0xee, 0xfd, 0xff, 0xab, 0x03, 0xd3, 0x3f, 0x18, 0xed, 0xd1,
0x2f, 0x77, 0x39, 0xea, 0xcb, 0xa6, 0x2b, 0xfe, 0xba, 0x1b, 0x58, 0xc6, 0x5d, 0x46, 0x7d, 0x97,
0x32, 0x1f, 0xee, 0xed, 0x95, 0xd8, 0xea, 0xde, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc0, 0xfc,
0x98, 0x50, 0xf8, 0x36, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -56,6 +56,7 @@ type importManager struct {
cancel context.CancelFunc // reserved
taskStore kv.MetaKv // Persistent task info storage.
// TODO: Make pendingTask a map to improve look up performance.
pendingTasks []*datapb.ImportTaskInfo // pending tasks
workingTasks map[int64]*datapb.ImportTaskInfo // in-progress tasks
pendingLock sync.RWMutex // lock pending task list
@ -88,33 +89,25 @@ func newImportManager(ctx context.Context, client kv.MetaKv, importService func(
func (m *importManager) init() error {
// Read tasks from etcd and save them as pendingTasks or workingTasks.
m.load()
// trigger Import() action to DataCoord
m.pushTasks()
m.sendOutTasks()
return nil
}
func (m *importManager) pushTasks() error {
// sendOutTasks pushes all pending tasks to DataCoord, gets DataCoord response and re-add these tasks as working tasks.
func (m *importManager) sendOutTasks() error {
m.pendingLock.Lock()
defer m.pendingLock.Unlock()
// trigger Import() action to DataCoord
for {
if len(m.pendingTasks) == 0 {
log.Debug("import manger pending task list is empty")
break
}
// Trigger Import() action to DataCoord.
for len(m.pendingTasks) > 0 {
task := m.pendingTasks[0]
log.Debug("import manager send import task", zap.Int64("taskID", task.Id))
dbTask := &datapb.ImportTask{
CollectionName: task.GetCollectionId(),
PartitionName: task.GetPartitionId(),
RowBased: task.GetRowBased(),
TaskId: task.GetId(),
Files: task.GetFiles(),
it := &datapb.ImportTask{
CollectionId: task.GetCollectionId(),
PartitionId: task.GetPartitionId(),
RowBased: task.GetRowBased(),
TaskId: task.GetId(),
Files: task.GetFiles(),
Infos: []*commonpb.KeyValuePair{
{
Key: Bucket,
@ -123,14 +116,17 @@ func (m *importManager) pushTasks() error {
},
}
// call DataCoord.Import()
resp := m.callImportService(m.ctx, dbTask)
log.Debug("sending import task to DataCoord", zap.Int64("taskID", task.GetId()))
// Call DataCoord.Import().
resp := m.callImportService(m.ctx, it)
if resp.Status.ErrorCode == commonpb.ErrorCode_UnexpectedError {
log.Debug("import task is rejected", zap.Int64("task ID", dbTask.TaskId))
log.Debug("import task is rejected", zap.Int64("task ID", it.GetTaskId()))
break
}
task.DatanodeId = resp.GetDatanodeId()
log.Debug("import task is assigned", zap.Int64("task ID", dbTask.TaskId), zap.Int64("datanode id", task.DatanodeId))
log.Debug("import task successfully assigned to DataNode",
zap.Int64("task ID", it.GetTaskId()),
zap.Int64("DataNode ID", task.GetDatanodeId()))
// erase this task from head of pending list if the callImportService succeed
m.pendingTasks = m.pendingTasks[1:]
@ -139,11 +135,9 @@ func (m *importManager) pushTasks() error {
m.workingLock.Lock()
defer m.workingLock.Unlock()
log.Debug("import task was taken to execute", zap.Int64("task ID", dbTask.TaskId))
// TODO: Guard nil task state.
log.Debug("import task added as working task", zap.Int64("task ID", it.TaskId))
task.State.StateCode = commonpb.ImportState_ImportPending
m.workingTasks[task.Id] = task
m.workingTasks[task.GetId()] = task
m.updateImportTask(task)
}()
}
@ -167,7 +161,9 @@ func (m *importManager) genReqID() int64 {
return m.lastReqID
}
func (m *importManager) importJob(req *milvuspb.ImportRequest) *milvuspb.ImportResponse {
// importJob processes the import request, generates import tasks, sends these tasks to DataCoord, and returns
// immediately.
func (m *importManager) importJob(req *milvuspb.ImportRequest, cID int64) *milvuspb.ImportResponse {
if req == nil || len(req.Files) == 0 {
return &milvuspb.ImportResponse{
Status: &commonpb.Status{
@ -192,7 +188,9 @@ func (m *importManager) importJob(req *milvuspb.ImportRequest) *milvuspb.ImportR
},
}
log.Debug("import manager receive request", zap.String("collection", req.GetCollectionName()))
log.Debug("request received",
zap.String("collection name", req.GetCollectionName()),
zap.Int64("collection ID", cID))
func() {
m.pendingLock.Lock()
defer m.pendingLock.Unlock()
@ -225,14 +223,13 @@ func (m *importManager) importJob(req *milvuspb.ImportRequest) *milvuspb.ImportR
reqID := m.genReqID()
// convert import request to import tasks
if req.RowBased {
// for row-based, each file is a task
// For row-based importing, each file makes a task.
taskList := make([]int64, len(req.Files))
for i := 0; i < len(req.Files); i++ {
newTask := &datapb.ImportTaskInfo{
Id: m.nextTaskID,
RequestId: reqID,
CollectionId: req.GetCollectionName(),
PartitionId: req.GetPartitionName(),
CollectionId: cID,
Bucket: bucket,
RowBased: req.GetRowBased(),
Files: []string{req.GetFiles()[i]},
@ -241,20 +238,20 @@ func (m *importManager) importJob(req *milvuspb.ImportRequest) *milvuspb.ImportR
StateCode: commonpb.ImportState_ImportPending,
},
}
taskList[i] = newTask.GetId()
m.nextTaskID++
log.Info("new task created as pending task", zap.Int64("task ID", newTask.GetId()))
m.pendingTasks = append(m.pendingTasks, newTask)
m.saveImportTask(newTask)
}
log.Info("process row-based import request", zap.Int64("reqID", reqID), zap.Any("taskIDs", taskList))
log.Info("row-based import request processed", zap.Int64("reqID", reqID), zap.Any("taskIDs", taskList))
} else {
// TODO: Merge duplicated code :(
// for column-based, all files is a task
newTask := &datapb.ImportTaskInfo{
Id: m.nextTaskID,
RequestId: reqID,
CollectionId: req.GetCollectionName(),
PartitionId: req.GetPartitionName(),
CollectionId: cID,
Bucket: bucket,
RowBased: req.GetRowBased(),
Files: req.GetFiles(),
@ -264,55 +261,56 @@ func (m *importManager) importJob(req *milvuspb.ImportRequest) *milvuspb.ImportR
},
}
m.nextTaskID++
log.Info("new task created as pending task", zap.Int64("task ID", newTask.GetId()))
m.pendingTasks = append(m.pendingTasks, newTask)
m.saveImportTask(newTask)
log.Info("process column-based import request", zap.Int64("reqID", reqID), zap.Int64("taskID", newTask.Id))
log.Info("column-based import request processed", zap.Int64("reqID", reqID), zap.Int64("taskID", newTask.GetId()))
}
}()
m.pushTasks()
m.sendOutTasks()
return resp
}
func (m *importManager) updateTaskState(state *rootcoordpb.ImportResult) error {
if state == nil {
return errors.New("import task state is nil")
// updateTaskState updates the task's state in task store given ImportResult result, and returns the ImportTaskInfo of
// the given task.
func (m *importManager) updateTaskState(ir *rootcoordpb.ImportResult) (*datapb.ImportTaskInfo, error) {
if ir == nil {
return nil, errors.New("import result is nil")
}
log.Debug("import manager update task state", zap.Int64("taskID", state.GetTaskId()))
log.Debug("import manager update task import result", zap.Int64("taskID", ir.GetTaskId()))
found := false
var v *datapb.ImportTaskInfo
func() {
m.workingLock.Lock()
defer m.workingLock.Unlock()
for k, v := range m.workingTasks {
if state.TaskId == k {
found = true
v.State.StateCode = state.GetState()
v.State.Segments = state.GetSegments()
v.State.RowCount = state.GetRowCount()
for _, kv := range state.GetInfos() {
if kv.GetKey() == FailedReason {
v.State.ErrorMessage = kv.GetValue()
break
}
ok := false
if v, ok = m.workingTasks[ir.TaskId]; ok {
found = true
v.State.StateCode = ir.GetState()
v.State.Segments = ir.GetSegments()
v.State.RowCount = ir.GetRowCount()
for _, kv := range ir.GetInfos() {
if kv.GetKey() == FailedReason {
v.State.ErrorMessage = kv.GetValue()
break
}
// Update task in task store.
m.updateImportTask(v)
}
// Update task in task store.
m.updateImportTask(v)
}
m.updateImportTask(v)
}()
if !found {
log.Debug("import manager update task state failed", zap.Int64("taskID", state.GetTaskId()))
return errors.New("failed to update import task, id not found: " + strconv.FormatInt(state.TaskId, 10))
log.Debug("import manager update task import result failed", zap.Int64("taskID", ir.GetTaskId()))
return nil, errors.New("failed to update import task, ID not found: " + strconv.FormatInt(ir.TaskId, 10))
}
return nil
return v, nil
}
func (m *importManager) getTaskState(id int64) *milvuspb.GetImportStateResponse {
// getTaskState looks for task with the given ID and returns its import state.
func (m *importManager) getTaskState(tID int64) *milvuspb.GetImportStateResponse {
resp := &milvuspb.GetImportStateResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
@ -320,15 +318,13 @@ func (m *importManager) getTaskState(id int64) *milvuspb.GetImportStateResponse
},
}
log.Debug("import manager get task state", zap.Int64("taskID", id))
log.Debug("getting import task state", zap.Int64("taskID", tID))
found := false
func() {
m.pendingLock.Lock()
defer m.pendingLock.Unlock()
for i := 0; i < len(m.pendingTasks); i++ {
if id == m.pendingTasks[i].Id {
if tID == m.pendingTasks[i].Id {
resp.Status = &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
}
@ -338,7 +334,6 @@ func (m *importManager) getTaskState(id int64) *milvuspb.GetImportStateResponse
}
}
}()
if found {
return resp
}
@ -346,36 +341,33 @@ func (m *importManager) getTaskState(id int64) *milvuspb.GetImportStateResponse
func() {
m.workingLock.Lock()
defer m.workingLock.Unlock()
for k, v := range m.workingTasks {
if id == k {
found = true
resp.Status = &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
}
resp.State = v.GetState().GetStateCode()
resp.RowCount = v.GetState().GetRowCount()
resp.IdList = v.GetState().GetRowIds()
resp.Infos = append(resp.Infos, &commonpb.KeyValuePair{Key: FailedReason, Value: v.GetState().GetErrorMessage()})
break
if v, ok := m.workingTasks[tID]; ok {
found = true
resp.Status = &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
}
resp.State = v.GetState().GetStateCode()
resp.RowCount = v.GetState().GetRowCount()
resp.IdList = v.GetState().GetRowIds()
resp.Infos = append(resp.Infos, &commonpb.KeyValuePair{
Key: FailedReason,
Value: v.GetState().GetErrorMessage(),
})
}
}()
if !found {
log.Debug("import manager get task state failed", zap.Int64("taskID", id))
if found {
return resp
}
log.Debug("get import task state failed", zap.Int64("taskID", tID))
return resp
}
// load Loads task info from Etcd when RootCoord (re)starts.
// load Loads task info from task store when RootCoord (re)starts.
func (m *importManager) load() error {
log.Info("Import manager starts loading from Etcd")
log.Info("import manager starts loading from Etcd")
_, v, err := m.taskStore.LoadWithPrefix(Params.RootCoordCfg.ImportTaskSubPath)
if err != nil {
log.Error("RootCoord Import manager failed to load from Etcd", zap.Error(err))
log.Error("import manager failed to load from Etcd", zap.Error(err))
return err
}
m.workingLock.Lock()
@ -385,17 +377,17 @@ func (m *importManager) load() error {
for i := range v {
ti := &datapb.ImportTaskInfo{}
if err := proto.Unmarshal([]byte(v[i]), ti); err != nil {
log.Error("Failed to unmarshal proto", zap.String("taskInfo", v[i]), zap.Error(err))
log.Error("failed to unmarshal proto", zap.String("taskInfo", v[i]), zap.Error(err))
// Ignore bad protos.
continue
}
// Put tasks back to pending or working task list, given their import states.
if ti.GetState().GetStateCode() == commonpb.ImportState_ImportPending {
log.Info("Task has been reloaded as a pending task", zap.Int64("TaskID", ti.Id))
log.Info("task has been reloaded as a pending task", zap.Int64("TaskID", ti.GetId()))
m.pendingTasks = append(m.pendingTasks, ti)
} else {
log.Info("Task has been reloaded as a working tasks", zap.Int64("TaskID", ti.Id))
m.workingTasks[ti.Id] = ti
log.Info("task has been reloaded as a working tasks", zap.Int64("TaskID", ti.GetId()))
m.workingTasks[ti.GetId()] = ti
}
}
return nil
@ -403,41 +395,51 @@ func (m *importManager) load() error {
// saveImportTask signs a lease and saves import task info into Etcd with this lease.
func (m *importManager) saveImportTask(task *datapb.ImportTaskInfo) error {
log.Info("Saving import task to Etcd", zap.Int64("Task ID", task.Id))
log.Debug("saving import task to Etcd", zap.Int64("Task ID", task.GetId()))
// TODO: Change default lease time and read it into config, once we figure out a proper value.
// Sign a lease.
leaseID, err := m.taskStore.Grant(10800) /*3 hours*/
if err != nil {
log.Error("Failed to grant lease from Etcd for data import.", zap.Int64("Task ID", task.Id), zap.Error(err))
log.Error("failed to grant lease from Etcd for data import",
zap.Int64("Task ID", task.GetId()),
zap.Error(err))
return err
}
log.Info("Lease granted for task", zap.Int64("Task ID", task.Id))
log.Debug("lease granted for task", zap.Int64("Task ID", task.GetId()))
var taskInfo []byte
if taskInfo, err = proto.Marshal(task); err != nil {
log.Error("Failed to marshall task proto", zap.Int64("Task ID", task.Id), zap.Error(err))
log.Error("failed to marshall task proto", zap.Int64("Task ID", task.GetId()), zap.Error(err))
return err
} else if err = m.taskStore.SaveWithLease(BuildImportTaskKey(task.Id), string(taskInfo), leaseID); err != nil {
log.Error("Failed to save import task info into Etcd", zap.Int64("Task ID", task.Id), zap.Error(err))
} else if err = m.taskStore.SaveWithLease(BuildImportTaskKey(task.GetId()), string(taskInfo), leaseID); err != nil {
log.Error("failed to save import task info into Etcd",
zap.Int64("task ID", task.GetId()),
zap.Error(err))
return err
}
log.Info("Task info successfully saved.", zap.Int64("Task ID", task.Id))
log.Debug("task info successfully saved", zap.Int64("Task ID", task.GetId()))
return nil
}
// updateImportTask updates the task info in Etcd according to task ID. It won't change the lease on the key.
func (m *importManager) updateImportTask(task *datapb.ImportTaskInfo) error {
log.Info("Updating import task.", zap.Int64("Task ID", task.Id))
if taskInfo, err := proto.Marshal(task); err != nil {
log.Error("Failed to marshall task proto.", zap.Int64("Task ID", task.Id), zap.Error(err))
func (m *importManager) updateImportTask(ti *datapb.ImportTaskInfo) error {
log.Debug("updating import task info in Etcd", zap.Int64("Task ID", ti.GetId()))
if taskInfo, err := proto.Marshal(ti); err != nil {
log.Error("failed to marshall task info proto", zap.Int64("Task ID", ti.GetId()), zap.Error(err))
return err
} else if err = m.taskStore.SaveWithIgnoreLease(BuildImportTaskKey(task.Id), string(taskInfo)); err != nil {
log.Error("Failed to update import task info in Etcd.", zap.Int64("Task ID", task.Id), zap.Error(err))
} else if err = m.taskStore.SaveWithIgnoreLease(BuildImportTaskKey(ti.GetId()), string(taskInfo)); err != nil {
log.Error("failed to update import task info info in Etcd", zap.Int64("Task ID", ti.GetId()), zap.Error(err))
return err
}
log.Info("Task info successfully updated.", zap.Int64("Task ID", task.Id))
log.Debug("task info successfully updated in Etcd", zap.Int64("Task ID", ti.GetId()))
return nil
}
// bringSegmentsOnline brings the segments online so that data in these segments become searchable.
func (m *importManager) bringSegmentsOnline(ti *datapb.ImportTaskInfo) {
log.Info("Bringing import tasks segments online!", zap.Int64("Task ID", ti.GetId()))
// TODO: Implement it.
}
// BuildImportTaskKey constructs and returns an Etcd key with given task ID.
func BuildImportTaskKey(taskID int64) string {
return fmt.Sprintf("%s%s%d", Params.RootCoordCfg.ImportTaskSubPath, delimiter, taskID)

View File

@ -70,10 +70,11 @@ func TestImportManager_NewImportManager(t *testing.T) {
func TestImportManager_ImportJob(t *testing.T) {
Params.RootCoordCfg.ImportTaskSubPath = "test_import_task"
colID := int64(100)
mockKv := &kv.MockMetaKV{}
mockKv.InMemKv = make(map[string]string)
mgr := newImportManager(context.TODO(), mockKv, nil)
resp := mgr.importJob(nil)
resp := mgr.importJob(nil, colID)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
rowReq := &milvuspb.ImportRequest{
@ -83,7 +84,7 @@ func TestImportManager_ImportJob(t *testing.T) {
Files: []string{"f1", "f2", "f3"},
}
resp = mgr.importJob(rowReq)
resp = mgr.importJob(rowReq, colID)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
colReq := &milvuspb.ImportRequest{
@ -108,12 +109,12 @@ func TestImportManager_ImportJob(t *testing.T) {
}
mgr = newImportManager(context.TODO(), mockKv, fn)
resp = mgr.importJob(rowReq)
resp = mgr.importJob(rowReq, colID)
assert.Equal(t, len(rowReq.Files), len(mgr.pendingTasks))
assert.Equal(t, 0, len(mgr.workingTasks))
mgr = newImportManager(context.TODO(), mockKv, fn)
resp = mgr.importJob(colReq)
resp = mgr.importJob(colReq, colID)
assert.Equal(t, 1, len(mgr.pendingTasks))
assert.Equal(t, 0, len(mgr.workingTasks))
@ -126,12 +127,12 @@ func TestImportManager_ImportJob(t *testing.T) {
}
mgr = newImportManager(context.TODO(), mockKv, fn)
resp = mgr.importJob(rowReq)
resp = mgr.importJob(rowReq, colID)
assert.Equal(t, 0, len(mgr.pendingTasks))
assert.Equal(t, len(rowReq.Files), len(mgr.workingTasks))
mgr = newImportManager(context.TODO(), mockKv, fn)
resp = mgr.importJob(colReq)
resp = mgr.importJob(colReq, colID)
assert.Equal(t, 0, len(mgr.pendingTasks))
assert.Equal(t, 1, len(mgr.workingTasks))
@ -153,13 +154,14 @@ func TestImportManager_ImportJob(t *testing.T) {
}
mgr = newImportManager(context.TODO(), mockKv, fn)
resp = mgr.importJob(rowReq)
resp = mgr.importJob(rowReq, colID)
assert.Equal(t, len(rowReq.Files)-2, len(mgr.pendingTasks))
assert.Equal(t, 2, len(mgr.workingTasks))
}
func TestImportManager_TaskState(t *testing.T) {
Params.RootCoordCfg.ImportTaskSubPath = "test_import_task"
colID := int64(100)
mockKv := &kv.MockMetaKV{}
mockKv.InMemKv = make(map[string]string)
fn := func(ctx context.Context, req *datapb.ImportTask) *datapb.ImportTaskResponse {
@ -178,12 +180,12 @@ func TestImportManager_TaskState(t *testing.T) {
}
mgr := newImportManager(context.TODO(), mockKv, fn)
mgr.importJob(rowReq)
mgr.importJob(rowReq, colID)
state := &rootcoordpb.ImportResult{
TaskId: 10000,
}
err := mgr.updateTaskState(state)
_, err := mgr.updateTaskState(state)
assert.NotNil(t, err)
state = &rootcoordpb.ImportResult{
@ -201,8 +203,16 @@ func TestImportManager_TaskState(t *testing.T) {
},
},
}
err = mgr.updateTaskState(state)
assert.Nil(t, err)
ti, err := mgr.updateTaskState(state)
assert.NoError(t, err)
assert.Equal(t, int64(1), ti.GetId())
assert.Equal(t, int64(100), ti.GetCollectionId())
assert.Equal(t, int64(100), ti.GetCollectionId())
assert.Equal(t, int64(0), ti.GetPartitionId())
assert.Equal(t, true, ti.GetRowBased())
assert.Equal(t, []string{"f2"}, ti.GetFiles())
assert.Equal(t, commonpb.ImportState_ImportCompleted, ti.GetState().GetStateCode())
assert.Equal(t, int64(1000), ti.GetState().GetRowCount())
resp := mgr.getTaskState(10000)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.Status.ErrorCode)

View File

@ -84,7 +84,11 @@ func metricProxy(v int64) string {
return fmt.Sprintf("client_%d", v)
}
var Params paramtable.ComponentParam
var (
Params paramtable.ComponentParam
CheckCompleteIndexInterval = 3 * time.Minute
TaskTimeLimit = 3 * time.Hour
)
// Core root coordinator core
type Core struct {
@ -833,13 +837,13 @@ func (c *Core) SetIndexCoord(s types.IndexCoord) error {
log.Error("RootCoord failed to get index states from IndexCoord.", zap.Error(err))
return nil, err
}
log.Debug("got index states", zap.String("get index state result", res.String()))
if res.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success {
log.Error("Get index states failed.",
zap.String("error_code", res.GetStatus().GetErrorCode().String()),
zap.String("reason", res.GetStatus().GetReason()))
return nil, fmt.Errorf(res.GetStatus().GetErrorCode().String())
}
log.Debug("Successfully got index states.")
return res.GetStates(), nil
}
return nil
@ -2230,7 +2234,7 @@ func (c *Core) AlterAlias(ctx context.Context, in *milvuspb.AlterAliasRequest) (
return succStatus(), nil
}
// Import data files(json, numpy, etc.) on MinIO/S3 storage, read and parse them into sealed segments
// Import imports large files (json, numpy, etc.) on MinIO/S3 storage into Milvus storage.
func (c *Core) Import(ctx context.Context, req *milvuspb.ImportRequest) (*milvuspb.ImportResponse, error) {
if code, ok := c.checkHealthy(); !ok {
return &milvuspb.ImportResponse{
@ -2238,11 +2242,25 @@ func (c *Core) Import(ctx context.Context, req *milvuspb.ImportRequest) (*milvus
}, nil
}
log.Info("receive import request")
resp := c.importManager.importJob(req)
// Get collection/partition ID from collection/partition name.
var cID int64
var ok bool
if cID, ok = c.MetaTable.collName2ID[req.GetCollectionName()]; !ok {
log.Error("failed to find collection ID for collection name",
zap.String("collection name", req.GetCollectionName()))
return nil, fmt.Errorf("collection ID not found for collection name %s", req.GetCollectionName())
}
log.Info("receive import request",
zap.String("collection name", req.GetCollectionName()),
zap.Int64("collection ID", cID),
zap.String("partition name", req.GetPartitionName()),
zap.Int("# of files = ", len(req.GetFiles())),
)
resp := c.importManager.importJob(req, cID)
return resp, nil
}
// TODO: Implement this.
// Check import task state from datanode
func (c *Core) GetImportState(ctx context.Context, req *milvuspb.GetImportStateRequest) (*milvuspb.GetImportStateResponse, error) {
if code, ok := c.checkHealthy(); !ok {
@ -2261,21 +2279,39 @@ func (c *Core) GetImportState(ctx context.Context, req *milvuspb.GetImportStateR
return resp, nil
}
// Report impot task state to rootcoord
// ReportImport reports import task state to RootCoord.
func (c *Core) ReportImport(ctx context.Context, req *rootcoordpb.ImportResult) (*commonpb.Status, error) {
if code, ok := c.checkHealthy(); !ok {
return failStatus(commonpb.ErrorCode_UnexpectedError, "StateCode="+internalpb.StateCode_name[int32(code)]), nil
}
log.Info("receive import state report")
err := c.importManager.updateTaskState(req)
// Upon receiving ReportImport request, update the related task's state in task store.
ti, err := c.importManager.updateTaskState(req)
if err != nil {
return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
ErrorCode: commonpb.ErrorCode_UpdateImportTaskFailure,
Reason: err.Error(),
}, nil
}
// Reverse look up collection name on collection ID.
var colName string
for k, v := range c.MetaTable.collName2ID {
if v == ti.GetCollectionId() {
colName = k
}
}
if colName == "" {
log.Error("Collection name not found for collection ID", zap.Int64("collection ID", ti.GetCollectionId()))
return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_CollectionNameNotFound,
Reason: "Collection name not found for collection ID" + strconv.FormatInt(ti.GetCollectionId(), 10),
}, nil
}
// Start a loop to check segments' index states periodically.
c.wg.Add(1)
go c.CheckCompleteIndexLoop(ctx, ti, colName, req.Segments)
return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_Success,
@ -2300,7 +2336,7 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
if err != nil {
return 0, err
}
log.Debug("Got index description", zap.String("index_description", indexDescriptionResp.String()))
log.Debug("got index description", zap.String("index_description", indexDescriptionResp.String()))
// Check if the target index name exists.
matchIndexID := int64(-1)
@ -2315,6 +2351,7 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
if !foundIndexID {
return 0, fmt.Errorf("no index is created")
}
log.Debug("found match index ID", zap.Int64("match index ID", matchIndexID))
getIndexStatesRequest := &indexpb.GetIndexStatesRequest{
IndexBuildIDs: make([]UniqueID, 0),
@ -2331,6 +2368,9 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
}
segmentDesc, err := c.DescribeSegment(ctx, describeSegmentRequest)
if err != nil {
log.Error("Failed to describe segment",
zap.Int64("collection ID", collectionID),
zap.Int64("segment ID", segmentID))
return 0, err
}
if segmentDesc.IndexID == matchIndexID {
@ -2339,16 +2379,15 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
}
}
}
log.Debug("Proxy GetIndexState", zap.Int("IndexBuildIDs", len(getIndexStatesRequest.IndexBuildIDs)), zap.Error(err))
log.Debug("proxy GetIndexState", zap.Int("# of IndexBuildIDs", len(getIndexStatesRequest.IndexBuildIDs)), zap.Error(err))
// Return early on empty results.
if len(getIndexStatesRequest.IndexBuildIDs) == 0 {
log.Info("Empty index build IDs returned.", zap.String("collection name", collectionName), zap.Int64("collection ID", collectionID))
log.Info("empty index build IDs returned", zap.String("collection name", collectionName), zap.Int64("collection ID", collectionID))
return 0, nil
}
states, err := c.CallGetIndexStatesService(ctx, getIndexStatesRequest.IndexBuildIDs)
if err != nil {
log.Error("Failed to get index state in checkSegmentIndexStates.", zap.Error(err))
log.Error("failed to get index state in checkSegmentIndexStates", zap.Error(err))
return 0, err
}
@ -2359,7 +2398,7 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
ct++
}
}
log.Info("Segment indexing state checked.",
log.Info("segment indexing state checked",
zap.Int("# of checked segment", len(states)),
zap.Int("# of segments with complete index", ct),
zap.String("collection name", collectionName),
@ -2367,3 +2406,50 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
)
return ct, nil
}
// CheckCompleteIndexLoop checks index build states for an import task's segments and bring these segments online when
// the criteria are met. CheckCompleteIndexLoop does the check every CheckCompleteIndexInterval and exits if:
// (1) a certain percent of indices are built, (2) when context is done or (3) when the task is expired.
func (c *Core) CheckCompleteIndexLoop(ctx context.Context, ti *datapb.ImportTaskInfo, colName string, segIDs []UniqueID) {
defer c.wg.Done()
ticker := time.NewTicker(CheckCompleteIndexInterval)
spent := time.Duration(time.Unix(time.Now().Unix()-ti.GetCreateTs(), 0).Nanosecond())
log.Info("reporting task time left",
zap.Int64("task ID", ti.GetId()),
zap.Int64("minutes remaining", int64((TaskTimeLimit-spent).Minutes())))
// TODO: Replace with real task time limit.
expireTicker := time.NewTicker(TaskTimeLimit - spent)
for {
select {
case <-c.ctx.Done():
log.Info("(in loop)context done, exiting CheckCompleteIndexLoop", zap.Int64("task ID", ti.GetId()))
return
case <-ticker.C:
log.Info("(in loop)check segments' index states", zap.Int64("task ID", ti.GetId()))
if ct, err := c.CountCompleteIndex(ctx, colName, ti.GetCollectionId(), segIDs); err == nil &&
segmentsOnlineReady(ct, len(segIDs)) {
log.Info("(in loop)segment indices are ready",
zap.Int64("task ID", ti.GetId()),
zap.Int("total # of segments", len(segIDs)),
zap.Int("# of segments with index ready", ct))
c.importManager.bringSegmentsOnline(ti)
return
}
case <-expireTicker.C:
log.Info("(in loop)task has expired, stop waiting for segment results", zap.Int64("task ID", ti.GetId()))
return
}
}
}
// segmentsOnlineReady returns true if segments are ready to go up online (a.k.a. searchable).
func segmentsOnlineReady(idxBuilt, segCount int) bool {
// Consider segments are ready when:
// (1) all but up to 2 segments have indices ready, or
// (2) over 85% of segments have indices ready.
if segCount-idxBuilt <= 2 || float64(idxBuilt)/float64(segCount) > 0.85 {
return true
}
return false
}

View File

@ -27,6 +27,8 @@ import (
"testing"
"time"
"github.com/milvus-io/milvus/internal/log"
"github.com/golang/protobuf/proto"
"github.com/milvus-io/milvus/internal/common"
"github.com/milvus-io/milvus/internal/kv"
@ -61,6 +63,8 @@ const (
returnUnsuccessfulStatus = "ReturnUnsuccessfulStatus"
)
var disabledIndexBuildID []int64
type ctxKey struct{}
type proxyMock struct {
@ -264,8 +268,10 @@ func (idx *indexMock) getFileArray() []string {
func (idx *indexMock) GetIndexStates(ctx context.Context, req *indexpb.GetIndexStatesRequest) (*indexpb.GetIndexStatesResponse, error) {
v := ctx.Value(ctxKey{}).(string)
if v == returnError {
log.Debug("(testing) simulating injected error")
return nil, fmt.Errorf("injected error")
} else if v == returnUnsuccessfulStatus {
log.Debug("(testing) simulating unsuccessful status")
return &indexpb.GetIndexStatesResponse{
Status: &commonpb.Status{
ErrorCode: 100,
@ -279,10 +285,23 @@ func (idx *indexMock) GetIndexStates(ctx context.Context, req *indexpb.GetIndexS
Reason: "all good",
},
}
for range req.IndexBuildIDs {
resp.States = append(resp.States, &indexpb.IndexInfo{
State: commonpb.IndexState_Finished,
})
log.Debug(fmt.Sprint("(testing) getting index state for index build IDs:", req.IndexBuildIDs))
log.Debug(fmt.Sprint("(testing) banned index build IDs:", disabledIndexBuildID))
for _, id := range req.IndexBuildIDs {
ban := false
for _, disabled := range disabledIndexBuildID {
if disabled == id {
ban = true
resp.States = append(resp.States, &indexpb.IndexInfo{
State: commonpb.IndexState_InProgress,
})
}
}
if !ban {
resp.States = append(resp.States, &indexpb.IndexInfo{
State: commonpb.IndexState_Finished,
})
}
}
return resp, nil
}
@ -605,6 +624,9 @@ func TestRootCoord_Base(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
CheckCompleteIndexInterval = 100 * time.Millisecond
TaskTimeLimit = 200 * time.Millisecond
coreFactory := msgstream.NewPmsFactory()
Params.Init()
Params.RootCoordCfg.DmlChannelNum = TestDMLChannelNum
@ -1063,7 +1085,7 @@ func TestRootCoord_Base(t *testing.T) {
assert.Nil(t, err)
partID := coll.PartitionIDs[1]
dm.mu.Lock()
dm.segs = []typeutil.UniqueID{1000, 1001, 1002}
dm.segs = []typeutil.UniqueID{1000, 1001, 1002, 1003, 1004, 1005}
dm.mu.Unlock()
req := &milvuspb.ShowSegmentsRequest{
@ -1073,7 +1095,7 @@ func TestRootCoord_Base(t *testing.T) {
Timestamp: 170,
SourceID: 170,
},
CollectionID: coll.ID,
CollectionID: coll.GetID(),
PartitionID: partID,
}
rsp, err := core.ShowSegments(ctx, req)
@ -1082,7 +1104,10 @@ func TestRootCoord_Base(t *testing.T) {
assert.Equal(t, int64(1000), rsp.SegmentIDs[0])
assert.Equal(t, int64(1001), rsp.SegmentIDs[1])
assert.Equal(t, int64(1002), rsp.SegmentIDs[2])
assert.Equal(t, 3, len(rsp.SegmentIDs))
assert.Equal(t, int64(1003), rsp.SegmentIDs[3])
assert.Equal(t, int64(1004), rsp.SegmentIDs[4])
assert.Equal(t, int64(1005), rsp.SegmentIDs[5])
assert.Equal(t, 6, len(rsp.SegmentIDs))
})
wg.Add(1)
@ -1114,9 +1139,12 @@ func TestRootCoord_Base(t *testing.T) {
assert.Equal(t, commonpb.ErrorCode_Success, rsp.ErrorCode)
time.Sleep(100 * time.Millisecond)
files := im.getFileArray()
assert.Equal(t, 3*3, len(files))
assert.Equal(t, 6*3, len(files))
assert.ElementsMatch(t, files,
[]string{"file0-100", "file1-100", "file2-100",
"file0-100", "file1-100", "file2-100",
"file0-100", "file1-100", "file2-100",
"file0-100", "file1-100", "file2-100",
"file0-100", "file1-100", "file2-100",
"file0-100", "file1-100", "file2-100"})
collMeta, err = core.MetaTable.GetCollectionByName(collName, 0)
@ -1262,6 +1290,127 @@ func TestRootCoord_Base(t *testing.T) {
assert.Equal(t, Params.CommonCfg.DefaultIndexName, rsp.IndexDescriptions[0].IndexName)
})
wg.Add(1)
t.Run("import", func(t *testing.T) {
defer wg.Done()
req := &milvuspb.ImportRequest{
CollectionName: collName,
PartitionName: partName,
RowBased: true,
Files: []string{"f1", "f2", "f3"},
}
coll, err := core.MetaTable.GetCollectionByName(collName, 0)
assert.NoError(t, err)
core.MetaTable.collName2ID[collName] = coll.GetID()
rsp, err := core.Import(ctx, req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.Status.ErrorCode)
})
wg.Add(1)
t.Run("import w/ collection ID not found", func(t *testing.T) {
defer wg.Done()
req := &milvuspb.ImportRequest{
CollectionName: "bad name",
PartitionName: partName,
RowBased: true,
Files: []string{"f1", "f2", "f3"},
}
_, err := core.Import(ctx, req)
assert.Error(t, err)
})
wg.Add(1)
t.Run("get import state", func(t *testing.T) {
defer wg.Done()
req := &milvuspb.GetImportStateRequest{
Task: 0,
}
rsp, err := core.GetImportState(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.Status.ErrorCode)
})
wg.Add(1)
t.Run("report import task timeout", func(t *testing.T) {
defer wg.Done()
coll, err := core.MetaTable.GetCollectionByName(collName, 0)
assert.Nil(t, err)
req := &rootcoordpb.ImportResult{
TaskId: 1,
RowCount: 100,
Segments: []int64{1003, 1004, 1005},
}
for _, segmentID := range []int64{1003, 1004, 1005} {
describeSegmentRequest := &milvuspb.DescribeSegmentRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_DescribeSegment,
},
CollectionID: coll.ID,
SegmentID: segmentID,
}
segDesc, err := core.DescribeSegment(ctx, describeSegmentRequest)
assert.NoError(t, err)
disabledIndexBuildID = append(disabledIndexBuildID, segDesc.BuildID)
}
rsp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.ErrorCode)
time.Sleep(500 * time.Millisecond)
})
wg.Add(1)
t.Run("report import update import task fail", func(t *testing.T) {
defer wg.Done()
// Case where report import request is nil.
resp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), nil)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_UpdateImportTaskFailure, resp.ErrorCode)
})
wg.Add(1)
t.Run("report import collection name not found", func(t *testing.T) {
defer wg.Done()
req := &milvuspb.ImportRequest{
CollectionName: "new" + collName,
PartitionName: partName,
RowBased: true,
Files: []string{"f1", "f2", "f3"},
}
core.MetaTable.collName2ID["new"+collName] = 123
rsp, err := core.Import(ctx, req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.Status.ErrorCode)
delete(core.MetaTable.collName2ID, "new"+collName)
reqIR := &rootcoordpb.ImportResult{
TaskId: 3,
RowCount: 100,
Segments: []int64{1003, 1004, 1005},
}
// Case where report import request is nil.
resp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), reqIR)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_CollectionNameNotFound, resp.ErrorCode)
})
wg.Add(1)
t.Run("report import segments online ready", func(t *testing.T) {
defer wg.Done()
req := &rootcoordpb.ImportResult{
TaskId: 0,
RowCount: 100,
Segments: []int64{1000, 1001, 1002},
}
resp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), req)
assert.NoError(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, resp.ErrorCode)
time.Sleep(500 * time.Millisecond)
})
wg.Add(1)
t.Run("over ride index", func(t *testing.T) {
defer wg.Done()
@ -2145,43 +2294,6 @@ func TestRootCoord_Base(t *testing.T) {
assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
})
wg.Add(1)
t.Run("import", func(t *testing.T) {
defer wg.Done()
req := &milvuspb.ImportRequest{
CollectionName: "c1",
PartitionName: "p1",
RowBased: true,
Files: []string{"f1", "f2", "f3"},
}
rsp, err := core.Import(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.Status.ErrorCode)
})
wg.Add(1)
t.Run("get import state", func(t *testing.T) {
defer wg.Done()
req := &milvuspb.GetImportStateRequest{
Task: 0,
}
rsp, err := core.GetImportState(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.Status.ErrorCode)
})
wg.Add(1)
t.Run("report import", func(t *testing.T) {
defer wg.Done()
req := &rootcoordpb.ImportResult{
TaskId: 0,
RowCount: 100,
}
rsp, err := core.ReportImport(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.ErrorCode)
})
wg.Add(1)
t.Run("get system info", func(t *testing.T) {
defer wg.Done()
@ -2418,6 +2530,7 @@ func TestRootCoord_Base(t *testing.T) {
assert.Nil(t, err)
assert.NotEqual(t, commonpb.ErrorCode_Success, p2.Status.ErrorCode)
})
wg.Wait()
err = core.Stop()
assert.Nil(t, err)

View File

@ -283,7 +283,7 @@ func (t *timetickSync) initSessions(sess []*sessionutil.Session) {
}
}
// StartWatch watch session change and process all channels' timetick msg
// StartWatch watches on session changes and processes timeTick messages of all channels.
func (t *timetickSync) startWatch(wg *sync.WaitGroup) {
defer wg.Done()