@carlonicora/nestjs-neo4jsonapi 8.15.0 → 8.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  2. package/dist/bootstrap/app.module.factory.js +9 -0
  3. package/dist/bootstrap/app.module.factory.js.map +1 -1
  4. package/dist/bootstrap/bootstrap.options.d.ts +10 -0
  5. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  6. package/dist/common/helpers/define-entity.d.ts.map +1 -1
  7. package/dist/common/helpers/define-entity.js +3 -0
  8. package/dist/common/helpers/define-entity.js.map +1 -1
  9. package/dist/common/registries/entity-descriptor.registry.d.ts +22 -0
  10. package/dist/common/registries/entity-descriptor.registry.d.ts.map +1 -0
  11. package/dist/common/registries/entity-descriptor.registry.js +51 -0
  12. package/dist/common/registries/entity-descriptor.registry.js.map +1 -0
  13. package/dist/common/registries/index.d.ts +1 -0
  14. package/dist/common/registries/index.d.ts.map +1 -1
  15. package/dist/common/registries/index.js +1 -0
  16. package/dist/common/registries/index.js.map +1 -1
  17. package/dist/core/cors/services/cors.service.d.ts +4 -1
  18. package/dist/core/cors/services/cors.service.d.ts.map +1 -1
  19. package/dist/core/cors/services/cors.service.js +19 -3
  20. package/dist/core/cors/services/cors.service.js.map +1 -1
  21. package/dist/core/neo4j/abstracts/abstract.repository.d.ts +2 -0
  22. package/dist/core/neo4j/abstracts/abstract.repository.d.ts.map +1 -1
  23. package/dist/core/neo4j/abstracts/abstract.repository.js +4 -1
  24. package/dist/core/neo4j/abstracts/abstract.repository.js.map +1 -1
  25. package/dist/core/neo4j/abstracts/abstract.service.d.ts +6 -0
  26. package/dist/core/neo4j/abstracts/abstract.service.d.ts.map +1 -1
  27. package/dist/core/neo4j/abstracts/abstract.service.js +16 -0
  28. package/dist/core/neo4j/abstracts/abstract.service.js.map +1 -1
  29. package/dist/core/neo4j/helpers/build-filter-clauses.d.ts.map +1 -1
  30. package/dist/core/neo4j/helpers/build-filter-clauses.js +8 -1
  31. package/dist/core/neo4j/helpers/build-filter-clauses.js.map +1 -1
  32. package/dist/core/offline/index.d.ts +5 -0
  33. package/dist/core/offline/index.d.ts.map +1 -0
  34. package/dist/core/offline/index.js +21 -0
  35. package/dist/core/offline/index.js.map +1 -0
  36. package/dist/core/offline/offline-request.context.d.ts +12 -0
  37. package/dist/core/offline/offline-request.context.d.ts.map +1 -0
  38. package/dist/core/offline/offline-request.context.js +34 -0
  39. package/dist/core/offline/offline-request.context.js.map +1 -0
  40. package/dist/core/offline/offline-request.interceptor.d.ts +15 -0
  41. package/dist/core/offline/offline-request.interceptor.d.ts.map +1 -0
  42. package/dist/core/offline/offline-request.interceptor.js +43 -0
  43. package/dist/core/offline/offline-request.interceptor.js.map +1 -0
  44. package/dist/core/offline/offline.constants.d.ts +12 -0
  45. package/dist/core/offline/offline.constants.d.ts.map +1 -0
  46. package/dist/core/offline/offline.constants.js +12 -0
  47. package/dist/core/offline/offline.constants.js.map +1 -0
  48. package/dist/core/offline/offline.module.d.ts +12 -0
  49. package/dist/core/offline/offline.module.d.ts.map +1 -0
  50. package/dist/core/offline/offline.module.js +42 -0
  51. package/dist/core/offline/offline.module.js.map +1 -0
  52. package/dist/foundations/chunker/services/types/pdf.service.d.ts.map +1 -1
  53. package/dist/foundations/chunker/services/types/pdf.service.js +9 -5
  54. package/dist/foundations/chunker/services/types/pdf.service.js.map +1 -1
  55. package/dist/foundations/offline-change-set/decorators/offline-replayable.decorator.d.ts +7 -0
  56. package/dist/foundations/offline-change-set/decorators/offline-replayable.decorator.d.ts.map +1 -0
  57. package/dist/foundations/offline-change-set/decorators/offline-replayable.decorator.js +12 -0
  58. package/dist/foundations/offline-change-set/decorators/offline-replayable.decorator.js.map +1 -0
  59. package/dist/foundations/offline-change-set/dtos/offline-change-set.post.dto.d.ts +33 -0
  60. package/dist/foundations/offline-change-set/dtos/offline-change-set.post.dto.d.ts.map +1 -0
  61. package/dist/foundations/offline-change-set/dtos/offline-change-set.post.dto.js +133 -0
  62. package/dist/foundations/offline-change-set/dtos/offline-change-set.post.dto.js.map +1 -0
  63. package/dist/foundations/offline-change-set/entities/offline-change-set.d.ts +66 -0
  64. package/dist/foundations/offline-change-set/entities/offline-change-set.d.ts.map +1 -0
  65. package/dist/foundations/offline-change-set/entities/offline-change-set.js +31 -0
  66. package/dist/foundations/offline-change-set/entities/offline-change-set.js.map +1 -0
  67. package/dist/foundations/offline-change-set/entities/offline-change-set.meta.d.ts +3 -0
  68. package/dist/foundations/offline-change-set/entities/offline-change-set.meta.d.ts.map +1 -0
  69. package/dist/foundations/offline-change-set/entities/offline-change-set.meta.js +10 -0
  70. package/dist/foundations/offline-change-set/entities/offline-change-set.meta.js.map +1 -0
  71. package/dist/foundations/offline-change-set/index.d.ts +11 -0
  72. package/dist/foundations/offline-change-set/index.d.ts.map +1 -0
  73. package/dist/foundations/offline-change-set/index.js +27 -0
  74. package/dist/foundations/offline-change-set/index.js.map +1 -0
  75. package/dist/foundations/offline-change-set/merge/deep-equal.d.ts +6 -0
  76. package/dist/foundations/offline-change-set/merge/deep-equal.d.ts.map +1 -0
  77. package/dist/foundations/offline-change-set/merge/deep-equal.js +31 -0
  78. package/dist/foundations/offline-change-set/merge/deep-equal.js.map +1 -0
  79. package/dist/foundations/offline-change-set/merge/merge-blocks.d.ts +37 -0
  80. package/dist/foundations/offline-change-set/merge/merge-blocks.d.ts.map +1 -0
  81. package/dist/foundations/offline-change-set/merge/merge-blocks.js +108 -0
  82. package/dist/foundations/offline-change-set/merge/merge-blocks.js.map +1 -0
  83. package/dist/foundations/offline-change-set/merge/three-way-merge.d.ts +57 -0
  84. package/dist/foundations/offline-change-set/merge/three-way-merge.d.ts.map +1 -0
  85. package/dist/foundations/offline-change-set/merge/three-way-merge.js +201 -0
  86. package/dist/foundations/offline-change-set/merge/three-way-merge.js.map +1 -0
  87. package/dist/foundations/offline-change-set/offline-change-set.module.d.ts +11 -0
  88. package/dist/foundations/offline-change-set/offline-change-set.module.d.ts.map +1 -0
  89. package/dist/foundations/offline-change-set/offline-change-set.module.js +41 -0
  90. package/dist/foundations/offline-change-set/offline-change-set.module.js.map +1 -0
  91. package/dist/foundations/offline-change-set/repositories/offline-change-set.repository.d.ts +26 -0
  92. package/dist/foundations/offline-change-set/repositories/offline-change-set.repository.d.ts.map +1 -0
  93. package/dist/foundations/offline-change-set/repositories/offline-change-set.repository.js +56 -0
  94. package/dist/foundations/offline-change-set/repositories/offline-change-set.repository.js.map +1 -0
  95. package/dist/foundations/offline-change-set/services/offline-change-set.service.d.ts +72 -0
  96. package/dist/foundations/offline-change-set/services/offline-change-set.service.d.ts.map +1 -0
  97. package/dist/foundations/offline-change-set/services/offline-change-set.service.js +333 -0
  98. package/dist/foundations/offline-change-set/services/offline-change-set.service.js.map +1 -0
  99. package/dist/foundations/offline-change-set/services/offline-route-runner.service.d.ts +61 -0
  100. package/dist/foundations/offline-change-set/services/offline-route-runner.service.d.ts.map +1 -0
  101. package/dist/foundations/offline-change-set/services/offline-route-runner.service.js +192 -0
  102. package/dist/foundations/offline-change-set/services/offline-route-runner.service.js.map +1 -0
  103. package/dist/index.d.ts +2 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +3 -0
  106. package/dist/index.js.map +1 -1
  107. package/package.json +1 -1
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OfflineChangeSetDescriptor = void 0;
4
+ const common_1 = require("../../../common");
5
+ const offline_change_set_meta_1 = require("./offline-change-set.meta");
6
+ exports.OfflineChangeSetDescriptor = (0, common_1.defineEntity)()({
7
+ ...offline_change_set_meta_1.offlineChangeSetMeta,
8
+ isCompanyScoped: true,
9
+ fields: {
10
+ resultsJson: { type: "string", excludeFromJsonApi: true, excludeFromSearch: true },
11
+ },
12
+ // Derived, output-only: a virtual field, because the serialiser emits a `computed` value only
13
+ // into meta (`computedDef.meta`) or nowhere, and the answer carries `results` in attributes.
14
+ virtualFields: {
15
+ results: {
16
+ compute: ({ data }) => {
17
+ if (Array.isArray(data?.results))
18
+ return data.results;
19
+ try {
20
+ const parsed = JSON.parse(data?.resultsJson ?? "[]");
21
+ return Array.isArray(parsed) ? parsed : [];
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ },
27
+ },
28
+ },
29
+ relationships: {},
30
+ });
31
+ //# sourceMappingURL=offline-change-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline-change-set.js","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/entities/offline-change-set.ts"],"names":[],"mappings":";;;AAAA,4CAA4D;AAC5D,uEAAiE;AAqEpD,QAAA,0BAA0B,GAAG,IAAA,qBAAY,GAAoB,CAAC;IACzE,GAAG,8CAAoB;IAEvB,eAAe,EAAE,IAAI;IAErB,MAAM,EAAE;QACN,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;KACnF;IAED,8FAA8F;IAC9F,6FAA6F;IAC7F,aAAa,EAAE;QACb,OAAO,EAAE;YACP,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;gBACpB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAC;gBACtD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC,CAAC;oBACrD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;SACF;KACF;IAED,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DataMeta } from "../../../common";
2
+ export declare const offlineChangeSetMeta: DataMeta;
3
+ //# sourceMappingURL=offline-change-set.meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline-change-set.meta.d.ts","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/entities/offline-change-set.meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,eAAO,MAAM,oBAAoB,EAAE,QAKlC,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.offlineChangeSetMeta = void 0;
4
+ exports.offlineChangeSetMeta = {
5
+ type: "offline-change-sets",
6
+ endpoint: "offline-change-sets",
7
+ nodeName: "offlineChangeSet",
8
+ labelName: "OfflineChangeSet",
9
+ };
10
+ //# sourceMappingURL=offline-change-set.meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline-change-set.meta.js","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/entities/offline-change-set.meta.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAa;IAC5C,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,kBAAkB;CAC9B,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from "./decorators/offline-replayable.decorator";
2
+ export * from "./dtos/offline-change-set.post.dto";
3
+ export * from "./entities/offline-change-set";
4
+ export * from "./entities/offline-change-set.meta";
5
+ export * from "./merge/merge-blocks";
6
+ export * from "./merge/three-way-merge";
7
+ export * from "./offline-change-set.module";
8
+ export * from "./repositories/offline-change-set.repository";
9
+ export * from "./services/offline-change-set.service";
10
+ export * from "./services/offline-route-runner.service";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/foundations/offline-change-set/index.ts"],"names":[],"mappings":"AAAA,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./decorators/offline-replayable.decorator"), exports);
18
+ __exportStar(require("./dtos/offline-change-set.post.dto"), exports);
19
+ __exportStar(require("./entities/offline-change-set"), exports);
20
+ __exportStar(require("./entities/offline-change-set.meta"), exports);
21
+ __exportStar(require("./merge/merge-blocks"), exports);
22
+ __exportStar(require("./merge/three-way-merge"), exports);
23
+ __exportStar(require("./offline-change-set.module"), exports);
24
+ __exportStar(require("./repositories/offline-change-set.repository"), exports);
25
+ __exportStar(require("./services/offline-change-set.service"), exports);
26
+ __exportStar(require("./services/offline-route-runner.service"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/foundations/offline-change-set/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4EAA0D;AAC1D,qEAAmD;AACnD,gEAA8C;AAC9C,qEAAmD;AACnD,uDAAqC;AACrC,0DAAwC;AACxC,8DAA4C;AAC5C,+EAA6D;AAC7D,wEAAsD;AACtD,0EAAwD"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Structural equality for JSON values: key order does not matter, array order does.
3
+ * `undefined` and `null` are equal (a missing attribute and a null one mean the same on the wire).
4
+ */
5
+ export declare function jsonEqual(a: unknown, b: unknown): boolean;
6
+ //# sourceMappingURL=deep-equal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-equal.d.ts","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/merge/deep-equal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAgBzD"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jsonEqual = jsonEqual;
4
+ /**
5
+ * Structural equality for JSON values: key order does not matter, array order does.
6
+ * `undefined` and `null` are equal (a missing attribute and a null one mean the same on the wire).
7
+ */
8
+ function jsonEqual(a, b) {
9
+ if (a === b)
10
+ return true;
11
+ if (a == null || b == null)
12
+ return a == null && b == null;
13
+ if (typeof a !== typeof b)
14
+ return false;
15
+ if (Array.isArray(a) || Array.isArray(b)) {
16
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
17
+ return false;
18
+ return a.every((item, index) => jsonEqual(item, b[index]));
19
+ }
20
+ if (typeof a === "object") {
21
+ const ao = a;
22
+ const bo = b;
23
+ const keys = new Set([...Object.keys(ao), ...Object.keys(bo)]);
24
+ for (const key of keys)
25
+ if (!jsonEqual(ao[key], bo[key]))
26
+ return false;
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ //# sourceMappingURL=deep-equal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-equal.js","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/merge/deep-equal.ts"],"names":[],"mappings":";;AAIA,8BAgBC;AApBD;;;GAGG;AACH,SAAgB,SAAS,CAAC,CAAU,EAAE,CAAU;IAC9C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAClF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,CAA4B,CAAC;QACxC,MAAM,EAAE,GAAG,CAA4B,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,37 @@
1
+ /** One top-level BlockNote block; its children are part of it. Only `id` is read. */
2
+ export type Block = {
3
+ id: string;
4
+ [key: string]: unknown;
5
+ };
6
+ /** Which side wins a conflicting block (and a conflicting order) once the GM has chosen. */
7
+ export type BlockPreference = "mine" | "theirs";
8
+ /**
9
+ * Block-by-block three-way merge of one rich-text field (BlockNote document).
10
+ *
11
+ * Blocks are compared by id as objects, never turned into text. Starting from the
12
+ * server's blocks (theirs):
13
+ * - a block changed only on the device takes the device's version;
14
+ * - a block removed on one side and untouched on the other is removed;
15
+ * - a block added on the device lands after the block that precedes it on the device;
16
+ * - a block changed on both sides (differently), or removed on one side and changed on
17
+ * the other, is a conflict: the merged document keeps the server's version and its
18
+ * id is listed in `conflictBlockIds`;
19
+ * - order: when only one side moved blocks, the merged document follows that side's order
20
+ * (the blocks' content still merges as above); when both sides moved blocks into different
21
+ * orders, `orderConflict` is true and the server's order is kept.
22
+ *
23
+ * With `prefer: "mine"` (the GM chose this device's version of the field) every conflict
24
+ * resolves to the device's side instead (its block, its removal, its order) and nothing is
25
+ * reported; `prefer: "theirs"` resolves them to the server's side.
26
+ */
27
+ export declare function mergeBlocks(p: {
28
+ base: Block[];
29
+ mine: Block[];
30
+ theirs: Block[];
31
+ prefer?: BlockPreference;
32
+ }): {
33
+ merged: Block[];
34
+ conflictBlockIds: string[];
35
+ orderConflict: boolean;
36
+ };
37
+ //# sourceMappingURL=merge-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-blocks.d.ts","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/merge/merge-blocks.ts"],"names":[],"mappings":"AAEA,qFAAqF;AACrF,MAAM,MAAM,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE3D,4FAA4F;AAC5F,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,eAAe,CAAA;CAAE,GAAG;IAC3G,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB,CAoFA"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeBlocks = mergeBlocks;
4
+ const deep_equal_1 = require("./deep-equal");
5
+ /**
6
+ * Block-by-block three-way merge of one rich-text field (BlockNote document).
7
+ *
8
+ * Blocks are compared by id as objects, never turned into text. Starting from the
9
+ * server's blocks (theirs):
10
+ * - a block changed only on the device takes the device's version;
11
+ * - a block removed on one side and untouched on the other is removed;
12
+ * - a block added on the device lands after the block that precedes it on the device;
13
+ * - a block changed on both sides (differently), or removed on one side and changed on
14
+ * the other, is a conflict: the merged document keeps the server's version and its
15
+ * id is listed in `conflictBlockIds`;
16
+ * - order: when only one side moved blocks, the merged document follows that side's order
17
+ * (the blocks' content still merges as above); when both sides moved blocks into different
18
+ * orders, `orderConflict` is true and the server's order is kept.
19
+ *
20
+ * With `prefer: "mine"` (the GM chose this device's version of the field) every conflict
21
+ * resolves to the device's side instead (its block, its removal, its order) and nothing is
22
+ * reported; `prefer: "theirs"` resolves them to the server's side.
23
+ */
24
+ function mergeBlocks(p) {
25
+ const base = new Map(p.base.map((b) => [b.id, b]));
26
+ const mine = new Map(p.mine.map((b) => [b.id, b]));
27
+ const theirs = new Map(p.theirs.map((b) => [b.id, b]));
28
+ const preferMine = p.prefer === "mine";
29
+ const report = p.prefer === undefined;
30
+ const merged = [...p.theirs];
31
+ const conflictBlockIds = [];
32
+ /** Device blocks missing from `merged` that the device's version brings back. */
33
+ const restore = new Set();
34
+ const indexOf = (id) => merged.findIndex((b) => b.id === id);
35
+ const conflict = (id, takeMine) => {
36
+ if (preferMine)
37
+ takeMine();
38
+ else if (report)
39
+ conflictBlockIds.push(id);
40
+ };
41
+ for (const [id, baseBlock] of base) {
42
+ const mineBlock = mine.get(id);
43
+ const theirsBlock = theirs.get(id);
44
+ const mineChanged = mineBlock !== undefined && !(0, deep_equal_1.jsonEqual)(mineBlock, baseBlock);
45
+ const theirsChanged = theirsBlock !== undefined && !(0, deep_equal_1.jsonEqual)(theirsBlock, baseBlock);
46
+ const mineRemoved = mineBlock === undefined;
47
+ const theirsRemoved = theirsBlock === undefined;
48
+ if (mineRemoved) {
49
+ if (theirsRemoved)
50
+ continue;
51
+ if (theirsChanged)
52
+ conflict(id, () => merged.splice(indexOf(id), 1));
53
+ else
54
+ merged.splice(indexOf(id), 1);
55
+ continue;
56
+ }
57
+ if (!mineChanged)
58
+ continue;
59
+ if (theirsRemoved) {
60
+ conflict(id, () => restore.add(id));
61
+ continue;
62
+ }
63
+ if (theirsChanged) {
64
+ if (!(0, deep_equal_1.jsonEqual)(mineBlock, theirsBlock))
65
+ conflict(id, () => (merged[indexOf(id)] = mineBlock));
66
+ continue;
67
+ }
68
+ merged[indexOf(id)] = mineBlock;
69
+ }
70
+ // Order of the blocks every side still holds.
71
+ const common = (list) => list.map((b) => b.id).filter((id) => base.has(id) && mine.has(id) && theirs.has(id));
72
+ const baseOrder = common(p.base);
73
+ const mineOrder = common(p.mine);
74
+ const theirsOrder = common(p.theirs);
75
+ const mineMoved = !(0, deep_equal_1.jsonEqual)(mineOrder, baseOrder);
76
+ const theirsMoved = !(0, deep_equal_1.jsonEqual)(theirsOrder, baseOrder);
77
+ const bothMovedDifferently = mineMoved && theirsMoved && !(0, deep_equal_1.jsonEqual)(mineOrder, theirsOrder);
78
+ const orderConflict = report && bothMovedDifferently;
79
+ if ((mineMoved && !theirsMoved) || (bothMovedDifferently && preferMine)) {
80
+ // The slots those blocks hold in `merged` take the device's order; every other block stays put.
81
+ const commonSet = new Set(mineOrder);
82
+ const byId = new Map(merged.map((b) => [b.id, b]));
83
+ let next = 0;
84
+ for (let index = 0; index < merged.length; index++)
85
+ if (commonSet.has(merged[index].id))
86
+ merged[index] = byId.get(mineOrder[next++]);
87
+ }
88
+ // Blocks the device added (or brings back): each lands after the block that precedes it on the device.
89
+ let previousId;
90
+ for (const mineBlock of p.mine) {
91
+ const id = mineBlock.id;
92
+ if (!base.has(id) || restore.has(id)) {
93
+ const at = indexOf(id);
94
+ if (at !== -1) {
95
+ if (!(0, deep_equal_1.jsonEqual)(merged[at], mineBlock))
96
+ conflict(id, () => (merged[at] = mineBlock));
97
+ }
98
+ else {
99
+ const insertAt = previousId === undefined ? 0 : indexOf(previousId) + 1;
100
+ merged.splice(insertAt, 0, mineBlock);
101
+ }
102
+ }
103
+ if (indexOf(id) !== -1)
104
+ previousId = id;
105
+ }
106
+ return { merged, conflictBlockIds, orderConflict };
107
+ }
108
+ //# sourceMappingURL=merge-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-blocks.js","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/merge/merge-blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /** A JSON:API resource object as the wire carries it (only attributes and relationships are read). */
2
+ export type Resource = {
3
+ type?: string;
4
+ id?: string;
5
+ attributes?: Record<string, unknown>;
6
+ relationships?: Record<string, unknown>;
7
+ [key: string]: unknown;
8
+ };
9
+ /** Whose value a conflicting field takes once the GM has chosen. */
10
+ export type FieldChoice = "mine" | "theirs" | "merged";
11
+ /** The GM's answer to an earlier conflict on this record. */
12
+ export type MergeResolution = {
13
+ /** Per conflicting field (attribute or relationship name). */
14
+ choices?: Record<string, FieldChoice>;
15
+ /** The choice of every conflicting field `choices` does not name ("Keep mine" = "mine"). */
16
+ all?: FieldChoice;
17
+ /** The resource holding the hand-merged values of the fields chosen "merged". */
18
+ merged?: Resource;
19
+ };
20
+ export type ThreeWayMergeResult = {
21
+ /** Every attribute of the server's record, with what the merge settled in place. */
22
+ attributes: Record<string, unknown>;
23
+ /** Every relationship the device sent, with the merged linkage (and edge props in `meta`). */
24
+ relationships: Record<string, unknown>;
25
+ /** Attribute and relationship names the save must write (never one only the server changed). */
26
+ changed: string[];
27
+ /** Attribute and relationship names both sides changed differently (and no choice settles). */
28
+ conflictFields: string[];
29
+ /** Rich-text field → conflicting block ids. */
30
+ conflictBlocks: Record<string, string[]>;
31
+ };
32
+ /**
33
+ * Three-way merge of one record: base (the record at the last sync), mine (the document the
34
+ * device's model built) and theirs (the record on the server now). Only fields the device
35
+ * sent are considered; a field only the server changed is kept and never written.
36
+ *
37
+ * - Only one side changed a field → that side.
38
+ * - Both changed a plain field to different values → conflict.
39
+ * - Both changed a rich-text field → block-by-block merge (`mergeBlocks`, block order included).
40
+ * - Relationships never conflict: ids added or removed on only one side are applied; edge
41
+ * props (`meta`) changed on only one side are applied; when both sides changed the same
42
+ * link's props, the device's win (the GM's later edit).
43
+ * - A relationship missing from theirs (or base) is empty when it is one of
44
+ * `knownRelationships` (the server always answers those, and omits an empty one);
45
+ * otherwise it is unknown and treated as unchanged.
46
+ * - `resolution` settles conflicts with the GM's choices: "mine" → the device's value,
47
+ * "theirs" → the server's (not written), "merged" → the value in `resolution.merged`.
48
+ */
49
+ export declare function threeWayMerge(p: {
50
+ base: Resource;
51
+ mine: Resource;
52
+ theirs: Resource;
53
+ richTextFields: string[];
54
+ knownRelationships?: string[];
55
+ resolution?: MergeResolution;
56
+ }): ThreeWayMergeResult;
57
+ //# sourceMappingURL=three-way-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"three-way-merge.d.ts","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/merge/three-way-merge.ts"],"names":[],"mappings":"AAGA,sGAAsG;AACtG,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AASF,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG;IAC5B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,4FAA4F;IAC5F,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,iFAAiF;IACjF,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,8FAA8F;IAC9F,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,gGAAgG;IAChG,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+FAA+F;IAC/F,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC1C,CAAC;AAwCF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B,GAAG,mBAAmB,CA6ItB"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.threeWayMerge = threeWayMerge;
4
+ const deep_equal_1 = require("./deep-equal");
5
+ const merge_blocks_1 = require("./merge-blocks");
6
+ /** Rich text travels as the JSON string the model wrote. `undefined` when it is not a block array. */
7
+ function parseBlocks(value) {
8
+ if (value === undefined || value === null || value === "")
9
+ return [];
10
+ if (Array.isArray(value))
11
+ return value;
12
+ if (typeof value !== "string")
13
+ return undefined;
14
+ try {
15
+ const parsed = JSON.parse(value);
16
+ return Array.isArray(parsed) ? parsed : undefined;
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ function linkage(rel) {
23
+ if (!rel || typeof rel !== "object" || !("data" in rel))
24
+ return undefined;
25
+ return rel.data ?? null;
26
+ }
27
+ const idsOf = (data) => data == null ? [] : Array.isArray(data) ? data.map((d) => d.id) : [data.id];
28
+ const isObject = (value) => !!value && typeof value === "object" && !Array.isArray(value);
29
+ /**
30
+ * The edge props a side holds for one linked id: the identifier's `meta`, or (to-one) the
31
+ * relationship's `meta`. `undefined` when that side says nothing about them.
32
+ */
33
+ function propsOf(rel, id) {
34
+ const data = linkage(rel);
35
+ if (data == null)
36
+ return undefined;
37
+ const item = (Array.isArray(data) ? data : [data]).find((d) => d.id === id);
38
+ if (!item)
39
+ return undefined;
40
+ if (isObject(item.meta))
41
+ return item.meta;
42
+ if (!Array.isArray(data) && isObject(rel.meta))
43
+ return rel.meta;
44
+ return undefined;
45
+ }
46
+ /**
47
+ * Three-way merge of one record: base (the record at the last sync), mine (the document the
48
+ * device's model built) and theirs (the record on the server now). Only fields the device
49
+ * sent are considered; a field only the server changed is kept and never written.
50
+ *
51
+ * - Only one side changed a field → that side.
52
+ * - Both changed a plain field to different values → conflict.
53
+ * - Both changed a rich-text field → block-by-block merge (`mergeBlocks`, block order included).
54
+ * - Relationships never conflict: ids added or removed on only one side are applied; edge
55
+ * props (`meta`) changed on only one side are applied; when both sides changed the same
56
+ * link's props, the device's win (the GM's later edit).
57
+ * - A relationship missing from theirs (or base) is empty when it is one of
58
+ * `knownRelationships` (the server always answers those, and omits an empty one);
59
+ * otherwise it is unknown and treated as unchanged.
60
+ * - `resolution` settles conflicts with the GM's choices: "mine" → the device's value,
61
+ * "theirs" → the server's (not written), "merged" → the value in `resolution.merged`.
62
+ */
63
+ function threeWayMerge(p) {
64
+ const base = p.base?.attributes ?? {};
65
+ const mine = p.mine?.attributes ?? {};
66
+ const theirs = p.theirs?.attributes ?? {};
67
+ const choiceOf = (name) => p.resolution ? (p.resolution.choices?.[name] ?? p.resolution.all) : undefined;
68
+ const mergedAttributes = p.resolution?.merged?.attributes ?? {};
69
+ const attributes = { ...theirs };
70
+ const changed = [];
71
+ const conflictFields = [];
72
+ const conflictBlocks = {};
73
+ /** Writes `value` when it differs from the server's. */
74
+ const settle = (field, value, differs) => {
75
+ attributes[field] = value;
76
+ if (differs)
77
+ changed.push(field);
78
+ };
79
+ for (const field of Object.keys(mine)) {
80
+ const b = base[field];
81
+ const m = mine[field];
82
+ const t = theirs[field];
83
+ const isRichText = p.richTextFields.includes(field);
84
+ const blocks = isRichText ? { b: parseBlocks(b), m: parseBlocks(m), t: parseBlocks(t) } : undefined;
85
+ const asBlocks = blocks && blocks.b && blocks.m && blocks.t ? blocks : undefined;
86
+ const same = (x, y, bx, by) => asBlocks ? (0, deep_equal_1.jsonEqual)(bx, by) : (0, deep_equal_1.jsonEqual)(x, y);
87
+ if (same(m, b, asBlocks?.m, asBlocks?.b))
88
+ continue;
89
+ if (same(t, b, asBlocks?.t, asBlocks?.b)) {
90
+ settle(field, m, true);
91
+ continue;
92
+ }
93
+ if (same(m, t, asBlocks?.m, asBlocks?.t))
94
+ continue;
95
+ const choice = choiceOf(field);
96
+ if (asBlocks) {
97
+ const result = (0, merge_blocks_1.mergeBlocks)({ base: asBlocks.b, mine: asBlocks.m, theirs: asBlocks.t });
98
+ const conflicting = result.conflictBlockIds.length > 0 || result.orderConflict;
99
+ if (!conflicting) {
100
+ settle(field, JSON.stringify(result.merged), !(0, deep_equal_1.jsonEqual)(result.merged, asBlocks.t));
101
+ continue;
102
+ }
103
+ if (choice === "mine" || choice === "theirs") {
104
+ const chosen = (0, merge_blocks_1.mergeBlocks)({ base: asBlocks.b, mine: asBlocks.m, theirs: asBlocks.t, prefer: choice });
105
+ settle(field, JSON.stringify(chosen.merged), !(0, deep_equal_1.jsonEqual)(chosen.merged, asBlocks.t));
106
+ continue;
107
+ }
108
+ if (choice === "merged" && field in mergedAttributes) {
109
+ const value = mergedAttributes[field];
110
+ settle(field, value, !(0, deep_equal_1.jsonEqual)(parseBlocks(value) ?? value, asBlocks.t));
111
+ continue;
112
+ }
113
+ attributes[field] = JSON.stringify(result.merged);
114
+ conflictFields.push(field);
115
+ // A conflicting order is a whole-field choice: no block list for it.
116
+ if (!result.orderConflict)
117
+ conflictBlocks[field] = result.conflictBlockIds;
118
+ continue;
119
+ }
120
+ if (choice === "mine")
121
+ settle(field, m, true);
122
+ else if (choice === "theirs")
123
+ continue;
124
+ else if (choice === "merged" && field in mergedAttributes)
125
+ settle(field, mergedAttributes[field], !(0, deep_equal_1.jsonEqual)(mergedAttributes[field], t));
126
+ else
127
+ conflictFields.push(field);
128
+ }
129
+ const relationships = {};
130
+ const baseRels = p.base?.relationships ?? {};
131
+ const theirsRels = p.theirs?.relationships ?? {};
132
+ const known = new Set(p.knownRelationships ?? []);
133
+ for (const [name, mineRel] of Object.entries(p.mine?.relationships ?? {})) {
134
+ const mineData = linkage(mineRel);
135
+ if (mineData === undefined)
136
+ continue;
137
+ const empty = Array.isArray(mineData) ? [] : null;
138
+ const theirsRel = theirsRels[name] ?? (known.has(name) ? { data: empty } : undefined);
139
+ const baseRel = baseRels[name] ?? (known.has(name) ? { data: empty } : undefined);
140
+ const theirsData = linkage(theirsRel);
141
+ const theirsKnown = theirsData !== undefined;
142
+ const baseData = linkage(baseRel);
143
+ const baseIds = baseData === undefined ? (theirsKnown ? idsOf(theirsData) : []) : idsOf(baseData);
144
+ const theirsIds = theirsKnown ? idsOf(theirsData) : baseIds;
145
+ const identifiers = new Map();
146
+ for (const d of [theirsData, mineData]) {
147
+ if (d == null)
148
+ continue;
149
+ for (const item of Array.isArray(d) ? d : [d])
150
+ identifiers.set(item.id, item);
151
+ }
152
+ let resultIds;
153
+ if (Array.isArray(mineData)) {
154
+ const mineIds = mineData.map((d) => d.id);
155
+ const added = mineIds.filter((id) => !baseIds.includes(id));
156
+ const removed = baseIds.filter((id) => !mineIds.includes(id));
157
+ resultIds = [...theirsIds.filter((id) => !removed.includes(id))];
158
+ for (const id of added)
159
+ if (!resultIds.includes(id))
160
+ resultIds.push(id);
161
+ }
162
+ else {
163
+ const mineId = mineData?.id ?? null;
164
+ const baseId = baseIds[0] ?? null;
165
+ const theirsId = theirsIds[0] ?? null;
166
+ const resultId = mineId === baseId ? theirsId : mineId;
167
+ resultIds = resultId === null ? [] : [resultId];
168
+ }
169
+ // Edge props of every link the result keeps.
170
+ let linkChanged = !(0, deep_equal_1.jsonEqual)([...resultIds].sort(), [...theirsIds].sort());
171
+ const finalProps = new Map();
172
+ for (const id of resultIds) {
173
+ const bp = baseIds.includes(id) ? propsOf(baseRel, id) : undefined;
174
+ const mp = propsOf(mineRel, id);
175
+ const tp = theirsIds.includes(id) ? propsOf(theirsRel, id) : undefined;
176
+ const mineChanged = mp !== undefined && !(0, deep_equal_1.jsonEqual)(mp, bp);
177
+ // The device's props when it changed them (also when the server changed them too), else the server's.
178
+ const props = mineChanged ? mp : (tp ?? mp);
179
+ finalProps.set(id, props);
180
+ if (theirsIds.includes(id) && props !== undefined && !(0, deep_equal_1.jsonEqual)(props, tp))
181
+ linkChanged = true;
182
+ }
183
+ const identifierOf = (id) => {
184
+ const { meta: _meta, ...identifier } = identifiers.get(id) ?? { id };
185
+ const props = finalProps.get(id);
186
+ return props === undefined ? identifier : { ...identifier, id, meta: props };
187
+ };
188
+ if (Array.isArray(mineData)) {
189
+ relationships[name] = { ...mineRel, data: resultIds.map(identifierOf) };
190
+ }
191
+ else {
192
+ const { meta: _relMeta, ...rest } = mineRel;
193
+ const data = resultIds.length === 0 ? null : identifierOf(resultIds[0]);
194
+ relationships[name] = data?.meta ? { ...rest, data, meta: data.meta } : { ...rest, data };
195
+ }
196
+ if (linkChanged)
197
+ changed.push(name);
198
+ }
199
+ return { attributes, relationships, changed, conflictFields, conflictBlocks };
200
+ }
201
+ //# sourceMappingURL=three-way-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"three-way-merge.js","sourceRoot":"","sources":["../../../../src/foundations/offline-change-set/merge/three-way-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { OnModuleInit } from "@nestjs/common";
2
+ /**
3
+ * Offline change sets: opens a package of every change a device queued while offline and runs
4
+ * each one through the app's own routes. Loaded by `OfflineModule` when
5
+ * `bootstrap({ offline: { changeSets: true } })`. Declares no controller: the receiving route
6
+ * (`POST /offline-change-sets`) belongs to the app, which calls `OfflineChangeSetService.apply`.
7
+ */
8
+ export declare class OfflineChangeSetModule implements OnModuleInit {
9
+ onModuleInit(): void;
10
+ }
11
+ //# sourceMappingURL=offline-change-set.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline-change-set.module.d.ts","sourceRoot":"","sources":["../../../src/foundations/offline-change-set/offline-change-set.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQtD;;;;;GAKG;AACH,qBAUa,sBAAuB,YAAW,YAAY;IACzD,YAAY;CAGb"}