@appweaver/core 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/export/export-service.d.ts +4 -3
  2. package/export/export-service.js +33 -22
  3. package/factory/create-model.js +36 -21
  4. package/factory/create-service.js +5 -3
  5. package/package.json +2 -2
  6. package/prisma/client/commonInputTypes.d.ts +0 -50
  7. package/prisma/client/internal/class.js +3 -3
  8. package/prisma/client/models/File.d.ts +15 -28
  9. package/resource/resource-loader.js +6 -0
  10. package/resource/resource-routes.js +2 -2
  11. package/resource/resource-schema.d.ts +38 -12
  12. package/resource/resource-schema.js +63 -15
  13. package/resource/resource-service.d.ts +25 -16
  14. package/resource/resource-service.js +61 -26
  15. package/resource/schemas/resource-sort-schema.js +2 -2
  16. package/resource/utils/cursor-util.d.ts +60 -0
  17. package/resource/utils/cursor-util.js +117 -0
  18. package/resource/utils/index.d.ts +1 -0
  19. package/resource/utils/index.js +1 -0
  20. package/resource/utils/relation-util.d.ts +3 -3
  21. package/resource/utils/relation-util.js +1 -1
  22. package/resource/utils/sort-util.d.ts +11 -0
  23. package/resource/utils/sort-util.js +18 -0
  24. package/security/api-key/api-key-auth.js +4 -1
  25. package/security/auth-service.d.ts +7 -7
  26. package/security/auth-service.js +43 -5
  27. package/security/create-auth-resources.d.ts +2 -1
  28. package/security/oauth2/create-oauth2-plugin.js +3 -34
  29. package/security/oauth2/oauth2-microsoft.js +1 -1
  30. package/security/oauth2/oauth2-util.d.ts +9 -7
  31. package/security/oauth2/oauth2-util.js +17 -10
  32. package/security/resources/api-key/model.js +2 -0
  33. package/security/resources/connected-account/model.js +2 -0
  34. package/security/store/database-security-store.js +2 -1
  35. package/storage/file-service.d.ts +19 -4
  36. package/storage/file-service.js +199 -146
  37. package/storage/resources/file/model.js +4 -2
  38. package/types/auth.d.ts +8 -8
  39. package/types/generated.d.ts +8 -2
  40. package/types/index.d.ts +1 -0
  41. package/types/index.js +1 -0
  42. package/types/storage.d.ts +16 -0
  43. package/types/storage.js +2 -0
  44. package/utils/index.d.ts +1 -0
  45. package/utils/index.js +1 -0
  46. package/utils/model-util.d.ts +12 -0
  47. package/utils/model-util.js +113 -0
