diff --git a/.gitignore b/.gitignore index 5254378..6dd646d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,16 @@ -SCHEMA.md - +# Generated build artifacts dist +**/*.tsbuildinfo + +# Generated dependencies node_modules + +# Environment specific files .env -db.sqlite +*.sqlite* + +# Apple specific files +.DS_Store + +# scratchpad +**/scratchpad/**/* diff --git a/.vscode/mxfx-snippets.code-snippets b/.vscode/mxfx-snippets.code-snippets index 9aac19e..db370cc 100644 --- a/.vscode/mxfx-snippets.code-snippets +++ b/.vscode/mxfx-snippets.code-snippets @@ -31,30 +31,24 @@ "body": "Effect.fn(function* () {${0}})", }, - "mxfx-get-endpoint": { + "mxfx-endpoint": { "scope": "typescript", - "prefix": "mxfx-endpoint-get", + "prefix": "mxfx-endpoint", "body": [ - "import { Schema } from 'effect.ts'", - "import { makeEndpoint } from '@/matrix-endpoint.ts'", + "import { Schema } from 'effect'", + "import { makeEndpoint } from '../endpoint.ts'", "", - "const responseSchema = Schema.Struct({${0}})", + "const schema = Schema.Struct({${0}})", "", "/**", - " * `GET /_matrix/client/${1:path}`", + " * `${1:GET} /_matrix/client/${2:path}`", " *", " * @description", - " * ${2:description}", + " * ${3:description}", " *", - " * @see ${3:documentationUrl} ", + " * @see ${4:documentationUrl} ", " */", - "export const ${4:getEndpoint} = () =>", - " makeEndpoint({", - " path: '/${1:path}',", - " method: 'GET',", - " auth: ${5:true},", - " schema: responseSchema,", - " })", + "export const ${5:getEndpoint} = () => makeEndpoint('${1:GET}', { auth: ${6:true}, schema })`'/${2:path}'`", "", ], }, diff --git a/examples/02-client.ts b/examples/02-client.ts index e4c0201..646206d 100644 --- a/examples/02-client.ts +++ b/examples/02-client.ts @@ -1,12 +1,12 @@ import { NodeHttpClient, NodeRuntime } from '@effect/platform-node' import { Cause, Config, Effect, Layer, References, Stream } from 'effect' import { DevTools } from 'effect/unstable/devtools' -import { MatrixApi, MatrixAuth, MatrixClient, MatrixConfig, Store } from 'mxfx' +import { MatrixApi, MatrixAuth, MatrixClient, MatrixConfig } from 'mxfx' import { endpoints } from 'mxfx/api' import type { RoomId } from 'mxfx/branded' type SyncFrame = typeof endpoints.getSyncV3ResponseSchema.Type -const lastPredicate = (frame: Stream.Stream) => +const pingPredicate = (frame: Stream.Stream) => frame.pipe( Stream.flatMap(sync => Stream.fromIterable(Object.entries(sync.rooms?.join ?? {}))), Stream.flatMap(([roomId, room]) => @@ -22,7 +22,7 @@ const lastPredicate = (frame: Stream.Stream) => return ( typeof content.body === 'string' && - content.body.trim().startsWith('!last') && + content.body.trim().startsWith('!ping') && (content.msgtype === 'm.text' || content.msgtype === 'm.notice' || content.msgtype === 'm.emote') ) }), @@ -32,23 +32,14 @@ const lastPredicate = (frame: Stream.Stream) => const program = Effect.gen(function* () { const api = yield* MatrixApi.MatrixApi const client = yield* MatrixClient.MatrixClient - const store = yield* Store.Store const { userId, deviceId, isGuest } = yield* endpoints.getAccountWhoami().pipe(Effect.andThen(api.execute)) yield* Effect.logDebug({ userId, deviceId, isGuest }) - yield* client.onEvent({ predicate: lastPredicate }, event => + yield* client.onEvent({ predicate: pingPredicate }, event => Effect.gen(function* () { - const timeline = yield* store.getRoomTimeline(event.roomId) - const lastMessages = timeline.filter(e => e.type === 'm.room.message' && e.sender !== userId).slice(-5) - yield* Effect.log(lastMessages) - yield* endpoints - .putRoomsSendV3({ - content: { msgtype: 'm.text', body: lastMessages.map(x => `${x.content['body']}`).join('\n\n') }, - eventType: 'm.room.message', - roomId: event.roomId, - }) + .putRoomsSendV3({ content: { msgtype: 'm.text', body: 'pong' }, eventType: 'm.room.message', roomId: event.roomId }) .pipe(Effect.andThen(api.execute)) }).pipe(Effect.catchCause(cause => Effect.log(cause))), ) @@ -63,7 +54,7 @@ const program = Effect.gen(function* () { const mxfxLive = MatrixClient.layerMatrixClient.pipe( Layer.provideMerge(MatrixApi.layer), - Layer.provideMerge(MatrixAuth.layerLegacyConfig({ accessToken: Config.string('MATRIX_ACCESS_TOKEN') })), + Layer.provideMerge(MatrixAuth.layerAccessToken({ accessToken: Config.string('MATRIX_ACCESS_TOKEN') })), Layer.provideMerge(MatrixConfig.layerConfig({ serverName: Config.string('MATRIX_HOME_SERVER') })), Layer.provideMerge(NodeHttpClient.layerNodeHttp), Layer.provideMerge(DevTools.layer()), diff --git a/examples/03-encrypted.ts b/examples/03-encrypted.ts new file mode 100644 index 0000000..9fc2b57 --- /dev/null +++ b/examples/03-encrypted.ts @@ -0,0 +1,155 @@ +import { NodeHttpClient, NodeRuntime } from '@effect/platform-node' +import { Crypto, CryptoNode } from '@mxfx/crypto-node' +import { Effect, Layer, Option, PubSub, Duration, Stream, Cause, Config, Record, References, Redacted, Schema } from 'effect' +import { Filter, Kv, MatrixApi, MatrixAuth, MatrixConfig, Event } from 'mxfx' +import { endpoints } from 'mxfx/api' + +const emptyFilter = Filter.make({ + room: { + timeline: { limit: 10, lazyLoadMembers: false }, + state: { lazyLoadMembers: false }, + accountData: { lazyLoadMembers: false, notTypes: ['*'] }, + ephemeral: { lazyLoadMembers: false, notTypes: ['*'] }, + }, + presence: { notTypes: ['*'] }, + accountData: { notTypes: ['*'] }, +}) + +type SyncFrame = typeof endpoints.getSyncV3ResponseSchema.Type + +const syncLoop = Effect.gen(function* () { + const api = yield* MatrixApi.MatrixApi + const kv = yield* Kv.Kv + const crypto = yield* Crypto.Crypto + + const { userId, deviceId } = yield* endpoints.getAccountWhoami().pipe(Effect.andThen(api.execute)) + + if (!deviceId) return yield* Effect.die('No deviceId') + + const machine = yield* crypto.makeMachine({ + userId, + deviceId: deviceId, + storage: { type: 'sqlite', passphrase: Redacted.make('passphrase'), path: './03-encrypted-db' }, + }) + + const syncHub = yield* PubSub.unbounded() + const syncStream = Stream.fromPubSub(syncHub) + + const syncOnce = kv.getString('syncToken').pipe( + Effect.flatMap(nextBatch => + endpoints + .getSyncV3({ + useStateAfter: true, + setPresence: 'online', + timeout: Duration.seconds(30), + since: nextBatch.pipe(Option.getOrUndefined), + fullState: nextBatch.pipe(Option.isNone), + filter: nextBatch.pipe(Option.match({ onNone: () => emptyFilter, onSome: () => undefined })), + }) + .pipe( + Effect.andThen(api.execute), + Effect.tap(sync => crypto.receiveSyncChanges(machine, sync)), + Effect.tap(sync => PubSub.publish(syncHub, sync)), + Effect.tap(() => crypto.sendOutgoingRequests(machine)), + Effect.tap(sync => kv.set('syncToken', sync.nextBatch)), + ), + ), + ) + + yield* Effect.forever(syncOnce).pipe( + Effect.catchCause(cause => Effect.logError(Cause.pretty(cause))), + Effect.forkDetach(), + ) + + return { eventStream: syncStream, machine } +}) + +const handleMessages = Effect.fn(function* (f: SyncFrame) { + if (!f.rooms?.join) return + const joinedRooms = f.rooms.join + + const keys = Record.keys(f.rooms?.join) + yield* Effect.forEach(keys, key => + Effect.gen(function* () { + const room = joinedRooms[key] + + if (!room?.timeline?.events) return + const events = room.timeline.events + + yield* Effect.forEach(events, event => + Effect.gen(function* () { + if (event.type !== 'm.room.message') return + yield* Effect.log('new message!', { content: event.content }) + }), + ) + }), + ) +}) + +const handleEncryptedEvents = Effect.fn(function* (f: SyncFrame, machine: Crypto.Machine) { + const crypto = yield* Crypto.Crypto + + if (!f.rooms?.join) return + const joinedRooms = f.rooms.join + const roomIds = Record.keys(f.rooms?.join) + yield* Effect.forEach(roomIds, roomId => + Effect.gen(function* () { + const room = joinedRooms[roomId] + + if (!room?.timeline?.events) return + const events = room.timeline.events + + yield* Effect.forEach(events, event => + Effect.gen(function* () { + if (event.type !== 'm.room.encrypted') return + + const wireEvent = yield* Schema.encodeUnknownEffect( + Event.roomEventWithoutRoomId.pipe(MatrixApi.EncodeCase.encodeSnakeCaseSchema), + )(event) + + const decrypted = yield* crypto.decryptRoomEvent(machine, JSON.stringify(wireEvent), roomId) + + yield* Effect.log('new encrypted event!', { content: event.content, decrypted: decrypted.event }) + }), + ) + }), + ) +}) + +const handleInvites = Effect.fn(function* (f: SyncFrame) { + const api = yield* MatrixApi.MatrixApi + + if (!f.rooms?.invite) return + const invitedRooms = f.rooms?.invite + + const keys = Record.keys(invitedRooms) + yield* Effect.forEach(keys, roomId => endpoints.postRoomsJoinV3({ roomId }).pipe(Effect.andThen(api.execute))) +}) + +const program = Effect.gen(function* () { + const { eventStream, machine } = yield* syncLoop + + yield* eventStream.pipe( + Stream.onFirst(() => Effect.log('Client Started')), + Stream.runHead, + ) + + yield* Effect.all( + [ + eventStream.pipe(Stream.runForEach(handleInvites)), // + eventStream.pipe(Stream.runForEach(handleMessages)), + eventStream.pipe(Stream.runForEach(sync => handleEncryptedEvents(sync, machine))), + ], + { concurrency: 'unbounded' }, + ) +}) + +const matrixLayer = CryptoNode.layer.pipe( + Layer.provideMerge(MatrixApi.layer), + Layer.provideMerge(MatrixAuth.layerAccessToken({ accessToken: Config.string('MATRIX_ACCESS_TOKEN') })), + Layer.provide(MatrixConfig.layerConfig({ serverName: Config.string('MATRIX_HOME_SERVER') })), + Layer.provide(NodeHttpClient.layerNodeHttp), + Layer.provideMerge(Layer.succeed(References.MinimumLogLevel, 'Debug')), +) + +NodeRuntime.runMain(program.pipe(Effect.provide(matrixLayer), Effect.scoped)) diff --git a/examples/package.json b/examples/package.json index 7ff51b4..03c48f3 100644 --- a/examples/package.json +++ b/examples/package.json @@ -1,12 +1,10 @@ { - "name": "example", - "version": "1.0.0", - "keywords": [], - "author": "", + "private": "true", "type": "module", "dependencies": { - "@effect/platform-node": "4.0.0-beta.84", - "effect": "4.0.0-beta.84", + "@effect/platform-node": "4.0.0-beta.99", + "@mxfx/crypto-node": "workspace:^", + "effect": "4.0.0-beta.99", "mxfx": "workspace:^" } } diff --git a/package.json b/package.json index a23fae1..bc08b00 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "test": "vitest" }, "devDependencies": { + "@effect/vitest": "4.0.0-beta.99", "oxfmt": "^0.55.0", "oxlint": "^1.70.0", "typescript": "^6.0.3", diff --git a/packages/crypto-node/package.json b/packages/crypto-node/package.json new file mode 100644 index 0000000..440f4a2 --- /dev/null +++ b/packages/crypto-node/package.json @@ -0,0 +1,26 @@ +{ + "name": "@mxfx/crypto-node", + "version": "0.0.1", + "license": "MIT", + "author": "Wouter de Bruijn ", + "repository": { + "type": "git", + "url": "https://github.com/wouter173/mxfx.git", + "directory": "packages/crypto-node" + }, + "type": "module", + "sideEffects": [], + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "@matrix-org/matrix-sdk-crypto-nodejs": "^0.6.1" + }, + "peerDependencies": { + "effect": "4.0.0-beta.99", + "mxfx": "workspace:*" + } +} diff --git a/packages/crypto-node/src/crypto-node.ts b/packages/crypto-node/src/crypto-node.ts new file mode 100644 index 0000000..6637189 --- /dev/null +++ b/packages/crypto-node/src/crypto-node.ts @@ -0,0 +1,147 @@ +import * as MatrixCryptoNode from '@matrix-org/matrix-sdk-crypto-nodejs' +import { Effect, Layer, Redacted } from 'effect' +import { MatrixApi, RoomId } from 'mxfx' + +import { Crypto, CryptoError, type Machine, type CryptoShape, type MachineOptions } from './crypto.ts' + +type SyncFrame = typeof MatrixApi.endpoints.getSyncV3ResponseSchema.Type + +export const makeLayer: Effect.Effect = Effect.gen(function* () { + const api = yield* MatrixApi.MatrixApi + + const acquireMachine = Effect.fn(function* ({ userId, deviceId, storage }: MachineOptions) { + const olmMachine = yield* Effect.tryPromise({ + try: () => + MatrixCryptoNode.OlmMachine.initialize( + new MatrixCryptoNode.UserId(userId), + new MatrixCryptoNode.DeviceId(deviceId), + storage.type === 'sqlite' ? storage.path : undefined, + storage.type === 'sqlite' ? Redacted.value(storage.passphrase) : undefined, + ), + + catch: cause => new CryptoError({ cause }), + }) + + return { _olmMachine: olmMachine } + }) + + const closeMachine = (machine: Machine) => + Effect.try({ + try: () => machine._olmMachine.close(), + catch: e => new CryptoError({ cause: e }), + }) + + const makeMachine = (options: MachineOptions) => + Effect.acquireRelease(acquireMachine(options), machine => + closeMachine(machine).pipe(Effect.catch(error => Effect.logError('Failed to close OlmMachine', error))), + ) + + const receiveSyncChanges = Effect.fn(function* (machine: Machine, sync: SyncFrame) { + //TODO: all this can fail, probably + const toDeviceEvents = JSON.stringify(sync.toDevice?.events ?? []) + + const changedUsers = (sync.deviceLists?.changed ?? []).map(userId => new MatrixCryptoNode.UserId(userId)) + const leftUsers = (sync.deviceLists?.left ?? []).map(userId => new MatrixCryptoNode.UserId(userId)) + const changedDevices = new MatrixCryptoNode.DeviceLists(changedUsers, leftUsers) + + const oneTimeKeyCounts = sync.deviceOneTimeKeysCount ?? {} + const unusedFallbackKeys = [...(sync.deviceUnusedFallbackKeyTypes ?? [])] //TODO: this copy a lil crazy but otherwise it readonly + + const toDevice = yield* Effect.tryPromise({ + try: () => machine._olmMachine.receiveSyncChanges(toDeviceEvents, changedDevices, oneTimeKeyCounts, unusedFallbackKeys), + catch: cause => new CryptoError({ cause }), + }) + + return toDevice + }) + + const getOutgoingRequests = Effect.fn(function* (machine: Machine) { + const outgoingRequests = yield* Effect.tryPromise({ + try: () => machine._olmMachine.outgoingRequests(), + catch: cause => new CryptoError({ cause }), + }) + + return yield* Effect.forEach(outgoingRequests, request => + Effect.gen(function* () { + if (request.type === MatrixCryptoNode.RequestType.KeysUpload) { + return { endpoint: yield* MatrixApi.endpoints.postKeysUploadV3(request.body), requestId: request.id, requestType: request.type } + } else if (request.type === MatrixCryptoNode.RequestType.KeysClaim) { + return { endpoint: yield* MatrixApi.endpoints.postKeysClaimV3(request.body), requestId: request.id, requestType: request.type } + } else if (request.type === MatrixCryptoNode.RequestType.KeysQuery) { + return { endpoint: yield* MatrixApi.endpoints.postKeysQueryV3(request.body), requestId: request.id, requestType: request.type } + } else if (request.type === MatrixCryptoNode.RequestType.SignatureUpload) { + const endpoint = yield* MatrixApi.endpoints.postKeysSignaturesUploadV3(request.body) + return { endpoint, requestId: request.id, requestType: request.type } + } else if (request.type === MatrixCryptoNode.RequestType.ToDevice) { + const toDevice = request as MatrixCryptoNode.ToDeviceRequest + const endpoint = yield* MatrixApi.endpoints.putSendToDeviceV3({ + body: toDevice.body, + eventType: toDevice.eventType, + transactionId: toDevice.txnId, + }) + return { endpoint, requestId: request.id, requestType: request.type } + } else if (request.type === MatrixCryptoNode.RequestType.RoomMessage) { + const roomMessage = request as MatrixCryptoNode.RoomMessageRequest + const endpoint = yield* MatrixApi.endpoints.putRoomsSendV3({ + content: request.body, + eventType: roomMessage.eventType, + roomId: yield* RoomId.make(roomMessage.roomId), + }) + return { endpoint, requestId: request.id, requestType: request.type } + } else if (request.type === MatrixCryptoNode.RequestType.KeysBackup) { + const backupVersion = yield* Effect.tryPromise({ + try: () => machine._olmMachine.getBackupKeys(), + catch: cause => new CryptoError({ cause }), + }).pipe( + Effect.map(x => x.backupVersion), + Effect.flatMap(Effect.fromNullishOr), + ) + + const endpoint = yield* MatrixApi.endpoints.putRoomKeysV3({ body: request.body, version: backupVersion }) + return { endpoint, requestId: request.id, requestType: request.type } + } else { + return yield* Effect.fail(new CryptoError({ message: `Unknown MatrixCryptoNode.RequestType ${request.type}` })) + } + }), + ).pipe(Effect.mapError(cause => new CryptoError({ cause }))) + }) + + const markRequestAsSent = Effect.fn(function* ( + machine: Machine, + requestId: string, + requestType: MatrixCryptoNode.RequestType, + response: string, + ) { + yield* Effect.tryPromise({ + try: () => machine._olmMachine.markRequestAsSent(requestId, requestType, response), + catch: cause => new CryptoError({ cause }), + }) + }) + + const sendOutgoingRequests = Effect.fn(function* (machine: Machine) { + const outgoingRequests = yield* getOutgoingRequests(machine) + + yield* Effect.forEach( + outgoingRequests, + outgoing => + api.executeRaw(outgoing.endpoint).pipe( + Effect.mapError(cause => new CryptoError({ cause })), + Effect.andThen(json => markRequestAsSent(machine, outgoing.requestId, outgoing.requestType, json)), + ), + { concurrency: 1 }, + ) + }) + + const decryptRoomEvent = Effect.fn(function* (machine: Machine, event: string, roomId: RoomId) { + const decryptedEvent = yield* Effect.tryPromise({ + try: () => machine._olmMachine.decryptRoomEvent(event, new MatrixCryptoNode.RoomId(roomId)), + catch: cause => new CryptoError({ cause }), + }) + + return decryptedEvent + }) + + return { makeMachine, receiveSyncChanges, getOutgoingRequests, sendOutgoingRequests, markRequestAsSent, decryptRoomEvent } +}) + +export const layer = Layer.effect(Crypto, makeLayer) diff --git a/packages/crypto-node/src/crypto.ts b/packages/crypto-node/src/crypto.ts new file mode 100644 index 0000000..f7cf32b --- /dev/null +++ b/packages/crypto-node/src/crypto.ts @@ -0,0 +1,46 @@ +//TODO: move this to core mxfx package +import * as MatrixCryptoNode from '@matrix-org/matrix-sdk-crypto-nodejs' +import { Context, Data, Effect, Redacted, Scope } from 'effect' +import type { MatrixApi, RoomId } from 'mxfx' + +type SyncFrame = typeof MatrixApi.endpoints.getSyncV3ResponseSchema.Type + +export class CryptoError extends Data.TaggedError('mxfx/crypto/error')<{ + readonly message?: string + readonly cause?: unknown +}> {} + +export type Machine = { + //TODO: When moving to core use a generic olmmachine here (if possible) + _olmMachine: MatrixCryptoNode.OlmMachine +} + +export type MachineOptions = { + userId: string + deviceId: string + storage: { type: 'memory' } | { type: 'sqlite'; path: string; passphrase: Redacted.Redacted } +} + +export type CryptoShape = { + //TODO: use mxfx branded userid, figure out dependency graph + makeMachine: ({ userId, deviceId, storage }: MachineOptions) => Effect.Effect + receiveSyncChanges: (machine: Machine, sync: SyncFrame) => Effect.Effect + getOutgoingRequests: (machine: Machine) => Effect.Effect< + Array<{ + endpoint: MatrixApi.endpoints.MatrixEndpoint + requestType: MatrixCryptoNode.RequestType + requestId: string + }>, + CryptoError + > + sendOutgoingRequests: (machine: Machine) => Effect.Effect + markRequestAsSent: ( + machine: Machine, + requestId: string, + requestType: MatrixCryptoNode.RequestType, + response: string, + ) => Effect.Effect + decryptRoomEvent: (machine: Machine, event: string, roomId: RoomId) => Effect.Effect //TODO: don't expose MatrixCryptoNode.DecryptedRoomEvent +} + +export class Crypto extends Context.Service()('mxfx/crypto') {} diff --git a/packages/crypto-node/src/index.ts b/packages/crypto-node/src/index.ts new file mode 100644 index 0000000..dc4d36f --- /dev/null +++ b/packages/crypto-node/src/index.ts @@ -0,0 +1,2 @@ +export * as CryptoNode from './crypto-node.ts' +export * as Crypto from './crypto.ts' diff --git a/packages/crypto-node/tsconfig.json b/packages/crypto-node/tsconfig.json new file mode 100644 index 0000000..564a599 --- /dev/null +++ b/packages/crypto-node/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src"] +} diff --git a/packages/mxfx/package.json b/packages/mxfx/package.json index 85a88c4..6093814 100644 --- a/packages/mxfx/package.json +++ b/packages/mxfx/package.json @@ -4,7 +4,8 @@ "author": "Wouter de Bruijn ", "repository": { "type": "git", - "url": "https://github.com/wouter173/mxfx.git" + "url": "https://github.com/wouter173/mxfx.git", + "directory": "packages/mxfx" }, "type": "module", "sideEffects": [], @@ -18,6 +19,7 @@ "./config": "./src/config/index.ts", "./vault": "./src/vault/index.ts", "./branded": "./src/branded/index.ts", + "./kv": "./src/kv/index.ts", ".": "./src/index.ts" }, "scripts": { @@ -26,12 +28,9 @@ "test:ui": "vitest --ui" }, "devDependencies": { - "@effect/platform-node": "4.0.0-beta.94", - "@effect/vitest": "4.0.0-beta.94", - "typescript": "^6.0.3", - "vitest": "^3.1.9" + "typescript": "^6.0.3" }, "peerDependencies": { - "effect": "4.0.0-beta.94" + "effect": "4.0.0-beta.99" } } diff --git a/packages/mxfx/src/api/endpoints/encryption/index.ts b/packages/mxfx/src/api/endpoints/encryption/index.ts new file mode 100644 index 0000000..62e949c --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/index.ts @@ -0,0 +1,5 @@ +export * from './post-keys-signatures-upload-v3.ts' +export * from './post-keys-upload-v3.ts' +export * from './post-keys-claim-v3.ts' +export * from './post-keys-query-v3.ts' +export * from './put-room-keys-v3.ts' diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-claim-v3.test.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-claim-v3.test.ts new file mode 100644 index 0000000..99938c1 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-claim-v3.test.ts @@ -0,0 +1,44 @@ +import { describe, expect, it } from '@effect/vitest' +import { Effect } from 'effect' + +import { UserId } from '../../../branded/index.ts' +import { MatrixApi } from '../../matrix-api.ts' +import { makeMockMatrixApiLayer } from '../mock-api-layer.test.ts' +import { postKeysClaimV3 } from './post-keys-claim-v3.ts' + +const mockApiResponse = { + one_time_keys: { + '@alice:example.com': { + JLAFKJWSCS: { + 'signed_curve25519:AAAAHg': { + key: 'zKbLg+NrIjpnagy+pIY6uPL4ZwEG2v+8F9lmgsnlZzs', + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'FLWxXqGbwrb8SM3Y795eB6OA8bwBcoMZFXBqnTn58AYWZSqiD45tlBVcDa2L7RwdKXebW/VzDlnfVJ+9jok1Bw', + }, + }, + }, + }, + }, + }, +} + +const mockApiRequest = { + one_time_keys: { '@alice:example.com': { JLAFKJWSCS: 'signed_curve25519' } }, + timeout: 10_000, +} + +describe('post-keys-claim-v3', () => { + it.effect('claims a one-time key', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const alice = yield* UserId.make('@alice:example.com') + const oneTimeKeys = { [alice]: { JLAFKJWSCS: 'signed_curve25519' } } + + const result = yield* postKeysClaimV3({ oneTimeKeys, timeout: 10_000 }).pipe(Effect.andThen(api.execute)) + + expect(result).toStrictEqual({ oneTimeKeys: mockApiResponse.one_time_keys }) + }).pipe(Effect.provide(makeMockMatrixApiLayer({ path: '/v3/keys/claim', response: mockApiResponse, request: mockApiRequest }))), + ) +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-claim-v3.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-claim-v3.ts new file mode 100644 index 0000000..e5e3c14 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-claim-v3.ts @@ -0,0 +1,53 @@ +import { Effect, Schema } from 'effect' +import { HttpBody } from 'effect/unstable/http' + +import { UserId } from '../../../branded/user-id.ts' +import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' +import { makeEndpoint } from '../endpoint.ts' + +const optionsSchema = Schema.Union([ + Schema.Struct({ + oneTimeKeys: Schema.Record(UserId.schema, Schema.Record(Schema.String, Schema.String)), + timeout: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)), + }), + Schema.String, +]) + +const keyObjectSchema = Schema.Struct({ + key: Schema.String, + signatures: Schema.Record(UserId.schema, Schema.Unknown), +}) + +const schema = Schema.Struct({ + oneTimeKeys: Schema.Record( + UserId.schema, + Schema.Record(Schema.String, Schema.Record(Schema.String, Schema.Union([Schema.String, keyObjectSchema]))), + ), + failures: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)), +}) + +/** + * `POST /_matrix/client/v3/keys/claim` + * + * @description + * Claims one-time keys for use in pre-key messages. + * + * The request contains the user ID, device ID and algorithm name of the keys that are required. If a key matching these requirements can + * be found, the response contains it. The returned key is a one-time key if one is available, and otherwise a fallback key. + * + * One-time keys are given out in the order that they were uploaded via /keys/upload. (All keys uploaded within a given call to + * /keys/upload are considered equivalent in this regard; no ordering is specified within them.) + * + * Servers must ensure that each one-time key is returned at most once, so when a key has been returned, no other request will ever return + * the same key. + * + * @see https://spec.matrix.org/latest/client-server-api/#post_matrixclientv3keysclaim + */ +export const postKeysClaimV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* optionsSchema.makeEffect(options).pipe( + Effect.andThen(Schema.encodeEffect(optionsSchema.pipe(encodeSnakeCaseSchema))), + Effect.andThen(body => (typeof body === 'string' ? Effect.succeed(HttpBody.text(body, 'application/json')) : HttpBody.json(body))), + ) + + return yield* makeEndpoint('POST', { auth: true, schema, body })`/v3/keys/claim` +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-query-v3.test.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-query-v3.test.ts new file mode 100644 index 0000000..c2cea32 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-query-v3.test.ts @@ -0,0 +1,108 @@ +import { describe, expect, it } from '@effect/vitest' +import { Effect } from 'effect' + +import { UserId } from '../../../branded/index.ts' +import { MatrixApi } from '../../matrix-api.ts' +import { makeMockMatrixApiLayer } from '../mock-api-layer.test.ts' +import { postKeysQueryV3 } from './post-keys-query-v3.ts' + +const mockApiResponse = { + device_keys: { + '@alice:example.com': { + JLAFKJWSCS: { + algorithms: ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'], + device_id: 'JLAFKJWSCS', + keys: { + 'curve25519:JLAFKJWSCS': '3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI', + 'ed25519:JLAFKJWSCS': 'lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI', + }, + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA', + }, + }, + unsigned: { + device_display_name: "Alice's mobile phone", + }, + user_id: '@alice:example.com', + }, + }, + }, + master_keys: { + '@alice:example.com': { + keys: { + 'ed25519:base64+master+public+key': 'base64+master+public+key', + }, + usage: ['master'], + user_id: '@alice:example.com', + }, + }, + self_signing_keys: { + '@alice:example.com': { + keys: { + 'ed25519:base64+self+signing+public+key': 'base64+self+signing+master+public+key', + }, + signatures: { + '@alice:example.com': { + 'ed25519:base64+master+public+key': 'signature+of+self+signing+key', + }, + }, + usage: ['self_signing'], + user_id: '@alice:example.com', + }, + }, + user_signing_keys: { + '@alice:example.com': { + keys: { + 'ed25519:base64+user+signing+public+key': 'base64+user+signing+master+public+key', + }, + signatures: { + '@alice:example.com': { + 'ed25519:base64+master+public+key': 'signature+of+user+signing+key', + }, + }, + usage: ['user_signing'], + user_id: '@alice:example.com', + }, + }, +} + +const mockApiRequest = { + device_keys: { + '@alice:example.com': [], + }, + timeout: 10000, +} + +describe('post-keys-quert-v3', () => { + it.effect('query a user', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const alice = yield* UserId.make('@alice:example.com') + const deviceKeys = { [alice]: [] } + + const result = yield* postKeysQueryV3({ deviceKeys, timeout: 10_000 }).pipe(Effect.andThen(api.execute)) + + expect(result.deviceKeys).toStrictEqual({ + [alice]: { + JLAFKJWSCS: { + algorithms: ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'], + deviceId: 'JLAFKJWSCS', + keys: { + 'curve25519:JLAFKJWSCS': '3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI', + 'ed25519:JLAFKJWSCS': 'lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI', + }, + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA', + }, + }, + unsigned: { deviceDisplayName: "Alice's mobile phone" }, + userId: alice, + }, + }, + }) + }).pipe(Effect.provide(makeMockMatrixApiLayer({ path: '/v3/keys/query', response: mockApiResponse, request: mockApiRequest }))), + ) +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-query-v3.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-query-v3.ts new file mode 100644 index 0000000..ccd48d4 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-query-v3.ts @@ -0,0 +1,59 @@ +import { Effect, Schema } from 'effect' +import { HttpBody } from 'effect/unstable/http' + +import { UserId } from '../../../branded/user-id.ts' +import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' +import { makeEndpoint } from '../endpoint.ts' + +const optionsSchema = Schema.Union([ + Schema.Struct({ + deviceKeys: Schema.Record(UserId.schema, Schema.Array(Schema.String)), + timeout: Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)), + }), + Schema.String, +]) + +const unsignedDeviceInfoSchema = Schema.Struct({ + deviceDisplayName: Schema.optional(Schema.String), +}) + +const deviceInformationSchema = Schema.Struct({ + userId: UserId.schema, + deviceId: Schema.String, + algorithms: Schema.Array(Schema.String), + keys: Schema.Record(Schema.String, Schema.String), + signatures: Schema.Record(UserId.schema, Schema.Record(Schema.String, Schema.String)), + unsigned: Schema.optional(unsignedDeviceInfoSchema), +}) + +const crossSigningKeySchema = Schema.Struct({ + keys: Schema.Record(Schema.String, Schema.String), + usage: Schema.Array(Schema.String), + userId: UserId.schema, + signatures: Schema.optional(Schema.Unknown), //TODO: Signatures Type +}) + +const schema = Schema.Struct({ + failures: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)), + deviceKeys: Schema.optional(Schema.Record(UserId.schema, Schema.Record(Schema.String, deviceInformationSchema))), + masterKeys: Schema.optional(Schema.Record(UserId.schema, crossSigningKeySchema)), + selfSigningKeys: Schema.optional(Schema.Record(UserId.schema, crossSigningKeySchema)), + userSigningKeys: Schema.optional(Schema.Record(UserId.schema, crossSigningKeySchema)), +}) + +/** + * `POST /_matrix/client/v3/keys/query` + * + * @description + * Returns the current devices and identity keys for the given users. + * + * @see https://spec.matrix.org/latest/client-server-api/#post_matrixclientv3keysquery + */ +export const postKeysQueryV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* optionsSchema.makeEffect(options).pipe( + Effect.andThen(Schema.encodeEffect(optionsSchema.pipe(encodeSnakeCaseSchema))), + Effect.andThen(body => (typeof body === 'string' ? Effect.succeed(HttpBody.text(body, 'application/json')) : HttpBody.json(body))), + ) + + return yield* makeEndpoint('POST', { auth: true, schema, body })`/v3/keys/query` +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-signatures-upload-v3.test.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-signatures-upload-v3.test.ts new file mode 100644 index 0000000..5fd5e31 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-signatures-upload-v3.test.ts @@ -0,0 +1,91 @@ +import { describe, expect, it } from '@effect/vitest' +import { Effect } from 'effect' + +import { UserId } from '../../../branded/index.ts' +import { MatrixApi } from '../../matrix-api.ts' +import { makeMockMatrixApiLayer } from '../mock-api-layer.test.ts' +import { postKeysSignaturesUploadV3 } from './post-keys-signatures-upload-v3.ts' + +const mockApiResponse = { + failures: { + '@alice:example.com': { + HIJKLMN: { + errcode: 'M_INVALID_SIGNATURE', + error: 'Invalid signature', + }, + }, + }, +} + +const mockApiRequest = { + '@alice:example.com': { + HIJKLMN: { + algorithms: ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'], + device_id: 'HIJKLMN', + keys: { 'curve25519:HIJKLMN': 'base64+curve25519+key', 'ed25519:HIJKLMN': 'base64+ed25519+key' }, + signatures: { + '@alice:example.com': { 'ed25519:base64+self+signing+public+key': 'base64+signature+of+HIJKLMN' }, + }, + user_id: '@alice:example.com', + }, + 'base64+master+public+key': { + keys: { 'ed25519:base64+master+public+key': 'base64+master+public+key' }, + signatures: { + '@alice:example.com': { 'ed25519:HIJKLMN': 'base64+signature+of+master+key' }, + }, + usage: ['master'], + user_id: '@alice:example.com', + }, + }, + '@bob:example.com': { + 'bobs+base64+master+public+key': { + keys: { 'ed25519:bobs+base64+master+public+key': 'bobs+base64+master+public+key' }, + signatures: { + '@alice:example.com': { 'ed25519:base64+user+signing+public+key': 'base64+signature+of+bobs+master+key' }, + }, + usage: ['master'], + user_id: '@bob:example.com', + }, + }, +} + +describe('post-keys-signatures-upload-v3', () => { + it.effect('upload a set of key signatures', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const alice = yield* UserId.make('@alice:example.com') + const bob = yield* UserId.make('@bob:example.com') + + const result = yield* postKeysSignaturesUploadV3({ + [alice]: { + HIJKLMN: { + userId: alice, + deviceId: 'HIJKLMN', + algorithms: ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'], + keys: { 'curve25519:HIJKLMN': 'base64+curve25519+key', 'ed25519:HIJKLMN': 'base64+ed25519+key' }, + signatures: { [alice]: { 'ed25519:base64+self+signing+public+key': 'base64+signature+of+HIJKLMN' } }, + }, + 'base64+master+public+key': { + userId: alice, + usage: ['master'], + keys: { 'ed25519:base64+master+public+key': 'base64+master+public+key' }, + signatures: { [alice]: { 'ed25519:HIJKLMN': 'base64+signature+of+master+key' } }, + }, + }, + [bob]: { + 'bobs+base64+master+public+key': { + userId: bob, + usage: ['master'], + keys: { 'ed25519:bobs+base64+master+public+key': 'bobs+base64+master+public+key' }, + signatures: { [alice]: { 'ed25519:base64+user+signing+public+key': 'base64+signature+of+bobs+master+key' } }, + }, + }, + }).pipe(Effect.andThen(api.execute)) + + expect(result).toStrictEqual({ failures: { [alice]: { HIJKLMN: { errcode: 'M_INVALID_SIGNATURE', error: 'Invalid signature' } } } }) + }).pipe( + Effect.provide(makeMockMatrixApiLayer({ path: '/v3/keys/signatures/upload', response: mockApiResponse, request: mockApiRequest })), + ), + ) +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-signatures-upload-v3.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-signatures-upload-v3.ts new file mode 100644 index 0000000..a76849b --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-signatures-upload-v3.ts @@ -0,0 +1,52 @@ +import { Effect, Schema } from 'effect' +import { HttpBody } from 'effect/unstable/http' + +import { UserId } from '../../../branded/user-id.ts' +import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' +import { BaseErrorSchema } from '../../schema/error.ts' +import { makeEndpoint } from '../endpoint.ts' + +const signaturesSchema = Schema.Record(UserId.schema, Schema.Record(Schema.String, Schema.String)) + +const deviceKeysSchema = Schema.Struct({ + userId: UserId.schema, + deviceId: Schema.String, + algorithms: Schema.Array(Schema.String), + keys: Schema.Record(Schema.String, Schema.String), + signatures: signaturesSchema, +}) + +const crossSigningKeySchema = Schema.Struct({ + userId: UserId.schema, + usage: Schema.Array(Schema.String), + keys: Schema.Record(Schema.String, Schema.String), + signatures: signaturesSchema, +}) + +const optionsSchema = Schema.Union([ + Schema.Record(UserId.schema, Schema.Record(Schema.String, Schema.Union([deviceKeysSchema, crossSigningKeySchema, Schema.Unknown]))), + Schema.String, +]) + +const schema = Schema.Struct({ + failures: Schema.optional(Schema.Record(UserId.schema, Schema.Record(Schema.String, BaseErrorSchema))), +}) + +/** + * `POST /_matrix/client/v3/keys/signatures/upload` + * + * @description + * Publishes cross-signing signatures for the user. + * + * The signed JSON object must match the key previously uploaded or retrieved for the given key ID, with the exception of the signatures property, which contains the new signature(s) to add. + * + * @see https://spec.matrix.org/unstable/client-server-api/#post_matrixclientv3keyssignaturesupload + */ +export const postKeysSignaturesUploadV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* optionsSchema.makeEffect(options).pipe( + Effect.andThen(Schema.encodeUnknownEffect(optionsSchema.pipe(encodeSnakeCaseSchema))), + Effect.andThen(body => (typeof body === 'string' ? Effect.succeed(HttpBody.text(body, 'application/json')) : HttpBody.json(body))), + ) + + return yield* makeEndpoint('POST', { auth: true, schema, body })`/v3/keys/signatures/upload` +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-upload-v3.test.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-upload-v3.test.ts new file mode 100644 index 0000000..956b0b3 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-upload-v3.test.ts @@ -0,0 +1,118 @@ +import { describe, expect, it } from '@effect/vitest' +import { Effect } from 'effect' + +import { UserId } from '../../../branded/index.ts' +import { MatrixApi } from '../../matrix-api.ts' +import { makeMockMatrixApiLayer } from '../mock-api-layer.test.ts' +import { postKeysUploadV3 } from './post-keys-upload-v3.ts' + +const mockApiResponse = { + one_time_key_counts: { + signed_curve25519: 20, + }, +} + +const mockApiRequest = { + device_keys: { + algorithms: ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'], + device_id: 'JLAFKJWSCS', + keys: { + 'curve25519:JLAFKJWSCS': '3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI', + 'ed25519:JLAFKJWSCS': 'lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI', + }, + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA', + }, + }, + user_id: '@alice:example.com', + }, + fallback_keys: { + 'signed_curve25519:AAAAGj': { + fallback: true, + key: 'zKbLg+NrIjpnagy+pIY6uPL4ZwEG2v+8F9lmgsnlZzs', + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'FLWxXqGbwrb8SM3Y795eB6OA8bwBcoMZFXBqnTn58AYWZSqiD45tlBVcDa2L7RwdKXebW/VzDlnfVJ+9jok1Bw', + }, + }, + }, + }, + one_time_keys: { + 'signed_curve25519:AAAAHQ': { + key: 'j3fR3HemM16M7CWhoI4Sk5ZsdmdfQHsKL1xuSft6MSw', + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'IQeCEPb9HFk217cU9kw9EOiusC6kMIkoIRnbnfOh5Oc63S1ghgyjShBGpu34blQomoalCyXWyhaaT3MrLZYQAA', + }, + }, + }, + 'signed_curve25519:AAAAHg': { + key: 'zKbLg+NrIjpnagy+pIY6uPL4ZwEG2v+8F9lmgsnlZzs', + signatures: { + '@alice:example.com': { + 'ed25519:JLAFKJWSCS': 'FLWxXqGbwrb8SM3Y795eB6OA8bwBcoMZFXBqnTn58AYWZSqiD45tlBVcDa2L7RwdKXebW/VzDlnfVJ+9jok1Bw', + }, + }, + }, + }, +} + +describe('post-keys-upload-v3', () => { + it.effect('upload a set of keys, string body', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const result = yield* postKeysUploadV3(JSON.stringify(mockApiRequest)).pipe(Effect.andThen(api.executeRaw)) + + expect(result).toStrictEqual(JSON.stringify(mockApiResponse)) + }).pipe(Effect.provide(makeMockMatrixApiLayer({ path: '/v3/keys/upload', response: mockApiResponse, request: mockApiRequest }))), + ) + it.effect('upload a set of keys, typed body', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const alice = yield* UserId.make('@alice:example.com') + + const result = yield* postKeysUploadV3({ + deviceKeys: { + userId: alice, + deviceId: 'JLAFKJWSCS', + algorithms: ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'], + keys: { + 'curve25519:JLAFKJWSCS': '3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI', + 'ed25519:JLAFKJWSCS': 'lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI', + }, + signatures: { + [alice]: { 'ed25519:JLAFKJWSCS': 'dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA' }, + }, + }, + fallbackKeys: { + 'signed_curve25519:AAAAGj': { + fallback: true, + key: 'zKbLg+NrIjpnagy+pIY6uPL4ZwEG2v+8F9lmgsnlZzs', + signatures: { + [alice]: { 'ed25519:JLAFKJWSCS': 'FLWxXqGbwrb8SM3Y795eB6OA8bwBcoMZFXBqnTn58AYWZSqiD45tlBVcDa2L7RwdKXebW/VzDlnfVJ+9jok1Bw' }, + }, + }, + }, + oneTimeKeys: { + 'signed_curve25519:AAAAHQ': { + key: 'j3fR3HemM16M7CWhoI4Sk5ZsdmdfQHsKL1xuSft6MSw', + signatures: { + [alice]: { 'ed25519:JLAFKJWSCS': 'IQeCEPb9HFk217cU9kw9EOiusC6kMIkoIRnbnfOh5Oc63S1ghgyjShBGpu34blQomoalCyXWyhaaT3MrLZYQAA' }, + }, + }, + 'signed_curve25519:AAAAHg': { + key: 'zKbLg+NrIjpnagy+pIY6uPL4ZwEG2v+8F9lmgsnlZzs', + signatures: { + [alice]: { 'ed25519:JLAFKJWSCS': 'FLWxXqGbwrb8SM3Y795eB6OA8bwBcoMZFXBqnTn58AYWZSqiD45tlBVcDa2L7RwdKXebW/VzDlnfVJ+9jok1Bw' }, + }, + }, + }, + }).pipe(Effect.andThen(api.execute)) + + expect(result).toStrictEqual({ oneTimeKeyCounts: { signed_curve25519: 20 } }) + }).pipe(Effect.provide(makeMockMatrixApiLayer({ path: '/v3/keys/upload', response: mockApiResponse, request: mockApiRequest }))), + ) +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/post-keys-upload-v3.ts b/packages/mxfx/src/api/endpoints/encryption/post-keys-upload-v3.ts new file mode 100644 index 0000000..ca6604f --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/post-keys-upload-v3.ts @@ -0,0 +1,51 @@ +import { Effect, Schema } from 'effect' +import { HttpBody } from 'effect/unstable/http' + +import { UserId } from '../../../branded/user-id.ts' +import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' +import { makeEndpoint } from '../endpoint.ts' + +const deviceKeysSchema = Schema.Struct({ + userId: UserId.schema, + deviceId: Schema.String, + algorithms: Schema.Array(Schema.String), + keys: Schema.Record(Schema.String, Schema.String), + signatures: Schema.Record(UserId.schema, Schema.Record(Schema.String, Schema.String)), +}) + +const keyObjectSchema = Schema.Struct({ + key: Schema.String, + signatures: Schema.Record(UserId.schema, Schema.Unknown), +}) + +const optionsSchema = Schema.Union([ + Schema.Struct({ + deviceKeys: Schema.optional(deviceKeysSchema), + fallbackKeys: Schema.optional( + Schema.Record(Schema.String, Schema.Union([Schema.String, keyObjectSchema.pipe(Schema.fieldsAssign({ fallback: Schema.Boolean }))])), + ), + oneTimeKeys: Schema.optional(Schema.Record(Schema.String, Schema.Union([Schema.String, keyObjectSchema]))), + }), + Schema.String, +]) + +const schema = Schema.Struct({ + oneTimeKeyCounts: Schema.Record(Schema.String, Schema.Number), +}) + +/** + * `POST /_matrix/client/v3/keys/upload` + * + * @description + * Publishes end-to-end encryption keys for the device. + * + * @see https://spec.matrix.org/latest/client-server-api/#post_matrixclientv3keysupload + */ +export const postKeysUploadV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* optionsSchema.makeEffect(options).pipe( + Effect.andThen(Schema.encodeUnknownEffect(optionsSchema.pipe(encodeSnakeCaseSchema))), + Effect.andThen(body => (typeof body === 'string' ? Effect.succeed(HttpBody.text(body, 'application/json')) : HttpBody.json(body))), + ) + + return yield* makeEndpoint('POST', { auth: true, schema, body })`/v3/keys/upload` +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/put-room-keys-v3.test.ts b/packages/mxfx/src/api/endpoints/encryption/put-room-keys-v3.test.ts new file mode 100644 index 0000000..3e68a87 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/put-room-keys-v3.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it } from '@effect/vitest' +import { Effect } from 'effect' + +import { RoomId } from '../../../branded/index.ts' +import { MatrixApi } from '../../matrix-api.ts' +import { makeMockMatrixApiLayer } from '../mock-api-layer.test.ts' +import { putRoomKeysV3 } from './put-room-keys-v3.ts' + +const mockApiResponse = { + count: 10, + etag: 'abcdefg', +} + +const mockApiRequest = { + rooms: { + '!room:example.org': { + sessions: { + sessionid1: { + first_message_index: 1, + forwarded_count: 0, + is_verified: true, + session_data: { + ciphertext: 'base64+ciphertext+of+JSON+data', + ephemeral: 'base64+ephemeral+key', + mac: 'base64+mac+of+ciphertext', + }, + }, + }, + }, + }, +} + +describe('post-keys-claim-v3', () => { + it.effect('claims a one-time key', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const room = yield* RoomId.make('!room:example.org') + + const result = yield* putRoomKeysV3({ + version: '1', + body: { + rooms: { + [room]: { + sessions: { + sessionid1: { + firstMessageIndex: 1, + forwardedCount: 0, + isVerified: true, + sessionData: { + ciphertext: 'base64+ciphertext+of+JSON+data', + ephemeral: 'base64+ephemeral+key', + mac: 'base64+mac+of+ciphertext', + }, + }, + }, + }, + }, + }, + }).pipe(Effect.andThen(api.execute)) + + expect(result).toStrictEqual({ count: 10, etag: 'abcdefg' }) + }).pipe(Effect.provide(makeMockMatrixApiLayer({ path: '/v3/room_keys/keys', response: mockApiResponse, request: mockApiRequest }))), + ) +}) diff --git a/packages/mxfx/src/api/endpoints/encryption/put-room-keys-v3.ts b/packages/mxfx/src/api/endpoints/encryption/put-room-keys-v3.ts new file mode 100644 index 0000000..8bf9cae --- /dev/null +++ b/packages/mxfx/src/api/endpoints/encryption/put-room-keys-v3.ts @@ -0,0 +1,46 @@ +import { Effect, Schema } from 'effect' +import { HttpBody } from 'effect/unstable/http' + +import { RoomId } from '../../../branded/room-id.ts' +import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' +import { makeEndpoint } from '../endpoint.ts' + +const keyBackupDataSchema = Schema.Struct({ + firstMessageIndex: Schema.Number, + forwardedCount: Schema.Number, + isVerified: Schema.Boolean, + sessionData: Schema.Unknown, +}) + +const roomKeyBackupSchema = Schema.Struct({ + sessions: Schema.Record(Schema.String, keyBackupDataSchema), +}) + +const optionsSchema = Schema.Struct({ + version: Schema.String, + body: Schema.Union([Schema.Struct({ rooms: Schema.Record(RoomId.schema, roomKeyBackupSchema) }), Schema.String]), +}) + +const schema = Schema.Struct({ + count: Schema.Number, + etag: Schema.String, +}) + +/** + * `PUT /_matrix/client/v3/room_keys/keys` + * + * @description + * Store several keys in the backup. + * + * @see https://spec.matrix.org/unstable/client-server-api/#put_matrixclientv3room_keyskeys + */ +export const putRoomKeysV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* optionsSchema.makeEffect(options).pipe( + Effect.andThen(Schema.encodeUnknownEffect(optionsSchema.pipe(encodeSnakeCaseSchema))), + Effect.andThen(({ body }) => + typeof body === 'string' ? Effect.succeed(HttpBody.text(body, 'application/json')) : HttpBody.json(body), + ), + ) + + return yield* makeEndpoint('PUT', { auth: true, schema, body, params: { version: options.version } })`/v3/room_keys/keys` +}) diff --git a/packages/mxfx/src/api/endpoints/endpoint.ts b/packages/mxfx/src/api/endpoints/endpoint.ts index 5e92320..4ee6db2 100644 --- a/packages/mxfx/src/api/endpoints/endpoint.ts +++ b/packages/mxfx/src/api/endpoints/endpoint.ts @@ -3,7 +3,7 @@ import { HttpBody, HttpClientRequest, HttpClientResponse, UrlParams } from 'effe import { encodeSnakeCaseSchema } from '../schema/encode-case.ts' -export type MatrixEndpoint = { +export type MatrixEndpoint = { path: typeof pathBrandSchema.Type auth: boolean params?: UrlParams.Input diff --git a/packages/mxfx/src/api/endpoints/index.ts b/packages/mxfx/src/api/endpoints/index.ts index ac82c3f..7985e5d 100644 --- a/packages/mxfx/src/api/endpoints/index.ts +++ b/packages/mxfx/src/api/endpoints/index.ts @@ -1,3 +1,5 @@ +export * from './endpoint.ts' + export * from './discovery/index.ts' export * from './capabilities/index.ts' export * from './auth/index.ts' @@ -6,3 +8,5 @@ export * from './sync/index.ts' export * from './profile/index.ts' export * from './rooms/index.ts' export * from './account/index.ts' +export * from './encryption/index.ts' +export * from './to-device/index.ts' diff --git a/packages/mxfx/src/api/endpoints/mock-api-layer.test.ts b/packages/mxfx/src/api/endpoints/mock-api-layer.test.ts new file mode 100644 index 0000000..af7332f --- /dev/null +++ b/packages/mxfx/src/api/endpoints/mock-api-layer.test.ts @@ -0,0 +1,39 @@ +import { expect } from '@effect/vitest' +import { Effect, Layer, Schema } from 'effect' +import { HttpClient, HttpClientResponse } from 'effect/unstable/http' + +import { ServerName } from '../../branded/server-name.ts' +import { MatrixApi, MatrixConfig, MatrixAuth } from '../../index.ts' + +export const makeMockMatrixApiLayer = ({ + path, + response, + request: expectedRequest, +}: { + path?: string + response: unknown + request: unknown +}) => { + const res = new Response(JSON.stringify(response), { status: 200, headers: { 'content-type': 'application/json' } }) + + const serverName = Schema.decodeSync(ServerName.schema)('example.com') + const httpClient = HttpClient.make((request, url) => + Effect.sync(() => { + expect(url.pathname).toBe(`/_matrix/client${path}`) + + if (request.body._tag !== 'Uint8Array') throw new Error('Expected a JSON request body') + + expect(JSON.parse(new TextDecoder().decode(request.body.body))).toStrictEqual(expectedRequest) + + return HttpClientResponse.fromWeb(request, res) + }), + ) + + return MatrixApi.layer.pipe( + Layer.provide([ + Layer.succeed(HttpClient.HttpClient, httpClient), + Layer.succeed(MatrixConfig.MatrixConfig, { serverName, baseUrl: 'https://matrix.example.com' }), + Layer.succeed(MatrixAuth.MatrixAuth, { getAccessToken: () => Effect.succeed({ token: 'test-access-token' }) }), + ]), + ) +} diff --git a/packages/mxfx/src/api/endpoints/rooms/put-rooms-send-v3.ts b/packages/mxfx/src/api/endpoints/rooms/put-rooms-send-v3.ts index 99bff47..381de90 100644 --- a/packages/mxfx/src/api/endpoints/rooms/put-rooms-send-v3.ts +++ b/packages/mxfx/src/api/endpoints/rooms/put-rooms-send-v3.ts @@ -38,6 +38,11 @@ const optionsSchema = Schema.Union([ }), ]), }), + Schema.Struct({ + ...commonOptionsSchema.fields, + eventType: Schema.String, + content: Schema.String, + }), ]) /** @@ -52,13 +57,12 @@ const optionsSchema = Schema.Union([ * * @see https://spec.matrix.org/v1.17/client-server-api/#put_matrixclientv3roomsroomidsendeventtypetxnid */ -export const putRoomsSendV3 = (options: typeof optionsSchema.Type) => - Effect.gen(function* () { - const body = yield* Schema.encodeEffect(optionsSchema.pipe(encodeSnakeCaseSchema))(options).pipe( - Effect.andThen(({ content }) => HttpBody.json(content)), - ) +export const putRoomsSendV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* Schema.encodeEffect(optionsSchema.pipe(encodeSnakeCaseSchema))(options).pipe( + Effect.andThen(({ content }) => HttpBody.json(content)), + ) - const transactionId = options.transactionId ? options.transactionId : yield* Random.nextIntBetween(1, 10000000) // TODO: used be uuidv4 but was removed from random module into crypto, but haven't bothered to check how possible it is to DI anything here bc crypto gotta be injected + const transactionId = options.transactionId ? options.transactionId : yield* Random.nextIntBetween(1, 10000000) // TODO: used be uuidv4 but was removed from random module into crypto, but haven't bothered to check how possible it is to DI anything here bc crypto gotta be injected - return yield* makeEndpoint('PUT', { auth: true, schema, body })`/v3/rooms/${options.roomId}/send/${options.eventType}/${transactionId}` - }) + return yield* makeEndpoint('PUT', { auth: true, schema, body })`/v3/rooms/${options.roomId}/send/${options.eventType}/${transactionId}` +}) diff --git a/packages/mxfx/src/api/endpoints/sync/get-sync-v3.test.ts b/packages/mxfx/src/api/endpoints/sync/get-sync-v3.test.ts index feeb21a..fc2313a 100644 --- a/packages/mxfx/src/api/endpoints/sync/get-sync-v3.test.ts +++ b/packages/mxfx/src/api/endpoints/sync/get-sync-v3.test.ts @@ -11,26 +11,25 @@ describe('getSyncV3ResponseSchema', () => { const schema = getSyncV3ResponseSchema.pipe(encodeSnakeCaseSchema) const payload = { + next_batch: 's72595_4483_1934', account_data: { events: [{ type: 'm.tag', content: { tags: { 'm.favourite': { order: 0.5 } } } }], }, - device_lists: { changed: ['@alice:example.org'], left: [] }, - device_one_time_keys_count: { signed_curve25519: 42 }, - next_batch: 's72595_4483_1934', presence: { events: [{ type: 'm.presence', sender: '@alice:example.org', content: { presence: 'online' } }], }, + + device_lists: { changed: ['@alice:example.org'], left: [] }, + device_unused_fallback_key_types: ['signed_curve25519'], + device_one_time_keys_count: { signed_curve25519: 42 }, + to_device: { events: [{ type: 'm.room_key', sender: '@alice:example.org', content: { algorithm: 'm.megolm.v1.aes-sha2' } }] }, + rooms: { invite: { '!inviteroom:example.org': { invite_state: { events: [ - { - type: 'm.room.member', - content: { membership: 'invite' }, - sender: '@alice:example.org', - state_key: '@bob:example.org', - }, + { type: 'm.room.member', content: { membership: 'invite' }, sender: '@alice:example.org', state_key: '@bob:example.org' }, ], }, }, @@ -38,9 +37,7 @@ describe('getSyncV3ResponseSchema', () => { join: { '!joinedroom:example.org': { account_data: { events: [{ type: 'm.fully_read', content: { event_id: '$e1' } }] }, - ephemeral: { - events: [{ type: 'm.typing', content: { user_ids: ['@alice:example.org'] } }], - }, + ephemeral: { events: [{ type: 'm.typing', content: { user_ids: ['@alice:example.org'] } }] }, state: { events: [ { @@ -176,19 +173,13 @@ describe('getSyncV3ResponseSchema', () => { }, }, }, - to_device: { - events: [ - { - type: 'm.room_key', - sender: '@alice:example.org', - content: { algorithm: 'm.megolm.v1.aes-sha2' }, - }, - ], - }, } const decoded = yield* Schema.decodeUnknownEffect(schema)(payload) + expect(decoded.deviceLists).toStrictEqual({ changed: ['@alice:example.org'], left: [] }) + expect(decoded.deviceUnusedFallbackKeyTypes).toStrictEqual(['signed_curve25519']) + expect(decoded.deviceOneTimeKeysCount).toStrictEqual({ signed_curve25519: 42 }) expect(decoded.nextBatch).toBe('s72595_4483_1934') expect(decoded.rooms?.join?.[yield* RoomId.make('!joinedroom:example.org')]?.timeline?.events?.[0]).toMatchObject({ eventId: '$msg1', diff --git a/packages/mxfx/src/api/endpoints/sync/get-sync-v3.ts b/packages/mxfx/src/api/endpoints/sync/get-sync-v3.ts index 8d619f6..dea1305 100644 --- a/packages/mxfx/src/api/endpoints/sync/get-sync-v3.ts +++ b/packages/mxfx/src/api/endpoints/sync/get-sync-v3.ts @@ -1,6 +1,6 @@ import { Effect, Schema } from 'effect' -import { EventId, RoomId } from '../../../branded/index.ts' +import { EventId, RoomId, UserId } from '../../../branded/index.ts' import { baseEvent, strippedStateEvent, filterSchema } from '../../../schema/index.ts' import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' import { AccountData, StateSchema, Timeline } from '../../schema/sync.ts' @@ -19,11 +19,20 @@ const optionsSchema = Schema.Struct({ //TODO: don't export this from here, it's noy only used in this endpoint export const getSyncV3ResponseSchema = Schema.Struct({ - accountData: Schema.optional(AccountData), - deviceLists: Schema.optional(Schema.Any), //TODO - deviceOneTimeKeysCount: Schema.optional(Schema.Record(Schema.String, Schema.Number)), nextBatch: Schema.String, + accountData: Schema.optional(AccountData), presence: Schema.optional(Schema.Struct({ events: Schema.Array(baseEvent) })), + + deviceLists: Schema.optional( + Schema.Struct({ + changed: Schema.optional(Schema.Array(UserId.schema)), + left: Schema.optional(Schema.Array(UserId.schema)), + }), + ), + deviceUnusedFallbackKeyTypes: Schema.optional(Schema.Array(Schema.String)), + deviceOneTimeKeysCount: Schema.optional(Schema.Record(Schema.String, Schema.Number.check(Schema.isGreaterThanOrEqualTo(0)))), + toDevice: Schema.optional(Schema.Struct({ events: Schema.Array(baseEvent) })), + rooms: Schema.optional( Schema.Struct({ invite: Schema.optional( @@ -89,7 +98,6 @@ export const getSyncV3ResponseSchema = Schema.Struct({ ), //TODO }), ), - toDevice: Schema.optional(Schema.Struct({ events: Schema.Array(baseEvent) })), }) const schema = getSyncV3ResponseSchema diff --git a/packages/mxfx/src/api/endpoints/to-device/index.ts b/packages/mxfx/src/api/endpoints/to-device/index.ts new file mode 100644 index 0000000..00058c9 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/to-device/index.ts @@ -0,0 +1 @@ +export * from './put-send-to-device-v3.ts' diff --git a/packages/mxfx/src/api/endpoints/to-device/put-send-to-device-v3.test.ts b/packages/mxfx/src/api/endpoints/to-device/put-send-to-device-v3.test.ts new file mode 100644 index 0000000..defc189 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/to-device/put-send-to-device-v3.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from '@effect/vitest' +import { Effect } from 'effect' + +import { UserId } from '../../../branded/index.ts' +import { MatrixApi } from '../../matrix-api.ts' +import { makeMockMatrixApiLayer } from '../mock-api-layer.test.ts' +import { putSendToDeviceV3 } from './put-send-to-device-v3.ts' + +const mockApiResponse = {} +const mockApiRequest = { messages: { '@alice:example.com': { TLLBEANAAG: { example_content_key: 'value' } } } } + +describe('put-send-to-device-v3', () => { + it.effect('send-to-device', () => + Effect.gen(function* () { + const api = yield* MatrixApi + + const alice = yield* UserId.make('@alice:example.com') + + const result = yield* putSendToDeviceV3({ + eventType: 'message-type', + transactionId: 'transaction-id', + body: { messages: { [alice]: { TLLBEANAAG: { example_content_key: 'value' } } } }, + }).pipe(Effect.andThen(api.execute)) + + expect(result).toStrictEqual({}) + }).pipe( + Effect.provide( + makeMockMatrixApiLayer({ + path: '/v3/sendToDevice/message-type/transaction-id', + response: mockApiResponse, + request: mockApiRequest, + }), + ), + ), + ) +}) diff --git a/packages/mxfx/src/api/endpoints/to-device/put-send-to-device-v3.ts b/packages/mxfx/src/api/endpoints/to-device/put-send-to-device-v3.ts new file mode 100644 index 0000000..e043a34 --- /dev/null +++ b/packages/mxfx/src/api/endpoints/to-device/put-send-to-device-v3.ts @@ -0,0 +1,37 @@ +import { Effect, Random, Schema } from 'effect' +import { HttpBody } from 'effect/unstable/http' + +import { UserId } from '../../../branded/user-id.ts' +import { encodeSnakeCaseSchema } from '../../schema/encode-case.ts' +import { makeEndpoint } from '../endpoint.ts' + +const optionsSchema = Schema.Struct({ + eventType: Schema.String, + transactionId: Schema.optional(Schema.String), + body: Schema.Union([ + Schema.Struct({ messages: Schema.Record(UserId.schema, Schema.Record(Schema.String, Schema.Unknown)) }), //TODO: Schema.Unknown should be eventContent + Schema.String, + ]), +}) + +const schema = Schema.Struct({}) + +/** + * `PUT /_matrix/client/v3/sendToDevice/{eventType}/{txnId}` + * + * @description + * This endpoint is used to send send-to-device events to a set of client devices. + * + * @see https://spec.matrix.org/latest/client-server-api/#put_matrixclientv3sendtodeviceeventtypetxnid + */ +export const putSendToDeviceV3 = Effect.fn(function* (options: typeof optionsSchema.Type) { + const body = yield* Schema.encodeEffect(optionsSchema.pipe(encodeSnakeCaseSchema))(options).pipe( + Effect.andThen(({ body }) => + typeof body === 'string' ? Effect.succeed(HttpBody.text(body, 'application/json')) : HttpBody.json(body), + ), + ) + + const transactionId = options.transactionId ? options.transactionId : yield* Random.nextIntBetween(1, 10000000) // TODO: used be uuidv4 but was removed from random module into crypto, but haven't bothered to check how possible it is to DI anything here bc crypto gotta be injected + + return yield* makeEndpoint('PUT', { auth: true, schema, body })`/v3/sendToDevice/${options.eventType}/${transactionId}` +}) diff --git a/packages/mxfx/src/api/http-client/base-http-client.ts b/packages/mxfx/src/api/http-client/base-http-client.ts index a0d7dd4..abc1a60 100644 --- a/packages/mxfx/src/api/http-client/base-http-client.ts +++ b/packages/mxfx/src/api/http-client/base-http-client.ts @@ -2,7 +2,7 @@ import { Effect, Layer, Schema, Context } from 'effect' import { HttpClient } from 'effect/unstable/http' import { ApiHttpError } from '../error.ts' -import { MatrixApiErrorContentSchema } from '../schema/error.ts' +import { matrixApiErrorContentSchema } from '../schema/error.ts' import { withLogging } from './logging.ts' const make = Effect.gen(function* () { @@ -13,7 +13,7 @@ const make = Effect.gen(function* () { res => res.status >= 200 && res.status < 400, res => res.json.pipe( - Effect.andThen(Schema.decodeUnknownEffect(MatrixApiErrorContentSchema)), + Effect.andThen(Schema.decodeUnknownEffect(matrixApiErrorContentSchema)), Effect.catch(err => Effect.logError(`Failed to decode MatrixApiErrorContent: ${err}`).pipe( Effect.as({ errcode: 'M_UNKNOWN' as const, error: 'Unknown error' }), diff --git a/packages/mxfx/src/api/http-client/logging.ts b/packages/mxfx/src/api/http-client/logging.ts index 0fea1e0..edc812c 100644 --- a/packages/mxfx/src/api/http-client/logging.ts +++ b/packages/mxfx/src/api/http-client/logging.ts @@ -1,17 +1,17 @@ import { Effect, Result } from 'effect' -import { HttpClient, UrlParams } from 'effect/unstable/http' +import { HttpClient, Url } from 'effect/unstable/http' export const withLogging = (httpClient: HttpClient.HttpClient.With): HttpClient.HttpClient.With => httpClient.pipe( HttpClient.tapRequest(req => Effect.logDebug( - `[API] => ${req.method} ${Result.getOrElse(UrlParams.makeUrl(req.url, req.urlParams, req.hash.valueOrUndefined), () => '')}`, + `[API] => ${req.method} ${Result.getOrElse(Url.make(req.url, req.urlParams, req.hash.valueOrUndefined), () => '')}`, req.body, ), ), HttpClient.tap(res => Effect.logDebug( - `[API] <= ${res.request.method} ${Result.getOrElse(UrlParams.makeUrl(res.request.url, res.request.urlParams, res.request.hash.valueOrUndefined), () => '')} ${res.status}`, + `[API] <= ${res.request.method} ${Result.getOrElse(Url.make(res.request.url, res.request.urlParams, res.request.hash.valueOrUndefined), () => '')} ${res.status}`, ), ), ) diff --git a/packages/mxfx/src/api/index.ts b/packages/mxfx/src/api/index.ts index 047f3af..3e2bf46 100644 --- a/packages/mxfx/src/api/index.ts +++ b/packages/mxfx/src/api/index.ts @@ -1,3 +1,4 @@ export * from './matrix-api.ts' export * from './http-client/index.ts' export * as endpoints from './endpoints/index.ts' +export * from './schema/index.ts' diff --git a/packages/mxfx/src/api/matrix-api.ts b/packages/mxfx/src/api/matrix-api.ts index 1b4331c..487519b 100644 --- a/packages/mxfx/src/api/matrix-api.ts +++ b/packages/mxfx/src/api/matrix-api.ts @@ -15,6 +15,14 @@ const make = Effect.gen(function* () { const request = yield* makeHttpRequest(endpoint) return yield* client.execute(request).pipe(Effect.andThen(parseHttpResponse(endpoint))) }), + executeRaw: (endpoint: MatrixEndpoint) => + Effect.gen(function* () { + const client = endpoint.auth ? authHttpClient : apiHttpClient + const request = yield* makeHttpRequest(endpoint) + const response = yield* client.execute(request) + + return yield* response.text + }), } }) diff --git a/packages/mxfx/src/api/schema/error.ts b/packages/mxfx/src/api/schema/error.ts index ec8ea3a..33f13e6 100644 --- a/packages/mxfx/src/api/schema/error.ts +++ b/packages/mxfx/src/api/schema/error.ts @@ -61,7 +61,7 @@ export const UnknownErrorSchema = Schema.Struct({ errcode: Schema.Literal('M_UNKNOWN'), }) -export const MatrixApiErrorContentSchema = Schema.Union([ +export const matrixApiErrorContentSchema = Schema.Union([ ForbiddenErrorSchema, UnknownTokenErrorSchema, MissingTokenErrorSchema, @@ -75,4 +75,4 @@ export const MatrixApiErrorContentSchema = Schema.Union([ UnknownErrorSchema, ]) -export type MatrixApiErrorContent = typeof MatrixApiErrorContentSchema.Type +export type MatrixApiErrorContent = typeof matrixApiErrorContentSchema.Type diff --git a/packages/mxfx/src/auth/auth-legacy-token.ts b/packages/mxfx/src/auth/auth-access-token.ts similarity index 91% rename from packages/mxfx/src/auth/auth-legacy-token.ts rename to packages/mxfx/src/auth/auth-access-token.ts index e0981cf..ae3b630 100644 --- a/packages/mxfx/src/auth/auth-legacy-token.ts +++ b/packages/mxfx/src/auth/auth-access-token.ts @@ -2,7 +2,7 @@ import { Config, Effect, Layer } from 'effect' import { MatrixAuth } from './auth.ts' -export const layerLegacyConfig = ( +export const layerAccessToken = ( optsConfig: Config.Wrap<{ accessToken: string }>, diff --git a/packages/mxfx/src/auth/index.ts b/packages/mxfx/src/auth/index.ts index 475397b..afb3b9b 100644 --- a/packages/mxfx/src/auth/index.ts +++ b/packages/mxfx/src/auth/index.ts @@ -1,3 +1,3 @@ export * from './auth.ts' export * from './error.ts' -export * from './auth-legacy-token.ts' +export * from './auth-access-token.ts' diff --git a/packages/mxfx/src/client/client.ts b/packages/mxfx/src/client/client.ts index e75e063..de2b6a2 100644 --- a/packages/mxfx/src/client/client.ts +++ b/packages/mxfx/src/client/client.ts @@ -2,19 +2,17 @@ import { Effect, Layer, Context, Option, PubSub, Duration, Stream } from 'effect import { endpoints, MatrixApi } from '../api/index.ts' import type { RoomId } from '../branded/index.ts' -import { Store } from '../store/index.ts' -import { Reducers } from './sync/reducer.ts' +import { Kv } from '../kv/index.ts' const make = Effect.gen(function* () { const matrixApi = yield* MatrixApi - const reducers = yield* Reducers - const store = yield* Store + const kv = yield* Kv const syncHub = yield* PubSub.unbounded() const syncStream = Stream.fromPubSub(syncHub) - const syncOnce = store.getNextBatch().pipe( + const syncOnce = kv.getString('syncToken').pipe( Effect.flatMap(nextBatch => endpoints .getSyncV3({ @@ -41,7 +39,7 @@ const make = Effect.gen(function* () { .pipe( Effect.andThen(matrixApi.execute), Effect.tap(syncResponse => PubSub.publish(syncHub, syncResponse)), - Effect.tap(syncResponse => Effect.forEach(reducers, reducer => reducer.reduce(syncResponse))), + Effect.andThen(syncResponse => kv.set('syncToken', syncResponse.nextBatch)), ), ), ) @@ -72,4 +70,4 @@ export class MatrixClient extends Context.Service< } >()('mxfx/client') {} -export const layerMatrixClient = Layer.effect(MatrixClient, make).pipe(Layer.provideMerge(Reducers.layer)) +export const layerMatrixClient = Layer.effect(MatrixClient, make) diff --git a/packages/mxfx/src/client/sync/next-batch-reducer.ts b/packages/mxfx/src/client/sync/next-batch-reducer.ts deleted file mode 100644 index a4e8b8c..0000000 --- a/packages/mxfx/src/client/sync/next-batch-reducer.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Effect } from 'effect' - -import { Store } from '../../store/index.ts' -import type { ReducerShape } from './reducer.ts' - -export const nextBatchReducer: ReducerShape = { - reduce: sync => - Effect.gen(function* () { - const store = yield* Store - yield* store.setNextBatch(sync.nextBatch) - }), -} diff --git a/packages/mxfx/src/client/sync/reducer.ts b/packages/mxfx/src/client/sync/reducer.ts deleted file mode 100644 index 49daeb1..0000000 --- a/packages/mxfx/src/client/sync/reducer.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Context, Data, Layer, type Effect } from 'effect' - -import type { getSyncV3ResponseSchema } from '../../api/endpoints/index.ts' -import { nextBatchReducer } from './next-batch-reducer.ts' -import { roomStateReducer } from './room-state-reducer.ts' -import { roomTimelineReducer } from './room-timeline-reducer.ts' - -export class ReduceError extends Data.TaggedError('mxfx/ReduceError')<{ - message: string - cause?: unknown -}> {} - -export type ReducerShape = { - reduce: (sync: typeof getSyncV3ResponseSchema.Type) => Effect.Effect -} - -export class Reducers extends Context.Service>()('mxfx/client/reducers') { - static layer = Layer.succeed(Reducers, [roomStateReducer, nextBatchReducer, roomTimelineReducer]) -} diff --git a/packages/mxfx/src/client/sync/room-state-reducer.ts b/packages/mxfx/src/client/sync/room-state-reducer.ts deleted file mode 100644 index c70d760..0000000 --- a/packages/mxfx/src/client/sync/room-state-reducer.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Effect } from 'effect' - -import { Store } from '../../store/index.ts' -import type { ReducerShape } from './reducer.ts' - -// TODO extract to helpers or somn like it -export const objectEntries = >(obj: O) => - Object.entries(obj) as { - [K in keyof O]-?: K extends string ? [K, O[K]] : never - }[keyof O][] - -// TODO: this room state reducer only supports useStateAfter and joined rooms -export const roomStateReducer: ReducerShape = { - reduce: sync => - Effect.gen(function* () { - if (!sync.rooms?.join) return Effect.void - const store = yield* Store - - for (const [roomId, room] of objectEntries(sync.rooms.join)) { - if (!room.stateAfter?.events) continue - - yield* store.applyState(room.stateAfter.events.map(event => ({ ...event, roomId }))) - } - }), -} diff --git a/packages/mxfx/src/client/sync/room-timeline-reducer.ts b/packages/mxfx/src/client/sync/room-timeline-reducer.ts deleted file mode 100644 index 28dff75..0000000 --- a/packages/mxfx/src/client/sync/room-timeline-reducer.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Effect } from 'effect' - -import { Store } from '../../store/index.ts' -import type { ReducerShape } from './reducer.ts' - -// TODO extract to helpers or somn like it -export const objectEntries = >(obj: O) => - Object.entries(obj) as { - [K in keyof O]-?: K extends string ? [K, O[K]] : never - }[keyof O][] - -// TODO: this room state reducer only supports -export const roomTimelineReducer: ReducerShape = { - reduce: sync => - Effect.gen(function* () { - if (!sync.rooms?.join) return Effect.void - const store = yield* Store - - for (const [roomId, room] of objectEntries(sync.rooms.join)) { - if (!room.timeline?.events) continue - - yield* store.appendTimelineEvents(room.timeline.events.map(event => ({ ...event, roomId }))) - } - }), -} diff --git a/packages/mxfx/src/config/matrix-config.ts b/packages/mxfx/src/config/matrix-config.ts index 160a0bc..807679f 100644 --- a/packages/mxfx/src/config/matrix-config.ts +++ b/packages/mxfx/src/config/matrix-config.ts @@ -22,7 +22,10 @@ export const makeConfig = (opts: MakeOpts) => const request = yield* makeHttpRequest(endpoint) const res = yield* baseHttpClient.execute(request).pipe(Effect.andThen(parseHttpResponse(endpoint))) - return { serverName, baseUrl: res['m.homeserver'].baseUrl } + return { + serverName, + baseUrl: res['m.homeserver'].baseUrl.replace(/\/+$/, ''), // remove trailing slash if exists + } }) type MakeOpts = { diff --git a/packages/mxfx/src/index.ts b/packages/mxfx/src/index.ts index ae5f8d6..8e56e77 100644 --- a/packages/mxfx/src/index.ts +++ b/packages/mxfx/src/index.ts @@ -3,5 +3,8 @@ export * as MatrixApi from './api/index.ts' export * as MatrixClient from './client/index.ts' export * as MatrixConfig from './config/index.ts' export * as Vault from './vault/index.ts' -export * as Store from './store/index.ts' +export * as Kv from './kv/index.ts' + export * from './branded/index.ts' +export * as Filter from './schema/filter.ts' +export * as Event from './schema/event.ts' diff --git a/packages/mxfx/src/kv/in-memory-kv.ts b/packages/mxfx/src/kv/in-memory-kv.ts new file mode 100644 index 0000000..e88b3df --- /dev/null +++ b/packages/mxfx/src/kv/in-memory-kv.ts @@ -0,0 +1,16 @@ +import { Effect, Schema } from 'effect' + +import { KvGetError, type KvShape } from './kv.ts' + +export const makeInMemoryKv = (): KvShape => { + const kv = new Map() + + return { + set: (key: string, value: string) => Effect.sync(() => kv.set(key, value)), + getString: (key: string) => + Effect.try(() => kv.get(key)).pipe( + Effect.andThen(Schema.decodeUnknownEffect(Schema.OptionFromOptional(Schema.String))), + Effect.mapError(e => new KvGetError({ cause: e })), + ), + } +} diff --git a/packages/mxfx/src/kv/index.ts b/packages/mxfx/src/kv/index.ts new file mode 100644 index 0000000..58480c5 --- /dev/null +++ b/packages/mxfx/src/kv/index.ts @@ -0,0 +1,2 @@ +export * from './kv.ts' +export * from './in-memory-kv.ts' diff --git a/packages/mxfx/src/kv/kv.ts b/packages/mxfx/src/kv/kv.ts new file mode 100644 index 0000000..f90c0b8 --- /dev/null +++ b/packages/mxfx/src/kv/kv.ts @@ -0,0 +1,15 @@ +import { Context, Data, Effect, Option } from 'effect' + +import { makeInMemoryKv } from './in-memory-kv.ts' + +export class KvGetError extends Data.TaggedError('mxfx/kv/get-error')<{ + cause?: unknown +}> {} + +export type KvShape = { + set: (key: string, value: string) => Effect.Effect + getString: (key: string) => Effect.Effect, KvGetError> +} + +export const Kv = Context.Reference('mxfx/kv', { defaultValue: makeInMemoryKv }) +export type Kv = typeof Kv diff --git a/packages/mxfx/src/schema/filter.ts b/packages/mxfx/src/schema/filter.ts index d9128fa..2c85474 100644 --- a/packages/mxfx/src/schema/filter.ts +++ b/packages/mxfx/src/schema/filter.ts @@ -3,7 +3,7 @@ import { Schema } from 'effect' import { RoomId, UserId } from '../branded/index.ts' export const roomEventFilterSchema = Schema.Struct({ - limit: Schema.optional(Schema.Number.check(Schema.isGreaterThanOrEqualTo(0))), // The maximum number of events to return, must be an integer greater than 0. Servers should apply a default value, and impose a maximum value to avoid resource exhaustion. + limit: Schema.optional(Schema.Number.check(Schema.isGreaterThan(0))), // The maximum number of events to return, must be an integer greater than 0. Servers should apply a default value, and impose a maximum value to avoid resource exhaustion. containsUrl: Schema.optional(Schema.Boolean), // If true, includes only events with a url key in their content. If false, excludes those events. If omitted, url key is not considered for filtering. includeRedundantMembers: Schema.optional(Schema.Boolean), // If true, sends all membership events for all events, even if they have already been sent to the client. Does not apply unless lazy_load_members is true. See Lazy-loading room members for more information. Defaults to false. @@ -51,4 +51,13 @@ export const filterSchema = Schema.Struct({ presence: Schema.optional(eventFilterSchema), // The presence updates to include. room: Schema.optional(roomFilterSchema), // Filters to be applied to room data. }) + export type Filter = typeof filterSchema.Type + +export function make(filter: Filter) { + return Schema.decodeSync(filterSchema)(filter) +} + +export function makeEffect(filter: Filter) { + return Schema.decodeEffect(filterSchema)(filter) +} diff --git a/packages/mxfx/src/store/in-memory-store.ts b/packages/mxfx/src/store/in-memory-store.ts deleted file mode 100644 index 41d7f1f..0000000 --- a/packages/mxfx/src/store/in-memory-store.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Effect, Option } from 'effect' - -import type { RoomId } from '../branded/index.ts' -import type { roomEventWithoutRoomId, stateEventWithoutRoomId } from '../schema/index.ts' -import type { StoreShape } from './store.ts' - -export const makeInMemoryStore = (): StoreShape => { - const storage: { - nextBatch: string | undefined - timelines: Map> - state: Map> - } = { nextBatch: undefined, timelines: new Map(), state: new Map() } - - return { - setNextBatch: nextBatch => - Effect.sync(() => { - storage.nextBatch = nextBatch - }).pipe(Effect.andThen(Effect.log('Writing', nextBatch))), - - getNextBatch: () => Effect.sync(() => Option.fromUndefinedOr(storage.nextBatch)).pipe(Effect.tap(x => Effect.log(x))), - - appendTimelineEvents: events => - Effect.sync(() => { - events.forEach(event => { - const roomTimeline: Array = storage.timelines.get(event.roomId) ?? [] - roomTimeline.push(event) - storage.timelines.set(event.roomId, roomTimeline) - }) - }), - getRoomTimeline: (roomId: RoomId) => - Effect.sync(() => { - const roomTimeline: ReadonlyArray = [...(storage.timelines.get(roomId) ?? [])] - return roomTimeline - }), - - applyState: events => - Effect.sync(() => { - events.forEach(event => { - const roomState: Map = storage.state.get(event.roomId) ?? new Map() - const key = `${event.type}-${event.stateKey}` - - roomState.set(key, event) - storage.state.set(event.roomId, roomState) - }) - }), - getRoomState: (roomId: RoomId) => - Effect.sync(() => { - const roomState: ReadonlyMap = storage.state.get(roomId) ?? new Map() - return Array.from(roomState.values()) - }), - } -} diff --git a/packages/mxfx/src/store/index.ts b/packages/mxfx/src/store/index.ts deleted file mode 100644 index f803107..0000000 --- a/packages/mxfx/src/store/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './store.ts' -export * from './in-memory-store.ts' diff --git a/packages/mxfx/src/store/store.ts b/packages/mxfx/src/store/store.ts deleted file mode 100644 index 794f3cf..0000000 --- a/packages/mxfx/src/store/store.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Context, Effect, Option } from 'effect' - -import type { RoomId } from '../branded/index.ts' -import { roomEventWithoutRoomId, stateEventWithoutRoomId } from '../schema/index.ts' -import { makeInMemoryStore } from './in-memory-store.ts' - -export type StoreShape = { - setNextBatch: (nextBatch: string) => Effect.Effect - getNextBatch: () => Effect.Effect> - - appendTimelineEvents: (events: ReadonlyArray) => Effect.Effect - getRoomTimeline: (roomId: RoomId) => Effect.Effect> - - applyState: (events: ReadonlyArray) => Effect.Effect - getRoomState: (roomId: RoomId) => Effect.Effect> -} - -export const Store = Context.Reference('mxfx/store', { defaultValue: makeInMemoryStore }) -export type Store = typeof Store diff --git a/packages/mxfx/tsconfig.tsbuildinfo b/packages/mxfx/tsconfig.tsbuildinfo deleted file mode 100644 index 924e127..0000000 --- a/packages/mxfx/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2025.float16.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.full.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/types.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/hkt.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/function.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/ordering.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/order.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/combiner.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/reducer.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/equivalence.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/hash.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/equal.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/inspectable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/pipeable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/context.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/predicate.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unify.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/utils.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/result.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/exit.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/loglevel.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/duration.d.ts","../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/bigdecimal.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/nonemptyiterable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/chunk.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/deferred.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/latch.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/mutablelist.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/mutableref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/scope.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/pubsub.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/pull.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/scheduler.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/queue.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/cron.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schedule.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/take.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/tracer.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/channel.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/executionplan.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/sink.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/stream.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/layer.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/datetime.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/differ.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/formatter.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/hashmap.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/hashset.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schemagetter.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schematransformation.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schemaast.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schemaissue.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/internal/schema/schema.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/jsonpatch.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/jsonschema.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/optic.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/redacted.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schemaparser.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schemarepresentation.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/struct.d.ts","../../node_modules/.pnpm/pure-rand@8.4.0/node_modules/pure-rand/lib/esm/randomgenerator-ckzrb3fu.d.ts","../../node_modules/.pnpm/pure-rand@8.4.0/node_modules/pure-rand/lib/esm/types/randomgenerator.d.ts","../../node_modules/.pnpm/pure-rand@8.4.0/node_modules/pure-rand/lib/esm/types/jumpablerandomgenerator.d.ts","../../node_modules/.pnpm/fast-check@4.8.0/node_modules/fast-check/lib/fast-check.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/testing/fastcheck.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schema.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/brand.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/data.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/platformerror.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/filesystem.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/logger.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/record.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/references.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/fiber.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/cause.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/clock.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/metric.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/request.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/mutablehashmap.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/cache.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/primarykey.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/reactivity/reactivity.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/sql/sqlerror.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/sql/sqlconnection.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/sql/statement.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/sql/sqlclient.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/path.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/persistence/keyvaluestore.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/persistence/redis.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/persistence/persistence.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/persistence/persistable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/requestresolver.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/effect.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/filter.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/option.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/array.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/bigint.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/boolean.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/channelschema.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/configprovider.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/config.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/console.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/crypto.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/effectable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/encoding.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/errorreporter.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/fiberhandle.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/fibermap.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/fiberset.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/graph.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/hashring.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/iterable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/jsonpointer.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/rcmap.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/layermap.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/managedruntime.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/match.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/mutablehashset.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/newtype.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/number.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/partitionedsemaphore.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/semaphore.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/pool.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/random.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/rcref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/redactable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/ref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/regexp.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/synchronizedref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/scopedref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/resource.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/runtime.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/schemautils.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/scopedcache.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/stdio.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/string.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/subscriptionref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/symbol.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/terminal.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/trie.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/tuple.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txchunk.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txdeferred.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txhashmap.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txhashset.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txpriorityqueue.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txqueue.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txpubsub.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txreentrantlock.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txsemaphore.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/txsubscriptionref.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/undefinedor.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/index.d.ts","./src/auth/error.ts","./src/auth/auth.ts","./src/auth/auth-legacy-token.ts","./src/auth/index.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/cookies.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/urlparams.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpbody.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/etag.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/persistence/ratelimiter.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/headers.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpmethod.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpclientrequest.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpincomingmessage.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpclientresponse.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpclienterror.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpclient.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/fetchhttpclient.d.ts","../../node_modules/.pnpm/find-my-way-ts@0.1.6/node_modules/find-my-way-ts/dist/dts/index.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/findmyway.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/socket/socket.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpplatform.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/template.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpserverresponse.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpserverrespondable.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpservererror.d.ts","../../node_modules/.pnpm/multipasta@0.2.7/node_modules/multipasta/dist/dts/headersparser.d.ts","../../node_modules/.pnpm/multipasta@0.2.7/node_modules/multipasta/dist/dts/index.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/multipasta.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/multipart.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpserverrequest.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpmiddleware.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/internal/preresponsehandler.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpeffect.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpserver.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httprouter.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httpstaticserver.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/httptracecontext.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/url.d.ts","../../node_modules/.pnpm/effect@4.0.0-beta.84/node_modules/effect/dist/unstable/http/index.d.ts","./src/api/schema/encode-case.ts","./src/api/endpoints/endpoint.ts","./src/api/schema/error.ts","./src/api/error.ts","./src/api/http-client/logging.ts","./src/api/http-client/base-http-client.ts","./src/branded/server-name.ts","./src/api/endpoints/discovery/get-well-known.ts","./src/config/matrix-config.ts","./src/config/index.ts","./src/api/http-client/api-http-client.ts","./src/api/http-client/auth-http-client.ts","./src/api/http-client/index.ts","./src/api/matrix-api.ts","./src/api/endpoints/discovery/index.ts","./src/api/endpoints/capabilities/get-capabilities-v3.ts","./src/api/endpoints/capabilities/index.ts","./src/api/endpoints/auth/get-login-v3.ts","./src/api/endpoints/auth/post-login-v3.ts","./src/api/endpoints/auth/index.ts","./src/branded/mxc-uri.ts","./src/branded/opaque-id.ts","./src/branded/event-id.ts","./src/branded/room-id.ts","./src/branded/user-id.ts","./src/branded/index.ts","./src/api/endpoints/user-directory/post-user-directory-search-v3.ts","./src/api/endpoints/user-directory/index.ts","./src/schema/event.ts","./src/schema/filter.ts","./src/schema/index.ts","./src/api/schema/sync.ts","./src/api/endpoints/sync/get-sync-v3.ts","./src/api/endpoints/sync/index.ts","./src/api/endpoints/profile/get-profile-v3.ts","./src/api/endpoints/profile/index.ts","./src/api/endpoints/rooms/post-rooms-join-v3.ts","./src/api/endpoints/rooms/put-rooms-send-v3.ts","./src/api/endpoints/rooms/get-rooms-event-v3.ts","./src/api/endpoints/rooms/index.ts","./src/api/endpoints/account/get-account-whoami-v3.ts","./src/api/endpoints/account/index.ts","./src/api/endpoints/index.ts","./src/api/index.ts","./src/kv/in-memory-kv.ts","./src/kv/kv.ts","./src/kv/index.ts","./src/client/client.ts","./src/client/index.ts","./src/vault/vault.ts","./src/vault/in-memory-vault.ts","./src/vault/local-file-vault.ts","./src/vault/index.ts","./src/index.ts","../../node_modules/.pnpm/@vitest+pretty-format@3.2.6/node_modules/@vitest/pretty-format/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/types.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/helpers.d.ts","../../node_modules/.pnpm/tinyrainbow@2.0.0/node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../../node_modules/.pnpm/tinyrainbow@2.0.0/node_modules/tinyrainbow/dist/node.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/index.d.ts","../../node_modules/.pnpm/@vitest+runner@3.2.6/node_modules/@vitest/runner/dist/tasks.d-cksck4of.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/diff.d.ts","../../node_modules/.pnpm/@vitest+runner@3.2.6/node_modules/@vitest/runner/dist/types.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/error.d.ts","../../node_modules/.pnpm/@vitest+runner@3.2.6/node_modules/@vitest/runner/dist/index.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/optional-types.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/environment.d.cl3nlxbe.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/client-stats.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.12.0/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/hmrpayload.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/customevent.d.ts","../../node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","../../node_modules/.pnpm/rollup@4.60.1/node_modules/rollup/dist/rollup.d.ts","../../node_modules/.pnpm/rollup@4.60.1/node_modules/rollup/dist/parseast.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/hot.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/lib/main.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/internal/terseroptions.d.ts","../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/previous-map.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/input.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/declaration.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/root.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/warning.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/processor.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/result.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/document.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/rule.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/node.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/comment.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/container.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/at-rule.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/list.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/postcss.d.ts","../../node_modules/.pnpm/postcss@8.5.8/node_modules/postcss/lib/postcss.d.mts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/internal/csspreprocessoroptions.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/internal/lightningcssoptions.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/importglob.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/types/metadata.d.ts","../../node_modules/.pnpm/vite@7.3.1_@types+node@24.12.0_yaml@2.9.0/node_modules/vite/dist/node/index.d.ts","../../node_modules/.pnpm/@vitest+mocker@3.2.6_vite@7.3.1_@types+node@24.12.0_yaml@2.9.0_/node_modules/@vitest/mocker/dist/registry.d-d765pazg.d.ts","../../node_modules/.pnpm/@vitest+mocker@3.2.6_vite@7.3.1_@types+node@24.12.0_yaml@2.9.0_/node_modules/@vitest/mocker/dist/types.d-d_arzrdy.d.ts","../../node_modules/.pnpm/@vitest+mocker@3.2.6_vite@7.3.1_@types+node@24.12.0_yaml@2.9.0_/node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/.pnpm/@vitest+utils@3.2.6/node_modules/@vitest/utils/dist/source-map.d.ts","../../node_modules/.pnpm/vite-node@3.2.4_@types+node@24.12.0_yaml@2.9.0/node_modules/vite-node/dist/trace-mapping.d-dlvdeqop.d.ts","../../node_modules/.pnpm/vite-node@3.2.4_@types+node@24.12.0_yaml@2.9.0/node_modules/vite-node/dist/index.d-dgmxd2u7.d.ts","../../node_modules/.pnpm/vite-node@3.2.4_@types+node@24.12.0_yaml@2.9.0/node_modules/vite-node/dist/index.d.ts","../../node_modules/.pnpm/@vitest+snapshot@3.2.6/node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","../../node_modules/.pnpm/@vitest+snapshot@3.2.6/node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","../../node_modules/.pnpm/@vitest+snapshot@3.2.6/node_modules/@vitest/snapshot/dist/index.d.ts","../../node_modules/.pnpm/@vitest+snapshot@3.2.6/node_modules/@vitest/snapshot/dist/environment.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/config.d.bkdhh7zx.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/worker.d.cugipz9v.d.ts","../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../node_modules/.pnpm/@vitest+runner@3.2.6/node_modules/@vitest/runner/dist/utils.d.ts","../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/benchmark.d.bwvbvtda.d.ts","../../node_modules/.pnpm/vite-node@3.2.4_@types+node@24.12.0_yaml@2.9.0/node_modules/vite-node/dist/client.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/coverage.d.s9rmnxie.d.ts","../../node_modules/.pnpm/@vitest+snapshot@3.2.6/node_modules/@vitest/snapshot/dist/manager.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/reporters.d.buron0i0.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/worker.d.uzwscv9x.d.ts","../../node_modules/.pnpm/@vitest+spy@3.2.6/node_modules/@vitest/spy/dist/index.d.ts","../../node_modules/.pnpm/@vitest+expect@3.2.6/node_modules/@vitest/expect/dist/index.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/global.d.mamajcmj.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/vite.d.bnoppc46.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/mocker.d.be_2ls6u.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/chunks/suite.d.fvehnv49.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../node_modules/.pnpm/vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0/node_modules/vitest/dist/index.d.ts","../../node_modules/.pnpm/@effect+vitest@4.0.0-beta.84_effect@4.0.0-beta.84_vitest@3.2.6_@types+node@24.12.0_yaml@2.9.0_/node_modules/@effect/vitest/dist/index.d.ts","./src/api/endpoints/endpoint.test.ts","./src/api/endpoints/sync/get-sync-v3.test.ts","./src/api/schema/encode-case.test.ts","./src/api/schema/index.ts","./src/branded/event-id.test.ts","./src/branded/room-alias.ts","./src/branded/room-alias.test.ts","./src/branded/room-id.test.ts","./src/branded/server-name.test.ts","./src/branded/user-id.test.ts","./src/schema/event.test.ts"],"fileIdsList":[[85,94,107,129,130,158,328,382,399,400,503],[328,382,399,400],[328,382,399,400,481,482],[328,379,380,382,399,400],[328,381,382,399,400],[382,399,400],[328,382,387,399,400,417],[328,382,383,388,393,399,400,402,414,425],[328,382,383,384,393,399,400,402],[328,382,385,399,400,426],[328,382,386,387,394,399,400,403],[328,382,387,399,400,414,422],[328,382,388,390,393,399,400,402],[328,381,382,389,399,400],[328,382,390,391,399,400],[328,382,392,393,399,400],[328,381,382,393,399,400],[328,382,393,394,395,399,400,414,425],[328,382,393,394,395,399,400,409,414,417],[328,374,382,390,393,396,399,400,402,414,425],[328,382,393,394,396,397,399,400,402,414,422,425],[328,382,396,398,399,400,414,422,425],[326,327,328,329,330,331,332,333,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431],[328,382,393,399,400],[328,382,399,400,401,425],[328,382,390,393,399,400,402,414],[328,382,399,400,403],[328,382,399,400,404],[328,381,382,399,400,405],[328,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431],[328,382,399,400,407],[328,382,399,400,408],[328,382,393,399,400,409,410],[328,382,399,400,409,411,426,428],[328,382,394,399,400],[328,382,393,399,400,414,415,417],[328,382,399,400,416,417],[328,382,399,400,414,415],[328,382,399,400,417],[328,382,399,400,418],[328,379,382,399,400,414,419,425],[328,382,393,399,400,420,421],[328,382,399,400,420,421],[328,382,387,399,400,402,414,422],[328,382,399,400,423],[328,382,399,400,402,424],[328,382,396,399,400,408,425],[328,382,387,399,400,426],[328,382,399,400,414,427],[328,382,399,400,401,428],[328,382,399,400,429],[328,382,387,399,400],[328,374,382,399,400],[328,382,399,400,430],[328,374,382,393,395,399,400,405,414,417,425,427,428,430],[328,382,399,400,414,431],[316,317,320,328,382,399,400,492],[328,382,399,400,468,469],[317,318,320,321,322,328,382,399,400],[317,328,382,399,400],[317,318,320,328,382,399,400],[317,318,328,382,399,400],[328,382,399,400,475],[312,328,382,399,400,475,476],[312,328,382,399,400,475],[312,319,328,382,399,400],[313,328,382,399,400],[312,313,314,316,328,382,399,400],[312,328,382,399,400],[66,67,68,70,72,73,79,82,136,160,328,382,399,400],[69,70,73,75,76,77,160,328,382,399,400],[69,70,71,72,73,160,328,382,399,400],[68,70,72,73,328,382,399,400],[66,82,115,116,130,160,328,382,399,400],[77,79,83,85,90,143,158,160,328,382,399,400],[66,75,76,77,78,82,137,138,158,160,328,382,399,400],[66,68,77,78,79,80,83,84,89,94,95,96,98,100,101,102,107,139,158,159,160,161,328,382,399,400],[103,130,161,328,382,399,400],[66,67,70,73,75,76,77,79,82,88,159,160,161,328,382,399,400],[78,85,158,328,382,399,400],[70,328,382,399,400],[84,85,115,121,130,158,160,165,328,382,399,400],[66,77,78,94,107,133,134,139,151,158,328,382,399,400],[78,94,158,328,382,399,400],[66,68,75,76,77,158,160,328,382,399,400],[66,73,75,76,77,82,108,139,160,328,382,399,400],[78,133,158,328,382,399,400],[66,77,80,139,328,382,399,400],[68,70,73,76,77,78,85,107,139,158,160,328,382,399,400],[66,68,77,83,139,158,160,328,382,399,400],[70,71,72,73,75,76,77,160,328,382,399,400],[66,67,68,76,77,78,79,80,82,83,84,85,94,97,100,102,104,107,135,138,139,140,141,142,156,157,159,160,161,328,382,399,400],[138,158,328,382,399,400],[66,82,139,328,382,399,400],[73,74,328,382,399,400],[67,72,328,382,399,400],[78,84,94,107,136,138,139,158,328,382,399,400],[77,78,100,107,158,161,328,382,399,400],[66,82,139,158,160,328,382,399,400],[66,77,78,83,84,94,97,102,137,158,161,328,382,399,400],[76,77,90,94,97,138,158,160,328,382,399,400],[76,77,90,94,138,143,158,160,328,382,399,400],[76,77,90,94,138,158,328,382,399,400],[78,94,105,106,107,131,133,158,160,328,382,399,400],[66,79,82,158,160,328,382,399,400],[67,328,382,399,400],[66,75,76,77,132,139,160,328,382,399,400],[66,75,76,77,82,160,328,382,399,400],[77,145,328,382,399,400],[66,75,76,77,79,328,382,399,400],[66,328,382,399,400],[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,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,116,118,119,120,121,122,123,124,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,151,156,157,158,159,160,161,162,163,164,165,166,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,328,382,399,400],[66,116,139,328,382,399,400],[66,82,136,160,161,328,382,399,400],[130,328,382,399,400],[158,328,382,399,400],[66,68,77,78,80,83,94,102,103,106,139,158,161,328,382,399,400],[66,78,85,94,107,158,179,328,382,399,400],[77,78,84,85,94,107,133,134,138,139,158,328,382,399,400],[70,73,158,328,382,399,400],[78,83,94,107,138,158,328,382,399,400],[66,77,79,80,82,160,328,382,399,400],[66,77,78,83,85,107,158,328,382,399,400],[76,77,160,161,328,382,399,400],[76,77,143,328,382,399,400],[76,77,328,382,399,400],[70,71,72,73,120,328,382,399,400],[69,70,72,73,160,328,382,399,400],[66,82,115,130,160,328,382,399,400],[66,67,68,70,71,72,73,76,77,79,80,81,82,159,328,382,399,400],[67,69,72,328,382,399,400],[68,72,328,382,399,400],[158,160,328,382,399,400],[78,107,133,158,328,382,399,400],[66,132,139,328,382,399,400],[77,83,85,91,94,158,187,328,382,399,400],[66,67,328,382,399,400],[66,68,77,90,91,92,93,94,158,160,161,328,382,399,400],[82,83,139,158,328,382,399,400],[66,76,83,92,96,97,139,158,160,161,328,382,399,400],[78,158,328,382,399,400],[77,78,85,90,94,138,139,143,158,328,382,399,400],[66,77,85,94,158,328,382,399,400],[66,67,71,72,73,82,160,328,382,399,400],[78,328,382,399,400],[66,73,75,77,328,382,399,400],[71,328,382,399,400],[66,77,93,158,160,328,382,399,400],[78,84,97,102,135,136,328,382,399,400],[66,78,83,139,158,328,382,399,400],[66,77,85,94,102,130,142,144,154,155,158,161,328,382,399,400],[77,83,94,100,158,195,328,382,399,400],[66,67,68,73,76,77,79,80,81,160,328,382,399,400],[83,138,158,328,382,399,400],[66,68,77,78,82,85,96,99,108,158,328,382,399,400],[78,138,328,382,399,400],[66,70,71,73,77,80,82,83,85,86,87,89,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,129,131,139,158,160,328,382,399,400],[71,77,114,116,130,158,328,382,399,400],[77,108,115,116,130,158,160,328,382,399,400],[86,110,115,130,160,328,382,399,400],[82,83,115,116,130,158,160,328,382,399,400],[115,119,130,328,382,399,400],[85,87,108,113,115,116,158,160,328,382,399,400],[78,83,158,328,382,399,400],[77,79,83,85,90,94,143,158,160,328,382,399,400],[68,77,94,158,194,328,382,399,400],[66,68,77,78,79,80,83,85,94,95,96,98,103,106,139,158,159,160,161,328,382,399,400],[78,105,106,107,133,158,328,382,399,400],[66,67,68,77,78,79,80,82,83,84,85,94,95,96,98,100,101,102,103,104,105,107,139,158,159,160,161,328,382,399,400],[69,70,72,73,79,160,161,328,382,399,400],[70,71,72,73,328,382,399,400],[66,77,95,106,158,160,187,328,382,399,400],[158,160,187,192,328,382,399,400],[83,96,161,328,382,399,400],[78,94,98,130,133,139,158,160,328,382,399,400],[128,328,382,399,400],[68,78,83,84,138,160,328,382,399,400],[70,71,72,73,79,124,328,382,399,400],[66,76,77,89,157,158,328,382,399,400],[76,77,82,157,158,160,328,382,399,400],[76,77,82,111,157,158,160,328,382,399,400],[66,76,77,79,112,157,158,328,382,399,400],[70,76,77,79,89,157,158,160,328,382,399,400],[76,77,94,158,212,328,382,399,400],[66,76,96,139,157,158,160,161,207,328,382,399,400],[76,77,94,158,328,382,399,400],[66,77,158,328,382,399,400],[76,77,94,157,158,328,382,399,400],[76,77,94,106,158,212,328,382,399,400],[68,71,72,328,382,399,400],[66,76,77,82,85,130,132,136,139,160,328,382,399,400],[78,107,134,158,225,328,382,399,400],[78,107,234,328,382,399,400],[236,328,382,399,400],[73,78,121,130,136,160,191,328,382,399,400],[66,76,106,115,116,130,133,134,139,158,224,328,382,399,400],[66,76,77,78,79,85,94,100,107,138,158,161,192,223,227,230,232,233,328,382,399,400],[66,130,139,230,232,328,382,399,400],[76,77,78,82,106,115,121,130,133,134,158,160,224,225,228,229,328,382,399,400],[77,80,106,115,130,158,223,230,231,233,328,382,399,400],[78,94,107,158,241,243,248,249,250,328,382,399,400],[76,78,106,115,130,134,158,160,224,228,328,382,399,400],[78,79,107,158,241,248,328,382,399,400],[78,107,133,134,158,225,226,228,241,328,382,399,400],[66,78,94,107,115,130,136,158,160,229,237,241,243,248,252,328,382,399,400],[78,94,107,134,151,158,226,234,239,241,248,249,328,382,399,400],[66,78,83,139,158,160,171,241,242,248,328,382,399,400],[78,82,94,103,106,115,130,134,136,151,158,160,161,228,229,230,231,238,243,247,328,382,399,400],[158,241,328,382,399,400],[76,77,78,106,115,130,133,134,158,171,223,224,225,228,230,232,239,240,328,382,399,400],[107,133,134,151,158,239,241,243,248,253,328,382,399,400],[102,160,228,328,382,399,400],[223,224,225,226,228,229,230,231,232,233,234,235,237,239,240,241,242,243,246,247,248,249,251,252,253,254,255,256,328,382,399,400],[66,76,78,94,103,106,115,130,132,134,139,151,158,161,246,328,382,399,400],[245,328,382,399,400],[106,158,160,328,382,399,400],[82,121,139,224,328,382,399,400],[66,73,76,77,82,130,136,139,160,161,328,382,399,400],[66,68,78,107,130,133,134,139,150,151,158,160,328,382,399,400],[66,83,85,130,142,145,154,158,328,382,399,400],[78,83,85,94,107,130,139,140,150,152,153,155,158,161,328,382,399,400],[78,85,107,130,139,153,158,166,328,382,399,400],[78,130,139,158,328,382,399,400],[78,94,98,106,107,136,158,328,382,399,400],[78,82,85,94,103,107,130,139,158,161,328,382,399,400],[66,78,94,98,106,136,146,147,148,149,158,328,382,399,400],[78,94,106,147,158,328,382,399,400],[130,139,328,382,399,400],[78,102,106,138,147,148,158,328,382,399,400],[328,382,399,400,498,499],[328,382,399,400,498,499,500,501],[328,382,399,400,498,500],[328,382,399,400,498],[126,127,328,382,399,400],[244,328,382,399,400],[328,382,399,400,458],[328,382,399,400,456,458],[328,382,399,400,447,455,456,457,459,461],[328,382,399,400,445],[328,382,399,400,448,453,458,461],[328,382,399,400,444,461],[328,382,399,400,448,449,452,453,454,461],[328,382,399,400,448,449,450,452,453,461],[328,382,399,400,445,446,447,448,449,453,454,455,457,458,459,461],[328,382,399,400,461],[328,382,399,400,443,445,446,447,448,449,450,452,453,454,455,456,457,458,459,460],[328,382,399,400,443,461],[328,382,399,400,448,450,451,453,454,461],[328,382,399,400,452,461],[328,382,399,400,453,454,458,461],[328,382,399,400,446,456],[125,328,382,399,400],[328,382,399,400,437,466,467],[328,382,399,400,436,437],[315,328,382,399,400],[328,340,343,346,347,382,399,400,425],[328,343,382,399,400,414,425],[328,343,347,382,399,400,425],[328,382,399,400,414],[328,337,382,399,400],[328,341,382,399,400],[328,339,340,343,382,399,400,425],[328,382,399,400,402,422],[328,382,399,400,432],[328,337,382,399,400,432],[328,339,343,382,399,400,402,425],[328,334,335,336,338,342,382,393,399,400,414,425],[328,343,351,359,382,399,400],[328,335,341,382,399,400],[328,343,368,369,382,399,400],[328,335,338,343,382,399,400,417,425,432],[328,343,382,399,400],[328,339,343,382,399,400,425],[328,334,382,399,400],[328,337,338,339,341,342,343,344,345,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,370,371,372,373,382,399,400],[328,343,361,364,382,390,399,400],[328,343,351,352,353,382,399,400],[328,341,343,352,354,382,399,400],[328,342,382,399,400],[328,335,337,343,382,399,400],[328,343,347,352,354,382,399,400],[328,347,382,399,400],[328,341,343,346,382,399,400,425],[328,335,339,343,351,382,399,400],[328,343,361,382,399,400],[328,354,382,399,400],[328,337,343,368,382,399,400,417,430,432],[328,382,399,400,472,473],[328,382,399,400,472],[328,382,399,400,433],[328,382,393,394,396,397,398,399,400,402,414,422,425,431,432,433,434,435,437,438,440,441,442,462,463,464,465,466,467],[328,382,399,400,433,434,435,439],[328,382,399,400,435],[328,382,399,400,437,467],[323,328,382,399,400,484,485,494],[312,320,323,328,382,399,400,477,478,494],[328,382,399,400,487],[324,328,382,399,400],[312,323,325,328,382,399,400,477,486,493,494],[328,382,399,400,470],[312,317,320,323,325,328,382,385,394,399,400,414,467,470,471,474,477,479,480,483,486,488,489,494,495],[323,328,382,399,400,484,485,486,494],[328,382,399,400,467,490,495],[323,325,328,382,399,400,474,477,479,494],[328,382,399,400,430,480],[312,317,320,323,324,325,328,382,385,394,399,400,414,430,467,470,471,474,477,478,479,480,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,502],[218,259,283,328,382,399,400],[298,328,382,399,400],[218,259,328,382,399,400],[275,276,328,382,399,400],[218,257,258,259,328,382,399,400],[273,328,382,399,400],[218,259,264,328,382,399,400],[265,328,382,399,400],[218,259,283,328,382,399,400,504],[218,257,258,328,382,399,400],[272,274,277,285,291,293,297,299,328,382,399,400],[218,259,278,282,328,382,399,400],[292,328,382,399,400],[259,283,286,328,382,399,400],[294,295,296,328,382,399,400],[218,259,281,328,382,399,400],[218,257,258,259,283,328,382,399,400],[218,258,283,290,328,382,399,400,504],[218,258,259,283,288,289,328,382,399,400],[290,328,382,399,400],[284,328,382,399,400],[218,260,328,382,399,400],[218,234,257,262,267,270,328,382,399,400],[218,222,234,257,262,270,328,382,399,400],[218,257,260,261,262,328,382,399,400],[263,268,269,328,382,399,400],[218,257,328,382,399,400],[270,271,300,328,382,399,400],[218,259,270,328,382,399,400],[218,258,328,382,399,400,504],[218,328,382,399,400],[258,260,289,328,382,399,400],[218,286,328,382,399,400],[218,220,328,382,399,400],[158,218,219,328,382,399,400],[219,220,221,328,382,399,400],[218,280,328,382,399,400,504],[218,264,279,328,382,399,400],[278,280,281,282,328,382,399,400],[218,328,382,399,400,504,510],[218,281,328,382,399,400,504],[218,264,328,382,399,400,504],[218,282,328,382,399,400,504],[218,283,301,304,328,382,399,400],[305,328,382,399,400],[266,328,382,399,400],[218,259,264,265,270,328,382,399,400],[222,267,283,301,304,306,310,328,382,399,400],[218,303,328,382,399,400],[302,303,328,382,399,400],[218,302,328,382,399,400],[158,218,258,283,286,328,382,399,400,504],[130,218,283,328,382,399,400],[218,283,328,382,399,400],[286,287,328,382,399,400],[218,307,328,382,399,400],[307,308,309,328,382,399,400]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"f13f4b465c99041e912db5c44129a94588e1aafee35a50eab51044833f50b4ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"01a30f9e8582b369075c0808df71121e6855cb06fd8d3d39511d9ebb66405205","impliedFormat":1},{"version":"650563008d65ac5749b38d3be173cf17240af709701816e4606e5c973f7e5be0","impliedFormat":99},{"version":"b2a53e4068bf3bb0484e546a0e211bdc31343f57a06a4cd362dd254c8531d9cb","impliedFormat":99},{"version":"4134343c3e084889d67d6168902dcd1fc23b3c413892b9048cc203487d78b33c","impliedFormat":99},{"version":"4ab7697fc5ea2610a68939ffb71668685e8e34b2083a3833a167c7ef402dcb9b","impliedFormat":99},{"version":"5122adca1430112c5ddeebb061f576803affe49684c25ad6c89f14ac8b4d9915","impliedFormat":99},{"version":"4548bcdf485e2a1ebd9e880aa03bb01f26778f1825f803c252ec223ab07b279f","impliedFormat":99},{"version":"3beae00ba79eaa7e3b6218621ea21b43a6e593317507593c86e7ee659a894eb6","impliedFormat":99},{"version":"6cc1607e434046a6e2dbb1a4b066210dd804ae82231f146146a27c4a25997980","impliedFormat":99},{"version":"3680c4da0928c1275aa300711e32303a3750aff7820789aa0b80f1584e545350","impliedFormat":99},{"version":"d8018e10f84e9243e636668540a056c3772cbfb5148c2d26c7b5e3fbad014256","impliedFormat":99},{"version":"5926c741f86868b954a782504dda07af76c64589b503b05f7e0acf3d315a3950","impliedFormat":99},{"version":"d0707735ad913c93ab5943a85f215504d530725cb3bad0f3fb2b95e80669db2e","impliedFormat":99},{"version":"996775066fe18fdf2ebe8113c12e123074558b06a06fcd93cd085cedde4956b3","impliedFormat":99},{"version":"df4d841548f32f58cc12740c1d6aa6b693ba1c0d6b4113eba071180ba07db4c5","impliedFormat":99},{"version":"c7d03733983a4721cca40bbecd24e07a9bab3b2b90699f48b2d0d0b9d8a1ff15","impliedFormat":99},{"version":"6d37ff5e9b65179fa7cb370272fb2a273b8274dc1bd9ed7962d1a53431be32bc","impliedFormat":99},{"version":"4de3e1260ab33b68adc8f3f07858174bface804bed8ba5c513e663cc967271b4","impliedFormat":99},{"version":"5724774ec407dbbf97f26f6cb728cf68069ae544ec82d6a44ea7df6770aee40b","impliedFormat":99},{"version":"2b8af9162fd1e969e1ad7795bef77dda273422834608e16dfcc612c72cb696aa","impliedFormat":99},{"version":"bdc286bd8051517c543b8d2e77ae44367d0a38d33aec25018600cdc0fba6cecb","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"b4935af9e7fa23ea03b87295884863b6952ed4e94ea9b966c373f32347412589","impliedFormat":99},{"version":"2f2e4feb0a7b7809ee1ac4171fccbbb5fbd711624cf356ad08a7cc090dccfe3a","impliedFormat":99},{"version":"cb3da2f9a95bc87f9a5f509c51a4eea13d63e5e4ccd5c7b10008b0fe4a35830b","impliedFormat":99},{"version":"41f68c216a6fccf526db4db7f9bf57cf536d26802db72b188702c468abb796d6","impliedFormat":99},{"version":"fdec8a99739f3f4b7bea35b0f2bcc98d14fd28a27b71fcd01998b411d3135ca7","impliedFormat":99},{"version":"01b147b9bde620fecd14c2ba4acb2eaa6a8d3f7e6cadcaf139a96f39fe1ca19d","impliedFormat":99},{"version":"9cd6cda8d277af5d60d9e66340b11751e1a481791b777c8aa9041c741be6408e","impliedFormat":99},{"version":"fe7f7bed70840a73aba01341c94574c72364e6a062cc60bbb93732da950747cf","impliedFormat":99},{"version":"541ff2923997a251e41d4967bdf93c18712847da73cc71aec2c773bb7e2d4386","impliedFormat":99},{"version":"0ca7b0459ca84199006ce9a859e39e0a1a3e399773e4137c4c22878085868f84","impliedFormat":99},{"version":"dd79178261619359a3070a8696fa77d430b71bf2588ff2502026a26901552c1d","impliedFormat":99},{"version":"558b4e79664ed8f306a762c6e49b89e851ab5e3d423b0e4912b7c061c814ed6b","impliedFormat":99},{"version":"498b1ed3ac64331396dbc7cc9a16b6d0a7887ecb295da5d8b3a5ca942389b8c0","impliedFormat":99},{"version":"fea5fd9937206ed238d009892ec537aacc8588dfc2d186b5e31e2dccbe1adc62","impliedFormat":99},{"version":"bc3a2fb50a646aa0dd360c3ea7c13ce8e46c3356ce15018b4dd08563140e85ce","impliedFormat":99},{"version":"5b7fb01f1074db2dd85d90cd8375f0e5fe53b884475df7d7be798e8e9d7b0e61","impliedFormat":99},{"version":"6dec56b6ebde10cbad0077e56ac57d7c2a2a84764b9b896805c120e09c348770","impliedFormat":99},{"version":"85a1a685f7106d015a220de22276cefb0f5fce537c7772dc8a10bd3af8f0268c","impliedFormat":99},{"version":"49ad6b83629211aff8ab647aaf8538def7829ac9a1776e85f7603fc65b4491a7","impliedFormat":99},{"version":"de923abffca33414a93bc896bdb679a61f454832b389325d26a7ec10f03dfc36","impliedFormat":99},{"version":"60cc1ddb20a1e57924b7a524cf183449db2327cd7d863e895e684d5759aea523","impliedFormat":99},{"version":"a5802a4561d02bbd90b8509b93ace8cbaa8dfae44c5f24b0f2eeb4eb06736caf","impliedFormat":99},{"version":"bc23da4fca79cd67b2267049e2d8786599f6f8e2495d27cfd1d05f9cd06750ad","impliedFormat":99},{"version":"e9c7a1e0755f5e81e3b5057cd17084318f15adc061035f83cee2059050f89674","impliedFormat":99},{"version":"a5cf939dd312143432513195bfea14cfe112b2b4e0869b7e5963be94a004aab2","impliedFormat":99},{"version":"aeaad02153aee684bf261e76a8d55920b98839585cc01f69116f0b5c08babe5f","impliedFormat":99},{"version":"d68c3d273da17c26d14f5d555f1e9f0a4e5a626170404fc78cf7fac5c87cfc2a","impliedFormat":99},{"version":"c3e726612cabd235311560e3b05c9e6393ccbc3d6870aec6f8d41e94ef7e9f84","impliedFormat":99},{"version":"ac1e7195f1aef614289dfe172fa857e227dcc9d71fe8dee403d1910290352d17","impliedFormat":99},{"version":"8313f658870e60baa103e792900d91b2deb4a6a5a833a1dffe322cb20bf1e60b","impliedFormat":99},{"version":"c0bfdca78992e013581f417c7c68964bd039189f53bd12e3c42ecb3d606d0654","impliedFormat":99},{"version":"0948c6b298ce62972fc77ac4e9aed262e6ad0c02a0cb83a8df3e9a2a59948538","impliedFormat":99},{"version":"d4a2a5ff88d97a6f3f63c5a080fd77f2eb586e2f66d5c40909c43fd181a0392b","impliedFormat":99},{"version":"da8673bac4fceb824efa1bfecce7cd71920b74e21edf2060ef162d3a64d2f230","impliedFormat":99},{"version":"dc57a5453485fe3932dcdfc945f3ac94b1773005892f9a873c680e5165ffb7ee","impliedFormat":99},{"version":"a05cfb1c56c343ec90bbaf39f8576a11f39bf664a71744b82b6168d412bf7015","impliedFormat":99},{"version":"c768d8bd761f8ed32c68d83a77c55f1c14e70e3b0fac0c46ee0be955993148d1","impliedFormat":99},{"version":"cccc7eb728520a25afd849967f55ba2bd8e61d328f47db353e08a950cf5cd9aa","impliedFormat":99},{"version":"80f829c59dfb2ac33d6b02467d78bc88790963fc168ac5e3003880f6a414414b","impliedFormat":99},{"version":"a88ac70da90568928e571a83ff90dafc2942cf390522c94324ad6e564ca0d892","impliedFormat":99},{"version":"7b1c855dcc8538439f185381220e39e7d5c4d09e4b3f8888f41ea068cd7a0839","impliedFormat":99},{"version":"d726f9d05c467560a1dfc10cfe04ba1796d9dcc1b2ec2071eaeb7c4349f1f35a","impliedFormat":99},{"version":"2dc2768ba2c8feab6ddd23fa9bbd7245cf9108c3a6cdb708109fe28859b42fc8","impliedFormat":99},{"version":"e6ad266587bb271a8af42e8e252b28c29614421e81b9dab01639d20562511364","impliedFormat":99},{"version":"761a96b93e2f68a1073c4f35bd58cca32e5ad5500e696cbe4bf98c57a0ee9c03","impliedFormat":99},{"version":"015f09e044efc0156329eabe853567ed7291ffc767216f6ae13966e65ec19c19","impliedFormat":99},{"version":"5c88d24ea875fbe1d082a69013ec490498c102b184cd5a69175adda9e4b3ee52","impliedFormat":99},{"version":"256d866357cdad9361bcc09b2290b965bd55cbbcb8a76a0151242dd4cb193ef0","impliedFormat":99},{"version":"5f82438f541b3d843eda0f88aa304052fd50899bd6b1db06a5264ae11fc0d44d","impliedFormat":99},{"version":"3d13cebf1527b557eda4b654761bc12ef4b4ee184ca3e5de45f3f0a216ff35d2","impliedFormat":99},{"version":"c715f66ce54039058ea230dc303272f85ff5804d5fa8b70b972bfae5fd6d76b3","impliedFormat":99},{"version":"def1b429d467ef78664032e41c6a315d689346df499a6cb6f176f82920b82dd4","impliedFormat":99},{"version":"bf94092a394c934ca5795c94cd9dd677b66f0bffa1fb7cb1c66ebaef99324216","impliedFormat":99},{"version":"cf63ecaac59b1379167a4d8ec378e3d54dc0a1f6f0c6d4093a8e5e563546cf4d","impliedFormat":99},{"version":"4c64971053cb423082d10ebbc7b490872fa9ac9d0c47bc9a722a50f2d3ae9879","impliedFormat":99},{"version":"d8f5b87ced7b9c41b143880fbe164e02256d4362485a84a9549fc51384cba7aa","impliedFormat":99},{"version":"5fdeb88d10b813c0da1b6e01476ed9c1d21e17073faf401e913764905bd99716","impliedFormat":99},{"version":"f75c102970ba33b9359ca5978d0876d802d80186bdf5ff527043c2d63689d937","impliedFormat":99},{"version":"c582297e292298dc18bd9f2cfeeeebc267db029054817f60edf72beb6bc5e1b3","impliedFormat":99},{"version":"75f853d74a6200e931e0e641b4fe0b3b4d848581b56cf5a46e7e17dc19de5fae","impliedFormat":99},{"version":"d4a8de4f79bc32eea4d3f0916e3e5d467816fcf13406bcde4e5d5f9eff2e914e","impliedFormat":99},{"version":"8bfc5cf8f9914d32a3abfa8f680a08e1db1775d5eb3c26d71a3ce3da62c00cfb","impliedFormat":99},{"version":"29b7f27f8f4d913ff3ec3fb2a07b5500727fee1f242b59cb42ee117ea4a7a5ae","impliedFormat":99},{"version":"ae44fcb05b0fff6e206e1490633ee21ef9a2c3fa7fbc2ea2cf47212328d8ecf8","impliedFormat":99},{"version":"77d5cfaaeafd83a03363bb2ca32ac1e20ab2156e515d52f9f425a2d40d91d167","impliedFormat":99},{"version":"58f7b81e0c47319a0d20650b741ff5eabc13325a129eada58ae2e87403732379","impliedFormat":99},{"version":"bbea5a80c5b55fbf570e4ed180cba209c59ca07ee1c6a54c21f5c5861e7c1249","impliedFormat":99},{"version":"48ceb5654034e6a550a287fdca4c426d8fa212c3db950ba1aed2f59cceb69040","impliedFormat":99},{"version":"22810057b362f9fae581562de686339683d6ed02e3eb8b162f8a4599d855093a","impliedFormat":99},{"version":"fee0991a747b1c4314d6850718d8ed2e9b9249923b89cd678e84eeb524cb9e07","impliedFormat":99},{"version":"5bee0065b138cde392b5616384ed85ba7beea78570729de50d85a31e2c0346c3","impliedFormat":99},{"version":"a804501962b1f56dfa8573cfb8b256049a9d5cd6097c3d1b44b664950f77f964","impliedFormat":99},{"version":"8216280a2ce3f3fe691b64b757a9a4b101072be8fde8da4d31e488d2856314e9","impliedFormat":99},{"version":"e0ec8b83d11314e3e0cbd8ac57f9849e8d06bdfe5b0918ea8517cc28aa921d42","impliedFormat":99},{"version":"e17e184d884f727b73a88a498b6cc301ce0f4a27a9e6aba462c08def64eb07a3","impliedFormat":99},{"version":"0e86e9c0aa8d32924ae1874b99802faf401374867eb2eba371a536e8f4d45a59","impliedFormat":99},{"version":"d6d8af6a05fd5fc4996d448cebc1d115159bf9704389e750ccfe258063b7144d","impliedFormat":99},{"version":"92b589262406a5056ed1095acf23a1fc9240f54121f0bc9ff118f791fa579959","impliedFormat":99},{"version":"402f5357cffd421e421389da4e04479af6da211b635a19f7ea8e82e8903ee82a","impliedFormat":99},{"version":"a12f241999e927a13bb69bef948a09f93d141814b90ae59bad9fa0e51d940ed6","impliedFormat":99},{"version":"d1e62920be3a6de81ff193bc5188fe19621e755d5385c963f097f0b4422b28ca","impliedFormat":99},{"version":"92b7c407d645576b8abc7b73679513f94d1a6ea0f05bf38adff7cb2e7ae6b142","impliedFormat":99},{"version":"24fdf47005d22b9ad4e338c8d8fabc8e61baa90a5890e8586fd05f7b77ebb8e3","impliedFormat":99},{"version":"e223449e1f534fd2e67596c4d1639486d8c59ff6493fa18c48a8582b4868e38d","impliedFormat":99},{"version":"2c042e02275998a5900289691e21ed6197e2c840a1f429f84215b19a7afbda4f","affectsGlobalScope":true,"impliedFormat":99},{"version":"0f9bf22ae170253df9c066823286d671b235f790a883e5b589a27d764f5e496b","impliedFormat":99},{"version":"c43ba938acfd289f99d8b40a97ef5a3160e74454c94aeba7cf6b14e23e295cc9","impliedFormat":99},{"version":"62aeeafef24c03957247a85d0ed0de99b6729f9a86e3ccac91ef3595e593605a","impliedFormat":99},{"version":"8dae78932f4b82e80728702cc128d76473198cfd5685fb096bac6c7d27aeeb26","impliedFormat":99},{"version":"db5b7e5cd2f1974f5b1e7700e242b88b7821cff5d3bde4d172f3f27110cf52d9","impliedFormat":99},{"version":"979337b054c40208415f235ab576c9a4192c82c48e3cb5256f08845b0184e9fc","impliedFormat":99},{"version":"d914323d698be251f92dc77c6dd3e2addf5e0a708c2a8642ffb25dc442bc9795","impliedFormat":99},{"version":"1ac538f7e0fa26e1862f2a95f0418372d47492c7d9fc512a4e1ed629d6504531","impliedFormat":99},{"version":"1aa938e19683a0280c9da77733f06c8d58fa9a73f6c08ccd8050dfe4284819f5","impliedFormat":99},{"version":"2565c025c1bd13231b17050c1794b0ea135e43d312ff1e77815469720c799525","impliedFormat":99},{"version":"de6433fb0aabbc0d6cc0519bcdfc19de677189b5ee32433297a5227ab6980489","impliedFormat":99},{"version":"834959fefa661c9756b0eff19f0fd9555029258f02994c9f179975e00b20f6ff","impliedFormat":99},{"version":"cd7bc29b59a13c75912d2632da82757fcd40b11e80e33ba425120774e6748ce4","impliedFormat":99},{"version":"151f3b3d1cbbbea995e34e1bce84b22ff4991f09c52ef581fa8397a159049fc1","impliedFormat":99},{"version":"b60a591cd78ffa4249317c618da85aa1ab74207ea3a9a2d6ea1efaf73c10ffef","impliedFormat":99},{"version":"0354e8cd9622f4973ddd25ea96a27aa414d8aa34b26e0c4e19c505fd37cd6742","impliedFormat":99},{"version":"0b52d0feeff902147cbfbb2efc288864018147416c594a007336fb00ec950e69","impliedFormat":99},{"version":"9d9ce8d8ff6e46df3a878497f7ec5c28577b0dc30d6b991ecf6908ac85f6b816","impliedFormat":99},{"version":"386de59851a6de6ce1a060a1db0455f6b7eca562ce8edcfb35a5f48e7f6a26e3","impliedFormat":99},{"version":"89635984677fa37aa219e4f496a0a59e2bf2ba607df1120971aa9e023cdcfee2","impliedFormat":99},{"version":"b1e495b2c896a0d2e2854aa27718b80a6eb4ffc2623c3537200db9d52f6ba412","impliedFormat":99},{"version":"550cdd5fbd7977a795c811d4200b65ba1140d10ce1623cc9465632d5c3f245af","impliedFormat":99},{"version":"e9a8a25e3671f5b452312dc7b16b75b059675dda304d722a2be76e8a2c23a779","impliedFormat":99},{"version":"31bd2d789d87981e525e5dbd2ae5361b9a23ea61b1ac69a9c9c199a838dbe33c","impliedFormat":99},{"version":"8e98e3c603312ad103b3d12b2d46e1f5c36dccd4bdd54e44a7fcf05b08f74a55","impliedFormat":99},{"version":"3659a32284f13c4cd98e1d4788e7a2d9b7c62928858af396b050dbd4c29f09b6","affectsGlobalScope":true,"impliedFormat":99},{"version":"cc914408dfef7610ee5a5f8d30cd852e6cbd3e72bd624ff0574760a01653c3ce","impliedFormat":99},{"version":"0800e986afd9ed03866e48aae192c6e7c1e1ca7982e37843384474ca48ea5e80","impliedFormat":99},{"version":"24502863e090b350b16af6e9b64239c9f4c145f5c7ef08e21d941be10b4fcd1d","impliedFormat":99},{"version":"ea12734fe4078178caec054ab03ab54151a9ecfbddd25850d3282d158bb3c41a","impliedFormat":99},{"version":"1db6d1ec0d80e8467f50cfe0eb692e23ec5257b906f02e75e4de4abff0c93dcf","impliedFormat":99},{"version":"d42a1234fc7466f26339089a35114e52f7ad8ce1d0716775d49e3914bd6bc065","impliedFormat":99},{"version":"ff936db132dc2959f70604d7eca1df1419df1fddbcece2f65e18f2348e06cf77","impliedFormat":99},{"version":"f69fbb651300ba319a8080d6854ae7d131793e6e2b72b451af3a16fc486b063e","impliedFormat":99},{"version":"0f9639e2b74fe46d48877809f454bbbe4e06f925bc8e60ac249ccfecdb4462c7","impliedFormat":99},{"version":"39b131e8b9bd8bc5f7a6ac3a30ce3791f375e905afdd93cc678cccc37dfdf6d8","impliedFormat":99},{"version":"897b6a1b6aba1ef8f2ce46b3a90cfe228961aef845ec56a6263c91c52cb9d479","impliedFormat":99},{"version":"9372a6f9b8bd9d68c2c5c87a1b221f7cc5d5f49f1837799c61832b9d9cdfe4bf","impliedFormat":99},{"version":"8f649f8b323e74bd073623003a3a6ff139aef735f3a8d2e841ed33099dd8db43","impliedFormat":99},{"version":"84407ee4f0a4032e8efbcfeb60e0da6356747c42f30d5a191af09efff9028f61","impliedFormat":99},{"version":"0705c9a98325da0f9c4975fd4730350a6e365cb4fb4c6713be9e5050e1e47af0","impliedFormat":99},{"version":"2686d2455aef490d66b193857bc53378457776baaa5cafffb60439c1d4621aeb","impliedFormat":99},{"version":"0d335a723d369d6a977f74288888f5ab99772337ccfc954c8fd559c362d4cf16","impliedFormat":99},{"version":"7716ae4f02b7034a1062ad9dcfadd62de22a23c0ccfc700d3f001bea9192e5bb","impliedFormat":99},{"version":"4293d03bc28e73b3e796c92a7559137c21b9ad0103512ec2387292ca64c98c14","impliedFormat":99},{"version":"049704db7fac1b0214fbdb5b1cfe6387fc27e29da97341140c0d6e779373ccc8","impliedFormat":99},{"version":"1e86839421ee656747308ecfd5b533dbfc38eaa403c2cc68c360f2da08e28b47","impliedFormat":99},{"version":"5e81bec944418602321d7a99fe444b2ffebc42c709ab622429920fd471ca54ec","impliedFormat":99},{"version":"286b6412bc89ba7b9f0c21a4975a03e51324e1de92aa5dfd956593755f80f4ba","impliedFormat":99},{"version":"b0415cbf459f72228a34bad4c2f22b9f99b0139c006d45497debfa53ec9d3feb","impliedFormat":99},{"version":"285e7e66dbe9b4b543f37e7a2af46e0e5fcc6b2f06d173cdd49e560d96310183","impliedFormat":99},{"version":"f8d6cf64caea018d40c5a634b13d608437667ca71c6178641922ae9585512adb","impliedFormat":99},{"version":"65716c8c2b29723b54d4a91de7f3ba33778e7b4cbc4db8d50029bbb070c823c0","impliedFormat":99},{"version":"d764d2ee15af7473a0ae5cd3416e784ce48a333e1a2cbfcd973eb4df2126f540","impliedFormat":99},{"version":"4345d6532aa4e131fd912fa3136c3abda233d1cbe5ff481e77fb2db550dd5054","impliedFormat":99},{"version":"6fd6e46a0caea71e2770d9d13233f0de4c4b1ef6ecde200c3b740930bfe8e4c2","impliedFormat":99},{"version":"42d487cc5674668143e322ddae1cf5217e48997052760f078fe7029eb830adfa","impliedFormat":99},{"version":"0b4d80af11ae825da8412345e07d168d4b08ccccf24f67834225d343687e61ea","impliedFormat":99},{"version":"011894d7ecf6adf7ed569d380035da77ea7364ad9bc907b4071f7583ee2f2ef4","impliedFormat":99},{"version":"b00d1ed375d1174ffbd40b047c9c74258cb2ee0c3a3d56cb36d7b498c6714d45","impliedFormat":99},{"version":"33490b24e5642e4b2bd550a9dc76002fe80c61a03a04a41f4f9e141a55ee79b0","impliedFormat":99},{"version":"23c0d4b5fca17d7400981077827e5c1a78c8a754a555bda9614509a628190436","impliedFormat":99},{"version":"976bccf435147c6f45bff204b765d3dc8f69f4d3540eab394ebd459a107368b9","impliedFormat":99},{"version":"d36da8a13ae4d53d0befc2905f78eb912fa81e58ba38b5b6d973cf3ef22ce633","impliedFormat":99},{"version":"4b631f3e39b51e4e849b4f5b5c2398f3ceaa3c2c6e00507654ab5068c829c0a4","impliedFormat":1},{"version":"7c99839a94fb2de74caadbd5b7fd2687a64fdece9bfb2119c0331ab1ae7bd323","impliedFormat":99},{"version":"f6e434faf332ff8af29c5e145df82c34ab36fced4fee1d35692dcce12eccea1a","impliedFormat":99},{"version":"1ffca4aace16adfd0738f5e0750bc83842554743648dd550a87c69584fc5bb80","impliedFormat":99},{"version":"1b4309079a51d0c3811ddc06b973514eb01c61354b6e0c8a79d0c11156a1e0e1","impliedFormat":99},{"version":"4efb9fa48ae7daea66e36b9e88929f0f2bc97ad5a212c78a036caada74adaa10","impliedFormat":99},{"version":"6f37897af46ab88c4922b7741eeb56c4e5872e2c90a687604e429c766d0cfbff","impliedFormat":99},{"version":"5b182b33ff96a1b1ae3a2329520e7ba6305c49fac002c25d0c7b7863cbd87edd","impliedFormat":99},{"version":"f83c5d4e73d43714daaf597119170b65afd10a46e1f343cd109bd517b65963f1","impliedFormat":1},{"version":"db19ef667563291392f44218a6b2f167bc06db64022acc138952c3036445c55c","impliedFormat":1},{"version":"d6c5628189cd357931eaa84fc097caf3f232d8136be4b73da4292015fcab4efb","impliedFormat":99},{"version":"962e3c95a3db58921d169b550f95ca74b9f713c0ae4fb4b324cc9f2e6e0c68fb","impliedFormat":99},{"version":"85c2ffcc785bba846fe67f255306b9c2031ca75ff93b0c7df68c1f6a2e47a8d6","impliedFormat":99},{"version":"f1ab21867dbed4668b56ca91361e2b28b8077cf98ee7fba128adac02f5301c0e","impliedFormat":99},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":99},{"version":"0cb76b67373002d9ff0dd8673406deb926a15059192a7d63355977ea8f89d5a3","impliedFormat":99},{"version":"710f24e5ea4bb8467f192b3abe779ff71883bf4d5637d46f23d3c929020f6d87","impliedFormat":99},{"version":"48e5113f3a08fc0fd5d8ca1f9b6682a6975e6b4439040f9ac4a3678c70b4c160","impliedFormat":99},{"version":"5ddbf2f5809233d66f4fb443ef0eb8bf8616275c6c25db6d18baac60d7c4149e","impliedFormat":99},{"version":"e60d6e9004ad0c4bb2d0b59c0511812126e32e79e1f7a825a6c4d95cd641c132","impliedFormat":99},{"version":"948ebb41f7cdc5438908c0764107ed061619c17a7807c3cfdf02de4a4c423639","impliedFormat":99},{"version":"f9690ce8b910e9129249816076a34500d2544a16e7d57fb20e9c722a09946442","impliedFormat":99},{"version":"35d089b1bdf8fc11d35ca026b6f590a7df85be8cfdba2c40a18c434dd23a8eea","impliedFormat":99},{"version":"3aad22b028044b1f940e12bf30de33525e1b0e10cd89e36ed6ec4dd105f9ec5b","impliedFormat":99},{"version":"7ff6feef35770faee0342a95572745556682b491107364758e2513d3aa30c88a","impliedFormat":99},{"version":"79ab5aef157ce692b5aad8daba6e1d99e0b6b16483822c679146fff3a6ea3d54","impliedFormat":99},{"version":"142aa2794d7dc80e83c8dd2a05fcbb2726279c48627d930e2fdfd820288bcdf7","impliedFormat":99},{"version":"48ee596d05b3cd58f4850fc1f7f3fb55254906ded1547a75e3c9b93fd9f1d33b","impliedFormat":99},{"version":"604ab6dbc5fa5032e5b5b2a0c576e1d704788d27c8feaabc06a5510ed747dc1c","impliedFormat":99},{"version":"ea00507837178dcfe8d811647e9f58d4f554800166714f18f14bd647a8b75ff7","impliedFormat":99},{"version":"95b752d301bf19e391a41793a52400f9884dc39cda2f8e545a3673a1330c1e03","impliedFormat":99},{"version":"805a61440937d32e724853c618e3461eedd2edfa4b4a4e1435b0273b9e735eef","impliedFormat":99},{"version":"a2ba03160d9eed2138c8738bc886094c096c0ea0fd042924191738243b2bf783","impliedFormat":99},{"version":"f15cd7064579eb09ef5a1375f5d42933988ab2c6e8a2dc12eb70b1af7e4ace7f","impliedFormat":99},{"version":"a183b4e0211f4d4777b78c20b736333bf00db255027fdff5ce585272fa751142","impliedFormat":99},{"version":"8abd7133fc0772c6a316baf25f2a3075c7f48eca17be56ad62aa8dd150e8450f","impliedFormat":99},{"version":"4478c841b588cc8b286959ab6231e786accf12c5183c672c470cb48eb99c4304","impliedFormat":99},{"version":"cb1319eb87557e6d772d8328ef2b4a9cdaba67740a26e7dba6ee1dba0ec4c31f","impliedFormat":99},{"version":"26da8471fe124f13bd5e67afa071cad59f1704f90639f061664db7146d80726a","impliedFormat":99},{"version":"054aa1005ddbd81ff29bbfec4a28df907089fc57bc34ac167be04beba56fc2dc","impliedFormat":99},{"version":"952f442508f98240a03880212cdadca841faec6241a87062be3e5cfb7325f61b","impliedFormat":99},{"version":"e8bc288efa340c1c9ecfb7cfc292f5de195405c01ee26ca452d55e38c5f0c2ac","impliedFormat":99},{"version":"727e482cc4ba0a36c978b08e8318bbd625ced7d5f8beac5254345ef4c9030379","impliedFormat":99},{"version":"b68588a5a5f847457c48bbd3d8f92020f34917b551ae2b74dbd05b895cf15e98","impliedFormat":99},{"version":"f89991db18e7c7d291bd7205e88e2c77186eef00d70c7d85a7491954c499c546","impliedFormat":99},{"version":"7ee896eb5712521b35ce146cf4fbe78f8efeacc2ddca7b5152713e98484cd483","impliedFormat":99},{"version":"de9ae0f8901a6621ab047e0776c46eac04f8ce1577bfa0e90bc4005b7db42b9e","impliedFormat":99},{"version":"fa7fc5c7ba65ae612923daa9313445777eefb7001255f7734e62321cd705d60b","impliedFormat":99},{"version":"4784032656338f263960f96b698b6fdfb98a338ff9fb5a72a4b71a689ed53c6f","impliedFormat":99},{"version":"43552503d8186dd349dc27a050edcbec1293f9cd5479ae6d54c72cc393e91498","impliedFormat":99},{"version":"6b3a7028746a3026e8d3c91b04e36afc42a14b8007dbda14eacbd51f299b2e84","impliedFormat":99},{"version":"5b1d3d64bf6797f3d0f3445ce6c720a7790b28ba48439eb6706edc39c148eb41","impliedFormat":99},{"version":"7e8d1c38bbef1033431e521112c6e049b8b8b4707f75327ba63c290ff57237db","impliedFormat":99},{"version":"e396985f4fc8f06bcaa47619e7618eab42c3b75f928fed6a9698679f1671acaa","impliedFormat":99},{"version":"d933ac472169ae382157f670d6a721a969af8e13d532d5942790ff62d5ca719f","impliedFormat":99},{"version":"6dccec98221b8f35dd85dff813c158518aaaf7cbbbb796a47a1b534e2d37fe1c","impliedFormat":99},{"version":"c6d18f85f471ed25e74eb3c334be8952dd4ad65f71d586b2976ae464b0606e61","impliedFormat":99},{"version":"06bca4d019ba5e3de56c251fcaecfa405c06938308f0048797ecdc20c66cfcba","impliedFormat":99},{"version":"31327c8dfd5f1681510a6b84e2e9524416b253b720e3556c7825bae2fa1871ad","impliedFormat":99},{"version":"2513354fefbfd2113c9ba6cad5b22ddd7e662aa20e0ccdfe74335d56825c070c","impliedFormat":99},{"version":"636ae03391b0b1de5eb248b54972523eb0bc732e8dd32b35c9788da4f3fc7a87","impliedFormat":99},{"version":"79e745c110d2b2568bbac21a8c973cfd83bf9e938b7f9b57499068cfb52e16b5","impliedFormat":99},{"version":"608ee7fe5def5481ce42c1cf311500d929bb970eb66d6758c9786d26812f2c96","impliedFormat":99},{"version":"8c436933f912bb0d86d2d74f63f68e7a789337a0dd5bbb0416c7b70db4a7cc5d","impliedFormat":99},{"version":"1775de9c4a9fac92a7ec73426d231410435b1ca2724c25313318674d921bfcb2","impliedFormat":99},{"version":"257a75f1d6111b59bdf2ace4d05336a68e0cbf710c004fac35b584546368bc27","impliedFormat":99},{"version":"0eb3e0d437d2df53a482bf46eeaa4cb98e3ed1862cc9384ca4ec025406f9201b","impliedFormat":99},{"version":"42b356ad862fd7a406e27bb08c797fd484d97c49b2baefda6900e1785565eadf","impliedFormat":99},{"version":"053139e15b78b181d6049bf8678d4f3aad50fd279aaf78d044792965d6263ced","impliedFormat":99},{"version":"68e91f5e3c2990ac0d0aa2a04e28811b6783f2825a56cf924076d4a4f4bf4627","impliedFormat":99},{"version":"7967bf14b504c9b2b558c6d3d940c3113a9674b70392f59dd936e133080b9801","impliedFormat":99},{"version":"23ab8e9572a4c3db349e742204ba2fee8ea973c2ce9ee36275dae64d1f83841d","impliedFormat":99},{"version":"fdb80d0b9a94bca737a638b0f1effd4907bf9d2eb596e37cebb351a678a5f30d","impliedFormat":99},{"version":"b7eb2a925c4b8f91358b395c03670e052cf6798bfbcf50a4c4e3663d0ca1de1a","impliedFormat":99},{"version":"45d681089a47973215a781f9b8fb015959a0452ddbf87864ffe54598f5d16f76","impliedFormat":99},{"version":"c754bd00ab3a36c36fbce7bb3a7fa4e9f82ae2b3b15d128738d663394d1c03a2","impliedFormat":99},{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"0904660ae854e6d41f6ff25356db1d654436c6305b0f0aa89d1532df0253486e","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"230bdc111d7578276e4a3bb9d075d85c78c6b68f428c3a9935e2eaa10f4ae1f5","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"0e5974dfff7a97181c7c376545f126b20acf2f1341db7d3fccea4977bf3ce19c","impliedFormat":1},{"version":"c7f977ea78a1b060a30554c1c4ec0e2269c6e305a349ca2ada14931ac27ecc0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"145dcf25fd4967c610c53d93d7bc4dce8fbb1b6dd7935362472d4ae49363c7ba","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b8bf3fe89ec8baa335f6370b9fa36308e1bc7a72e2eb2dad1e94f31e27fa28b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"35390d6fa94bdb432c5d0bcb6547bdd11406c2692a6b90b9e47be2105ea19bd6","impliedFormat":1},{"version":"b33b74b97952d9bf4fbd2951dcfbb5136656ddb310ce1c84518aaa77dbca9992","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"8d117798e5228c7fdff887f44851d07320739c5cc0d511afae8f250c51809a36","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"8e7c3bed5f19ade8f911677ddc83052e2283e25b0a8654cd89db9079d4b323c7","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ccf3afaeebbeee4ca9092101e99fd6abd681116b6e5ec23e381bbb1e1f32262c","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"ab7818a9d57a9297b90e456fc68b77f84d74395a9210a3cfa9d87db33aff8b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb08062718a5470cd864c1fae0eb5b3a3adc5bcd05dcf87608d6f60b65eca3f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a815b7d1aebc0646b91548eab2fc19dada09ff255d04c71ced00bbd3058c8eb","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"836b36913830645ac3b28fe33731aac3fdb3524ee8adbb4cdab9a5c189f41943","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"47416e41b1af81e53e8c3cc5bf909d47ff632a7b6eddfe7ff43d187b4dcca047","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"5e91172586d1be7d1508d1a40c8bf76161f6f4179d1c25158a20599f9fb26a66","impliedFormat":99},{"version":"09d215b379a93f8cbb6caf9e9f5d7b4d48042295ee697e7e4771288c7917a21e","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"ab80d2cb170a92c61ca8c822d0db0fc50eb15c7c6cf1a24cb01852a5a15a7db8","impliedFormat":99},{"version":"d689a82dec12ec02e1c558870a50f71000e06f173151fcdff0458c587dbf016f","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"210955af8573671abebb6e1391d134d82fbcff130aa68922ea1e839f8f48a0ad","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"c371ea3efec17691f019bca670c161bee2f4787b1f464bdbbb10c4117bf0a55d","impliedFormat":99},{"version":"522ddb4826c1998c561eb98d221b99b5a10fc7602f87c1581f080653f474a392","impliedFormat":99},{"version":"7a26c49bdaf0d111d27dcd86b46811c5a122eec345b813a7641e4a48c5b5f257","impliedFormat":99},{"version":"2c8950f047390574b7859bed4ea68c2f8a6662d3474c9303c2ea4174679c3a29","impliedFormat":99},{"version":"9815245e5b09e1f7f27c001f0028f9f0bc7ebfd148f2d90d261c534083abf39c","impliedFormat":99},{"version":"4c3e6726be77856dce822bf54477a26d7a0c85862eda4f0f18a4858a5d58f7db","impliedFormat":99},{"version":"ee1ff7961560a22f6d72ab47887ca7b0afec1ff0cec28bb2874058046c0ec854","impliedFormat":99},{"version":"cb39fcdcdb7d1989da7153f8b4fcc7ac9f24939f3f8784103e9732341033fac2","impliedFormat":99},{"version":"0b592a66c2d4886d389ca87ce8cb593e334dea0d370aa9dc9f312d814a3a0f5c","impliedFormat":99},{"version":"bb9fbbe746638066fc939e55953dc4b566475c3d42cee7fe31ea43f3ebbc8350","impliedFormat":99},{"version":"e6d89baa1b33989a5e8fad524b63c9d270b49e297ae93b3ff33fdab11ace3f7a","impliedFormat":99},{"version":"a5a2522ba599b1286248ce6ccece1ac8f836bd60e8b201458d8948fef0222610","impliedFormat":99},{"version":"d27afd805f851bd7c30ba4633a0903e500158da8bba3a3e49dee8185685821da","impliedFormat":99}],"root":[[219,222],[258,311],[505,515]],"options":{"allowJs":false,"composite":true,"declarationMap":true,"erasableSyntaxOnly":true,"exactOptionalPropertyTypes":true,"module":199,"noErrorTruncation":true,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","rewriteRelativeImportExtensions":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"stripInternal":false,"target":9,"verbatimModuleSyntax":true},"referencedMap":[[504,1],[86,2],[483,3],[481,2],[436,2],[379,4],[380,4],[381,5],[328,6],[382,7],[383,8],[384,9],[326,2],[385,10],[386,11],[387,12],[388,13],[389,14],[390,15],[391,15],[392,16],[393,17],[394,18],[395,19],[329,2],[327,2],[396,20],[397,21],[398,22],[432,23],[399,24],[400,2],[401,25],[402,26],[403,27],[404,28],[405,29],[406,30],[407,31],[408,32],[409,33],[410,33],[411,34],[412,2],[413,35],[414,36],[416,37],[415,38],[417,39],[418,40],[419,41],[420,42],[421,43],[422,44],[423,45],[424,46],[425,47],[426,48],[427,49],[428,50],[429,51],[330,2],[331,52],[332,2],[333,2],[375,53],[376,54],[377,2],[378,39],[430,55],[431,56],[493,57],[470,58],[468,2],[469,2],[312,2],[323,59],[318,60],[321,61],[484,62],[475,2],[478,63],[477,64],[489,64],[476,65],[492,2],[320,66],[322,66],[314,67],[317,68],[471,67],[319,69],[313,2],[482,2],[161,70],[87,71],[162,72],[163,73],[131,74],[144,75],[139,76],[103,77],[164,78],[89,79],[140,80],[71,81],[166,82],[165,83],[167,84],[78,85],[99,86],[168,87],[132,88],[108,89],[90,90],[109,2],[85,91],[158,92],[169,93],[170,94],[75,95],[73,96],[171,97],[104,98],[83,99],[138,100],[172,101],[173,102],[174,103],[134,104],[159,105],[110,2],[68,106],[175,107],[74,2],[111,108],[176,109],[112,110],[67,111],[218,112],[76,2],[117,113],[177,114],[118,115],[178,2],[119,2],[91,116],[107,117],[180,118],[135,119],[84,120],[181,121],[182,122],[141,123],[143,124],[183,125],[92,2],[93,126],[184,127],[88,2],[185,128],[120,129],[160,130],[70,131],[69,132],[186,133],[151,134],[77,2],[133,135],[188,136],[79,137],[145,2],[95,138],[96,139],[98,140],[189,141],[179,142],[190,143],[136,144],[191,145],[121,146],[72,147],[192,148],[137,149],[193,2],[142,150],[156,151],[196,152],[82,153],[197,154],[100,155],[97,156],[130,157],[115,158],[113,159],[116,160],[122,161],[123,162],[114,163],[198,115],[94,164],[199,165],[195,166],[187,133],[105,167],[200,168],[106,169],[201,170],[124,171],[202,172],[203,2],[194,173],[101,174],[204,175],[129,176],[102,177],[205,108],[206,178],[207,179],[208,180],[209,181],[210,182],[211,183],[213,184],[212,185],[214,186],[157,187],[215,188],[216,189],[66,2],[217,190],[80,2],[223,191],[226,192],[235,193],[237,194],[228,195],[225,196],[234,197],[233,198],[230,199],[232,200],[251,201],[231,202],[229,2],[249,203],[239,204],[253,205],[252,206],[243,207],[248,208],[242,209],[241,210],[254,211],[255,212],[257,213],[250,2],[247,214],[246,215],[240,216],[256,217],[224,218],[152,219],[155,220],[154,221],[227,222],[153,223],[146,224],[238,225],[150,226],[148,227],[147,228],[149,229],[81,137],[441,2],[500,230],[502,231],[501,232],[499,233],[498,2],[128,234],[236,2],[244,2],[245,235],[459,236],[457,237],[458,238],[446,239],[447,237],[454,240],[445,241],[450,242],[460,2],[451,243],[456,244],[462,245],[461,246],[444,247],[452,248],[453,249],[448,250],[455,236],[449,251],[125,2],[127,252],[126,252],[438,253],[437,254],[443,2],[485,2],[315,2],[316,255],[63,2],[64,2],[12,2],[10,2],[11,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[65,2],[57,2],[58,2],[60,2],[59,2],[61,2],[1,2],[62,2],[14,2],[13,2],[351,256],[363,257],[349,258],[364,259],[373,260],[340,261],[341,262],[339,263],[372,264],[367,265],[371,266],[343,267],[360,268],[342,269],[370,270],[337,271],[338,265],[344,272],[345,2],[350,273],[348,272],[335,274],[374,275],[365,276],[354,277],[353,272],[355,278],[358,279],[352,280],[356,281],[368,264],[346,282],[347,283],[359,284],[336,259],[362,285],[361,272],[357,286],[366,2],[334,2],[369,287],[487,288],[473,289],[474,288],[472,2],[434,290],[467,291],[440,292],[435,290],[433,2],[439,293],[465,2],[463,2],[464,2],[442,2],[466,294],[486,295],[479,296],[488,297],[325,298],[494,299],[496,300],[490,301],[497,302],[495,303],[480,304],[491,305],[503,306],[324,2],[298,307],[299,308],[275,309],[277,310],[276,311],[273,309],[274,312],[265,313],[272,314],[505,315],[259,316],[300,317],[292,318],[293,319],[296,320],[297,321],[294,322],[295,323],[506,324],[290,325],[291,326],[285,327],[284,323],[261,328],[268,329],[269,330],[263,331],[270,332],[262,333],[301,334],[271,335],[507,336],[258,337],[260,337],[508,338],[289,339],[221,340],[220,341],[219,337],[222,342],[509,343],[280,344],[283,345],[278,337],[279,337],[511,346],[510,344],[512,347],[281,337],[513,348],[264,337],[514,349],[282,344],[305,350],[306,351],[267,352],[266,353],[311,354],[302,355],[304,356],[303,357],[515,358],[286,359],[287,360],[288,361],[308,362],[310,363],[309,362],[307,337]],"affectedFilesPendingEmit":[[298,51],[299,51],[275,51],[277,51],[276,51],[273,51],[274,51],[265,51],[272,51],[505,51],[259,51],[300,51],[292,51],[293,51],[296,51],[297,51],[294,51],[295,51],[506,51],[290,51],[291,51],[285,51],[284,51],[261,51],[268,51],[269,51],[263,51],[270,51],[262,51],[301,51],[271,51],[507,51],[258,51],[260,51],[508,51],[289,51],[221,51],[220,51],[219,51],[222,51],[509,51],[280,51],[283,51],[278,51],[279,51],[511,51],[510,51],[512,51],[281,51],[513,51],[264,51],[514,51],[282,51],[305,51],[306,51],[267,51],[266,51],[311,51],[302,51],[304,51],[303,51],[515,51],[286,51],[287,51],[288,51],[308,51],[310,51],[309,51],[307,51]],"emitSignatures":[219,220,221,222,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,505,506,507,508,509,510,511,512,513,514,515],"version":"6.0.3"} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99c5371..31d1733 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@effect/vitest': + specifier: 4.0.0-beta.99 + version: 4.0.0-beta.99(effect@4.0.0-beta.99)(vitest@4.1.9(@types/node@24.12.0)(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0))) oxfmt: specifier: ^0.55.0 version: 0.55.0 @@ -24,66 +27,59 @@ importers: examples: dependencies: '@effect/platform-node': - specifier: 4.0.0-beta.84 - version: 4.0.0-beta.84(effect@4.0.0-beta.84)(ioredis@5.11.1) + specifier: 4.0.0-beta.99 + version: 4.0.0-beta.99(effect@4.0.0-beta.99)(ioredis@5.11.1) + '@mxfx/crypto-node': + specifier: workspace:^ + version: link:../packages/crypto-node effect: - specifier: 4.0.0-beta.84 - version: 4.0.0-beta.84 + specifier: 4.0.0-beta.99 + version: 4.0.0-beta.99 mxfx: specifier: workspace:^ version: link:../packages/mxfx + packages/crypto-node: + dependencies: + '@matrix-org/matrix-sdk-crypto-nodejs': + specifier: ^0.6.1 + version: 0.6.1 + effect: + specifier: 4.0.0-beta.99 + version: 4.0.0-beta.99 + mxfx: + specifier: workspace:* + version: link:../mxfx + packages/mxfx: dependencies: effect: - specifier: 4.0.0-beta.94 - version: 4.0.0-beta.98 + specifier: 4.0.0-beta.99 + version: 4.0.0-beta.99 devDependencies: - '@effect/platform-node': - specifier: 4.0.0-beta.94 - version: 4.0.0-beta.94(effect@4.0.0-beta.98)(ioredis@5.11.1) - '@effect/vitest': - specifier: 4.0.0-beta.94 - version: 4.0.0-beta.94(effect@4.0.0-beta.98)(vitest@3.2.6(@types/node@24.12.0)(yaml@2.9.0)) typescript: specifier: ^6.0.3 version: 6.0.3 - vitest: - specifier: ^3.1.9 - version: 3.2.6(@types/node@24.12.0)(yaml@2.9.0) packages: - '@effect/platform-node-shared@4.0.0-beta.85': - resolution: {integrity: sha512-JXM5f2j2L2oGxuQG12sysPJeFYKtB388BruyHb/IfxJ/5Wx8KDo3eKLRe6tmg7y7BNeZTxEb14tPKC853+mqeg==} - engines: {node: '>=18.0.0'} - peerDependencies: - effect: ^4.0.0-beta.85 - - '@effect/platform-node-shared@4.0.0-beta.98': - resolution: {integrity: sha512-iySXaffnCJX1sNAIp79ghhIeui9E5qwUQyqd1VLPkB9UNO4vdpd9B5fTEXwe7S/GusL4jsk9vSvX38XJgRFG1w==} + '@effect/platform-node-shared@4.0.0-beta.99': + resolution: {integrity: sha512-POBAowafsAAb3bH1x1rJlWnv32yMAazFgEuRW5LhkW/JJA5VGoEk9OnuoUkIH1OW6K/X6IrdNpqcO+5e9lPQJA==} engines: {node: '>=18.0.0'} peerDependencies: - effect: ^4.0.0-beta.98 + effect: ^4.0.0-beta.99 - '@effect/platform-node@4.0.0-beta.84': - resolution: {integrity: sha512-WHPXaaIR1NpiANg+TOfTRupx9Uf2h/WVFZxRQdg5soUpa8bU61NwKxi3A5F/zLpp2AkRPgHTw1rQjwUD+/uA9A==} + '@effect/platform-node@4.0.0-beta.99': + resolution: {integrity: sha512-jnK2KMW4W50AEOKK+Tgvab3YPHBxa3ApLQE8BCad+LH57JOziKzOjqtEpAgJgmao3t77x1UESK4JraaHJDHaYA==} engines: {node: '>=18.0.0'} peerDependencies: - effect: ^4.0.0-beta.84 + effect: ^4.0.0-beta.99 ioredis: ^5.7.0 - '@effect/platform-node@4.0.0-beta.94': - resolution: {integrity: sha512-3WhV5ZN2pTPcOtEQlM66Ve0/B4EzF88sYBml97NnRV7BA5Kx0FYLSslc/4aWoaXj6XwuWOxmoXeGGeFzw4gbMQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - effect: ^4.0.0-beta.94 - ioredis: ^5.7.0 - - '@effect/vitest@4.0.0-beta.94': - resolution: {integrity: sha512-pCjcUMTBizn2wibiyP9Tl3VvGEkplvIA33iCvmK3y/toi54IWE3PNL7d0JkZvEaKV2OoaKVTaH1dOybRtpBuQw==} + '@effect/vitest@4.0.0-beta.99': + resolution: {integrity: sha512-SiZo3UGTsG2itbqLU1SJVmFraK+0AkrEU7ZLRpQALx3lFRBaohzB/7UQKVsRjCHHjDg0kNkGitZusGRN3mVAhg==} peerDependencies: - effect: ^4.0.0-beta.94 + effect: ^4.0.0-beta.99 vitest: ^3.0.0 || ^4.0.0 '@esbuild/aix-ppc64@0.27.7': @@ -248,6 +244,10 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@matrix-org/matrix-sdk-crypto-nodejs@0.6.1': + resolution: {integrity: sha512-xDulwTJfgHtA0rx/bi8JPc0m/hvImiuixfOoomUQYicBAi59xe8Cqc04K2GLQA+yc6JuqXfg6vLsNSgrStpLhw==} + engines: {node: '>= 24'} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} cpu: [arm64] @@ -708,23 +708,9 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@vitest/expect@3.2.6': - resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} - '@vitest/expect@4.1.9': resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@3.2.6': - resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/mocker@4.1.9': resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: @@ -736,56 +722,33 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.6': - resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} - '@vitest/pretty-format@4.1.9': resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - '@vitest/runner@3.2.6': - resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} - '@vitest/runner@4.1.9': resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@3.2.6': - resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} - '@vitest/snapshot@4.1.9': resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@3.2.6': - resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} - '@vitest/spy@4.1.9': resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@3.2.6': - resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} - '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - cluster-key-slot@1.1.1: resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} engines: {node: '>=0.10.0'} @@ -802,10 +765,6 @@ packages: supports-color: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -814,14 +773,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - effect@4.0.0-beta.84: - resolution: {integrity: sha512-zWwFI9WZ4TsddBmtcuuAO2IXGR0Dp56xIUt8cX29ZeyOEtErXqP6muDaVpro08lGiMSOGMqSpuH/C1TUxHsRAA==} - - effect@4.0.0-beta.98: - resolution: {integrity: sha512-oz+bsG5h+6RNrw4t5GMfQrk/xBS8ROoqkYsuvRhBr5O7mCOrpvH/hbw+QrDzvKIpX4HJClwm86F94c87W0sJxg==} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + effect@4.0.0-beta.99: + resolution: {integrity: sha512-hP1C61uzINfLl/4kKMwcqksxd34s4sQ3VSjsWjhGrkx9CRlXaqnfOK9dpTEKynQ6rA7wU9rb3c+48eDYw7uzxA==} es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} @@ -838,10 +791,6 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - fast-check@4.8.0: - resolution: {integrity: sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg==} - engines: {node: '>=12.17.0'} - fast-check@4.9.0: resolution: {integrity: sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==} engines: {node: '>=12.17.0'} @@ -863,6 +812,10 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + ini@7.0.0: resolution: {integrity: sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -871,15 +824,9 @@ packages: resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} engines: {node: '>=12.22.0'} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - kubernetes-types@1.30.0: resolution: {integrity: sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -898,9 +845,6 @@ packages: msgpackr@2.0.4: resolution: {integrity: sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA==} - multipasta@0.2.7: - resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==} - multipasta@0.2.8: resolution: {integrity: sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==} @@ -909,6 +853,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + node-downloader-helper@2.1.11: + resolution: {integrity: sha512-882fH2C9AWdiPCwz/2beq5t8FGMZK9Dx8TJUOIxzMCbvG7XUKM5BuJwN5f0NKo4SCQK6jR4p2TPm54mYGdGchQ==} + engines: {node: '>=14.18'} + hasBin: true + node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true @@ -950,10 +899,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -994,21 +939,12 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.2.4: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} @@ -1017,30 +953,14 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} - - toml@4.1.1: - resolution: {integrity: sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==} - engines: {node: '>=20'} - toml@4.3.0: resolution: {integrity: sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==} engines: {node: '>=20'} @@ -1053,19 +973,14 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@8.5.0: - resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==} + undici@8.7.0: + resolution: {integrity: sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==} engines: {node: '>=22.19.0'} uuid@14.0.1: resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} hasBin: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1106,34 +1021,6 @@ packages: yaml: optional: true - vitest@3.2.6: - resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.6 - '@vitest/ui': 3.2.6 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@4.1.9: resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1199,50 +1086,30 @@ packages: snapshots: - '@effect/platform-node-shared@4.0.0-beta.85(effect@4.0.0-beta.84)': + '@effect/platform-node-shared@4.0.0-beta.99(effect@4.0.0-beta.99)': dependencies: '@types/ws': 8.18.1 - effect: 4.0.0-beta.84 + effect: 4.0.0-beta.99 ws: 8.21.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@4.0.0-beta.98(effect@4.0.0-beta.98)': - dependencies: - '@types/ws': 8.18.1 - effect: 4.0.0-beta.98 - ws: 8.21.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@effect/platform-node@4.0.0-beta.84(effect@4.0.0-beta.84)(ioredis@5.11.1)': - dependencies: - '@effect/platform-node-shared': 4.0.0-beta.85(effect@4.0.0-beta.84) - effect: 4.0.0-beta.84 - ioredis: 5.11.1 - mime: 4.1.0 - undici: 8.5.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@effect/platform-node@4.0.0-beta.94(effect@4.0.0-beta.98)(ioredis@5.11.1)': + '@effect/platform-node@4.0.0-beta.99(effect@4.0.0-beta.99)(ioredis@5.11.1)': dependencies: - '@effect/platform-node-shared': 4.0.0-beta.98(effect@4.0.0-beta.98) - effect: 4.0.0-beta.98 + '@effect/platform-node-shared': 4.0.0-beta.99(effect@4.0.0-beta.99) + effect: 4.0.0-beta.99 ioredis: 5.11.1 mime: 4.1.0 - undici: 8.5.0 + undici: 8.7.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/vitest@4.0.0-beta.94(effect@4.0.0-beta.98)(vitest@3.2.6(@types/node@24.12.0)(yaml@2.9.0))': + '@effect/vitest@4.0.0-beta.99(effect@4.0.0-beta.99)(vitest@4.1.9(@types/node@24.12.0)(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0)))': dependencies: - effect: 4.0.0-beta.98 - vitest: 3.2.6(@types/node@24.12.0)(yaml@2.9.0) + effect: 4.0.0-beta.99 + vitest: 4.1.9(@types/node@24.12.0)(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0)) '@esbuild/aix-ppc64@0.27.7': optional: true @@ -1326,6 +1193,13 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@matrix-org/matrix-sdk-crypto-nodejs@0.6.1': + dependencies: + https-proxy-agent: 7.0.6 + node-downloader-helper: 2.1.11 + transitivePeerDependencies: + - supports-color + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': optional: true @@ -1570,14 +1444,6 @@ snapshots: dependencies: '@types/node': 24.12.0 - '@vitest/expect@3.2.6': - dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - tinyrainbow: 2.0.0 - '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 @@ -1587,14 +1453,6 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.6(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 3.2.6 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.1(@types/node@24.12.0)(yaml@2.9.0) - '@vitest/mocker@4.1.9(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.9 @@ -1603,31 +1461,15 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@24.12.0)(yaml@2.9.0) - '@vitest/pretty-format@3.2.6': - dependencies: - tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@3.2.6': - dependencies: - '@vitest/utils': 3.2.6 - pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/runner@4.1.9': dependencies: '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@3.2.6': - dependencies: - '@vitest/pretty-format': 3.2.6 - magic-string: 0.30.21 - pathe: 2.0.3 - '@vitest/snapshot@4.1.9': dependencies: '@vitest/pretty-format': 4.1.9 @@ -1635,40 +1477,20 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.6': - dependencies: - tinyspy: 4.0.4 - '@vitest/spy@4.1.9': {} - '@vitest/utils@3.2.6': - dependencies: - '@vitest/pretty-format': 3.2.6 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - '@vitest/utils@4.1.9': dependencies: '@vitest/pretty-format': 4.1.9 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - assertion-error@2.0.1: {} - - cac@6.7.14: {} + agent-base@7.1.4: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + assertion-error@2.0.1: {} chai@6.2.2: {} - check-error@2.1.3: {} - cluster-key-slot@1.1.1: {} convert-source-map@2.0.0: {} @@ -1677,27 +1499,12 @@ snapshots: dependencies: ms: 2.1.3 - deep-eql@5.0.2: {} - denque@2.1.0: {} detect-libc@2.1.2: optional: true - effect@4.0.0-beta.84: - dependencies: - '@standard-schema/spec': 1.1.0 - fast-check: 4.8.0 - find-my-way-ts: 0.1.6 - ini: 7.0.0 - kubernetes-types: 1.30.0 - msgpackr: 2.0.4 - multipasta: 0.2.7 - toml: 4.1.1 - uuid: 14.0.1 - yaml: 2.9.0 - - effect@4.0.0-beta.98: + effect@4.0.0-beta.99: dependencies: '@standard-schema/spec': 1.1.0 fast-check: 4.9.0 @@ -1710,8 +1517,6 @@ snapshots: uuid: 14.0.1 yaml: 2.9.0 - es-module-lexer@1.7.0: {} - es-module-lexer@2.1.0: {} esbuild@0.27.7: @@ -1749,10 +1554,6 @@ snapshots: expect-type@1.3.0: {} - fast-check@4.8.0: - dependencies: - pure-rand: 8.4.0 - fast-check@4.9.0: dependencies: pure-rand: 8.4.0 @@ -1766,6 +1567,13 @@ snapshots: fsevents@2.3.3: optional: true + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + ini@7.0.0: {} ioredis@5.11.1: @@ -1780,12 +1588,8 @@ snapshots: transitivePeerDependencies: - supports-color - js-tokens@9.0.1: {} - kubernetes-types@1.30.0: {} - loupe@3.2.1: {} - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -1810,12 +1614,12 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.4 - multipasta@0.2.7: {} - multipasta@0.2.8: {} nanoid@3.3.11: {} + node-downloader-helper@2.1.11: {} + node-gyp-build-optional-packages@5.2.2: dependencies: detect-libc: 2.1.2 @@ -1882,8 +1686,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@4.0.4: {} @@ -1941,18 +1743,10 @@ snapshots: standard-as-callback@2.1.0: {} - std-env@3.10.0: {} - std-env@4.1.0: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - tinybench@2.9.0: {} - tinyexec@0.3.2: {} - tinyexec@1.2.4: {} tinyglobby@0.2.15: @@ -1960,49 +1754,20 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinypool@1.1.1: {} - tinypool@2.1.0: {} - tinyrainbow@2.0.0: {} - tinyrainbow@3.1.0: {} - tinyspy@4.0.4: {} - - toml@4.1.1: {} - toml@4.3.0: {} typescript@6.0.3: {} undici-types@7.16.0: {} - undici@8.5.0: {} + undici@8.7.0: {} uuid@14.0.1: {} - vite-node@3.2.4(@types/node@24.12.0)(yaml@2.9.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.1(@types/node@24.12.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 @@ -2016,47 +1781,6 @@ snapshots: fsevents: 2.3.3 yaml: 2.9.0 - vitest@3.2.6(@types/node@24.12.0)(yaml@2.9.0): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - debug: 4.4.3 - expect-type: 1.3.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@24.12.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@24.12.0)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.12.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@4.1.9(@types/node@24.12.0)(vite@7.3.1(@types/node@24.12.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.9 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2705171..cad9f8b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,8 @@ +ignoreWorkspaceRootCheck: false packages: - examples - packages/mxfx + - packages/crypto-node allowBuilds: + "@matrix-org/matrix-sdk-crypto-nodejs": true esbuild: true - msgpackr-extract: set this to true or false