local-serverless-stack 0.6.0 → 0.9.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 (257) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +261 -583
  3. package/bin/cli.js +31 -3
  4. package/dist/client/types.d.ts +4 -0
  5. package/dist/client/types.d.ts.map +1 -1
  6. package/dist/server/engine/aoss-sidecar.d.ts +13 -0
  7. package/dist/server/engine/aoss-sidecar.d.ts.map +1 -0
  8. package/dist/server/engine/aoss-sidecar.js +93 -0
  9. package/dist/server/engine/aoss-sidecar.js.map +1 -0
  10. package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
  11. package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
  12. package/dist/server/engine/backends/localstack-backend.js +199 -0
  13. package/dist/server/engine/backends/localstack-backend.js.map +1 -0
  14. package/dist/server/engine/backends/self-backend.d.ts +32 -0
  15. package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
  16. package/dist/server/engine/backends/self-backend.js +207 -0
  17. package/dist/server/engine/backends/self-backend.js.map +1 -0
  18. package/dist/server/engine/bus.d.ts +10 -0
  19. package/dist/server/engine/bus.d.ts.map +1 -0
  20. package/dist/server/engine/bus.js +24 -0
  21. package/dist/server/engine/bus.js.map +1 -0
  22. package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
  23. package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
  24. package/dist/server/engine/dispatch/dispatcher.js +312 -0
  25. package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
  26. package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
  27. package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
  28. package/dist/server/engine/dispatch/scheduler.js +328 -0
  29. package/dist/server/engine/dispatch/scheduler.js.map +1 -0
  30. package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
  31. package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
  32. package/dist/server/engine/dispatch/sqs-poller.js +242 -0
  33. package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
  34. package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
  35. package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
  36. package/dist/server/engine/dispatch/stream-tailer.js +205 -0
  37. package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
  38. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
  39. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
  40. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
  41. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
  42. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
  43. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
  44. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
  45. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
  46. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
  47. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
  48. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
  49. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
  50. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
  51. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
  52. package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
  53. package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
  54. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
  55. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
  56. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
  57. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
  58. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
  59. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
  60. package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
  61. package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
  62. package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
  63. package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
  64. package/dist/server/engine/emulators/dynamodb/index.js +572 -0
  65. package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
  66. package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
  67. package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
  68. package/dist/server/engine/emulators/dynamodb/query.js +237 -0
  69. package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
  70. package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
  71. package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
  72. package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
  73. package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
  74. package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
  75. package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
  76. package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
  77. package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
  78. package/dist/server/engine/emulators/events/index.d.ts +53 -0
  79. package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
  80. package/dist/server/engine/emulators/events/index.js +417 -0
  81. package/dist/server/engine/emulators/events/index.js.map +1 -0
  82. package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
  83. package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
  84. package/dist/server/engine/emulators/events/pattern.js +125 -0
  85. package/dist/server/engine/emulators/events/pattern.js.map +1 -0
  86. package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
  87. package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
  88. package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
  89. package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
  90. package/dist/server/engine/emulators/opensearch/index.d.ts +67 -0
  91. package/dist/server/engine/emulators/opensearch/index.d.ts.map +1 -0
  92. package/dist/server/engine/emulators/opensearch/index.js +811 -0
  93. package/dist/server/engine/emulators/opensearch/index.js.map +1 -0
  94. package/dist/server/engine/emulators/opensearch/search.d.ts +17 -0
  95. package/dist/server/engine/emulators/opensearch/search.d.ts.map +1 -0
  96. package/dist/server/engine/emulators/opensearch/search.js +434 -0
  97. package/dist/server/engine/emulators/opensearch/search.js.map +1 -0
  98. package/dist/server/engine/emulators/s3/index.d.ts +45 -0
  99. package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
  100. package/dist/server/engine/emulators/s3/index.js +591 -0
  101. package/dist/server/engine/emulators/s3/index.js.map +1 -0
  102. package/dist/server/engine/emulators/sns/index.d.ts +22 -0
  103. package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
  104. package/dist/server/engine/emulators/sns/index.js +135 -0
  105. package/dist/server/engine/emulators/sns/index.js.map +1 -0
  106. package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
  107. package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
  108. package/dist/server/engine/emulators/sqs/index.js +552 -0
  109. package/dist/server/engine/emulators/sqs/index.js.map +1 -0
  110. package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
  111. package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
  112. package/dist/server/engine/emulators/sqs/md5.js +36 -0
  113. package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
  114. package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
  115. package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
  116. package/dist/server/engine/emulators/sqs/queue.js +371 -0
  117. package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
  118. package/dist/server/engine/emulators/sts.d.ts +8 -0
  119. package/dist/server/engine/emulators/sts.d.ts.map +1 -0
  120. package/dist/server/engine/emulators/sts.js +23 -0
  121. package/dist/server/engine/emulators/sts.js.map +1 -0
  122. package/dist/server/engine/engine-backend.d.ts +17 -0
  123. package/dist/server/engine/engine-backend.d.ts.map +1 -0
  124. package/dist/server/engine/engine-backend.js +7 -0
  125. package/dist/server/engine/engine-backend.js.map +1 -0
  126. package/dist/server/engine/engine-manager.d.ts +22 -0
  127. package/dist/server/engine/engine-manager.d.ts.map +1 -0
  128. package/dist/server/engine/engine-manager.js +74 -0
  129. package/dist/server/engine/engine-manager.js.map +1 -0
  130. package/dist/server/engine/http/aws-chunked.d.ts +3 -0
  131. package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
  132. package/dist/server/engine/http/aws-chunked.js +50 -0
  133. package/dist/server/engine/http/aws-chunked.js.map +1 -0
  134. package/dist/server/engine/http/errors.d.ts +20 -0
  135. package/dist/server/engine/http/errors.d.ts.map +1 -0
  136. package/dist/server/engine/http/errors.js +43 -0
  137. package/dist/server/engine/http/errors.js.map +1 -0
  138. package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
  139. package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
  140. package/dist/server/engine/http/protocols/aws-json.js +42 -0
  141. package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
  142. package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
  143. package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
  144. package/dist/server/engine/http/protocols/query-xml.js +35 -0
  145. package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
  146. package/dist/server/engine/http/router.d.ts +8 -0
  147. package/dist/server/engine/http/router.d.ts.map +1 -0
  148. package/dist/server/engine/http/router.js +402 -0
  149. package/dist/server/engine/http/router.js.map +1 -0
  150. package/dist/server/engine/http/sigv4.d.ts +9 -0
  151. package/dist/server/engine/http/sigv4.d.ts.map +1 -0
  152. package/dist/server/engine/http/sigv4.js +33 -0
  153. package/dist/server/engine/http/sigv4.js.map +1 -0
  154. package/dist/server/engine/http/xml.d.ts +16 -0
  155. package/dist/server/engine/http/xml.d.ts.map +1 -0
  156. package/dist/server/engine/http/xml.js +92 -0
  157. package/dist/server/engine/http/xml.js.map +1 -0
  158. package/dist/server/engine/store/atomic.d.ts +4 -0
  159. package/dist/server/engine/store/atomic.d.ts.map +1 -0
  160. package/dist/server/engine/store/atomic.js +35 -0
  161. package/dist/server/engine/store/atomic.js.map +1 -0
  162. package/dist/server/engine/store/engine-store.d.ts +9 -0
  163. package/dist/server/engine/store/engine-store.d.ts.map +1 -0
  164. package/dist/server/engine/store/engine-store.js +218 -0
  165. package/dist/server/engine/store/engine-store.js.map +1 -0
  166. package/dist/server/engine/store/store-types.d.ts +37 -0
  167. package/dist/server/engine/store/store-types.d.ts.map +1 -0
  168. package/dist/server/engine/store/store-types.js +17 -0
  169. package/dist/server/engine/store/store-types.js.map +1 -0
  170. package/dist/server/engine/store/wal.d.ts +49 -0
  171. package/dist/server/engine/store/wal.d.ts.map +1 -0
  172. package/dist/server/engine/store/wal.js +328 -0
  173. package/dist/server/engine/store/wal.js.map +1 -0
  174. package/dist/server/engine/types.d.ts +137 -0
  175. package/dist/server/engine/types.d.ts.map +1 -0
  176. package/dist/server/engine/types.js +8 -0
  177. package/dist/server/engine/types.js.map +1 -0
  178. package/dist/server/index.js +43 -9
  179. package/dist/server/index.js.map +1 -1
  180. package/dist/server/routes/config.d.ts.map +1 -1
  181. package/dist/server/routes/config.js +16 -0
  182. package/dist/server/routes/config.js.map +1 -1
  183. package/dist/server/routes/opensearch.d.ts +3 -0
  184. package/dist/server/routes/opensearch.d.ts.map +1 -0
  185. package/dist/server/routes/opensearch.js +69 -0
  186. package/dist/server/routes/opensearch.js.map +1 -0
  187. package/dist/server/routes/resources.d.ts.map +1 -1
  188. package/dist/server/routes/resources.js +4 -1
  189. package/dist/server/routes/resources.js.map +1 -1
  190. package/dist/server/routes/services.d.ts.map +1 -1
  191. package/dist/server/routes/services.js +3 -0
  192. package/dist/server/routes/services.js.map +1 -1
  193. package/dist/server/services/cache-manager.d.ts +2 -1
  194. package/dist/server/services/cache-manager.d.ts.map +1 -1
  195. package/dist/server/services/cache-manager.js +22 -2
  196. package/dist/server/services/cache-manager.js.map +1 -1
  197. package/dist/server/services/cloudformation-parser.d.ts +35 -2
  198. package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
  199. package/dist/server/services/cloudformation-parser.js +88 -3
  200. package/dist/server/services/cloudformation-parser.js.map +1 -1
  201. package/dist/server/services/config-manager.d.ts +82 -0
  202. package/dist/server/services/config-manager.d.ts.map +1 -1
  203. package/dist/server/services/config-manager.js +151 -7
  204. package/dist/server/services/config-manager.js.map +1 -1
  205. package/dist/server/services/gateway-manager.d.ts +2 -0
  206. package/dist/server/services/gateway-manager.d.ts.map +1 -1
  207. package/dist/server/services/gateway-manager.js +44 -6
  208. package/dist/server/services/gateway-manager.js.map +1 -1
  209. package/dist/server/services/localstack-manager.d.ts +0 -7
  210. package/dist/server/services/localstack-manager.d.ts.map +1 -1
  211. package/dist/server/services/localstack-manager.js +11 -173
  212. package/dist/server/services/localstack-manager.js.map +1 -1
  213. package/dist/server/services/opensearch-explorer.d.ts +37 -0
  214. package/dist/server/services/opensearch-explorer.d.ts.map +1 -0
  215. package/dist/server/services/opensearch-explorer.js +124 -0
  216. package/dist/server/services/opensearch-explorer.js.map +1 -0
  217. package/dist/server/services/resource-provisioner.d.ts +13 -0
  218. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  219. package/dist/server/services/resource-provisioner.js +257 -11
  220. package/dist/server/services/resource-provisioner.js.map +1 -1
  221. package/dist/server/services/service-registrar.d.ts +1 -0
  222. package/dist/server/services/service-registrar.d.ts.map +1 -1
  223. package/dist/server/services/service-registrar.js +19 -4
  224. package/dist/server/services/service-registrar.js.map +1 -1
  225. package/dist/ui/assets/ApisPage-C0xaNFQW.js +1 -0
  226. package/dist/ui/assets/BucketDetailPage-Bnny8S04.js +1 -0
  227. package/dist/ui/assets/BucketsPage-Dd3Y4-gU.js +1 -0
  228. package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-JzSF-4VI.js} +1 -1
  229. package/dist/ui/assets/DynamoTablePage-uM0DXGCo.js +3 -0
  230. package/dist/ui/assets/LambdaDetailPage-CoR9ZXdb.js +4 -0
  231. package/dist/ui/assets/LambdasPage-CNMX_O5P.js +1 -0
  232. package/dist/ui/assets/OpenSearchCollectionPage-D5FaSCF1.js +1 -0
  233. package/dist/ui/assets/OpenSearchPage-FEzLxaej.js +1 -0
  234. package/dist/ui/assets/OverviewPage-0xvjT7Q0.js +1 -0
  235. package/dist/ui/assets/OverviewPage-qEl0a-0B.css +1 -0
  236. package/dist/ui/assets/QueueDetailPage-B2GaNLLe.js +1 -0
  237. package/dist/ui/assets/QueuesPage-Ch5kGwrp.js +1 -0
  238. package/dist/ui/assets/ServiceDetailPage-DKiz21oo.js +2 -0
  239. package/dist/ui/assets/ServicesPage-Cmi3UIfM.js +2 -0
  240. package/dist/ui/assets/index-DH7RTkRh.css +1 -0
  241. package/dist/ui/assets/index-MF9fVrsr.js +37 -0
  242. package/dist/ui/index.html +2 -2
  243. package/package.json +3 -1
  244. package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
  245. package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
  246. package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
  247. package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
  248. package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
  249. package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
  250. package/dist/ui/assets/OverviewPage-6jDXV1jr.css +0 -1
  251. package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
  252. package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
  253. package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
  254. package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
  255. package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
  256. package/dist/ui/assets/index-BWlB542w.js +0 -36
  257. package/dist/ui/assets/index-EYnsoJOq.css +0 -1
