diff --git a/core/backup_impl_create_backup.go b/core/backup_impl_create_backup.go index 6010711..85ef36b 100644 --- a/core/backup_impl_create_backup.go +++ b/core/backup_impl_create_backup.go @@ -235,6 +235,13 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo log.Error("fail in DescribeCollection", zap.Error(err)) return err } + // todo temporary solution, migrate to sdk V2 + completeCollectionV2, err := b.getMilvusClient().DescribeCollectionV2(b.ctx, collection.db, collection.collectionName) + if err != nil { + log.Error("fail in DescribeCollection v2", zap.Error(err)) + return err + } + fields := make([]*backuppb.FieldSchema, 0) for _, field := range completeCollection.Schema.Fields { fieldBak := &backuppb.FieldSchema{ @@ -261,12 +268,26 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo } fields = append(fields, fieldBak) } + + functions := make([]*backuppb.FunctionSchema, 0) + for _, function := range completeCollectionV2.Schema.Functions { + functionBak := &backuppb.FunctionSchema{ + Name: function.Name, + Description: function.Description, + Type: backuppb.FunctionType(function.Type), + InputFieldNames: function.InputFieldNames, + OutputFieldNames: function.OutputFieldNames, + Params: utils.MapToKVPair(function.Params), + } + functions = append(functions, functionBak) + } schema := &backuppb.CollectionSchema{ Name: completeCollection.Schema.CollectionName, Description: completeCollection.Schema.Description, AutoID: completeCollection.Schema.AutoID, Fields: fields, EnableDynamicField: completeCollection.Schema.EnableDynamicField, + Functions: functions, } indexInfos := make([]*backuppb.IndexInfo, 0) @@ -274,9 +295,6 @@ func (b *BackupContext) backupCollectionPrepare(ctx context.Context, backupInfo log.Info("try to get index", zap.String("collection_name", completeCollection.Name)) for _, field := range completeCollection.Schema.Fields { - //if field.DataType != entity.FieldTypeBinaryVector && field.DataType != entity.FieldTypeFloatVector { - // continue - //} fieldIndex, err := b.getMilvusClient().DescribeIndex(b.ctx, collection.db, completeCollection.Name, field.Name) if err != nil { if strings.Contains(err.Error(), "index not found") || @@ -989,6 +1007,7 @@ func (b *BackupContext) fillSegmentBackupInfo(ctx context.Context, segmentBackup } deltaLogPath := fmt.Sprintf("%s%s/%v/%v/%v/", rootPath, "delta_log", segmentBackupInfo.GetCollectionId(), segmentBackupInfo.GetPartitionId(), segmentBackupInfo.GetSegmentId()) + log.Debug("deltaPath", zap.String("bucket", b.milvusBucketName), zap.String("deltaPath", deltaLogPath)) deltaFieldsLogDir, _, _ := b.getMilvusStorageClient().ListWithPrefix(ctx, b.milvusBucketName, deltaLogPath, false) deltaLogs := make([]*backuppb.FieldBinlog, 0) for _, deltaFieldLogDir := range deltaFieldsLogDir { diff --git a/core/backup_impl_restore_backup.go b/core/backup_impl_restore_backup.go index 50bfc31..afdad50 100644 --- a/core/backup_impl_restore_backup.go +++ b/core/backup_impl_restore_backup.go @@ -3,6 +3,7 @@ package core import ( "context" "fmt" + "path" "strings" "time" @@ -13,6 +14,8 @@ import ( "github.com/milvus-io/milvus-proto/go-api/v2/schemapb" gomilvus "github.com/milvus-io/milvus-sdk-go/v2/client" "github.com/milvus-io/milvus-sdk-go/v2/entity" + entityV2 "github.com/milvus-io/milvus/client/v2/entity" + indexV2 "github.com/milvus-io/milvus/client/v2/index" "github.com/samber/lo" "go.uber.org/atomic" "go.uber.org/zap" @@ -419,22 +422,22 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup zap.String("backupBucketName", backupBucketName), zap.String("backupPath", backupPath)) // create collection - fields := make([]*entity.Field, 0) + fields := make([]*entityV2.Field, 0) hasPartitionKey := false for _, field := range task.GetCollBackup().GetSchema().GetFields() { - fieldRestore := &entity.Field{ + fieldRestore := &entityV2.Field{ ID: field.GetFieldID(), Name: field.GetName(), PrimaryKey: field.GetIsPrimaryKey(), AutoID: field.GetAutoID(), Description: field.GetDescription(), - DataType: entity.FieldType(field.GetDataType()), + DataType: entityV2.FieldType(field.GetDataType()), TypeParams: utils.KvPairsMap(field.GetTypeParams()), IndexParams: utils.KvPairsMap(field.GetIndexParams()), IsDynamic: field.GetIsDynamic(), IsPartitionKey: field.GetIsPartitionKey(), Nullable: field.GetNullable(), - ElementType: entity.FieldType(field.GetElementType()), + ElementType: entityV2.FieldType(field.GetElementType()), } if field.DefaultValueProto != "" { defaultValue := &schemapb.ValueField{} @@ -453,7 +456,7 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup log.Info("collection schema", zap.Any("fields", fields)) - collectionSchema := &entity.Schema{ + collectionSchema := &entityV2.Schema{ CollectionName: targetCollectionName, Description: task.GetCollBackup().GetSchema().GetDescription(), AutoID: task.GetCollBackup().GetSchema().GetAutoID(), @@ -491,22 +494,12 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup log.Info("overwrite shardNum by request parameter", zap.Int32("oldShardNum", task.GetCollBackup().GetShardsNum()), zap.Int32("newShardNum", shardNum)) } + if hasPartitionKey { partitionNum := len(task.GetCollBackup().GetPartitionBackups()) - return b.getMilvusClient().CreateCollection( - ctx, - targetDBName, - collectionSchema, - shardNum, - gomilvus.WithConsistencyLevel(entity.ConsistencyLevel(task.GetCollBackup().GetConsistencyLevel())), - gomilvus.WithPartitionNum(int64(partitionNum))) + return b.getMilvusClient().CreateCollectionV2(ctx, targetDBName, collectionSchema, shardNum, entityV2.ConsistencyLevel(task.GetCollBackup().GetConsistencyLevel()), int64(partitionNum)) } - return b.getMilvusClient().CreateCollection( - ctx, - targetDBName, - collectionSchema, - shardNum, - gomilvus.WithConsistencyLevel(entity.ConsistencyLevel(task.GetCollBackup().GetConsistencyLevel()))) + return b.getMilvusClient().CreateCollectionV2(ctx, targetDBName, collectionSchema, shardNum, entityV2.ConsistencyLevel(task.GetCollBackup().GetConsistencyLevel()), 0) }, retry.Attempts(10), retry.Sleep(1*time.Second)) if err != nil { errorMsg := fmt.Sprintf("fail to create collection, targetCollectionName: %s err: %s", targetCollectionName, err) @@ -560,7 +553,7 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup } indexes := task.GetCollBackup().GetIndexInfos() for _, index := range indexes { - var idx entity.Index + var idx indexV2.Index log.Info("source index", zap.String("indexName", index.GetIndexName()), zap.String("indexType", index.GetIndexType()), @@ -571,7 +564,10 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup // auto index only support index_type and metric_type in params params["index_type"] = "AUTOINDEX" params["metric_type"] = index.GetParams()["metric_type"] - idx = entity.NewGenericIndex(index.GetIndexName(), entity.AUTOINDEX, params) + // v1 + //idx = entity.NewGenericIndex(index.GetIndexName(), entity.AUTOINDEX, params) + // v2 + idx = indexV2.NewGenericIndex(index.GetIndexName(), params) } else { log.Info("not auto index") indexType := index.GetIndexType() @@ -582,9 +578,12 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup if params["index_type"] == "marisa-trie" { params["index_type"] = "Trie" } - idx = entity.NewGenericIndex(index.GetIndexName(), entity.IndexType(indexType), index.GetParams()) + // v1 + //idx = entityV2.NewGenericIndex(index.GetIndexName(), entity.IndexType(indexType), index.GetParams()) + // v2 + idx = indexV2.NewGenericIndex(index.GetIndexName(), params) } - err := b.getMilvusClient().CreateIndex(ctx, targetDBName, targetCollectionName, index.GetFieldName(), idx, true) + err := b.getMilvusClient().CreateIndexV2(ctx, targetDBName, targetCollectionName, index.GetFieldName(), idx, true) if err != nil { log.Warn("Fail to restore index", zap.Error(err)) return task, err @@ -663,6 +662,7 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup return task, err } if !exist { + log.Info("create partition", zap.String("partitionName", partitionBackup.GetPartitionName())) err = retry.Do(ctx, func() error { return b.getMilvusClient().CreatePartition(ctx, targetDBName, targetCollectionName, partitionBackup.GetPartitionName()) }, retry.Attempts(10), retry.Sleep(1*time.Second)) @@ -670,7 +670,6 @@ func (b *BackupContext) executeRestoreCollectionTask(ctx context.Context, backup log.Error("fail to create partition", zap.Error(err)) return task, err } - log.Info("create partition", zap.String("partitionName", partitionBackup.GetPartitionName())) } type restoreGroup struct { diff --git a/core/milvus_sdk_wrapper.go b/core/milvus_sdk_wrapper.go index edaeda7..057916d 100644 --- a/core/milvus_sdk_wrapper.go +++ b/core/milvus_sdk_wrapper.go @@ -12,7 +12,6 @@ import ( gomilvus "github.com/milvus-io/milvus-sdk-go/v2/client" "github.com/milvus-io/milvus-sdk-go/v2/entity" - entityV2 "github.com/milvus-io/milvus/client/v2/entity" milvusClientV2 "github.com/milvus-io/milvus/client/v2/milvusclient" "github.com/zilliztech/milvus-backup/core/paramtable" @@ -153,31 +152,6 @@ func (m *MilvusClient) ListCollections(ctx context.Context, db string) ([]*entit return m.client.ListCollections(ctx) } -func (m *MilvusClient) ListCollectionsV2(ctx context.Context, db string) ([]*entityV2.Collection, error) { - m.mu.Lock() - defer m.mu.Unlock() - err := m.milvusClientV2.UsingDatabase(ctx, milvusClientV2.NewUsingDatabaseOption(db)) - if err != nil { - return nil, err - } - - collections, err := m.milvusClientV2.ListCollections(ctx, milvusClientV2.NewListCollectionOption()) - if err != nil { - return nil, err - } - - collectionEntities := make([]*entityV2.Collection, 0) - for _, collection := range collections { - coll, err := m.milvusClientV2.DescribeCollection(ctx, milvusClientV2.NewDescribeCollectionOption(collection)) - if err != nil { - return nil, err - } - collectionEntities = append(collectionEntities, coll) - } - - return collectionEntities, nil -} - func (m *MilvusClient) HasCollection(ctx context.Context, db, collName string) (bool, error) { m.mu.Lock() defer m.mu.Unlock() diff --git a/core/milvus_sdk_wrapper_v2.go b/core/milvus_sdk_wrapper_v2.go new file mode 100644 index 0000000..b9f529a --- /dev/null +++ b/core/milvus_sdk_wrapper_v2.go @@ -0,0 +1,84 @@ +package core + +import ( + "context" + "time" + + entityV2 "github.com/milvus-io/milvus/client/v2/entity" + indexV2 "github.com/milvus-io/milvus/client/v2/index" + milvusClientV2 "github.com/milvus-io/milvus/client/v2/milvusclient" + "github.com/zilliztech/milvus-backup/internal/util/retry" +) + +func (m *MilvusClient) ListCollectionsV2(ctx context.Context, db string) ([]*entityV2.Collection, error) { + m.mu.Lock() + defer m.mu.Unlock() + err := m.milvusClientV2.UsingDatabase(ctx, milvusClientV2.NewUsingDatabaseOption(db)) + if err != nil { + return nil, err + } + + collections, err := m.milvusClientV2.ListCollections(ctx, milvusClientV2.NewListCollectionOption()) + if err != nil { + return nil, err + } + + collectionEntities := make([]*entityV2.Collection, 0) + for _, collection := range collections { + coll, err := m.milvusClientV2.DescribeCollection(ctx, milvusClientV2.NewDescribeCollectionOption(collection)) + if err != nil { + return nil, err + } + collectionEntities = append(collectionEntities, coll) + } + + return collectionEntities, nil +} + +func (m *MilvusClient) DescribeCollectionV2(ctx context.Context, db, collName string) (*entityV2.Collection, error) { + m.mu.Lock() + defer m.mu.Unlock() + err := m.milvusClientV2.UsingDatabase(ctx, milvusClientV2.NewUsingDatabaseOption(db)) + if err != nil { + return nil, err + } + return m.milvusClientV2.DescribeCollection(ctx, milvusClientV2.NewDescribeCollectionOption(collName)) +} + +func (m *MilvusClient) CreateCollectionV2(ctx context.Context, db string, schema *entityV2.Schema, shardsNum int32, cl entityV2.ConsistencyLevel, partitionNum int64) error { + m.mu.Lock() + defer m.mu.Unlock() + err := m.milvusClientV2.UsingDatabase(ctx, milvusClientV2.NewUsingDatabaseOption(db)) + if err != nil { + return err + } + // add retry to make sure won't be block by rate control + return retry.Do(ctx, func() error { + option := milvusClientV2.NewCreateCollectionOption(schema.CollectionName, &entityV2.Schema{ + CollectionName: schema.CollectionName, + Description: schema.Description, + AutoID: schema.AutoID, + Fields: schema.Fields, + EnableDynamicField: schema.EnableDynamicField, + Functions: schema.Functions, + }).WithShardNum(shardsNum).WithConsistencyLevel(cl) + if partitionNum != 0 { + option = option.WithPartitionNum(partitionNum) + } + return m.milvusClientV2.CreateCollection(ctx, option) + }, retry.Sleep(2*time.Second), retry.Attempts(10)) +} + +func (m *MilvusClient) CreateIndexV2(ctx context.Context, db, collName string, fieldName string, idx indexV2.Index, async bool) error { + m.mu.Lock() + defer m.mu.Unlock() + err := m.milvusClientV2.UsingDatabase(ctx, milvusClientV2.NewUsingDatabaseOption(db)) + if err != nil { + return err + } + _, err = m.milvusClientV2.CreateIndex(ctx, milvusClientV2.NewCreateIndexOption(collName, fieldName, idx)) + if err != nil { + return err + } + return nil +} diff --git a/core/proto/backup.proto b/core/proto/backup.proto index 498c273..7be9aed 100644 --- a/core/proto/backup.proto +++ b/core/proto/backup.proto @@ -464,6 +464,26 @@ message CollectionSchema { bool autoID = 3; // deprecated later, keep compatible with c++ part now repeated FieldSchema fields = 4; bool enable_dynamic_field = 5; // mark whether this table has the dynamic field function enabled. + repeated KeyValuePair properties = 6; + repeated FunctionSchema functions = 7; +} + +enum FunctionType{ + Unknown =0; + BM25 =1; + TextEmbedding =2; +} + +message FunctionSchema { + string name = 1; + int64 id =2; + string description = 3; + FunctionType type = 4; + repeated string input_field_names = 5; + repeated int64 input_field_ids = 6; + repeated string output_field_names = 7; + repeated int64 output_field_ids = 8; + repeated KeyValuePair params = 9; } message CheckRequest { diff --git a/core/proto/backuppb/backup.pb.go b/core/proto/backuppb/backup.pb.go index fff0429..b91afa4 100644 --- a/core/proto/backuppb/backup.pb.go +++ b/core/proto/backuppb/backup.pb.go @@ -267,6 +267,34 @@ func (FieldState) EnumDescriptor() ([]byte, []int) { return fileDescriptor_65240d19de191688, []int{5} } +type FunctionType int32 + +const ( + FunctionType_Unknown FunctionType = 0 + FunctionType_BM25 FunctionType = 1 + FunctionType_TextEmbedding FunctionType = 2 +) + +var FunctionType_name = map[int32]string{ + 0: "Unknown", + 1: "BM25", + 2: "TextEmbedding", +} + +var FunctionType_value = map[string]int32{ + "Unknown": 0, + "BM25": 1, + "TextEmbedding": 2, +} + +func (x FunctionType) String() string { + return proto.EnumName(FunctionType_name, int32(x)) +} + +func (FunctionType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_65240d19de191688, []int{6} +} + type IndexInfo struct { FieldName string `protobuf:"bytes,1,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"` IndexName string `protobuf:"bytes,2,opt,name=index_name,json=indexName,proto3" json:"index_name,omitempty"` @@ -2686,14 +2714,16 @@ func (m *FieldSchema) GetDefaultValueProto() string { // * // @brief Collection schema type CollectionSchema struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - AutoID bool `protobuf:"varint,3,opt,name=autoID,proto3" json:"autoID,omitempty"` - Fields []*FieldSchema `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"` - EnableDynamicField bool `protobuf:"varint,5,opt,name=enable_dynamic_field,json=enableDynamicField,proto3" json:"enable_dynamic_field,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + AutoID bool `protobuf:"varint,3,opt,name=autoID,proto3" json:"autoID,omitempty"` + Fields []*FieldSchema `protobuf:"bytes,4,rep,name=fields,proto3" json:"fields,omitempty"` + EnableDynamicField bool `protobuf:"varint,5,opt,name=enable_dynamic_field,json=enableDynamicField,proto3" json:"enable_dynamic_field,omitempty"` + Properties []*KeyValuePair `protobuf:"bytes,6,rep,name=properties,proto3" json:"properties,omitempty"` + Functions []*FunctionSchema `protobuf:"bytes,7,rep,name=functions,proto3" json:"functions,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CollectionSchema) Reset() { *m = CollectionSchema{} } @@ -2756,6 +2786,123 @@ func (m *CollectionSchema) GetEnableDynamicField() bool { return false } +func (m *CollectionSchema) GetProperties() []*KeyValuePair { + if m != nil { + return m.Properties + } + return nil +} + +func (m *CollectionSchema) GetFunctions() []*FunctionSchema { + if m != nil { + return m.Functions + } + return nil +} + +type FunctionSchema struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Type FunctionType `protobuf:"varint,4,opt,name=type,proto3,enum=milvus.proto.backup.FunctionType" json:"type,omitempty"` + InputFieldNames []string `protobuf:"bytes,5,rep,name=input_field_names,json=inputFieldNames,proto3" json:"input_field_names,omitempty"` + InputFieldIds []int64 `protobuf:"varint,6,rep,packed,name=input_field_ids,json=inputFieldIds,proto3" json:"input_field_ids,omitempty"` + OutputFieldNames []string `protobuf:"bytes,7,rep,name=output_field_names,json=outputFieldNames,proto3" json:"output_field_names,omitempty"` + OutputFieldIds []int64 `protobuf:"varint,8,rep,packed,name=output_field_ids,json=outputFieldIds,proto3" json:"output_field_ids,omitempty"` + Params []*KeyValuePair `protobuf:"bytes,9,rep,name=params,proto3" json:"params,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FunctionSchema) Reset() { *m = FunctionSchema{} } +func (m *FunctionSchema) String() string { return proto.CompactTextString(m) } +func (*FunctionSchema) ProtoMessage() {} +func (*FunctionSchema) Descriptor() ([]byte, []int) { + return fileDescriptor_65240d19de191688, []int{27} +} + +func (m *FunctionSchema) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FunctionSchema.Unmarshal(m, b) +} +func (m *FunctionSchema) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FunctionSchema.Marshal(b, m, deterministic) +} +func (m *FunctionSchema) XXX_Merge(src proto.Message) { + xxx_messageInfo_FunctionSchema.Merge(m, src) +} +func (m *FunctionSchema) XXX_Size() int { + return xxx_messageInfo_FunctionSchema.Size(m) +} +func (m *FunctionSchema) XXX_DiscardUnknown() { + xxx_messageInfo_FunctionSchema.DiscardUnknown(m) +} + +var xxx_messageInfo_FunctionSchema proto.InternalMessageInfo + +func (m *FunctionSchema) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *FunctionSchema) GetId() int64 { + if m != nil { + return m.Id + } + return 0 +} + +func (m *FunctionSchema) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *FunctionSchema) GetType() FunctionType { + if m != nil { + return m.Type + } + return FunctionType_Unknown +} + +func (m *FunctionSchema) GetInputFieldNames() []string { + if m != nil { + return m.InputFieldNames + } + return nil +} + +func (m *FunctionSchema) GetInputFieldIds() []int64 { + if m != nil { + return m.InputFieldIds + } + return nil +} + +func (m *FunctionSchema) GetOutputFieldNames() []string { + if m != nil { + return m.OutputFieldNames + } + return nil +} + +func (m *FunctionSchema) GetOutputFieldIds() []int64 { + if m != nil { + return m.OutputFieldIds + } + return nil +} + +func (m *FunctionSchema) GetParams() []*KeyValuePair { + if m != nil { + return m.Params + } + return nil +} + type CheckRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2766,7 +2913,7 @@ func (m *CheckRequest) Reset() { *m = CheckRequest{} } func (m *CheckRequest) String() string { return proto.CompactTextString(m) } func (*CheckRequest) ProtoMessage() {} func (*CheckRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{27} + return fileDescriptor_65240d19de191688, []int{28} } func (m *CheckRequest) XXX_Unmarshal(b []byte) error { @@ -2801,7 +2948,7 @@ func (m *CheckResponse) Reset() { *m = CheckResponse{} } func (m *CheckResponse) String() string { return proto.CompactTextString(m) } func (*CheckResponse) ProtoMessage() {} func (*CheckResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{28} + return fileDescriptor_65240d19de191688, []int{29} } func (m *CheckResponse) XXX_Unmarshal(b []byte) error { @@ -2850,7 +2997,7 @@ func (m *MsgPosition) Reset() { *m = MsgPosition{} } func (m *MsgPosition) String() string { return proto.CompactTextString(m) } func (*MsgPosition) ProtoMessage() {} func (*MsgPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{29} + return fileDescriptor_65240d19de191688, []int{30} } func (m *MsgPosition) XXX_Unmarshal(b []byte) error { @@ -2911,7 +3058,7 @@ func (m *ChannelPosition) Reset() { *m = ChannelPosition{} } func (m *ChannelPosition) String() string { return proto.CompactTextString(m) } func (*ChannelPosition) ProtoMessage() {} func (*ChannelPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{30} + return fileDescriptor_65240d19de191688, []int{31} } func (m *ChannelPosition) XXX_Unmarshal(b []byte) error { @@ -2957,7 +3104,7 @@ func (m *RoleEntity) Reset() { *m = RoleEntity{} } func (m *RoleEntity) String() string { return proto.CompactTextString(m) } func (*RoleEntity) ProtoMessage() {} func (*RoleEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{31} + return fileDescriptor_65240d19de191688, []int{32} } func (m *RoleEntity) XXX_Unmarshal(b []byte) error { @@ -2996,7 +3143,7 @@ func (m *UserEntity) Reset() { *m = UserEntity{} } func (m *UserEntity) String() string { return proto.CompactTextString(m) } func (*UserEntity) ProtoMessage() {} func (*UserEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{32} + return fileDescriptor_65240d19de191688, []int{33} } func (m *UserEntity) XXX_Unmarshal(b []byte) error { @@ -3035,7 +3182,7 @@ func (m *ObjectEntity) Reset() { *m = ObjectEntity{} } func (m *ObjectEntity) String() string { return proto.CompactTextString(m) } func (*ObjectEntity) ProtoMessage() {} func (*ObjectEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{33} + return fileDescriptor_65240d19de191688, []int{34} } func (m *ObjectEntity) XXX_Unmarshal(b []byte) error { @@ -3074,7 +3221,7 @@ func (m *PrivilegeEntity) Reset() { *m = PrivilegeEntity{} } func (m *PrivilegeEntity) String() string { return proto.CompactTextString(m) } func (*PrivilegeEntity) ProtoMessage() {} func (*PrivilegeEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{34} + return fileDescriptor_65240d19de191688, []int{35} } func (m *PrivilegeEntity) XXX_Unmarshal(b []byte) error { @@ -3114,7 +3261,7 @@ func (m *GrantorEntity) Reset() { *m = GrantorEntity{} } func (m *GrantorEntity) String() string { return proto.CompactTextString(m) } func (*GrantorEntity) ProtoMessage() {} func (*GrantorEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{35} + return fileDescriptor_65240d19de191688, []int{36} } func (m *GrantorEntity) XXX_Unmarshal(b []byte) error { @@ -3160,7 +3307,7 @@ func (m *GrantPrivilegeEntity) Reset() { *m = GrantPrivilegeEntity{} } func (m *GrantPrivilegeEntity) String() string { return proto.CompactTextString(m) } func (*GrantPrivilegeEntity) ProtoMessage() {} func (*GrantPrivilegeEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{36} + return fileDescriptor_65240d19de191688, []int{37} } func (m *GrantPrivilegeEntity) XXX_Unmarshal(b []byte) error { @@ -3208,7 +3355,7 @@ func (m *GrantEntity) Reset() { *m = GrantEntity{} } func (m *GrantEntity) String() string { return proto.CompactTextString(m) } func (*GrantEntity) ProtoMessage() {} func (*GrantEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{37} + return fileDescriptor_65240d19de191688, []int{38} } func (m *GrantEntity) XXX_Unmarshal(b []byte) error { @@ -3277,7 +3424,7 @@ func (m *UserInfo) Reset() { *m = UserInfo{} } func (m *UserInfo) String() string { return proto.CompactTextString(m) } func (*UserInfo) ProtoMessage() {} func (*UserInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{38} + return fileDescriptor_65240d19de191688, []int{39} } func (m *UserInfo) XXX_Unmarshal(b []byte) error { @@ -3335,7 +3482,7 @@ func (m *RBACMeta) Reset() { *m = RBACMeta{} } func (m *RBACMeta) String() string { return proto.CompactTextString(m) } func (*RBACMeta) ProtoMessage() {} func (*RBACMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_65240d19de191688, []int{39} + return fileDescriptor_65240d19de191688, []int{40} } func (m *RBACMeta) XXX_Unmarshal(b []byte) error { @@ -3384,6 +3531,7 @@ func init() { proto.RegisterEnum("milvus.proto.backup.ConsistencyLevel", ConsistencyLevel_name, ConsistencyLevel_value) proto.RegisterEnum("milvus.proto.backup.DataType", DataType_name, DataType_value) proto.RegisterEnum("milvus.proto.backup.FieldState", FieldState_name, FieldState_value) + proto.RegisterEnum("milvus.proto.backup.FunctionType", FunctionType_name, FunctionType_value) proto.RegisterType((*IndexInfo)(nil), "milvus.proto.backup.IndexInfo") proto.RegisterMapType((map[string]string)(nil), "milvus.proto.backup.IndexInfo.ParamsEntry") proto.RegisterType((*CollectionBackupInfo)(nil), "milvus.proto.backup.CollectionBackupInfo") @@ -3414,6 +3562,7 @@ func init() { proto.RegisterType((*ValueField)(nil), "milvus.proto.backup.ValueField") proto.RegisterType((*FieldSchema)(nil), "milvus.proto.backup.FieldSchema") proto.RegisterType((*CollectionSchema)(nil), "milvus.proto.backup.CollectionSchema") + proto.RegisterType((*FunctionSchema)(nil), "milvus.proto.backup.FunctionSchema") proto.RegisterType((*CheckRequest)(nil), "milvus.proto.backup.CheckRequest") proto.RegisterType((*CheckResponse)(nil), "milvus.proto.backup.CheckResponse") proto.RegisterType((*MsgPosition)(nil), "milvus.proto.backup.MsgPosition") @@ -3432,221 +3581,232 @@ func init() { func init() { proto.RegisterFile("backup.proto", fileDescriptor_65240d19de191688) } var fileDescriptor_65240d19de191688 = []byte{ - // 3420 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0x72, 0xc4, 0x37, 0xd0, 0x0b, 0x80, 0xcb, 0x21, 0x45, 0x41, 0xd4, 0xd3, 0x13, 0xb5, 0xb1, 0xf4, - 0x28, 0xbd, 0x0a, 0xa5, 0x47, 0x3d, 0x2b, 0xb6, 0xea, 0x3d, 0x3f, 0xf3, 0x4b, 0x12, 0x6c, 0x89, - 0x62, 0x96, 0x14, 0x4b, 0xe5, 0x7c, 0x6c, 0x2d, 0x76, 0x87, 0xe0, 0x86, 0x8b, 0x1d, 0x78, 0x67, - 0x21, 0x09, 0xaa, 0x4a, 0x2a, 0xb7, 0xf8, 0x98, 0x43, 0xaa, 0x52, 0x95, 0x7f, 0x90, 0x9b, 0x73, - 0x70, 0x0e, 0xf9, 0x07, 0x49, 0xe5, 0x9a, 0x3f, 0x90, 0x4b, 0x8e, 0x3e, 0xa5, 0x72, 0x4d, 0x4d, - 0xcf, 0xec, 0x07, 0xc0, 0x25, 0x05, 0xa6, 0x5c, 0x71, 0x9c, 0xdb, 0x4e, 0x4f, 0x77, 0x4f, 0x4f, - 0x7f, 0x4d, 0xcf, 0xf4, 0x42, 0xb3, 0x67, 0x3b, 0xa7, 0xa3, 0xe1, 0xfa, 0x30, 0x64, 0x11, 0x23, - 0x8b, 0x03, 0xcf, 0x7f, 0x33, 0xe2, 0x72, 0xb4, 0x2e, 0xa7, 0x56, 0x7e, 0xd6, 0x67, 0xac, 0xef, - 0xd3, 0xfb, 0x08, 0xec, 0x8d, 0x8e, 0xef, 0xf3, 0x28, 0x1c, 0x39, 0x91, 0x44, 0x32, 0xfe, 0xa3, - 0x00, 0x8d, 0x6e, 0xe0, 0xd2, 0x77, 0xdd, 0xe0, 0x98, 0x91, 0x1b, 0x00, 0xc7, 0x1e, 0xf5, 0x5d, - 0x2b, 0xb0, 0x07, 0xb4, 0x53, 0x58, 0x2d, 0xac, 0x35, 0xcc, 0x06, 0x42, 0xf6, 0xec, 0x01, 0x15, - 0xd3, 0x9e, 0xc0, 0x95, 0xd3, 0x45, 0x39, 0x8d, 0x90, 0xc9, 0xe9, 0x68, 0x3c, 0xa4, 0x9d, 0x52, - 0x66, 0xfa, 0x70, 0x3c, 0xa4, 0x64, 0x0b, 0xaa, 0x43, 0x3b, 0xb4, 0x07, 0xbc, 0x53, 0x5e, 0x2d, - 0xad, 0x69, 0x1b, 0xf7, 0xd6, 0x73, 0xc4, 0x5d, 0x4f, 0x84, 0x59, 0xdf, 0x47, 0xe4, 0xdd, 0x20, - 0x0a, 0xc7, 0xa6, 0xa2, 0x5c, 0xf9, 0x14, 0xb4, 0x0c, 0x98, 0xe8, 0x50, 0x3a, 0xa5, 0x63, 0x25, - 0xa8, 0xf8, 0x24, 0x4b, 0x50, 0x79, 0x63, 0xfb, 0xa3, 0x58, 0x3a, 0x39, 0x78, 0x5c, 0xfc, 0xa4, - 0x60, 0xfc, 0x5b, 0x1d, 0x96, 0xb6, 0x99, 0xef, 0x53, 0x27, 0xf2, 0x58, 0xb0, 0x85, 0xab, 0xe1, - 0xa6, 0xdb, 0x50, 0xf4, 0x5c, 0xc5, 0xa3, 0xe8, 0xb9, 0xe4, 0x29, 0x00, 0x8f, 0xec, 0x88, 0x5a, - 0x0e, 0x73, 0x25, 0x9f, 0xf6, 0xc6, 0x5a, 0xae, 0xac, 0x92, 0xc9, 0xa1, 0xcd, 0x4f, 0x0f, 0x04, - 0xc1, 0x36, 0x73, 0xa9, 0xd9, 0xe0, 0xf1, 0x27, 0x31, 0xa0, 0x49, 0xc3, 0x90, 0x85, 0x2f, 0x28, - 0xe7, 0x76, 0x3f, 0xd6, 0xc8, 0x04, 0x4c, 0xe8, 0x8c, 0x47, 0x76, 0x18, 0x59, 0x91, 0x37, 0xa0, - 0x9d, 0xf2, 0x6a, 0x61, 0xad, 0x84, 0x2c, 0xc2, 0xe8, 0xd0, 0x1b, 0x50, 0x72, 0x0d, 0xea, 0x34, - 0x70, 0xe5, 0x64, 0x05, 0x27, 0x6b, 0x34, 0x70, 0x71, 0x6a, 0x05, 0xea, 0xc3, 0x90, 0xf5, 0x43, - 0xca, 0x79, 0xa7, 0xba, 0x5a, 0x58, 0xab, 0x98, 0xc9, 0x98, 0xfc, 0x1e, 0xb4, 0x9c, 0x64, 0xab, - 0x96, 0xe7, 0x76, 0x6a, 0x48, 0xdb, 0x4c, 0x81, 0x5d, 0x97, 0x5c, 0x85, 0x9a, 0xdb, 0x93, 0xa6, - 0xac, 0xa3, 0x64, 0x55, 0xb7, 0x87, 0x76, 0xfc, 0x05, 0xcc, 0x67, 0xa8, 0x11, 0xa1, 0x81, 0x08, - 0xed, 0x14, 0x8c, 0x88, 0xbf, 0x85, 0x2a, 0x77, 0x4e, 0xe8, 0xc0, 0xee, 0xc0, 0x6a, 0x61, 0x4d, - 0xdb, 0xb8, 0x9d, 0xab, 0xa5, 0x54, 0xe9, 0x07, 0x88, 0x6c, 0x2a, 0x22, 0xdc, 0xfb, 0x89, 0x1d, - 0xba, 0xdc, 0x0a, 0x46, 0x83, 0x8e, 0x86, 0x7b, 0x68, 0x48, 0xc8, 0xde, 0x68, 0x40, 0x4c, 0x58, - 0x70, 0x58, 0xc0, 0x3d, 0x1e, 0xd1, 0xc0, 0x19, 0x5b, 0x3e, 0x7d, 0x43, 0xfd, 0x4e, 0x13, 0xcd, - 0x71, 0xde, 0x42, 0x09, 0xf6, 0x73, 0x81, 0x6c, 0xea, 0xce, 0x14, 0x84, 0xbc, 0x82, 0x85, 0xa1, - 0x1d, 0x46, 0x1e, 0xee, 0x4c, 0x92, 0xf1, 0x4e, 0x0b, 0xdd, 0x31, 0xdf, 0xc4, 0xfb, 0x31, 0x76, - 0xea, 0x30, 0xa6, 0x3e, 0x9c, 0x04, 0x72, 0x72, 0x17, 0x74, 0x89, 0x8f, 0x96, 0xe2, 0x91, 0x3d, - 0x18, 0x76, 0xda, 0xab, 0x85, 0xb5, 0xb2, 0x39, 0x2f, 0xe1, 0x87, 0x31, 0x98, 0x10, 0x28, 0x73, - 0xef, 0x3d, 0xed, 0xcc, 0xa3, 0x45, 0xf0, 0x9b, 0x5c, 0x87, 0xc6, 0x89, 0xcd, 0x2d, 0x0c, 0x95, - 0x8e, 0xbe, 0x5a, 0x58, 0xab, 0x9b, 0xf5, 0x13, 0x9b, 0x63, 0x28, 0x90, 0xdf, 0x81, 0x26, 0xa3, - 0xca, 0x0b, 0x8e, 0x19, 0xef, 0x2c, 0xa0, 0xb0, 0x3f, 0xbf, 0x38, 0x76, 0x4c, 0x19, 0x88, 0xe2, - 0x93, 0x0b, 0x35, 0xfb, 0xcc, 0x76, 0x2d, 0x74, 0xcc, 0x0e, 0x91, 0x61, 0x29, 0x20, 0xe8, 0xb4, - 0xe4, 0x31, 0x5c, 0x53, 0xb2, 0x0f, 0x4f, 0xc6, 0xdc, 0x73, 0x6c, 0x3f, 0xb3, 0x89, 0x45, 0xdc, - 0xc4, 0x55, 0x89, 0xb0, 0xaf, 0xe6, 0xd3, 0xcd, 0x84, 0xb0, 0xe8, 0x9c, 0xd8, 0x41, 0x40, 0x7d, - 0xcb, 0x39, 0xa1, 0xce, 0xe9, 0x90, 0x79, 0x41, 0xc4, 0x3b, 0x4b, 0x28, 0xe3, 0xe6, 0x07, 0xbc, - 0x21, 0xd5, 0xe8, 0xfa, 0xb6, 0x64, 0xb2, 0x9d, 0xf2, 0x90, 0x61, 0x4f, 0x9c, 0x33, 0x13, 0xe4, - 0x29, 0x68, 0xfe, 0x03, 0x8b, 0xd3, 0xfe, 0x80, 0x8a, 0xb5, 0xae, 0xe0, 0x5a, 0x77, 0x72, 0xd7, - 0x3a, 0x90, 0x48, 0x19, 0xd3, 0x81, 0xff, 0x40, 0x01, 0xf9, 0xca, 0x2e, 0x5c, 0x3d, 0x67, 0xdd, - 0x4b, 0xe5, 0x95, 0x6f, 0x8a, 0xb0, 0x98, 0xe3, 0x25, 0xe4, 0x16, 0x34, 0x53, 0x57, 0x53, 0x09, - 0xa6, 0x64, 0x6a, 0x09, 0xac, 0xeb, 0x92, 0xdb, 0xd0, 0x4e, 0x51, 0x32, 0x39, 0xb5, 0x95, 0x40, - 0x31, 0xcc, 0xce, 0x44, 0x73, 0x29, 0x27, 0x9a, 0x5f, 0xc2, 0xbc, 0xd2, 0x49, 0xe2, 0xd7, 0xe5, - 0x4b, 0xa9, 0xa6, 0xcd, 0xb3, 0x20, 0x9e, 0x38, 0x6a, 0x25, 0xe3, 0xa8, 0x93, 0xae, 0x54, 0x9d, - 0x72, 0x25, 0xe3, 0x1f, 0x4b, 0xb0, 0x70, 0x86, 0x31, 0x86, 0xb9, 0x92, 0x2c, 0x51, 0x43, 0x43, - 0x41, 0xba, 0xee, 0xd9, 0xdd, 0x15, 0x73, 0x76, 0x37, 0xad, 0xcc, 0xd2, 0x59, 0x65, 0xfe, 0x1c, - 0xb4, 0x60, 0x34, 0xb0, 0xd8, 0xb1, 0x15, 0xb2, 0xb7, 0x3c, 0x4e, 0xa5, 0xc1, 0x68, 0xf0, 0xf2, - 0xd8, 0x64, 0x6f, 0x39, 0x79, 0x0c, 0xb5, 0x9e, 0x17, 0xf8, 0xac, 0xcf, 0x3b, 0x15, 0x54, 0xcc, - 0x6a, 0xae, 0x62, 0x9e, 0x88, 0xd3, 0x6e, 0x0b, 0x11, 0xcd, 0x98, 0x80, 0x7c, 0x06, 0x98, 0xd6, - 0x39, 0x52, 0x57, 0x67, 0xa4, 0x4e, 0x49, 0x04, 0xbd, 0x4b, 0xfd, 0xc8, 0x46, 0xfa, 0xda, 0xac, - 0xf4, 0x09, 0x49, 0x62, 0x8b, 0x7a, 0xc6, 0x16, 0xd7, 0xa0, 0xde, 0x0f, 0xd9, 0x68, 0x28, 0xd4, - 0xd1, 0x90, 0x47, 0x03, 0x8e, 0xbb, 0xae, 0x38, 0x1a, 0x24, 0x3f, 0xea, 0x62, 0x66, 0xae, 0x9b, - 0xc9, 0x98, 0x2c, 0x42, 0xc5, 0xe3, 0x96, 0xff, 0x00, 0xf3, 0x6d, 0xdd, 0x2c, 0x7b, 0xfc, 0xf9, - 0x03, 0xe3, 0xfb, 0x12, 0xc0, 0xff, 0xef, 0x13, 0x91, 0x40, 0x19, 0x03, 0xac, 0x86, 0x2b, 0xe2, - 0x77, 0x6e, 0xd6, 0xae, 0xe7, 0x67, 0xed, 0xd7, 0x40, 0x32, 0x4e, 0x1a, 0x07, 0x58, 0x03, 0x2d, - 0x79, 0x77, 0xe6, 0x3c, 0x67, 0x2e, 0x38, 0x53, 0xd0, 0xd4, 0xb4, 0x90, 0x31, 0xed, 0x6d, 0x68, - 0x4b, 0x96, 0xd6, 0x1b, 0x1a, 0x72, 0x8f, 0x05, 0x68, 0xac, 0x86, 0xd9, 0x92, 0xd0, 0x23, 0x09, - 0x24, 0x8f, 0xa1, 0x11, 0xf6, 0x6c, 0xc7, 0x1a, 0xd0, 0xc8, 0xc6, 0x83, 0x51, 0xdb, 0xb8, 0x91, - 0x2b, 0x8b, 0xb9, 0xb5, 0xb9, 0xfd, 0x82, 0x46, 0xb6, 0x59, 0x17, 0xf8, 0xe2, 0xcb, 0xf8, 0x63, - 0xb8, 0x96, 0x4a, 0x88, 0x67, 0x63, 0xc6, 0xfe, 0xbf, 0x83, 0x8a, 0x3c, 0x6c, 0x0a, 0x97, 0xdd, - 0xa0, 0xa4, 0x33, 0xbe, 0x82, 0x4e, 0x92, 0x12, 0xa7, 0x99, 0x7f, 0x36, 0xc9, 0x7c, 0xf6, 0x63, - 0x57, 0xf1, 0x3e, 0x82, 0x65, 0x95, 0x63, 0xa6, 0x39, 0xff, 0x66, 0x92, 0xf3, 0xac, 0x89, 0x4f, - 0xf1, 0xfd, 0xdb, 0x12, 0x2c, 0x6e, 0x87, 0xd4, 0x8e, 0xa8, 0x9c, 0x33, 0xe9, 0xd7, 0x23, 0xca, - 0x23, 0xf2, 0x33, 0x68, 0x84, 0xf2, 0xb3, 0x1b, 0xc7, 0x44, 0x0a, 0x20, 0x37, 0x41, 0x53, 0x3e, - 0x94, 0xc9, 0xdf, 0x20, 0x41, 0x7b, 0xca, 0xc9, 0xa6, 0x8a, 0x29, 0xde, 0x29, 0xad, 0x96, 0xd6, - 0x1a, 0xe6, 0xfc, 0x64, 0x35, 0xc5, 0xc5, 0x19, 0x63, 0xf3, 0x71, 0xe0, 0xa0, 0xd3, 0xd7, 0x4d, - 0x39, 0x20, 0xbf, 0x85, 0xb6, 0xdb, 0xb3, 0x52, 0x5c, 0x8e, 0x6e, 0xaf, 0x6d, 0x2c, 0xaf, 0xcb, - 0xc2, 0x7e, 0x3d, 0x2e, 0xec, 0xd7, 0x8f, 0xc4, 0x99, 0x64, 0xb6, 0xdc, 0x5e, 0x6a, 0x1a, 0x64, - 0x7a, 0xcc, 0x42, 0x47, 0x66, 0xeb, 0xba, 0x29, 0x07, 0xa2, 0xe2, 0x10, 0x5e, 0x63, 0xb1, 0xc0, - 0x1f, 0x63, 0x4c, 0xd4, 0xcd, 0xba, 0x00, 0xbc, 0x0c, 0xfc, 0x31, 0xb9, 0x03, 0xf3, 0x7d, 0xc7, - 0x1a, 0xda, 0x23, 0x4e, 0x2d, 0x1a, 0xd8, 0x3d, 0x5f, 0x26, 0x9e, 0xba, 0xd9, 0xea, 0x3b, 0xfb, - 0x02, 0xba, 0x8b, 0x40, 0xb2, 0x06, 0x7a, 0x82, 0xc7, 0xa9, 0xc3, 0x02, 0x97, 0x63, 0x26, 0xaa, - 0x98, 0x6d, 0x85, 0x78, 0x20, 0xa1, 0x13, 0x98, 0xb6, 0xeb, 0x62, 0x84, 0x82, 0x2c, 0x29, 0x15, - 0xe6, 0xa6, 0x84, 0x8a, 0x70, 0x10, 0x3e, 0x1a, 0x67, 0x27, 0xf1, 0x6d, 0x7c, 0x5b, 0x00, 0x92, - 0xb1, 0x17, 0xe5, 0x43, 0x16, 0x70, 0xfa, 0x01, 0xc3, 0x7c, 0x0c, 0xe5, 0x4c, 0xb6, 0xba, 0x95, - 0x1f, 0x17, 0x8a, 0x15, 0xa6, 0x29, 0x44, 0x17, 0x27, 0xff, 0x80, 0xf7, 0x55, 0x62, 0x12, 0x9f, - 0xe4, 0x21, 0x94, 0x5d, 0x3b, 0xb2, 0xd1, 0x28, 0xda, 0xc6, 0xcd, 0x0b, 0xd2, 0x1e, 0x4a, 0x87, - 0xc8, 0xc6, 0xbf, 0x14, 0x40, 0x7f, 0x4a, 0xa3, 0x1f, 0xd4, 0x93, 0xae, 0x43, 0x43, 0x21, 0xa8, - 0x03, 0xb0, 0x11, 0xa7, 0x75, 0x45, 0x3d, 0x72, 0x4e, 0x69, 0x24, 0xa9, 0xcb, 0x8a, 0x1a, 0x41, - 0x48, 0x4d, 0xa0, 0x3c, 0xb4, 0xa3, 0x13, 0x74, 0x9e, 0x86, 0x89, 0xdf, 0x22, 0xcf, 0xbc, 0xf5, - 0xa2, 0x13, 0x36, 0x8a, 0x2c, 0x97, 0x46, 0xb6, 0xe7, 0x2b, 0x27, 0x69, 0x29, 0xe8, 0x0e, 0x02, - 0x8d, 0x3f, 0x02, 0xf2, 0xdc, 0xe3, 0x71, 0x61, 0x30, 0xdb, 0x6e, 0x72, 0xee, 0x10, 0xc5, 0xbc, - 0x3b, 0x84, 0xf1, 0x0f, 0x05, 0x58, 0x9c, 0xe0, 0xfe, 0x63, 0x59, 0xb7, 0x34, 0xbb, 0x75, 0x0f, - 0x61, 0x71, 0x87, 0xfa, 0xf4, 0x87, 0xcd, 0x14, 0xc6, 0x9f, 0xc3, 0xd2, 0x24, 0xd7, 0xff, 0x55, - 0x4d, 0x18, 0xff, 0x5e, 0x85, 0x25, 0x93, 0xf2, 0x88, 0x85, 0x3f, 0x5a, 0x02, 0xfc, 0x25, 0x64, - 0x0e, 0x48, 0x8b, 0x8f, 0x8e, 0x8f, 0xbd, 0x77, 0xca, 0x95, 0x33, 0x3c, 0x0e, 0x10, 0x4e, 0xd8, - 0xc4, 0x91, 0x1c, 0x52, 0xc9, 0x59, 0x96, 0x76, 0x9f, 0x9f, 0xa7, 0x86, 0x33, 0xbb, 0xcb, 0x1c, - 0x63, 0xa6, 0x64, 0x21, 0x6f, 0x1e, 0x19, 0x41, 0x14, 0x3c, 0x4d, 0xcf, 0xd5, 0x6c, 0x7a, 0x9e, - 0x0a, 0xbc, 0xda, 0xb9, 0x81, 0x57, 0xcf, 0x04, 0xde, 0xd9, 0x9c, 0xde, 0xb8, 0x4c, 0x4e, 0x5f, - 0x81, 0x24, 0x59, 0xc7, 0xf5, 0x5d, 0x92, 0xbc, 0x0d, 0x68, 0x86, 0x72, 0x9f, 0x78, 0x1b, 0x54, - 0x89, 0x74, 0x02, 0x26, 0x70, 0x44, 0xca, 0x1d, 0x45, 0x4c, 0xe2, 0x34, 0x25, 0x4e, 0x16, 0x46, - 0x1e, 0xc0, 0xa2, 0x1b, 0xb2, 0xe1, 0xee, 0x3b, 0x8f, 0x47, 0xe9, 0xda, 0x9d, 0x16, 0xa2, 0xe6, - 0x4d, 0x91, 0x3b, 0xd0, 0x4e, 0xc0, 0x92, 0x6f, 0x1b, 0x91, 0xa7, 0xa0, 0x64, 0x03, 0x96, 0xf8, - 0xa9, 0x37, 0x94, 0x67, 0x6d, 0x86, 0xf5, 0x3c, 0x62, 0xe7, 0xce, 0xa9, 0x8a, 0x54, 0x4f, 0x2a, - 0xd2, 0xc7, 0xd0, 0x11, 0x78, 0xdd, 0xc1, 0x90, 0x85, 0xd1, 0x8e, 0xc7, 0x4f, 0xff, 0x70, 0xc4, - 0x22, 0x1b, 0xef, 0x71, 0x9d, 0x05, 0xe4, 0x73, 0xee, 0x7c, 0x72, 0xc4, 0x90, 0xf4, 0x88, 0x21, - 0xab, 0xa0, 0x0d, 0xec, 0x77, 0x07, 0x27, 0x76, 0xe8, 0xee, 0x8d, 0x06, 0x78, 0xed, 0xad, 0x98, - 0x59, 0xd0, 0xca, 0x0e, 0x2c, 0xe7, 0xbb, 0xca, 0xa5, 0x2e, 0x8b, 0xdf, 0x15, 0x93, 0x20, 0x4b, - 0x4a, 0x1c, 0x51, 0x2d, 0x9f, 0x29, 0xb9, 0x9f, 0xe5, 0x94, 0xdc, 0x77, 0x2f, 0xf2, 0xea, 0xff, - 0x83, 0x35, 0x77, 0x17, 0xf0, 0x82, 0xa6, 0xca, 0x65, 0x0c, 0x8d, 0xcb, 0xd4, 0x7b, 0x20, 0x88, - 0xe5, 0xd8, 0xf8, 0xab, 0x1a, 0x5c, 0x51, 0x1b, 0x4d, 0xad, 0xf0, 0x93, 0x56, 0xdc, 0x17, 0xa0, - 0x89, 0xf8, 0x8f, 0x95, 0x53, 0x45, 0xe5, 0x5c, 0xa2, 0xd2, 0x06, 0x41, 0x2d, 0xc7, 0xe4, 0xd7, - 0xb0, 0x1c, 0xd9, 0x61, 0x9f, 0x46, 0xd6, 0xf4, 0x99, 0x2b, 0xd3, 0xd1, 0x92, 0x9c, 0xdd, 0x9e, - 0x7c, 0xbd, 0xb3, 0xe1, 0x6a, 0x7a, 0xa7, 0x56, 0xf9, 0xc1, 0x8a, 0x6c, 0x7e, 0xca, 0x3b, 0xf5, - 0x0b, 0xea, 0xfe, 0x3c, 0xf7, 0x35, 0xaf, 0x24, 0x9c, 0x32, 0x5a, 0xc5, 0x77, 0x48, 0xc5, 0xd8, - 0xb5, 0xf0, 0x96, 0x23, 0x2f, 0xaa, 0x71, 0x36, 0x72, 0x0f, 0xc4, 0x6d, 0xe7, 0x0e, 0xcc, 0x47, - 0x2c, 0x11, 0x20, 0x73, 0x19, 0x6a, 0x45, 0x4c, 0x71, 0x43, 0xbc, 0xac, 0xab, 0x69, 0x53, 0xae, - 0xf6, 0x11, 0xb4, 0x95, 0x06, 0xe2, 0x27, 0xcd, 0xa6, 0xb4, 0x96, 0x84, 0xee, 0xc8, 0x87, 0xcd, - 0x6c, 0xde, 0x6c, 0x7d, 0x20, 0x6f, 0xb6, 0x67, 0xc8, 0x9b, 0xf3, 0xb3, 0xe7, 0x4d, 0xfd, 0x32, - 0x79, 0x73, 0xe1, 0x52, 0x79, 0x93, 0x5c, 0x90, 0x37, 0xd7, 0x81, 0x08, 0xf8, 0x54, 0x86, 0x5c, - 0x44, 0x8a, 0x9c, 0x99, 0xe9, 0x3c, 0xb8, 0x74, 0x26, 0x0f, 0x1a, 0x7f, 0x57, 0x82, 0x85, 0x89, - 0x83, 0xf4, 0x27, 0x1d, 0x85, 0x2e, 0x74, 0x26, 0x8a, 0x88, 0x6c, 0x10, 0x54, 0x2f, 0xe8, 0x52, - 0xe4, 0xe6, 0x22, 0x73, 0x39, 0x5b, 0x34, 0x5c, 0x14, 0x06, 0xb5, 0xd9, 0xc2, 0xa0, 0xfe, 0xa1, - 0x30, 0x68, 0x4c, 0x86, 0x81, 0xf1, 0x4f, 0x85, 0x24, 0x4d, 0xfe, 0x28, 0x45, 0x24, 0x79, 0x3c, - 0x71, 0x59, 0xba, 0xf3, 0xe1, 0x32, 0x0c, 0xf5, 0x26, 0xab, 0xea, 0x27, 0xb0, 0xfc, 0x94, 0x46, - 0xf1, 0x56, 0x85, 0x03, 0xcc, 0x56, 0x81, 0x4a, 0xdf, 0x2b, 0xc6, 0xbe, 0x67, 0xfc, 0x29, 0x68, - 0x99, 0x67, 0x34, 0xd2, 0x81, 0x1a, 0x76, 0xb0, 0xba, 0x3b, 0xea, 0xed, 0x31, 0x1e, 0x92, 0x8f, - 0xd3, 0x17, 0xc1, 0x22, 0xda, 0xfa, 0x7a, 0x7e, 0xf9, 0x3f, 0xf9, 0x18, 0x68, 0xfc, 0x7d, 0x01, - 0xaa, 0x8a, 0xf7, 0x4d, 0xd0, 0x68, 0x10, 0x85, 0x1e, 0x95, 0x2d, 0x0c, 0xc9, 0x1f, 0x14, 0x68, - 0x6f, 0x34, 0x10, 0x37, 0xac, 0xe4, 0x6d, 0xc9, 0x3a, 0x0e, 0xd9, 0x00, 0xe5, 0x2c, 0x9b, 0xad, - 0x04, 0xfa, 0x24, 0x64, 0x03, 0x72, 0x0b, 0x9a, 0x29, 0x5a, 0xc4, 0x50, 0xa3, 0x65, 0x53, 0x4b, - 0x60, 0x87, 0x4c, 0x38, 0xb1, 0xcf, 0xfa, 0x16, 0x96, 0x92, 0xb2, 0x24, 0xae, 0xf9, 0xac, 0xbf, - 0x2f, 0xaa, 0x49, 0x35, 0x95, 0x79, 0xad, 0x15, 0x53, 0xc2, 0x59, 0x8c, 0x47, 0xd0, 0xfc, 0x92, - 0x8e, 0xb1, 0x88, 0xdc, 0xb7, 0xbd, 0x70, 0xd6, 0x5a, 0xc5, 0xf8, 0xaf, 0x02, 0x00, 0x52, 0xa1, - 0x26, 0xc9, 0x0d, 0x68, 0xf4, 0x18, 0xf3, 0x2d, 0xb4, 0xad, 0x20, 0xae, 0x3f, 0x9b, 0x33, 0xeb, - 0x02, 0xb4, 0x63, 0x47, 0x36, 0xb9, 0x0e, 0x75, 0x2f, 0x88, 0xe4, 0xac, 0x60, 0x53, 0x79, 0x36, - 0x67, 0xd6, 0xbc, 0x20, 0xc2, 0xc9, 0x1b, 0xd0, 0xf0, 0x59, 0xd0, 0x97, 0xb3, 0xf8, 0x6e, 0x2b, - 0x68, 0x05, 0x08, 0xa7, 0x6f, 0x02, 0x1c, 0xfb, 0xcc, 0x56, 0xd4, 0x62, 0x67, 0xc5, 0x67, 0x73, - 0x66, 0x03, 0x61, 0x88, 0x70, 0x0b, 0x34, 0x97, 0x8d, 0x7a, 0x3e, 0x95, 0x18, 0x62, 0x83, 0x85, - 0x67, 0x73, 0x26, 0x48, 0x60, 0x8c, 0xc2, 0xa3, 0xd0, 0x8b, 0x17, 0xc1, 0x77, 0x69, 0x81, 0x22, - 0x81, 0xf1, 0x32, 0xbd, 0x71, 0x44, 0xb9, 0xc4, 0x10, 0xf1, 0xd7, 0x14, 0xcb, 0x20, 0x4c, 0x20, - 0x6c, 0x55, 0xa5, 0xe7, 0x1a, 0xdf, 0x55, 0x94, 0xfb, 0xc8, 0x66, 0xd5, 0x05, 0xee, 0x13, 0x3f, - 0x29, 0x16, 0x33, 0x4f, 0x8a, 0x1f, 0x41, 0xdb, 0xe3, 0xd6, 0x30, 0xf4, 0x06, 0x76, 0x38, 0xb6, - 0x84, 0xaa, 0x4b, 0xf2, 0x8c, 0xf0, 0xf8, 0xbe, 0x04, 0x7e, 0x49, 0xc7, 0x22, 0xcb, 0xba, 0x94, - 0x3b, 0xa1, 0x37, 0xc4, 0x04, 0x2e, 0xcd, 0x99, 0x05, 0x91, 0xc7, 0xd0, 0x10, 0xd2, 0xc8, 0x4e, - 0x6a, 0x05, 0xa3, 0x32, 0xff, 0x69, 0x4f, 0xc8, 0x7e, 0x38, 0x1e, 0x52, 0xb3, 0xee, 0xaa, 0x2f, - 0xb2, 0x05, 0x9a, 0x20, 0xb3, 0x54, 0xb3, 0x55, 0xa6, 0xb1, 0xfc, 0x98, 0xce, 0xfa, 0x86, 0x09, - 0x82, 0x4a, 0x76, 0x57, 0xc9, 0x0e, 0x34, 0x65, 0xd3, 0x49, 0x31, 0xa9, 0xcd, 0xca, 0x44, 0xf6, - 0xaa, 0x14, 0x97, 0x65, 0xa8, 0xda, 0xe2, 0x60, 0xdc, 0x51, 0xef, 0x47, 0x6a, 0x44, 0x3e, 0x86, - 0x8a, 0xec, 0x20, 0x34, 0x70, 0x67, 0x37, 0xcf, 0x7f, 0x0a, 0x97, 0x69, 0x40, 0x62, 0x93, 0xcf, - 0xa1, 0x49, 0x7d, 0x8a, 0x8d, 0x04, 0xd4, 0x0b, 0xcc, 0xa2, 0x17, 0x4d, 0x91, 0xa0, 0x6a, 0x76, - 0xa0, 0xe5, 0xd2, 0x63, 0x7b, 0xe4, 0x47, 0x96, 0x74, 0x7a, 0xed, 0x82, 0x47, 0x9d, 0xd4, 0xff, - 0xcd, 0xa6, 0xa2, 0x42, 0x10, 0xf6, 0xb9, 0xb9, 0xe5, 0x8e, 0x03, 0x7b, 0xe0, 0x39, 0xea, 0xf2, - 0xd4, 0xf0, 0xf8, 0x8e, 0x04, 0x90, 0x35, 0xd0, 0x85, 0x0f, 0x24, 0xa5, 0x95, 0xf0, 0x02, 0x59, - 0x6d, 0xb4, 0x3d, 0x9e, 0x94, 0x4d, 0xc2, 0x0f, 0x56, 0xa0, 0x1e, 0x8c, 0x7c, 0x1f, 0x5f, 0xd8, - 0x64, 0xbd, 0x91, 0x8c, 0xc9, 0x3a, 0x2c, 0x4e, 0x88, 0x6a, 0xa1, 0x6c, 0x58, 0x72, 0x34, 0xcc, - 0x85, 0xac, 0x3c, 0xfb, 0xd8, 0xc8, 0xff, 0xd7, 0x02, 0xe8, 0xd3, 0x9d, 0xd6, 0xc4, 0x45, 0x0b, - 0x19, 0x17, 0x9d, 0x72, 0xbe, 0xe2, 0x59, 0xe7, 0x4b, 0xcd, 0x56, 0x9a, 0x30, 0xdb, 0x27, 0x50, - 0x45, 0xdf, 0x8f, 0x3b, 0x4b, 0x17, 0xb4, 0x30, 0xe2, 0x4e, 0xaf, 0xc4, 0x27, 0x0f, 0x60, 0x49, - 0x3e, 0x24, 0xc6, 0x5a, 0xb3, 0x70, 0x02, 0x3d, 0xbb, 0x6e, 0x12, 0x39, 0xa7, 0xf4, 0x87, 0xf4, - 0x46, 0x1b, 0x9a, 0x58, 0x91, 0xa8, 0x23, 0xc0, 0x78, 0x0d, 0x2d, 0x35, 0x56, 0x07, 0x5a, 0x7c, - 0x64, 0x15, 0xfe, 0x47, 0x47, 0x56, 0x31, 0x7d, 0xf7, 0xf8, 0xcb, 0x02, 0x68, 0x2f, 0x78, 0x7f, - 0x9f, 0x71, 0xb4, 0x8b, 0xc8, 0xc5, 0x71, 0x4f, 0x33, 0xa3, 0x3b, 0x4d, 0xc1, 0xb0, 0x8e, 0x5c, - 0x82, 0xca, 0x80, 0xf7, 0xbb, 0x3b, 0xc8, 0xa6, 0x69, 0xca, 0x01, 0x56, 0x97, 0xbc, 0xff, 0x34, - 0x64, 0xa3, 0x61, 0xfc, 0x3c, 0x17, 0x8f, 0xc5, 0x09, 0x96, 0xf6, 0x18, 0xca, 0x98, 0xdd, 0x53, - 0x80, 0xb1, 0x09, 0xf3, 0xaa, 0x13, 0x99, 0x48, 0x91, 0x67, 0x39, 0x71, 0xf2, 0xab, 0x79, 0xb5, - 0x81, 0x64, 0x6c, 0xac, 0x02, 0x98, 0xcc, 0xa7, 0xbb, 0x41, 0xe4, 0x45, 0xe3, 0x3c, 0x6a, 0x81, - 0xf1, 0x8a, 0xd3, 0xf0, 0x02, 0x0c, 0x03, 0x9a, 0x2f, 0x7b, 0x7f, 0x46, 0x9d, 0xe8, 0x02, 0x9c, - 0xdb, 0x30, 0xbf, 0x1f, 0x7a, 0x6f, 0x3c, 0x9f, 0xf6, 0x2f, 0x5a, 0xec, 0x9b, 0x02, 0xb4, 0x9e, - 0x86, 0x76, 0x10, 0xb1, 0x78, 0xc1, 0x87, 0x50, 0x1e, 0x71, 0x1a, 0x22, 0xd6, 0x79, 0x11, 0x97, - 0xca, 0x67, 0x22, 0x32, 0xd9, 0x82, 0xc6, 0x30, 0x5e, 0x0d, 0xb7, 0xac, 0x6d, 0x7c, 0x94, 0x7f, - 0x7f, 0x9c, 0x94, 0xc9, 0x4c, 0xc9, 0x8c, 0x23, 0x58, 0x42, 0x49, 0xa6, 0xc5, 0xfe, 0x4c, 0x54, - 0x85, 0x22, 0x16, 0x69, 0xdc, 0x30, 0x30, 0x72, 0x59, 0x4f, 0x6c, 0xc3, 0x4c, 0x68, 0x8c, 0xff, - 0x2c, 0x80, 0x86, 0x73, 0xe9, 0x06, 0x43, 0xe6, 0xd3, 0x0b, 0x37, 0x98, 0x9a, 0xc8, 0x44, 0x64, - 0xf2, 0x29, 0x54, 0x19, 0xaa, 0x5c, 0xed, 0x2e, 0xdf, 0x8f, 0xb3, 0x56, 0x31, 0x15, 0x81, 0xa8, - 0x3d, 0xe4, 0x97, 0x74, 0x53, 0xe9, 0x71, 0x20, 0x41, 0xe8, 0xa5, 0xbf, 0x81, 0x5a, 0x5f, 0xca, - 0xae, 0xca, 0xb1, 0x59, 0xf6, 0x17, 0x93, 0x64, 0xff, 0x0e, 0xa9, 0x64, 0xff, 0x0e, 0x31, 0xbe, - 0x86, 0xba, 0xb0, 0x13, 0x76, 0x5c, 0x48, 0xc6, 0xa8, 0x0d, 0x65, 0x33, 0xe1, 0xa5, 0x36, 0xe7, - 0x6f, 0x59, 0xe8, 0x26, 0x5e, 0xaa, 0xc6, 0x22, 0xf1, 0x8b, 0x6d, 0xcb, 0x07, 0xc0, 0x19, 0x94, - 0x24, 0xb1, 0x8d, 0x6f, 0x0b, 0x50, 0x8f, 0x7b, 0x58, 0xe4, 0x21, 0x54, 0xc4, 0x3a, 0xb1, 0xd1, - 0x6e, 0x9c, 0xeb, 0x49, 0xb2, 0xb9, 0x83, 0xb8, 0xe9, 0xc2, 0xc5, 0xcb, 0x2c, 0x2c, 0x32, 0x1e, - 0xea, 0x23, 0x16, 0x78, 0xf5, 0x7c, 0x0d, 0xc6, 0xd6, 0x91, 0xf8, 0xf7, 0xfe, 0x02, 0x9a, 0xd9, - 0xec, 0x43, 0x34, 0xa8, 0x1d, 0x8c, 0x1c, 0x87, 0x72, 0xae, 0xcf, 0x91, 0x79, 0xd0, 0xf6, 0x58, - 0x64, 0x1d, 0x8c, 0x86, 0x43, 0x16, 0x46, 0x7a, 0x81, 0x2c, 0x40, 0x6b, 0x8f, 0x59, 0xfb, 0x34, - 0x1c, 0x78, 0x9c, 0x7b, 0x2c, 0xd0, 0x8b, 0xa4, 0x0e, 0xe5, 0x27, 0xb6, 0xe7, 0xeb, 0x25, 0xb2, - 0x04, 0xf3, 0x78, 0x9e, 0xd2, 0x88, 0x86, 0xd6, 0xae, 0xb8, 0xf7, 0xe8, 0x7f, 0x5d, 0x22, 0x37, - 0xa0, 0xa3, 0x72, 0xa3, 0x25, 0xdd, 0xc3, 0x12, 0x2c, 0x9f, 0xb0, 0x51, 0xe0, 0xea, 0x7f, 0x53, - 0xba, 0xf7, 0x0e, 0x16, 0x73, 0x7a, 0xb1, 0x84, 0x40, 0x7b, 0x6b, 0x73, 0xfb, 0xcb, 0x57, 0xfb, - 0x56, 0x77, 0xaf, 0x7b, 0xd8, 0xdd, 0x7c, 0xae, 0xcf, 0x91, 0x25, 0xd0, 0x15, 0x6c, 0xf7, 0xf5, - 0xee, 0xf6, 0xab, 0xc3, 0xee, 0xde, 0x53, 0xbd, 0x90, 0xc1, 0x3c, 0x78, 0xb5, 0xbd, 0xbd, 0x7b, - 0x70, 0xa0, 0x17, 0x85, 0xdc, 0x0a, 0xf6, 0x64, 0xb3, 0xfb, 0x5c, 0x2f, 0x65, 0x90, 0x0e, 0xbb, - 0x2f, 0x76, 0x5f, 0xbe, 0x3a, 0xd4, 0xcb, 0xf7, 0x8e, 0x92, 0x17, 0xae, 0xc9, 0xa5, 0x35, 0xa8, - 0xa5, 0x6b, 0xb6, 0xa0, 0x91, 0x5d, 0x4c, 0x68, 0x27, 0x59, 0x45, 0xec, 0x5c, 0xb2, 0xd7, 0xa0, - 0x96, 0xf2, 0x7d, 0x2d, 0xce, 0xb7, 0xa9, 0xdf, 0x79, 0x00, 0xaa, 0x07, 0x51, 0xc8, 0x82, 0xbe, - 0x3e, 0x87, 0x3c, 0xa8, 0xd4, 0x1e, 0x32, 0xdc, 0x12, 0xaa, 0xa0, 0xae, 0x5e, 0x24, 0x6d, 0x80, - 0xdd, 0x37, 0x34, 0x88, 0x46, 0xb6, 0xef, 0x8f, 0xf5, 0x92, 0x18, 0x6f, 0x8f, 0x78, 0xc4, 0x06, - 0xde, 0x7b, 0xea, 0xea, 0xe5, 0x7b, 0xdf, 0x17, 0xa0, 0x1e, 0xd7, 0x0b, 0x62, 0xf5, 0x3d, 0x16, - 0x50, 0x7d, 0x4e, 0x7c, 0x6d, 0x31, 0xe6, 0xeb, 0x05, 0xf1, 0xd5, 0x0d, 0xa2, 0x4f, 0xf4, 0x22, - 0x69, 0x40, 0xa5, 0x1b, 0x44, 0xbf, 0x7a, 0xa4, 0x97, 0xd4, 0xe7, 0xc3, 0x0d, 0xbd, 0xac, 0x3e, - 0x1f, 0xfd, 0x5a, 0xaf, 0x88, 0xcf, 0x27, 0xa2, 0x74, 0xd5, 0x41, 0x08, 0xb7, 0x83, 0x35, 0xaa, - 0xae, 0x29, 0x41, 0xbd, 0xa0, 0xaf, 0x2f, 0x09, 0xd9, 0x8e, 0xec, 0x70, 0xfb, 0xc4, 0x0e, 0xf5, - 0x2b, 0x02, 0x7f, 0x33, 0x0c, 0xed, 0xb1, 0xbe, 0x2c, 0x56, 0xf9, 0x82, 0xb3, 0x40, 0xbf, 0x4a, - 0x74, 0x68, 0x6e, 0x79, 0x81, 0x1d, 0x8e, 0x8f, 0xa8, 0x13, 0xb1, 0x50, 0x77, 0x85, 0xe6, 0x91, - 0xad, 0x02, 0x50, 0xe1, 0x31, 0x08, 0xf8, 0xd5, 0x23, 0x05, 0x3a, 0x46, 0x63, 0x4c, 0xc2, 0xfa, - 0xe4, 0x0a, 0x2c, 0x1c, 0x0c, 0xed, 0x90, 0xd3, 0x2c, 0xf5, 0xc9, 0xbd, 0x23, 0x80, 0xb4, 0xbc, - 0x12, 0xcb, 0xe1, 0x48, 0xbe, 0x1e, 0xb8, 0xfa, 0x1c, 0x72, 0x4f, 0x20, 0x42, 0xea, 0x42, 0x02, - 0xda, 0x09, 0xd9, 0x70, 0x28, 0x40, 0xc5, 0x84, 0x0e, 0x41, 0xd4, 0xd5, 0x4b, 0x1b, 0xff, 0x5c, - 0x81, 0xc5, 0x17, 0x18, 0x21, 0xd2, 0xf9, 0x0e, 0x68, 0xf8, 0xc6, 0x73, 0x28, 0x71, 0xa0, 0x99, - 0x6d, 0xad, 0x92, 0xfc, 0x47, 0xc0, 0x9c, 0xee, 0xeb, 0xca, 0x2f, 0x3e, 0xd4, 0x91, 0x51, 0x41, - 0x66, 0xcc, 0x91, 0x3f, 0x81, 0x46, 0xd2, 0x72, 0x23, 0xf9, 0x7f, 0x88, 0x4d, 0xb7, 0xe4, 0x2e, - 0xc3, 0xbe, 0x07, 0x5a, 0xa6, 0x4f, 0x45, 0xf2, 0x29, 0xcf, 0xf6, 0xc9, 0x56, 0xd6, 0x3e, 0x8c, - 0x98, 0xac, 0x41, 0xa1, 0x99, 0x6d, 0x01, 0x9d, 0xa3, 0xa7, 0x9c, 0xde, 0xd3, 0xca, 0xdd, 0x19, - 0x30, 0x93, 0x65, 0x4e, 0xa0, 0x35, 0x71, 0x09, 0x27, 0x77, 0x67, 0xee, 0x97, 0xac, 0xdc, 0x9b, - 0x05, 0x35, 0x59, 0xa9, 0x0f, 0x90, 0xde, 0xe9, 0xc9, 0x2f, 0xcf, 0x33, 0x4a, 0xce, 0xa5, 0xff, - 0x92, 0x0b, 0xed, 0x43, 0x45, 0xbe, 0x60, 0xe5, 0x9f, 0xa0, 0xd9, 0x5a, 0x72, 0xc5, 0xb8, 0x08, - 0x25, 0xe6, 0xb8, 0xf5, 0xe9, 0x57, 0x7f, 0xd0, 0xf7, 0xa2, 0x93, 0x51, 0x6f, 0xdd, 0x61, 0x83, - 0xfb, 0xef, 0x3d, 0xdf, 0xf7, 0xde, 0x47, 0xd4, 0x39, 0xb9, 0x2f, 0x89, 0x7f, 0x5f, 0x92, 0xdd, - 0x77, 0x58, 0xa8, 0xfe, 0xad, 0xbd, 0x2f, 0x21, 0xc3, 0x5e, 0xaf, 0x8a, 0xe3, 0x87, 0xff, 0x1d, - 0x00, 0x00, 0xff, 0xff, 0xfb, 0x9e, 0x25, 0x80, 0x9e, 0x2b, 0x00, 0x00, + // 3595 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcb, 0x72, 0x1c, 0xc9, + 0x71, 0x98, 0x17, 0x66, 0x3a, 0xe7, 0x81, 0x46, 0x01, 0x24, 0x67, 0xb1, 0xa2, 0x88, 0x6d, 0xed, + 0x52, 0x20, 0x64, 0x83, 0x14, 0x28, 0xae, 0x77, 0x19, 0xd2, 0x4a, 0x78, 0x91, 0x1c, 0x2d, 0x09, + 0xc2, 0x0d, 0x90, 0xb1, 0x21, 0x3f, 0x3a, 0x7a, 0xa6, 0x0b, 0x83, 0x36, 0x7a, 0xba, 0x46, 0x5d, + 0xd5, 0x24, 0x67, 0x23, 0xec, 0xf0, 0xcd, 0x3a, 0xfa, 0xe0, 0x08, 0x47, 0xf8, 0x0f, 0x7c, 0x93, + 0x0f, 0xf2, 0xc1, 0x7f, 0x60, 0x1f, 0x1d, 0xe1, 0x1f, 0xf0, 0xc5, 0x47, 0x5d, 0xec, 0xf0, 0xd5, + 0x51, 0x59, 0xd5, 0x8f, 0x19, 0x34, 0xc0, 0x81, 0x43, 0xe1, 0xb5, 0x74, 0xeb, 0xca, 0xca, 0xcc, + 0xca, 0xca, 0x57, 0x65, 0x55, 0x36, 0xb4, 0xfa, 0xee, 0xe0, 0x3c, 0x1e, 0x6f, 0x8d, 0x23, 0x26, + 0x18, 0x59, 0x19, 0xf9, 0xc1, 0x9b, 0x98, 0xab, 0xd1, 0x96, 0x9a, 0x5a, 0xfb, 0xd6, 0x90, 0xb1, + 0x61, 0x40, 0xef, 0x23, 0xb0, 0x1f, 0x9f, 0xde, 0xe7, 0x22, 0x8a, 0x07, 0x42, 0x21, 0x59, 0xff, + 0x51, 0x02, 0xa3, 0x17, 0x7a, 0xf4, 0x5d, 0x2f, 0x3c, 0x65, 0xe4, 0x36, 0xc0, 0xa9, 0x4f, 0x03, + 0xcf, 0x09, 0xdd, 0x11, 0xed, 0x96, 0xd6, 0x4b, 0x1b, 0x86, 0x6d, 0x20, 0xe4, 0xd0, 0x1d, 0x51, + 0x39, 0xed, 0x4b, 0x5c, 0x35, 0x5d, 0x56, 0xd3, 0x08, 0x99, 0x9e, 0x16, 0x93, 0x31, 0xed, 0x56, + 0x72, 0xd3, 0x27, 0x93, 0x31, 0x25, 0xbb, 0xb0, 0x38, 0x76, 0x23, 0x77, 0xc4, 0xbb, 0xd5, 0xf5, + 0xca, 0x46, 0x73, 0x7b, 0x73, 0xab, 0x40, 0xdc, 0xad, 0x54, 0x98, 0xad, 0x23, 0x44, 0x3e, 0x08, + 0x45, 0x34, 0xb1, 0x35, 0xe5, 0xda, 0xe7, 0xd0, 0xcc, 0x81, 0x89, 0x09, 0x95, 0x73, 0x3a, 0xd1, + 0x82, 0xca, 0x4f, 0xb2, 0x0a, 0xb5, 0x37, 0x6e, 0x10, 0x27, 0xd2, 0xa9, 0xc1, 0xe3, 0xf2, 0x67, + 0x25, 0xeb, 0xdf, 0x1a, 0xb0, 0xba, 0xc7, 0x82, 0x80, 0x0e, 0x84, 0xcf, 0xc2, 0x5d, 0x5c, 0x0d, + 0x37, 0xdd, 0x81, 0xb2, 0xef, 0x69, 0x1e, 0x65, 0xdf, 0x23, 0x4f, 0x01, 0xb8, 0x70, 0x05, 0x75, + 0x06, 0xcc, 0x53, 0x7c, 0x3a, 0xdb, 0x1b, 0x85, 0xb2, 0x2a, 0x26, 0x27, 0x2e, 0x3f, 0x3f, 0x96, + 0x04, 0x7b, 0xcc, 0xa3, 0xb6, 0xc1, 0x93, 0x4f, 0x62, 0x41, 0x8b, 0x46, 0x11, 0x8b, 0x5e, 0x50, + 0xce, 0xdd, 0x61, 0xa2, 0x91, 0x29, 0x98, 0xd4, 0x19, 0x17, 0x6e, 0x24, 0x1c, 0xe1, 0x8f, 0x68, + 0xb7, 0xba, 0x5e, 0xda, 0xa8, 0x20, 0x8b, 0x48, 0x9c, 0xf8, 0x23, 0x4a, 0x3e, 0x80, 0x06, 0x0d, + 0x3d, 0x35, 0x59, 0xc3, 0xc9, 0x3a, 0x0d, 0x3d, 0x9c, 0x5a, 0x83, 0xc6, 0x38, 0x62, 0xc3, 0x88, + 0x72, 0xde, 0x5d, 0x5c, 0x2f, 0x6d, 0xd4, 0xec, 0x74, 0x4c, 0xbe, 0x03, 0xed, 0x41, 0xba, 0x55, + 0xc7, 0xf7, 0xba, 0x75, 0xa4, 0x6d, 0x65, 0xc0, 0x9e, 0x47, 0x6e, 0x41, 0xdd, 0xeb, 0x2b, 0x53, + 0x36, 0x50, 0xb2, 0x45, 0xaf, 0x8f, 0x76, 0xfc, 0x2e, 0x2c, 0xe5, 0xa8, 0x11, 0xc1, 0x40, 0x84, + 0x4e, 0x06, 0x46, 0xc4, 0x1f, 0xc1, 0x22, 0x1f, 0x9c, 0xd1, 0x91, 0xdb, 0x85, 0xf5, 0xd2, 0x46, + 0x73, 0xfb, 0x93, 0x42, 0x2d, 0x65, 0x4a, 0x3f, 0x46, 0x64, 0x5b, 0x13, 0xe1, 0xde, 0xcf, 0xdc, + 0xc8, 0xe3, 0x4e, 0x18, 0x8f, 0xba, 0x4d, 0xdc, 0x83, 0xa1, 0x20, 0x87, 0xf1, 0x88, 0xd8, 0xb0, + 0x3c, 0x60, 0x21, 0xf7, 0xb9, 0xa0, 0xe1, 0x60, 0xe2, 0x04, 0xf4, 0x0d, 0x0d, 0xba, 0x2d, 0x34, + 0xc7, 0x65, 0x0b, 0xa5, 0xd8, 0xcf, 0x25, 0xb2, 0x6d, 0x0e, 0x66, 0x20, 0xe4, 0x15, 0x2c, 0x8f, + 0xdd, 0x48, 0xf8, 0xb8, 0x33, 0x45, 0xc6, 0xbb, 0x6d, 0x74, 0xc7, 0x62, 0x13, 0x1f, 0x25, 0xd8, + 0x99, 0xc3, 0xd8, 0xe6, 0x78, 0x1a, 0xc8, 0xc9, 0x3d, 0x30, 0x15, 0x3e, 0x5a, 0x8a, 0x0b, 0x77, + 0x34, 0xee, 0x76, 0xd6, 0x4b, 0x1b, 0x55, 0x7b, 0x49, 0xc1, 0x4f, 0x12, 0x30, 0x21, 0x50, 0xe5, + 0xfe, 0xd7, 0xb4, 0xbb, 0x84, 0x16, 0xc1, 0x6f, 0xf2, 0x21, 0x18, 0x67, 0x2e, 0x77, 0x30, 0x54, + 0xba, 0xe6, 0x7a, 0x69, 0xa3, 0x61, 0x37, 0xce, 0x5c, 0x8e, 0xa1, 0x40, 0x7e, 0x0c, 0x4d, 0x15, + 0x55, 0x7e, 0x78, 0xca, 0x78, 0x77, 0x19, 0x85, 0xfd, 0xf6, 0xd5, 0xb1, 0x63, 0xab, 0x40, 0x94, + 0x9f, 0x5c, 0xaa, 0x39, 0x60, 0xae, 0xe7, 0xa0, 0x63, 0x76, 0x89, 0x0a, 0x4b, 0x09, 0x41, 0xa7, + 0x25, 0x8f, 0xe1, 0x03, 0x2d, 0xfb, 0xf8, 0x6c, 0xc2, 0xfd, 0x81, 0x1b, 0xe4, 0x36, 0xb1, 0x82, + 0x9b, 0xb8, 0xa5, 0x10, 0x8e, 0xf4, 0x7c, 0xb6, 0x99, 0x08, 0x56, 0x06, 0x67, 0x6e, 0x18, 0xd2, + 0xc0, 0x19, 0x9c, 0xd1, 0xc1, 0xf9, 0x98, 0xf9, 0xa1, 0xe0, 0xdd, 0x55, 0x94, 0x71, 0xe7, 0x3d, + 0xde, 0x90, 0x69, 0x74, 0x6b, 0x4f, 0x31, 0xd9, 0xcb, 0x78, 0xa8, 0xb0, 0x27, 0x83, 0x0b, 0x13, + 0xe4, 0x29, 0x34, 0x83, 0x07, 0x0e, 0xa7, 0xc3, 0x11, 0x95, 0x6b, 0xdd, 0xc0, 0xb5, 0xee, 0x16, + 0xae, 0x75, 0xac, 0x90, 0x72, 0xa6, 0x83, 0xe0, 0x81, 0x06, 0xf2, 0xb5, 0x03, 0xb8, 0x75, 0xc9, + 0xba, 0xd7, 0xca, 0x2b, 0xbf, 0x28, 0xc3, 0x4a, 0x81, 0x97, 0x90, 0x8f, 0xa0, 0x95, 0xb9, 0x9a, + 0x4e, 0x30, 0x15, 0xbb, 0x99, 0xc2, 0x7a, 0x1e, 0xf9, 0x04, 0x3a, 0x19, 0x4a, 0x2e, 0xa7, 0xb6, + 0x53, 0x28, 0x86, 0xd9, 0x85, 0x68, 0xae, 0x14, 0x44, 0xf3, 0x4b, 0x58, 0xd2, 0x3a, 0x49, 0xfd, + 0xba, 0x7a, 0x2d, 0xd5, 0x74, 0x78, 0x1e, 0xc4, 0x53, 0x47, 0xad, 0xe5, 0x1c, 0x75, 0xda, 0x95, + 0x16, 0x67, 0x5c, 0xc9, 0xfa, 0xc7, 0x0a, 0x2c, 0x5f, 0x60, 0x8c, 0x61, 0xae, 0x25, 0x4b, 0xd5, + 0x60, 0x68, 0x48, 0xcf, 0xbb, 0xb8, 0xbb, 0x72, 0xc1, 0xee, 0x66, 0x95, 0x59, 0xb9, 0xa8, 0xcc, + 0x6f, 0x43, 0x33, 0x8c, 0x47, 0x0e, 0x3b, 0x75, 0x22, 0xf6, 0x96, 0x27, 0xa9, 0x34, 0x8c, 0x47, + 0x2f, 0x4f, 0x6d, 0xf6, 0x96, 0x93, 0xc7, 0x50, 0xef, 0xfb, 0x61, 0xc0, 0x86, 0xbc, 0x5b, 0x43, + 0xc5, 0xac, 0x17, 0x2a, 0xe6, 0x89, 0x3c, 0xed, 0x76, 0x11, 0xd1, 0x4e, 0x08, 0xc8, 0x17, 0x80, + 0x69, 0x9d, 0x23, 0xf5, 0xe2, 0x9c, 0xd4, 0x19, 0x89, 0xa4, 0xf7, 0x68, 0x20, 0x5c, 0xa4, 0xaf, + 0xcf, 0x4b, 0x9f, 0x92, 0xa4, 0xb6, 0x68, 0xe4, 0x6c, 0xf1, 0x01, 0x34, 0x86, 0x11, 0x8b, 0xc7, + 0x52, 0x1d, 0x86, 0x3a, 0x1a, 0x70, 0xdc, 0xf3, 0xe4, 0xd1, 0xa0, 0xf8, 0x51, 0x0f, 0x33, 0x73, + 0xc3, 0x4e, 0xc7, 0x64, 0x05, 0x6a, 0x3e, 0x77, 0x82, 0x07, 0x98, 0x6f, 0x1b, 0x76, 0xd5, 0xe7, + 0xcf, 0x1f, 0x58, 0xbf, 0xae, 0x00, 0xfc, 0x6e, 0x9f, 0x88, 0x04, 0xaa, 0x18, 0x60, 0x75, 0x5c, + 0x11, 0xbf, 0x0b, 0xb3, 0x76, 0xa3, 0x38, 0x6b, 0x7f, 0x05, 0x24, 0xe7, 0xa4, 0x49, 0x80, 0x19, + 0x68, 0xc9, 0x7b, 0x73, 0xe7, 0x39, 0x7b, 0x79, 0x30, 0x03, 0xcd, 0x4c, 0x0b, 0x39, 0xd3, 0x7e, + 0x02, 0x1d, 0xc5, 0xd2, 0x79, 0x43, 0x23, 0xee, 0xb3, 0x10, 0x8d, 0x65, 0xd8, 0x6d, 0x05, 0x7d, + 0xad, 0x80, 0xe4, 0x31, 0x18, 0x51, 0xdf, 0x1d, 0x38, 0x23, 0x2a, 0x5c, 0x3c, 0x18, 0x9b, 0xdb, + 0xb7, 0x0b, 0x65, 0xb1, 0x77, 0x77, 0xf6, 0x5e, 0x50, 0xe1, 0xda, 0x0d, 0x89, 0x2f, 0xbf, 0xac, + 0x3f, 0x86, 0x0f, 0x32, 0x09, 0xf1, 0x6c, 0xcc, 0xd9, 0xff, 0xc7, 0x50, 0x53, 0x87, 0x4d, 0xe9, + 0xba, 0x1b, 0x54, 0x74, 0xd6, 0xcf, 0xa0, 0x9b, 0xa6, 0xc4, 0x59, 0xe6, 0x5f, 0x4c, 0x33, 0x9f, + 0xff, 0xd8, 0xd5, 0xbc, 0x5f, 0xc3, 0x4d, 0x9d, 0x63, 0x66, 0x39, 0xff, 0x70, 0x9a, 0xf3, 0xbc, + 0x89, 0x4f, 0xf3, 0xfd, 0xdb, 0x0a, 0xac, 0xec, 0x45, 0xd4, 0x15, 0x54, 0xcd, 0xd9, 0xf4, 0xe7, + 0x31, 0xe5, 0x82, 0x7c, 0x0b, 0x8c, 0x48, 0x7d, 0xf6, 0x92, 0x98, 0xc8, 0x00, 0xe4, 0x0e, 0x34, + 0xb5, 0x0f, 0xe5, 0xf2, 0x37, 0x28, 0xd0, 0xa1, 0x76, 0xb2, 0x99, 0x62, 0x8a, 0x77, 0x2b, 0xeb, + 0x95, 0x0d, 0xc3, 0x5e, 0x9a, 0xae, 0xa6, 0xb8, 0x3c, 0x63, 0x5c, 0x3e, 0x09, 0x07, 0xe8, 0xf4, + 0x0d, 0x5b, 0x0d, 0xc8, 0x8f, 0xa0, 0xe3, 0xf5, 0x9d, 0x0c, 0x97, 0xa3, 0xdb, 0x37, 0xb7, 0x6f, + 0x6e, 0xa9, 0xc2, 0x7e, 0x2b, 0x29, 0xec, 0xb7, 0x5e, 0xcb, 0x33, 0xc9, 0x6e, 0x7b, 0xfd, 0xcc, + 0x34, 0xc8, 0xf4, 0x94, 0x45, 0x03, 0x95, 0xad, 0x1b, 0xb6, 0x1a, 0xc8, 0x8a, 0x43, 0x7a, 0x8d, + 0xc3, 0xc2, 0x60, 0x82, 0x31, 0xd1, 0xb0, 0x1b, 0x12, 0xf0, 0x32, 0x0c, 0x26, 0xe4, 0x2e, 0x2c, + 0x0d, 0x07, 0xce, 0xd8, 0x8d, 0x39, 0x75, 0x68, 0xe8, 0xf6, 0x03, 0x95, 0x78, 0x1a, 0x76, 0x7b, + 0x38, 0x38, 0x92, 0xd0, 0x03, 0x04, 0x92, 0x0d, 0x30, 0x53, 0x3c, 0x4e, 0x07, 0x2c, 0xf4, 0x38, + 0x66, 0xa2, 0x9a, 0xdd, 0xd1, 0x88, 0xc7, 0x0a, 0x3a, 0x85, 0xe9, 0x7a, 0x1e, 0x46, 0x28, 0xa8, + 0x92, 0x52, 0x63, 0xee, 0x28, 0xa8, 0x0c, 0x07, 0xe9, 0xa3, 0x49, 0x76, 0x92, 0xdf, 0xd6, 0x2f, + 0x4b, 0x40, 0x72, 0xf6, 0xa2, 0x7c, 0xcc, 0x42, 0x4e, 0xdf, 0x63, 0x98, 0x47, 0x50, 0xcd, 0x65, + 0xab, 0x8f, 0x8a, 0xe3, 0x42, 0xb3, 0xc2, 0x34, 0x85, 0xe8, 0xf2, 0xe4, 0x1f, 0xf1, 0xa1, 0x4e, + 0x4c, 0xf2, 0x93, 0x3c, 0x84, 0xaa, 0xe7, 0x0a, 0x17, 0x8d, 0xd2, 0xdc, 0xbe, 0x73, 0x45, 0xda, + 0x43, 0xe9, 0x10, 0xd9, 0xfa, 0x97, 0x12, 0x98, 0x4f, 0xa9, 0xf8, 0x8d, 0x7a, 0xd2, 0x87, 0x60, + 0x68, 0x04, 0x7d, 0x00, 0x1a, 0x49, 0x5a, 0xd7, 0xd4, 0xf1, 0xe0, 0x9c, 0x0a, 0x45, 0x5d, 0xd5, + 0xd4, 0x08, 0x42, 0x6a, 0x02, 0xd5, 0xb1, 0x2b, 0xce, 0xd0, 0x79, 0x0c, 0x1b, 0xbf, 0x65, 0x9e, + 0x79, 0xeb, 0x8b, 0x33, 0x16, 0x0b, 0xc7, 0xa3, 0xc2, 0xf5, 0x03, 0xed, 0x24, 0x6d, 0x0d, 0xdd, + 0x47, 0xa0, 0xf5, 0x47, 0x40, 0x9e, 0xfb, 0x3c, 0x29, 0x0c, 0xe6, 0xdb, 0x4d, 0xc1, 0x1d, 0xa2, + 0x5c, 0x74, 0x87, 0xb0, 0xfe, 0xa1, 0x04, 0x2b, 0x53, 0xdc, 0xbf, 0x29, 0xeb, 0x56, 0xe6, 0xb7, + 0xee, 0x09, 0xac, 0xec, 0xd3, 0x80, 0xfe, 0x66, 0x33, 0x85, 0xf5, 0xe7, 0xb0, 0x3a, 0xcd, 0xf5, + 0xff, 0x54, 0x13, 0xd6, 0xbf, 0x2f, 0xc2, 0xaa, 0x4d, 0xb9, 0x60, 0xd1, 0x37, 0x96, 0x00, 0xbf, + 0x07, 0xb9, 0x03, 0xd2, 0xe1, 0xf1, 0xe9, 0xa9, 0xff, 0x4e, 0xbb, 0x72, 0x8e, 0xc7, 0x31, 0xc2, + 0x09, 0x9b, 0x3a, 0x92, 0x23, 0xaa, 0x38, 0xab, 0xd2, 0xee, 0x27, 0x97, 0xa9, 0xe1, 0xc2, 0xee, + 0x72, 0xc7, 0x98, 0xad, 0x58, 0xa8, 0x9b, 0x47, 0x4e, 0x10, 0x0d, 0xcf, 0xd2, 0xf3, 0x62, 0x3e, + 0x3d, 0xcf, 0x04, 0x5e, 0xfd, 0xd2, 0xc0, 0x6b, 0xe4, 0x02, 0xef, 0x62, 0x4e, 0x37, 0xae, 0x93, + 0xd3, 0xd7, 0x20, 0x4d, 0xd6, 0x49, 0x7d, 0x97, 0x26, 0x6f, 0x0b, 0x5a, 0x91, 0xda, 0x27, 0xde, + 0x06, 0x75, 0x22, 0x9d, 0x82, 0x49, 0x1c, 0x99, 0x72, 0x63, 0xc1, 0x14, 0x4e, 0x4b, 0xe1, 0xe4, + 0x61, 0xe4, 0x01, 0xac, 0x78, 0x11, 0x1b, 0x1f, 0xbc, 0xf3, 0xb9, 0xc8, 0xd6, 0xee, 0xb6, 0x11, + 0xb5, 0x68, 0x8a, 0xdc, 0x85, 0x4e, 0x0a, 0x56, 0x7c, 0x3b, 0x88, 0x3c, 0x03, 0x25, 0xdb, 0xb0, + 0xca, 0xcf, 0xfd, 0xb1, 0x3a, 0x6b, 0x73, 0xac, 0x97, 0x10, 0xbb, 0x70, 0x4e, 0x57, 0xa4, 0x66, + 0x5a, 0x91, 0x3e, 0x86, 0xae, 0xc4, 0xeb, 0x8d, 0xc6, 0x2c, 0x12, 0xfb, 0x3e, 0x3f, 0xff, 0xc3, + 0x98, 0x09, 0x17, 0xef, 0x71, 0xdd, 0x65, 0xe4, 0x73, 0xe9, 0x7c, 0x7a, 0xc4, 0x90, 0xec, 0x88, + 0x21, 0xeb, 0xd0, 0x1c, 0xb9, 0xef, 0x8e, 0xcf, 0xdc, 0xc8, 0x3b, 0x8c, 0x47, 0x78, 0xed, 0xad, + 0xd9, 0x79, 0xd0, 0xda, 0x3e, 0xdc, 0x2c, 0x76, 0x95, 0x6b, 0x5d, 0x16, 0x7f, 0x55, 0x4e, 0x83, + 0x2c, 0x2d, 0x71, 0x64, 0xb5, 0x7c, 0xa1, 0xe4, 0x7e, 0x56, 0x50, 0x72, 0xdf, 0xbb, 0xca, 0xab, + 0xff, 0x1f, 0xd6, 0xdc, 0x3d, 0xc0, 0x0b, 0x9a, 0x2e, 0x97, 0x31, 0x34, 0xae, 0x53, 0xef, 0x81, + 0x24, 0x56, 0x63, 0xeb, 0xaf, 0xea, 0x70, 0x43, 0x6f, 0x34, 0xb3, 0xc2, 0x6f, 0xb5, 0xe2, 0x7e, + 0x0a, 0x4d, 0x19, 0xff, 0x89, 0x72, 0x16, 0x51, 0x39, 0xd7, 0xa8, 0xb4, 0x41, 0x52, 0xab, 0x31, + 0xf9, 0x01, 0xdc, 0x14, 0x6e, 0x34, 0xa4, 0xc2, 0x99, 0x3d, 0x73, 0x55, 0x3a, 0x5a, 0x55, 0xb3, + 0x7b, 0xd3, 0xaf, 0x77, 0x2e, 0xdc, 0xca, 0xee, 0xd4, 0x3a, 0x3f, 0x38, 0xc2, 0xe5, 0xe7, 0xbc, + 0xdb, 0xb8, 0xa2, 0xee, 0x2f, 0x72, 0x5f, 0xfb, 0x46, 0xca, 0x29, 0xa7, 0x55, 0x7c, 0x87, 0xd4, + 0x8c, 0x3d, 0x07, 0x6f, 0x39, 0xea, 0xa2, 0x9a, 0x64, 0x23, 0xef, 0x58, 0xde, 0x76, 0xee, 0xc2, + 0x92, 0x60, 0xa9, 0x00, 0xb9, 0xcb, 0x50, 0x5b, 0x30, 0xcd, 0x0d, 0xf1, 0xf2, 0xae, 0xd6, 0x9c, + 0x71, 0xb5, 0x8f, 0xa1, 0xa3, 0x35, 0x90, 0x3c, 0x69, 0xb6, 0x94, 0xb5, 0x14, 0x74, 0x5f, 0x3d, + 0x6c, 0xe6, 0xf3, 0x66, 0xfb, 0x3d, 0x79, 0xb3, 0x33, 0x47, 0xde, 0x5c, 0x9a, 0x3f, 0x6f, 0x9a, + 0xd7, 0xc9, 0x9b, 0xcb, 0xd7, 0xca, 0x9b, 0xe4, 0x8a, 0xbc, 0xb9, 0x05, 0x44, 0xc2, 0x67, 0x32, + 0xe4, 0x0a, 0x52, 0x14, 0xcc, 0xcc, 0xe6, 0xc1, 0xd5, 0x0b, 0x79, 0xd0, 0xfa, 0xbb, 0x0a, 0x2c, + 0x4f, 0x1d, 0xa4, 0xbf, 0xd5, 0x51, 0xe8, 0x41, 0x77, 0xaa, 0x88, 0xc8, 0x07, 0xc1, 0xe2, 0x15, + 0x5d, 0x8a, 0xc2, 0x5c, 0x64, 0xdf, 0xcc, 0x17, 0x0d, 0x57, 0x85, 0x41, 0x7d, 0xbe, 0x30, 0x68, + 0xbc, 0x2f, 0x0c, 0x8c, 0xe9, 0x30, 0xb0, 0xfe, 0xa9, 0x94, 0xa6, 0xc9, 0x6f, 0xa4, 0x88, 0x24, + 0x8f, 0xa7, 0x2e, 0x4b, 0x77, 0xdf, 0x5f, 0x86, 0xa1, 0xde, 0x54, 0x55, 0xfd, 0x04, 0x6e, 0x3e, + 0xa5, 0x22, 0xd9, 0xaa, 0x74, 0x80, 0xf9, 0x2a, 0x50, 0xe5, 0x7b, 0xe5, 0xc4, 0xf7, 0xac, 0x3f, + 0x85, 0x66, 0xee, 0x19, 0x8d, 0x74, 0xa1, 0x8e, 0x1d, 0xac, 0xde, 0xbe, 0x7e, 0x7b, 0x4c, 0x86, + 0xe4, 0x51, 0xf6, 0x22, 0x58, 0x46, 0x5b, 0x7f, 0x58, 0x5c, 0xfe, 0x4f, 0x3f, 0x06, 0x5a, 0x7f, + 0x5f, 0x82, 0x45, 0xcd, 0xfb, 0x0e, 0x34, 0x69, 0x28, 0x22, 0x9f, 0xaa, 0x16, 0x86, 0xe2, 0x0f, + 0x1a, 0x74, 0x18, 0x8f, 0xe4, 0x0d, 0x2b, 0x7d, 0x5b, 0x72, 0x4e, 0x23, 0x36, 0x42, 0x39, 0xab, + 0x76, 0x3b, 0x85, 0x3e, 0x89, 0xd8, 0x88, 0x7c, 0x04, 0xad, 0x0c, 0x4d, 0x30, 0xd4, 0x68, 0xd5, + 0x6e, 0xa6, 0xb0, 0x13, 0x26, 0x9d, 0x38, 0x60, 0x43, 0x07, 0x4b, 0x49, 0x55, 0x12, 0xd7, 0x03, + 0x36, 0x3c, 0x92, 0xd5, 0xa4, 0x9e, 0xca, 0xbd, 0xd6, 0xca, 0x29, 0xe9, 0x2c, 0xd6, 0xa7, 0xd0, + 0xfa, 0x92, 0x4e, 0xb0, 0x88, 0x3c, 0x72, 0xfd, 0x68, 0xde, 0x5a, 0xc5, 0xfa, 0xef, 0x12, 0x00, + 0x52, 0xa1, 0x26, 0xc9, 0x6d, 0x30, 0xfa, 0x8c, 0x05, 0x0e, 0xda, 0x56, 0x12, 0x37, 0x9e, 0x2d, + 0xd8, 0x0d, 0x09, 0xda, 0x77, 0x85, 0x4b, 0x3e, 0x84, 0x86, 0x1f, 0x0a, 0x35, 0x2b, 0xd9, 0xd4, + 0x9e, 0x2d, 0xd8, 0x75, 0x3f, 0x14, 0x38, 0x79, 0x1b, 0x8c, 0x80, 0x85, 0x43, 0x35, 0x8b, 0xef, + 0xb6, 0x92, 0x56, 0x82, 0x70, 0xfa, 0x0e, 0xc0, 0x69, 0xc0, 0x5c, 0x4d, 0x2d, 0x77, 0x56, 0x7e, + 0xb6, 0x60, 0x1b, 0x08, 0x43, 0x84, 0x8f, 0xa0, 0xe9, 0xb1, 0xb8, 0x1f, 0x50, 0x85, 0x21, 0x37, + 0x58, 0x7a, 0xb6, 0x60, 0x83, 0x02, 0x26, 0x28, 0x5c, 0x44, 0x7e, 0xb2, 0x08, 0xbe, 0x4b, 0x4b, + 0x14, 0x05, 0x4c, 0x96, 0xe9, 0x4f, 0x04, 0xe5, 0x0a, 0x43, 0xc6, 0x5f, 0x4b, 0x2e, 0x83, 0x30, + 0x89, 0xb0, 0xbb, 0xa8, 0x3c, 0xd7, 0xfa, 0x55, 0x4d, 0xbb, 0x8f, 0x6a, 0x56, 0x5d, 0xe1, 0x3e, + 0xc9, 0x93, 0x62, 0x39, 0xf7, 0xa4, 0xf8, 0x31, 0x74, 0x7c, 0xee, 0x8c, 0x23, 0x7f, 0xe4, 0x46, + 0x13, 0x47, 0xaa, 0xba, 0xa2, 0xce, 0x08, 0x9f, 0x1f, 0x29, 0xe0, 0x97, 0x74, 0x22, 0xb3, 0xac, + 0x47, 0xf9, 0x20, 0xf2, 0xc7, 0x98, 0xc0, 0x95, 0x39, 0xf3, 0x20, 0xf2, 0x18, 0x0c, 0x29, 0x8d, + 0xea, 0xa4, 0xd6, 0x30, 0x2a, 0x8b, 0x9f, 0xf6, 0xa4, 0xec, 0x27, 0x93, 0x31, 0xb5, 0x1b, 0x9e, + 0xfe, 0x22, 0xbb, 0xd0, 0x94, 0x64, 0x8e, 0x6e, 0xb6, 0xaa, 0x34, 0x56, 0x1c, 0xd3, 0x79, 0xdf, + 0xb0, 0x41, 0x52, 0xa9, 0xee, 0x2a, 0xd9, 0x87, 0x96, 0x6a, 0x3a, 0x69, 0x26, 0xf5, 0x79, 0x99, + 0xa8, 0x5e, 0x95, 0xe6, 0x72, 0x13, 0x16, 0x5d, 0x79, 0x30, 0xee, 0xeb, 0xf7, 0x23, 0x3d, 0x22, + 0x8f, 0xa0, 0xa6, 0x3a, 0x08, 0x06, 0xee, 0xec, 0xce, 0xe5, 0x4f, 0xe1, 0x2a, 0x0d, 0x28, 0x6c, + 0xf2, 0x13, 0x68, 0xd1, 0x80, 0x62, 0x23, 0x01, 0xf5, 0x02, 0xf3, 0xe8, 0xa5, 0xa9, 0x49, 0x50, + 0x35, 0xfb, 0xd0, 0xf6, 0xe8, 0xa9, 0x1b, 0x07, 0xc2, 0x51, 0x4e, 0xdf, 0xbc, 0xe2, 0x51, 0x27, + 0xf3, 0x7f, 0xbb, 0xa5, 0xa9, 0x10, 0x84, 0x7d, 0x6e, 0xee, 0x78, 0x93, 0xd0, 0x1d, 0xf9, 0x03, + 0x7d, 0x79, 0x32, 0x7c, 0xbe, 0xaf, 0x00, 0x64, 0x03, 0x4c, 0xe9, 0x03, 0x69, 0x69, 0x25, 0xbd, + 0x40, 0x55, 0x1b, 0x1d, 0x9f, 0xa7, 0x65, 0x93, 0xf4, 0x83, 0x35, 0x68, 0x84, 0x71, 0x10, 0xe0, + 0x0b, 0x9b, 0xaa, 0x37, 0xd2, 0x31, 0xd9, 0x82, 0x95, 0x29, 0x51, 0x1d, 0x94, 0x0d, 0x4b, 0x0e, + 0xc3, 0x5e, 0xce, 0xcb, 0x73, 0x84, 0x8d, 0xfc, 0x7f, 0x2d, 0x83, 0x39, 0xdb, 0x69, 0x4d, 0x5d, + 0xb4, 0x94, 0x73, 0xd1, 0x19, 0xe7, 0x2b, 0x5f, 0x74, 0xbe, 0xcc, 0x6c, 0x95, 0x29, 0xb3, 0x7d, + 0x06, 0x8b, 0xe8, 0xfb, 0x49, 0x67, 0xe9, 0x8a, 0x16, 0x46, 0xd2, 0xe9, 0x55, 0xf8, 0xe4, 0x01, + 0xac, 0xaa, 0x87, 0xc4, 0x44, 0x6b, 0x0e, 0x4e, 0xa0, 0x67, 0x37, 0x6c, 0xa2, 0xe6, 0xb4, 0xfe, + 0x54, 0xc6, 0xd9, 0x01, 0x18, 0x47, 0x6c, 0x4c, 0x23, 0xe1, 0xd3, 0xeb, 0xf8, 0x70, 0x46, 0x44, + 0x76, 0xc0, 0x38, 0x8d, 0x43, 0x7d, 0xbf, 0x56, 0x0e, 0xfc, 0x9d, 0x62, 0x89, 0x35, 0x96, 0x16, + 0x3a, 0xa3, 0xb2, 0xfe, 0xb3, 0x0c, 0x9d, 0xe9, 0xd9, 0x42, 0x95, 0x66, 0x27, 0x50, 0x05, 0xab, + 0x9f, 0x19, 0x15, 0x57, 0x2e, 0xaa, 0xf8, 0x11, 0x54, 0xd1, 0x85, 0xab, 0x57, 0x1c, 0xb8, 0xc9, + 0xc2, 0xe8, 0xc6, 0x88, 0x4e, 0x36, 0x61, 0xd9, 0x0f, 0xc7, 0xb1, 0x70, 0xb2, 0xbf, 0x34, 0xd4, + 0x93, 0x87, 0x61, 0x2f, 0xe1, 0xc4, 0x93, 0xe4, 0x5f, 0x0d, 0x2e, 0xeb, 0x89, 0x3c, 0xae, 0xef, + 0x29, 0x35, 0x56, 0xec, 0x76, 0x86, 0xd9, 0xf3, 0x38, 0xf9, 0x3d, 0x20, 0x2c, 0x16, 0xb3, 0x4c, + 0xeb, 0xc8, 0xd4, 0x54, 0x33, 0x39, 0xae, 0x1b, 0x60, 0x4e, 0x61, 0x4b, 0xb6, 0x0d, 0x64, 0xdb, + 0xc9, 0xe1, 0x4a, 0xbe, 0x9f, 0xa7, 0xbf, 0x7b, 0x18, 0xf3, 0x5a, 0x4f, 0x13, 0x58, 0x1d, 0x68, + 0x61, 0x39, 0xaa, 0xcf, 0x7f, 0xeb, 0x2b, 0x68, 0xeb, 0xb1, 0xae, 0x66, 0x92, 0x7a, 0xa5, 0xf4, + 0xbf, 0xaa, 0x57, 0xca, 0xd9, 0xa3, 0xd7, 0x5f, 0x96, 0xa0, 0xf9, 0x82, 0x0f, 0x8f, 0x18, 0xc7, + 0xa0, 0x94, 0x07, 0x71, 0xd2, 0xd0, 0xce, 0x59, 0xb9, 0xa9, 0x61, 0x78, 0x89, 0x58, 0x85, 0xda, + 0x88, 0x0f, 0x7b, 0xfb, 0xc8, 0xa6, 0x65, 0xab, 0x01, 0x5e, 0x2d, 0xf8, 0xf0, 0x69, 0xc4, 0xe2, + 0x71, 0xf2, 0x36, 0x9b, 0x8c, 0x65, 0xf9, 0x92, 0x35, 0x98, 0xaa, 0x78, 0xb4, 0x67, 0x00, 0x6b, + 0x07, 0x96, 0x74, 0x1b, 0x3a, 0x95, 0xa2, 0xc8, 0xc7, 0x64, 0xd9, 0xa7, 0xe7, 0xf5, 0x06, 0xd2, + 0xb1, 0xb5, 0x0e, 0x60, 0xb3, 0x80, 0x1e, 0x84, 0xc2, 0x17, 0x93, 0x22, 0x6a, 0x89, 0xf1, 0x8a, + 0xd3, 0xe8, 0x0a, 0x0c, 0x0b, 0x5a, 0x2f, 0xfb, 0x7f, 0x46, 0x07, 0xe2, 0x0a, 0x9c, 0x4f, 0x60, + 0xe9, 0x28, 0xf2, 0xdf, 0xf8, 0x01, 0x1d, 0x5e, 0xb5, 0xd8, 0x2f, 0x4a, 0xd0, 0x7e, 0x1a, 0xb9, + 0xa1, 0x60, 0xc9, 0x82, 0x0f, 0xa1, 0x1a, 0x73, 0x1a, 0x21, 0xd6, 0x65, 0xe9, 0x36, 0x93, 0xcf, + 0x46, 0x64, 0xb2, 0x0b, 0xc6, 0x38, 0x59, 0x0d, 0xb7, 0xdc, 0xdc, 0xfe, 0xb8, 0xf8, 0xf1, 0x60, + 0x5a, 0x26, 0x3b, 0x23, 0xb3, 0x5e, 0xc3, 0x2a, 0x4a, 0x32, 0x2b, 0xf6, 0x17, 0xf2, 0x4a, 0x20, + 0x13, 0x31, 0x4d, 0xba, 0x45, 0x56, 0x21, 0xeb, 0xa9, 0x6d, 0xd8, 0x29, 0x8d, 0xf5, 0x5f, 0x25, + 0x68, 0xe2, 0x5c, 0xb6, 0xc1, 0x88, 0x05, 0xf4, 0xca, 0x0d, 0x66, 0x26, 0xb2, 0x11, 0x59, 0x46, + 0x08, 0x43, 0x95, 0xeb, 0xdd, 0x15, 0xfb, 0x71, 0xde, 0x2a, 0xb6, 0x26, 0x90, 0x85, 0xa7, 0xfa, + 0x52, 0x6e, 0xaa, 0x3c, 0x0e, 0x14, 0x08, 0xbd, 0xf4, 0x87, 0x50, 0x1f, 0x2a, 0xd9, 0x75, 0x2d, + 0x3e, 0xcf, 0xfe, 0x12, 0x92, 0xfc, 0xaf, 0x41, 0xb5, 0xfc, 0xaf, 0x41, 0xd6, 0xcf, 0xa1, 0x21, + 0xed, 0x84, 0xed, 0x36, 0x92, 0x33, 0xaa, 0xa1, 0x6d, 0x26, 0xbd, 0xd4, 0xe5, 0xfc, 0x2d, 0x8b, + 0xbc, 0xd4, 0x4b, 0xf5, 0x58, 0x9e, 0xfa, 0x72, 0xdb, 0xea, 0xf5, 0x77, 0x0e, 0x25, 0x29, 0x6c, + 0xeb, 0x97, 0x25, 0x68, 0x24, 0x0d, 0x4c, 0xf2, 0x10, 0x6a, 0x72, 0x9d, 0xc4, 0x68, 0xb7, 0x2f, + 0xf5, 0x24, 0xd5, 0xd9, 0x43, 0xdc, 0x6c, 0xe1, 0xf2, 0x75, 0x16, 0x96, 0xc7, 0x1d, 0xea, 0x23, + 0x11, 0x78, 0xfd, 0x72, 0x0d, 0x26, 0xd6, 0x51, 0xf8, 0x9b, 0x7f, 0x01, 0xad, 0x7c, 0xf6, 0x21, + 0x4d, 0xa8, 0x1f, 0xc7, 0x83, 0x01, 0xe5, 0xdc, 0x5c, 0x20, 0x4b, 0xd0, 0x3c, 0x64, 0xc2, 0x39, + 0x8e, 0xc7, 0x63, 0x16, 0x09, 0xb3, 0x44, 0x96, 0xa1, 0x7d, 0xc8, 0x9c, 0x23, 0x1a, 0x8d, 0x7c, + 0xce, 0x7d, 0x16, 0x9a, 0x65, 0xd2, 0x80, 0xea, 0x13, 0xd7, 0x0f, 0xcc, 0x0a, 0x59, 0x85, 0x25, + 0x2c, 0xa6, 0xa8, 0xa0, 0x91, 0x73, 0x20, 0x2f, 0xbd, 0xe6, 0x5f, 0x57, 0xc8, 0x6d, 0xe8, 0xea, + 0xdc, 0xe8, 0x28, 0xf7, 0x70, 0x24, 0xcb, 0x27, 0x2c, 0x0e, 0x3d, 0xf3, 0x6f, 0x2a, 0x9b, 0xef, + 0x60, 0xa5, 0xa0, 0x11, 0x4f, 0x08, 0x74, 0x76, 0x77, 0xf6, 0xbe, 0x7c, 0x75, 0xe4, 0xf4, 0x0e, + 0x7b, 0x27, 0xbd, 0x9d, 0xe7, 0xe6, 0x02, 0x59, 0x05, 0x53, 0xc3, 0x0e, 0xbe, 0x3a, 0xd8, 0x7b, + 0x75, 0xd2, 0x3b, 0x7c, 0x6a, 0x96, 0x72, 0x98, 0xc7, 0xaf, 0xf6, 0xf6, 0x0e, 0x8e, 0x8f, 0xcd, + 0xb2, 0x94, 0x5b, 0xc3, 0x9e, 0xec, 0xf4, 0x9e, 0x9b, 0x95, 0x1c, 0xd2, 0x49, 0xef, 0xc5, 0xc1, + 0xcb, 0x57, 0x27, 0x66, 0x75, 0xf3, 0x75, 0xfa, 0xbc, 0x39, 0xbd, 0x74, 0x13, 0xea, 0xd9, 0x9a, + 0x6d, 0x30, 0xf2, 0x8b, 0x49, 0xed, 0xa4, 0xab, 0xc8, 0x9d, 0x2b, 0xf6, 0x4d, 0xa8, 0x67, 0x7c, + 0xbf, 0x92, 0xc5, 0xcd, 0xcc, 0xbf, 0x5c, 0x00, 0x8b, 0xc7, 0x22, 0x62, 0xe1, 0xd0, 0x5c, 0x40, + 0x1e, 0x54, 0x69, 0x0f, 0x19, 0xee, 0x4a, 0x55, 0x50, 0xcf, 0x2c, 0x93, 0x0e, 0xc0, 0xc1, 0x1b, + 0x1a, 0x8a, 0xd8, 0x0d, 0x82, 0x89, 0x59, 0x91, 0xe3, 0xbd, 0x98, 0x0b, 0x36, 0xf2, 0xbf, 0xa6, + 0x9e, 0x59, 0xdd, 0xfc, 0x75, 0x09, 0x1a, 0x49, 0xb1, 0x28, 0x57, 0x3f, 0x64, 0x21, 0x35, 0x17, + 0xe4, 0xd7, 0x2e, 0x63, 0x81, 0x59, 0x92, 0x5f, 0xbd, 0x50, 0x7c, 0x66, 0x96, 0x89, 0x01, 0xb5, + 0x5e, 0x28, 0xbe, 0xff, 0xa9, 0x59, 0xd1, 0x9f, 0x0f, 0xb7, 0xcd, 0xaa, 0xfe, 0xfc, 0xf4, 0x07, + 0x66, 0x4d, 0x7e, 0x3e, 0x91, 0xf7, 0x16, 0x13, 0xa4, 0x70, 0xfb, 0x78, 0x41, 0x31, 0x9b, 0x5a, + 0x50, 0x3f, 0x1c, 0x9a, 0xab, 0x52, 0xb6, 0xd7, 0x6e, 0xb4, 0x77, 0xe6, 0x46, 0xe6, 0x0d, 0x89, + 0xbf, 0x13, 0x45, 0xee, 0xc4, 0xbc, 0x29, 0x57, 0xf9, 0x29, 0x67, 0xa1, 0x79, 0x8b, 0x98, 0xd0, + 0xda, 0xf5, 0x43, 0x37, 0x9a, 0xbc, 0xa6, 0x03, 0xc1, 0x22, 0xd3, 0x93, 0x9a, 0x47, 0xb6, 0x1a, + 0x40, 0xa5, 0xc7, 0x20, 0xe0, 0xfb, 0x9f, 0x6a, 0xd0, 0x29, 0x1a, 0x63, 0x1a, 0x36, 0x24, 0x37, + 0x60, 0xf9, 0x78, 0xec, 0x46, 0x9c, 0xe6, 0xa9, 0xcf, 0x36, 0x5f, 0x03, 0x64, 0xb5, 0xb5, 0x5c, + 0x0e, 0x47, 0xea, 0xe9, 0xc8, 0x33, 0x17, 0x90, 0x7b, 0x0a, 0x91, 0x52, 0x97, 0x52, 0xd0, 0x7e, + 0xc4, 0xc6, 0x63, 0x09, 0x2a, 0xa7, 0x74, 0x08, 0xa2, 0x9e, 0x59, 0xd9, 0xfc, 0x0c, 0x5a, 0xf9, + 0x92, 0x45, 0x6e, 0xf5, 0x55, 0x78, 0x1e, 0xb2, 0xb7, 0xa1, 0xd6, 0xe7, 0x8b, 0xed, 0x47, 0x8a, + 0xd7, 0x09, 0x7d, 0x27, 0x0e, 0x46, 0x7d, 0xea, 0x79, 0xc8, 0x6b, 0xfb, 0x9f, 0x6b, 0xb0, 0xf2, + 0x02, 0x63, 0x4b, 0xb9, 0xed, 0x31, 0x8d, 0xde, 0xf8, 0x03, 0x4a, 0x06, 0xd0, 0xca, 0x77, 0xe4, + 0x49, 0xf1, 0xdb, 0x71, 0x41, 0xd3, 0x7e, 0xed, 0xbb, 0xef, 0x6b, 0xe4, 0xe9, 0xf0, 0xb4, 0x16, + 0xc8, 0x9f, 0x80, 0x91, 0x76, 0x6a, 0x49, 0xf1, 0x8f, 0x85, 0xb3, 0x9d, 0xdc, 0xeb, 0xb0, 0xef, + 0x43, 0x33, 0xd7, 0xde, 0x24, 0xc5, 0x94, 0x17, 0xdb, 0xab, 0x6b, 0x1b, 0xef, 0x47, 0x4c, 0xd7, + 0xa0, 0xd0, 0xca, 0x77, 0x0e, 0x2f, 0xd1, 0x53, 0x41, 0xcb, 0x72, 0xed, 0xde, 0x1c, 0x98, 0xe9, + 0x32, 0x67, 0xd0, 0x9e, 0x7a, 0xbb, 0x21, 0xf7, 0xe6, 0x6e, 0xb3, 0xad, 0x6d, 0xce, 0x83, 0x9a, + 0xae, 0x34, 0x04, 0xc8, 0x9e, 0x82, 0xc8, 0xf7, 0x2e, 0x33, 0x4a, 0xc1, 0x5b, 0xd1, 0x35, 0x17, + 0x3a, 0x82, 0x9a, 0x7a, 0xf8, 0x2c, 0x3e, 0x7b, 0xf3, 0x55, 0xe8, 0x9a, 0x75, 0x15, 0x4a, 0xc2, + 0x71, 0xf7, 0xf3, 0x9f, 0xfd, 0xc1, 0xd0, 0x17, 0x67, 0x71, 0x7f, 0x6b, 0xc0, 0x46, 0xf7, 0xbf, + 0xf6, 0x83, 0xc0, 0xff, 0x5a, 0xd0, 0xc1, 0xd9, 0x7d, 0x45, 0xfc, 0xfb, 0x8a, 0xec, 0xfe, 0x80, + 0x45, 0xfa, 0x97, 0xec, 0xfb, 0x0a, 0x32, 0xee, 0xf7, 0x17, 0x71, 0xfc, 0xf0, 0x7f, 0x02, 0x00, + 0x00, 0xff, 0xff, 0xcc, 0xe2, 0x89, 0xf9, 0xd5, 0x2d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/core/storage/copier.go b/core/storage/copier.go index 441b34a..da93e90 100644 --- a/core/storage/copier.go +++ b/core/storage/copier.go @@ -238,6 +238,7 @@ func (c *Copier) Copy(ctx context.Context, srcPrefix, destPrefix, srcBucket, des return fmt.Errorf("storage: copier get src attrs %w", err) } for _, srcAttr := range srcAttrs { + destKey := strings.Replace(srcAttr.Key, srcPrefix, destPrefix, 1) err := fn(ctx, srcAttr, destKey, srcBucket, destBucket) if err != nil { diff --git a/docs/docs.go b/docs/docs.go index 7bc1fc5..4ddb48f 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -463,8 +463,20 @@ const docTemplate = `{ "$ref": "#/definitions/backuppb.FieldSchema" } }, + "functions": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.FunctionSchema" + } + }, "name": { "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } } } }, @@ -684,6 +696,66 @@ const docTemplate = `{ "FieldState_FieldDropped" ] }, + "backuppb.FunctionSchema": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "input_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "input_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "output_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "output_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } + }, + "type": { + "$ref": "#/definitions/backuppb.FunctionType" + } + } + }, + "backuppb.FunctionType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-varnames": [ + "FunctionType_Unknown", + "FunctionType_BM25", + "FunctionType_TextEmbedding" + ] + }, "backuppb.GrantEntity": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index d6aea68..847dbb1 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -455,8 +455,20 @@ "$ref": "#/definitions/backuppb.FieldSchema" } }, + "functions": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.FunctionSchema" + } + }, "name": { "type": "string" + }, + "properties": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } } } }, @@ -676,6 +688,66 @@ "FieldState_FieldDropped" ] }, + "backuppb.FunctionSchema": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "input_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "input_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "output_field_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "output_field_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/backuppb.KeyValuePair" + } + }, + "type": { + "$ref": "#/definitions/backuppb.FunctionType" + } + } + }, + "backuppb.FunctionType": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "x-enum-varnames": [ + "FunctionType_Unknown", + "FunctionType_BM25", + "FunctionType_TextEmbedding" + ] + }, "backuppb.GrantEntity": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 39eadda..54eb268 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -142,8 +142,16 @@ definitions: items: $ref: '#/definitions/backuppb.FieldSchema' type: array + functions: + items: + $ref: '#/definitions/backuppb.FunctionSchema' + type: array name: type: string + properties: + items: + $ref: '#/definitions/backuppb.KeyValuePair' + type: array type: object backuppb.ConsistencyLevel: enum: @@ -309,6 +317,47 @@ definitions: - FieldState_FieldCreating - FieldState_FieldDropping - FieldState_FieldDropped + backuppb.FunctionSchema: + properties: + description: + type: string + id: + type: integer + input_field_ids: + items: + type: integer + type: array + input_field_names: + items: + type: string + type: array + name: + type: string + output_field_ids: + items: + type: integer + type: array + output_field_names: + items: + type: string + type: array + params: + items: + $ref: '#/definitions/backuppb.KeyValuePair' + type: array + type: + $ref: '#/definitions/backuppb.FunctionType' + type: object + backuppb.FunctionType: + enum: + - 0 + - 1 + - 2 + type: integer + x-enum-varnames: + - FunctionType_Unknown + - FunctionType_BM25 + - FunctionType_TextEmbedding backuppb.GrantEntity: properties: db_name: diff --git a/example/bm25/prepare_data.py b/example/bm25/prepare_data.py new file mode 100644 index 0000000..73933e5 --- /dev/null +++ b/example/bm25/prepare_data.py @@ -0,0 +1,215 @@ +# hello_bm25.py demonstrates how to insert raw data only into Milvus and perform +# sparse vector based ANN search using BM25 algorithm. +# 1. connect to Milvus +# 2. create collection +# 3. insert data +# 4. create index +# 5. search, query, and filtering search on entities +# 6. delete entities by PK +# 7. drop collection +import time + +from pymilvus import ( + connections, + utility, + FieldSchema, CollectionSchema, Function, DataType, FunctionType, + Collection, +) + +fmt = "\n=== {:30} ===\n" +search_latency_fmt = "search latency = {:.4f}s" + +################################################################################# +# 1. connect to Milvus +# Add a new connection alias `default` for Milvus server in `localhost:19530` +print(fmt.format("start connecting to Milvus")) +connections.connect("default", host="localhost", port="19530") + +has = utility.has_collection("hello_bm25") +print(f"Does collection hello_bm25 exist in Milvus: {has}") + +################################################################################# +# 2. create collection +# We're going to create a collection with 2 explicit fields and a function. +# +-+------------+------------+------------------+------------------------------+ +# | | field name | field type | other attributes | field description | +# +-+------------+------------+------------------+------------------------------+ +# |1| "id" | INT64 | is_primary=True | "primary field" | +# | | | | auto_id=False | | +# +-+------------+------------+------------------+------------------------------+ +# |2| "document" | VarChar | | "raw text document" | +# +-+------------+------------+------------------+------------------------------+ +# +# Function 'bm25' is used to convert raw text document to a sparse vector representation +# and store it in the 'sparse' field. +# +-+------------+-------------------+-----------+------------------------------+ +# | | field name | field type | other attr| field description | +# +-+------------+-------------------+-----------+------------------------------+ +# |3| "sparse" |SPARSE_FLOAT_VECTOR| | | +# +-+------------+-------------------+-----------+------------------------------+ +# +fields = [ + FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), + FieldSchema(name="sparse", dtype=DataType.SPARSE_FLOAT_VECTOR), + FieldSchema(name="document", dtype=DataType.VARCHAR, max_length=1000, enable_analyzer=True), +] + +bm25_function = Function( + name="bm25", + function_type=FunctionType.BM25, + input_field_names=["document"], + output_field_names="sparse", +) + +schema = CollectionSchema(fields, "hello_bm25 demo") +schema.add_function(bm25_function) + +print(fmt.format("Create collection `hello_bm25`")) +hello_bm25 = Collection("hello_bm25", schema, consistency_level="Strong") + +################################################################################ +# 3. insert data +# We are going to insert 3 rows of data into `hello_bm25` +# Data to be inserted must be organized in fields. +# +# The insert() method returns: +# - either automatically generated primary keys by Milvus if auto_id=True in the schema; +# - or the existing primary key field from the entities if auto_id=False in the schema. + +print(fmt.format("Start inserting entities")) + +num_entities = 6 + +entities = [ + [f"This is a test document {i + hello_bm25.num_entities}" for i in range(num_entities)], +] + +insert_result = hello_bm25.insert(entities) +ids = insert_result.primary_keys + +time.sleep(3) + +hello_bm25.flush() +print(f"Number of entities in Milvus: {hello_bm25.num_entities}") # check the num_entities + +################################################################################ +# 4. create index +# We are going to create an index for hello_bm25 collection, here we simply +# uses AUTOINDEX so Milvus can use the default parameters. +print(fmt.format("Start Creating index AUTOINDEX")) +index = { + "index_type": "AUTOINDEX", + "metric_type": "BM25", +} + +hello_bm25.create_index("sparse", index) + +################################################################################ +# 5. search, query, and scalar filtering search +# After data were inserted into Milvus and indexed, you can perform: +# - search texts relevance by BM25 using sparse vector ANN search +# - query based on scalar filtering(boolean, int, etc.) +# - scalar filtering search. +# + +# Before conducting a search or a query, you need to load the data in `hello_bm25` into memory. +print(fmt.format("Start loading")) +hello_bm25.load() + +# ----------------------------------------------------------------------------- +print(fmt.format("Start searching based on BM25 texts relevance using sparse vector ANN search")) +texts_to_search = entities[-1][-2:] +print(fmt.format(f"texts_to_search: {texts_to_search}")) +search_params = { + "metric_type": "BM25", + "params": {}, +} + +start_time = time.time() +result = hello_bm25.search(texts_to_search, "sparse", search_params, limit=3, output_fields=["document"], consistency_level="Strong") +end_time = time.time() + +for hits, text in zip(result, texts_to_search): + print(f"result of text: {text}") + for hit in hits: + print(f"\thit: {hit}, document field: {hit.entity.get('document')}") +print(search_latency_fmt.format(end_time - start_time)) + +# ----------------------------------------------------------------------------- +# query based on scalar filtering(boolean, int, etc.) +filter_id = ids[num_entities // 2 - 1] +print(fmt.format(f"Start querying with `id > {filter_id}`")) + +start_time = time.time() +result = hello_bm25.query(expr=f"id > {filter_id}", output_fields=["document"]) +end_time = time.time() + +print(f"query result:\n-{result[0]}") +print(search_latency_fmt.format(end_time - start_time)) + +# ----------------------------------------------------------------------------- +# pagination +r1 = hello_bm25.query(expr=f"id > {filter_id}", limit=3, output_fields=["document"]) +r2 = hello_bm25.query(expr=f"id > {filter_id}", offset=1, limit=2, output_fields=["document"]) +print(f"query pagination(limit=3):\n\t{r1}") +print(f"query pagination(offset=1, limit=2):\n\t{r2}") + + +# ----------------------------------------------------------------------------- +# scalar filtering search +print(fmt.format(f"Start filtered searching with `id > {filter_id}`")) + +start_time = time.time() +result = hello_bm25.search(texts_to_search, "sparse", search_params, limit=3, expr=f"id > {filter_id}", output_fields=["document"]) +end_time = time.time() + +for hits, text in zip(result, texts_to_search): + print(f"result of text: {text}") + for hit in hits: + print(f"\thit: {hit}, document field: {hit.entity.get('document')}") +print(search_latency_fmt.format(end_time - start_time)) + +############################################################################### +# 6. delete entities by PK +# You can delete entities by their PK values using boolean expressions. + +expr = f'id in [{ids[0]}, {ids[1]}]' +print(fmt.format(f"Start deleting with expr `{expr}`")) + +result = hello_bm25.query(expr=expr, output_fields=["document"]) +print(f"query before delete by expr=`{expr}` -> result: \n- {result[0]}\n- {result[1]}\n") + +hello_bm25.delete(expr) + +result = hello_bm25.query(expr=expr, output_fields=["document"]) +print(f"query after delete by expr=`{expr}` -> result: {result}\n") + +############################################################################### +# 7. upsert by PK +# You can upsert data to replace existing data. +target_id = ids[2] +print(fmt.format(f"Start upsert operation for id {target_id}")) + +# Query before upsert +result_before = hello_bm25.query(expr=f"id == {target_id}", output_fields=["id", "document"]) +print(f"Query before upsert (id={target_id}):\n{result_before}") + +# Prepare data for upsert +upsert_data = [ + [target_id], + ["This is an upserted document for testing purposes."] +] + +# Perform upsert operation +hello_bm25.upsert(upsert_data) + +# Query after upsert +result_after = hello_bm25.query(expr=f"id == {target_id}", output_fields=["id", "document"]) +print(f"Query after upsert (id={target_id}):\n{result_after}") + + +############################################################################### +# 7. drop collection +# Finally, drop the hello_bm25 collection +print(fmt.format("Drop collection `hello_bm25`")) +# utility.drop_collection("hello_bm25") \ No newline at end of file diff --git a/example/bm25/verify_data.py b/example/bm25/verify_data.py new file mode 100644 index 0000000..7a71980 --- /dev/null +++ b/example/bm25/verify_data.py @@ -0,0 +1,177 @@ +# hello_bm25.py demonstrates how to insert raw data only into Milvus and perform +# sparse vector based ANN search using BM25 algorithm. +# 1. connect to Milvus +# 2. create collection +# 3. insert data +# 4. create index +# 5. search, query, and filtering search on entities +# 6. delete entities by PK +# 7. drop collection +import time + +from pymilvus import ( + connections, + utility, + FieldSchema, CollectionSchema, Function, DataType, FunctionType, + Collection, +) + +fmt = "\n=== {:30} ===\n" +search_latency_fmt = "search latency = {:.4f}s" + +################################################################################# +# 1. connect to Milvus +# Add a new connection alias `default` for Milvus server in `localhost:19530` +print(fmt.format("start connecting to Milvus")) +connections.connect("default", host="localhost", port="19530") + +has = utility.has_collection("hello_bm25") +print(f"Does collection hello_bm25 exist in Milvus: {has}") + +################################################################################# +# 2. create collection +# We're going to create a collection with 2 explicit fields and a function. +# +-+------------+------------+------------------+------------------------------+ +# | | field name | field type | other attributes | field description | +# +-+------------+------------+------------------+------------------------------+ +# |1| "id" | INT64 | is_primary=True | "primary field" | +# | | | | auto_id=False | | +# +-+------------+------------+------------------+------------------------------+ +# |2| "document" | VarChar | | "raw text document" | +# +-+------------+------------+------------------+------------------------------+ +# +# Function 'bm25' is used to convert raw text document to a sparse vector representation +# and store it in the 'sparse' field. +# +-+------------+-------------------+-----------+------------------------------+ +# | | field name | field type | other attr| field description | +# +-+------------+-------------------+-----------+------------------------------+ +# |3| "sparse" |SPARSE_FLOAT_VECTOR| | | +# +-+------------+-------------------+-----------+------------------------------+ +# +fields = [ + FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), + FieldSchema(name="sparse", dtype=DataType.SPARSE_FLOAT_VECTOR), + FieldSchema(name="document", dtype=DataType.VARCHAR, max_length=1000, enable_analyzer=True), +] + +bm25_function = Function( + name="bm25", + function_type=FunctionType.BM25, + input_field_names=["document"], + output_field_names="sparse", +) + +schema = CollectionSchema(fields, "hello_bm25 demo") +schema.add_function(bm25_function) + +print(fmt.format("Create collection `hello_bm25`")) +hello_bm25 = Collection("hello_bm25") + +num_entities = 6 + +entities = [ + [f"This is a test document {i + hello_bm25.num_entities}" for i in range(num_entities)], +] + + +# Before conducting a search or a query, you need to load the data in `hello_bm25` into memory. +print(fmt.format("Start loading")) +hello_bm25.load() + +# ----------------------------------------------------------------------------- +print(fmt.format("Start searching based on BM25 texts relevance using sparse vector ANN search")) +texts_to_search = entities[-1][-2:] +print(fmt.format(f"texts_to_search: {texts_to_search}")) +search_params = { + "metric_type": "BM25", + "params": {}, +} + +start_time = time.time() +result = hello_bm25.search(texts_to_search, "sparse", search_params, limit=3, output_fields=["document"], consistency_level="Strong") +end_time = time.time() + +for hits, text in zip(result, texts_to_search): + print(f"result of text: {text}") + for hit in hits: + print(f"\thit: {hit}, document field: {hit.entity.get('document')}") +print(search_latency_fmt.format(end_time - start_time)) + +# ----------------------------------------------------------------------------- +# query based on scalar filtering(boolean, int, etc.) +filter_id = 1 +print(fmt.format(f"Start querying with `id > {filter_id}`")) + +start_time = time.time() +result = hello_bm25.query(expr=f"id > {filter_id}", output_fields=["document"]) +end_time = time.time() + +print(f"query result:\n-{result[0]}") +print(search_latency_fmt.format(end_time - start_time)) + +# ----------------------------------------------------------------------------- +# pagination +r1 = hello_bm25.query(expr=f"id > {filter_id}", limit=3, output_fields=["document"]) +r2 = hello_bm25.query(expr=f"id > {filter_id}", offset=1, limit=2, output_fields=["document"]) +print(f"query pagination(limit=3):\n\t{r1}") +print(f"query pagination(offset=1, limit=2):\n\t{r2}") + + +# ----------------------------------------------------------------------------- +# scalar filtering search +print(fmt.format(f"Start filtered searching with `id > {filter_id}`")) + +start_time = time.time() +result = hello_bm25.search(texts_to_search, "sparse", search_params, limit=3, expr=f"id > {filter_id}", output_fields=["document"]) +end_time = time.time() + +for hits, text in zip(result, texts_to_search): + print(f"result of text: {text}") + for hit in hits: + print(f"\thit: {hit}, document field: {hit.entity.get('document')}") +print(search_latency_fmt.format(end_time - start_time)) + +############################################################################### +# 6. delete entities by PK +# You can delete entities by their PK values using boolean expressions. +# +# expr = f'id in [{ids[0]}, {ids[1]}]' +# print(fmt.format(f"Start deleting with expr `{expr}`")) +# +# result = hello_bm25.query(expr=expr, output_fields=["document"]) +# print(f"query before delete by expr=`{expr}` -> result: \n- {result[0]}\n- {result[1]}\n") +# +# hello_bm25.delete(expr) +# +# result = hello_bm25.query(expr=expr, output_fields=["document"]) +# print(f"query after delete by expr=`{expr}` -> result: {result}\n") +# +# ############################################################################### +# # 7. upsert by PK +# # You can upsert data to replace existing data. +# target_id = ids[2] +# print(fmt.format(f"Start upsert operation for id {target_id}")) +# +# # Query before upsert +# result_before = hello_bm25.query(expr=f"id == {target_id}", output_fields=["id", "document"]) +# print(f"Query before upsert (id={target_id}):\n{result_before}") +# +# # Prepare data for upsert +# upsert_data = [ +# [target_id], +# ["This is an upserted document for testing purposes."] +# ] +# +# # Perform upsert operation +# hello_bm25.upsert(upsert_data) +# +# # Query after upsert +# result_after = hello_bm25.query(expr=f"id == {target_id}", output_fields=["id", "document"]) +# print(f"Query after upsert (id={target_id}):\n{result_after}") +# +# +# ############################################################################### +# # 7. drop collection +# # Finally, drop the hello_bm25 collection +# print(fmt.format("Drop collection `hello_bm25`")) +# utility.drop_collection("hello_bm25") \ No newline at end of file diff --git a/go.mod b/go.mod index c7c73cf..d3ccbe3 100644 --- a/go.mod +++ b/go.mod @@ -41,10 +41,12 @@ require ( gopkg.in/yaml.v3 v3.0.1 ) -require github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20241108105827-266fb751b620 +require github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20241120015424-93892e628c69 replace github.com/milvus-io/milvus-sdk-go/v2 => github.com/wayblink/milvus-sdk-go/v2 v2.3.0-beta4.0.20241030091852-d6eb85c1a8ff +replace github.com/milvus-io/milvus/client/v2 => github.com/wayblink/milvus/client/v2 v2.0.0-20241129040934-6ffc6bcba352 + require ( cloud.google.com/go/compute/metadata v0.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect @@ -102,7 +104,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/milvus-io/milvus/pkg v0.0.2-0.20241111021426-5e90f348fcbb // indirect + github.com/milvus-io/milvus/pkg v0.0.2-0.20241126032235-cb6542339e84 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect diff --git a/go.sum b/go.sum index 3b010eb..319b12a 100644 --- a/go.sum +++ b/go.sum @@ -478,12 +478,10 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20241108105827-266fb751b620 h1:0IWUDtDloift7cQHalhdjuVkL/3qSeiXFqR7MofZBkg= -github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20241108105827-266fb751b620/go.mod h1:/6UT4zZl6awVeXLeE7UGDWZvXj3IWkRsh3mqsn0DiAs= -github.com/milvus-io/milvus/client/v2 v2.0.0-20241120124432-f3a36f8a299b h1:Z4gjp2a5VSgBsNfSxd5RkOHNQ2naB0q8geE+RFGGjqw= -github.com/milvus-io/milvus/client/v2 v2.0.0-20241120124432-f3a36f8a299b/go.mod h1:UHMEkt8eAYZ857wpt1jfN4yFMgxHymyCxZ3OWMqpqJQ= -github.com/milvus-io/milvus/pkg v0.0.2-0.20241111021426-5e90f348fcbb h1:lMyIrG03agASB88AAwnk+NOU9V33lcBdtub/ZEv6IQU= -github.com/milvus-io/milvus/pkg v0.0.2-0.20241111021426-5e90f348fcbb/go.mod h1:w5nu1Z318AvgWQrGUYXaqLeVLu4JvCS/oYhxqctOZvU= +github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20241120015424-93892e628c69 h1:Qt0Bv2Fum3EX3OlkuQYHJINBzeU4oEuHy2lXSfB/gZw= +github.com/milvus-io/milvus-proto/go-api/v2 v2.3.4-0.20241120015424-93892e628c69/go.mod h1:/6UT4zZl6awVeXLeE7UGDWZvXj3IWkRsh3mqsn0DiAs= +github.com/milvus-io/milvus/pkg v0.0.2-0.20241126032235-cb6542339e84 h1:EAFxmxUVp5yYFDCrX1MQoSxkTO+ycy8NXEqEDEB3cRM= +github.com/milvus-io/milvus/pkg v0.0.2-0.20241126032235-cb6542339e84/go.mod h1:RATa0GS4jhkPpsYOvQ/QvcNz8rd+TlRPDiSyXQnMMxs= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.61 h1:87c+x8J3jxQ5VUGimV9oHdpjsAvy3fhneEBKuoKEVUI= @@ -702,6 +700,8 @@ github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/wayblink/milvus-sdk-go/v2 v2.3.0-beta4.0.20241030091852-d6eb85c1a8ff h1:b73JFTui+bKEy5HuDFUOYNH3XNbYYl62Rv7JKA/thZo= github.com/wayblink/milvus-sdk-go/v2 v2.3.0-beta4.0.20241030091852-d6eb85c1a8ff/go.mod h1:TdzShm5isV4F6kvrd+9V/CKowNIX+H+jvybF0WWts0Y= +github.com/wayblink/milvus/client/v2 v2.0.0-20241129040934-6ffc6bcba352 h1:UX9AziyYlY5XD/Q7B9TaW5nGDl2nJgVfc/laJvK7k28= +github.com/wayblink/milvus/client/v2 v2.0.0-20241129040934-6ffc6bcba352/go.mod h1:Q5qjjOZokcgbVjLV1fqQu+sHOBblIQixVX/wP0njB78= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=