dyna-record 0.1.5 → 0.2.1

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 (112) hide show
  1. package/README.md +11 -13
  2. package/dist/src/DynaRecord.d.ts +36 -28
  3. package/dist/src/DynaRecord.d.ts.map +1 -1
  4. package/dist/src/DynaRecord.js +39 -36
  5. package/dist/src/decorators/Table.d.ts.map +1 -1
  6. package/dist/src/decorators/attributes/BooleanAttribute.d.ts.map +1 -1
  7. package/dist/src/decorators/attributes/DateAttribute.d.ts.map +1 -1
  8. package/dist/src/decorators/attributes/EnumAttribute.d.ts.map +1 -1
  9. package/dist/src/decorators/attributes/ForeignKeyAttribute.d.ts.map +1 -1
  10. package/dist/src/decorators/attributes/NumberAttribute.d.ts.map +1 -1
  11. package/dist/src/decorators/attributes/PartitionKeyAttribute.d.ts.map +1 -1
  12. package/dist/src/decorators/attributes/SortKeyAttribute.d.ts.map +1 -1
  13. package/dist/src/decorators/attributes/StringAttribute.d.ts.map +1 -1
  14. package/dist/src/decorators/attributes/serializers.d.ts +1 -1
  15. package/dist/src/decorators/relationships/BelongsTo.d.ts.map +1 -1
  16. package/dist/src/decorators/relationships/HasAndBelongsToMany.d.ts.map +1 -1
  17. package/dist/src/decorators/relationships/HasMany.d.ts +7 -0
  18. package/dist/src/decorators/relationships/HasMany.d.ts.map +1 -1
  19. package/dist/src/decorators/relationships/HasMany.js +12 -2
  20. package/dist/src/decorators/relationships/HasOne.d.ts.map +1 -1
  21. package/dist/src/decorators/types.d.ts +2 -2
  22. package/dist/src/decorators/types.d.ts.map +1 -1
  23. package/dist/src/dynamo-utils/TransactGetBuilder.d.ts +4 -0
  24. package/dist/src/dynamo-utils/TransactGetBuilder.d.ts.map +1 -1
  25. package/dist/src/dynamo-utils/TransactGetBuilder.js +6 -0
  26. package/dist/src/metadata/EntityMetadata.d.ts +21 -1
  27. package/dist/src/metadata/EntityMetadata.d.ts.map +1 -1
  28. package/dist/src/metadata/EntityMetadata.js +33 -0
  29. package/dist/src/metadata/TableMetadata.d.ts.map +1 -1
  30. package/dist/src/metadata/TableMetadata.js +1 -3
  31. package/dist/src/metadata/relationship-metadata/BelongsToRelationship.d.ts +1 -1
  32. package/dist/src/metadata/relationship-metadata/BelongsToRelationship.js +1 -1
  33. package/dist/src/metadata/relationship-metadata/HasManyRelationship.d.ts +2 -1
  34. package/dist/src/metadata/relationship-metadata/HasManyRelationship.d.ts.map +1 -1
  35. package/dist/src/metadata/relationship-metadata/HasManyRelationship.js +2 -1
  36. package/dist/src/metadata/relationship-metadata/OwnedByRelationship.d.ts +18 -0
  37. package/dist/src/metadata/relationship-metadata/OwnedByRelationship.d.ts.map +1 -0
  38. package/dist/src/metadata/relationship-metadata/OwnedByRelationship.js +26 -0
  39. package/dist/src/metadata/relationship-metadata/RelationshipMetadata.d.ts +1 -1
  40. package/dist/src/metadata/relationship-metadata/RelationshipMetadata.d.ts.map +1 -1
  41. package/dist/src/metadata/relationship-metadata/index.d.ts +2 -1
  42. package/dist/src/metadata/relationship-metadata/index.d.ts.map +1 -1
  43. package/dist/src/metadata/relationship-metadata/index.js +3 -1
  44. package/dist/src/metadata/relationship-metadata/types.d.ts +7 -2
  45. package/dist/src/metadata/relationship-metadata/types.d.ts.map +1 -1
  46. package/dist/src/metadata/relationship-metadata/utils.d.ts.map +1 -1
  47. package/dist/src/metadata/relationship-metadata/utils.js +3 -0
  48. package/dist/src/metadata/types.d.ts +7 -4
  49. package/dist/src/metadata/types.d.ts.map +1 -1
  50. package/dist/src/metadata/utils.d.ts +8 -4
  51. package/dist/src/metadata/utils.d.ts.map +1 -1
  52. package/dist/src/metadata/utils.js +8 -1
  53. package/dist/src/operations/Create/Create.d.ts +95 -16
  54. package/dist/src/operations/Create/Create.d.ts.map +1 -1
  55. package/dist/src/operations/Create/Create.js +171 -22
  56. package/dist/src/operations/Delete/Delete.d.ts +32 -23
  57. package/dist/src/operations/Delete/Delete.d.ts.map +1 -1
  58. package/dist/src/operations/Delete/Delete.js +117 -100
  59. package/dist/src/operations/Delete/types.d.ts +0 -3
  60. package/dist/src/operations/Delete/types.d.ts.map +1 -1
  61. package/dist/src/operations/FindById/FindById.d.ts +7 -28
  62. package/dist/src/operations/FindById/FindById.d.ts.map +1 -1
  63. package/dist/src/operations/FindById/FindById.js +36 -125
  64. package/dist/src/operations/FindById/types.d.ts +8 -9
  65. package/dist/src/operations/FindById/types.d.ts.map +1 -1
  66. package/dist/src/operations/Query/Query.d.ts +2 -1
  67. package/dist/src/operations/Query/Query.d.ts.map +1 -1
  68. package/dist/src/operations/Query/Query.js +17 -4
  69. package/dist/src/operations/Query/types.d.ts +39 -5
  70. package/dist/src/operations/Query/types.d.ts.map +1 -1
  71. package/dist/src/operations/Update/Update.d.ts +185 -24
  72. package/dist/src/operations/Update/Update.d.ts.map +1 -1
  73. package/dist/src/operations/Update/Update.js +409 -72
  74. package/dist/src/operations/Update/UpdateDryRun.d.ts +10 -0
  75. package/dist/src/operations/Update/UpdateDryRun.d.ts.map +1 -0
  76. package/dist/src/operations/Update/UpdateDryRun.js +15 -0
  77. package/dist/src/operations/Update/index.d.ts +1 -0
  78. package/dist/src/operations/Update/index.d.ts.map +1 -1
  79. package/dist/src/operations/Update/index.js +3 -1
  80. package/dist/src/operations/types.d.ts +6 -1
  81. package/dist/src/operations/types.d.ts.map +1 -1
  82. package/dist/src/operations/utils/expressionBuilder.d.ts.map +1 -1
  83. package/dist/src/operations/utils/expressionBuilder.js +1 -4
  84. package/dist/src/operations/utils/index.d.ts +0 -1
  85. package/dist/src/operations/utils/index.d.ts.map +1 -1
  86. package/dist/src/operations/utils/index.js +0 -6
  87. package/dist/src/operations/utils/utils.d.ts +13 -3
  88. package/dist/src/operations/utils/utils.d.ts.map +1 -1
  89. package/dist/src/operations/utils/utils.js +33 -3
  90. package/dist/src/query-utils/Filters.d.ts +1 -1
  91. package/dist/src/query-utils/Filters.d.ts.map +1 -1
  92. package/dist/src/query-utils/Filters.js +7 -15
  93. package/dist/src/query-utils/QueryBuilder.d.ts.map +1 -1
  94. package/dist/src/query-utils/QueryBuilder.js +9 -1
  95. package/dist/src/relationships/JoinTable.d.ts +17 -7
  96. package/dist/src/relationships/JoinTable.d.ts.map +1 -1
  97. package/dist/src/relationships/JoinTable.js +77 -20
  98. package/dist/src/relationships/index.d.ts +0 -1
  99. package/dist/src/relationships/index.d.ts.map +1 -1
  100. package/dist/src/relationships/index.js +1 -3
  101. package/dist/src/types.d.ts +6 -8
  102. package/dist/src/types.d.ts.map +1 -1
  103. package/dist/src/utils.d.ts +10 -32
  104. package/dist/src/utils.d.ts.map +1 -1
  105. package/dist/src/utils.js +13 -59
  106. package/package.json +5 -5
  107. package/dist/src/operations/utils/RelationshipTransactions.d.ts +0 -64
  108. package/dist/src/operations/utils/RelationshipTransactions.d.ts.map +0 -1
  109. package/dist/src/operations/utils/RelationshipTransactions.js +0 -125
  110. package/dist/src/relationships/BelongsToLink.d.ts +0 -51
  111. package/dist/src/relationships/BelongsToLink.d.ts.map +0 -1
  112. package/dist/src/relationships/BelongsToLink.js +0 -57
