digitaltwin-core 0.1.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/components/assets_manager.d.ts +384 -0
  4. package/dist/components/assets_manager.d.ts.map +1 -0
  5. package/dist/components/assets_manager.js +637 -0
  6. package/dist/components/assets_manager.js.map +1 -0
  7. package/dist/components/collector.d.ts +62 -0
  8. package/dist/components/collector.d.ts.map +1 -0
  9. package/dist/components/collector.js +80 -0
  10. package/dist/components/collector.js.map +1 -0
  11. package/dist/components/global_assets_handler.d.ts +63 -0
  12. package/dist/components/global_assets_handler.d.ts.map +1 -0
  13. package/dist/components/global_assets_handler.js +127 -0
  14. package/dist/components/global_assets_handler.js.map +1 -0
  15. package/dist/components/handler.d.ts +33 -0
  16. package/dist/components/handler.d.ts.map +1 -0
  17. package/dist/components/handler.js +27 -0
  18. package/dist/components/handler.js.map +1 -0
  19. package/dist/components/harvester.d.ts +54 -0
  20. package/dist/components/harvester.d.ts.map +1 -0
  21. package/dist/components/harvester.js +253 -0
  22. package/dist/components/harvester.js.map +1 -0
  23. package/dist/components/index.d.ts +8 -0
  24. package/dist/components/index.d.ts.map +1 -0
  25. package/dist/components/index.js +6 -0
  26. package/dist/components/index.js.map +1 -0
  27. package/dist/components/interfaces.d.ts +18 -0
  28. package/dist/components/interfaces.d.ts.map +1 -0
  29. package/dist/components/interfaces.js +2 -0
  30. package/dist/components/interfaces.js.map +1 -0
  31. package/dist/components/types.d.ts +47 -0
  32. package/dist/components/types.d.ts.map +1 -0
  33. package/dist/components/types.js +2 -0
  34. package/dist/components/types.js.map +1 -0
  35. package/dist/database/adapters/knex_database_adapter.d.ts +47 -0
  36. package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
  37. package/dist/database/adapters/knex_database_adapter.js +180 -0
  38. package/dist/database/adapters/knex_database_adapter.js.map +1 -0
  39. package/dist/database/database_adapter.d.ts +92 -0
  40. package/dist/database/database_adapter.d.ts.map +1 -0
  41. package/dist/database/database_adapter.js +6 -0
  42. package/dist/database/database_adapter.js.map +1 -0
  43. package/dist/engine/digital_twin_engine.d.ts +237 -0
  44. package/dist/engine/digital_twin_engine.d.ts.map +1 -0
  45. package/dist/engine/digital_twin_engine.js +574 -0
  46. package/dist/engine/digital_twin_engine.js.map +1 -0
  47. package/dist/engine/endpoints.d.ts +7 -0
  48. package/dist/engine/endpoints.d.ts.map +1 -0
  49. package/dist/engine/endpoints.js +18 -0
  50. package/dist/engine/endpoints.js.map +1 -0
  51. package/dist/engine/events.d.ts +13 -0
  52. package/dist/engine/events.d.ts.map +1 -0
  53. package/dist/engine/events.js +11 -0
  54. package/dist/engine/events.js.map +1 -0
  55. package/dist/engine/initializer.d.ts +8 -0
  56. package/dist/engine/initializer.d.ts.map +1 -0
  57. package/dist/engine/initializer.js +23 -0
  58. package/dist/engine/initializer.js.map +1 -0
  59. package/dist/engine/queue_manager.d.ts +78 -0
  60. package/dist/engine/queue_manager.d.ts.map +1 -0
  61. package/dist/engine/queue_manager.js +167 -0
  62. package/dist/engine/queue_manager.js.map +1 -0
  63. package/dist/engine/scheduler.d.ts +30 -0
  64. package/dist/engine/scheduler.d.ts.map +1 -0
  65. package/dist/engine/scheduler.js +378 -0
  66. package/dist/engine/scheduler.js.map +1 -0
  67. package/dist/env/env.d.ts +25 -0
  68. package/dist/env/env.d.ts.map +1 -0
  69. package/dist/env/env.js +55 -0
  70. package/dist/env/env.js.map +1 -0
  71. package/dist/index.d.ts +23 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +31 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/storage/adapters/local_storage_service.d.ts +29 -0
  76. package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
  77. package/dist/storage/adapters/local_storage_service.js +50 -0
  78. package/dist/storage/adapters/local_storage_service.js.map +1 -0
  79. package/dist/storage/adapters/ovh_storage_service.d.ts +32 -0
  80. package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
  81. package/dist/storage/adapters/ovh_storage_service.js +70 -0
  82. package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
  83. package/dist/storage/storage_factory.d.ts +14 -0
  84. package/dist/storage/storage_factory.d.ts.map +1 -0
  85. package/dist/storage/storage_factory.js +36 -0
  86. package/dist/storage/storage_factory.js.map +1 -0
  87. package/dist/storage/storage_service.d.ts +26 -0
  88. package/dist/storage/storage_service.d.ts.map +1 -0
  89. package/dist/storage/storage_service.js +7 -0
  90. package/dist/storage/storage_service.js.map +1 -0
  91. package/dist/types/data_record.d.ts +17 -0
  92. package/dist/types/data_record.d.ts.map +1 -0
  93. package/dist/types/data_record.js +2 -0
  94. package/dist/types/data_record.js.map +1 -0
  95. package/dist/utils/logger.d.ts +17 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +35 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/dist/utils/map_to_data_record.d.ts +10 -0
  100. package/dist/utils/map_to_data_record.d.ts.map +1 -0
  101. package/dist/utils/map_to_data_record.js +21 -0
  102. package/dist/utils/map_to_data_record.js.map +1 -0
  103. package/dist/utils/servable_endpoint.d.ts +6 -0
  104. package/dist/utils/servable_endpoint.d.ts.map +1 -0
  105. package/dist/utils/servable_endpoint.js +15 -0
  106. package/dist/utils/servable_endpoint.js.map +1 -0
  107. package/package.json +95 -0
