From 3d1feedafbf8629d1622a50d134398b84898160b Mon Sep 17 00:00:00 2001 From: Wayne <5291640+ringoinca@users.noreply.github.com> Date: Tue, 22 Jul 2025 01:51:10 +0300 Subject: [PATCH] Continuous syncing --- docker-compose.yml | 11 + package.json | 2 +- packages/backend/package.json | 1 + .../migrations/0006_majestic_caretaker.sql | 1 + .../migrations/meta/0006_snapshot.json | 826 ++++++++++++++++++ .../database/migrations/meta/_journal.json | 7 + .../src/database/schema/ingestion-sources.ts | 1 + .../processors/continuous-sync.processor.ts | 79 +- .../processors/initial-import.processor.ts | 43 +- .../processors/process-mailbox.processor.ts | 41 +- .../schedule-continuous-sync.processor.ts | 20 + .../sync-cycle-finished.processor.ts | 32 + packages/backend/src/jobs/queues.ts | 4 +- .../src/jobs/schedulers/sync-scheduler.ts | 18 + .../src/services/EmailProviderFactory.ts | 6 +- .../backend/src/services/IndexingService.ts | 9 +- .../backend/src/services/IngestionService.ts | 29 +- .../GoogleWorkspaceConnector.ts | 125 ++- .../ingestion-connectors/ImapConnector.ts | 26 +- .../MicrosoftConnector.ts | 45 +- .../backend/src/workers/ingestion.worker.ts | 6 + .../routes/dashboard/ingestions/+page.svelte | 4 +- packages/types/src/ingestion.types.ts | 26 + packages/types/tsconfig.tsbuildinfo | 2 +- 24 files changed, 1307 insertions(+), 57 deletions(-) create mode 100644 packages/backend/src/database/migrations/0006_majestic_caretaker.sql create mode 100644 packages/backend/src/database/migrations/meta/0006_snapshot.json create mode 100644 packages/backend/src/jobs/processors/schedule-continuous-sync.processor.ts create mode 100644 packages/backend/src/jobs/processors/sync-cycle-finished.processor.ts create mode 100644 packages/backend/src/jobs/schedulers/sync-scheduler.ts diff --git a/docker-compose.yml b/docker-compose.yml index f0ee3ca..8d314a6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -46,6 +46,17 @@ services: env_file: - ./.env + sync-scheduler: + build: + context: ./packages/backend + dockerfile: Dockerfile + command: 'pnpm ts-node-dev --respawn --transpile-only src/jobs/schedulers/sync-scheduler.ts' + depends_on: + - postgres + - redis + env_file: + - ./.env + postgres: image: postgres:15 ports: diff --git a/package.json b/package.json index bcfedfb..b2a9bf7 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "scripts": { "dev": "dotenv -- pnpm --filter \"./packages/*\" --parallel dev", "build": "pnpm --filter \"./packages/*\" --parallel build", - "start:workers": "dotenv -- concurrently \"pnpm --filter @open-archiver/backend start:ingestion-worker\" \"pnpm --filter @open-archiver/backend start:indexing-worker\"" + "start:workers": "dotenv -- concurrently \"pnpm --filter @open-archiver/backend start:ingestion-worker\" \"pnpm --filter @open-archiver/backend start:indexing-worker\" \"pnpm --filter @open-archiver/backend start:sync-scheduler\"" }, "devDependencies": { "concurrently": "^9.2.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 63bf24a..a94ab50 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -10,6 +10,7 @@ "start": "node dist/index.js", "start:ingestion-worker": "ts-node-dev --respawn --transpile-only src/workers/ingestion.worker.ts", "start:indexing-worker": "ts-node-dev --respawn --transpile-only src/workers/indexing.worker.ts", + "start:sync-scheduler": "ts-node-dev --respawn --transpile-only src/jobs/schedulers/sync-scheduler.ts", "db:generate": "drizzle-kit generate --config=drizzle.config.ts", "db:push": "drizzle-kit push --config=drizzle.config.ts", "db:migrate": "ts-node-dev src/database/migrate.ts" diff --git a/packages/backend/src/database/migrations/0006_majestic_caretaker.sql b/packages/backend/src/database/migrations/0006_majestic_caretaker.sql new file mode 100644 index 0000000..6552544 --- /dev/null +++ b/packages/backend/src/database/migrations/0006_majestic_caretaker.sql @@ -0,0 +1 @@ +ALTER TABLE "ingestion_sources" ADD COLUMN "sync_state" jsonb; \ No newline at end of file diff --git a/packages/backend/src/database/migrations/meta/0006_snapshot.json b/packages/backend/src/database/migrations/meta/0006_snapshot.json new file mode 100644 index 0000000..917a769 --- /dev/null +++ b/packages/backend/src/database/migrations/meta/0006_snapshot.json @@ -0,0 +1,826 @@ +{ + "id": "bdc9d789-04c7-4d9f-b4ed-00366b0d3603", + "prevId": "4fa75649-1e65-4c61-8cc5-95add8269925", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.archived_emails": { + "name": "archived_emails", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "ingestion_source_id": { + "name": "ingestion_source_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "message_id_header": { + "name": "message_id_header", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sent_at": { + "name": "sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_name": { + "name": "sender_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_email": { + "name": "sender_email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "recipients": { + "name": "recipients", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_hash_sha256": { + "name": "storage_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "is_indexed": { + "name": "is_indexed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "has_attachments": { + "name": "has_attachments", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_on_legal_hold": { + "name": "is_on_legal_hold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "archived_emails_ingestion_source_id_ingestion_sources_id_fk": { + "name": "archived_emails_ingestion_source_id_ingestion_sources_id_fk", + "tableFrom": "archived_emails", + "tableTo": "ingestion_sources", + "columnsFrom": [ + "ingestion_source_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.attachments": { + "name": "attachments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "mime_type": { + "name": "mime_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "content_hash_sha256": { + "name": "content_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "attachments_content_hash_sha256_unique": { + "name": "attachments_content_hash_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "content_hash_sha256" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email_attachments": { + "name": "email_attachments", + "schema": "", + "columns": { + "email_id": { + "name": "email_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "attachment_id": { + "name": "attachment_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "email_attachments_email_id_archived_emails_id_fk": { + "name": "email_attachments_email_id_archived_emails_id_fk", + "tableFrom": "email_attachments", + "tableTo": "archived_emails", + "columnsFrom": [ + "email_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "email_attachments_attachment_id_attachments_id_fk": { + "name": "email_attachments_attachment_id_attachments_id_fk", + "tableFrom": "email_attachments", + "tableTo": "attachments", + "columnsFrom": [ + "attachment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "email_attachments_email_id_attachment_id_pk": { + "name": "email_attachments_email_id_attachment_id_pk", + "columns": [ + "email_id", + "attachment_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigserial", + "primaryKey": true, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "actor_identifier": { + "name": "actor_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "is_tamper_evident": { + "name": "is_tamper_evident", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ediscovery_cases": { + "name": "ediscovery_cases", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ediscovery_cases_name_unique": { + "name": "ediscovery_cases_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.export_jobs": { + "name": "export_jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "query": { + "name": "query", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "export_jobs_case_id_ediscovery_cases_id_fk": { + "name": "export_jobs_case_id_ediscovery_cases_id_fk", + "tableFrom": "export_jobs", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.legal_holds": { + "name": "legal_holds", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "custodian_id": { + "name": "custodian_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hold_criteria": { + "name": "hold_criteria", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applied_by_identifier": { + "name": "applied_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applied_at": { + "name": "applied_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "removed_at": { + "name": "removed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "legal_holds_case_id_ediscovery_cases_id_fk": { + "name": "legal_holds_case_id_ediscovery_cases_id_fk", + "tableFrom": "legal_holds", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "legal_holds_custodian_id_custodians_id_fk": { + "name": "legal_holds_custodian_id_custodians_id_fk", + "tableFrom": "legal_holds", + "tableTo": "custodians", + "columnsFrom": [ + "custodian_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.retention_policies": { + "name": "retention_policies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "retention_period_days": { + "name": "retention_period_days", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "action_on_expiry": { + "name": "action_on_expiry", + "type": "retention_action", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "conditions": { + "name": "conditions", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "retention_policies_name_unique": { + "name": "retention_policies_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custodians": { + "name": "custodians", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_type": { + "name": "source_type", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "custodians_email_unique": { + "name": "custodians_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ingestion_sources": { + "name": "ingestion_sources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "credentials": { + "name": "credentials", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "ingestion_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending_auth'" + }, + "last_sync_started_at": { + "name": "last_sync_started_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_finished_at": { + "name": "last_sync_finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_status_message": { + "name": "last_sync_status_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sync_state": { + "name": "sync_state", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.retention_action": { + "name": "retention_action", + "schema": "public", + "values": [ + "delete_permanently", + "notify_admin" + ] + }, + "public.ingestion_provider": { + "name": "ingestion_provider", + "schema": "public", + "values": [ + "google_workspace", + "microsoft_365", + "generic_imap" + ] + }, + "public.ingestion_status": { + "name": "ingestion_status", + "schema": "public", + "values": [ + "active", + "paused", + "error", + "pending_auth", + "syncing", + "importing", + "auth_success" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/backend/src/database/migrations/meta/_journal.json b/packages/backend/src/database/migrations/meta/_journal.json index d800432..4c82e86 100644 --- a/packages/backend/src/database/migrations/meta/_journal.json +++ b/packages/backend/src/database/migrations/meta/_journal.json @@ -43,6 +43,13 @@ "when": 1752606327253, "tag": "0005_chunky_sue_storm", "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1753112018514, + "tag": "0006_majestic_caretaker", + "breakpoints": true } ] } \ No newline at end of file diff --git a/packages/backend/src/database/schema/ingestion-sources.ts b/packages/backend/src/database/schema/ingestion-sources.ts index b5d789d..4127dba 100644 --- a/packages/backend/src/database/schema/ingestion-sources.ts +++ b/packages/backend/src/database/schema/ingestion-sources.ts @@ -25,6 +25,7 @@ export const ingestionSources = pgTable('ingestion_sources', { lastSyncStartedAt: timestamp('last_sync_started_at', { withTimezone: true }), lastSyncFinishedAt: timestamp('last_sync_finished_at', { withTimezone: true }), lastSyncStatusMessage: text('last_sync_status_message'), + syncState: jsonb('sync_state'), createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow() }); diff --git a/packages/backend/src/jobs/processors/continuous-sync.processor.ts b/packages/backend/src/jobs/processors/continuous-sync.processor.ts index 910a10f..01a9013 100644 --- a/packages/backend/src/jobs/processors/continuous-sync.processor.ts +++ b/packages/backend/src/jobs/processors/continuous-sync.processor.ts @@ -1,11 +1,78 @@ import { Job } from 'bullmq'; import { IngestionService } from '../../services/IngestionService'; -import { IInitialImportJob } from '@open-archiver/types'; +import { IContinuousSyncJob } from '@open-archiver/types'; +import { EmailProviderFactory } from '../../services/EmailProviderFactory'; +import { flowProducer } from '../queues'; +import { logger } from '../../config/logger'; -const ingestionService = new IngestionService(); +export default async (job: Job) => { + const { ingestionSourceId } = job.data; + logger.info({ ingestionSourceId }, 'Starting continuous sync job.'); -export default async (job: Job) => { - console.log(`Processing continuous sync for ingestion source: ${job.data.ingestionSourceId}`); - // This would be similar to performBulkImport, but would likely use the `since` parameter. - // For now, we'll just log a message. + const source = await IngestionService.findById(ingestionSourceId); + if (!source || source.status !== 'active') { + logger.warn({ ingestionSourceId, status: source?.status }, 'Skipping continuous sync for non-active source.'); + return; + } + + await IngestionService.update(ingestionSourceId, { + status: 'syncing', + lastSyncStartedAt: new Date(), + }); + + const connector = EmailProviderFactory.createConnector(source); + + try { + const jobs = []; + if (!connector.listAllUsers) { + // This is for single-mailbox providers like Generic IMAP + jobs.push({ + name: 'process-mailbox', + queueName: 'ingestion', + data: { + ingestionSourceId: source.id, + userEmail: 'default' // A placeholder, as it's not needed for IMAP + } + }); + } else { + // For multi-mailbox providers like Google Workspace and M365 + for await (const user of connector.listAllUsers()) { + if (user.primaryEmail) { + jobs.push({ + name: 'process-mailbox', + queueName: 'ingestion', + data: { + ingestionSourceId: source.id, + userEmail: user.primaryEmail, + } + }); + } + } + } + + if (jobs.length > 0) { + await flowProducer.add({ + name: 'sync-cycle-finished', + queueName: 'ingestion', + data: { + ingestionSourceId, + isInitialImport: false + }, + children: jobs + }); + } + + // The status will be set back to 'active' by the 'sync-cycle-finished' job + // once all the mailboxes have been processed. + logger.info({ ingestionSourceId }, 'Continuous sync job finished dispatching mailbox jobs.'); + + } catch (error) { + logger.error({ err: error, ingestionSourceId }, 'Continuous sync job failed.'); + await IngestionService.update(ingestionSourceId, { + status: 'error', + lastSyncFinishedAt: new Date(), + lastSyncStatusMessage: error instanceof Error ? error.message : 'An unknown error occurred during sync.', + }); + throw error; + } }; diff --git a/packages/backend/src/jobs/processors/initial-import.processor.ts b/packages/backend/src/jobs/processors/initial-import.processor.ts index f294a00..6b7e521 100644 --- a/packages/backend/src/jobs/processors/initial-import.processor.ts +++ b/packages/backend/src/jobs/processors/initial-import.processor.ts @@ -3,7 +3,7 @@ import { IngestionService } from '../../services/IngestionService'; import { IInitialImportJob } from '@open-archiver/types'; import { EmailProviderFactory } from '../../services/EmailProviderFactory'; import { GoogleWorkspaceConnector } from '../../services/ingestion-connectors/GoogleWorkspaceConnector'; -import { ingestionQueue } from '../queues'; +import { flowProducer, ingestionQueue } from '../queues'; import { logger } from '../../config/logger'; export default async (job: Job) => { @@ -16,20 +16,49 @@ export default async (job: Job) => { throw new Error(`Ingestion source with ID ${ingestionSourceId} not found`); } + await IngestionService.update(ingestionSourceId, { + status: 'importing', + lastSyncStatusMessage: 'Starting initial import...' + }); + const connector = EmailProviderFactory.createConnector(source); if (connector instanceof GoogleWorkspaceConnector) { + const jobs = []; let userCount = 0; for await (const user of connector.listAllUsers()) { if (user.primaryEmail) { - await ingestionQueue.add('process-mailbox', { - ingestionSourceId, - userEmail: user.primaryEmail + jobs.push({ + name: 'process-mailbox', + queueName: 'ingestion', + data: { + ingestionSourceId, + userEmail: user.primaryEmail + } }); userCount++; } } - logger.info({ ingestionSourceId, userCount }, `Enqueued mailbox processing jobs for all users`); + + if (jobs.length > 0) { + await flowProducer.add({ + name: 'sync-cycle-finished', + queueName: 'ingestion', + data: { + ingestionSourceId, + userCount, + isInitialImport: true + }, + children: jobs + }); + } else { + // If there are no users, we can consider the import finished and set to active + await IngestionService.update(ingestionSourceId, { + status: 'active', + lastSyncFinishedAt: new Date(), + lastSyncStatusMessage: 'Initial import complete. No users found.' + }); + } } else { // For other providers, we might trigger a simpler bulk import directly await new IngestionService().performBulkImport(job.data); @@ -38,6 +67,10 @@ export default async (job: Job) => { logger.info({ ingestionSourceId }, 'Finished initial import master job'); } catch (error) { logger.error({ err: error, ingestionSourceId }, 'Error in initial import master job'); + await IngestionService.update(ingestionSourceId, { + status: 'error', + lastSyncStatusMessage: `Initial import failed: ${error instanceof Error ? error.message : 'Unknown error'}` + }); throw error; } }; diff --git a/packages/backend/src/jobs/processors/process-mailbox.processor.ts b/packages/backend/src/jobs/processors/process-mailbox.processor.ts index 901bb59..06dfeeb 100644 --- a/packages/backend/src/jobs/processors/process-mailbox.processor.ts +++ b/packages/backend/src/jobs/processors/process-mailbox.processor.ts @@ -5,6 +5,11 @@ import { logger } from '../../config/logger'; import { EmailProviderFactory } from '../../services/EmailProviderFactory'; import { StorageService } from '../../services/StorageService'; +import { IngestionSource, SyncState } from '@open-archiver/types'; +import { db } from '../../database'; +import { ingestionSources } from '../../database/schema'; +import { eq } from 'drizzle-orm'; + export const processMailboxProcessor = async (job: Job) => { const { ingestionSourceId, userEmail } = job.data; @@ -20,9 +25,43 @@ export const processMailboxProcessor = async (job: Job 0) { + const currentSource = (await db + .select({ syncState: ingestionSources.syncState }) + .from(ingestionSources) + .where(eq(ingestionSources.id, ingestionSourceId))) as IngestionSource[]; + + const currentSyncState = currentSource[0]?.syncState || {}; + + const mergedSyncState: SyncState = { ...currentSyncState }; + + if (newSyncState.google) { + mergedSyncState.google = { ...mergedSyncState.google, ...newSyncState.google }; + } + if (newSyncState.microsoft) { + mergedSyncState.microsoft = { ...mergedSyncState.microsoft, ...newSyncState.microsoft }; + } + if (newSyncState.imap) { + mergedSyncState.imap = newSyncState.imap; + } + + await db + .update(ingestionSources) + .set({ + syncState: mergedSyncState, + updatedAt: new Date() + }) + .where(eq(ingestionSources.id, ingestionSourceId)); + } + logger.info({ ingestionSourceId, userEmail }, `Finished processing mailbox for user`); } catch (error) { logger.error({ err: error, ingestionSourceId, userEmail }, 'Error processing mailbox'); diff --git a/packages/backend/src/jobs/processors/schedule-continuous-sync.processor.ts b/packages/backend/src/jobs/processors/schedule-continuous-sync.processor.ts new file mode 100644 index 0000000..b1aff0c --- /dev/null +++ b/packages/backend/src/jobs/processors/schedule-continuous-sync.processor.ts @@ -0,0 +1,20 @@ +import { Job } from 'bullmq'; +import { db } from '../../database'; +import { ingestionSources } from '../../database/schema'; +import { eq } from 'drizzle-orm'; +import { ingestionQueue } from '../queues'; + +export default async (job: Job) => { + console.log( + 'Scheduler running: Looking for active ingestion sources to sync.' + ); + const activeSources = await db + .select({ id: ingestionSources.id }) + .from(ingestionSources) + .where(eq(ingestionSources.status, 'active')); + + for (const source of activeSources) { + // The status field on the ingestion source is used to prevent duplicate syncs. + await ingestionQueue.add('continuous-sync', { ingestionSourceId: source.id }); + } +}; diff --git a/packages/backend/src/jobs/processors/sync-cycle-finished.processor.ts b/packages/backend/src/jobs/processors/sync-cycle-finished.processor.ts new file mode 100644 index 0000000..e11a90d --- /dev/null +++ b/packages/backend/src/jobs/processors/sync-cycle-finished.processor.ts @@ -0,0 +1,32 @@ +import { Job } from 'bullmq'; +import { IngestionService } from '../../services/IngestionService'; +import { logger } from '../../config/logger'; + +interface ISyncCycleFinishedJob { + ingestionSourceId: string; + userCount?: number; // Optional, as it's only relevant for the initial import + isInitialImport: boolean; +} + +export default async (job: Job) => { + const { ingestionSourceId, userCount, isInitialImport } = job.data; + logger.info({ ingestionSourceId }, 'Sync cycle finished, updating status to active.'); + + try { + let message = 'Continuous sync cycle finished successfully.'; + if (isInitialImport) { + message = `Initial import finished for ${userCount} mailboxes.`; + } + + await IngestionService.update(ingestionSourceId, { + status: 'active', + lastSyncFinishedAt: new Date(), + lastSyncStatusMessage: message + }); + logger.info({ ingestionSourceId }, 'Successfully updated status to active.'); + } catch (error) { + logger.error({ err: error, ingestionSourceId }, 'Failed to update status to active after sync cycle.'); + // Even if this fails, we don't want to fail the job itself, + // as the import is technically complete. An admin might need to intervene. + } +}; diff --git a/packages/backend/src/jobs/queues.ts b/packages/backend/src/jobs/queues.ts index 5447ba2..1e03c80 100644 --- a/packages/backend/src/jobs/queues.ts +++ b/packages/backend/src/jobs/queues.ts @@ -1,6 +1,8 @@ -import { Queue } from 'bullmq'; +import { Queue, FlowProducer } from 'bullmq'; import { connection } from '../config/redis'; +export const flowProducer = new FlowProducer({ connection }); + // Default job options const defaultJobOptions = { attempts: 5, diff --git a/packages/backend/src/jobs/schedulers/sync-scheduler.ts b/packages/backend/src/jobs/schedulers/sync-scheduler.ts new file mode 100644 index 0000000..7bd5733 --- /dev/null +++ b/packages/backend/src/jobs/schedulers/sync-scheduler.ts @@ -0,0 +1,18 @@ +import { ingestionQueue } from '../queues'; + +const scheduleContinuousSync = async () => { + // This job will run every 15 minutes + await ingestionQueue.add( + 'schedule-continuous-sync', + {}, + { + repeat: { + pattern: '* * * * *', // Every 15 minutes + }, + } + ); +}; + +scheduleContinuousSync().then(() => { + console.log('Continuous sync scheduler started.'); +}); diff --git a/packages/backend/src/services/EmailProviderFactory.ts b/packages/backend/src/services/EmailProviderFactory.ts index 783cf40..c1645f6 100644 --- a/packages/backend/src/services/EmailProviderFactory.ts +++ b/packages/backend/src/services/EmailProviderFactory.ts @@ -3,7 +3,8 @@ import type { GoogleWorkspaceCredentials, Microsoft365Credentials, GenericImapCredentials, - EmailObject + EmailObject, + SyncState } from '@open-archiver/types'; import { GoogleWorkspaceConnector } from './ingestion-connectors/GoogleWorkspaceConnector'; import { MicrosoftConnector } from './ingestion-connectors/MicrosoftConnector'; @@ -12,7 +13,8 @@ import { ImapConnector } from './ingestion-connectors/ImapConnector'; // Define a common interface for all connectors export interface IEmailConnector { testConnection(): Promise; - fetchEmails(userEmail?: string, since?: Date): AsyncGenerator; + fetchEmails(userEmail: string, syncState?: SyncState | null): AsyncGenerator; + getUpdatedSyncState(userEmail?: string): SyncState; listAllUsers?(): AsyncGenerator; } diff --git a/packages/backend/src/services/IndexingService.ts b/packages/backend/src/services/IndexingService.ts index 84ca48f..3bba91e 100644 --- a/packages/backend/src/services/IndexingService.ts +++ b/packages/backend/src/services/IndexingService.ts @@ -73,7 +73,7 @@ export class IndexingService { /** * Indexes an email object directly, creates a search document, and indexes it. */ - public async indexByEmail(email: EmailObject, ingestionSourceId: string): Promise { + public async indexByEmail(email: EmailObject, ingestionSourceId: string, archivedEmailId: string): Promise { const attachments: AttachmentsType = []; if (email.attachments && email.attachments.length > 0) { for (const attachment of email.attachments) { @@ -84,7 +84,7 @@ export class IndexingService { }); } } - const document = await this.createEmailDocumentFromRaw(email, attachments, ingestionSourceId); + const document = await this.createEmailDocumentFromRaw(email, attachments, ingestionSourceId, archivedEmailId); await this.searchService.addDocuments('emails', [document], 'id'); } @@ -94,7 +94,8 @@ export class IndexingService { private async createEmailDocumentFromRaw( email: EmailObject, attachments: AttachmentsType, - ingestionSourceId: string + ingestionSourceId: string, + archivedEmailId: string ): Promise { const extractedAttachments = []; for (const attachment of attachments) { @@ -116,7 +117,7 @@ export class IndexingService { } } return { - id: email.id, + id: archivedEmailId, from: email.from[0]?.address, to: email.to.map((i) => i.address) || [], cc: email.cc?.map((i) => i.address) || [], diff --git a/packages/backend/src/services/IngestionService.ts b/packages/backend/src/services/IngestionService.ts index 6ba84bd..643493a 100644 --- a/packages/backend/src/services/IngestionService.ts +++ b/packages/backend/src/services/IngestionService.ts @@ -25,7 +25,7 @@ export class IngestionService { const decryptedCredentials = CryptoService.decryptObject( source.credentials as string ); - return { ...source, credentials: decryptedCredentials }; + return { ...source, credentials: decryptedCredentials } as IngestionSource; } public static async create(dto: CreateIngestionSourceDto): Promise { @@ -139,19 +139,34 @@ export class IngestionService { }); const connector = EmailProviderFactory.createConnector(source); - const storage = new StorageService(); try { - for await (const email of connector.fetchEmails()) { - await this.processEmail(email, source, storage); + if (connector.listAllUsers) { + // For multi-mailbox providers, dispatch a job for each user + for await (const user of connector.listAllUsers()) { + const userEmail = (user as any).primaryEmail; + if (userEmail) { + await ingestionQueue.add('process-mailbox', { + ingestionSourceId: source.id, + userEmail: userEmail, + }); + } + } + } else { + // For single-mailbox providers, dispatch a single job + await ingestionQueue.add('process-mailbox', { + ingestionSourceId: source.id, + userEmail: 'default' // Placeholder, as it's not needed for IMAP + }); } + await IngestionService.update(ingestionSourceId, { status: 'active', lastSyncFinishedAt: new Date(), - lastSyncStatusMessage: 'Successfully completed bulk import.' + lastSyncStatusMessage: 'Successfully initiated bulk import for all mailboxes.' }); - console.log(`Bulk import finished for source: ${source.name} (${source.id})`); + console.log(`Bulk import job dispatch finished for source: ${source.name} (${source.id})`); } catch (error) { console.error(`Bulk import failed for source: ${source.name} (${source.id})`, error); await IngestionService.update(ingestionSourceId, { @@ -236,7 +251,7 @@ export class IngestionService { const storageService = new StorageService(); const databaseService = new DatabaseService(); const indexingService = new IndexingService(databaseService, searchService, storageService); - await indexingService.indexByEmail(email, source.id); + await indexingService.indexByEmail(email, source.id, archivedEmail.id); } catch (error) { logger.error({ message: `Failed to process email ${email.id} for source ${source.id}`, diff --git a/packages/backend/src/services/ingestion-connectors/GoogleWorkspaceConnector.ts b/packages/backend/src/services/ingestion-connectors/GoogleWorkspaceConnector.ts index a6a2221..1b2df66 100644 --- a/packages/backend/src/services/ingestion-connectors/GoogleWorkspaceConnector.ts +++ b/packages/backend/src/services/ingestion-connectors/GoogleWorkspaceConnector.ts @@ -3,7 +3,8 @@ import type { admin_directory_v1, gmail_v1, Common } from 'googleapis'; import type { GoogleWorkspaceCredentials, EmailObject, - EmailAddress + EmailAddress, + SyncState } from '@open-archiver/types'; import type { IEmailConnector } from '../EmailProviderFactory'; import { logger } from '../../config/logger'; @@ -16,6 +17,7 @@ import { simpleParser, ParsedMail, Attachment, AddressObject } from 'mailparser' export class GoogleWorkspaceConnector implements IEmailConnector { private credentials: GoogleWorkspaceCredentials; private serviceAccountCreds: { client_email: string; private_key: string; }; + private newHistoryId: string | undefined; constructor(credentials: GoogleWorkspaceCredentials) { this.credentials = credentials; @@ -113,32 +115,105 @@ export class GoogleWorkspaceConnector implements IEmailConnector { } /** - * Fetches emails for a single user, starting from a specific point in time. + * Fetches emails for a single user, starting from a specific history ID. * This is ideal for continuous synchronization jobs. * @param userEmail The email of the user whose mailbox will be read. - * @param since Optional date to fetch emails newer than this timestamp. + * @param syncState Optional state containing the startHistoryId. * @returns An async generator that yields each raw email object. */ public async *fetchEmails( userEmail: string, - since?: Date + syncState?: SyncState | null ): AsyncGenerator { const authClient = this.getAuthClient(userEmail, [ 'https://www.googleapis.com/auth/gmail.readonly' ]); - const gmail = google.gmail({ version: 'v1', auth: authClient }); let pageToken: string | undefined = undefined; - const query = since ? `after:${Math.floor(since.getTime() / 1000)}` : ''; + const startHistoryId = syncState?.google?.[userEmail]?.historyId; + + // If no sync state is provided for this user, this is an initial import. Get all messages. + if (!startHistoryId) { + yield* this.fetchAllMessagesForUser(gmail, userEmail); + return; + } + + this.newHistoryId = startHistoryId; do { - const listResponse: Common.GaxiosResponseWithHTTP2 = - await gmail.users.messages.list({ - userId: 'me', // 'me' refers to the impersonated user - q: query, - pageToken: pageToken - }); + const historyResponse: Common.GaxiosResponseWithHTTP2 = await gmail.users.history.list({ + userId: 'me', + startHistoryId: this.newHistoryId, + pageToken: pageToken, + historyTypes: ['messageAdded'] + }); + + const histories = historyResponse.data.history; + if (!histories || histories.length === 0) { + return; + } + + for (const historyRecord of histories) { + if (historyRecord.messagesAdded) { + for (const messageAdded of historyRecord.messagesAdded) { + if (messageAdded.message?.id) { + const msgResponse = await gmail.users.messages.get({ + userId: 'me', + id: messageAdded.message.id, + format: 'RAW' + }); + + if (msgResponse.data.raw) { + const rawEmail = Buffer.from(msgResponse.data.raw, 'base64url'); + const parsedEmail: ParsedMail = await simpleParser(rawEmail); + const attachments = parsedEmail.attachments.map((attachment: Attachment) => ({ + filename: attachment.filename || 'untitled', + contentType: attachment.contentType, + size: attachment.size, + content: attachment.content as Buffer + })); + const mapAddresses = (addresses: AddressObject | AddressObject[] | undefined): EmailAddress[] => { + if (!addresses) return []; + const addressArray = Array.isArray(addresses) ? addresses : [addresses]; + return addressArray.flatMap(a => a.value.map(v => ({ name: v.name, address: v.address || '' }))); + }; + yield { + id: msgResponse.data.id!, + userEmail: userEmail, + eml: rawEmail, + from: mapAddresses(parsedEmail.from), + to: mapAddresses(parsedEmail.to), + cc: mapAddresses(parsedEmail.cc), + bcc: mapAddresses(parsedEmail.bcc), + subject: parsedEmail.subject || '', + body: parsedEmail.text || '', + html: parsedEmail.html || '', + headers: parsedEmail.headers as any, + attachments, + receivedAt: parsedEmail.date || new Date(), + }; + } + } + } + } + } + + pageToken = historyResponse.data.nextPageToken ?? undefined; + if (historyResponse.data.historyId) { + this.newHistoryId = historyResponse.data.historyId; + } + + } while (pageToken); + } + + private async *fetchAllMessagesForUser(gmail: gmail_v1.Gmail, userEmail: string): AsyncGenerator { + let pageToken: string | undefined = undefined; + do { + const listResponse: Common.GaxiosResponseWithHTTP2 = await gmail.users.messages.list({ + userId: 'me', + pageToken: pageToken + }); const messages = listResponse.data.messages; if (!messages || messages.length === 0) { @@ -150,27 +225,23 @@ export class GoogleWorkspaceConnector implements IEmailConnector { const msgResponse = await gmail.users.messages.get({ userId: 'me', id: message.id, - format: 'RAW' // We want the full, raw .eml content + format: 'RAW' }); if (msgResponse.data.raw) { - // The raw data is base64url encoded, so we need to decode it. const rawEmail = Buffer.from(msgResponse.data.raw, 'base64url'); const parsedEmail: ParsedMail = await simpleParser(rawEmail); - const attachments = parsedEmail.attachments.map((attachment: Attachment) => ({ filename: attachment.filename || 'untitled', contentType: attachment.contentType, size: attachment.size, content: attachment.content as Buffer })); - const mapAddresses = (addresses: AddressObject | AddressObject[] | undefined): EmailAddress[] => { if (!addresses) return []; const addressArray = Array.isArray(addresses) ? addresses : [addresses]; return addressArray.flatMap(a => a.value.map(v => ({ name: v.name, address: v.address || '' }))); }; - yield { id: msgResponse.data.id!, userEmail: userEmail, @@ -189,8 +260,26 @@ export class GoogleWorkspaceConnector implements IEmailConnector { } } } - pageToken = listResponse.data.nextPageToken ?? undefined; } while (pageToken); + + // After fetching all messages, get the latest history ID to use as the starting point for the next sync. + const profileResponse = await gmail.users.getProfile({ userId: 'me' }); + if (profileResponse.data.historyId) { + this.newHistoryId = profileResponse.data.historyId; + } + } + + public getUpdatedSyncState(userEmail: string): SyncState { + if (!this.newHistoryId) { + return {}; + } + return { + google: { + [userEmail]: { + historyId: this.newHistoryId + } + } + }; } } diff --git a/packages/backend/src/services/ingestion-connectors/ImapConnector.ts b/packages/backend/src/services/ingestion-connectors/ImapConnector.ts index 4b64808..05cc52f 100644 --- a/packages/backend/src/services/ingestion-connectors/ImapConnector.ts +++ b/packages/backend/src/services/ingestion-connectors/ImapConnector.ts @@ -1,10 +1,11 @@ -import type { GenericImapCredentials, EmailObject, EmailAddress } from '@open-archiver/types'; +import type { GenericImapCredentials, EmailObject, EmailAddress, SyncState } from '@open-archiver/types'; import type { IEmailConnector } from '../EmailProviderFactory'; import { ImapFlow } from 'imapflow'; import { simpleParser, ParsedMail, Attachment, AddressObject } from 'mailparser'; export class ImapConnector implements IEmailConnector { private client: ImapFlow; + private newMaxUid: number = 0; constructor(private credentials: GenericImapCredentials) { this.client = new ImapFlow({ @@ -30,14 +31,23 @@ export class ImapConnector implements IEmailConnector { } } - public async *fetchEmails(userEmail?: string, since?: Date): AsyncGenerator { + public async *fetchEmails(userEmail: string, syncState?: SyncState | null): AsyncGenerator { await this.client.connect(); try { await this.client.mailboxOpen('INBOX'); - const searchCriteria = since ? { since } : { all: true }; + const lastUid = syncState?.imap?.maxUid; + this.newMaxUid = lastUid || 0; + + // If lastUid exists, fetch all emails with a UID greater than it. + // Otherwise, fetch all emails. + const searchCriteria = lastUid ? { uid: `${lastUid + 1}:*` } : { all: true }; + + for await (const msg of this.client.fetch(searchCriteria, { envelope: true, source: true, bodyStructure: true, uid: true })) { + if (msg.uid > this.newMaxUid) { + this.newMaxUid = msg.uid; + } - for await (const msg of this.client.fetch(searchCriteria, { envelope: true, source: true, bodyStructure: true })) { if (msg.envelope && msg.source) { const parsedEmail: ParsedMail = await simpleParser(msg.source); const attachments = parsedEmail.attachments.map((attachment: Attachment) => ({ @@ -73,4 +83,12 @@ export class ImapConnector implements IEmailConnector { await this.client.logout(); } } + + public getUpdatedSyncState(): SyncState { + return { + imap: { + maxUid: this.newMaxUid + } + }; + } } diff --git a/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts b/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts index e57c310..8a6c015 100644 --- a/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts +++ b/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts @@ -1,4 +1,4 @@ -import type { Microsoft365Credentials, EmailObject, EmailAddress } from '@open-archiver/types'; +import type { Microsoft365Credentials, EmailObject, EmailAddress, SyncState } from '@open-archiver/types'; import type { IEmailConnector } from '../EmailProviderFactory'; import { ConfidentialClientApplication } from '@azure/msal-node'; import { simpleParser, ParsedMail, Attachment, AddressObject } from 'mailparser'; @@ -8,6 +8,7 @@ const GRAPH_API_ENDPOINT = 'https://graph.microsoft.com/v1.0'; export class MicrosoftConnector implements IEmailConnector { private cca: ConfidentialClientApplication; + private newDeltaToken: string | undefined; constructor(private credentials: Microsoft365Credentials) { this.cca = new ConfidentialClientApplication({ @@ -38,23 +39,42 @@ export class MicrosoftConnector implements IEmailConnector { } } - public async *fetchEmails(userEmail?: string, since?: Date): AsyncGenerator { + public async *fetchEmails(userEmail: string, syncState?: SyncState | null): AsyncGenerator { const accessToken = await this.getAccessToken(); const headers = { Authorization: `Bearer ${accessToken}` }; - let nextLink: string | undefined = `${GRAPH_API_ENDPOINT}/users/me/messages`; - if (since) { - nextLink += `?$filter=receivedDateTime ge ${since.toISOString()}`; + let nextLink: string | undefined; + + const deltaToken = syncState?.microsoft?.[userEmail]?.deltaToken; + + if (deltaToken) { + nextLink = `${GRAPH_API_ENDPOINT}/me/mailFolders/allmail/messages/delta?$deltaToken=${deltaToken}`; + } else { + nextLink = `${GRAPH_API_ENDPOINT}/me/mailFolders/allmail/messages/delta`; } + while (nextLink) { - const res: { data: { value: any[]; '@odata.nextLink'?: string; }; } = await axios.get( + const res: { data: { value: any[]; '@odata.nextLink'?: string; '@odata.deltaLink'?: string; }; } = await axios.get( nextLink, { headers } ); const messages = res.data.value; + const deltaLink = res.data['@odata.deltaLink']; + if (deltaLink) { + const deltaToken = new URL(deltaLink).searchParams.get('$deltatoken'); + if (deltaToken) { + this.newDeltaToken = deltaToken; + } + } + + for (const message of messages) { + // Skip if the message is deleted + if (message['@removed']) { + continue; + } const rawContentRes = await axios.get( `${GRAPH_API_ENDPOINT}/users/me/messages/${message.id}/$value`, { headers } @@ -96,4 +116,17 @@ export class MicrosoftConnector implements IEmailConnector { nextLink = res.data['@odata.nextLink']; } } + + public getUpdatedSyncState(userEmail: string): SyncState { + if (!this.newDeltaToken) { + return {}; + } + return { + microsoft: { + [userEmail]: { + deltaToken: this.newDeltaToken + } + } + }; + } } diff --git a/packages/backend/src/workers/ingestion.worker.ts b/packages/backend/src/workers/ingestion.worker.ts index ffa6bfd..c9f0509 100644 --- a/packages/backend/src/workers/ingestion.worker.ts +++ b/packages/backend/src/workers/ingestion.worker.ts @@ -2,14 +2,20 @@ import { Worker } from 'bullmq'; import { connection } from '../config/redis'; import initialImportProcessor from '../jobs/processors/initial-import.processor'; import continuousSyncProcessor from '../jobs/processors/continuous-sync.processor'; +import scheduleContinuousSyncProcessor from '../jobs/processors/schedule-continuous-sync.processor'; import { processMailboxProcessor } from '../jobs/processors/process-mailbox.processor'; +import syncCycleFinishedProcessor from '../jobs/processors/sync-cycle-finished.processor'; const processor = async (job: any) => { switch (job.name) { case 'initial-import': return initialImportProcessor(job); + case 'sync-cycle-finished': + return syncCycleFinishedProcessor(job); case 'continuous-sync': return continuousSyncProcessor(job); + case 'schedule-continuous-sync': + return scheduleContinuousSyncProcessor(job); case 'process-mailbox': return processMailboxProcessor(job); default: diff --git a/packages/frontend/src/routes/dashboard/ingestions/+page.svelte b/packages/frontend/src/routes/dashboard/ingestions/+page.svelte index 34ac607..3bb66bf 100644 --- a/packages/frontend/src/routes/dashboard/ingestions/+page.svelte +++ b/packages/frontend/src/routes/dashboard/ingestions/+page.svelte @@ -89,7 +89,9 @@ {#if ingestionSources.length > 0} {#each ingestionSources as source (source.id)} - {source.name} + + {source.name} + {source.provider} {source.status} {new Date(source.createdAt).toLocaleDateString()} diff --git a/packages/types/src/ingestion.types.ts b/packages/types/src/ingestion.types.ts index e6872b8..d20685f 100644 --- a/packages/types/src/ingestion.types.ts +++ b/packages/types/src/ingestion.types.ts @@ -1,3 +1,20 @@ +export type SyncState = { + google?: { + [userEmail: string]: { + historyId: string; + }; + }; + microsoft?: { + [userEmail: string]: { + deltaToken: string; + }; + }; + imap?: { + maxUid: number; + }; + lastSyncTimestamp?: string; +}; + export type IngestionProvider = 'google_workspace' | 'microsoft_365' | 'generic_imap'; export type IngestionStatus = @@ -51,6 +68,10 @@ export interface IngestionSource { createdAt: Date; updatedAt: Date; credentials: IngestionCredentials; + lastSyncStartedAt?: Date | null; + lastSyncFinishedAt?: Date | null; + lastSyncStatusMessage?: string | null; + syncState?: SyncState | null; } export interface CreateIngestionSourceDto { @@ -67,6 +88,11 @@ export interface UpdateIngestionSourceDto { lastSyncStartedAt?: Date; lastSyncFinishedAt?: Date; lastSyncStatusMessage?: string; + syncState?: SyncState; +} + +export interface IContinuousSyncJob { + ingestionSourceId: string; } export interface IInitialImportJob { diff --git a/packages/types/tsconfig.tsbuildinfo b/packages/types/tsconfig.tsbuildinfo index f479fb6..e49ddbc 100644 --- a/packages/types/tsconfig.tsbuildinfo +++ b/packages/types/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.full.d.ts","./src/archived-emails.types.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/types.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/export.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/import.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/index.d.ts","./src/user.types.ts","./src/auth.types.ts","./src/email.types.ts","./src/ingestion.types.ts","./src/storage.types.ts","./src/search.types.ts","./src/index.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@5.6.0/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/index.d.ts"],"fileIdsList":[[126,168,171],[126,170,171],[171],[126,171,176,206],[126,171,172,177,183,184,191,203,214],[126,171,172,173,183,191],[126,171],[126,171,174,215],[126,171,175,176,184,192],[126,171,176,203,211],[126,171,177,179,183,191],[126,170,171,178],[126,171,179,180],[126,171,181,183],[126,170,171,183],[126,171,183,184,185,203,214],[126,171,183,184,185,198,203,206],[126,166,171],[126,166,171,179,183,186,191,203,214],[126,171,183,184,186,187,191,203,211,214],[126,171,186,188,203,211,214],[124,125,126,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[126,171,183,189],[126,171,190,214],[126,171,179,183,191,203],[126,171,192],[126,171,193],[126,170,171,194],[126,168,169,170,171,172,173,174,175,176,177,178,179,180,181,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[126,171,196],[126,171,197],[126,171,183,198,199],[126,171,198,200,215,217],[126,171,183,203,204,206],[126,171,205,206],[126,171,203,204],[126,171,206],[126,171,207],[126,168,171,203,208],[126,171,183,209,210],[126,171,209,210],[126,171,176,191,203,211],[126,171,212],[126,171,191,213],[126,171,186,197,214],[126,171,176,215],[126,171,203,216],[126,171,190,217],[126,171,218],[126,171,183,185,194,203,206,214,216,217,219],[126,171,203,220],[86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,126,171],[86,126,171],[126,136,140,171,214],[126,136,171,203,214],[126,171,203],[126,131,171],[126,133,136,171,214],[126,171,191,211],[126,171,221],[126,131,171,221],[126,133,136,171,191,214],[126,128,129,130,132,135,171,183,203,214],[126,136,144,171],[126,129,134,171],[126,136,160,161,171],[126,129,132,136,171,206,214,221],[126,136,171],[126,128,171],[126,131,132,133,134,135,136,137,138,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,163,164,165,171],[126,136,153,156,171,179],[126,136,144,145,146,171],[126,134,136,145,147,171],[126,135,171],[126,129,131,136,171],[126,136,140,145,147,171],[126,140,171],[126,134,136,139,171,214],[126,129,133,136,144,171],[126,136,153,171],[126,131,136,160,171,206,219,221],[116,117,126,171],[85,117,118,119,120,121,122,126,171],[119,126,171]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"471b5fe8145b49509351e2b3952137f66208e6a8e79349612e753962179d6204","signature":"0e7c3b4afa499c999571f1a67a99d62a189d06e8678da5025255ab4d1242cb3a"},{"version":"dc9e7909f3edca55a7da578ab1f2b473490cf1cea844fd05af2daee94e17e518","impliedFormat":99},{"version":"a380cd0a371b5b344c2f679a932593f02445571f9de0014bdf013dddf2a77376","impliedFormat":99},{"version":"dbbcd13911daafc1554acc17dad18ab92f91b5b8f084c6c4370cb8c60520c3b6","impliedFormat":99},{"version":"ab17464cd8391785c29509c629aa8477c8e86d4d3013f4c200b71ac574774ec2","impliedFormat":99},{"version":"d7f1043cbc447d09c8962c973d9f60e466c18e6bbaa470777901d9c2d357cfbe","impliedFormat":99},{"version":"e130a73d7e1e34953b1964c17c218fd14fccd1df6f15f111352b0d53291311bb","impliedFormat":99},{"version":"4ddecad872558e2b3df434ef0b01114d245e7a18a86afa6e7b5c68e75f9b8f76","impliedFormat":99},{"version":"a0ab7a82c3f844d4d4798f68f7bd6dc304e9ad6130631c90a09fb2636cb62756","impliedFormat":99},{"version":"270ceb915b1304c042b6799de28ff212cfa4baf06900d3a8bc4b79f62f00c8a7","impliedFormat":99},{"version":"1b3174ea6e3b4ae157c88eb28bf8e6d67f044edc9c552daf5488628fd8e5be97","impliedFormat":99},{"version":"1d1c0e6bda55b6fdcc247c4abd1ba2a36b50aac71bbf78770cbd172713c4e05f","impliedFormat":99},{"version":"d7d8a5f6a306b755dfa5a9b101cb800fd912b256222fb7d4629b5de416b4b8d5","impliedFormat":99},{"version":"5585ed538922e2e58655218652dcb262f08afa902f26f490cdec4967887ac31a","impliedFormat":99},{"version":"b46de7238d9d2243b27a21797e4772ba91465caae9c31f21dc43748dc9de9cd0","impliedFormat":99},{"version":"625fdbce788630c62f793cb6c80e0072ce0b8bf1d4d0a9922430671164371e0b","impliedFormat":99},{"version":"b6790300d245377671c085e76e9ef359b3cbba6821b913d6ce6b2739d00b9fb1","impliedFormat":99},{"version":"6beaff23ae0b12aa3b7672c7fd4e924f5088efa899b58fe83c7cc5675234ff14","impliedFormat":99},{"version":"a36c717362d06d76e7332d9c1d2744c2c5e4b4a5da6218ef7b4a299a62d23a6d","impliedFormat":99},{"version":"a61f8455fd21cec75a8288cd761f5bcc72441848841eb64aa09569e9d8929ff0","impliedFormat":99},{"version":"7539c82be2eb9b83ec335b11bb06dc35497f0b7dab8830b2c08b650d62707160","impliedFormat":99},{"version":"0eaa77f9ed4c3eb8fac011066c987b6faa7c70db95cfe9e3fb434573e095c4c8","impliedFormat":99},{"version":"466e7296272b827c55b53a7858502de733733558966e2e3a7cc78274e930210a","impliedFormat":99},{"version":"364a5c527037fdd7d494ab0a97f510d3ceda30b8a4bc598b490c135f959ff3c6","impliedFormat":99},{"version":"d26c255888cc20d5ab7397cc267ad81c8d7e97624c442a218afec00949e7316e","impliedFormat":99},{"version":"83d2dab980f2d1a2fe333f0001de8f42c831a438159d47b77c686ae405891b7f","impliedFormat":99},{"version":"ca369bcbdafc423d1a9dccd69de98044534900ff8236d2dd970b52438afb5355","impliedFormat":99},{"version":"5b90280e84e8eba347caaefc18210de3ce6ac176f5e82705a28e7f497dcc8689","impliedFormat":99},{"version":"6fc2d85e6d20a566b97001ee9a74dacc18d801bc9e9b735988119036db992932","impliedFormat":99},{"version":"d57bf30bf951ca5ce0119fcce3810bd03205377d78f08dfe6fca9d350ce73edc","impliedFormat":99},{"version":"e7878d8cd1fd0d0f1c55dcd8f5539f4c22e44993852f588dd194bd666b230727","impliedFormat":99},{"version":"638575c7a309a595c5ac3a65f03a643438fd81bf378aac93eadb84461cdd247c","impliedFormat":99},{"version":"70eebdf8cb991b4b5a1bfd9540698012cf9b2f11d265f7349e2fb7b7cb82d07b","signature":"4c60eadea5f3da0a00a59d1d46e3c9e106da50e89df04f75bd88e81c2d3cb42d"},{"version":"7f729540963914f308742abcebd1c93cf6634ca85e4024177705d811301a09ab","signature":"9033c48366f3826f3e362190c39da048e43e4fe22b27eb7b3f5550d47c41dfec"},{"version":"45cf72038ec944c2bf81e8f38c942a6b01d712b6ec90caae1794368ca20fd60d","signature":"fc11adc025eb09fd73e7f16c7c8829b6af9ec3bc34b88c4e30041f8d7e39f123"},{"version":"2f677819357d297164c701ab4d8c56a4d14beb939d6b795961e3d392a18c5de0","signature":"095787b26ff9533cc71654c6b167ce559323f2731f55daca415e3a76ef2c4c5b"},{"version":"c06978661e13b2f691344a26d9769d89738f0901095f1e40b9d836328c39137b","signature":"f4dab491108e5772996f2e4fb909f964a3745bfb77fca4759cf2dfd5c7edac52"},{"version":"6fc8999fba7b5d35437b00886dcd9928f264d1caff408915e1e03b4ba0be9a48","signature":"2f6cbd9bfa908dfd07bbb0c7592a65992c49c6f4b7bd3a6abe0a33da0c6c55fb"},"48c5aa56356e9e9df8ba54542f23f31b1d416bc93c747d7333057983e3013f71",{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"ef18cbf1d8374576e3db03ff33c2c7499845972eb0c4adf87392949709c5e160","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"17fe9131bec653b07b0a1a8b99a830216e3e43fe0ea2605be318dc31777c8bbf","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"2472ef4c28971272a897fdb85d4155df022e1f5d9a474a526b8fc2ef598af94e","impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","impliedFormat":1},{"version":"19851a6596401ca52d42117108d35e87230fc21593df5c4d3da7108526b6111c","impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"40bfc70953be2617dc71979c14e9e99c5e65c940a4f1c9759ddb90b0f8ff6b1a","impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"561c60d8bfe0fec2c08827d09ff039eca0c1f9b50ef231025e5a549655ed0298","impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","impliedFormat":1},{"version":"f4b4faedc57701ae727d78ba4a83e466a6e3bdcbe40efbf913b17e860642897c","affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"938f94db8400d0b479626b9006245a833d50ce8337f391085fad4af540279567","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"12fb9c13f24845000d7bd9660d11587e27ef967cbd64bd9df19ae3e6aa9b52d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f32444438ecb1fa4519f6ec3977d69ce0e3acfa18b803e5cd725c204501f350","impliedFormat":1},{"version":"0ab3c844f1eb5a1d94c90edc346a25eb9d3943af7a7812f061bf2d627d8afac0","impliedFormat":1},{"version":"b0a84d9348601dbc217017c0721d6064c3b1af9b392663348ba146fdae0c7afd","impliedFormat":1},{"version":"161f09445a8b4ba07f62ae54b27054e4234e7957062e34c6362300726dabd315","impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","impliedFormat":1},{"version":"e6057f9e7b0c64d4527afeeada89f313f96a53291705f069a9193c18880578cb","impliedFormat":1},{"version":"34ecb9596317c44dab586118fb62c1565d3dad98d201cd77f3e6b0dde453339c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"237581f5ec4620a17e791d3bb79bad3af01e27a274dbee875ac9b0721a4fe97d","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"e6d81b1f7ab11dc1b1ad7ad29fcfad6904419b36baf55ed5e80df48d56ac3aff","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b6b8e3736383a1d27e2592c484a940eeb37ec4808ba9e74dd57679b2453b5865","impliedFormat":1},{"version":"d6f36b683c59ac0d68a1d5ee906e578e2f5e9a285bca80ff95ce61cdc9ddcdeb","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"12aad38de6f0594dc21efa78a2c1f67bf6a7ef5a389e05417fe9945284450908","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"b338a6e6c1d456e65a6ea78da283e3077fe8edf7202ae10490abbba5b952b05e","impliedFormat":1},{"version":"2918b7c516051c30186a1055ebcdb3580522be7190f8a2fff4100ea714c7c366","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"d67fc92a91171632fc74f413ce42ff1aa7fbcc5a85b127101f7ec446d2039a1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d40e4631100dbc067268bce96b07d7aff7f28a541b1bfb7ef791c64a696b3d33","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","impliedFormat":1},{"version":"e4c653466d0497d87fa9ffd00e59a95f33bc1c1722c3f5c84dab2e950c18da70","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6dcc3b933e864e91d4bea94274ad69854d5d2a1311a4b0e20408a57af19e95d","impliedFormat":1},{"version":"a51f786b9f3c297668f8f322a6c58f85d84948ef69ade32069d5d63ec917221c","impliedFormat":1}],"root":[85,[117,123]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":99},"referencedMap":[[168,1],[169,1],[170,2],[126,3],[171,4],[172,5],[173,6],[124,7],[174,8],[175,9],[176,10],[177,11],[178,12],[179,13],[180,13],[182,7],[181,14],[183,15],[184,16],[185,17],[167,18],[125,7],[186,19],[187,20],[188,21],[221,22],[189,23],[190,24],[191,25],[192,26],[193,27],[194,28],[195,29],[196,30],[197,31],[198,32],[199,32],[200,33],[201,7],[202,7],[203,34],[205,35],[204,36],[206,37],[207,38],[208,39],[209,40],[210,41],[211,42],[212,43],[213,44],[214,45],[215,46],[216,47],[217,48],[218,49],[219,50],[220,51],[127,7],[116,52],[87,53],[96,53],[88,53],[97,53],[89,53],[90,53],[104,53],[103,53],[105,53],[106,53],[98,53],[91,53],[99,53],[92,53],[100,53],[93,53],[95,53],[102,53],[101,53],[107,53],[94,53],[108,53],[113,53],[114,53],[109,53],[86,7],[115,7],[111,53],[110,53],[112,53],[82,7],[83,7],[15,7],[13,7],[14,7],[19,7],[18,7],[2,7],[20,7],[21,7],[22,7],[23,7],[24,7],[25,7],[26,7],[27,7],[3,7],[28,7],[29,7],[4,7],[30,7],[34,7],[31,7],[32,7],[33,7],[35,7],[36,7],[37,7],[5,7],[38,7],[39,7],[40,7],[41,7],[6,7],[45,7],[42,7],[43,7],[44,7],[46,7],[7,7],[47,7],[52,7],[53,7],[48,7],[49,7],[50,7],[51,7],[8,7],[57,7],[54,7],[55,7],[56,7],[58,7],[9,7],[59,7],[60,7],[61,7],[63,7],[62,7],[64,7],[65,7],[10,7],[66,7],[67,7],[68,7],[11,7],[69,7],[70,7],[71,7],[72,7],[73,7],[1,7],[74,7],[75,7],[12,7],[79,7],[77,7],[81,7],[84,7],[76,7],[80,7],[78,7],[17,7],[16,7],[144,54],[155,55],[142,54],[156,56],[165,57],[134,58],[133,59],[164,60],[159,61],[163,62],[136,63],[152,64],[135,65],[162,66],[131,67],[132,61],[137,68],[138,7],[143,58],[141,68],[129,69],[166,70],[157,71],[147,72],[146,68],[148,73],[150,74],[145,75],[149,76],[160,60],[139,77],[140,78],[151,79],[130,56],[154,80],[153,68],[158,7],[128,7],[161,81],[85,7],[118,82],[119,7],[123,83],[120,7],[122,84],[121,7],[117,7]],"latestChangedDtsFile":"./dist/search.types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.full.d.ts","./src/archived-emails.types.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/types.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/export.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/import.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/index.d.ts","./src/user.types.ts","./src/auth.types.ts","./src/email.types.ts","./src/ingestion.types.ts","./src/storage.types.ts","./src/search.types.ts","./src/index.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@5.6.0/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/index.d.ts"],"fileIdsList":[[126,168,171],[126,170,171],[171],[126,171,176,206],[126,171,172,177,183,184,191,203,214],[126,171,172,173,183,191],[126,171],[126,171,174,215],[126,171,175,176,184,192],[126,171,176,203,211],[126,171,177,179,183,191],[126,170,171,178],[126,171,179,180],[126,171,181,183],[126,170,171,183],[126,171,183,184,185,203,214],[126,171,183,184,185,198,203,206],[126,166,171],[126,166,171,179,183,186,191,203,214],[126,171,183,184,186,187,191,203,211,214],[126,171,186,188,203,211,214],[124,125,126,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[126,171,183,189],[126,171,190,214],[126,171,179,183,191,203],[126,171,192],[126,171,193],[126,170,171,194],[126,168,169,170,171,172,173,174,175,176,177,178,179,180,181,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[126,171,196],[126,171,197],[126,171,183,198,199],[126,171,198,200,215,217],[126,171,183,203,204,206],[126,171,205,206],[126,171,203,204],[126,171,206],[126,171,207],[126,168,171,203,208],[126,171,183,209,210],[126,171,209,210],[126,171,176,191,203,211],[126,171,212],[126,171,191,213],[126,171,186,197,214],[126,171,176,215],[126,171,203,216],[126,171,190,217],[126,171,218],[126,171,183,185,194,203,206,214,216,217,219],[126,171,203,220],[86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,126,171],[86,126,171],[126,136,140,171,214],[126,136,171,203,214],[126,171,203],[126,131,171],[126,133,136,171,214],[126,171,191,211],[126,171,221],[126,131,171,221],[126,133,136,171,191,214],[126,128,129,130,132,135,171,183,203,214],[126,136,144,171],[126,129,134,171],[126,136,160,161,171],[126,129,132,136,171,206,214,221],[126,136,171],[126,128,171],[126,131,132,133,134,135,136,137,138,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,163,164,165,171],[126,136,153,156,171,179],[126,136,144,145,146,171],[126,134,136,145,147,171],[126,135,171],[126,129,131,136,171],[126,136,140,145,147,171],[126,140,171],[126,134,136,139,171,214],[126,129,133,136,144,171],[126,136,153,171],[126,131,136,160,171,206,219,221],[116,117,126,171],[85,117,118,119,120,121,122,126,171],[119,126,171]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"471b5fe8145b49509351e2b3952137f66208e6a8e79349612e753962179d6204","signature":"0e7c3b4afa499c999571f1a67a99d62a189d06e8678da5025255ab4d1242cb3a"},{"version":"dc9e7909f3edca55a7da578ab1f2b473490cf1cea844fd05af2daee94e17e518","impliedFormat":99},{"version":"a380cd0a371b5b344c2f679a932593f02445571f9de0014bdf013dddf2a77376","impliedFormat":99},{"version":"dbbcd13911daafc1554acc17dad18ab92f91b5b8f084c6c4370cb8c60520c3b6","impliedFormat":99},{"version":"ab17464cd8391785c29509c629aa8477c8e86d4d3013f4c200b71ac574774ec2","impliedFormat":99},{"version":"d7f1043cbc447d09c8962c973d9f60e466c18e6bbaa470777901d9c2d357cfbe","impliedFormat":99},{"version":"e130a73d7e1e34953b1964c17c218fd14fccd1df6f15f111352b0d53291311bb","impliedFormat":99},{"version":"4ddecad872558e2b3df434ef0b01114d245e7a18a86afa6e7b5c68e75f9b8f76","impliedFormat":99},{"version":"a0ab7a82c3f844d4d4798f68f7bd6dc304e9ad6130631c90a09fb2636cb62756","impliedFormat":99},{"version":"270ceb915b1304c042b6799de28ff212cfa4baf06900d3a8bc4b79f62f00c8a7","impliedFormat":99},{"version":"1b3174ea6e3b4ae157c88eb28bf8e6d67f044edc9c552daf5488628fd8e5be97","impliedFormat":99},{"version":"1d1c0e6bda55b6fdcc247c4abd1ba2a36b50aac71bbf78770cbd172713c4e05f","impliedFormat":99},{"version":"d7d8a5f6a306b755dfa5a9b101cb800fd912b256222fb7d4629b5de416b4b8d5","impliedFormat":99},{"version":"5585ed538922e2e58655218652dcb262f08afa902f26f490cdec4967887ac31a","impliedFormat":99},{"version":"b46de7238d9d2243b27a21797e4772ba91465caae9c31f21dc43748dc9de9cd0","impliedFormat":99},{"version":"625fdbce788630c62f793cb6c80e0072ce0b8bf1d4d0a9922430671164371e0b","impliedFormat":99},{"version":"b6790300d245377671c085e76e9ef359b3cbba6821b913d6ce6b2739d00b9fb1","impliedFormat":99},{"version":"6beaff23ae0b12aa3b7672c7fd4e924f5088efa899b58fe83c7cc5675234ff14","impliedFormat":99},{"version":"a36c717362d06d76e7332d9c1d2744c2c5e4b4a5da6218ef7b4a299a62d23a6d","impliedFormat":99},{"version":"a61f8455fd21cec75a8288cd761f5bcc72441848841eb64aa09569e9d8929ff0","impliedFormat":99},{"version":"7539c82be2eb9b83ec335b11bb06dc35497f0b7dab8830b2c08b650d62707160","impliedFormat":99},{"version":"0eaa77f9ed4c3eb8fac011066c987b6faa7c70db95cfe9e3fb434573e095c4c8","impliedFormat":99},{"version":"466e7296272b827c55b53a7858502de733733558966e2e3a7cc78274e930210a","impliedFormat":99},{"version":"364a5c527037fdd7d494ab0a97f510d3ceda30b8a4bc598b490c135f959ff3c6","impliedFormat":99},{"version":"d26c255888cc20d5ab7397cc267ad81c8d7e97624c442a218afec00949e7316e","impliedFormat":99},{"version":"83d2dab980f2d1a2fe333f0001de8f42c831a438159d47b77c686ae405891b7f","impliedFormat":99},{"version":"ca369bcbdafc423d1a9dccd69de98044534900ff8236d2dd970b52438afb5355","impliedFormat":99},{"version":"5b90280e84e8eba347caaefc18210de3ce6ac176f5e82705a28e7f497dcc8689","impliedFormat":99},{"version":"6fc2d85e6d20a566b97001ee9a74dacc18d801bc9e9b735988119036db992932","impliedFormat":99},{"version":"d57bf30bf951ca5ce0119fcce3810bd03205377d78f08dfe6fca9d350ce73edc","impliedFormat":99},{"version":"e7878d8cd1fd0d0f1c55dcd8f5539f4c22e44993852f588dd194bd666b230727","impliedFormat":99},{"version":"638575c7a309a595c5ac3a65f03a643438fd81bf378aac93eadb84461cdd247c","impliedFormat":99},{"version":"70eebdf8cb991b4b5a1bfd9540698012cf9b2f11d265f7349e2fb7b7cb82d07b","signature":"4c60eadea5f3da0a00a59d1d46e3c9e106da50e89df04f75bd88e81c2d3cb42d"},{"version":"7f729540963914f308742abcebd1c93cf6634ca85e4024177705d811301a09ab","signature":"9033c48366f3826f3e362190c39da048e43e4fe22b27eb7b3f5550d47c41dfec"},{"version":"45cf72038ec944c2bf81e8f38c942a6b01d712b6ec90caae1794368ca20fd60d","signature":"fc11adc025eb09fd73e7f16c7c8829b6af9ec3bc34b88c4e30041f8d7e39f123"},{"version":"b2d9040886aee1200f8cde9d04c2901c2238b97db2b89886362691e988801c43","signature":"13497f544df06ab2c9a597e628a54d9278209eec1f67f86d8575e4a67522ef54"},{"version":"c06978661e13b2f691344a26d9769d89738f0901095f1e40b9d836328c39137b","signature":"f4dab491108e5772996f2e4fb909f964a3745bfb77fca4759cf2dfd5c7edac52"},{"version":"6fc8999fba7b5d35437b00886dcd9928f264d1caff408915e1e03b4ba0be9a48","signature":"2f6cbd9bfa908dfd07bbb0c7592a65992c49c6f4b7bd3a6abe0a33da0c6c55fb"},"48c5aa56356e9e9df8ba54542f23f31b1d416bc93c747d7333057983e3013f71",{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"ef18cbf1d8374576e3db03ff33c2c7499845972eb0c4adf87392949709c5e160","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"17fe9131bec653b07b0a1a8b99a830216e3e43fe0ea2605be318dc31777c8bbf","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"2472ef4c28971272a897fdb85d4155df022e1f5d9a474a526b8fc2ef598af94e","impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","impliedFormat":1},{"version":"19851a6596401ca52d42117108d35e87230fc21593df5c4d3da7108526b6111c","impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"40bfc70953be2617dc71979c14e9e99c5e65c940a4f1c9759ddb90b0f8ff6b1a","impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"561c60d8bfe0fec2c08827d09ff039eca0c1f9b50ef231025e5a549655ed0298","impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","impliedFormat":1},{"version":"f4b4faedc57701ae727d78ba4a83e466a6e3bdcbe40efbf913b17e860642897c","affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"938f94db8400d0b479626b9006245a833d50ce8337f391085fad4af540279567","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"12fb9c13f24845000d7bd9660d11587e27ef967cbd64bd9df19ae3e6aa9b52d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f32444438ecb1fa4519f6ec3977d69ce0e3acfa18b803e5cd725c204501f350","impliedFormat":1},{"version":"0ab3c844f1eb5a1d94c90edc346a25eb9d3943af7a7812f061bf2d627d8afac0","impliedFormat":1},{"version":"b0a84d9348601dbc217017c0721d6064c3b1af9b392663348ba146fdae0c7afd","impliedFormat":1},{"version":"161f09445a8b4ba07f62ae54b27054e4234e7957062e34c6362300726dabd315","impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","impliedFormat":1},{"version":"e6057f9e7b0c64d4527afeeada89f313f96a53291705f069a9193c18880578cb","impliedFormat":1},{"version":"34ecb9596317c44dab586118fb62c1565d3dad98d201cd77f3e6b0dde453339c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"237581f5ec4620a17e791d3bb79bad3af01e27a274dbee875ac9b0721a4fe97d","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"e6d81b1f7ab11dc1b1ad7ad29fcfad6904419b36baf55ed5e80df48d56ac3aff","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b6b8e3736383a1d27e2592c484a940eeb37ec4808ba9e74dd57679b2453b5865","impliedFormat":1},{"version":"d6f36b683c59ac0d68a1d5ee906e578e2f5e9a285bca80ff95ce61cdc9ddcdeb","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"12aad38de6f0594dc21efa78a2c1f67bf6a7ef5a389e05417fe9945284450908","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"b338a6e6c1d456e65a6ea78da283e3077fe8edf7202ae10490abbba5b952b05e","impliedFormat":1},{"version":"2918b7c516051c30186a1055ebcdb3580522be7190f8a2fff4100ea714c7c366","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"d67fc92a91171632fc74f413ce42ff1aa7fbcc5a85b127101f7ec446d2039a1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d40e4631100dbc067268bce96b07d7aff7f28a541b1bfb7ef791c64a696b3d33","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","impliedFormat":1},{"version":"e4c653466d0497d87fa9ffd00e59a95f33bc1c1722c3f5c84dab2e950c18da70","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6dcc3b933e864e91d4bea94274ad69854d5d2a1311a4b0e20408a57af19e95d","impliedFormat":1},{"version":"a51f786b9f3c297668f8f322a6c58f85d84948ef69ade32069d5d63ec917221c","impliedFormat":1}],"root":[85,[117,123]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":99},"referencedMap":[[168,1],[169,1],[170,2],[126,3],[171,4],[172,5],[173,6],[124,7],[174,8],[175,9],[176,10],[177,11],[178,12],[179,13],[180,13],[182,7],[181,14],[183,15],[184,16],[185,17],[167,18],[125,7],[186,19],[187,20],[188,21],[221,22],[189,23],[190,24],[191,25],[192,26],[193,27],[194,28],[195,29],[196,30],[197,31],[198,32],[199,32],[200,33],[201,7],[202,7],[203,34],[205,35],[204,36],[206,37],[207,38],[208,39],[209,40],[210,41],[211,42],[212,43],[213,44],[214,45],[215,46],[216,47],[217,48],[218,49],[219,50],[220,51],[127,7],[116,52],[87,53],[96,53],[88,53],[97,53],[89,53],[90,53],[104,53],[103,53],[105,53],[106,53],[98,53],[91,53],[99,53],[92,53],[100,53],[93,53],[95,53],[102,53],[101,53],[107,53],[94,53],[108,53],[113,53],[114,53],[109,53],[86,7],[115,7],[111,53],[110,53],[112,53],[82,7],[83,7],[15,7],[13,7],[14,7],[19,7],[18,7],[2,7],[20,7],[21,7],[22,7],[23,7],[24,7],[25,7],[26,7],[27,7],[3,7],[28,7],[29,7],[4,7],[30,7],[34,7],[31,7],[32,7],[33,7],[35,7],[36,7],[37,7],[5,7],[38,7],[39,7],[40,7],[41,7],[6,7],[45,7],[42,7],[43,7],[44,7],[46,7],[7,7],[47,7],[52,7],[53,7],[48,7],[49,7],[50,7],[51,7],[8,7],[57,7],[54,7],[55,7],[56,7],[58,7],[9,7],[59,7],[60,7],[61,7],[63,7],[62,7],[64,7],[65,7],[10,7],[66,7],[67,7],[68,7],[11,7],[69,7],[70,7],[71,7],[72,7],[73,7],[1,7],[74,7],[75,7],[12,7],[79,7],[77,7],[81,7],[84,7],[76,7],[80,7],[78,7],[17,7],[16,7],[144,54],[155,55],[142,54],[156,56],[165,57],[134,58],[133,59],[164,60],[159,61],[163,62],[136,63],[152,64],[135,65],[162,66],[131,67],[132,61],[137,68],[138,7],[143,58],[141,68],[129,69],[166,70],[157,71],[147,72],[146,68],[148,73],[150,74],[145,75],[149,76],[160,60],[139,77],[140,78],[151,79],[130,56],[154,80],[153,68],[158,7],[128,7],[161,81],[85,7],[118,82],[119,7],[123,83],[120,7],[122,84],[121,7],[117,7]],"latestChangedDtsFile":"./dist/ingestion.types.d.ts","version":"5.8.3"} \ No newline at end of file