@@ -1,50 +1,211 @@
1
1
  import type DynaRecord from "../../DynaRecord";
2
+ import { TransactWriteBuilder } from "../../dynamo-utils";
2
3
  import OperationBase from "../OperationBase";
3
4
  import type { UpdatedAttributes, UpdateOptions } from "./types";
4
5
  import type { EntityClass } from "../../types";
5
6
  /**
6
- * Facilitates the operation of updating an existing entity in the database, including handling updates to its attributes and managing changes to its relationships. It will de-normalize data to support relationship links
7
+ * Represents an update operation for a DynaRecord-backed entity, handling both attribute updates and relationship consistency via denormalization.
7
8
  *
8
- * The `Update` operation supports updating entity attributes and ensures consistency in relationships, especially for "BelongsTo" relationships. It handles the complexity of managing foreign keys and associated "BelongsToLink" records, including creating new links for updated relationships and removing outdated links when necessary.
9
+ * This class supports updating an existing entity and managing its relational links, specifically:
10
+ * - Updating entity attributes while preserving schema constraints.
11
+ * - Managing "BelongsTo" relationship links by creating or removing associated denormalized records.
12
+ * - Ensuring that if a foreign key changes, the old link record is removed, preventing stale references.
9
13
  *
10
- * Only attributes defined on the model can be configured, and will be enforced via types and runtime schema validation.
14
+ * Only attributes defined on the model can be updated. Both compile-time and runtime checks help ensure that updated values are valid.
15
+ *
16
+ * **Example**
17
+ * ```typescript
18
+ * const updateOp = new Update(MyEntityClass);
19
+ * await updateOp.run("entityId", { name: "NewName", status: "active" });
20
+ * ```
11
21
  *
12
22
  * @template T - The type of the entity being updated, extending `DynaRecord`.
13
23
  */
