@reorderjs/reorder 1.0.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 (231) hide show
  1. package/.medusa/server/scripts/reset-reorder-plugin-data.js +175 -0
  2. package/.medusa/server/src/admin/index.js +17889 -0
  3. package/.medusa/server/src/admin/index.mjs +17871 -0
  4. package/.medusa/server/src/admin/types/activity-log.js +10 -0
  5. package/.medusa/server/src/admin/types/analytics.js +17 -0
  6. package/.medusa/server/src/admin/types/cancellation.js +27 -0
  7. package/.medusa/server/src/admin/types/dunning.js +19 -0
  8. package/.medusa/server/src/admin/types/plan-offer.js +25 -0
  9. package/.medusa/server/src/admin/types/renewal.js +23 -0
  10. package/.medusa/server/src/admin/types/subscription.js +22 -0
  11. package/.medusa/server/src/api/admin/cancellations/[id]/apply-offer/route.js +30 -0
  12. package/.medusa/server/src/api/admin/cancellations/[id]/finalize/route.js +31 -0
  13. package/.medusa/server/src/api/admin/cancellations/[id]/reason/route.js +31 -0
  14. package/.medusa/server/src/api/admin/cancellations/[id]/route.js +20 -0
  15. package/.medusa/server/src/api/admin/cancellations/middlewares.js +55 -0
  16. package/.medusa/server/src/api/admin/cancellations/route.js +20 -0
  17. package/.medusa/server/src/api/admin/cancellations/utils.js +116 -0
  18. package/.medusa/server/src/api/admin/cancellations/validators.js +130 -0
  19. package/.medusa/server/src/api/admin/dunning/[id]/mark-recovered/route.js +27 -0
  20. package/.medusa/server/src/api/admin/dunning/[id]/mark-unrecovered/route.js +27 -0
  21. package/.medusa/server/src/api/admin/dunning/[id]/retry-now/route.js +28 -0
  22. package/.medusa/server/src/api/admin/dunning/[id]/retry-schedule/route.js +29 -0
  23. package/.medusa/server/src/api/admin/dunning/[id]/route.js +20 -0
  24. package/.medusa/server/src/api/admin/dunning/middlewares.js +60 -0
  25. package/.medusa/server/src/api/admin/dunning/route.js +20 -0
  26. package/.medusa/server/src/api/admin/dunning/utils.js +70 -0
  27. package/.medusa/server/src/api/admin/dunning/validators.js +81 -0
  28. package/.medusa/server/src/api/admin/orders/[id]/subscription-summary/route.js +10 -0
  29. package/.medusa/server/src/api/admin/orders/utils.js +8 -0
  30. package/.medusa/server/src/api/admin/plugin/route.js +7 -0
  31. package/.medusa/server/src/api/admin/renewals/[id]/approve-changes/route.js +27 -0
  32. package/.medusa/server/src/api/admin/renewals/[id]/force/route.js +30 -0
  33. package/.medusa/server/src/api/admin/renewals/[id]/reject-changes/route.js +27 -0
  34. package/.medusa/server/src/api/admin/renewals/[id]/route.js +10 -0
  35. package/.medusa/server/src/api/admin/renewals/middlewares.js +61 -0
  36. package/.medusa/server/src/api/admin/renewals/route.js +10 -0
  37. package/.medusa/server/src/api/admin/renewals/utils.js +60 -0
  38. package/.medusa/server/src/api/admin/renewals/validators.js +62 -0
  39. package/.medusa/server/src/api/admin/subscription-analytics/export/route.js +20 -0
  40. package/.medusa/server/src/api/admin/subscription-analytics/kpis/route.js +20 -0
  41. package/.medusa/server/src/api/admin/subscription-analytics/middlewares.js +45 -0
  42. package/.medusa/server/src/api/admin/subscription-analytics/rebuild/route.js +75 -0
  43. package/.medusa/server/src/api/admin/subscription-analytics/trends/route.js +20 -0
  44. package/.medusa/server/src/api/admin/subscription-analytics/utils.js +81 -0
  45. package/.medusa/server/src/api/admin/subscription-analytics/validators.js +76 -0
  46. package/.medusa/server/src/api/admin/subscription-logs/[id]/route.js +20 -0
  47. package/.medusa/server/src/api/admin/subscription-logs/middlewares.js +66 -0
  48. package/.medusa/server/src/api/admin/subscription-logs/route.js +20 -0
  49. package/.medusa/server/src/api/admin/subscription-logs/utils.js +84 -0
  50. package/.medusa/server/src/api/admin/subscription-logs/validators.js +32 -0
  51. package/.medusa/server/src/api/admin/subscription-offers/[id]/route.js +22 -0
  52. package/.medusa/server/src/api/admin/subscription-offers/[id]/toggle/route.js +17 -0
  53. package/.medusa/server/src/api/admin/subscription-offers/middlewares.js +58 -0
  54. package/.medusa/server/src/api/admin/subscription-offers/route.js +20 -0
  55. package/.medusa/server/src/api/admin/subscription-offers/utils.js +41 -0
  56. package/.medusa/server/src/api/admin/subscription-offers/validators.js +112 -0
  57. package/.medusa/server/src/api/admin/subscription-settings/middlewares.js +15 -0
  58. package/.medusa/server/src/api/admin/subscription-settings/route.js +33 -0
  59. package/.medusa/server/src/api/admin/subscription-settings/utils.js +109 -0
  60. package/.medusa/server/src/api/admin/subscription-settings/validators.js +74 -0
  61. package/.medusa/server/src/api/admin/subscriptions/[id]/cancel/route.js +18 -0
  62. package/.medusa/server/src/api/admin/subscriptions/[id]/logs/route.js +20 -0
  63. package/.medusa/server/src/api/admin/subscriptions/[id]/pause/route.js +18 -0
  64. package/.medusa/server/src/api/admin/subscriptions/[id]/resume/route.js +18 -0
  65. package/.medusa/server/src/api/admin/subscriptions/[id]/route.js +10 -0
  66. package/.medusa/server/src/api/admin/subscriptions/[id]/schedule-plan-change/route.js +26 -0
  67. package/.medusa/server/src/api/admin/subscriptions/[id]/update-shipping-address/route.js +27 -0
  68. package/.medusa/server/src/api/admin/subscriptions/middlewares.js +79 -0
  69. package/.medusa/server/src/api/admin/subscriptions/route.js +10 -0
  70. package/.medusa/server/src/api/admin/subscriptions/utils.js +42 -0
  71. package/.medusa/server/src/api/admin/subscriptions/validators.js +76 -0
  72. package/.medusa/server/src/api/middlewares.js +32 -0
  73. package/.medusa/server/src/api/store/carts/[id]/subscribe/route.js +18 -0
  74. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/cancellation/route.js +37 -0
  75. package/.medusa/server/src/api/store/customers/me/subscriptions/route.js +10 -0
  76. package/.medusa/server/src/api/store/customers/me/subscriptions/utils.js +104 -0
  77. package/.medusa/server/src/api/store/customers/me/subscriptions/validators.js +13 -0
  78. package/.medusa/server/src/api/store/plugin/route.js +7 -0
  79. package/.medusa/server/src/jobs/process-analytics-daily-snapshots.js +149 -0
  80. package/.medusa/server/src/jobs/process-cancellation-operational-metrics.js +102 -0
  81. package/.medusa/server/src/jobs/process-dunning-retries.js +249 -0
  82. package/.medusa/server/src/jobs/process-renewal-cycles.js +180 -0
  83. package/.medusa/server/src/links/cancellation-subscription.js +13 -0
  84. package/.medusa/server/src/links/renewal-order.js +12 -0
  85. package/.medusa/server/src/links/renewal-subscription.js +13 -0
  86. package/.medusa/server/src/links/subscription-cart.js +12 -0
  87. package/.medusa/server/src/links/subscription-customer.js +13 -0
  88. package/.medusa/server/src/links/subscription-order.js +13 -0
  89. package/.medusa/server/src/links/subscription-product.js +13 -0
  90. package/.medusa/server/src/links/subscription-variant.js +13 -0
  91. package/.medusa/server/src/modules/activity-log/index.js +13 -0
  92. package/.medusa/server/src/modules/activity-log/migrations/Migration20260401204521.js +24 -0
  93. package/.medusa/server/src/modules/activity-log/migrations/Migration20260405112500.js +16 -0
  94. package/.medusa/server/src/modules/activity-log/models/subscription-log.js +52 -0
  95. package/.medusa/server/src/modules/activity-log/service.js +13 -0
  96. package/.medusa/server/src/modules/activity-log/types/index.js +33 -0
  97. package/.medusa/server/src/modules/activity-log/utils/admin-query.js +261 -0
  98. package/.medusa/server/src/modules/activity-log/utils/normalize-log-event.js +169 -0
  99. package/.medusa/server/src/modules/analytics/constants.js +8 -0
  100. package/.medusa/server/src/modules/analytics/index.js +13 -0
  101. package/.medusa/server/src/modules/analytics/migrations/Migration20260402183116.js +27 -0
  102. package/.medusa/server/src/modules/analytics/models/subscription-metrics-daily.js +65 -0
  103. package/.medusa/server/src/modules/analytics/service.js +13 -0
  104. package/.medusa/server/src/modules/analytics/utils/admin-query.js +632 -0
  105. package/.medusa/server/src/modules/analytics/utils/data-quality.js +101 -0
  106. package/.medusa/server/src/modules/analytics/utils/observability.js +127 -0
  107. package/.medusa/server/src/modules/cancellation/index.js +13 -0
  108. package/.medusa/server/src/modules/cancellation/migrations/Migration20260401143914.js +34 -0
  109. package/.medusa/server/src/modules/cancellation/migrations/Migration20260405112000.js +14 -0
  110. package/.medusa/server/src/modules/cancellation/models/cancellation-case.js +52 -0
  111. package/.medusa/server/src/modules/cancellation/models/retention-offer-event.js +47 -0
  112. package/.medusa/server/src/modules/cancellation/service.js +15 -0
  113. package/.medusa/server/src/modules/cancellation/types/index.js +43 -0
  114. package/.medusa/server/src/modules/cancellation/utils/admin-query.js +530 -0
  115. package/.medusa/server/src/modules/cancellation/utils/audit.js +21 -0
  116. package/.medusa/server/src/modules/cancellation/utils/errors.js +31 -0
  117. package/.medusa/server/src/modules/cancellation/utils/observability.js +77 -0
  118. package/.medusa/server/src/modules/cancellation/utils/operational-metrics.js +131 -0
  119. package/.medusa/server/src/modules/cancellation/utils/retention-offer-policy.js +31 -0
  120. package/.medusa/server/src/modules/dunning/index.js +13 -0
  121. package/.medusa/server/src/modules/dunning/migrations/Migration20260330190157.js +36 -0
  122. package/.medusa/server/src/modules/dunning/models/dunning-attempt.js +48 -0
  123. package/.medusa/server/src/modules/dunning/models/dunning-case.js +61 -0
  124. package/.medusa/server/src/modules/dunning/service.js +15 -0
  125. package/.medusa/server/src/modules/dunning/types/index.js +19 -0
  126. package/.medusa/server/src/modules/dunning/utils/admin-query.js +548 -0
  127. package/.medusa/server/src/modules/dunning/utils/errors.js +40 -0
  128. package/.medusa/server/src/modules/dunning/utils/observability.js +109 -0
  129. package/.medusa/server/src/modules/dunning/utils/retry-schedule.js +47 -0
  130. package/.medusa/server/src/modules/dunning/utils/scheduler-query.js +42 -0
  131. package/.medusa/server/src/modules/plan-offer/index.js +13 -0
  132. package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329104245.js +22 -0
  133. package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329153000.js +25 -0
  134. package/.medusa/server/src/modules/plan-offer/models/plan-offer.js +35 -0
  135. package/.medusa/server/src/modules/plan-offer/service.js +13 -0
  136. package/.medusa/server/src/modules/plan-offer/types/index.js +26 -0
  137. package/.medusa/server/src/modules/plan-offer/utils/admin-query.js +429 -0
  138. package/.medusa/server/src/modules/plan-offer/utils/effective-config.js +84 -0
  139. package/.medusa/server/src/modules/plan-offer/utils/errors.js +55 -0
  140. package/.medusa/server/src/modules/renewal/index.js +13 -0
  141. package/.medusa/server/src/modules/renewal/migrations/Migration20260329185930.js +34 -0
  142. package/.medusa/server/src/modules/renewal/models/renewal-attempt.js +49 -0
  143. package/.medusa/server/src/modules/renewal/models/renewal-cycle.js +56 -0
  144. package/.medusa/server/src/modules/renewal/service.js +15 -0
  145. package/.medusa/server/src/modules/renewal/types/index.js +23 -0
  146. package/.medusa/server/src/modules/renewal/utils/admin-query.js +450 -0
  147. package/.medusa/server/src/modules/renewal/utils/errors.js +39 -0
  148. package/.medusa/server/src/modules/renewal/utils/observability.js +89 -0
  149. package/.medusa/server/src/modules/renewal/utils/scheduler-query.js +48 -0
  150. package/.medusa/server/src/modules/renewal/utils/upcoming-cycle.js +54 -0
  151. package/.medusa/server/src/modules/settings/index.js +13 -0
  152. package/.medusa/server/src/modules/settings/migrations/Migration20260403121004.js +17 -0
  153. package/.medusa/server/src/modules/settings/migrations/Migration20260403132519.js +17 -0
  154. package/.medusa/server/src/modules/settings/models/subscription-settings.js +32 -0
  155. package/.medusa/server/src/modules/settings/service.js +82 -0
  156. package/.medusa/server/src/modules/settings/types.js +15 -0
  157. package/.medusa/server/src/modules/settings/utils/audit.js +43 -0
  158. package/.medusa/server/src/modules/settings/utils/normalize-settings.js +99 -0
  159. package/.medusa/server/src/modules/subscription/index.js +13 -0
  160. package/.medusa/server/src/modules/subscription/migrations/Migration20260327143452.js +24 -0
  161. package/.medusa/server/src/modules/subscription/migrations/Migration20260329194835.js +16 -0
  162. package/.medusa/server/src/modules/subscription/models/subscription.js +64 -0
  163. package/.medusa/server/src/modules/subscription/service.js +13 -0
  164. package/.medusa/server/src/modules/subscription/types/index.js +17 -0
  165. package/.medusa/server/src/modules/subscription/utils/admin-query.js +465 -0
  166. package/.medusa/server/src/modules/subscription/utils/errors.js +28 -0
  167. package/.medusa/server/src/subscription-flows/create-subscription-from-cart.js +178 -0
  168. package/.medusa/server/src/workflows/apply-retention-offer.js +52 -0
  169. package/.medusa/server/src/workflows/approve-renewal-changes.js +61 -0
  170. package/.medusa/server/src/workflows/cancel-subscription.js +64 -0
  171. package/.medusa/server/src/workflows/create-or-upsert-plan-offer.js +11 -0
  172. package/.medusa/server/src/workflows/ensure-next-renewal-cycle.js +11 -0
  173. package/.medusa/server/src/workflows/finalize-cancellation.js +88 -0
  174. package/.medusa/server/src/workflows/force-renewal-cycle.js +11 -0
  175. package/.medusa/server/src/workflows/index.js +79 -0
  176. package/.medusa/server/src/workflows/mark-dunning-recovered.js +11 -0
  177. package/.medusa/server/src/workflows/mark-dunning-unrecovered.js +11 -0
  178. package/.medusa/server/src/workflows/pause-subscription.js +61 -0
  179. package/.medusa/server/src/workflows/process-renewal-cycle.js +43 -0
  180. package/.medusa/server/src/workflows/rebuild-analytics-daily-snapshots.js +13 -0
  181. package/.medusa/server/src/workflows/reject-renewal-changes.js +61 -0
  182. package/.medusa/server/src/workflows/resume-subscription.js +76 -0
  183. package/.medusa/server/src/workflows/run-dunning-retry.js +23 -0
  184. package/.medusa/server/src/workflows/schedule-subscription-plan-change.js +57 -0
  185. package/.medusa/server/src/workflows/start-cancellation-case.js +58 -0
  186. package/.medusa/server/src/workflows/start-dunning.js +11 -0
  187. package/.medusa/server/src/workflows/steps/apply-retention-offer.js +200 -0
  188. package/.medusa/server/src/workflows/steps/approve-renewal-changes.js +48 -0
  189. package/.medusa/server/src/workflows/steps/cancel-subscription.js +48 -0
  190. package/.medusa/server/src/workflows/steps/create-initial-renewal-cycle.js +6 -0
  191. package/.medusa/server/src/workflows/steps/create-subscription-log-event.js +61 -0
  192. package/.medusa/server/src/workflows/steps/create-subscription-record.js +56 -0
  193. package/.medusa/server/src/workflows/steps/ensure-next-renewal-cycle.js +151 -0
  194. package/.medusa/server/src/workflows/steps/finalize-cancellation.js +161 -0
  195. package/.medusa/server/src/workflows/steps/force-renewal-cycle.js +120 -0
  196. package/.medusa/server/src/workflows/steps/link-subscription-commerce-entities.js +44 -0
  197. package/.medusa/server/src/workflows/steps/mark-dunning-recovered.js +72 -0
  198. package/.medusa/server/src/workflows/steps/mark-dunning-unrecovered.js +53 -0
  199. package/.medusa/server/src/workflows/steps/normalize-analytics-rebuild-range.js +59 -0
  200. package/.medusa/server/src/workflows/steps/pause-subscription.js +50 -0
  201. package/.medusa/server/src/workflows/steps/process-renewal-cycle.js +641 -0
  202. package/.medusa/server/src/workflows/steps/rebuild-analytics-daily-snapshots.js +519 -0
  203. package/.medusa/server/src/workflows/steps/reject-renewal-changes.js +48 -0
  204. package/.medusa/server/src/workflows/steps/resume-subscription.js +45 -0
  205. package/.medusa/server/src/workflows/steps/run-dunning-retry.js +592 -0
  206. package/.medusa/server/src/workflows/steps/schedule-subscription-plan-change.js +81 -0
  207. package/.medusa/server/src/workflows/steps/shared-cancellation-log.js +3 -0
  208. package/.medusa/server/src/workflows/steps/shared-plan-offer.js +280 -0
  209. package/.medusa/server/src/workflows/steps/shared-renewal-approval.js +34 -0
  210. package/.medusa/server/src/workflows/steps/start-cancellation-case.js +147 -0
  211. package/.medusa/server/src/workflows/steps/start-dunning.js +237 -0
  212. package/.medusa/server/src/workflows/steps/toggle-plan-offer.js +33 -0
  213. package/.medusa/server/src/workflows/steps/update-cancellation-reason.js +95 -0
  214. package/.medusa/server/src/workflows/steps/update-dunning-retry-schedule.js +91 -0
  215. package/.medusa/server/src/workflows/steps/update-plan-offer.js +51 -0
  216. package/.medusa/server/src/workflows/steps/update-subscription-settings.js +91 -0
  217. package/.medusa/server/src/workflows/steps/update-subscription-shipping-address.js +54 -0
  218. package/.medusa/server/src/workflows/steps/upsert-plan-offer.js +48 -0
  219. package/.medusa/server/src/workflows/steps/validate-subscription-cart.js +280 -0
  220. package/.medusa/server/src/workflows/toggle-plan-offer.js +11 -0
  221. package/.medusa/server/src/workflows/update-cancellation-reason.js +53 -0
  222. package/.medusa/server/src/workflows/update-dunning-retry-schedule.js +11 -0
  223. package/.medusa/server/src/workflows/update-plan-offer.js +11 -0
  224. package/.medusa/server/src/workflows/update-subscription-settings.js +11 -0
  225. package/.medusa/server/src/workflows/update-subscription-shipping-address.js +99 -0
  226. package/.medusa/server/src/workflows/utils/analytics-incremental.js +24 -0
  227. package/.medusa/server/src/workflows/utils/date-output.js +13 -0
  228. package/.medusa/server/src/workflows/utils/subscription-settings.js +13 -0
  229. package/LICENSE +21 -0
  230. package/README.md +200 -0
  231. package/package.json +73 -0
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireStoreCustomer = requireStoreCustomer;
4
+ exports.listStoreCustomerSubscriptions = listStoreCustomerSubscriptions;
5
+ exports.retrieveOwnedSubscription = retrieveOwnedSubscription;
6
+ exports.sendStoreJson = sendStoreJson;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const types_1 = require("../../../../../modules/cancellation/types");
9
+ const ACTIVE_CANCELLATION_STATUSES = [
10
+ types_1.CancellationCaseStatus.REQUESTED,
11
+ types_1.CancellationCaseStatus.EVALUATING_RETENTION,
12
+ types_1.CancellationCaseStatus.RETENTION_OFFERED,
13
+ ];
14
+ function toIsoStringOrNull(value) {
15
+ if (!value) {
16
+ return null;
17
+ }
18
+ const date = value instanceof Date ? value : new Date(value);
19
+ return Number.isNaN(date.getTime()) ? null : date.toISOString();
20
+ }
21
+ async function requireStoreCustomer(req) {
22
+ const customerId = req.auth_context?.actor_id;
23
+ if (!customerId) {
24
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Customer authentication is required.");
25
+ }
26
+ return customerId;
27
+ }
28
+ async function listStoreCustomerSubscriptions(req) {
29
+ const customerId = await requireStoreCustomer(req);
30
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
31
+ const { data } = await query.graph({
32
+ entity: "subscription",
33
+ fields: [
34
+ "id",
35
+ "reference",
36
+ "status",
37
+ "customer_id",
38
+ "next_renewal_at",
39
+ "product_snapshot",
40
+ ],
41
+ filters: {
42
+ customer_id: customerId,
43
+ },
44
+ });
45
+ const subscriptions = data ?? [];
46
+ if (!subscriptions.length) {
47
+ return {
48
+ subscriptions: [],
49
+ };
50
+ }
51
+ const { data: cancellationData } = await query.graph({
52
+ entity: "cancellation_case",
53
+ fields: ["id", "subscription_id", "status"],
54
+ filters: {
55
+ subscription_id: subscriptions.map((subscription) => subscription.id),
56
+ status: [...ACTIVE_CANCELLATION_STATUSES],
57
+ },
58
+ });
59
+ const activeCases = new Map();
60
+ for (const record of cancellationData ?? []) {
61
+ if (!activeCases.has(record.subscription_id)) {
62
+ activeCases.set(record.subscription_id, record);
63
+ }
64
+ }
65
+ return {
66
+ subscriptions: subscriptions.map((subscription) => ({
67
+ id: subscription.id,
68
+ reference: subscription.reference,
69
+ status: subscription.status,
70
+ product_title: subscription.product_snapshot?.product_title ?? null,
71
+ variant_title: subscription.product_snapshot?.variant_title ?? null,
72
+ next_renewal_at: toIsoStringOrNull(subscription.next_renewal_at),
73
+ active_cancellation_case: activeCases.get(subscription.id)
74
+ ? {
75
+ id: activeCases.get(subscription.id).id,
76
+ status: activeCases.get(subscription.id).status,
77
+ }
78
+ : null,
79
+ })),
80
+ };
81
+ }
82
+ async function retrieveOwnedSubscription(req, subscriptionId) {
83
+ const customerId = await requireStoreCustomer(req);
84
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
85
+ const { data } = await query.graph({
86
+ entity: "subscription",
87
+ fields: ["id", "customer_id"],
88
+ filters: {
89
+ id: [subscriptionId],
90
+ customer_id: customerId,
91
+ },
92
+ }, {
93
+ throwIfKeyNotFound: true,
94
+ });
95
+ const subscription = data[0];
96
+ if (!subscription) {
97
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Subscription '${subscriptionId}' was not found for the authenticated customer.`);
98
+ }
99
+ return subscription;
100
+ }
101
+ function sendStoreJson(res, body, status = 200) {
102
+ return res.status(status).json(body);
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9tZS9zdWJzY3JpcHRpb25zL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0NBLG9EQWFDO0FBRUQsd0VBOERDO0FBRUQsOERBOEJDO0FBRUQsc0NBRUM7QUFySkQscURBQWtGO0FBQ2xGLHFFQUFrRjtBQUVsRixNQUFNLDRCQUE0QixHQUFHO0lBQ25DLDhCQUFzQixDQUFDLFNBQVM7SUFDaEMsOEJBQXNCLENBQUMsb0JBQW9CO0lBQzNDLDhCQUFzQixDQUFDLGlCQUFpQjtDQUNoQyxDQUFBO0FBbUJWLFNBQVMsaUJBQWlCLENBQUMsS0FBdUM7SUFDaEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU1RCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ2pFLENBQUM7QUFFTSxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLEdBQStCO0lBRS9CLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFBO0lBRTdDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixzQ0FBc0MsQ0FDdkMsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRU0sS0FB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
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostStoreStartCancellationSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const types_1 = require("../../../../../modules/cancellation/types");
6
+ const metadataSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional();
7
+ exports.PostStoreStartCancellationSchema = zod_1.z.object({
8
+ reason: zod_1.z.string().trim().min(1),
9
+ reason_category: zod_1.z.nativeEnum(types_1.CancellationReasonCategory).optional(),
10
+ notes: zod_1.z.string().trim().optional(),
11
+ metadata: metadataSchema,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvY3VzdG9tZXJzL21lL3N1YnNjcmlwdGlvbnMvdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBdUI7QUFDdkIscUVBQXNGO0FBRXRGLE1BQU0sY0FBYyxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO0FBRXRELFFBQUEsZ0NBQWdDLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2RCxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEMsZUFBZSxFQUFFLE9BQUMsQ0FBQyxVQUFVLENBQUMsa0NBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDcEUsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbkMsUUFBUSxFQUFFLGNBQWM7Q0FDekIsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ async function GET(req, res) {
5
+ res.sendStatus(200);
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = processAnalyticsDailySnapshotsJob;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const observability_1 = require("../modules/analytics/utils/observability");
7
+ const constants_1 = require("../modules/analytics/constants");
8
+ const workflows_1 = require("../workflows");
9
+ const JOB_NAME = "process-analytics-daily-snapshots";
10
+ const JOB_LOCK_KEY = "jobs:analytics-daily-snapshots";
11
+ const DEFAULT_LOOKBACK_DAYS = 3;
12
+ function getLogger(container) {
13
+ return container.resolve("logger");
14
+ }
15
+ function getUtcDayStart(date) {
16
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
17
+ }
18
+ function getUtcDayEnd(date) {
19
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 23, 59, 59, 999));
20
+ }
21
+ function resolveScheduledWindow(lookbackDays) {
22
+ const today = new Date();
23
+ const todayStart = getUtcDayStart(today);
24
+ const from = new Date(todayStart);
25
+ from.setUTCDate(from.getUTCDate() - Math.max(lookbackDays - 1, 0));
26
+ return {
27
+ date_from: from,
28
+ date_to: getUtcDayEnd(today),
29
+ };
30
+ }
31
+ async function runJob(container) {
32
+ const logger = getLogger(container);
33
+ const startedAt = Date.now();
34
+ const correlationId = (0, observability_1.createAnalyticsCorrelationId)(JOB_NAME);
35
+ const window = resolveScheduledWindow(DEFAULT_LOOKBACK_DAYS);
36
+ (0, observability_1.logAnalyticsEvent)(logger, "info", {
37
+ event: "analytics.job",
38
+ job_name: JOB_NAME,
39
+ outcome: "started",
40
+ correlation_id: correlationId,
41
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
42
+ trigger_type: "scheduled",
43
+ lookback_days: DEFAULT_LOOKBACK_DAYS,
44
+ date_from: window.date_from.toISOString(),
45
+ date_to: window.date_to.toISOString(),
46
+ });
47
+ try {
48
+ const { result } = await (0, workflows_1.rebuildAnalyticsDailySnapshotsWorkflow)(container).run({
49
+ input: {
50
+ date_from: window.date_from,
51
+ date_to: window.date_to,
52
+ trigger_type: "scheduled",
53
+ reason: `daily scheduled rebuild with ${DEFAULT_LOOKBACK_DAYS}-day lookback`,
54
+ correlation_id: correlationId,
55
+ },
56
+ });
57
+ const durationMs = Date.now() - startedAt;
58
+ const failedDaysCount = result.failed_days.length;
59
+ const blockedDaysCount = result.blocked_days.length;
60
+ const alertable = failedDaysCount > 0 ||
61
+ blockedDaysCount > 0 ||
62
+ (0, observability_1.isSlowAnalyticsJob)(durationMs);
63
+ (0, observability_1.logAnalyticsEvent)(logger, (0, observability_1.getAnalyticsJobLogLevel)({
64
+ duration_ms: durationMs,
65
+ failed_days_count: failedDaysCount,
66
+ blocked_days_count: blockedDaysCount,
67
+ }), {
68
+ event: "analytics.job",
69
+ job_name: JOB_NAME,
70
+ outcome: "completed",
71
+ correlation_id: correlationId,
72
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
73
+ trigger_type: "scheduled",
74
+ duration_ms: durationMs,
75
+ lookback_days: DEFAULT_LOOKBACK_DAYS,
76
+ date_from: result.date_from,
77
+ date_to: result.date_to,
78
+ processed_days: result.processed_days,
79
+ processed_subscriptions: result.processed_subscriptions,
80
+ upserted_rows: result.upserted_rows,
81
+ blocked_count: blockedDaysCount,
82
+ failure_count: failedDaysCount,
83
+ skipped_rows: result.skipped_rows,
84
+ alertable,
85
+ message: failedDaysCount > 0
86
+ ? "Analytics daily snapshots completed with failures"
87
+ : blockedDaysCount > 0
88
+ ? "Analytics daily snapshots completed with blocked days"
89
+ : (0, observability_1.isSlowAnalyticsJob)(durationMs)
90
+ ? "Analytics daily snapshots completed slowly"
91
+ : "Analytics daily snapshots completed",
92
+ metadata: {
93
+ blocked_days: result.blocked_days,
94
+ failed_days: result.failed_days,
95
+ },
96
+ });
97
+ }
98
+ catch (error) {
99
+ const failureKind = (0, observability_1.classifyAnalyticsFailure)(error);
100
+ (0, observability_1.logAnalyticsEvent)(logger, (0, observability_1.isAlertableAnalyticsFailure)(failureKind) ? "error" : "warn", {
101
+ event: "analytics.job",
102
+ job_name: JOB_NAME,
103
+ outcome: failureKind === "lock_timeout" ? "blocked" : "failed",
104
+ correlation_id: correlationId,
105
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
106
+ trigger_type: "scheduled",
107
+ duration_ms: Date.now() - startedAt,
108
+ lookback_days: DEFAULT_LOOKBACK_DAYS,
109
+ date_from: window.date_from.toISOString(),
110
+ date_to: window.date_to.toISOString(),
111
+ failure_kind: failureKind,
112
+ alertable: (0, observability_1.isAlertableAnalyticsFailure)(failureKind),
113
+ message: (0, observability_1.getAnalyticsErrorMessage)(error),
114
+ });
115
+ }
116
+ }
117
+ async function processAnalyticsDailySnapshotsJob(container) {
118
+ const logger = getLogger(container);
119
+ const locking = container.resolve(utils_1.Modules.LOCKING);
120
+ const correlationId = (0, observability_1.createAnalyticsCorrelationId)(`${JOB_NAME}-lock`);
121
+ try {
122
+ await locking.execute(JOB_LOCK_KEY, async () => {
123
+ await runJob(container);
124
+ }, {
125
+ timeout: 1,
126
+ });
127
+ }
128
+ catch (error) {
129
+ const failureKind = (0, observability_1.classifyAnalyticsFailure)(error);
130
+ const alertable = (0, observability_1.isAlertableAnalyticsFailure)(failureKind);
131
+ (0, observability_1.logAnalyticsEvent)(logger, alertable ? "error" : "warn", {
132
+ event: "analytics.job",
133
+ job_name: JOB_NAME,
134
+ outcome: failureKind === "lock_timeout" ? "blocked" : "failed",
135
+ correlation_id: correlationId,
136
+ metrics_version: constants_1.ANALYTICS_METRICS_VERSION,
137
+ failure_kind: failureKind,
138
+ alertable,
139
+ message: failureKind === "lock_timeout"
140
+ ? "Analytics daily snapshots job skipped because another job instance holds the lock"
141
+ : (0, observability_1.getAnalyticsErrorMessage)(error),
142
+ });
143
+ }
144
+ }
145
+ exports.config = {
146
+ name: JOB_NAME,
147
+ schedule: "0 0 * * *",
148
+ };
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hbmFseXRpY3MtZGFpbHktc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvcHJvY2Vzcy1hbmFseXRpY3MtZGFpbHktc25hcHNob3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNLQSxvREFtQ0M7QUF4TUQscURBQW1EO0FBQ25ELDRFQVFpRDtBQUNqRCw4REFBMEU7QUFDMUUsNENBQXFFO0FBRXJFLE1BQU0sUUFBUSxHQUFHLG1DQUFtQyxDQUFBO0FBQ3BELE1BQU0sWUFBWSxHQUFHLGdDQUFnQyxDQUFBO0FBQ3JELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFBO0FBYS9CLFNBQVMsU0FBUyxDQUFDLFNBQTBCO0lBQzNDLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtBQUNwQyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBVTtJQUNoQyxPQUFPLElBQUksSUFBSSxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDdkUsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFVO0lBQzlCLE9BQU8sSUFBSSxJQUFJLENBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FDTixJQUFJLENBQUMsY0FBYyxFQUFFLEVBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNqQixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixHQUFHLENBQ0osQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsWUFBb0I7SUFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUN4QixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsS0FB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
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = processCancellationOperationalMetricsJob;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const observability_1 = require("../modules/cancellation/utils/observability");
7
+ const operational_metrics_1 = require("../modules/cancellation/utils/operational-metrics");
8
+ const JOB_NAME = "process-cancellation-operational-metrics";
9
+ const JOB_LOCK_KEY = "jobs:cancellation-operational-metrics";
10
+ const DEFAULT_WINDOW_HOURS = 24;
11
+ const SPIKE_THRESHOLD = 5;
12
+ function getLogger(container) {
13
+ return container.resolve("logger");
14
+ }
15
+ async function runJob(container) {
16
+ const logger = getLogger(container);
17
+ const startedAt = Date.now();
18
+ const correlationId = (0, observability_1.createCancellationCorrelationId)(JOB_NAME);
19
+ (0, observability_1.logCancellationEvent)(logger, "info", {
20
+ event: "cancellation.job",
21
+ job_name: JOB_NAME,
22
+ outcome: "started",
23
+ correlation_id: correlationId,
24
+ window_hours: DEFAULT_WINDOW_HOURS,
25
+ });
26
+ try {
27
+ const metrics = await (0, operational_metrics_1.listCancellationOperationalMetrics)(container, {
28
+ window_hours: DEFAULT_WINDOW_HOURS,
29
+ });
30
+ const alertable = (0, operational_metrics_1.isCancellationReasonSpikeAlertable)(metrics, SPIKE_THRESHOLD);
31
+ (0, observability_1.logCancellationEvent)(logger, alertable ? "warn" : "info", {
32
+ event: "cancellation.job",
33
+ job_name: JOB_NAME,
34
+ outcome: "completed",
35
+ correlation_id: correlationId,
36
+ duration_ms: Date.now() - startedAt,
37
+ window_hours: metrics.window_hours,
38
+ case_count: metrics.case_count,
39
+ terminal_case_count: metrics.terminal_case_count,
40
+ canceled_count: metrics.canceled_count,
41
+ retained_count: metrics.retained_count,
42
+ pause_count: metrics.pause_count,
43
+ churn_rate: metrics.churn_rate,
44
+ offer_acceptance_rate: metrics.offer_acceptance_rate,
45
+ top_reason_categories: metrics.top_reason_categories,
46
+ spike_reason_category: metrics.spike_reason_category,
47
+ spike_current_count: metrics.spike_current_count,
48
+ spike_previous_count: metrics.spike_previous_count,
49
+ threshold: SPIKE_THRESHOLD,
50
+ alertable,
51
+ message: alertable
52
+ ? "Cancellation metrics detected an alertable churn spike"
53
+ : "Cancellation operational metrics completed",
54
+ });
55
+ }
56
+ catch (error) {
57
+ const failureKind = (0, observability_1.classifyCancellationFailure)(error);
58
+ (0, observability_1.logCancellationEvent)(logger, (0, observability_1.isAlertableCancellationFailure)(failureKind) ? "error" : "warn", {
59
+ event: "cancellation.job",
60
+ job_name: JOB_NAME,
61
+ outcome: failureKind === "lock_timeout" ? "blocked" : "failed",
62
+ correlation_id: correlationId,
63
+ duration_ms: Date.now() - startedAt,
64
+ window_hours: DEFAULT_WINDOW_HOURS,
65
+ failure_kind: failureKind,
66
+ alertable: (0, observability_1.isAlertableCancellationFailure)(failureKind),
67
+ message: (0, observability_1.getCancellationErrorMessage)(error),
68
+ });
69
+ }
70
+ }
71
+ async function processCancellationOperationalMetricsJob(container) {
72
+ const logger = getLogger(container);
73
+ const locking = container.resolve(utils_1.Modules.LOCKING);
74
+ const correlationId = (0, observability_1.createCancellationCorrelationId)(`${JOB_NAME}-lock`);
75
+ try {
76
+ await locking.execute(JOB_LOCK_KEY, async () => {
77
+ await runJob(container);
78
+ }, {
79
+ timeout: 1,
80
+ });
81
+ }
82
+ catch (error) {
83
+ const failureKind = (0, observability_1.classifyCancellationFailure)(error);
84
+ const alertable = (0, observability_1.isAlertableCancellationFailure)(failureKind);
85
+ (0, observability_1.logCancellationEvent)(logger, alertable ? "error" : "warn", {
86
+ event: "cancellation.job",
87
+ job_name: JOB_NAME,
88
+ outcome: failureKind === "lock_timeout" ? "blocked" : "failed",
89
+ correlation_id: correlationId,
90
+ failure_kind: failureKind,
91
+ alertable,
92
+ message: failureKind === "lock_timeout"
93
+ ? "Cancellation metrics job skipped because another job instance holds the lock"
94
+ : (0, observability_1.getCancellationErrorMessage)(error),
95
+ });
96
+ }
97
+ }
98
+ exports.config = {
99
+ name: JOB_NAME,
100
+ schedule: "0 * * * *",
101
+ };
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1jYW5jZWxsYXRpb24tb3BlcmF0aW9uYWwtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3Byb2Nlc3MtY2FuY2VsbGF0aW9uLW9wZXJhdGlvbmFsLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0dBLDJEQWtDQztBQW5JRCxxREFBbUQ7QUFDbkQsK0VBTW9EO0FBQ3BELDJGQUcwRDtBQUUxRCxNQUFNLFFBQVEsR0FBRywwQ0FBMEMsQ0FBQTtBQUMzRCxNQUFNLFlBQVksR0FBRyx1Q0FBdUMsQ0FBQTtBQUM1RCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQTtBQUMvQixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUE7QUFhekIsU0FBUyxTQUFTLENBQUMsU0FBMEI7SUFDM0MsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUFFRCxLQUFLLFVBQVUsTUFBTSxDQUFDLFNBQTBCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBQSwrQ0FBK0IsRUFBQyxRQUFRLENBQUMsQ0FBQTtJQUUvRCxJQUFBLG9DQUFvQixFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUU7UUFDbkMsS0FBSyxFQUFFLGtCQUFrQjtRQUN6QixRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsU0FBUztRQUNsQixjQUFjLEVBQUUsYUFBYTtRQUM3QixZQUFZLEVBQUUsb0JBQW9CO0tBQ25DLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSx3REFBa0MsRUFBQyxTQUFTLEVBQUU7WUFDbEUsWUFBWSxFQUFFLG9CQUFvQjtTQUNuQyxDQUFDLENB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