@@ -0,0 +1,552 @@
1
+ // SQS emulator: AWS JSON 1.0 (X-Amz-Target: AmazonSQS.<Operation>). Queue
2
+ // ATTRIBUTES persist in the engine store catalog `sqs/<region>/queues`;
3
+ // MESSAGES are memory-only (transient dev data — graceful shutdown snapshots
4
+ // them through serializeMessages()/restoreMessages(), wired by the backend).
5
+ //
6
+ // Fidelity ground truth is LSS's own SDK consumers: resource-provisioner
7
+ // branches on err.name 'QueueAlreadyExists' / substring 'NonExistentQueue',
8
+ // queue-inspector reads the live Approximate* counters and CreatedTimestamp.
9
+ import { AwsError, notImplemented } from '../../http/errors.js';
10
+ import { SqsQueue } from './queue.js';
11
+ import { md5OfMessageAttributes } from './md5.js';
12
+ // Read-time defaults for attributes the client did not set. Also the
13
+ // baseline for CreateQueue's idempotency comparison: an omitted attribute
14
+ // counts as its default, so re-creating with explicit defaults still matches.
15
+ const ATTRIBUTE_DEFAULTS = {
16
+ VisibilityTimeout: '30',
17
+ DelaySeconds: '0',
18
+ MessageRetentionPeriod: '345600',
19
+ ReceiveMessageWaitTimeSeconds: '0',
20
+ MaximumMessageSize: '262144',
21
+ FifoQueue: 'false',
22
+ ContentBasedDeduplication: 'false',
23
+ };
24
+ const VALID_QUEUE_NAME = /^[A-Za-z0-9_-]{1,80}$/;
25
+ export function queueNameFromArn(arn) {
26
+ return arn.slice(arn.lastIndexOf(':') + 1);
27
+ }
28
+ function sqsJsonError(code, modelName, message) {
29
+ return new AwsError(code, message, { typeName: `com.amazonaws.sqs#${modelName}` });
30
+ }
31
+ function nonExistentQueueError() {
32
+ // Legacy compat code (feeds the router's x-amzn-query-error header, which
33
+ // the SDK's awsQueryCompatible trait rewrites err.name from) + modern JSON
34
+ // __type. QueueInspector's not-found mapping keys on the legacy name.
35
+ return sqsJsonError('AWS.SimpleQueueService.NonExistentQueue', 'QueueDoesNotExist', 'The specified queue does not exist for this wsdl version.');
36
+ }
37
+ function invalidParameterError(message) {
38
+ return sqsJsonError('InvalidParameterValue', 'InvalidParameterValue', message);
39
+ }
40
+ function missingParameterError(name) {
41
+ return sqsJsonError('MissingParameter', 'MissingParameter', `The request must contain the parameter ${name}.`);
42
+ }
43
+ function receiptHandleInvalidError(receiptHandle) {
44
+ return sqsJsonError('ReceiptHandleIsInvalid', 'ReceiptHandleIsInvalid', `The input receipt handle "${receiptHandle}" is not a valid receipt handle.`);
45
+ }
46
+ function integerParam(value) {
47
+ return typeof value === 'number' && Number.isFinite(value) ? Math.trunc(value) : undefined;
48
+ }
49
+ // Batch envelope validation shared by SendMessageBatch/DeleteMessageBatch.
50
+ function checkBatchEntries(entries) {
51
+ if (!entries || entries.length === 0) {
52
+ throw sqsJsonError('AWS.SimpleQueueService.EmptyBatchRequest', 'EmptyBatchRequest', 'There should be at least one entry in the request.');
53
+ }
54
+ if (entries.length > 10) {
55
+ throw sqsJsonError('AWS.SimpleQueueService.TooManyEntriesInBatchRequest', 'TooManyEntriesInBatchRequest', `Maximum number of entries per request are 10. You have sent ${entries.length}.`);
56
+ }
57
+ const seen = new Set();
58
+ for (const entry of entries) {
59
+ const id = entry.Id ?? '';
60
+ if (seen.has(id)) {
61
+ throw sqsJsonError('AWS.SimpleQueueService.BatchEntryIdsNotDistinct', 'BatchEntryIdsNotDistinct', `Id ${id} repeated.`);
62
+ }
63
+ seen.add(id);
64
+ }
65
+ }
66
+ export class SqsEmulator {
67
+ service = 'sqs';
68
+ targetPrefix = 'AmazonSQS';
69
+ jsonVersion = '1.0';
70
+ ctx;
71
+ // Loaded catalogs by region; the sync dispatcher API only sees regions a
72
+ // wire call (or ensureRegionLoaded) already touched.
73
+ catalogs = new Map();
74
+ // Live message state by `${region}/${queueName}`.
75
+ runtimes = new Map();
76
+ constructor(ctx) {
77
+ this.ctx = ctx;
78
+ }
79
+ async handle(operation, input, req) {
80
+ const region = req.region;
81
+ const catalog = await this.catalogFor(region);
82
+ switch (operation) {
83
+ case 'CreateQueue':
84
+ return this.createQueue(region, catalog, input);
85
+ case 'GetQueueUrl':
86
+ return this.getQueueUrl(catalog, input);
87
+ case 'GetQueueAttributes':
88
+ return this.getQueueAttributes(region, catalog, input);
89
+ case 'SetQueueAttributes':
90
+ return this.setQueueAttributes(catalog, input);
91
+ case 'ListQueues':
92
+ return this.listQueues(catalog, input);
93
+ case 'DeleteQueue':
94
+ return this.deleteQueue(region, catalog, input);
95
+ case 'SendMessage':
96
+ return this.sendMessage(region, catalog, input);
97
+ case 'SendMessageBatch':
98
+ return this.sendMessageBatch(region, catalog, input);
99
+ case 'ReceiveMessage':
100
+ return this.receiveMessage(region, catalog, input);
101
+ case 'DeleteMessage':
102
+ return this.deleteMessage(region, catalog, input);
103
+ case 'DeleteMessageBatch':
104
+ return this.deleteMessageBatch(region, catalog, input);
105
+ case 'PurgeQueue':
106
+ return this.purgeQueue(region, catalog, input);
107
+ case 'ChangeMessageVisibility':
108
+ return this.changeMessageVisibility(region, catalog, input);
109
+ default:
110
+ throw notImplemented('sqs', operation);
111
+ }
112
+ }
113
+ // ------------------------------------------------------------------
114
+ // Dispatcher API (in-process event source mappings; sync by design)
115
+ // ------------------------------------------------------------------
116
+ queueExists(region, queueName) {
117
+ return this.catalogs.get(region)?.get(queueName) !== undefined;
118
+ }
119
+ hasVisibleMessages(region, queueName) {
120
+ const record = this.catalogs.get(region)?.get(queueName);
121
+ const runtime = this.runtimes.get(`${region}/${queueName}`);
122
+ if (!record || !runtime)
123
+ return false;
124
+ return runtime.hasDeliverable(this.attrMs(record, 'MessageRetentionPeriod'));
125
+ }
126
+ // Marks up to `max` messages in-flight with the queue's VisibilityTimeout
127
+ // and returns them shaped for the Lambda `Records` payload.
128
+ receiveForDelivery(region, queueName, max) {
129
+ const record = this.catalogs.get(region)?.get(queueName);
130
+ if (!record)
131
+ return [];
132
+ const runtime = this.runtimeFor(region, record);
133
+ const messages = runtime.receive({
134
+ max,
135
+ visibilityMs: this.attrMs(record, 'VisibilityTimeout'),
136
+ retentionMs: this.attrMs(record, 'MessageRetentionPeriod'),
137
+ });
138
+ return messages.map(message => ({
139
+ messageId: message.messageId,
140
+ // receive() always assigns a fresh handle to delivered messages.
141
+ receiptHandle: message.receiptHandle ?? '',
142
+ body: message.body,
143
+ attributes: this.systemAttributes(message, record.fifo),
144
+ messageAttributes: message.messageAttributes ?? {},
145
+ md5OfBody: message.md5OfBody,
146
+ md5OfMessageAttributes: message.md5OfMessageAttributes,
147
+ sentTimestamp: message.sentTimestamp,
148
+ approximateReceiveCount: message.receiveCount,
149
+ messageGroupId: message.messageGroupId,
150
+ sequenceNumber: message.sequenceNumber,
151
+ }));
152
+ }
153
+ deleteDelivered(region, queueName, receiptHandles) {
154
+ const runtime = this.runtimes.get(`${region}/${queueName}`);
155
+ if (!runtime)
156
+ return;
157
+ for (const handle of receiptHandles)
158
+ runtime.deleteMessage(handle);
159
+ }
160
+ // Boot wiring: load a region's queue catalog before the dispatcher's sync
161
+ // API touches it (rearming ESMs from persisted metadata).
162
+ async ensureRegionLoaded(region) {
163
+ await this.catalogFor(region);
164
+ }
165
+ // ------------------------------------------------------------------
166
+ // Graceful-shutdown snapshot (round-2 wiring in the self backend)
167
+ // ------------------------------------------------------------------
168
+ serializeMessages() {
169
+ const queues = [];
170
+ for (const [key, runtime] of this.runtimes) {
171
+ const region = key.slice(0, key.indexOf('/'));
172
+ queues.push({ region, queueName: runtime.name, state: runtime.serialize() });
173
+ }
174
+ return { queues };
175
+ }
176
+ restoreMessages(snapshot) {
177
+ for (const queue of snapshot.queues) {
178
+ const key = `${queue.region}/${queue.queueName}`;
179
+ let runtime = this.runtimes.get(key);
180
+ if (!runtime) {
181
+ runtime = this.newRuntime(queue.region, queue.queueName, queue.queueName.endsWith('.fifo'));
182
+ this.runtimes.set(key, runtime);
183
+ }
184
+ runtime.restore(queue.state);
185
+ }
186
+ }
187
+ // ------------------------------------------------------------------
188
+ // Operations
189
+ // ------------------------------------------------------------------
190
+ createQueue(region, catalog, input) {
191
+ const name = typeof input.QueueName === 'string' ? input.QueueName : '';
192
+ const requested = (input.Attributes ?? {});
193
+ const fifo = requested.FifoQueue === 'true';
194
+ const validName = fifo
195
+ ? name.endsWith('.fifo') && VALID_QUEUE_NAME.test(name.slice(0, -'.fifo'.length)) && name.length <= 80
196
+ : VALID_QUEUE_NAME.test(name);
197
+ if (!validName) {
198
+ throw invalidParameterError('Can only include alphanumeric characters, hyphens, or underscores. 1 to 80 in length');
199
+ }
200
+ const existing = catalog.get(name);
201
+ if (existing) {
202
+ const keys = new Set([...Object.keys(requested), ...Object.keys(existing.attributes)]);
203
+ for (const key of keys) {
204
+ const requestedValue = requested[key] ?? ATTRIBUTE_DEFAULTS[key];
205
+ const existingValue = existing.attributes[key] ?? ATTRIBUTE_DEFAULTS[key];
206
+ if (requestedValue !== existingValue) {
207
+ // Error-name duality: the JSON model calls this QueueNameExists
208
+ // (the __type we serialize), but SDKs with the awsQueryCompatible
209
+ // trait rewrite err.name from the x-amzn-query-error header the
210
+ // router builds out of `code` — and the provisioner catches the
211
+ // legacy name, so `code` must stay 'QueueAlreadyExists'.
212
+ throw new AwsError('QueueAlreadyExists', `A queue already exists with the same name and a different value for attribute ${key}`, { typeName: 'com.amazonaws.sqs#QueueNameExists' });
213
+ }
214
+ }
215
+ return { QueueUrl: this.queueUrl(existing.name) };
216
+ }
217
+ const nowSeconds = Math.floor(Date.now() / 1000);
218
+ const record = {
219
+ name,
220
+ fifo,
221
+ attributes: { ...requested },
222
+ createdTimestamp: nowSeconds,
223
+ lastModifiedTimestamp: nowSeconds,
224
+ };
225
+ catalog.set(name, record);
226
+ this.runtimeFor(region, record);
227
+ return { QueueUrl: this.queueUrl(name) };
228
+ }
229
+ getQueueUrl(catalog, input) {
230
+ const name = typeof input.QueueName === 'string' ? input.QueueName : '';
231
+ const record = catalog.get(name);
232
+ if (!record)
233
+ throw nonExistentQueueError();
234
+ return { QueueUrl: this.queueUrl(record.name) };
235
+ }
236
+ getQueueAttributes(region, catalog, input) {
237
+ const record = this.requireQueue(catalog, input);
238
+ const requested = (input.AttributeNames ?? []);
239
+ if (requested.length === 0)
240
+ return {};
241
+ const runtime = this.runtimeFor(region, record);
242
+ const counters = runtime.counters(this.attrMs(record, 'MessageRetentionPeriod'));
243
+ const all = {
244
+ // Stored attributes pass through first (RedrivePolicy and friends)…
245
+ ...record.attributes,
246
+ // …then read-time defaults for the standard set the client didn't set.
247
+ VisibilityTimeout: record.attributes.VisibilityTimeout ?? ATTRIBUTE_DEFAULTS.VisibilityTimeout,
248
+ DelaySeconds: record.attributes.DelaySeconds ?? ATTRIBUTE_DEFAULTS.DelaySeconds,
249
+ MessageRetentionPeriod: record.attributes.MessageRetentionPeriod ?? ATTRIBUTE_DEFAULTS.MessageRetentionPeriod,
250
+ ReceiveMessageWaitTimeSeconds: record.attributes.ReceiveMessageWaitTimeSeconds ?? ATTRIBUTE_DEFAULTS.ReceiveMessageWaitTimeSeconds,
251
+ MaximumMessageSize: record.attributes.MaximumMessageSize ?? ATTRIBUTE_DEFAULTS.MaximumMessageSize,
252
+ QueueArn: this.queueArn(region, record.name),
253
+ ApproximateNumberOfMessages: String(counters.available),
254
+ ApproximateNumberOfMessagesNotVisible: String(counters.inFlight),
255
+ ApproximateNumberOfMessagesDelayed: String(counters.delayed),
256
+ CreatedTimestamp: String(record.createdTimestamp),
257
+ LastModifiedTimestamp: String(record.lastModifiedTimestamp),
258
+ };
259
+ if (record.fifo) {
260
+ all.FifoQueue = 'true';
261
+ all.ContentBasedDeduplication =
262
+ record.attributes.ContentBasedDeduplication ?? ATTRIBUTE_DEFAULTS.ContentBasedDeduplication;
263
+ }
264
+ if (requested.includes('All'))
265
+ return { Attributes: all };
266
+ const picked = {};
267
+ for (const name of requested) {
268
+ if (all[name] !== undefined)
269
+ picked[name] = all[name];
270
+ }
271
+ return { Attributes: picked };
272
+ }
273
+ setQueueAttributes(catalog, input) {
274
+ const record = this.requireQueue(catalog, input);
275
+ const updates = (input.Attributes ?? {});
276
+ record.attributes = { ...record.attributes, ...updates };
277
+ record.lastModifiedTimestamp = Math.floor(Date.now() / 1000);
278
+ catalog.set(record.name, record);
279
+ return {};
280
+ }
281
+ listQueues(catalog, input) {
282
+ const prefix = typeof input.QueueNamePrefix === 'string' ? input.QueueNamePrefix : '';
283
+ const urls = catalog
284
+ .keys()
285
+ .filter(name => name.startsWith(prefix))
286
+ .sort()
287
+ .map(name => this.queueUrl(name));
288
+ return urls.length > 0 ? { QueueUrls: urls } : {};
289
+ }
290
+ deleteQueue(region, catalog, input) {
291
+ const record = this.requireQueue(catalog, input);
292
+ catalog.delete(record.name);
293
+ const key = `${region}/${record.name}`;
294
+ this.runtimes.get(key)?.dispose();
295
+ this.runtimes.delete(key);
296
+ return {};
297
+ }
298
+ sendMessage(region, catalog, input) {
299
+ const record = this.requireQueue(catalog, input);
300
+ const runtime = this.runtimeFor(region, record);
301
+ return this.sendOne(record, runtime, input);
302
+ }
303
+ sendMessageBatch(region, catalog, input) {
304
+ const record = this.requireQueue(catalog, input);
305
+ const runtime = this.runtimeFor(region, record);
306
+ const entries = input.Entries;
307
+ checkBatchEntries(entries);
308
+ const successful = [];
309
+ const failed = [];
310
+ for (const entry of entries) {
311
+ try {
312
+ successful.push({ Id: entry.Id, ...this.sendOne(record, runtime, entry) });
313
+ }
314
+ catch (error) {
315
+ if (!(error instanceof AwsError))
316
+ throw error;
317
+ failed.push({
318
+ Id: entry.Id ?? '',
319
+ SenderFault: error.fault !== 'Receiver',
320
+ Code: error.code,
321
+ Message: error.message,
322
+ });
323
+ }
324
+ }
325
+ return { Successful: successful, Failed: failed };
326
+ }
327
+ sendOne(record, runtime, input) {
328
+ if (typeof input.MessageBody !== 'string' || input.MessageBody.length === 0) {
329
+ throw missingParameterError('MessageBody');
330
+ }
331
+ const delaySeconds = integerParam(input.DelaySeconds);
332
+ if (delaySeconds !== undefined && record.fifo) {
333
+ throw invalidParameterError(`Value ${delaySeconds} for parameter DelaySeconds is invalid. Reason: The request include parameter that is not valid for this queue type.`);
334
+ }
335
+ if (delaySeconds !== undefined && (delaySeconds < 0 || delaySeconds > 900)) {
336
+ throw invalidParameterError(`Value ${delaySeconds} for parameter DelaySeconds is invalid. Reason: DelaySeconds must be >= 0 and <= 900.`);
337
+ }
338
+ if (record.fifo && !input.MessageGroupId) {
339
+ throw missingParameterError('MessageGroupId');
340
+ }
341
+ if (record.fifo &&
342
+ !input.MessageDeduplicationId &&
343
+ (record.attributes.ContentBasedDeduplication ?? 'false') !== 'true') {
344
+ throw invalidParameterError('The queue should either have ContentBasedDeduplication enabled or MessageDeduplicationId provided explicitly');
345
+ }
346
+ const outcome = runtime.send({
347
+ body: input.MessageBody,
348
+ delayMs: (delaySeconds ?? this.attrInt(record, 'DelaySeconds')) * 1000,
349
+ messageAttributes: input.MessageAttributes,
350
+ messageGroupId: input.MessageGroupId,
351
+ messageDeduplicationId: input.MessageDeduplicationId,
352
+ contentBasedDeduplication: record.attributes.ContentBasedDeduplication === 'true',
353
+ });
354
+ const result = {
355
+ MessageId: outcome.messageId,
356
+ MD5OfMessageBody: outcome.md5OfBody,
357
+ };
358
+ if (outcome.md5OfMessageAttributes)
359
+ result.MD5OfMessageAttributes = outcome.md5OfMessageAttributes;
360
+ if (outcome.sequenceNumber)
361
+ result.SequenceNumber = outcome.sequenceNumber;
362
+ return result;
363
+ }
364
+ async receiveMessage(region, catalog, input) {
365
+ const record = this.requireQueue(catalog, input);
366
+ const max = integerParam(input.MaxNumberOfMessages) ?? 1;
367
+ if (max < 1 || max > 10) {
368
+ throw sqsJsonError('ReadCountOutOfRange', 'ReadCountOutOfRange', `Value ${max} for parameter MaxNumberOfMessages is invalid. Reason: Must be between 1 and 10, if provided.`);
369
+ }
370
+ const visibilitySeconds = integerParam(input.VisibilityTimeout);
371
+ if (visibilitySeconds !== undefined && (visibilitySeconds < 0 || visibilitySeconds > 43200)) {
372
+ throw invalidParameterError(`Value ${visibilitySeconds} for parameter VisibilityTimeout is invalid. Reason: Must be >= 0 and <= 43200, if provided.`);
373
+ }
374
+ const visibilityMs = (visibilitySeconds ?? this.attrInt(record, 'VisibilityTimeout')) * 1000;
375
+ const retentionMs = this.attrMs(record, 'MessageRetentionPeriod');
376
+ const waitSeconds = integerParam(input.WaitTimeSeconds) ?? this.attrInt(record, 'ReceiveMessageWaitTimeSeconds');
377
+ const deadline = Date.now() + Math.min(Math.max(waitSeconds, 0), 20) * 1000;
378
+ // Modern SDKs send MessageSystemAttributeNames; older ones AttributeNames.
379
+ const systemNames = [
380
+ ...(input.AttributeNames ?? []),
381
+ ...(input.MessageSystemAttributeNames ?? []),
382
+ ];
383
+ const attributeNames = input.MessageAttributeNames ?? [];
384
+ const key = `${region}/${record.name}`;
385
+ for (;;) {
386
+ // Re-fetched every lap: the queue may be deleted while we are parked
387
+ // (dispose() wakes us) — treat that as an empty receive.
388
+ const runtime = this.runtimes.get(key);
389
+ if (!runtime)
390
+ return {};
391
+ const messages = runtime.receive({ max, visibilityMs, retentionMs });
392
+ if (messages.length > 0) {
393
+ return {
394
+ Messages: messages.map(message => this.shapeMessage(message, record.fifo, systemNames, attributeNames)),
395
+ };
396
+ }
397
+ const remaining = deadline - Date.now();
398
+ if (remaining <= 0)
399
+ return {};
400
+ // Long poll: park until a message becomes visible or the wait elapses.
401
+ await runtime.waitForVisible(remaining);
402
+ }
403
+ }
404
+ deleteMessage(region, catalog, input) {
405
+ const record = this.requireQueue(catalog, input);
406
+ const handle = typeof input.ReceiptHandle === 'string' ? input.ReceiptHandle : '';
407
+ const result = this.runtimeFor(region, record).deleteMessage(handle);
408
+ if (result === 'invalid')
409
+ throw receiptHandleInvalidError(handle);
410
+ return {};
411
+ }
412
+ deleteMessageBatch(region, catalog, input) {
413
+ const record = this.requireQueue(catalog, input);
414
+ const runtime = this.runtimeFor(region, record);
415
+ const entries = input.Entries;
416
+ checkBatchEntries(entries);
417
+ const successful = [];
418
+ const failed = [];
419
+ for (const entry of entries) {
420
+ const handle = entry.ReceiptHandle ?? '';
421
+ if (runtime.deleteMessage(handle) === 'invalid') {
422
+ failed.push({
423
+ Id: entry.Id ?? '',
424
+ SenderFault: true,
425
+ Code: 'ReceiptHandleIsInvalid',
426
+ Message: `The input receipt handle "${handle}" is not a valid receipt handle.`,
427
+ });
428
+ }
429
+ else {
430
+ successful.push({ Id: entry.Id ?? '' });
431
+ }
432
+ }
433
+ return { Successful: successful, Failed: failed };
434
+ }
435
+ purgeQueue(region, catalog, input) {
436
+ const record = this.requireQueue(catalog, input);
437
+ this.runtimeFor(region, record).purge();
438
+ return {};
439
+ }
440
+ changeMessageVisibility(region, catalog, input) {
441
+ const record = this.requireQueue(catalog, input);
442
+ const handle = typeof input.ReceiptHandle === 'string' ? input.ReceiptHandle : '';
443
+ const visibilitySeconds = integerParam(input.VisibilityTimeout);
444
+ if (visibilitySeconds === undefined || visibilitySeconds < 0 || visibilitySeconds > 43200) {
445
+ throw invalidParameterError(`Value ${input.VisibilityTimeout} for parameter VisibilityTimeout is invalid. Reason: Must be >= 0 and <= 43200, if provided.`);
446
+ }
447
+ const result = this.runtimeFor(region, record).changeVisibility(handle, visibilitySeconds * 1000);
448
+ if (result === 'invalid')
449
+ throw receiptHandleInvalidError(handle);
450
+ if (result === 'not-inflight') {
451
+ throw sqsJsonError('AWS.SimpleQueueService.MessageNotInflight', 'MessageNotInflight', 'The message referred to is not in flight.');
452
+ }
453
+ return {};
454
+ }
455
+ // ------------------------------------------------------------------
456
+ // Helpers
457
+ // ------------------------------------------------------------------
458
+ async catalogFor(region) {
459
+ const existing = this.catalogs.get(region);
460
+ if (existing)
461
+ return existing;
462
+ const catalog = this.ctx.store.catalog(`sqs/${region}/queues`);
463
+ await catalog.load();
464
+ this.catalogs.set(region, catalog);
465
+ return catalog;
466
+ }
467
+ runtimeFor(region, record) {
468
+ const key = `${region}/${record.name}`;
469
+ let runtime = this.runtimes.get(key);
470
+ if (!runtime) {
471
+ runtime = this.newRuntime(region, record.name, record.fifo);
472
+ this.runtimes.set(key, runtime);
473
+ }
474
+ return runtime;
475
+ }
476
+ newRuntime(region, queueName, fifo) {
477
+ return new SqsQueue(queueName, {
478
+ fifo,
479
+ onVisible: () => this.ctx.bus.emit('sqs:message-visible', { region, queueName }),
480
+ });
481
+ }
482
+ // Resolve `input.QueueUrl` (last path segment is the queue name) to its
483
+ // catalog record or fail like AWS does for unknown queues.
484
+ requireQueue(catalog, input) {
485
+ const url = typeof input.QueueUrl === 'string' ? input.QueueUrl : '';
486
+ if (!url)
487
+ throw missingParameterError('QueueUrl');
488
+ const name = url.replace(/\/+$/, '').split('/').pop() ?? '';
489
+ const record = catalog.get(name);
490
+ if (!record)
491
+ throw nonExistentQueueError();
492
+ return record;
493
+ }
494
+ queueUrl(queueName) {
495
+ return `${this.ctx.endpoint()}/${this.ctx.config.account}/${queueName}`;
496
+ }
497
+ queueArn(region, queueName) {
498
+ return `arn:aws:sqs:${region}:${this.ctx.config.account}:${queueName}`;
499
+ }
500
+ attrInt(record, name) {
501
+ return parseInt(record.attributes[name] ?? ATTRIBUTE_DEFAULTS[name] ?? '0', 10);
502
+ }
503
+ attrMs(record, name) {
504
+ return this.attrInt(record, name) * 1000;
505
+ }
506
+ systemAttributes(message, fifo) {
507
+ const attributes = {
508
+ SenderId: this.ctx.config.account,
509
+ SentTimestamp: String(message.sentTimestamp),
510
+ ApproximateReceiveCount: String(message.receiveCount),
511
+ ApproximateFirstReceiveTimestamp: String(message.firstReceiveTimestamp ?? message.sentTimestamp),
512
+ };
513
+ if (fifo) {
514
+ if (message.messageGroupId)
515
+ attributes.MessageGroupId = message.messageGroupId;
516
+ if (message.messageDeduplicationId) {
517
+ attributes.MessageDeduplicationId = message.messageDeduplicationId;
518
+ }
519
+ if (message.sequenceNumber)
520
+ attributes.SequenceNumber = message.sequenceNumber;
521
+ }
522
+ return attributes;
523
+ }
524
+ shapeMessage(message, fifo, systemNames, attributeNames) {
525
+ const wire = {
526
+ MessageId: message.messageId,
527
+ ReceiptHandle: message.receiptHandle,
528
+ MD5OfBody: message.md5OfBody,
529
+ Body: message.body,
530
+ };
531
+ if (systemNames.length > 0) {
532
+ const all = this.systemAttributes(message, fifo);
533
+ const picked = systemNames.includes('All')
534
+ ? all
535
+ : Object.fromEntries(Object.entries(all).filter(([name]) => systemNames.includes(name)));
536
+ if (Object.keys(picked).length > 0)
537
+ wire.Attributes = picked;
538
+ }
539
+ if (message.messageAttributes && attributeNames.length > 0) {
540
+ const wantAll = attributeNames.includes('All') || attributeNames.includes('.*');
541
+ const picked = Object.fromEntries(Object.entries(message.messageAttributes).filter(([name]) => wantAll ||
542
+ attributeNames.some(pattern => pattern.endsWith('.*') ? name.startsWith(pattern.slice(0, -2)) : name === pattern)));
543
+ if (Object.keys(picked).length > 0) {
544
+ wire.MessageAttributes = picked;
545
+ // AWS digests exactly the returned (filtered) attribute set.
546
+ wire.MD5OfMessageAttributes = md5OfMessageAttributes(picked);
547
+ }
548
+ }
549
+ return wire;
550
+ }
551
+ }
552
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/sqs/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAC7E,6EAA6E;AAC7E,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAE7E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQhE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAiDlD,qEAAqE;AACrE,0EAA0E;AAC1E,8EAA8E;AAC9E,MAAM,kBAAkB,GAA2B;IACjD,iBAAiB,EAAE,IAAI;IACvB,YAAY,EAAE,GAAG;IACjB,sBAAsB,EAAE,QAAQ;IAChC,6BAA6B,EAAE,GAAG;IAClC,kBAAkB,EAAE,QAAQ;IAC5B,SAAS,EAAE,OAAO;IAClB,yBAAyB,EAAE,OAAO;CACnC,CAAC;AAEF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAe;IACpE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,qBAAqB,SAAS,EAAE,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,qBAAqB;IAC5B,0EAA0E;IAC1E,2EAA2E;IAC3E,sEAAsE;IACtE,OAAO,YAAY,CACjB,yCAAyC,EACzC,mBAAmB,EACnB,2DAA2D,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO,YAAY,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,0CAA0C,IAAI,GAAG,CAAC,CAAC;AACjH,CAAC;AAED,SAAS,yBAAyB,CAAC,aAAqB;IACtD,OAAO,YAAY,CACjB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,aAAa,kCAAkC,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,2EAA2E;AAC3E,SAAS,iBAAiB,CAAC,OAA2C;IACpE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,YAAY,CAChB,0CAA0C,EAC1C,mBAAmB,EACnB,oDAAoD,CACrD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACxB,MAAM,YAAY,CAChB,qDAAqD,EACrD,8BAA8B,EAC9B,+DAA+D,OAAO,CAAC,MAAM,GAAG,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACjB,MAAM,YAAY,CAChB,iDAAiD,EACjD,0BAA0B,EAC1B,MAAM,EAAE,YAAY,CACrB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,OAAO,WAAW;IACb,OAAO,GAAsB,KAAK,CAAC;IACnC,YAAY,GAAG,WAAW,CAAC;IAC3B,WAAW,GAAG,KAAc,CAAC;IAErB,GAAG,CAAgB;IACpC,yEAAyE;IACzE,qDAAqD;IACpC,QAAQ,GAAG,IAAI,GAAG,EAAqC,CAAC;IACzE,kDAAkD;IACjC,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAExD,YAAY,GAAkB;QAC5B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,KAA8B,EAAE,GAAe;QAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAClD,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,oBAAoB;gBACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,oBAAoB;gBACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACjD,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACzC,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAClD,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAClD,KAAK,kBAAkB;gBACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACvD,KAAK,gBAAgB;gBACnB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACrD,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,KAAK,oBAAoB;gBACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACjD,KAAK,yBAAyB;gBAC5B,OAAO,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9D;gBACE,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,oEAAoE;IACpE,qEAAqE;IAErE,WAAW,CAAC,MAAc,EAAE,SAAiB;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;IACjE,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,SAAiB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,0EAA0E;IAC1E,4DAA4D;IAC5D,kBAAkB,CAAC,MAAc,EAAE,SAAiB,EAAE,GAAW;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAC/B,GAAG;YACH,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;YACtD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC;SAC3D,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,iEAAiE;YACjE,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;YAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;YACvD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,EAAE;YAClD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;YACtD,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,uBAAuB,EAAE,OAAO,CAAC,YAAY;YAC7C,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,SAAiB,EAAE,cAAwB;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,KAAK,MAAM,MAAM,IAAI,cAAc;YAAE,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,0EAA0E;IAC1E,0DAA0D;IAC1D,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACrC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,qEAAqE;IACrE,kEAAkE;IAClE,qEAAqE;IAErE,iBAAiB;QACf,MAAM,MAAM,GAAkC,EAAE,CAAC;QACjD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,eAAe,CAAC,QAA6B;QAC3C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACjD,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,aAAa;IACb,qEAAqE;IAE7D,WAAW,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QACpG,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAA2B,CAAC;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,KAAK,MAAM,CAAC;QAE5C,MAAM,SAAS,GAAG,IAAI;YACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;YACtG,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,qBAAqB,CACzB,sFAAsF,CACvF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC1E,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;oBACrC,gEAAgE;oBAChE,kEAAkE;oBAClE,gEAAgE;oBAChE,gEAAgE;oBAChE,yDAAyD;oBACzD,MAAM,IAAI,QAAQ,CAChB,oBAAoB,EACpB,iFAAiF,GAAG,EAAE,EACtF,EAAE,QAAQ,EAAE,mCAAmC,EAAE,CAClD,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,GAAgB;YAC1B,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,EAAE,GAAG,SAAS,EAAE;YAC5B,gBAAgB,EAAE,UAAU;YAC5B,qBAAqB,EAAE,UAAU;SAClC,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3C,CAAC;IAEO,WAAW,CAAC,OAAkC,EAAE,KAA8B;QACpF,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,MAAM,qBAAqB,EAAE,CAAC;QAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAClD,CAAC;IAEO,kBAAkB,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAa,CAAC;QAC3D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;QACjF,MAAM,GAAG,GAA2B;YAClC,oEAAoE;YACpE,GAAG,MAAM,CAAC,UAAU;YACpB,uEAAuE;YACvE,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,iBAAiB,IAAI,kBAAkB,CAAC,iBAAiB;YAC9F,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,IAAI,kBAAkB,CAAC,YAAY;YAC/E,sBAAsB,EACpB,MAAM,CAAC,UAAU,CAAC,sBAAsB,IAAI,kBAAkB,CAAC,sBAAsB;YACvF,6BAA6B,EAC3B,MAAM,CAAC,UAAU,CAAC,6BAA6B,IAAI,kBAAkB,CAAC,6BAA6B;YACrG,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,kBAAkB;YACjG,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;YAC5C,2BAA2B,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvD,qCAAqC,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAChE,kCAAkC,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5D,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACjD,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;SAC5D,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;YACvB,GAAG,CAAC,yBAAyB;gBAC3B,MAAM,CAAC,UAAU,CAAC,yBAAyB,IAAI,kBAAkB,CAAC,yBAAyB,CAAC;QAChG,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QAC1D,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAChC,CAAC;IAEO,kBAAkB,CAAC,OAAkC,EAAE,KAA8B;QAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAA2B,CAAC;QACnE,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;QACzD,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,UAAU,CAAC,OAAkC,EAAE,KAA8B;QACnF,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO;aACjB,IAAI,EAAE;aACN,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACvC,IAAI,EAAE;aACN,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QACpG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QACpG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAA6B,CAAC,CAAC;IACtE,CAAC;IAEO,gBAAgB,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QACzG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAoE,CAAC;QAC3F,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,UAAU,GAAmC,EAAE,CAAC;QACtD,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;oBAClB,WAAW,EAAE,KAAK,CAAC,KAAK,KAAK,UAAU;oBACvC,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;IAEO,OAAO,CAAC,MAAmB,EAAE,OAAiB,EAAE,KAA2B;QACjF,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5E,MAAM,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,qBAAqB,CACzB,SAAS,YAAY,sHAAsH,CAC5I,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,qBAAqB,CACzB,SAAS,YAAY,uFAAuF,CAC7G,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YACzC,MAAM,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;QACD,IACE,MAAM,CAAC,IAAI;YACX,CAAC,KAAK,CAAC,sBAAsB;YAC7B,CAAC,MAAM,CAAC,UAAU,CAAC,yBAAyB,IAAI,OAAO,CAAC,KAAK,MAAM,EACnE,CAAC;YACD,MAAM,qBAAqB,CACzB,8GAA8G,CAC/G,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAuB,OAAO,CAAC,IAAI,CAAC;YAC/C,IAAI,EAAE,KAAK,CAAC,WAAW;YACvB,OAAO,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,IAAI;YACtE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;YACpD,yBAAyB,EAAE,MAAM,CAAC,UAAU,CAAC,yBAAyB,KAAK,MAAM;SAClF,CAAC,CAAC;QAEH,MAAM,MAAM,GAA4B;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,OAAO,CAAC,SAAS;SACpC,CAAC;QACF,IAAI,OAAO,CAAC,sBAAsB;YAAE,MAAM,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QACnG,IAAI,OAAO,CAAC,cAAc;YAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,MAAc,EACd,OAAkC,EAClC,KAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;YACxB,MAAM,YAAY,CAChB,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,GAAG,+FAA+F,CAC5G,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,iBAAiB,KAAK,SAAS,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,iBAAiB,GAAG,KAAK,CAAC,EAAE,CAAC;YAC5F,MAAM,qBAAqB,CACzB,SAAS,iBAAiB,8FAA8F,CACzH,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC;QAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;QAClE,MAAM,WAAW,GACf,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAE5E,2EAA2E;QAC3E,MAAM,WAAW,GAAG;YAClB,GAAG,CAAE,KAAK,CAAC,cAAuC,IAAI,EAAE,CAAC;YACzD,GAAG,CAAE,KAAK,CAAC,2BAAoD,IAAI,EAAE,CAAC;SACvE,CAAC;QACF,MAAM,cAAc,GAAI,KAAK,CAAC,qBAA8C,IAAI,EAAE,CAAC;QAEnF,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,SAAS,CAAC;YACR,qEAAqE;YACrE,yDAAyD;YACzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YACrE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAC/B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,CACrE;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC9B,uEAAuE;YACvE,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QACtG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,kBAAkB,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAqE,CAAC;QAC5F,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;oBAClB,WAAW,EAAE,IAAI;oBACjB,IAAI,EAAE,wBAAwB;oBAC9B,OAAO,EAAE,6BAA6B,MAAM,kCAAkC;iBAC/E,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,OAAkC,EAAE,KAA8B;QACnG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,uBAAuB,CAC7B,MAAc,EACd,OAAkC,EAClC,KAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,GAAG,CAAC,IAAI,iBAAiB,GAAG,KAAK,EAAE,CAAC;YAC1F,MAAM,qBAAqB,CACzB,SAAS,KAAK,CAAC,iBAAiB,8FAA8F,CAC/H,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAClG,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;YAC9B,MAAM,YAAY,CAChB,2CAA2C,EAC3C,oBAAoB,EACpB,2CAA2C,CAC5C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,qEAAqE;IACrE,UAAU;IACV,qEAAqE;IAE7D,KAAK,CAAC,UAAU,CAAC,MAAc;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAc,OAAO,MAAM,SAAS,CAAC,CAAC;QAC5E,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,MAAmB;QACpD,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,SAAiB,EAAE,IAAa;QACjE,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE;YAC7B,IAAI;YACJ,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;SACjF,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,2DAA2D;IACnD,YAAY,CAAC,OAAkC,EAAE,KAA8B;QACrF,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,MAAM,qBAAqB,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,SAAiB;QAChC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;IAC1E,CAAC;IAEO,QAAQ,CAAC,MAAc,EAAE,SAAiB;QAChD,OAAO,eAAe,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;IACzE,CAAC;IAEO,OAAO,CAAC,MAAmB,EAAE,IAAY;QAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAEO,MAAM,CAAC,MAAmB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,CAAC;IAEO,gBAAgB,CAAC,OAAsB,EAAE,IAAa;QAC5D,MAAM,UAAU,GAA2B;YACzC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO;YACjC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;YAC5C,uBAAuB,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YACrD,gCAAgC,EAAE,MAAM,CAAC,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;SACjG,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,OAAO,CAAC,cAAc;gBAAE,UAAU,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAC/E,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;gBACnC,UAAU,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;YACrE,CAAC;YACD,IAAI,OAAO,CAAC,cAAc;gBAAE,UAAU,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QACjF,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,YAAY,CAClB,OAAsB,EACtB,IAAa,EACb,WAAqB,EACrB,cAAwB;QAExB,MAAM,IAAI,GAA4B;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;QAEF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3F,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QAC/D,CAAC;QAED,IAAI,OAAO,CAAC,iBAAiB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAC9C,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CACT,OAAO;gBACP,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAClF,CACJ,CACF,CAAC;YACF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;gBAChC,6DAA6D;gBAC7D,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export interface SqsMessageAttributeValue {
2
+ DataType: string;
3
+ StringValue?: string;
4
+ BinaryValue?: string;
5
+ }
6
+ export declare function md5OfMessageBody(body: string): string;
7
+ export declare function md5OfMessageAttributes(attributes: Record<string, SqsMessageAttributeValue>): string;
8
+ //# sourceMappingURL=md5.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md5.d.ts","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/sqs/md5.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAQD,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GACnD,MAAM,CAgBR"}
@@ -0,0 +1,36 @@
1
+ // SQS response digests. SDKs (JS v2, botocore) validate MD5OfMessageBody and
2
+ // MD5OfMessageAttributes client-side and throw on mismatch, so these must
3
+ // match AWS byte-for-byte. Attribute digest algorithm per the SQS developer
4
+ // guide ("Calculating the MD5 message digest for message attributes"):
5
+ // attributes sorted by name, each encoded as
6
+ // len(name) + name + len(dataType) + dataType + transportByte + len(value) + value
7
+ // with 4-byte big-endian lengths and transport byte 1 for String/Number
8
+ // values, 2 for Binary values.
9
+ import crypto from 'crypto';
10
+ export function md5OfMessageBody(body) {
11
+ return crypto.createHash('md5').update(body, 'utf8').digest('hex');
12
+ }
13
+ function lengthPrefixed(value) {
14
+ const length = Buffer.alloc(4);
15
+ length.writeUInt32BE(value.length, 0);
16
+ return [length, value];
17
+ }
18
+ export function md5OfMessageAttributes(attributes) {
19
+ const parts = [];
20
+ for (const name of Object.keys(attributes).sort()) {
21
+ const attribute = attributes[name];
22
+ const dataType = attribute.DataType || 'String';
23
+ parts.push(...lengthPrefixed(Buffer.from(name, 'utf8')));
24
+ parts.push(...lengthPrefixed(Buffer.from(dataType, 'utf8')));
25
+ if (dataType.startsWith('Binary')) {
26
+ parts.push(Buffer.from([2]));
27
+ parts.push(...lengthPrefixed(Buffer.from(attribute.BinaryValue ?? '', 'base64')));
28
+ }
29
+ else {
30
+ parts.push(Buffer.from([1]));
31
+ parts.push(...lengthPrefixed(Buffer.from(attribute.StringValue ?? '', 'utf8')));
32
+ }
33
+ }
34
+ return crypto.createHash('md5').update(Buffer.concat(parts)).digest('hex');
35
+ }
36
+ //# sourceMappingURL=md5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md5.js","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/sqs/md5.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,6CAA6C;AAC7C,qFAAqF;AACrF,wEAAwE;AACxE,+BAA+B;AAE/B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAW5B,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,UAAoD;IAEpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC"}