14
24
  declare class Update<T extends DynaRecord> extends OperationBase<T> {
15
- #private;
16
- constructor(Entity: EntityClass<T>);
25
+ protected readonly transactionBuilder: TransactWriteBuilder;
26
+ constructor(Entity: EntityClass<T>, transactionBuilder?: TransactWriteBuilder);
27
+ /**
28
+ * Executes the update operation against DynamoDB.
29
+ *
30
+ * **What it does:**
31
+ * - Fetches the current state of the entity and any related "Has" relationship entities.
32
+ * - Constructs an update expression for the main entity's attributes.
33
+ * - Applies the same update expression to related entities and "BelongsTo" link records to maintain denormalized consistency.
34
+ * - Manages foreign key changes by creating new link items and removing old link items.
35
+ *
36
+ * @param id - The unique identifier of the entity being updated.
37
+ * @param attributes - Partial set of entity attributes to update. Must be defined on the entity's model.
38
+ * @returns A promise that resolves to the set of updated attributes as applied to the entity.
39
+ * @throws If the entity does not exist, an error is thrown.
40
+ */
41
+ run(id: string, attributes: UpdateOptions<DynaRecord>): Promise<UpdatedAttributes<T>>;
42
+ protected commitTransaction(): Promise<void>;
43
+ /**
44
+ * BelongsToRelationship meta data and foreign key value pair for foreign keys being updated
45
+ * @param attributes
46
+ * @returns
47
+ */
48
+ private getBelongsToRelMetaAndKeyForUpdatedKeys;
49
+ /**
50
+ * Pre-fetches the target entity and any related entities from the database. This is done using a strong read operation to ensure consistency.
51
+ *
52
+ * **What it does:**
53
+ * - Retrieves the main entity and all linked entities in the entity's partition.
54
+ * - Performs a TransactGetItem operation on entities linked bai foreign keys (BelongsTo) to support denormalizing copies to associated partitions
55
+ * - Filters these entities to separate the main entity and its related link records.
56
+ *
57
+ * @param id - The unique identifier of the entity being fetched.
58
+ * @param belongsToRelFkAndMetas - BelongsTo relationship meta objects with foreign keys used for fetching associated records
59
+ * @returns A promise that resolves to an object containing:
60
+ * - `entityPreUpdate`: The current state of the entity before updates.
61
+ * - `relatedEntities`: An array of related link entities.
62
+ * @throws If the entity does not exist, it throws a NotFoundError.
63
+ * @private
64
+ */
65
+ private preFetch;
17
66
  /**
18
- * Update entity transactions, including transactions to create/update BelongsToLinks
19
- * @param id The id of the entity being updated
20
- * @param attributes Attributes on the model to update.
67
+ * {reprocess pre-fetch data for processing
68
+ * @param id
69
+ * @param entities
70
+ * @param belongsToRelFkAndMetas
71
+ * @returns
21
72
  */
22
- run(id: string, attributes: UpdateOptions<T>): Promise<UpdatedAttributes<T>>;
73
+ private preProcessFetchedData;
23
74
  /**
24
- * Build the transaction to update the entity
25
- * @param id The id of the entity being updated
26
- * @param attributes Attributes on the model to update.
75
+ * Constructs updated attributes and the corresponding DynamoDB update expression.
76
+ *
77
+ * **What it does:**
78
+ * - Merges the provided attributes with `updatedAt` (automatically set to the current time).
79
+ * - Converts the updated attributes into a DynamoDB update expression.
80
+ *
81
+ * @param attributes - The partial attributes to be updated on the entity.
82
+ * @returns An object containing:
83
+ * - `updatedAttrs`: The final updated attribute set.
84
+ * - `expression`: A DynamoDB update expression to apply these changes.
85
+ * @private
86
+ */
87
+ private buildUpdateMetadata;
88
+ /**
89
+ * Adds a transaction operation to update the main entity's record.
90
+ *
91
+ * **What it does:**
92
+ * - Builds a DynamoDB Update transaction using the provided update expression.
93
+ * - Adds a condition to ensure the entity exists before updating.
94
+ *
95
+ * @param id - The unique identifier of the entity being updated.
96
+ * @param updateExpression - The DynamoDB update expression describing the changes.
97
+ * @private
27
98
  */
28
99
  private buildUpdateItemTransaction;
29
100
  /**
30
- * Builds the transactions to persist relationships
31
- * - Creates BelongsToLinks when a foreign key changes
32
- * - Removes outdated BelongsToLinks if the entity previously was associated with a different entity
33
- * @param id The id of the entity being updated
34
- * @param attributes Attributes on the model to update.
101
+ * Builds all necessary transactions to handle "BelongsTo" or uni-directional "OwnedBy" relationships when updating the entity.
102
+ *
103
+ * **What it does:**
104
+ * - Checks if any foreign keys for "BelongsTo" or uni-directional "OwnedBy" relationships have changed.
105
+ * - If so, updates or creates new denormalized link records in the related partitions.
106
+ * - Removes old link records that are no longer valid due to foreign key changes.
107
+ *
108
+ * @param entityPreUpdate - The state of the entity before the update.
109
+ * @param updatedEntity - The entity state after proposed updates (partial attributes).
110
+ * @param updateExpression - The DynamoDB update expression representing the attribute updates.
111
+ * @private
112
+ */
113
+ private buildBelongsToTransactions;
114
+ /**
115
+ * Creates or updates the denormalized link record for a "BelongsTo" relationship to the related entity's partition.
116
+ *
117
+ * **What it does:**
118
+ * - Builds a DynamoDB Update transaction for the linked record identified by the relationship and foreign key.
119
+ * - Ensures the linked record exists before updating (if not, it will fail).
120
+ *
121
+ * @param entityId - The identifier of the main entity being updated.
122
+ * @param relMeta - Metadata describing the "BelongsTo" relationship.
123
+ * @param foreignKey - The new foreign key value after updates.
124
+ * @param updateExpression - The DynamoDB update expression for the attribute changes.
125
+ * @private
126
+ */
127
+ private buildUpdateBelongsToLinkedRecords;
128
+ /**
129
+ * Builds transactions to persist an updated/new belongs to record
130
+ * Denormalizes data to the entity being updates's partition and a link to the foreign entities partition
131
+ * Ensures that the new entity foreign key exists
132
+ * @param updatedEntity
133
+ * @param relMeta
134
+ * @param foreignKey
135
+ * @param newBelongsToEntityLookup
136
+ * @param persistToSelfCondition
137
+ * @param persistToSelfConditionErrMessage
138
+ */
139
+ private buildPutBelongsToLinkedRecords;
140
+ /**
141
+ * Builds a condition expression that an entity exists
142
+ * @param relMeta
143
+ * @param foreignKey
144
+ */
145
+ private buildEntityExistsCondition;
146
+ /**
147
+ * Denormalizes a link for the entity being updated to the new entities partition
148
+ * @param updatedEntity
149
+ * @param relMeta
150
+ * @param foreignKey
151
+ */
152
+ private buildLinkToForeignEntityTransaction;
153
+ /**
154
+ * Builds the transaction to add or replace the linked record for the foreign entity in the entity being updates partition
155
+ * @param updatedEntity
156
+ * @param relMeta
157
+ * @param foreignKey
158
+ * @param newBelongsToEntityLookup
159
+ * @param persistToSelfCondition
160
+ * @param persistToSelfConditionErrMessage
161
+ */
162
+ private buildAddForeignEntityToSelfTransaction;
163
+ /**
164
+ * Removes the old link record associated with a previous "BelongsTo" foreign key when the foreign key changes.
165
+ *
166
+ * **What it does:**
167
+ * - Builds a DynamoDB Delete transaction to remove the stale link record from the old relationship partition.
168
+ *
169
+ * @param entityId - The identifier of the entity whose foreign key was changed.
170
+ * @param relMeta - Metadata describing the "BelongsTo" relationship.
171
+ * @param oldForeignKey - The old foreign key value that should no longer link to the entity.
172
+ * @private
173
+ */
174
+ private removeForeignKeysTransactions;
175
+ /**
176
+ * Builds the transactions for updating the foreign key of an entity from one key to another
177
+ * @param updatedEntity
178
+ * @param relMeta
179
+ * @param newForeignKey
180
+ * @param oldForeignKey
181
+ * @param newBelongsToEntityLookup
182
+ */
183
+ private updateForeignKeyTransactions;
184
+ /**
185
+ * Builds transactions to update all related entities that exist in the main entity's partition, applying the same attribute updates.
186
+ *
187
+ * **What it does:**
188
+ * - For each linked entity found in `preFetch`, attempts to apply the same update expression.
189
+ * - Ensures each related entity exists before attempting to update.
190
+ *
191
+ * @param relatedEntities - An array of entities that are related to the primary entity and need synchronized attribute updates.
192
+ * @param expression - The DynamoDB update expression to apply to related entities.
193
+ * @private
35
194
  */
36
- private buildRelationshipTransactions;
195
+ private buildUpdateRelatedEntityLinks;
37
196
  /**
38
- * When updating the foreign key of an entity, delete the BelongsToLink in the previous relationships partition
39
- * @param rel
40
- * @param relType
197
+ * Builds the table key for a related entity that needs to be updated
198
+ * @param id - The id of the entity being updated
41
199
  * @param entity
200
+ * @param relLookup
201
+ * @returns
42
202
  */
43
- private buildDeleteOldBelongsToLinkTransaction;
203
+ private buildUpdatedRelatedEntityLinkKey;
44
204
  /**
45
- * If updating a ForeignKey, look up the current state of the item to build transactions
205
+ * Build a lookup object to lookup a HasAndBelongsToMany relationship for an entity. Used for processing to avoid excessive looping
206
+ * @returns
46
207
  */
47
- private getEntity;
208
+ private buildHasAndBelongsToManyRelLookup;
48
209
  }
