query_coord.proto 16.4 KB
Newer Older
1 2 3 4
syntax = "proto3";

package milvus.proto.query;

X
Xiangyu Wang 已提交
5
option go_package = "github.com/milvus-io/milvus/internal/proto/querypb";
6 7

import "common.proto";
X
xige-16 已提交
8
import "milvus.proto";
9
import "internal.proto";
10
import "schema.proto";
11
import "msg.proto";
12
import "data_coord.proto";
13

14
service QueryCoord {
15
  rpc GetComponentStates(milvus.GetComponentStatesRequest) returns (milvus.ComponentStates) {}
G
godchen 已提交
16 17 18 19 20 21 22 23 24 25
  rpc GetTimeTickChannel(internal.GetTimeTickChannelRequest) returns(milvus.StringResponse) {}
  rpc GetStatisticsChannel(internal.GetStatisticsChannelRequest) returns(milvus.StringResponse){}

  rpc ShowCollections(ShowCollectionsRequest) returns (ShowCollectionsResponse) {}
  rpc ShowPartitions(ShowPartitionsRequest) returns (ShowPartitionsResponse) {}

  rpc LoadPartitions(LoadPartitionsRequest) returns (common.Status) {}
  rpc ReleasePartitions(ReleasePartitionsRequest) returns (common.Status) {}
  rpc LoadCollection(LoadCollectionRequest) returns (common.Status) {}
  rpc ReleaseCollection(ReleaseCollectionRequest) returns (common.Status) {}
26
  rpc SyncNewCreatedPartition(SyncNewCreatedPartitionRequest) returns (common.Status) {}
G
godchen 已提交
27 28 29

  rpc GetPartitionStates(GetPartitionStatesRequest) returns (GetPartitionStatesResponse) {}
  rpc GetSegmentInfo(GetSegmentInfoRequest) returns (GetSegmentInfoResponse) {}
B
bigsheeper 已提交
30
  rpc LoadBalance(LoadBalanceRequest) returns (common.Status) {}
31

32
  rpc ShowConfigurations(internal.ShowConfigurationsRequest) returns (internal.ShowConfigurationsResponse){}
33 34
  // https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
  rpc GetMetrics(milvus.GetMetricsRequest) returns (milvus.GetMetricsResponse) {}
35 36

  // https://wiki.lfaidata.foundation/display/MIL/MEP+23+--+Multiple+memory+replication+design
X
XuanYang-cn 已提交
37
  rpc GetReplicas(milvus.GetReplicasRequest) returns (milvus.GetReplicasResponse) {}
38
  rpc GetShardLeaders(GetShardLeadersRequest) returns (GetShardLeadersResponse) {}
39 40

  rpc CheckHealth(milvus.CheckHealthRequest) returns (milvus.CheckHealthResponse) {}
W
wei liu 已提交
41 42 43 44 45 46 47

  rpc CreateResourceGroup(milvus.CreateResourceGroupRequest) returns (common.Status) {}
  rpc DropResourceGroup(milvus.DropResourceGroupRequest) returns (common.Status) {}
  rpc TransferNode(milvus.TransferNodeRequest) returns (common.Status) {}
  rpc TransferReplica(TransferReplicaRequest) returns (common.Status) {}
  rpc ListResourceGroups(milvus.ListResourceGroupsRequest) returns (milvus.ListResourceGroupsResponse) {}
  rpc DescribeResourceGroup(DescribeResourceGroupRequest) returns (DescribeResourceGroupResponse) {}
G
godchen 已提交
48 49 50
}

