macrocosmos 2.1.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -57,7 +57,7 @@ describe("Sn13Client", () => {
57
57
  expect(response.data.length).toBeLessThanOrEqual(request.limit);
58
58
  // Log response for debugging
59
59
  console.log("On-Demand Data Response:", response);
60
- }, 60000); // Increase timeout to 60 seconds
60
+ }, 160000); // Increase timeout to 60 seconds
61
61
  it("should fetch on-demand data with keyword mode", async () => {
62
62
  // Create Sn13Client
63
63
  const client = new macrocosmos_1.Sn13Client({
@@ -82,7 +82,7 @@ describe("Sn13Client", () => {
82
82
  expect(response.data.length).toBeLessThanOrEqual(request.limit);
83
83
  // Log response for debugging
84
84
  console.log("On-Demand Data Response:", response);
85
- }, 60000); // Increase timeout to 60 seconds
85
+ }, 160000); // Increase timeout to 60 seconds
86
86
  it("should fetch on-demand data with URL mode", async () => {
87
87
  // Create Sn13Client
88
88
  const client = new macrocosmos_1.Sn13Client({
@@ -103,5 +103,5 @@ describe("Sn13Client", () => {
103
103
  expect(Array.isArray(response.data)).toBe(true);
104
104
  // Log response for debugging
105
105
  console.log("On-Demand Data Response:", response);
106
- }, 200000); // Increase timeout to 60 seconds
106
+ }, 1200000); // Increase timeout to 60 seconds
107
107
  });
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: billing/v1/billing.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.BillingServiceClient = exports.BillingServiceService = exports.UserHasEnoughAllowanceAndCreditsResponse = exports.UserHasEnoughAllowanceAndCreditsRequest = exports.ChargeUserForUsageResponse = exports.ChargeUserForUsageRequest = exports.GetUsageResponse = exports.SubscriptionInfo = exports.BillingRate = exports.GetUsageRequest = exports.protobufPackage = void 0;
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: google/protobuf/empty.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.Empty = exports.protobufPackage = void 0;
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: google/protobuf/struct.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.ListValue = exports.Value = exports.Struct_FieldsEntry = exports.Struct = exports.NullValue = exports.protobufPackage = void 0;
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: google/protobuf/timestamp.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.Timestamp = exports.protobufPackage = void 0;
@@ -122,6 +122,8 @@ export interface Crawler {
122
122
  datasetWorkflows: string[];
123
123
  /** parquet_paths: the paths to the raw miner files collected */
124
124
  parquetPaths: string[];
125
+ /** pre_built_row_count: the number of rows in the pre-built user dataset (if present) */
126
+ preBuiltRowCount?: number | undefined;
125
127
  }
126
128
  /** UpsertCrawlerRequest for upserting a crawler and its criteria */
127
129
  export interface UpsertCrawlerRequest {
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: gravity/v1/gravity.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.DatasetFile = exports.InsertDatasetFileRequest = exports.UpsertNebulaRequest = exports.UpsertDatasetRequest = exports.Dataset = exports.Nebula = exports.ChargeForDatasetRowsRequest = exports.BuildAllDatasetsResponse = exports.BuildAllDatasetsRequest = exports.BuildDatasetResponse = exports.BuildDatasetRequest = exports.CreateGravityTaskResponse = exports.CreateGravityTaskRequest = exports.GetCrawlerResponse = exports.CompleteCrawlerRequest = exports.GetMarketplaceCrawlersResponse = exports.GetCrawlerRequest = exports.NotificationRequest = exports.GravityTask = exports.GetGravityTasksResponse = exports.GetGravityTasksRequest = exports.GravityMarketplaceTaskState = exports.GravityTaskState = exports.CrawlerState = exports.HfRepo = exports.CrawlerNotification = exports.CrawlerCriteria = exports.InsertCrawlerCriteriaRequest = exports.GravityTaskRequest = exports.UpsertGravityTaskResponse = exports.UpsertGravityTaskRequest = exports.UpsertResponse = exports.UpsertCrawlerRequest = exports.Crawler = exports.GetMarketplaceDatasetsRequest = exports.UpsertMarketplaceTaskMetadataRequest = exports.PublishDatasetRequest = exports.GetPopularTagsResponse = exports.PopularTag = exports.GetMarketplaceTaskSuggestionsResponse = exports.GetMarketplaceTaskSuggestionsRequest = exports.UpsertMarketplaceTaskSuggestionsRequest = exports.UpsertHotkeysRequest = exports.GetUserMarketplaceDatasetsResponse = exports.UserMarketplaceDataset = exports.BuyMarketplaceDatasetResponse = exports.BuyMarketplaceDatasetRequest = exports.GetHotkeysResponse = exports.UpsertRawMinerFilesRequest = exports.protobufPackage = void 0;
@@ -1086,6 +1086,7 @@ function createBaseCrawler() {
1086
1086
  state: undefined,
1087
1087
  datasetWorkflows: [],
1088
1088
  parquetPaths: [],
1089
+ preBuiltRowCount: undefined,
1089
1090
  };
1090
1091
  }
1091
1092
  exports.Crawler = {
@@ -1114,6 +1115,9 @@ exports.Crawler = {
1114
1115
  for (const v of message.parquetPaths) {
1115
1116
  writer.uint32(66).string(v);
1116
1117
  }
1118
+ if (message.preBuiltRowCount !== undefined) {
1119
+ writer.uint32(72).int64(message.preBuiltRowCount);
1120
+ }
1117
1121
  return writer;
1118
1122
  },
1119
1123
  decode(input, length) {
@@ -1179,6 +1183,13 @@ exports.Crawler = {
1179
1183
  message.parquetPaths.push(reader.string());
1180
1184
  continue;
1181
1185
  }
1186
+ case 9: {
1187
+ if (tag !== 72) {
1188
+ break;
1189
+ }
1190
+ message.preBuiltRowCount = longToNumber(reader.int64());
1191
+ continue;
1192
+ }
1182
1193
  }
1183
1194
  if ((tag & 7) === 4 || tag === 0) {
1184
1195
  break;
@@ -1213,6 +1224,9 @@ exports.Crawler = {
1213
1224
  parquetPaths: globalThis.Array.isArray(object?.parquetPaths)
1214
1225
  ? object.parquetPaths.map((e) => globalThis.String(e))
1215
1226
  : [],
1227
+ preBuiltRowCount: isSet(object.preBuiltRowCount)
1228
+ ? globalThis.Number(object.preBuiltRowCount)
1229
+ : undefined,
1216
1230
  };
1217
1231
  },
1218
1232
  toJSON(message) {
@@ -1241,6 +1255,9 @@ exports.Crawler = {
1241
1255
  if (message.parquetPaths?.length) {
1242
1256
  obj.parquetPaths = message.parquetPaths;
1243
1257
  }
1258
+ if (message.preBuiltRowCount !== undefined) {
1259
+ obj.preBuiltRowCount = Math.round(message.preBuiltRowCount);
1260
+ }
1244
1261
  return obj;
1245
1262
  },
1246
1263
  create(base) {
@@ -1262,6 +1279,7 @@ exports.Crawler = {
1262
1279
  : undefined;
1263
1280
  message.datasetWorkflows = object.datasetWorkflows?.map(e => e) || [];
1264
1281
  message.parquetPaths = object.parquetPaths?.map(e => e) || [];
1282
+ message.preBuiltRowCount = object.preBuiltRowCount ?? undefined;
1265
1283
  return message;
1266
1284
  },
1267
1285
  };
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: logger/v1/logger.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.LoggerServiceClient = exports.LoggerServiceService = exports.StoreRecordBatchRequest = exports.Record = exports.CreateRunRequest = exports.Ack = exports.protobufPackage = void 0;
@@ -2,7 +2,7 @@
2
2
  // Code generated by protoc-gen-ts_proto. DO NOT EDIT.
3
3
  // versions:
4
4
  // protoc-gen-ts_proto v2.7.0
5
- // protoc v6.33.4
5
+ // protoc v6.33.5
6
6
  // source: sn13/v1/sn13_validator.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.Sn13ServiceClient = exports.Sn13ServiceService = exports.OnDemandDataResponse = exports.OnDemandDataRequest = exports.ValidateRedditTopicResponse = exports.ValidateRedditTopicRequest = exports.ListTopicsResponse = exports.ListTopicsResponseDetail = exports.ListTopicsRequest = exports.protobufPackage = void 0;
@@ -1,9 +1,10 @@
1
- import { GravityServiceClient, GetGravityTasksRequest, GetGravityTasksResponse, GetCrawlerRequest, GetCrawlerResponse, CreateGravityTaskRequest as GeneratedCreateGravityTaskRequest, CreateGravityTaskResponse, BuildDatasetRequest as GeneratedBuildDatasetRequest, BuildDatasetResponse, GetDatasetRequest, GetDatasetResponse, CancelGravityTaskRequest, CancelGravityTaskResponse, CancelDatasetRequest, CancelDatasetResponse, Crawler, CrawlerCriteria, CrawlerNotification, HfRepo, CrawlerState, GravityTaskState, NotificationRequest, Dataset, DatasetFile, DatasetStep, Nebula, GetGravityTaskDatasetFilesResponse, GetGravityTaskDatasetFilesRequest, BuildAllDatasetsResponse, BuildAllDatasetsRequest } from "../../generated/gravity/v1/gravity";
1
+ import { GravityServiceClient, GetGravityTasksRequest, GetGravityTasksResponse, GetCrawlerRequest, GetCrawlerResponse, CreateGravityTaskRequest as GeneratedCreateGravityTaskRequest, CreateGravityTaskResponse, BuildDatasetRequest as GeneratedBuildDatasetRequest, BuildDatasetResponse, GetDatasetRequest, GetDatasetResponse, CancelGravityTaskRequest, CancelGravityTaskResponse, CancelDatasetRequest, CancelDatasetResponse, Crawler, CrawlerCriteria, CrawlerNotification, HfRepo, CrawlerState, GravityTaskState, NotificationRequest, Dataset, DatasetFile, DatasetStep, Nebula, GetGravityTaskDatasetFilesResponse, GetGravityTaskDatasetFilesRequest, BuildAllDatasetsResponse, BuildAllDatasetsRequest, GetMarketplaceDatasetsRequest, GetMarketplaceDatasetsResponse, GetCrawlerHistoryRequest, GetCrawlerHistoryResponse, GetUserMarketplaceDatasetsResponse, GetMarketplaceTaskSuggestionsRequest, GetPopularTagsResponse, BuyMarketplaceDatasetRequest, BuyMarketplaceDatasetResponse, UserMarketplaceDataset, PopularTag, CrawlerHistoryEntry, CrawlerCriteriaAndHistory } from "../../generated/gravity/v1/gravity";
2
+ import { Empty } from "../../generated/google/protobuf/empty";
2
3
  import { BaseClient, BaseClientOptions } from "../BaseClient";
3
4
  import { MarkFieldsOptional } from "../util.types";
4
5
  type CreateGravityTaskRequest = MarkFieldsOptional<GeneratedCreateGravityTaskRequest, "notificationRequests">;
5
6
  type BuildDatasetRequest = MarkFieldsOptional<GeneratedBuildDatasetRequest, "notificationRequests">;
6
- export type { GetGravityTasksRequest, GetGravityTasksResponse, GetCrawlerRequest, GetCrawlerResponse, CreateGravityTaskRequest, CreateGravityTaskResponse, BuildDatasetRequest, BuildDatasetResponse, GetDatasetRequest, GetDatasetResponse, CancelGravityTaskRequest, CancelGravityTaskResponse, CancelDatasetRequest, CancelDatasetResponse, Crawler, CrawlerCriteria, CrawlerNotification, HfRepo, CrawlerState, GravityTaskState, NotificationRequest, Dataset, DatasetFile, DatasetStep, Nebula, };
7
+ export type { GetGravityTasksRequest, GetGravityTasksResponse, GetCrawlerRequest, GetCrawlerResponse, CreateGravityTaskRequest, CreateGravityTaskResponse, BuildDatasetRequest, BuildDatasetResponse, GetDatasetRequest, GetDatasetResponse, CancelGravityTaskRequest, CancelGravityTaskResponse, CancelDatasetRequest, CancelDatasetResponse, Crawler, CrawlerCriteria, CrawlerNotification, HfRepo, CrawlerState, GravityTaskState, NotificationRequest, Dataset, DatasetFile, DatasetStep, Nebula, GetMarketplaceDatasetsRequest, GetMarketplaceDatasetsResponse, GetCrawlerHistoryRequest, GetCrawlerHistoryResponse, GetUserMarketplaceDatasetsResponse, GetMarketplaceTaskSuggestionsRequest, GetPopularTagsResponse, BuyMarketplaceDatasetRequest, BuyMarketplaceDatasetResponse, UserMarketplaceDataset, PopularTag, CrawlerHistoryEntry, CrawlerCriteriaAndHistory, Empty, };
7
8
  /**
8
9
  * Client for interacting with the Gravity API
9
10
  * Provides gRPC interface for data collection and dataset management
@@ -41,5 +42,34 @@ export declare class GravityClient extends BaseClient {
41
42
  */
42
43
  cancelDataset: (params: CancelDatasetRequest) => Promise<CancelDatasetResponse>;
43
44
  getGravityTaskDatasetFiles: (params: GetGravityTaskDatasetFilesRequest) => Promise<GetGravityTaskDatasetFilesResponse>;
45
+ /**
46
+ * Gets the available datasets for use in Dataset Marketplace
47
+ */
48
+ getMarketplaceDatasets: (params: GetMarketplaceDatasetsRequest) => Promise<GetMarketplaceDatasetsResponse>;
44
49
  buildAllDatasets: (params: BuildAllDatasetsRequest) => Promise<BuildAllDatasetsResponse>;
50
+ /**
51
+ * Gets all dataset files for a given marketplace gravity task
52
+ * (no user_id check, validates against marketplace tasks table)
53
+ */
54
+ getGravityMarketplaceTaskDatasetFiles: (params: GetGravityTaskDatasetFilesRequest) => Promise<GetGravityTaskDatasetFilesResponse>;
55
+ /**
56
+ * Gets crawler history for a given gravity task
57
+ */
58
+ getCrawlerHistory: (params: GetCrawlerHistoryRequest) => Promise<GetCrawlerHistoryResponse>;
59
+ /**
60
+ * Get all marketplace datasets owned by the authenticated user
61
+ */
62
+ getUserMarketplaceDatasets: () => Promise<GetUserMarketplaceDatasetsResponse>;
63
+ /**
64
+ * Get marketplace task suggestions for a given gravity task
65
+ */
66
+ getMarketplaceTaskSuggestions: (params: GetMarketplaceTaskSuggestionsRequest) => Promise<GetMarketplaceDatasetsResponse>;
67
+ /**
68
+ * Gets popular tags across all gravity tasks
69
+ */
70
+ getPopularTags: () => Promise<GetPopularTagsResponse>;
71
+ /**
72
+ * Purchase a marketplace dataset
73
+ */
74
+ buyMarketplaceDataset: (params: BuyMarketplaceDatasetRequest) => Promise<BuyMarketplaceDatasetResponse>;
45
75
  }
@@ -223,6 +223,33 @@ class GravityClient extends BaseClient_1.BaseClient {
223
223
  });
224
224
  });