49
210
  export default Update;
50
211
  //# sourceMappingURL=Update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Update.d.ts","sourceRoot":"","sources":["../../../../src/operations/Update/Update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAa/C,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;;;;;;;GAQG;AACH,cAAM,MAAM,CAAC,CAAC,SAAS,UAAU,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;;gBAK7C,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAKlC;;;;OAIG;IACU,GAAG,CACd,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAahC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAoClC;;;;;;OAMG;YACW,6BAA6B;IAsB3C;;;;;OAKG;IACH,OAAO,CAAC,sCAAsC;IAyB9C;;OAEG;YACW,SAAS;CAOxB;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Update.d.ts","sourceRoot":"","sources":["../../../../src/operations/Update/Update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAGL,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAkB5B,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAmB,WAAW,EAAgB,MAAM,aAAa,CAAC;AA4D9E;;;;;;;;;;;;;;;;;GAiBG;AACH,cAAM,MAAM,CAAC,CAAC,SAAS,UAAU,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;gBAG1D,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EACtB,kBAAkB,CAAC,EAAE,oBAAoB;IAO3C;;;;;;;;;;;;;OAaG;IACU,GAAG,CACd,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;cA4ChB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlD;;;;OAIG;IACH,OAAO,CAAC,uCAAuC;IAY/C;;;;;;;;;;;;;;;OAeG;YACW,QAAQ;IAqDtB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IA4B7B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,0BAA0B;IAyBlC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IAuDlC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,iCAAiC;IAuBzC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,8BAA8B;IA+BtC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAkBlC;;;;;OAKG;IACH,OAAO,CAAC,mCAAmC;IAsB3C;;;;;;;;OAQG;IACH,OAAO,CAAC,sCAAsC;IAqC9C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,6BAA6B;IAuCrC;;;;;;;OAOG;IACH,OAAO,CAAC,4BAA4B;IA6BpC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,6BAA6B;IAwBrC;;;;;;OAMG;IACH,OAAO,CAAC,gCAAgC;IAgBxC;;;OAGG;IACH,OAAO,CAAC,iCAAiC;CAU1C;AAED,eAAe,MAAM,CAAC"}