service QueryNode {
51
  rpc GetComponentStates(milvus.GetComponentStatesRequest) returns (milvus.ComponentStates) {}
G
godchen 已提交
52 53 54 55
  rpc GetTimeTickChannel(internal.GetTimeTickChannelRequest) returns(milvus.StringResponse) {}
  rpc GetStatisticsChannel(internal.GetStatisticsChannelRequest) returns(milvus.StringResponse){}

  rpc WatchDmChannels(WatchDmChannelsRequest) returns (common.Status) {}
B
Bingyi Sun 已提交
56
  rpc UnsubDmChannel(UnsubDmChannelRequest) returns (common.Status) {}
G
godchen 已提交
57 58
  rpc LoadSegments(LoadSegmentsRequest) returns (common.Status) {}
  rpc ReleaseCollection(ReleaseCollectionRequest) returns (common.Status) {}
59
  rpc LoadPartitions(LoadPartitionsRequest) returns (common.Status) {}
G
godchen 已提交
60 61 62
  rpc ReleasePartitions(ReleasePartitionsRequest) returns (common.Status) {}
  rpc ReleaseSegments(ReleaseSegmentsRequest) returns (common.Status) {}
  rpc GetSegmentInfo(GetSegmentInfoRequest) returns (GetSegmentInfoResponse) {}
63
  rpc SyncReplicaSegments(SyncReplicaSegmentsRequest) returns (common.Status) {}
64

65
  rpc GetStatistics(GetStatisticsRequest) returns (internal.GetStatisticsResponse) {}
66 67
  rpc Search(SearchRequest) returns (internal.SearchResults) {}
  rpc Query(QueryRequest) returns (internal.RetrieveResults) {}
68

69
  rpc ShowConfigurations(internal.ShowConfigurationsRequest) returns (internal.ShowConfigurationsResponse){}
70 71
  // https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
  rpc GetMetrics(milvus.GetMetricsRequest) returns (milvus.GetMetricsResponse) {}
B
Bingyi Sun 已提交
72 73 74

  rpc GetDataDistribution(GetDataDistributionRequest) returns (GetDataDistributionResponse) {}
  rpc SyncDistribution(SyncDistributionRequest) returns (common.Status) {}
Y
yah01 已提交
75
  rpc Delete(DeleteRequest) returns (common.Status) {}
G
godchen 已提交
76 77
}

X
xige-16 已提交
78
//--------------------QueryCoord grpc request and response proto------------------
G
godchen 已提交
79
message ShowCollectionsRequest {
80
  common.MsgBase base = 1;
81
  // Not useful for now
X
xige-16 已提交
82
  int64 dbID = 2;
83
  repeated int64 collectionIDs = 3;
84 85
}

G
godchen 已提交
86
message ShowCollectionsResponse {
X
xige-16 已提交
87 88
  common.Status status = 1;
  repeated int64 collectionIDs = 2;
89
  repeated int64 inMemory_percentages = 3;
90
  repeated bool query_service_available = 4;
91 92
}

93 94 95 96
message ShowPartitionsRequest {
  common.MsgBase base = 1;
  int64 dbID = 2;
  int64 collectionID = 3;
97
  repeated int64 partitionIDs = 4;
98 99 100 101 102
}

message ShowPartitionsResponse {
  common.Status status = 1;
  repeated int64 partitionIDs = 2;
103
  repeated int64 inMemory_percentages = 3;
104 105
}

106
message LoadCollectionRequest {
107
  common.MsgBase base = 1;
X
xige-16 已提交
108
  int64 dbID = 2;
109
  int64 collectionID = 3;
110
  schema.CollectionSchema schema = 4;
111
  int32 replica_number = 5;
C
cai.zhang 已提交
112 113
  // fieldID -> indexID
  map<int64, int64> field_indexID = 6;
114
  bool refresh = 7;
W
wei liu 已提交
115 116
  // resource group names
  repeated string resource_groups = 8;
117 118 119
}

message ReleaseCollectionRequest {
120
  common.MsgBase base = 1;
X
xige-16 已提交
121
  int64 dbID = 2;
122
  int64 collectionID = 3;
123
  int64 nodeID = 4;
124 125
}

126 127 128 129 130 131 132 133
message GetStatisticsRequest {
  internal.GetStatisticsRequest req = 1;
  repeated string dml_channels = 2;
  repeated int64 segmentIDs = 3;
  bool from_shard_leader = 4;
  DataScope scope = 5; // All, Streaming, Historical
}

134
message LoadPartitionsRequest {
135
  common.MsgBase base = 1;
X
xige-16 已提交
136 137
  int64 dbID = 2;
  int64 collectionID = 3;
138 139
  repeated int64 partitionIDs = 4;
  schema.CollectionSchema schema = 5;
140
  int32 replica_number = 6;
C
cai.zhang 已提交
141 142
  // fieldID -> indexID
  map<int64, int64> field_indexID = 7;
143
  bool refresh = 8;
W
wei liu 已提交
144 145
  // resource group names
  repeated string resource_groups = 9;
146 147
}