225
225
  };
226
+ /**
227
+ * Gets the available datasets for use in Dataset Marketplace
228
+ */
229
+ this.getMarketplaceDatasets = (params) => {
230
+ const client = this.createGrpcClient();
231
+ if (this.isSecure()) {
232
+ return new Promise((resolve, reject) => {
233
+ client.getMarketplaceDatasets(params, (error, response) => {
234
+ if (error) {
235
+ reject(error);
236
+ return;
237
+ }
238
+ resolve(response);
239
+ });
240
+ });
241
+ }
242
+ const metadata = this.createAuthMetadata();
243
+ return new Promise((resolve, reject) => {
244
+ client.getMarketplaceDatasets(params, metadata, (error, response) => {
245
+ if (error) {
246
+ reject(error);
247
+ return;
248
+ }
249
+ resolve(response);
250
+ });
251
+ });
252
+ };
226
253
  this.buildAllDatasets = (params) => {
227
254
  const client = this.createGrpcClient();
228
255
  if (this.isSecure()) {
@@ -247,6 +274,171 @@ class GravityClient extends BaseClient_1.BaseClient {
247
274
  });
248
275
  });
249
276
  };
277
+ /**
278
+ * Gets all dataset files for a given marketplace gravity task
279
+ * (no user_id check, validates against marketplace tasks table)
280
+ */
281
+ this.getGravityMarketplaceTaskDatasetFiles = (params) => {
282
+ const client = this.createGrpcClient();
283
+ if (this.isSecure()) {
284
+ return new Promise((resolve, reject) => {
285
+ client.getGravityMarketplaceTaskDatasetFiles(params, (error, response) => {
286
+ if (error) {
287
+ reject(error);
288
+ return;
289
+ }
290
+ resolve(response);
291
+ });
292
+ });
293
+ }
294
+ const metadata = this.createAuthMetadata();
295
+ return new Promise((resolve, reject) => {
296
+ client.getGravityMarketplaceTaskDatasetFiles(params, metadata, (error, response) => {
297
+ if (error) {
298
+ reject(error);
299
+ return;
300
+ }
301
+ resolve(response);
302
+ });
303
+ });
304
+ };
305
+ /**
306
+ * Gets crawler history for a given gravity task
307
+ */
308
+ this.getCrawlerHistory = (params) => {
309
+ const client = this.createGrpcClient();
310
+ if (this.isSecure()) {
311
+ return new Promise((resolve, reject) => {
312
+ client.getCrawlerHistory(params, (error, response) => {
313
+ if (error) {
314
+ reject(error);
315
+ return;
316
+ }
317
+ resolve(response);
318
+ });
319
+ });
320
+ }
321
+ const metadata = this.createAuthMetadata();
322
+ return new Promise((resolve, reject) => {
323
+ client.getCrawlerHistory(params, metadata, (error, response) => {
324
+ if (error) {
325
+ reject(error);
326
+ return;
327
+ }
328
+ resolve(response);
329
+ });
330
+ });
331
+ };
332
+ /**
333
+ * Get all marketplace datasets owned by the authenticated user
334
+ */
335
+ this.getUserMarketplaceDatasets = () => {
336
+ const client = this.createGrpcClient();
337
+ const params = {};
338
+ if (this.isSecure()) {
339
+ return new Promise((resolve, reject) => {
340
+ client.getUserMarketplaceDatasets(params, (error, response) => {
341
+ if (error) {
342
+ reject(error);
343
+ return;
344
+ }
345
+ resolve(response);
346
+ });
347
+ });
348
+ }
349
+ const metadata = this.createAuthMetadata();
350
+ return new Promise((resolve, reject) => {
351
+ client.getUserMarketplaceDatasets(params, metadata, (error, response) => {
352
+ if (error) {
353
+ reject(error);
354
+ return;
355
+ }
356
+ resolve(response);
357
+ });
358
+ });
359
+ };
360
+ /**
361
+ * Get marketplace task suggestions for a given gravity task
362
+ */
363
+ this.getMarketplaceTaskSuggestions = (params) => {
364
+ const client = this.createGrpcClient();
365
+ if (this.isSecure()) {
366
+ return new Promise((resolve, reject) => {
367
+ client.getMarketplaceTaskSuggestions(params, (error, response) => {
368
+ if (error) {
369
+ reject(error);
370
+ return;
371
+ }
372
+ resolve(response);
373
+ });
374
+ });
375
+ }
376
+ const metadata = this.createAuthMetadata();
377
+ return new Promise((resolve, reject) => {
378
+ client.getMarketplaceTaskSuggestions(params, metadata, (error, response) => {
379
+ if (error) {
380
+ reject(error);
381
+ return;
382
+ }
383
+ resolve(response);
384
+ });
385
+ });
386
+ };
387
+ /**
388
+ * Gets popular tags across all gravity tasks
389
+ */
390
+ this.getPopularTags = () => {
391
+ const client = this.createGrpcClient();
392
+ const params = {};
393
+ if (this.isSecure()) {
394
+ return new Promise((resolve, reject) => {
395
+ client.getPopularTags(params, (error, response) => {
396
+ if (error) {
397
+ reject(error);
398
+ return;
399
+ }
400
+ resolve(response);
401
+ });
402
+ });
403
+ }
404
+ const metadata = this.createAuthMetadata();
405
+ return new Promise((resolve, reject) => {
406
+ client.getPopularTags(params, metadata, (error, response) => {
407
+ if (error) {
408
+ reject(error);
409
+ return;
410
+ }
411
+ resolve(response);
412
+ });
413
+ });
414
+ };
415
+ /**
416
+ * Purchase a marketplace dataset
417
+ */
418
+ this.buyMarketplaceDataset = (params) => {
419
+ const client = this.createGrpcClient();
420
+ if (this.isSecure()) {
421
+ return new Promise((resolve, reject) => {
422
+ client.buyMarketplaceDataset(params, (error, response) => {
423
+ if (error) {
424
+ reject(error);
425
+ return;
426
+ }
427
+ resolve(response);
428
+ });
429
+ });
430
+ }
431
+ const metadata = this.createAuthMetadata();
432
+ return new Promise((resolve, reject) => {
433
+ client.buyMarketplaceDataset(params, metadata, (error, response) => {
434
+ if (error) {
435
+ reject(error);
436
+ return;
437
+ }
438
+ resolve(response);
439
+ });
440
+ });
441
+ };
250
442
  this._grpcClient = grpcClient;
251
443
  }
252
444
  createGrpcClient() {
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "2.1.4";
1
+ export declare const VERSION = "2.2.0";
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "2.1.4";
4
+ exports.VERSION = "2.2.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "macrocosmos",
3
- "version": "2.1.4",
3
+ "version": "2.2.0",
4
4
  "description": "TypeScript SDK package for Macrocosmos",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",