@@ -8,12 +8,13 @@ export type ExportStream = {
8
8
  export declare class ExportService {
9
9
  /**
10
10
  * Exports data as a CSV stream based on the provided filter and sort parameters.
11
- * The method retrieves the data in batches and streams it in CSV format.
11
+ * The records are read batch by batch, each following the cursor of the
12
+ * previous one, so the export never counts the records up front.
12
13
  *
13
14
  * @param {string} modelName - The resource name for which to export data.
14
15
  * @param {Object} [filter={}] - The filter conditions to apply when retrieving the data. Default is an empty object.
15
- * @param {QuerySort} [sort='-createdAt,id'] - The sorting criteria for the data, given either as a comma-separated
16
- * field list or as an object of field directions. Default is `-createdAt, id`.
16
+ * @param {QuerySort} [sort='-createdAt'] - The sorting criteria for the data, given either as a comma-separated
17
+ * field list or as an object of field directions.
17
18
  * @return {Promise<ExportStream>} A promise resolving to the export stream object, which includes the readable
18
19
  * stream, MIME type, and file name for the CSV.
19
20
  */
@@ -9,48 +9,59 @@ const utils_1 = require("../utils");
9
9
  class ExportService {
10
10
  /**
11
11
  * Exports data as a CSV stream based on the provided filter and sort parameters.
12
- * The method retrieves the data in batches and streams it in CSV format.
12
+ * The records are read batch by batch, each following the cursor of the
13
+ * previous one, so the export never counts the records up front.
13
14
  *
14
15
  * @param {string} modelName - The resource name for which to export data.
15
16
  * @param {Object} [filter={}] - The filter conditions to apply when retrieving the data. Default is an empty object.
16
- * @param {QuerySort} [sort='-createdAt,id'] - The sorting criteria for the data, given either as a comma-separated
17
- * field list or as an object of field directions. Default is `-createdAt, id`.
17
+ * @param {QuerySort} [sort='-createdAt'] - The sorting criteria for the data, given either as a comma-separated
18
+ * field list or as an object of field directions.
18
19
  * @return {Promise<ExportStream>} A promise resolving to the export stream object, which includes the readable
19
20
  * stream, MIME type, and file name for the CSV.
20
21
  */
21
- async exportCsv(modelName, filter = {}, sort = '-createdAt,id') {
22
+ async exportCsv(modelName, filter = {}, sort = '-createdAt') {
22
23
  const service = (0, context_1.injectService)(modelName);
23
24
  let exportStream;
24
25
  try {
25
- // Initial query is also useful to expose any errors before stream start.
26
- const checkResult = await service.query(filter, 1, 0, sort);
27
- const totalCount = checkResult.totalCount;
28
26
  const batchSize = common_1.config.EXPORT_BATCH_SIZE;
29
- let page = 0;
30
27
  const mapValues = (items) => this.mapProperties(modelName, items);
31
- exportStream = new node_stream_1.Readable({
32
- async read() {
33
- page++;
28
+ const readBatch = (cursor) => service.query(filter, 1, batchSize, sort, cursor, false);
29
+ // Read before the stream is handed out, so a failing query becomes an
30
+ // error response instead of a truncated download
31
+ const firstBatch = await readBatch();
32
+ // A generator rather than a `read` callback, which the stream may re-enter
33
+ // while an awaited batch is pending and would then write it twice
34
+ async function* rows() {
35
+ if (common_1.config.EXPORT_CSV_ADD_SEP_ROW) {
36
+ yield `SEP=${common_1.config.EXPORT_CSV_DELIMITER}\n`;
37
+ }
38
+ let batch = firstBatch;
39
+ let addHeaders = common_1.config.EXPORT_CSV_ADD_HEADERS;
40
+ while (batch) {
41
+ let chunk;
42
+ let next;
34
43
  try {
35
- const result = await service.query(filter, page, batchSize, sort);
36
- if (result.resultCount > 0) {
37
- const data = mapValues(result.items);
38
- this.push((0, utils_1.toCsv)(data, common_1.config.EXPORT_CSV_ADD_HEADERS ? page === 1 : false));
44
+ if (batch.resultCount > 0) {
45
+ chunk = (0, utils_1.toCsv)(mapValues(batch.items), addHeaders);
46
+ addHeaders = false;
39
47
  }
48
+ // A next cursor is returned only while further records match
49
+ next = batch.nextCursor
50
+ ? await readBatch(batch.nextCursor)
51
+ : undefined;
40
52
  }
41
53
  catch (e) {
54
+ // End early rather than fail a download already in flight
42
55
  common_1.logger.error(e, `${modelName} export error`);
43
- this.push(null);
44
- return;
56
+ next = undefined;
45
57
  }
46
- if (page * batchSize >= totalCount) {
47
- this.push(null);
58
+ if (chunk !== undefined) {
59
+ yield chunk;
48
60
  }
61
+ batch = next;
49
62
  }
50
- });
51
- if (common_1.config.EXPORT_CSV_ADD_SEP_ROW) {
52
- exportStream.push(`SEP=${common_1.config.EXPORT_CSV_DELIMITER}\n`);
53
63
  }
64
+ exportStream = node_stream_1.Readable.from(rows(), { objectMode: false });
54
65
  }
55
66
  catch (e) {
56
67
  throw new errors_1.HttpError(`${modelName} export error`, 500, e);
@@ -10,8 +10,20 @@ const common_1 = require("@appweaver/common");
10
10
  const context_1 = require("../context");
11
11
  const resource_1 = require("../resource");
12
12
  function createModel(config, override = false) {
13
+ const resourceModel = buildModel(config);
14
+ common_1.logger.debug({ modelName: resourceModel.name }, 'Created resource model');
15
+ (0, context_1.define)(resourceModel, undefined, override ? 'override' : undefined);
16
+ // The relation inputs and audit fields reference the primary key of another
17
+ // model, which may not be loaded yet. Loaders call this hook once every model
18
+ // is registered, so those references resolve against their final id type.
19
+ resourceModel[common_1.RESOURCE_MODEL_RELINK] = () => {
20
+ Object.assign(resourceModel, buildModel(config));
21
+ };
22
+ return resourceModel;
23
+ }
24
+ function buildModel(config) {
13
25
  const name = (0, common_1.capitalize)(config.name || node_path_1.default.basename(node_path_1.default.dirname(__dirname)));
14
- const idSchema = buildIdSchema(config?.id);
26
+ const idSchema = (0, resource_1.idSchema)(config?.id);
15
27
  const auditSchema = buildAuditSchema(config?.audit);
16
28
  const scalarsSchema = buildScalarsSchema(config?.scalars);
17
29
  const virtualSchema = buildScalarsSchema(config?.virtual);
@@ -43,6 +55,7 @@ function createModel(config, override = false) {
43
55
  const resourceModel = {
44
56
  name,
45
57
  config: config,
58
+ idModel: idSchema,
46
59
  readModel,
47
60
  createModel,
48
61
  updateModel,
@@ -66,22 +79,20 @@ function createModel(config, override = false) {
66
79
  }
67
80
  resourceModel[common_1.RESOURCE_NAME] = name;
68
81
  resourceModel[common_1.RESOURCE_TYPE] = common_1.RESOURCE_MODEL_TYPE;
69
- common_1.logger.debug({ modelName: name }, 'Created resource model');
70
- (0, context_1.define)(resourceModel, undefined, override ? 'override' : undefined);
71
82
  return resourceModel;
72
83
  }
73
- function buildIdSchema(idField = { type: 'int' }) {
74
- let idType;
75
- switch (idField.type) {
76
- case 'string':
77
- idType = resource_1.IdString;
78
- break;
79
- case 'int':
80
- case 'bigInt':
81
- default:
82
- idType = resource_1.Id;
84
+ function referencedIdField(modelName) {
85
+ if (!modelName) {
86
+ return undefined;
87
+ }
88
+ return context_1.context.resource.models.get((0, common_1.capitalize)(modelName))?.config?.id;
89
+ }
90
+ function authIdField() {
91
+ for (const model of context_1.context.resource.models.values()) {
92
+ if ((0, common_1.isResourceAuthModel)(model)) {
93
+ return model.config?.id;
94
+ }
83
95
  }
84
- return idType;
85
96
  }
86
97
  function buildAuditSchema(audit = {}) {
87
98
  const defaultAudit = {
@@ -96,7 +107,7 @@ function buildAuditSchema(audit = {}) {
96
107
  fields.push(name);
97
108
  }
98
109
  }
99
- return typebox_1.Type.Pick(resource_1.AuditData, fields);
110
+ return typebox_1.Type.Pick((0, resource_1.auditSchema)(authIdField()), fields);
100
111
  }
101
112
  function buildScalarsSchema(fields = {}) {
102
113
  const properties = {};
@@ -294,13 +305,17 @@ function relationInputProperties(object, relationConfig, inputType) {
294
305
  // requests accept them
295
306
  const acceptsInlineWrite = config?.input?.allowCreate ||
296
307
  (config?.input?.allowUpdate && inputType === 'update');
297
- // Existing records are connected by an id object or a bare id value.
298
- // Relations accepting inline writes take the permissive input model
299
- // instead, which also covers a lone id. Only one object schema may join
300
- // the union, since the server strips undeclared properties.
308
+ // Existing records are connected by an id object or a bare id value, both
309
+ // typed after the primary key of the related model. Relations accepting
310
+ // inline writes take the permissive input model instead, which also covers
311
+ // a lone id. Only one object schema may join the union, since the server
312
+ // strips undeclared properties.
313
+ const relatedIdField = referencedIdField(config?.model);
301
314
  const itemSchemas = [
302
- acceptsInlineWrite ? typebox_1.Type.Ref(`${config.model}RelationInput`) : resource_1.Id,
303
- resource_1.Id.properties.id
315
+ acceptsInlineWrite
316
+ ? typebox_1.Type.Ref(`${config.model}RelationInput`)
317
+ : (0, resource_1.idSchema)(relatedIdField),
318
+ (0, resource_1.idValueSchema)(relatedIdField)
304
319
  ];
305
320
  const isArrayType = type === 'array';
306
321
  const isOptional = config?.required === false;
@@ -24,15 +24,17 @@ function createService(config, override = false) {
24
24
  await config.afterFind?.(result);
25
25
  return result;
26
26
  }
27
- async query(filter = {}, page = 1, size = 50, sort = '-createdAt,id') {
28
- await config.beforeQuery?.(filter, page, size, sort);
29
- const result = await super.query(filter, page, size, sort);
27
+ async query(filter = {}, page = 1, size = 50, sort = '-createdAt', cursor, totalCount = true) {
28
+ await config.beforeQuery?.(filter, page, size, sort, cursor, totalCount);
29
+ const result = await super.query(filter, page, size, sort, cursor, totalCount);
30
30
  await config.afterQuery?.(result);
31
31
  return result;
32
32
  }
33
33
  async aggregate(filter = {}, select, dateField = 'createdAt', from, to, step, safeIncrement = true) {
34
34
  await config.beforeAggregate?.(filter, select, dateField, from, to, step, safeIncrement);
35
35
  const result = await super.aggregate(filter, select, dateField, from, to, step, safeIncrement);
36
+ // The hook is declared once for the model, so it takes the response of
37
+ // every selection, of which this one holds a subset of the fields
36
38
  await config.afterAggregate?.(result);
37
39
  return result;
38
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appweaver/core",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "Appweaver - the backend framework for AI-first development (@core)",
5
5
  "author": "Luka Matosevic",
6
6
  "license": "MIT",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "scripts": {
28
28
  "generate": "weaver generate --modelPattern ./**/model.ts --typesPath ./types/generated.ts --schemaPath ./prisma/schema.prisma --clientPath ./prisma/client",
29
- "db:recreate": "rimraf dev.db && rimraf prisma/migrations --glob \"*_init\" && weaver migration new init"
29
+ "db:recreate": "rimraf dev.db && rimraf prisma/migrations && weaver migration new init"
30
30
  },
31
31
  "dependencies": {
32
32
  "@fastify/auth": "5.0.4",
@@ -171,31 +171,6 @@ export type JsonWithAggregatesFilterBase<$PrismaModel = never> = {
171
171
  _min?: Prisma.NestedJsonFilter<$PrismaModel>;
172
172
  _max?: Prisma.NestedJsonFilter<$PrismaModel>;
173
173
  };
174
- export type IntNullableFilter<$PrismaModel = never> = {
175
- equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null;
176
- in?: number[] | null;
177
- notIn?: number[] | null;
178
- lt?: number | Prisma.IntFieldRefInput<$PrismaModel>;
179
- lte?: number | Prisma.IntFieldRefInput<$PrismaModel>;
180
- gt?: number | Prisma.IntFieldRefInput<$PrismaModel>;
181
- gte?: number | Prisma.IntFieldRefInput<$PrismaModel>;
182
- not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null;
183
- };
184
- export type IntNullableWithAggregatesFilter<$PrismaModel = never> = {
185
- equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null;
186
- in?: number[] | null;
187
- notIn?: number[] | null;
188
- lt?: number | Prisma.IntFieldRefInput<$PrismaModel>;
189
- lte?: number | Prisma.IntFieldRefInput<$PrismaModel>;
190
- gt?: number | Prisma.IntFieldRefInput<$PrismaModel>;
191
- gte?: number | Prisma.IntFieldRefInput<$PrismaModel>;
192
- not?: Prisma.NestedIntNullableWithAggregatesFilter<$PrismaModel> | number | null;
193
- _count?: Prisma.NestedIntNullableFilter<$PrismaModel>;
194
- _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel>;
195
- _sum?: Prisma.NestedIntNullableFilter<$PrismaModel>;
196
- _min?: Prisma.NestedIntNullableFilter<$PrismaModel>;
197
- _max?: Prisma.NestedIntNullableFilter<$PrismaModel>;
198
- };
199
174
  export type NestedIntFilter<$PrismaModel = never> = {
200
175
  equals?: number | Prisma.IntFieldRefInput<$PrismaModel>;
201
176
  in?: number[];
@@ -368,28 +343,3 @@ export type NestedJsonFilterBase<$PrismaModel = never> = {
368
343
  array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null;
369
344
  not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter;
370
345
  };
371
- export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = {
372
- equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null;
373
- in?: number[] | null;
374
- notIn?: number[] | null;
375
- lt?: number | Prisma.IntFieldRefInput<$PrismaModel>;
376
- lte?: number | Prisma.IntFieldRefInput<$PrismaModel>;
377
- gt?: number | Prisma.IntFieldRefInput<$PrismaModel>;
378
- gte?: number | Prisma.IntFieldRefInput<$PrismaModel>;
379
- not?: Prisma.NestedIntNullableWithAggregatesFilter<$PrismaModel> | number | null;
380
- _count?: Prisma.NestedIntNullableFilter<$PrismaModel>;
381
- _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel>;
382
- _sum?: Prisma.NestedIntNullableFilter<$PrismaModel>;
383
- _min?: Prisma.NestedIntNullableFilter<$PrismaModel>;
384
- _max?: Prisma.NestedIntNullableFilter<$PrismaModel>;
385
- };
386
- export type NestedFloatNullableFilter<$PrismaModel = never> = {
387
- equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null;
388
- in?: number[] | null;
389
- notIn?: number[] | null;
390
- lt?: number | Prisma.FloatFieldRefInput<$PrismaModel>;
391
- lte?: number | Prisma.FloatFieldRefInput<$PrismaModel>;
392
- gt?: number | Prisma.FloatFieldRefInput<$PrismaModel>;
393
- gte?: number | Prisma.FloatFieldRefInput<$PrismaModel>;
394
- not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null;
395
- };
@@ -51,7 +51,7 @@ const config = {
51
51
  "clientVersion": "7.9.1",
52
52
  "engineVersion": "e922089b7d7502aff4249d5da3420f6fa55fc6ad",
53
53
  "activeProvider": "sqlite",
54
- "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Generated by Appweaver. Please do not edit this file manually.\n\ndatasource db {\n provider = \"sqlite\"\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./client\"\n}\n\nmodel ApiKey {\n id Int @id @default(autoincrement())\n key String\n keyHash String @unique\n name String?\n description String?\n enabled Boolean @default(true)\n expiresAt DateTime?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel ConnectedAccount {\n id Int @id @default(autoincrement())\n provider String\n providerAccountId String\n scope String?\n lastLoginAt DateTime\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([provider, providerAccountId])\n}\n\nmodel OneTimeToken {\n id Int @id @default(autoincrement())\n tokenHash String\n purpose String\n expiresAt DateTime\n data Json\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([tokenHash, purpose])\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n roles Role[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n permissions Permission[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Seeder {\n id String @id @default(uuid())\n checksum String\n seederName String @unique\n startedAt DateTime\n finishedAt DateTime\n logs String?\n\n @@map(\"_seeders\")\n}\n\nmodel File {\n id Int @id @default(autoincrement())\n name String @unique\n originalName String\n mimeType String\n sizeBytes Int\n checksum String\n title String?\n description String?\n resourceField String?\n resourceName String?\n resourceId Int?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([resourceField, resourceName, resourceId])\n}\n",
54
+ "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Generated by Appweaver. Please do not edit this file manually.\n\ndatasource db {\n provider = \"sqlite\"\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"./client\"\n}\n\nmodel ApiKey {\n id Int @id @default(autoincrement())\n key String\n keyHash String @unique\n name String?\n description String?\n enabled Boolean @default(true)\n expiresAt DateTime?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel ConnectedAccount {\n id Int @id @default(autoincrement())\n provider String\n providerAccountId String\n scope String?\n lastLoginAt DateTime\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([provider, providerAccountId])\n}\n\nmodel OneTimeToken {\n id Int @id @default(autoincrement())\n tokenHash String\n purpose String\n expiresAt DateTime\n data Json\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([tokenHash, purpose])\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n roles Role[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n\n /// Related columns\n permissions Permission[] @relation(\"RolePermissionsPermission\")\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n}\n\nmodel Seeder {\n id String @id @default(uuid())\n checksum String\n seederName String @unique\n startedAt DateTime\n finishedAt DateTime\n logs String?\n\n @@map(\"_seeders\")\n}\n\nmodel File {\n id Int @id @default(autoincrement())\n name String @unique\n originalName String\n mimeType String\n sizeBytes Int\n checksum String\n title String?\n description String?\n resourceField String?\n resourceName String?\n resourceId String?\n\n /// Audit columns\n updatedAt DateTime @updatedAt\n createdAt DateTime @default(now())\n\n @@index([resourceField, resourceName, resourceId])\n}\n",
55
55
  "runtimeDataModel": {
56
56
  "models": {},
57
57
  "enums": {},
@@ -62,10 +62,10 @@ const config = {
62
62
  "graph": ""
63
63
  }
64
64
  };
65
- config.runtimeDataModel = JSON.parse("{\"models\":{\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ConnectedAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"provider\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerAccountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastLoginAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OneTimeToken\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"purpose\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Permission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roles\",\"kind\":\"object\",\"type\":\"Role\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Role\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"Permission\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Seeder\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seederName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"logs\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"_seeders\"},\"File\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"originalName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mimeType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sizeBytes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceField\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}");
65
+ config.runtimeDataModel = JSON.parse("{\"models\":{\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ConnectedAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"provider\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerAccountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastLoginAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OneTimeToken\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"purpose\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Permission\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roles\",\"kind\":\"object\",\"type\":\"Role\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Role\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissions\",\"kind\":\"object\",\"type\":\"Permission\",\"relationName\":\"RolePermissionsPermission\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Seeder\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seederName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"logs\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"_seeders\"},\"File\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"originalName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mimeType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sizeBytes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"checksum\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceField\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}");
66
66
  config.parameterizationSchema = {
67
67
  strings: JSON.parse("[\"where\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"data\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"create\",\"update\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ConnectedAccount.findUnique\",\"ConnectedAccount.findUniqueOrThrow\",\"ConnectedAccount.findFirst\",\"ConnectedAccount.findFirstOrThrow\",\"ConnectedAccount.findMany\",\"ConnectedAccount.createOne\",\"ConnectedAccount.createMany\",\"ConnectedAccount.createManyAndReturn\",\"ConnectedAccount.updateOne\",\"ConnectedAccount.updateMany\",\"ConnectedAccount.updateManyAndReturn\",\"ConnectedAccount.upsertOne\",\"ConnectedAccount.deleteOne\",\"ConnectedAccount.deleteMany\",\"ConnectedAccount.groupBy\",\"ConnectedAccount.aggregate\",\"OneTimeToken.findUnique\",\"OneTimeToken.findUniqueOrThrow\",\"OneTimeToken.findFirst\",\"OneTimeToken.findFirstOrThrow\",\"OneTimeToken.findMany\",\"OneTimeToken.createOne\",\"OneTimeToken.createMany\",\"OneTimeToken.createManyAndReturn\",\"OneTimeToken.updateOne\",\"OneTimeToken.updateMany\",\"OneTimeToken.updateManyAndReturn\",\"OneTimeToken.upsertOne\",\"OneTimeToken.deleteOne\",\"OneTimeToken.deleteMany\",\"OneTimeToken.groupBy\",\"OneTimeToken.aggregate\",\"permissions\",\"roles\",\"Permission.findUnique\",\"Permission.findUniqueOrThrow\",\"Permission.findFirst\",\"Permission.findFirstOrThrow\",\"Permission.findMany\",\"Permission.createOne\",\"Permission.createMany\",\"Permission.createManyAndReturn\",\"Permission.updateOne\",\"Permission.updateMany\",\"Permission.updateManyAndReturn\",\"Permission.upsertOne\",\"Permission.deleteOne\",\"Permission.deleteMany\",\"Permission.groupBy\",\"Permission.aggregate\",\"Role.findUnique\",\"Role.findUniqueOrThrow\",\"Role.findFirst\",\"Role.findFirstOrThrow\",\"Role.findMany\",\"Role.createOne\",\"Role.createMany\",\"Role.createManyAndReturn\",\"Role.updateOne\",\"Role.updateMany\",\"Role.updateManyAndReturn\",\"Role.upsertOne\",\"Role.deleteOne\",\"Role.deleteMany\",\"Role.groupBy\",\"Role.aggregate\",\"Seeder.findUnique\",\"Seeder.findUniqueOrThrow\",\"Seeder.findFirst\",\"Seeder.findFirstOrThrow\",\"Seeder.findMany\",\"Seeder.createOne\",\"Seeder.createMany\",\"Seeder.createManyAndReturn\",\"Seeder.updateOne\",\"Seeder.updateMany\",\"Seeder.updateManyAndReturn\",\"Seeder.upsertOne\",\"Seeder.deleteOne\",\"Seeder.deleteMany\",\"Seeder.groupBy\",\"Seeder.aggregate\",\"File.findUnique\",\"File.findUniqueOrThrow\",\"File.findFirst\",\"File.findFirstOrThrow\",\"File.findMany\",\"File.createOne\",\"File.createMany\",\"File.createManyAndReturn\",\"File.updateOne\",\"File.updateMany\",\"File.updateManyAndReturn\",\"File.upsertOne\",\"File.deleteOne\",\"File.deleteMany\",\"File.groupBy\",\"File.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"name\",\"originalName\",\"mimeType\",\"sizeBytes\",\"checksum\",\"title\",\"description\",\"resourceField\",\"resourceName\",\"resourceId\",\"updatedAt\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"seederName\",\"startedAt\",\"finishedAt\",\"logs\",\"every\",\"some\",\"none\",\"tokenHash\",\"purpose\",\"expiresAt\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"provider\",\"providerAccountId\",\"scope\",\"lastLoginAt\",\"key\",\"keyHash\",\"enabled\",\"connectOrCreate\",\"upsert\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
68
- graph: "qQJHcAx-AADiAQAwfwAABAAQgAEAAOIBADCBAQIAAAABggEBAMkBACGIAQEAyQEAIYwBQADLAQAhjQFAAMsBACGiAUAA5AEAIawBAQDIAQAhrQEBAAAAAa4BIADjAQAhAQAAAAEAIAEAAAABACAMfgAA4gEAMH8AAAQAEIABAADiAQAwgQECAMcBACGCAQEAyQEAIYgBAQDJAQAhjAFAAMsBACGNAUAAywEAIaIBQADkAQAhrAEBAMgBACGtAQEAyAEAIa4BIADjAQAhA4IBAADlAQAgiAEAAOUBACCiAQAA5QEAIAMAAAAEACADAAAFADAEAAABACADAAAABAAgAwAABQAwBAAAAQAgAwAAAAQAIAMAAAUAMAQAAAEAIAmBAQIAAAABggEBAAAAAYgBAQAAAAGMAUAAAAABjQFAAAAAAaIBQAAAAAGsAQEAAAABrQEBAAAAAa4BIAAAAAEBCAAACQAgCYEBAgAAAAGCAQEAAAABiAEBAAAAAYwBQAAAAAGNAUAAAAABogFAAAAAAawBAQAAAAGtAQEAAAABrgEgAAAAAQEIAAALADABCAAACwAwCYEBAgDsAQAhggEBAO0BACGIAQEA7QEAIYwBQADvAQAhjQFAAO8BACGiAUAAqQIAIawBAQDrAQAhrQEBAOsBACGuASAAqAIAIQIAAAABACAIAAAOACAJgQECAOwBACGCAQEA7QEAIYgBAQDtAQAhjAFAAO8BACGNAUAA7wEAIaIBQACpAgAhrAEBAOsBACGtAQEA6wEAIa4BIACoAgAhAgAAAAQAIAgAABAAIAIAAAAEACAIAAAQACADAAAAAQAgDwAACQAgEAAADgAgAQAAAAEAIAEAAAAEACAIFQAAowIAIBYAAKQCACAXAACnAgAgGAAApgIAIBkAAKUCACCCAQAA5QEAIIgBAADlAQAgogEAAOUBACAMfgAA2wEAMH8AABcAEIABAADbAQAwgQECALUBACGCAQEAtwEAIYgBAQC3AQAhjAFAALkBACGNAUAAuQEAIaIBQADdAQAhrAEBALYBACGtAQEAtgEAIa4BIADcAQAhAwAAAAQAIAMAABYAMBQAABcAIAMAAAAEACADAAAFADAEAAABACAKfgAA2gEAMH8AAB0AEIABAADaAQAwgQECAAAAAYwBQADLAQAhjQFAAMsBACGoAQEAyAEAIakBAQDIAQAhqgEBAMkBACGrAUAAywEAIQEAAAAaACABAAAAGgAgCn4AANoBADB_AAAdABCAAQAA2gEAMIEBAgDHAQAhjAFAAMsBACGNAUAAywEAIagBAQDIAQAhqQEBAMgBACGqAQEAyQEAIasBQADLAQAhAaoBAADlAQAgAwAAAB0AIAMAAB4AMAQAABoAIAMAAAAdACADAAAeADAEAAAaACADAAAAHQAgAwAAHgAwBAAAGgAgB4EBAgAAAAGMAUAAAAABjQFAAAAAAagBAQAAAAGpAQEAAAABqgEBAAAAAasBQAAAAAEBCAAAIgAgB4EBAgAAAAGMAUAAAAABjQFAAAAAAagBAQAAAAGpAQEAAAABqgEBAAAAAasBQAAAAAEBCAAAJAAwAQgAACQAMAeBAQIA7AEAIYwBQADvAQAhjQFAAO8BACGoAQEA6wEAIakBAQDrAQAhqgEBAO0BACGrAUAA7wEAIQIAAAAaACAIAAAnACAHgQECAOwBACGMAUAA7wEAIY0BQADvAQAhqAEBAOsBACGpAQEA6wEAIaoBAQDtAQAhqwFAAO8BACECAAAAHQAgCAAAKQAgAgAAAB0AIAgAACkAIAMAAAAaACAPAAAiACAQAAAnACABAAAAGgAgAQAAAB0AIAYVAACeAgAgFgAAnwIAIBcAAKICACAYAAChAgAgGQAAoAIAIKoBAADlAQAgCn4AANkBADB_AAAwABCAAQAA2QEAMIEBAgC1AQAhjAFAALkBACGNAUAAuQEAIagBAQC2AQAhqQEBALYBACGqAQEAtwEAIasBQAC5AQAhAwAAAB0AIAMAAC8AMBQAADAAIAMAAAAdACADAAAeADAEAAAaACAKCAAA2AEAIH4AANcBADB_AAA2ABCAAQAA1wEAMIEBAgAAAAGMAUAAywEAIY0BQADLAQAhoAEBAMgBACGhAQEAyAEAIaIBQADLAQAhAQAAADMAIAEAAAAzACAKCAAA2AEAIH4AANcBADB_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_AAB_ABCAAQAAzgEAMIEBAgC1AQAhggEBALYBACGMAUAAuQEAIY0BQAC5AQAhAwAAAE4AIAMAAH4AMBQAAH8AIAMAAABOACADAABPADAEAABQACAJfgAAzQEAMH8AAIUBABCAAQAAzQEAMIEBAQAAAAGGAQEAyAEAIZkBAQAAAAGaAUAAywEAIZsBQADLAQAhnAEBAMkBACEBAAAAggEAIAEAAACCAQAgCX4AAM0BADB_AACFAQAQgAEAAM0BADCBAQEAyAEAIYYBAQDIAQAhmQEBAMgBACGaAUAAywEAIZsBQADLAQAhnAEBAMkBACEBnAEAAOUBACADAAAAhQEAIAMAAIYBADAEAACCAQAgAwAAAIUBACADAACGAQAwBAAAggEAIAMAAACFAQAgAwAAhgEAMAQAAIIBACAGgQEBAAAAAYYBAQAAAAGZAQEAAAABmgFAAAAAAZsBQAAAAAGcAQEAAAABAQgAAIoBACAGgQEBAAAAAYYBAQAAAAGZAQEAAAABmgFAAAAAAZsBQAAAAAGcAQEAAAABAQgAAIwBADABCAAAjAEAMAaBAQEA6wEAIYYBAQDrAQAhmQEBAOsBACGaAUAA7wEAIZsBQADvAQAhnAEBAO0BACECAAAAggEAIAgAAI8BACAGgQEBAOsBACGGAQEA6wEAIZkBAQDrAQAhmgFAAO8BACGbAUAA7wEAIZwBAQDtAQAhAgAAAIUBACAIAACRAQAgAgAAAIUBACAIAACRAQAgAwAAAIIBACAPAACKAQAgEAAAjwEAIAEAAACCAQAgAQAAAIUBACAEFQAA8AEAIBgAAPIBACAZAADxAQAgnAEAAOUBACAJfgAAzAEAMH8AAJgBABCAAQAAzAEAMIEBAQC2AQAhhgEBALYBACGZAQEAtgEAIZoBQAC5AQAhmwFAALkBACGcAQEAtwEAIQMAAACFAQAgAwAAlwEAMBQAAJgBACADAAAAhQEAIAMAAIYBADAEAACCAQAgEH4AAMYBADB_AACeAQAQgAEAAMYBADCBAQIAAAABggEBAAAAAYMBAQDIAQAhhAEBAMgBACGFAQIAxwEAIYYBAQDIAQAhhwEBAMkBACGIAQEAyQEAIYkBAQDJAQAhigEBAMkBACGLAQIAygEAIYwBQADLAQAhjQFAAMsBACEBAAAAmwEAIAEAAACbAQAgEH4AAMYBADB_AACeAQAQgAEAAMYBADCBAQIAxwEAIYIBAQDIAQAhgwEBAMgBACGEAQEAyAEAIYUBAgDHAQAhhgEBAMgBACGHAQEAyQEAIYgBAQDJAQAhiQEBAMkBACGKAQEAyQEAIYsBAgDKAQAhjAFAAMsBACGNAUAAywEAIQWHAQAA5QEAIIgBAADlAQAgiQEAAOUBACCKAQAA5QEAIIsBAADlAQAgAwAAAJ4BACADAACfAQAwBAAAmwEAIAMAAACeAQAgAwAAnwEAMAQAAJsBACADAAAAngEAIAMAAJ8BADAEAACbAQAgDYEBAgAAAAGCAQEAAAABgwEBAAAAAYQBAQAAAAGFAQIAAAABhgEBAAAAAYcBAQAAAAGIAQEAAAABiQEBAAAAAYoBAQAAAAGLAQIAAAABjAFAAAAAAY0BQAAAAAEBCAAAowEAIA2BAQIAAAABggEBAAAAAYMBAQAAAAGEAQEAAAABhQECAAAAAYYBAQAAAAGHAQEAAAABiAEBAAAAAYkBAQAAAAGKAQEAAAABiwECAAAAAYwBQAAAAAGNAUAAAAABAQgAAKUBADABCAAApQEAMA2BAQIA7AEAIYIBAQDrAQAhgwEBAOsBACGEAQEA6wEAIYUBAgDsAQAhhgEBAOsBACGHAQEA7QEAIYgBAQDtAQAhiQEBAO0BACGKAQEA7QEAIYsBAgDuAQAhjAFAAO8BACGNAUAA7wEAIQIAAACbAQAgCAAAqAEAIA2BAQIA7AEAIYIBAQDrAQAhgwEBAOsBACGEAQEA6wEAIYUBAgDsAQAhhgEBAOsBACGHAQEA7QEAIYgBAQDtAQAhiQEBAO0BACGKAQEA7QEAIYsBAgDuAQAhjAFAAO8BACGNAUAA7wEAIQIAAACeAQAgCAAAqgEAIAIAAACeAQAgCAAAqgEAIAMAAACbAQAgDwAAowEAIBAAAKgBACABAAAAmwEAIAEAAACeAQAgChUAAOYBACAWAADnAQAgFwAA6gEAIBgAAOkBACAZAADoAQAghwEAAOUBACCIAQAA5QEAIIkBAADlAQAgigEAAOUBACCLAQAA5QEAIBB-AAC0AQAwfwAAsQEAEIABAAC0AQAwgQECALUBACGCAQEAtgEAIYMBAQC2AQAhhAEBALYBACGFAQIAtQEAIYYBAQC2AQAhhwEBALcBACGIAQEAtwEAIYkBAQC3AQAhigEBALcBACGLAQIAuAEAIYwBQAC5AQAhjQFAALkBACEDAAAAngEAIAMAALABADAUAACxAQAgAwAAAJ4BACADAACfAQAwBAAAmwEAIBB-AAC0AQAwfwAAsQEAEIABAAC0AQAwgQECALUBACGCAQEAtgEAIYMBAQC2AQAhhAEBALYBACGFAQIAtQEAIYYBAQC2AQAhhwEBALcBACGIAQEAtwEAIYkBAQC3AQAhigEBALcBACGLAQIAuAEAIYwBQAC5AQAhjQFAALkBACENFQAAuwEAIBYAAMUBACAXAAC7AQAgGAAAuwEAIBkAALsBACCOAQIAAAABjwECAAAABJABAgAAAASRAQIAAAABkgECAAAAAZMBAgAAAAGUAQIAAAABlQECAMQBACEOFQAAuwEAIBgAAMMBACAZAADDAQAgjgEBAAAAAY8BAQAAAASQAQEAAAAEkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQDCAQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABDhUAAL4BACAYAADBAQAgGQAAwQEAII4BAQAAAAGPAQEAAAAFkAEBAAAABZEBAQAAAAGSAQEAAAABkwEBAAAAAZQBAQAAAAGVAQEAwAEAIZYBAQAAAAGXAQEAAAABmAEBAAAAAQ0VAAC-AQAgFgAAvwEAIBcAAL4BACAYAAC-AQAgGQAAvgEAII4BAgAAAAGPAQIAAAAFkAECAAAABZEBAgAAAAGSAQIAAAABkwECAAAAAZQBAgAAAAGVAQIAvQEAIQsVAAC7AQAgGAAAvAEAIBkAALwBACCOAUAAAAABjwFAAAAABJABQAAAAASRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAALoBACELFQAAuwEAIBgAALwBACAZAAC8AQAgjgFAAAAAAY8BQAAAAASQAUAAAAAEkQFAAAAAAZIBQAAAAAGTAUAAAAABlAFAAAAAAZUBQAC6AQAhCI4BAgAAAAGPAQIAAAAEkAECAAAABJEBAgAAAAGSAQIAAAABkwECAAAAAZQBAgAAAAGVAQIAuwEAIQiOAUAAAAABjwFAAAAABJABQAAAAASRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAALwBACENFQAAvgEAIBYAAL8BACAXAAC-AQAgGAAAvgEAIBkAAL4BACCOAQIAAAABjwECAAAABZABAgAAAAWRAQIAAAABkgECAAAAAZMBAgAAAAGUAQIAAAABlQECAL0BACEIjgECAAAAAY8BAgAAAAWQAQIAAAAFkQECAAAAAZIBAgAAAAGTAQIAAAABlAECAAAAAZUBAgC-AQAhCI4BCAAAAAGPAQgAAAAFkAEIAAAABZEBCAAAAAGSAQgAAAABkwEIAAAAAZQBCAAAAAGVAQgAvwEAIQ4VAAC-AQAgGAAAwQEAIBkAAMEBACCOAQEAAAABjwEBAAAABZABAQAAAAWRAQEAAAABkgEBAAAAAZMBAQAAAAGUAQEAAAABlQEBAMABACGWAQEAAAABlwEBAAAAAZgBAQAAAAELjgEBAAAAAY8BAQAAAAWQAQEAAAAFkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQDBAQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABDhUAALsBACAYAADDAQAgGQAAwwEAII4BAQAAAAGPAQEAAAAEkAEBAAAABJEBAQAAAAGSAQEAAAABkwEBAAAAAZQBAQAAAAGVAQEAwgEAIZYBAQAAAAGXAQEAAAABmAEBAAAAAQuOAQEAAAABjwEBAAAABJABAQAAAASRAQEAAAABkgEBAAAAAZMBAQAAAAGUAQEAAAABlQEBAMMBACGWAQEAAAABlwEBAAAAAZgBAQAAAAENFQAAuwEAIBYAAMUBACAXAAC7AQAgGAAAuwEAIBkAALsBACCOAQIAAAABjwECAAAABJABAgAAAASRAQIAAAABkgECAAAAAZMBAgAAAAGUAQIAAAABlQECAMQBACEIjgEIAAAAAY8BCAAAAASQAQgAAAAEkQEIAAAAAZIBCAAAAAGTAQgAAAABlAEIAAAAAZUBCADFAQAhEH4AAMYBADB_AACeAQAQgAEAAMYBADCBAQIAxwEAIYIBAQDIAQAhgwEBAMgBACGEAQEAyAEAIYUBAgDHAQAhhgEBAMgBACGHAQEAyQEAIYgBAQDJAQAhiQEBAMkBACGKAQEAyQEAIYsBAgDKAQAhjAFAAMsBACGNAUAAywEAIQiOAQIAAAABjwECAAAABJABAgAAAASRAQIAAAABkgECAAAAAZMBAgAAAAGUAQIAAAABlQECALsBACELjgEBAAAAAY8BAQAAAASQAQEAAAAEkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQDDAQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABC44BAQAAAAGPAQEAAAAFkAEBAAAABZEBAQAAAAGSAQEAAAABkwEBAAAAAZQBAQAAAAGVAQEAwQEAIZYBAQAAAAGXAQEAAAABmAEBAAAAAQiOAQIAAAABjwECAAAABZABAgAAAAWRAQIAAAABkgECAAAAAZMBAgAAAAGUAQIAAAABlQECAL4BACEIjgFAAAAAAY8BQAAAAASQAUAAAAAEkQFAAAAAAZIBQAAAAAGTAUAAAAABlAFAAAAAAZUBQAC8AQAhCX4AAMwBADB_AACYAQAQgAEAAMwBADCBAQEAtgEAIYYBAQC2AQAhmQEBALYBACGaAUAAuQEAIZsBQAC5AQAhnAEBALcBACEJfgAAzQEAMH8AAIUBABCAAQAAzQEAMIEBAQDIAQAhhgEBAMgBACGZAQEAyAEAIZoBQADLAQAhmwFAAMsBACGcAQEAyQEAIQd-AADOAQAwfwAAfwAQgAEAAM4BADCBAQIAtQEAIYIBAQC2AQAhjAFAALkBACGNAUAAuQEAIQd-AADPAQAwfwAAaQAQgAEAAM8BADCBAQIAtQEAIYIBAQC2AQAhjAFAALkBACGNAUAAuQEAIQg9AADRAQAgfgAA0AEAMH8AAFIAEIABAADQAQAwgQECAMcBACGCAQEAyAEAIYwBQADLAQAhjQFAAMsBACEDnQEAAE4AIJ4BAABOACCfAQAATgAgCDwAANMBACB-AADSAQAwfwAATgAQgAEAANIBADCBAQIAxwEAIYIBAQDIAQAhjAFAAMsBACGNAUAAywEAIQOdAQAAUgAgngEAAFIAIJ8BAABSACAKCAAA1QEAIH4AANQBADB_AABJABCAAQAA1AEAMIEBAgC1AQAhjAFAALkBACGNAUAAuQEAIaABAQC2AQAhoQEBALYBACGiAUAAuQEAIQoVAAC7AQAgGAAA1gEAIBkAANYBACCOAYAAAAABlQGAAAAAAaMBAQAAAAGkAQEAAAABpQEBAAAAAaYBgAAAAAGnAYAAAAABB44BgAAAAAGVAYAAAAABowEBAAAAAaQBAQAAAAGlAQEAAAABpgGAAAAAAacBgAAAAAEKCAAA2AEAIH4AANcBADB_AAA2ABCAAQAA1wEAMIEBAgDHAQAhjAFAAMsBACGNAUAAywEAIaABAQDIAQAhoQEBAMgBACGiAUAAywEAIQeOAYAAAAABlQGAAAAAAaMBAQAAAAGkAQEAAAABpQEBAAAAAaYBgAAAAAGnAYAAAAABCn4AANkBADB_AAAwABCAAQAA2QEAMIEBAgC1AQAhjAFAALkBACGNAUAAuQEAIagBAQC2AQAhqQEBALYBACGqAQEAtwEAIasBQAC5AQAhCn4AANoBADB_AAAdABCAAQAA2gEAMIEBAgDHAQAhjAFAAMsBACGNAUAAywEAIagBAQDIAQAhqQEBAMgBACGqAQEAyQEAIasBQADLAQAhDH4AANsBADB_AAAXABCAAQAA2wEAMIEBAgC1AQAhggEBALcBACGIAQEAtwEAIYwBQAC5AQAhjQFAALkBACGiAUAA3QEAIawBAQC2AQAhrQEBALYBACGuASAA3AEAIQUVAAC7AQAgGAAA4QEAIBkAAOEBACCOASAAAAABlQEgAOABACELFQAAvgEAIBgAAN8BACAZAADfAQAgjgFAAAAAAY8BQAAAAAWQAUAAAAAFkQFAAAAAAZIBQAAAAAGTAUAAAAABlAFAAAAAAZUBQADeAQAhCxUAAL4BACAYAADfAQAgGQAA3wEAII4BQAAAAAGPAUAAAAAFkAFAAAAABZEBQAAAAAGSAUAAAAABkwFAAAAAAZQBQAAAAAGVAUAA3gEAIQiOAUAAAAABjwFAAAAABZABQAAAAAWRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAAN8BACEFFQAAuwEAIBgAAOEBACAZAADhAQAgjgEgAAAAAZUBIADgAQAhAo4BIAAAAAGVASAA4QEAIQx-AADiAQAwfwAABAAQgAEAAOIBADCBAQIAxwEAIYIBAQDJAQAhiAEBAMkBACGMAUAAywEAIY0BQADLAQAhogFAAOQBACGsAQEAyAEAIa0BAQDIAQAhrgEgAOMBACECjgEgAAAAAZUBIADhAQAhCI4BQAAAAAGPAUAAAAAFkAFAAAAABZEBQAAAAAGSAUAAAAABkwFAAAAAAZQBQAAAAAGVAUAA3wEAIQAAAAAAAAGxAQEAAAABBbEBAgAAAAG3AQIAAAABuAECAAAAAbkBAgAAAAG6AQIAAAABAbEBAQAAAAEFsQECAAAAAbcBAgAAAAG4AQIAAAABuQECAAAAAboBAgAAAAEBsQFAAAAAAQAAAAAAAAAACg8AAPkBADAQAAD9AQAwrwEAAPoBADCwAQAA-wEAMLEBAAD8AQAwsgEAAPwBADCzAQAA_AEAMLQBAAD8AQAwtQEAAP4BADC2AQAA_wEAMASBAQIAAAABggEBAAAAAYwBQAAAAAGNAUAAAAABAgAAAEwAIA8AAIMCACADAAAATAAgDwAAgwIAIBAAAIICACAIPQAA0QEAIH4AANABADB_AABSABCAAQAA0AEAMIEBAgAAAAGCAQEAAAABjAFAAMsBACGNAUAAywEAIQIAAABMACAIAACCAgAgAgAAAIACACAIAACBAgAgB34AAP8BADB_AACAAgAQgAEAAP8BADCBAQIAxwEAIYIBAQDIAQAhjAFAAMsBACGNAUAAywEAIQd-AAD_AQAwfwAAgAIAEIABAAD_AQAwgQECAMcBACGCAQEAyAEAIYwBQADLAQAhjQFAAMsBACEEgQECAOwBACGCAQEA6wEAIYwBQADvAQAhjQFAAO8BACEEgQECAOwBACGCAQEA6wEAIYwBQADvAQAhjQFAAO8BACEEgQECAAAAAYIBAQAAAAGMAUAAAAABjQFAAAAAAQMPAAD5AQAwrwEAAPoBADC0AQAA_AEAMAAAAAAACg8AAIsCADAQAACPAgAwrwEAAIwCADCwAQAAjQIAMLEBAACOAgAwsgEAAI4CADCzAQAAjgIAMLQBAACOAgAwtQEAAJACADC2AQAAkQIAMASBAQIAAAABggEBAAAAAYwBQAAAAAGNAUAAAAABAgAAAFAAIA8AAJUCACADAAAAUAAgDwAAlQIAIBAAAJQCACAIPAAA0wEAIH4AANIBADB_AABOABCAAQAA0gEAMIEBAgAAAAGCAQEAAAABjAFAAMsBACGNAUAAywEAIQIAAABQACAIAACUAgAgAgAAAJICACAIAACTAgAgB34AAJECADB_AACSAgAQgAEAAJECADCBAQIAxwEAIYIBAQDIAQAhjAFAAMsBACGNAUAAywEAIQd-AACRAgAwfwAAkgIAEIABAACRAgAwgQECAMcBACGCAQEAyAEAIYwBQADLAQAhjQFAAMsBACEEgQECAOwBACGCAQEA6wEAIYwBQADvAQAhjQFAAO8BACEEgQECAOwBACGCAQEA6wEAIYwBQADvAQAhjQFAAO8BACEEgQECAAAAAYIBAQAAAAGMAUAAAAABjQFAAAAAAQMPAACLAgAwrwEAAIwCADC0AQAAjgIAMAAAAAAAAAAAAAAAAAAAAAAAAbEBIAAAAAEBsQFAAAAAAQAAAAAFFQAGFgAHFwAIGAAJGQAKAAAAAAAFFQAGFgAHFwAIGAAJGQAKAAAABRUAEBYAERcAEhgAExkAFAAAAAAABRUAEBYAERcAEhgAExkAFAAAAAUVABoWABsXABwYAB0ZAB4AAAAAAAUVABoWABsXABwYAB0ZAB4CFQAjPVEhAhUAIjxUIAE8VQABPVYAAAAFFQAnFgAoFwApGAAqGQArAAAAAAAFFQAnFgAoFwApGAAqGQArAAAFFQAwFgAxFwAyGAAzGQA0AAAAAAAFFQAwFgAxFwAyGAAzGQA0AAAAAxUAOhgAOxkAPAAAAAMVADoYADsZADwAAAAFFQBCFgBDFwBEGABFGQBGAAAAAAAFFQBCFgBDFwBEGABFGQBGAQIBAgMBBQYBBgcBBwgBCQoBCgwCCw0DDA8BDRECDhIEERMBEhQBExUCGhgFGxkLHBsMHRwMHh8MHyAMICEMISMMIiUCIyYNJCgMJSoCJisOJywMKC0MKS4CKjEPKzIVLDQWLTUWLjgWLzkWMDoWMTwWMj4CMz8XNEEWNUMCNkQYN0UWOEYWOUcCOkoZO0sfPk0gP1cgQFggQVkgQlogQ1wgRF4CRV8kRmEgR2MCSGQlSWUgSmYgS2cCTGomTWssTmwhT20hUG4hUW8hUnAhU3IhVHQCVXUtVnchV3kCWHouWXshWnwhW30CXIABL12BATVegwE2X4QBNmCHATZhiAE2YokBNmOLATZkjQECZY4BN2aQATZnkgECaJMBOGmUATZqlQE2a5YBAmyZATltmgE9bpwBPm-dAT5woAE-caEBPnKiAT5zpAE-dKYBAnWnAT92qQE-d6sBAnisAUB5rQE-eq4BPnuvAQJ8sgFBfbMBRw"
68
+ graph: "pAJHcAx-AADeAQAwfwAABAAQgAEAAN4BADCBAQIAAAABggEBAMYBACGIAQEAxgEAIYwBQADHAQAhjQFAAMcBACGiAUAA4AEAIawBAQDFAQAhrQEBAAAAAa4BIADfAQAhAQAAAAEAIAEAAAABACAMfgAA3gEAMH8AAAQAEIABAADeAQAwgQECAMQBACGCAQEAxgEAIYgBAQDGAQAhjAFAAMcBACGNAUAAxwEAIaIBQADgAQAhrAEBAMUBACGtAQEAxQEAIa4BIADfAQAhA4IBAADhAQAgiAEAAOEBACCiAQAA4QEAIAMAAAAEACADAAAFADAEAAABACADAAAABAAgAwAABQAwBAAAAQAgAwAAAAQAIAMAAAUAMAQAAAEAIAmBAQIAAAABggEBAAAAAYgBAQAAAAGMAUAAAAABjQFAAAAAAaIBQAAAAAGsAQEAAAABrQEBAAAAAa4BIAAAAAEBCAAACQAgCYEBAgAAAAGCAQEAAAABiAEBAAAAAYwBQAAAAAGNAUAAAAABogFAAAAAAawBAQAAAAGtAQEAAAABrgEgAAAAAQEIAAALADABCAAACwAwCYEBAgDoAQAhggEBAOkBACGIAQEA6QEAIYwBQADqAQAhjQFAAOoBACGiAUAApAIAIawBAQDnAQAhrQEBAOcBACGuASAAowIAIQIAAAABACAIAAAOACAJgQECAOgBACGCAQEA6QEAIYgBAQDpAQAhjAFAAOoBACGNAUAA6gEAIaIBQACkAgAhrAEBAOcBACGtAQEA5wEAIa4BIACjAgAhAgAAAAQAIAgAABAAIAIAAAAEACAIAAAQACADAAAAAQAgDwAACQAgEAAADgAgAQAAAAEAIAEAAAAEACAIFQAAngIAIBYAAJ8CACAXAACiAgAgGAAAoQIAIBkAAKACACCCAQAA4QEAIIgBAADhAQAgogEAAOEBACAMfgAA1wEAMH8AABcAEIABAADXAQAwgQECALUBACGCAQEAtwEAIYgBAQC3AQAhjAFAALgBACGNAUAAuAEAIaIBQADZAQAhrAEBALYBACGtAQEAtgEAIa4BIADYAQAhAwAAAAQAIAMAABYAMBQAABcAIAMAAAAEACADAAAFADAEAAABACAKfgAA1gEAMH8AAB0AEIABAADWAQAwgQECAAAAAYwBQADHAQAhjQFAAMcBACGoAQEAxQEAIakBAQDFAQAhqgEBAMYBACGrAUAAxwEAIQEAAAAaACABAAAAGgAgCn4AANYBADB_AAAdABCAAQAA1gEAMIEBAgDEAQAhjAFAAMcBACGNAUAAxwEAIagBAQDFAQAhqQEBAMUBACGqAQEAxgEAIasBQADHAQAhAaoBAADhAQAgAwAAAB0AIAMAAB4AMAQAABoAIAMAAAAdACADAAAeADAEAAAaACADAAAAHQAgAwAAHgAwBAAAGgAgB4EBAgAAAAGMAUAAAAABjQFAAAAAAagBAQAAAAGpAQEAAAABqgEBAAAAAasBQAAAAAEBCAAAIgAgB4EBAgAAAAGMAUAAAAABjQFAAAAAAagBAQAAAAGpAQEAAAABqgEBAAAAAasBQAAAAAEBCAAAJAAwAQgAACQAMAeBAQIA6AEAIYwBQADqAQAhjQFAAOoBACGoAQEA5wEAIakBAQDnAQAhqgEBAOkBACGrAUAA6gEAIQIAAAAaACAIAAAnACAHgQECAOgBACGMAUAA6gEAIY0BQADqAQAhqAEBAOcBACGpAQEA5wEAIaoBAQDpAQAhqwFAAOoBACECAAAAHQAgCAAAKQAgAgAAAB0AIAgAACkAIAMAAAAaACAPAAAiACAQAAAnACABAAAAGgAgAQAAAB0AIAYVAACZAgAgFgAAmgIAIBcAAJ0CACAYAACcAgAgGQAAmwIAIKoBAADhAQAgCn4AANUBADB_AAAwABCAAQAA1QEAMIEBAgC1AQAhjAFAALgBACGNAUAAuAEAIagBAQC2AQAhqQEBALYBACGqAQEAtwEAIasBQAC4AQAhAwAAAB0AIAMAAC8AMBQAADAAIAMAAAAdACADAAAeADAEAAAaACAKCAAA1AEAIH4AANMBADB_AAA2ABCAAQAA0wEAMIEBAgAAAAGMAUAAxwEAIY0BQADHAQAhoAEBAMUBACGhAQEAxQEAIaIBQADHAQAhAQAAADMAIAEAAAAzACAKCAAA1AEAIH4AANMBADB_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_AAB_ABCAAQAAygEAMIEBAgC1AQAhggEBALYBACGMAUAAuAEAIY0BQAC4AQAhAwAAAE4AIAMAAH4AMBQAAH8AIAMAAABOACADAABPADAEAABQACAJfgAAyQEAMH8AAIUBABCAAQAAyQEAMIEBAQAAAAGGAQEAxQEAIZkBAQAAAAGaAUAAxwEAIZsBQADHAQAhnAEBAMYBACEBAAAAggEAIAEAAACCAQAgCX4AAMkBADB_AACFAQAQgAEAAMkBADCBAQEAxQEAIYYBAQDFAQAhmQEBAMUBACGaAUAAxwEAIZsBQADHAQAhnAEBAMYBACEBnAEAAOEBACADAAAAhQEAIAMAAIYBADAEAACCAQAgAwAAAIUBACADAACGAQAwBAAAggEAIAMAAACFAQAgAwAAhgEAMAQAAIIBACAGgQEBAAAAAYYBAQAAAAGZAQEAAAABmgFAAAAAAZsBQAAAAAGcAQEAAAABAQgAAIoBACAGgQEBAAAAAYYBAQAAAAGZAQEAAAABmgFAAAAAAZsBQAAAAAGcAQEAAAABAQgAAIwBADABCAAAjAEAMAaBAQEA5wEAIYYBAQDnAQAhmQEBAOcBACGaAUAA6gEAIZsBQADqAQAhnAEBAOkBACECAAAAggEAIAgAAI8BACAGgQEBAOcBACGGAQEA5wEAIZkBAQDnAQAhmgFAAOoBACGbAUAA6gEAIZwBAQDpAQAhAgAAAIUBACAIAACRAQAgAgAAAIUBACAIAACRAQAgAwAAAIIBACAPAACKAQAgEAAAjwEAIAEAAACCAQAgAQAAAIUBACAEFQAA6wEAIBgAAO0BACAZAADsAQAgnAEAAOEBACAJfgAAyAEAMH8AAJgBABCAAQAAyAEAMIEBAQC2AQAhhgEBALYBACGZAQEAtgEAIZoBQAC4AQAhmwFAALgBACGcAQEAtwEAIQMAAACFAQAgAwAAlwEAMBQAAJgBACADAAAAhQEAIAMAAIYBADAEAACCAQAgEH4AAMMBADB_AACeAQAQgAEAAMMBADCBAQIAAAABggEBAAAAAYMBAQDFAQAhhAEBAMUBACGFAQIAxAEAIYYBAQDFAQAhhwEBAMYBACGIAQEAxgEAIYkBAQDGAQAhigEBAMYBACGLAQEAxgEAIYwBQADHAQAhjQFAAMcBACEBAAAAmwEAIAEAAACbAQAgEH4AAMMBADB_AACeAQAQgAEAAMMBADCBAQIAxAEAIYIBAQDFAQAhgwEBAMUBACGEAQEAxQEAIYUBAgDEAQAhhgEBAMUBACGHAQEAxgEAIYgBAQDGAQAhiQEBAMYBACGKAQEAxgEAIYsBAQDGAQAhjAFAAMcBACGNAUAAxwEAIQWHAQAA4QEAIIgBAADhAQAgiQEAAOEBACCKAQAA4QEAIIsBAADhAQAgAwAAAJ4BACADAACfAQAwBAAAmwEAIAMAAACeAQAgAwAAnwEAMAQAAJsBACADAAAAngEAIAMAAJ8BADAEAACbAQAgDYEBAgAAAAGCAQEAAAABgwEBAAAAAYQBAQAAAAGFAQIAAAABhgEBAAAAAYcBAQAAAAGIAQEAAAABiQEBAAAAAYoBAQAAAAGLAQEAAAABjAFAAAAAAY0BQAAAAAEBCAAAowEAIA2BAQIAAAABggEBAAAAAYMBAQAAAAGEAQEAAAABhQECAAAAAYYBAQAAAAGHAQEAAAABiAEBAAAAAYkBAQAAAAGKAQEAAAABiwEBAAAAAYwBQAAAAAGNAUAAAAABAQgAAKUBADABCAAApQEAMA2BAQIA6AEAIYIBAQDnAQAhgwEBAOcBACGEAQEA5wEAIYUBAgDoAQAhhgEBAOcBACGHAQEA6QEAIYgBAQDpAQAhiQEBAOkBACGKAQEA6QEAIYsBAQDpAQAhjAFAAOoBACGNAUAA6gEAIQIAAACbAQAgCAAAqAEAIA2BAQIA6AEAIYIBAQDnAQAhgwEBAOcBACGEAQEA5wEAIYUBAgDoAQAhhgEBAOcBACGHAQEA6QEAIYgBAQDpAQAhiQEBAOkBACGKAQEA6QEAIYsBAQDpAQAhjAFAAOoBACGNAUAA6gEAIQIAAACeAQAgCAAAqgEAIAIAAACeAQAgCAAAqgEAIAMAAACbAQAgDwAAowEAIBAAAKgBACABAAAAmwEAIAEAAACeAQAgChUAAOIBACAWAADjAQAgFwAA5gEAIBgAAOUBACAZAADkAQAghwEAAOEBACCIAQAA4QEAIIkBAADhAQAgigEAAOEBACCLAQAA4QEAIBB-AAC0AQAwfwAAsQEAEIABAAC0AQAwgQECALUBACGCAQEAtgEAIYMBAQC2AQAhhAEBALYBACGFAQIAtQEAIYYBAQC2AQAhhwEBALcBACGIAQEAtwEAIYkBAQC3AQAhigEBALcBACGLAQEAtwEAIYwBQAC4AQAhjQFAALgBACEDAAAAngEAIAMAALABADAUAACxAQAgAwAAAJ4BACADAACfAQAwBAAAmwEAIBB-AAC0AQAwfwAAsQEAEIABAAC0AQAwgQECALUBACGCAQEAtgEAIYMBAQC2AQAhhAEBALYBACGFAQIAtQEAIYYBAQC2AQAhhwEBALcBACGIAQEAtwEAIYkBAQC3AQAhigEBALcBACGLAQEAtwEAIYwBQAC4AQAhjQFAALgBACENFQAAugEAIBYAAMIBACAXAAC6AQAgGAAAugEAIBkAALoBACCOAQIAAAABjwECAAAABJABAgAAAASRAQIAAAABkgECAAAAAZMBAgAAAAGUAQIAAAABlQECAMEBACEOFQAAugEAIBgAAMABACAZAADAAQAgjgEBAAAAAY8BAQAAAASQAQEAAAAEkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQC_AQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABDhUAAL0BACAYAAC-AQAgGQAAvgEAII4BAQAAAAGPAQEAAAAFkAEBAAAABZEBAQAAAAGSAQEAAAABkwEBAAAAAZQBAQAAAAGVAQEAvAEAIZYBAQAAAAGXAQEAAAABmAEBAAAAAQsVAAC6AQAgGAAAuwEAIBkAALsBACCOAUAAAAABjwFAAAAABJABQAAAAASRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAALkBACELFQAAugEAIBgAALsBACAZAAC7AQAgjgFAAAAAAY8BQAAAAASQAUAAAAAEkQFAAAAAAZIBQAAAAAGTAUAAAAABlAFAAAAAAZUBQAC5AQAhCI4BAgAAAAGPAQIAAAAEkAECAAAABJEBAgAAAAGSAQIAAAABkwECAAAAAZQBAgAAAAGVAQIAugEAIQiOAUAAAAABjwFAAAAABJABQAAAAASRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAALsBACEOFQAAvQEAIBgAAL4BACAZAAC-AQAgjgEBAAAAAY8BAQAAAAWQAQEAAAAFkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQC8AQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABCI4BAgAAAAGPAQIAAAAFkAECAAAABZEBAgAAAAGSAQIAAAABkwECAAAAAZQBAgAAAAGVAQIAvQEAIQuOAQEAAAABjwEBAAAABZABAQAAAAWRAQEAAAABkgEBAAAAAZMBAQAAAAGUAQEAAAABlQEBAL4BACGWAQEAAAABlwEBAAAAAZgBAQAAAAEOFQAAugEAIBgAAMABACAZAADAAQAgjgEBAAAAAY8BAQAAAASQAQEAAAAEkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQC_AQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABC44BAQAAAAGPAQEAAAAEkAEBAAAABJEBAQAAAAGSAQEAAAABkwEBAAAAAZQBAQAAAAGVAQEAwAEAIZYBAQAAAAGXAQEAAAABmAEBAAAAAQ0VAAC6AQAgFgAAwgEAIBcAALoBACAYAAC6AQAgGQAAugEAII4BAgAAAAGPAQIAAAAEkAECAAAABJEBAgAAAAGSAQIAAAABkwECAAAAAZQBAgAAAAGVAQIAwQEAIQiOAQgAAAABjwEIAAAABJABCAAAAASRAQgAAAABkgEIAAAAAZMBCAAAAAGUAQgAAAABlQEIAMIBACEQfgAAwwEAMH8AAJ4BABCAAQAAwwEAMIEBAgDEAQAhggEBAMUBACGDAQEAxQEAIYQBAQDFAQAhhQECAMQBACGGAQEAxQEAIYcBAQDGAQAhiAEBAMYBACGJAQEAxgEAIYoBAQDGAQAhiwEBAMYBACGMAUAAxwEAIY0BQADHAQAhCI4BAgAAAAGPAQIAAAAEkAECAAAABJEBAgAAAAGSAQIAAAABkwECAAAAAZQBAgAAAAGVAQIAugEAIQuOAQEAAAABjwEBAAAABJABAQAAAASRAQEAAAABkgEBAAAAAZMBAQAAAAGUAQEAAAABlQEBAMABACGWAQEAAAABlwEBAAAAAZgBAQAAAAELjgEBAAAAAY8BAQAAAAWQAQEAAAAFkQEBAAAAAZIBAQAAAAGTAQEAAAABlAEBAAAAAZUBAQC-AQAhlgEBAAAAAZcBAQAAAAGYAQEAAAABCI4BQAAAAAGPAUAAAAAEkAFAAAAABJEBQAAAAAGSAUAAAAABkwFAAAAAAZQBQAAAAAGVAUAAuwEAIQl-AADIAQAwfwAAmAEAEIABAADIAQAwgQEBALYBACGGAQEAtgEAIZkBAQC2AQAhmgFAALgBACGbAUAAuAEAIZwBAQC3AQAhCX4AAMkBADB_AACFAQAQgAEAAMkBADCBAQEAxQEAIYYBAQDFAQAhmQEBAMUBACGaAUAAxwEAIZsBQADHAQAhnAEBAMYBACEHfgAAygEAMH8AAH8AEIABAADKAQAwgQECALUBACGCAQEAtgEAIYwBQAC4AQAhjQFAALgBACEHfgAAywEAMH8AAGkAEIABAADLAQAwgQECALUBACGCAQEAtgEAIYwBQAC4AQAhjQFAALgBACEIPQAAzQEAIH4AAMwBADB_AABSABCAAQAAzAEAMIEBAgDEAQAhggEBAMUBACGMAUAAxwEAIY0BQADHAQAhA50BAABOACCeAQAATgAgnwEAAE4AIAg8AADPAQAgfgAAzgEAMH8AAE4AEIABAADOAQAwgQECAMQBACGCAQEAxQEAIYwBQADHAQAhjQFAAMcBACEDnQEAAFIAIJ4BAABSACCfAQAAUgAgCggAANEBACB-AADQAQAwfwAASQAQgAEAANABADCBAQIAtQEAIYwBQAC4AQAhjQFAALgBACGgAQEAtgEAIaEBAQC2AQAhogFAALgBACEKFQAAugEAIBgAANIBACAZAADSAQAgjgGAAAAAAZUBgAAAAAGjAQEAAAABpAEBAAAAAaUBAQAAAAGmAYAAAAABpwGAAAAAAQeOAYAAAAABlQGAAAAAAaMBAQAAAAGkAQEAAAABpQEBAAAAAaYBgAAAAAGnAYAAAAABCggAANQBACB-AADTAQAwfwAANgAQgAEAANMBADCBAQIAxAEAIYwBQADHAQAhjQFAAMcBACGgAQEAxQEAIaEBAQDFAQAhogFAAMcBACEHjgGAAAAAAZUBgAAAAAGjAQEAAAABpAEBAAAAAaUBAQAAAAGmAYAAAAABpwGAAAAAAQp-AADVAQAwfwAAMAAQgAEAANUBADCBAQIAtQEAIYwBQAC4AQAhjQFAALgBACGoAQEAtgEAIakBAQC2AQAhqgEBALcBACGrAUAAuAEAIQp-AADWAQAwfwAAHQAQgAEAANYBADCBAQIAxAEAIYwBQADHAQAhjQFAAMcBACGoAQEAxQEAIakBAQDFAQAhqgEBAMYBACGrAUAAxwEAIQx-AADXAQAwfwAAFwAQgAEAANcBADCBAQIAtQEAIYIBAQC3AQAhiAEBALcBACGMAUAAuAEAIY0BQAC4AQAhogFAANkBACGsAQEAtgEAIa0BAQC2AQAhrgEgANgBACEFFQAAugEAIBgAAN0BACAZAADdAQAgjgEgAAAAAZUBIADcAQAhCxUAAL0BACAYAADbAQAgGQAA2wEAII4BQAAAAAGPAUAAAAAFkAFAAAAABZEBQAAAAAGSAUAAAAABkwFAAAAAAZQBQAAAAAGVAUAA2gEAIQsVAAC9AQAgGAAA2wEAIBkAANsBACCOAUAAAAABjwFAAAAABZABQAAAAAWRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAANoBACEIjgFAAAAAAY8BQAAAAAWQAUAAAAAFkQFAAAAAAZIBQAAAAAGTAUAAAAABlAFAAAAAAZUBQADbAQAhBRUAALoBACAYAADdAQAgGQAA3QEAII4BIAAAAAGVASAA3AEAIQKOASAAAAABlQEgAN0BACEMfgAA3gEAMH8AAAQAEIABAADeAQAwgQECAMQBACGCAQEAxgEAIYgBAQDGAQAhjAFAAMcBACGNAUAAxwEAIaIBQADgAQAhrAEBAMUBACGtAQEAxQEAIa4BIADfAQAhAo4BIAAAAAGVASAA3QEAIQiOAUAAAAABjwFAAAAABZABQAAAAAWRAUAAAAABkgFAAAAAAZMBQAAAAAGUAUAAAAABlQFAANsBACEAAAAAAAABsQEBAAAAAQWxAQIAAAABtwECAAAAAbgBAgAAAAG5AQIAAAABugECAAAAAQGxAQEAAAABAbEBQAAAAAEAAAAAAAAAAAoPAAD0AQAwEAAA-AEAMK8BAAD1AQAwsAEAAPYBADCxAQAA9wEAMLIBAAD3AQAwswEAAPcBADC0AQAA9wEAMLUBAAD5AQAwtgEAAPoBADAEgQECAAAAAYIBAQAAAAGMAUAAAAABjQFAAAAAAQIAAABMACAPAAD-AQAgAwAAAEwAIA8AAP4BACAQAAD9AQAgCD0AAM0BACB-AADMAQAwfwAAUgAQgAEAAMwBADCBAQIAAAABggEBAAAAAYwBQADHAQAhjQFAAMcBACECAAAATAAgCAAA_QEAIAIAAAD7AQAgCAAA_AEAIAd-AAD6AQAwfwAA-wEAEIABAAD6AQAwgQECAMQBACGCAQEAxQEAIYwBQADHAQAhjQFAAMcBACEHfgAA-gEAMH8AAPsBABCAAQAA-gEAMIEBAgDEAQAhggEBAMUBACGMAUAAxwEAIY0BQADHAQAhBIEBAgDoAQAhggEBAOcBACGMAUAA6gEAIY0BQADqAQAhBIEBAgDoAQAhggEBAOcBACGMAUAA6gEAIY0BQADqAQAhBIEBAgAAAAGCAQEAAAABjAFAAAAAAY0BQAAAAAEDDwAA9AEAMK8BAAD1AQAwtAEAAPcBADAAAAAAAAoPAACGAgAwEAAAigIAMK8BAACHAgAwsAEAAIgCADCxAQAAiQIAMLIBAACJAgAwswEAAIkCADC0AQAAiQIAMLUBAACLAgAwtgEAAIwCADAEgQECAAAAAYIBAQAAAAGMAUAAAAABjQFAAAAAAQIAAABQACAPAACQAgAgAwAAAFAAIA8AAJACACAQAACPAgAgCDwAAM8BACB-AADOAQAwfwAATgAQgAEAAM4BADCBAQIAAAABggEBAAAAAYwBQADHAQAhjQFAAMcBACECAAAAUAAgCAAAjwIAIAIAAACNAgAgCAAAjgIAIAd-AACMAgAwfwAAjQIAEIABAACMAgAwgQECAMQBACGCAQEAxQEAIYwBQADHAQAhjQFAAMcBACEHfgAAjAIAMH8AAI0CABCAAQAAjAIAMIEBAgDEAQAhggEBAMUBACGMAUAAxwEAIY0BQADHAQAhBIEBAgDoAQAhggEBAOcBACGMAUAA6gEAIY0BQADqAQAhBIEBAgDoAQAhggEBAOcBACGMAUAA6gEAIY0BQADqAQAhBIEBAgAAAAGCAQEAAAABjAFAAAAAAY0BQAAAAAEDDwAAhgIAMK8BAACHAgAwtAEAAIkCADAAAAAAAAAAAAAAAAAAAAAAAAGxASAAAAABAbEBQAAAAAEAAAAABRUABhYABxcACBgACRkACgAAAAAABRUABhYABxcACBgACRkACgAAAAUVABAWABEXABIYABMZABQAAAAAAAUVABAWABEXABIYABMZABQAAAAFFQAaFgAbFwAcGAAdGQAeAAAAAAAFFQAaFgAbFwAcGAAdGQAeAhUAIz1RIQIVACI8VCABPFUAAT1WAAAABRUAJxYAKBcAKRgAKhkAKwAAAAAABRUAJxYAKBcAKRgAKhkAKwAABRUAMBYAMRcAMhgAMxkANAAAAAAABRUAMBYAMRcAMhgAMxkANAAAAAMVADoYADsZADwAAAADFQA6GAA7GQA8AAAABRUAQhYAQxcARBgARRkARgAAAAAABRUAQhYAQxcARBgARRkARgECAQIDAQUGAQYHAQcIAQkKAQoMAgsNAwwPAQ0RAg4SBBETARIUARMVAhoYBRsZCxwbDB0cDB4fDB8gDCAhDCEjDCIlAiMmDSQoDCUqAiYrDicsDCgtDCkuAioxDysyFSw0Fi01Fi44Fi85FjA6FjE8FjI-AjM_FzRBFjVDAjZEGDdFFjhGFjlHAjpKGTtLHz5NID9XIEBYIEFZIEJaIENcIEReAkVfJEZhIEdjAkhkJUllIEpmIEtnAkxqJk1rLE5sIU9tIVBuIVFvIVJwIVNyIVR0AlV1LVZ3IVd5Alh6Lll7IVp8IVt9AlyAAS9dgQE1XoMBNl-EATZghwE2YYgBNmKJATZjiwE2ZI0BAmWOATdmkAE2Z5IBAmiTAThplAE2apUBNmuWAQJsmQE5bZoBPW6cAT5vnQE-cKABPnGhAT5yogE-c6QBPnSmAQJ1pwE_dqkBPnerAQJ4rAFAea0BPnquAT57rwECfLIBQX2zAUc"
69
69
  };
70
70
  async function decodeBase64AsWasm(wasmBase64) {
71
71
  const { Buffer } = await Promise.resolve().then(() => __importStar(require('node:buffer')));
@@ -15,12 +15,10 @@ export type AggregateFile = {
15
15
  export type FileAvgAggregateOutputType = {
16
16
  id: number | null;
17
17
  sizeBytes: number | null;
18
- resourceId: number | null;
19
18
  };
20
19
  export type FileSumAggregateOutputType = {
21
20
  id: number | null;
22
21
  sizeBytes: number | null;
23
- resourceId: number | null;
24
22
  };
25
23
  export type FileMinAggregateOutputType = {
26
24
  id: number | null;
@@ -33,7 +31,7 @@ export type FileMinAggregateOutputType = {
33
31
  description: string | null;
34
32
  resourceField: string | null;
35
33
  resourceName: string | null;
36
- resourceId: number | null;
34
+ resourceId: string | null;
37
35
  updatedAt: Date | null;
38
36
  createdAt: Date | null;
39
37
  };
@@ -48,7 +46,7 @@ export type FileMaxAggregateOutputType = {
48
46
  description: string | null;
49
47
  resourceField: string | null;
50
48
  resourceName: string | null;
51
- resourceId: number | null;
49
+ resourceId: string | null;
52
50
  updatedAt: Date | null;
53
51
  createdAt: Date | null;
54
52
  };
@@ -71,12 +69,10 @@ export type FileCountAggregateOutputType = {
71
69
  export type FileAvgAggregateInputType = {
72
70
  id?: true;
73
71
  sizeBytes?: true;
74
- resourceId?: true;
75
72
  };
76
73
  export type FileSumAggregateInputType = {
77
74
  id?: true;
78
75
  sizeBytes?: true;
79
- resourceId?: true;
80
76
  };
81
77
  export type FileMinAggregateInputType = {
82
78
  id?: true;
@@ -211,7 +207,7 @@ export type FileGroupByOutputType = {
211
207
  description: string | null;
212
208
  resourceField: string | null;
213
209
  resourceName: string | null;
214
- resourceId: number | null;
210
+ resourceId: string | null;
215
211
  updatedAt: Date;
216
212
  createdAt: Date;
217
213
  _count: FileCountAggregateOutputType | null;
@@ -237,7 +233,7 @@ export type FileWhereInput = {
237
233
  description?: Prisma.StringNullableFilter<"File"> | string | null;
238
234
  resourceField?: Prisma.StringNullableFilter<"File"> | string | null;
239
235
  resourceName?: Prisma.StringNullableFilter<"File"> | string | null;
240
- resourceId?: Prisma.IntNullableFilter<"File"> | number | null;
236
+ resourceId?: Prisma.StringNullableFilter<"File"> | string | null;
241
237
  updatedAt?: Prisma.DateTimeFilter<"File"> | Date | string;
242
238
  createdAt?: Prisma.DateTimeFilter<"File"> | Date | string;
243
239
  };
@@ -270,7 +266,7 @@ export type FileWhereUniqueInput = Prisma.AtLeast<{
270
266
  description?: Prisma.StringNullableFilter<"File"> | string | null;
271
267
  resourceField?: Prisma.StringNullableFilter<"File"> | string | null;
272
268
  resourceName?: Prisma.StringNullableFilter<"File"> | string | null;
273
- resourceId?: Prisma.IntNullableFilter<"File"> | number | null;
269
+ resourceId?: Prisma.StringNullableFilter<"File"> | string | null;
274
270
  updatedAt?: Prisma.DateTimeFilter<"File"> | Date | string;
275
271
  createdAt?: Prisma.DateTimeFilter<"File"> | Date | string;
276
272
  }, "id" | "name">;
@@ -308,7 +304,7 @@ export type FileScalarWhereWithAggregatesInput = {
308
304
  description?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
309
305
  resourceField?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
310
306
  resourceName?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
311
- resourceId?: Prisma.IntNullableWithAggregatesFilter<"File"> | number | null;
307
+ resourceId?: Prisma.StringNullableWithAggregatesFilter<"File"> | string | null;
312
308
  updatedAt?: Prisma.DateTimeWithAggregatesFilter<"File"> | Date | string;
313
309
  createdAt?: Prisma.DateTimeWithAggregatesFilter<"File"> | Date | string;
314
310
  };
@@ -322,7 +318,7 @@ export type FileCreateInput = {
322
318
  description?: string | null;
323
319
  resourceField?: string | null;
324
320
  resourceName?: string | null;
325
- resourceId?: number | null;
321
+ resourceId?: string | null;
326
322
  updatedAt?: Date | string;
327
323
  createdAt?: Date | string;
328
324
  };
@@ -337,7 +333,7 @@ export type FileUncheckedCreateInput = {
337
333
  description?: string | null;
338
334
  resourceField?: string | null;
339
335
  resourceName?: string | null;
340
- resourceId?: number | null;
336
+ resourceId?: string | null;
341
337
  updatedAt?: Date | string;
342
338
  createdAt?: Date | string;
343
339
  };
@@ -351,7 +347,7 @@ export type FileUpdateInput = {
351
347
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
352
348
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
353
349
  resourceName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
354
- resourceId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null;
350
+ resourceId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
355
351
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
356
352
  createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
357
353
  };
@@ -366,7 +362,7 @@ export type FileUncheckedUpdateInput = {
366
362
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
367
363
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
368
364
  resourceName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
369
- resourceId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null;
365
+ resourceId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
370
366
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
371
367
  createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
372
368
  };
@@ -381,7 +377,7 @@ export type FileCreateManyInput = {
381
377
  description?: string | null;
382
378
  resourceField?: string | null;
383
379
  resourceName?: string | null;
384
- resourceId?: number | null;
380
+ resourceId?: string | null;
385
381
  updatedAt?: Date | string;
386
382
  createdAt?: Date | string;
387
383
  };
@@ -395,7 +391,7 @@ export type FileUpdateManyMutationInput = {
395
391
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
396
392
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
397
393
  resourceName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
398
- resourceId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null;
394
+ resourceId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
399
395
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
400
396
  createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
401
397
  };
@@ -410,7 +406,7 @@ export type FileUncheckedUpdateManyInput = {
410
406
  description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
411
407
  resourceField?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
412
408
  resourceName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
413
- resourceId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null;
409
+ resourceId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
414
410
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
415
411
  createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
416
412
  };
@@ -432,7 +428,6 @@ export type FileCountOrderByAggregateInput = {
432
428
  export type FileAvgOrderByAggregateInput = {
433
429
  id?: Prisma.SortOrder;
434
430
  sizeBytes?: Prisma.SortOrder;
435
- resourceId?: Prisma.SortOrder;
436
431
  };
437
432
  export type FileMaxOrderByAggregateInput = {
438
433
  id?: Prisma.SortOrder;
@@ -467,14 +462,6 @@ export type FileMinOrderByAggregateInput = {
467
462
  export type FileSumOrderByAggregateInput = {
468
463
  id?: Prisma.SortOrder;
469
464
  sizeBytes?: Prisma.SortOrder;
470
- resourceId?: Prisma.SortOrder;
471
- };
472
- export type NullableIntFieldUpdateOperationsInput = {
473
- set?: number | null;
474
- increment?: number;
475
- decrement?: number;
476
- multiply?: number;
477
- divide?: number;
478
465
  };
479
466
  export type FileSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
480
467
  id?: boolean;
@@ -551,7 +538,7 @@ export type $FilePayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
551
538
  description: string | null;
552
539
  resourceField: string | null;
553
540
  resourceName: string | null;
554
- resourceId: number | null;
541
+ resourceId: string | null;
555
542
  /**
556
543
  * Audit columns
557
544
  */
@@ -921,7 +908,7 @@ export interface FileFieldRefs {
921
908
  readonly description: Prisma.FieldRef<"File", 'String'>;
922
909
  readonly resourceField: Prisma.FieldRef<"File", 'String'>;
923
910
  readonly resourceName: Prisma.FieldRef<"File", 'String'>;
924
- readonly resourceId: Prisma.FieldRef<"File", 'Int'>;
911
+ readonly resourceId: Prisma.FieldRef<"File", 'String'>;
925
912
  readonly updatedAt: Prisma.FieldRef<"File", 'DateTime'>;
926
913
  readonly createdAt: Prisma.FieldRef<"File", 'DateTime'>;
927
914
  }
@@ -51,6 +51,12 @@ async function loadModels(baseDir, modelPattern) {
51
51
  }
52
52
  }
53
53
  }
54
+ // Resolve the schemas referencing the primary key of another model, now that
55
+ // every model is registered
56
+ (0, common_1.relinkResourceModels)(models);
57
+ // Reject a default value that its own field constraints would reject, since
58
+ // the records it produces cannot be serialized by the routes of their model
59
+ (0, utils_1.validateScalarDefaults)(models);
54
60
  // Reject file name patterns writing into a reserved storage path before any
55
61
  // upload can reach the storage layer.
56
62
  (0, utils_1.validateFileNamePatterns)(models);