148 149 150 151 152
message ReleasePartitionsRequest {
  common.MsgBase base = 1;
  int64 dbID = 2;
  int64 collectionID = 3;
  repeated int64 partitionIDs = 4;
153
  int64 nodeID = 5;
154 155 156 157 158 159 160
}

message GetPartitionStatesRequest {
  common.MsgBase base = 1;
  int64 dbID = 2;
  int64 collectionID = 3;
  repeated int64 partitionIDs = 4;
161 162
}

G
godchen 已提交
163
message GetPartitionStatesResponse {
X
xige-16 已提交
164 165
  common.Status status = 1;
  repeated PartitionStates partition_descriptions = 2;
166 167
}

168
message GetSegmentInfoRequest {
169
  common.MsgBase base = 1;
170 171
  repeated int64 segmentIDs = 2; // deprecated
  int64 collectionID = 3;
172 173
}

174
message GetSegmentInfoResponse {
X
xige-16 已提交
175
  common.Status status = 1;
176
  repeated SegmentInfo infos = 2;
177 178
}

179 180 181 182 183 184
message GetShardLeadersRequest {
  common.MsgBase base = 1;
  int64 collectionID = 2;
}

message GetShardLeadersResponse {
185 186
  common.Status status = 1;
  repeated ShardLeadersList shards = 2;
187 188
}

189
message ShardLeadersList {  // All leaders of all replicas of one shard
190
  string channel_name = 1;
191 192
  repeated int64 node_ids = 2;
  repeated string node_addrs = 3;
193 194
}

195 196 197 198 199 200
message SyncNewCreatedPartitionRequest {
  common.MsgBase base = 1;
  int64 collectionID = 2;
  int64 partitionID = 3;
}

X
xige-16 已提交
201
//-----------------query node grpc request and response proto----------------
202 203 204
message LoadMetaInfo {
  LoadType load_type = 1;
  int64 collectionID = 2;
205
  repeated int64 partitionIDs = 3;
206 207
}

G
godchen 已提交
208
message WatchDmChannelsRequest {
209
  common.MsgBase base = 1;
210 211
  int64 nodeID = 2;
  int64 collectionID = 3;
212
  repeated int64 partitionIDs = 4;
213
  repeated data.VchannelInfo infos = 5;
214
  schema.CollectionSchema schema = 6;
215
  repeated data.SegmentInfo exclude_infos = 7;
216
  LoadMetaInfo load_meta = 8;
217
  int64 replicaID = 9;
218
  map<int64, data.SegmentInfo> segment_infos = 10;
219
  // Deprecated
220 221
  // for node down load balance, need to remove offline node in time after every watchDmChannel finish.
  int64 offlineNodeID = 11;
222
  int64 version = 12;
223 224
}

B
Bingyi Sun 已提交
225 226 227 228 229 230 231
message UnsubDmChannelRequest {
    common.MsgBase base = 1;
    int64 nodeID = 2;
    int64 collectionID = 3;
    string channel_name = 4;
}

232 233 234 235 236 237
message SegmentLoadInfo {
  int64 segmentID = 1;
  int64 partitionID = 2;
  int64 collectionID = 3;
  int64 dbID = 4;
  int64 flush_time = 5;
238
  repeated data.FieldBinlog binlog_paths = 6;
239
  int64 num_of_rows = 7;
240
  repeated data.FieldBinlog statslogs = 8;
241
  repeated data.FieldBinlog deltalogs = 9;
242
  repeated int64 compactionFrom = 10; // segmentIDs compacted from
243
  repeated FieldIndexInfo index_infos = 11;
244
  int64 segment_size = 12;
245
  string insert_channel = 13;
246
  msg.MsgPosition start_position = 14;
Y
yah01 已提交
247
  msg.MsgPosition end_position = 15;
248 249
}

250
message FieldIndexInfo {
251
  int64 fieldID =1;
252
  // deprecated
253 254 255 256 257 258 259
  bool enable_index = 2;
  string index_name = 3;
  int64 indexID = 4;
  int64 buildID = 5;
  repeated common.KeyValuePair index_params = 6;
  repeated string index_file_paths = 7;
  int64 index_size = 8;
260
  int64 index_version = 9;
261
  int64 num_rows = 10;
262 263
}