@@ -0,0 +1,92 @@
1
+ import { DataRecord } from '../types/data_record.js';
2
+ /**
3
+ * Structure used to store metadata about a data blob in the database.
4
+ *
5
+ * Extended to support asset-specific fields for AssetsManager components.
6
+ * These fields are optional and only used by AssetsManager instances.
7
+ */
8
+ export interface MetadataRow {
9
+ /** Unique identifier of the data row */
10
+ id?: number;
11
+ /** Logical name of the data source (usually the collector name) */
12
+ name: string;
13
+ /** MIME type of the associated blob (e.g. 'application/json') */
14
+ type: string;
15
+ /** Path or URL where the blob is stored (resolved by the StorageService) */
16
+ url: string;
17
+ /** Timestamp indicating when the data was collected */
18
+ date: Date;
19
+ /** Human-readable description of the asset (AssetsManager only) */
20
+ description?: string;
21
+ /** Source URL for data provenance (AssetsManager only) */
22
+ source?: string;
23
+ /** ID of the user who owns this asset (AssetsManager only) */
24
+ owner_id?: string | null;
25
+ /** Original filename provided by the user (AssetsManager only) */
26
+ filename?: string;
27
+ }
28
+ /**
29
+ * Extended abstraction for the database layer with advanced querying capabilities.
30
+ */
31
+ export declare abstract class DatabaseAdapter {
32
+ abstract save(meta: MetadataRow): Promise<DataRecord>;
33
+ abstract delete(id: string): Promise<void>;
34
+ abstract getById(id: string): Promise<DataRecord | undefined>;
35
+ abstract getLatestByName(name: string): Promise<DataRecord | undefined>;
36
+ abstract doesTableExists(name: string): Promise<boolean>;
37
+ abstract createTable(name: string): Promise<void>;
38
+ /**
39
+ * Get the first (oldest) record for a given component name.
40
+ * @param name - The component name
41
+ * @returns The oldest DataRecord or undefined if none found
42
+ */
43
+ abstract getFirstByName(name: string): Promise<DataRecord | undefined>;
44
+ /**
45
+ * Get records between two dates for a given component.
46
+ * @param name - The component name
47
+ * @param startDate - Start date (inclusive)
48
+ * @param endDate - End date (exclusive), optional
49
+ * @param limit - Maximum number of records to return, optional
50
+ * @returns Array of DataRecords matching the criteria
51
+ */
52
+ abstract getByDateRange(name: string, startDate: Date, endDate?: Date, limit?: number): Promise<DataRecord[]>;
53
+ /**
54
+ * Get records after a specific date for a given component.
55
+ * @param name - The component name
56
+ * @param afterDate - Date to search after (exclusive)
57
+ * @param limit - Maximum number of records to return
58
+ * @returns Array of DataRecords after the specified date
59
+ */
60
+ abstract getAfterDate(name: string, afterDate: Date, limit?: number): Promise<DataRecord[]>;
61
+ /**
62
+ * Get the latest record before a specific date for a given component.
63
+ * @param name - The component name
64
+ * @param beforeDate - Date to search before (exclusive)
65
+ * @returns The latest DataRecord before the date, or undefined if none found
66
+ */
67
+ abstract getLatestBefore(name: string, beforeDate: Date): Promise<DataRecord | undefined>;
68
+ /**
69
+ * Get the latest N records before a specific date for a given component.
70
+ * @param name - The component name
71
+ * @param beforeDate - Date to search before (exclusive)
72
+ * @param limit - Number of records to return
73
+ * @returns Array of the latest DataRecords before the date
74
+ */
75
+ abstract getLatestRecordsBefore(name: string, beforeDate: Date, limit: number): Promise<DataRecord[]>;
76
+ /**
77
+ * Check if any records exist after a specific date for a given component.
78
+ * @param name - The component name
79
+ * @param afterDate - Date to check after (exclusive)
80
+ * @returns True if records exist after the date, false otherwise
81
+ */
82
+ abstract hasRecordsAfterDate(name: string, afterDate: Date): Promise<boolean>;
83
+ /**
84
+ * Count records for a given component within a date range.
85
+ * @param name - The component name
86
+ * @param startDate - Start date (inclusive)
87
+ * @param endDate - End date (exclusive), optional
88
+ * @returns Number of records in the range
89
+ */
90
+ abstract countByDateRange(name: string, startDate: Date, endDate?: Date): Promise<number>;
91
+ }
92
+ //# sourceMappingURL=database_adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database_adapter.d.ts","sourceRoot":"","sources":["../../src/database/database_adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IACxB,wCAAwC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAA;IACX,uDAAuD;IACvD,IAAI,EAAE,IAAI,CAAA;IAGV,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,8BAAsB,eAAe;IAGjC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IACxD,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAEtE;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,EACf,OAAO,CAAC,EAAE,IAAI,EACd,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IAExB;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,EACf,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IAExB;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CACpB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,IAAI,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAElC;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,EAAE,CAAC;IAExB;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,CACxB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,GAChB,OAAO,CAAC,OAAO,CAAC;IAEnB;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,CACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,EACf,OAAO,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,MAAM,CAAC;CACrB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Extended abstraction for the database layer with advanced querying capabilities.
3
+ */
4
+ export class DatabaseAdapter {
5
+ }
6
+ //# sourceMappingURL=database_adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database_adapter.js","sourceRoot":"","sources":["../../src/database/database_adapter.ts"],"names":[],"mappings":"AAgCA;;GAEG;AACH,MAAM,OAAgB,eAAe;CA8FpC"}
@@ -0,0 +1,237 @@
1
+ import { Collector } from '../components/collector.js';
2
+ import { Harvester } from '../components/harvester.js';
3
+ import { Handler } from '../components/handler.js';
4
+ import { AssetsManager } from '../components/assets_manager.js';
5
+ import { StorageService } from '../storage/storage_service.js';
6
+ import { DatabaseAdapter } from '../database/database_adapter.js';
7
+ import { ConnectionOptions } from 'bullmq';
8
+ import { LogLevel } from "../utils/logger.js";
9
+ import { QueueConfig } from './queue_manager.js';
10
+ /**
11
+ * Result of component validation
12
+ */
13
+ export interface ComponentValidationResult {
14
+ /** Component name */
15
+ name: string;
16
+ /** Component type */
17
+ type: 'collector' | 'harvester' | 'handler' | 'assets_manager';
18
+ /** Validation status */
19
+ valid: boolean;
20
+ /** Validation errors if any */
21
+ errors: string[];
22
+ /** Validation warnings if any */
23
+ warnings: string[];
24
+ }
25
+ /**
26
+ * Overall validation result
27
+ */
28
+ export interface ValidationResult {
29
+ /** Overall validation status */
30
+ valid: boolean;
31
+ /** Individual component results */
32
+ components: ComponentValidationResult[];
33
+ /** Engine-level errors */
34
+ engineErrors: string[];
35
+ /** Summary statistics */
36
+ summary: {
37
+ total: number;
38
+ valid: number;
39
+ invalid: number;
40
+ warnings: number;
41
+ };
42
+ }
43
+ /**
44
+ * Configuration options for the Digital Twin Engine
45
+ *
46
+ * @interface EngineOptions
47
+ * @example
48
+ * ```typescript
49
+ * const options: EngineOptions = {
50
+ * storage: storageService,
51
+ * database: databaseAdapter,
52
+ * collectors: [myCollector],
53
+ * harvesters: [myHarvester],
54
+ * handlers: [myHandler],
55
+ * server: { port: 3000, host: 'localhost' },
56
+ * queues: {
57
+ * multiQueue: true,
58
+ * workers: { collectors: 2, harvesters: 1 }
59
+ * }
60
+ * }
61
+ * ```
62
+ */
63
+ export interface EngineOptions {
64
+ /** Array of data collectors to register with the engine */
65
+ collectors?: Collector[];
66
+ /** Array of data harvesters to register with the engine */
67
+ harvesters?: Harvester[];
68
+ /** Array of request handlers to register with the engine */
69
+ handlers?: Handler[];
70
+ /** Array of assets managers to register with the engine */
71
+ assetsManagers?: AssetsManager[];
72
+ /** Storage service instance for persisting data (required) */
73
+ storage: StorageService;
74
+ /** Database adapter instance for data operations (required) */
75
+ database: DatabaseAdapter;
76
+ /** Redis connection options for queue management */
77
+ redis?: ConnectionOptions;
78
+ /** Queue configuration options */
79
+ queues?: {
80
+ /** Enable multi-queue mode (default: true) */
81
+ multiQueue?: boolean;
82
+ /** Worker configuration for different component types */
83
+ workers?: {
84
+ /** Number of collector workers (default: 1) */
85
+ collectors?: number;
86
+ /** Number of harvester workers (default: 1) */
87
+ harvesters?: number;
88
+ };
89
+ /** Additional queue configuration options */
90
+ options?: QueueConfig['queueOptions'];
91
+ };
92
+ /** HTTP server configuration */
93
+ server?: {
94
+ /** Server port (default: 3000) */
95
+ port: number;
96
+ /** Server host (default: '0.0.0.0') */
97
+ host?: string;
98
+ };
99
+ /** Logging configuration */
100
+ logging?: {
101
+ /** Log level (default: LogLevel.INFO) */
102
+ level: LogLevel;
103
+ /** Log format (default: 'text') */
104
+ format?: 'json' | 'text';
105
+ };
106
+ /** Dry run mode - validate configuration without persisting data (default: false) */
107
+ dryRun?: boolean;
108
+ }
109
+ /**
110
+ * Digital Twin Engine - Core orchestrator for collectors, harvesters, and handlers
111
+ *
112
+ * The engine manages the lifecycle of all components, sets up queues for processing,
113
+ * exposes HTTP endpoints, and handles the overall coordination of the digital twin system.
114
+ *
115
+ * @class DigitalTwinEngine
116
+ * @example
117
+ * ```TypeScript
118
+ * import { DigitalTwinEngine } from './digital_twin_engine.js'
119
+ * import { StorageServiceFactory } from '../storage/storage_factory.js'
120
+ * import { KnexDatabaseAdapter } from '../database/adapters/knex_database_adapter.js'
121
+ *
122
+ * const storage = StorageServiceFactory.create()
123
+ * const database = new KnexDatabaseAdapter({ client: 'sqlite3', connection: ':memory:' }, storage)
124
+ *
125
+ * const engine = new DigitalTwinEngine({
126
+ * storage,
127
+ * database,
128
+ * collectors: [myCollector],
129
+ * server: { port: 3000 }
130
+ * })
131
+ *
132
+ * await engine.start()
133
+ * ```
134
+ */
135
+ export declare class DigitalTwinEngine {
136
+ #private;
137
+ /**
138
+ * Creates a new Digital Twin Engine instance
139
+ *
140
+ * @param {EngineOptions} options - Configuration options for the engine
141
+ * @throws {Error} If required options (storage, database) are missing
142
+ *
143
+ * @example
144
+ * ```TypeScript
145
+ * const engine = new DigitalTwinEngine({
146
+ * storage: myStorageService,
147
+ * database: myDatabaseAdapter,
148
+ * collectors: [collector1, collector2],
149
+ * server: { port: 4000, host: 'localhost' }
150
+ * })
151
+ * ```
152
+ */
153
+ constructor(options: EngineOptions);
154
+ /**
155
+ * Starts the Digital Twin Engine
156
+ *
157
+ * This method:
158
+ * 1. Initializes all registered components (collectors, harvesters, handlers)
159
+ * 2. Set up HTTP endpoints for component access
160
+ * 3. Configures and starts background job queues
161
+ * 4. Starts the HTTP server
162
+ * 5. Exposes queue monitoring endpoints
163
+ *
164
+ * @async
165
+ * @returns {Promise<void>}
166
+ *
167
+ * @example
168
+ * ```TypeScript
169
+ * await engine.start()
170
+ * console.log('Engine is running!')
171
+ * ```
172
+ */
173
+ start(): Promise<void>;
174
+ /**
175
+ * Get the server port
176
+ *
177
+ * @returns {number | undefined} The server port or undefined if not started
178
+ *
179
+ * @example
180
+ * ```TypeScript
181
+ * const port = engine.getPort()
182
+ * console.log(`Server running on port ${port}`)
183
+ * ```
184
+ */
185
+ getPort(): number | undefined;
186
+ /**
187
+ * Stops the Digital Twin Engine gracefully
188
+ *
189
+ * This method:
190
+ * 1. Closes HTTP server
191
+ * 2. Closes all queue connections
192
+ * 3. Stops background workers
193
+ * 4. Clean up resources
194
+ *
195
+ * @async
196
+ * @returns {Promise<void>}
197
+ *
198
+ * @example
199
+ * ```TypeScript
200
+ * await engine.stop()
201
+ * console.log('Engine stopped gracefully')
202
+ * ```
203
+ */
204
+ stop(): Promise<void>;
205
+ /**
206
+ * Validate the engine configuration and all components
207
+ *
208
+ * This method checks that all components are properly configured and can be initialized
209
+ * without actually creating tables or starting the server.
210
+ *
211
+ * @returns {Promise<ValidationResult>} Comprehensive validation results
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * const result = await engine.validateConfiguration()
216
+ * if (!result.valid) {
217
+ * console.error('Validation errors:', result.engineErrors)
218
+ * }
219
+ * ```
220
+ */
221
+ validateConfiguration(): Promise<ValidationResult>;
222
+ /**
223
+ * Test all components by running their core methods without persistence
224
+ *
225
+ * @returns {Promise<ComponentValidationResult[]>} Test results for each component
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * const results = await engine.testComponents()
230
+ * results.forEach(result => {
231
+ * console.log(`${result.name}: ${result.valid ? '✅' : '❌'}`)
232
+ * })
233
+ * ```
234
+ */
235
+ testComponents(): Promise<ComponentValidationResult[]>;
236
+ }
237
+ //# sourceMappingURL=digital_twin_engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digital_twin_engine.d.ts","sourceRoot":"","sources":["../../src/engine/digital_twin_engine.ts"],"names":[],"mappings":"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"}