Y
yah01 已提交
264 265 266 267 268
enum LoadScope {
  Full = 0;
  Delta = 1;
}

G
godchen 已提交
269
message LoadSegmentsRequest {
270
  common.MsgBase base = 1;
271
  int64 dst_nodeID = 2;
272 273
  repeated SegmentLoadInfo infos = 3;
  schema.CollectionSchema schema = 4;
X
xige-16 已提交
274 275
  int64 source_nodeID = 5;
  int64 collectionID = 6;
276
  LoadMetaInfo load_meta = 7;
277
  int64 replicaID = 8;
278
  repeated msg.MsgPosition delta_positions = 9;
B
Bingyi Sun 已提交
279 280
  int64 version = 10;
  bool need_transfer = 11;
Y
yah01 已提交
281
  LoadScope load_scope = 12;
282 283
}

G
godchen 已提交
284
message ReleaseSegmentsRequest {
285
  common.MsgBase base = 1;
286
  int64 nodeID = 2;
287
  // Not useful for now
288 289 290 291
  int64 dbID = 3;
  int64 collectionID = 4;
  repeated int64 partitionIDs = 5;
  repeated int64 segmentIDs = 6;
292
  DataScope scope = 7; // All, Streaming, Historical
B
Bingyi Sun 已提交
293 294
  string shard = 8;
  bool need_transfer = 11;
295 296
}

297
message SearchRequest {
298
  internal.SearchRequest req = 1;
299
  repeated string dml_channels = 2;
300
  repeated int64 segmentIDs = 3;
301 302
  bool from_shard_leader = 4;
  DataScope scope = 5; // All, Streaming, Historical
G
Gao 已提交
303
  int32 total_channel_num = 6;
304 305 306
}

message QueryRequest {
307
  internal.RetrieveRequest req = 1;
308
  repeated string dml_channels = 2;
309
  repeated int64 segmentIDs = 3;
310 311
  bool from_shard_leader = 4;
  DataScope scope = 5; // All, Streaming, Historical
312 313
}

314 315 316 317 318 319 320 321 322 323
message SyncReplicaSegmentsRequest {
  common.MsgBase base = 1;
  string vchannel_name = 2;
  repeated ReplicaSegmentsInfo replica_segments = 3;
}

message ReplicaSegmentsInfo {
  int64 node_id = 1;
  int64 partition_id = 2;
  repeated int64 segment_ids = 3;
324
  repeated int64 versions = 4;
325 326
}

Y
yah01 已提交
327 328 329 330 331 332 333 334 335 336 337 338
message GetLoadInfoRequest {
  common.MsgBase base = 1;
  int64 collection_id = 2;
}

message GetLoadInfoResponse {
  common.Status status = 1;
  schema.CollectionSchema schema = 2;
  LoadType load_type = 3;
  repeated int64 partitions = 4;
}

X
xige-16 已提交
339 340 341 342
//----------------request auto triggered by QueryCoord-----------------
message HandoffSegmentsRequest {
  common.MsgBase base = 1;
  repeated SegmentInfo segmentInfos = 2;
Y
yah01 已提交
343
  repeated int64 released_segments = 3;
X
xige-16 已提交
344 345 346 347 348 349 350 351
}

message LoadBalanceRequest {
  common.MsgBase base = 1;
  repeated int64 source_nodeIDs = 2;
  TriggerCondition balance_reason = 3;
  repeated int64 dst_nodeIDs = 4;
  repeated int64 sealed_segmentIDs = 5;
352
  int64 collectionID = 6;
X
xige-16 已提交
353 354 355
}

//-------------------- internal meta proto------------------
356 357 358 359 360 361 362 363

enum DataScope {
  UnKnown = 0;
  All = 1;
  Streaming = 2;
  Historical = 3;
}

X
xige-16 已提交
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
enum PartitionState {
  NotExist = 0;
  NotPresent = 1;
  OnDisk = 2;
  PartialInMemory = 3;
  InMemory = 4;
  PartialInGPU = 5;
  InGPU = 6;
}

enum TriggerCondition {
  UnKnowCondition = 0;
  Handoff = 1;
  LoadBalance = 2;
  GrpcRequest = 3;
  NodeDown = 4;
380 381
}

382
enum LoadType {
383
  UnKnownType = 0;
X
xige-16 已提交
384
  LoadPartition = 1;
385
  LoadCollection = 2;
386 387
}

X
xige-16 已提交
388 389
message DmChannelWatchInfo {
  int64 collectionID = 1;
390 391
  string dmChannel = 2;
  int64 nodeID_loaded = 3;
392
  int64 replicaID = 4;
393
  repeated int64 node_ids = 5;
394 395 396 397
}

message QueryChannelInfo {
  int64 collectionID = 1;
X
xige-16 已提交
398 399
  string query_channel = 2;
  string query_result_channel = 3;
400
  repeated SegmentInfo global_sealed_segments = 4;
401
  msg.MsgPosition seek_position = 5;
402 403
}

X
xige-16 已提交
404 405 406 407 408 409 410 411 412 413
message PartitionStates {
  int64 partitionID = 1;
  PartitionState state = 2;
  int64 inMemory_percentage = 3;
}

message SegmentInfo {
  int64 segmentID = 1;
  int64 collectionID = 2;
  int64 partitionID = 3;
414
  // deprecated, check node_ids(NodeIds) field
X
xige-16 已提交
415 416 417 418 419 420 421 422 423
  int64 nodeID = 4;
  int64 mem_size = 5;
  int64 num_rows = 6;
  string index_name = 7;
  int64 indexID = 8;
  string dmChannel = 9;
  repeated int64 compactionFrom = 10;
  bool createdByCompaction = 11;
  common.SegmentState segment_state = 12;
424
  repeated FieldIndexInfo index_infos = 13;
425 426
  repeated int64 replica_ids = 14;
  repeated int64 node_ids = 15;
427
  bool enable_index = 16;
J
jaime 已提交
428
  bool is_fake = 17;
X
xige-16 已提交
429 430
}

431 432 433
message CollectionInfo {
  int64 collectionID = 1;
  repeated int64 partitionIDs = 2;
434
  repeated PartitionStates partition_states = 3;
435 436 437 438
  LoadType load_type = 4;
  schema.CollectionSchema schema = 5;
  repeated int64 released_partitionIDs = 6;
  int64 inMemory_percentage = 7;
439
  repeated int64 replica_ids = 8;
440 441 442
  int32 replica_number = 9;
}

443 444 445 446 447 448 449 450 451 452
message UnsubscribeChannels {
  int64 collectionID = 1;
  repeated string channels = 2;
}

message UnsubscribeChannelInfo {
  int64 nodeID = 1;
  repeated UnsubscribeChannels collection_channels = 2;
}

X
xige-16 已提交
453
//---- synchronize messages proto between QueryCoord and QueryNode -----
454 455 456 457 458 459 460
message SegmentChangeInfo {
  int64 online_nodeID = 1;
  repeated SegmentInfo online_segments = 2;
  int64 offline_nodeID = 3;
  repeated SegmentInfo offline_segments = 4;
}

461 462
message SealedSegmentsChangeInfo {
  common.MsgBase base = 1;
463
  repeated SegmentChangeInfo infos = 2;
464
}
B
Bingyi Sun 已提交
465 466 467

message GetDataDistributionRequest {
  common.MsgBase base = 1;
Y
yah01 已提交
468
  map<string, msg.MsgPosition> checkpoints = 2;
B
Bingyi Sun 已提交
469 470 471 472 473
}

message GetDataDistributionResponse {
  common.Status status = 1;
  int64 nodeID = 2;
474 475 476
  repeated SegmentVersionInfo segments = 3;
  repeated ChannelVersionInfo channels = 4;
  repeated LeaderView leader_views = 5;
B
Bingyi Sun 已提交
477 478 479 480 481
}

message LeaderView {
  int64 collection = 1;
  string channel = 2;
482
  map<int64, SegmentDist> segment_dist = 3;
483
  repeated int64 growing_segmentIDs = 4;
484
  map<int64, msg.MsgPosition> growing_segments = 5;
B
Bingyi Sun 已提交
485 486
}

487 488 489 490 491
message SegmentDist {
  int64 nodeID = 1;
  int64 version = 2;
}

B
Bingyi Sun 已提交
492 493 494 495 496 497 498

message SegmentVersionInfo {
  int64 ID = 1;
  int64 collection = 2;
  int64 partition = 3;
  string channel = 4;
  int64 version = 5;
Y
yah01 已提交
499
  uint64 last_delta_timestamp = 6;
B
Bingyi Sun 已提交
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
}

message ChannelVersionInfo {
  string channel = 1;
  int64 collection = 2;
  int64 version = 3;
}

enum LoadStatus {
  Invalid = 0;
  Loading = 1;
  Loaded = 2;
}

message CollectionLoadInfo {
  int64 collectionID = 1;
516
  repeated int64 released_partitions = 2; // Deprecated: No longer used; kept for compatibility.
B
Bingyi Sun 已提交
517 518
  int32 replica_number = 3;
  LoadStatus status = 4;
519
  map<int64, int64> field_indexID = 5;
520
  LoadType load_type = 6;
B
Bingyi Sun 已提交
521 522 523 524 525
}

message PartitionLoadInfo {
  int64 collectionID = 1;
  int64 partitionID = 2;
526
  int32 replica_number = 3; // Deprecated: No longer used; kept for compatibility.
B
Bingyi Sun 已提交
527
  LoadStatus status = 4;
528
  map<int64, int64> field_indexID = 5; // Deprecated: No longer used; kept for compatibility.
B
Bingyi Sun 已提交
529 530 531 532 533 534
}

message Replica {
  int64 ID = 1;
  int64 collectionID = 2;
  repeated int64 nodes = 3;
W
wei liu 已提交
535
  string resource_group = 4;
B
Bingyi Sun 已提交
536 537 538 539 540
}

enum SyncType {
  Remove = 0;
  Set = 1;
Y
yah01 已提交
541
  Amend = 2;
B
Bingyi Sun 已提交
542 543 544 545 546 547 548
}

message SyncAction {
  SyncType type = 1;
  int64 partitionID = 2;
  int64 segmentID = 3;
  int64 nodeID = 4;
549
  int64 version = 5;
Y
yah01 已提交
550
  SegmentLoadInfo info = 6;
B
Bingyi Sun 已提交
551 552 553 554 555 556 557
}

message SyncDistributionRequest {
  common.MsgBase base = 1;
  int64 collectionID = 2;
  string channel = 3;
  repeated SyncAction actions = 4;
558 559 560 561
  schema.CollectionSchema schema = 5;
  LoadMetaInfo load_meta = 6;
  int64 replicaID = 7;
  int64 version = 8;
B
Bingyi Sun 已提交
562 563
}

W
wei liu 已提交
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
message ResourceGroup {
  string name = 1;
  int32 capacity = 2;
  repeated int64 nodes = 3;
}

// transfer `replicaNum` replicas in `collectionID` from `source_resource_group` to `target_resource_groups`
message TransferReplicaRequest {
  common.MsgBase base = 1;
  string source_resource_group = 2;
  string target_resource_group = 3;
  int64  collectionID = 4;
  int64  num_replica = 5;
}

message DescribeResourceGroupRequest {
  common.MsgBase base = 1;
  string resource_group = 2;
}

message DescribeResourceGroupResponse {
  common.Status status = 1;
  ResourceGroupInfo resource_group = 2;
}

message ResourceGroupInfo {
  string name = 1;
  int32 capacity = 2;
  int32 num_available_node = 3;
  // collection id -> loaded replica num
  map<int64, int32> num_loaded_replica = 4;
  // collection id -> accessed other rg's node num 
  map<int64, int32> num_outgoing_node = 5;
   // collection id -> be accessed node num by other rg
  map<int64, int32> num_incoming_node = 6;
Y
yah01 已提交
599 600 601 602 603 604 605 606 607 608
}
message DeleteRequest {
  common.MsgBase base = 1;
  int64 collection_id = 2;
  int64 partition_id = 3;
  string vchannel_name = 4;
  int64 segment_id = 5;
  schema.IDs primary_keys = 6;
  repeated uint64 timestamps = 7; 
}