medusajs-documents-plugin 1.1.1 → 1.1.3

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.
@@ -5,11 +5,12 @@ exports.default = orderDocumentsSubscriber;
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  const documents_1 = require("../modules/documents");
7
7
  const payment_link_1 = require("../utils/payment-link");
8
+ const notification_sender_1 = require("../services/notification-sender");
8
9
  async function orderDocumentsSubscriber({ event, container, }) {
9
10
  const logger = container.resolve("logger");
10
11
  const eventName = event.name;
11
- const data = event.data;
12
- logger.info(`[Documents-Subscriber] Handling '${eventName}' event (Order ID: ${data?.id})`);
12
+ const data = event.data || {};
13
+ logger.info(`[Documents-Subscriber] Handling '${eventName}' event (Payload ID: ${data?.id || data?.order_id})`);
13
14
  try {
14
15
  const documentService = container.resolve(documents_1.DOCUMENTS_MODULE, {
15
16
  allowUnregistered: true,
@@ -28,20 +29,127 @@ async function orderDocumentsSubscriber({ event, container, }) {
28
29
  logger.info(`[Documents-Subscriber] 'order.completed' event processing is disabled in Documents settings.`);
29
30
  return;
30
31
  }
31
- if (eventName === "payment.captured" && !settings.event_payment_captured_enabled) {
32
- logger.info(`[Documents-Subscriber] 'payment.captured' event processing is disabled in Documents settings.`);
32
+ if ((eventName === "payment.captured" || eventName === "order.payment_captured") &&
33
+ !settings.event_payment_captured_enabled) {
34
+ logger.info(`[Documents-Subscriber] Payment captured event processing is disabled in Documents settings.`);
33
35
  return;
34
36
  }
35
- if (eventName === "order.fulfillment_created" && !settings.event_order_fulfillment_enabled) {
36
- logger.info(`[Documents-Subscriber] 'order.fulfillment_created' event processing is disabled in Documents settings.`);
37
+ if ((eventName === "order.fulfillment_created" ||
38
+ eventName === "fulfillment.created" ||
39
+ eventName === "order.shipment_created" ||
40
+ eventName === "shipment.created") &&
41
+ !settings.event_order_fulfillment_enabled) {
42
+ logger.info(`[Documents-Subscriber] Fulfillment/shipment event processing is disabled in Documents settings.`);
37
43
  return;
38
44
  }
39
- const orderId = data.id || data.order_id;
45
+ if ((eventName === "order.canceled" || eventName === "order.cancelled") &&
46
+ settings.event_order_canceled_enabled === false) {
47
+ logger.info(`[Documents-Subscriber] Order canceled event processing is disabled in Documents settings.`);
48
+ return;
49
+ }
50
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
51
+ // Extra event metadata
52
+ const extraData = {
53
+ tracking_number: data.tracking_number || data.tracking_numbers?.[0],
54
+ tracking_url: data.tracking_url || data.tracking_urls?.[0],
55
+ carrier: data.carrier || data.provider_id,
56
+ cancellation_reason: data.reason || data.cancellation_reason,
57
+ amount: data.amount,
58
+ payment_method: data.payment_method || data.provider_id,
59
+ payment_reference: data.payment_reference || data.payment_id,
60
+ };
61
+ // -------------------------------------------------------------
62
+ // Robust Order ID Resolution
63
+ // In Medusa v2:
64
+ // - order.placed: data.id is order_id
65
+ // - payment.captured: data.id is payment_id (pay_...)
66
+ // - fulfillment.created / shipment.created: data.id is fulfillment_id (ful_...)
67
+ // -------------------------------------------------------------
68
+ let orderId = data.order_id;
69
+ // 1. Resolve order ID from payment event
70
+ if (!orderId &&
71
+ (eventName === "payment.captured" ||
72
+ eventName === "order.payment_captured" ||
73
+ (data.id && String(data.id).startsWith("pay_")))) {
74
+ const paymentId = data.payment_id || data.id;
75
+ const { data: payments } = await query
76
+ .graph({
77
+ entity: "payment",
78
+ fields: [
79
+ "id",
80
+ "amount",
81
+ "currency_code",
82
+ "provider_id",
83
+ "payment_collection.id",
84
+ "payment_collection.order.id",
85
+ ],
86
+ filters: { id: paymentId },
87
+ })
88
+ .catch(() => ({ data: [] }));
89
+ if (payments && payments.length > 0) {
90
+ orderId = payments[0]?.payment_collection?.order?.id;
91
+ if (payments[0]?.amount != null) {
92
+ extraData.captured_amount = payments[0].amount;
93
+ }
94
+ if (payments[0]?.provider_id) {
95
+ extraData.payment_method = extraData.payment_method || payments[0].provider_id;
96
+ }
97
+ extraData.payment_reference = extraData.payment_reference || payments[0]?.id;
98
+ }
99
+ // Fallback: Query order by payment_collections link
100
+ if (!orderId) {
101
+ const { data: ords } = await query
102
+ .graph({
103
+ entity: "order",
104
+ fields: ["id"],
105
+ filters: {
106
+ payment_collections: {
107
+ payments: { id: paymentId },
108
+ },
109
+ },
110
+ })
111
+ .catch(() => ({ data: [] }));
112
+ if (ords && ords.length > 0) {
113
+ orderId = ords[0].id;
114
+ }
115
+ }
116
+ }
117
+ // 2. Resolve order ID from fulfillment / shipment event
118
+ if (!orderId &&
119
+ (eventName === "fulfillment.created" ||
120
+ eventName === "shipment.created" ||
121
+ eventName === "order.shipment_created" ||
122
+ eventName === "order.fulfillment_created" ||
123
+ (data.id && String(data.id).startsWith("ful_")))) {
124
+ const fulfillmentId = data.fulfillment_id || data.id;
125
+ const { data: fuls } = await query
126
+ .graph({
127
+ entity: "fulfillment",
128
+ fields: ["id", "order.id", "labels.*", "provider_id"],
129
+ filters: { id: fulfillmentId },
130
+ })
131
+ .catch(() => ({ data: [] }));
132
+ if (fuls && fuls.length > 0) {
133
+ orderId = fuls[0]?.order?.id;
134
+ if (fuls[0]?.labels && fuls[0].labels.length > 0) {
135
+ extraData.tracking_number =
136
+ extraData.tracking_number || fuls[0].labels[0]?.tracking_number;
137
+ extraData.tracking_url =
138
+ extraData.tracking_url || fuls[0].labels[0]?.tracking_url;
139
+ }
140
+ if (fuls[0]?.provider_id) {
141
+ extraData.carrier = extraData.carrier || fuls[0].provider_id;
142
+ }
143
+ }
144
+ }
145
+ // 3. Fallback: If still unresolved, treat data.id as order ID
146
+ if (!orderId && data.id) {
147
+ orderId = data.id;
148
+ }
40
149
  if (!orderId) {
41
150
  logger.warn(`[Documents-Subscriber] No order ID found in '${eventName}' payload.`);
42
151
  return;
43
152
  }
44
- const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
45
153
  const { data: orders } = await query.graph({
46
154
  entity: "order",
47
155
  fields: [
@@ -55,6 +163,7 @@ async function orderDocumentsSubscriber({ event, container, }) {
55
163
  "shipping_total",
56
164
  "discount_total",
57
165
  "tax_total",
166
+ "metadata",
58
167
  "customer.first_name",
59
168
  "customer.last_name",
60
169
  "customer.email",
@@ -62,7 +171,10 @@ async function orderDocumentsSubscriber({ event, container, }) {
62
171
  "shipping_address.first_name",
63
172
  "shipping_address.last_name",
64
173
  "shipping_address.address_1",
174
+ "shipping_address.address_2",
65
175
  "shipping_address.city",
176
+ "shipping_address.postal_code",
177
+ "shipping_address.country_code",
66
178
  "shipping_address.phone",
67
179
  "items.id",
68
180
  "items.title",
@@ -73,6 +185,11 @@ async function orderDocumentsSubscriber({ event, container, }) {
73
185
  "payment_collections.payments.amount",
74
186
  "payment_collections.payments.captured_at",
75
187
  "payment_collections.payments.canceled_at",
188
+ "payment_collections.payments.provider_id",
189
+ "fulfillments.id",
190
+ "fulfillments.provider_id",
191
+ "fulfillments.labels.*",
192
+ "fulfillments.items.*",
76
193
  ],
77
194
  filters: { id: orderId },
78
195
  });
@@ -81,9 +198,22 @@ async function orderDocumentsSubscriber({ event, container, }) {
81
198
  return;
82
199
  }
83
200
  const order = orders[0];
201
+ // Fix 3: Suppress duplicate order documents/receipts when order is for a repair payment
202
+ if (order.metadata?.repair_ticket_id) {
203
+ if (eventName === "payment.captured" || eventName === "order.payment_captured") {
204
+ logger.info(`[Documents-Subscriber] Order ${order.id} represents a repair payment for ticket #${order.metadata.repair_ticket_id}. Suppressing duplicate store receipt.`);
205
+ return;
206
+ }
207
+ if (eventName === "order.placed") {
208
+ logger.info(`[Documents-Subscriber] Order ${order.id} represents a repair payment for ticket #${order.metadata.repair_ticket_id}. Suppressing store tax invoice (handled by repair subscriber).`);
209
+ return;
210
+ }
211
+ }
84
212
  const customerName = order.customer?.first_name
85
213
  ? `${order.customer.first_name} ${order.customer.last_name || ""}`.trim()
86
- : order.shipping_address?.first_name || "Valued Customer";
214
+ : order.shipping_address?.first_name
215
+ ? `${order.shipping_address.first_name} ${order.shipping_address.last_name || ""}`.trim()
216
+ : order.email || "Valued Customer";
87
217
  const customerEmail = order.email || order.customer?.email;
88
218
  const customerPhone = order.shipping_address?.phone || order.customer?.phone;
89
219
  const storeUrl = settings.storefront_url || process.env.STOREFRONT_URL || "http://localhost:5173";
@@ -94,36 +224,66 @@ async function orderDocumentsSubscriber({ event, container, }) {
94
224
  unit_price: Number(it.unit_price || 0),
95
225
  total: Number(it.quantity || 1) * Number(it.unit_price || 0),
96
226
  }));
97
- // Handle 'order.placed' -> Tax Invoice
227
+ // -------------------------------------------------------------
228
+ // 1. Handle 'order.placed' -> Tax Invoice + Order Confirmation
229
+ // -------------------------------------------------------------
98
230
  if (eventName === "order.placed") {
99
- const paymentInfo = (0, payment_link_1.generateOrderPaymentLink)(order, storeUrl);
100
- await documentService.generateDocument({
101
- display_id: `INV-${order.display_id || order.id.slice(-6)}`,
102
- title: "Tax Invoice",
103
- type: "invoice",
231
+ // Deduplicate: check if tax invoice was already generated for this order
232
+ const existingInvoices = await documentService.listDocumentRecords({
104
233
  order_id: order.id,
105
- customer: {
106
- name: customerName,
107
- email: customerEmail,
108
- phone: customerPhone,
109
- address: order.shipping_address?.address_1,
110
- },
111
- items: lineItems,
112
- subtotal: Number(order.subtotal || 0),
113
- tax_total: Number(order.tax_total || 0),
114
- shipping_total: Number(order.shipping_total || 0),
115
- discount_total: Number(order.discount_total || 0),
116
- total: Number(order.total || 0),
117
- currency_code: order.currency_code,
118
- payment_status: paymentInfo.isUnpaid ? "unpaid" : "paid",
119
- payment_link: paymentInfo.paymentLink || undefined,
120
- auto_send: true,
121
- email_subject: `Invoice for Order #${order.display_id || order.id}`,
122
- }, container);
234
+ type: "invoice",
235
+ }).catch(() => []);
236
+ let record = null;
237
+ if (existingInvoices && existingInvoices.length > 0) {
238
+ logger.info(`[Documents-Subscriber] Tax invoice already generated for order ${order.id}. Reusing existing document.`);
239
+ record = existingInvoices[0];
240
+ }
241
+ else {
242
+ const paymentInfo = (0, payment_link_1.generateOrderPaymentLink)(order, storeUrl);
243
+ const gen = await documentService.generateDocument({
244
+ display_id: `INV-${order.display_id || order.id.slice(-6)}`,
245
+ title: "Tax Invoice",
246
+ type: "invoice",
247
+ order_id: order.id,
248
+ customer: {
249
+ name: customerName,
250
+ email: customerEmail,
251
+ phone: customerPhone,
252
+ address: order.shipping_address?.address_1,
253
+ },
254
+ items: lineItems,
255
+ subtotal: Number(order.subtotal || 0),
256
+ tax_total: Number(order.tax_total || 0),
257
+ shipping_total: Number(order.shipping_total || 0),
258
+ discount_total: Number(order.discount_total || 0),
259
+ total: Number(order.total || 0),
260
+ currency_code: order.currency_code,
261
+ payment_status: paymentInfo.isUnpaid ? "unpaid" : "paid",
262
+ payment_link: paymentInfo.paymentLink || undefined,
263
+ auto_send: false, // Sent via dedicated NotificationSender.sendOrderNotification below
264
+ email_subject: `Order Confirmation #${order.display_id || order.id}`,
265
+ }, container);
266
+ record = gen.record;
267
+ }
268
+ await notification_sender_1.NotificationSender.sendOrderNotification({
269
+ container,
270
+ event: "order.placed",
271
+ order,
272
+ documentRecord: record,
273
+ settings,
274
+ extraData,
275
+ });
123
276
  }
124
- // Handle 'payment.captured' -> Payment Receipt
125
- else if (eventName === "payment.captured") {
126
- await documentService.generateDocument({
277
+ // -------------------------------------------------------------
278
+ // 2. Handle 'payment.captured' -> Payment Receipt
279
+ // -------------------------------------------------------------
280
+ else if (eventName === "payment.captured" || eventName === "order.payment_captured") {
281
+ const receiptTotal = extraData.captured_amount != null
282
+ ? Number(extraData.captured_amount)
283
+ : extraData.amount != null
284
+ ? Number(extraData.amount)
285
+ : Number(order.total || 0);
286
+ const { record } = await documentService.generateDocument({
127
287
  display_id: `RCPT-${order.display_id || order.id.slice(-6)}`,
128
288
  title: "Payment Receipt",
129
289
  type: "receipt",
@@ -134,33 +294,113 @@ async function orderDocumentsSubscriber({ event, container, }) {
134
294
  phone: customerPhone,
135
295
  },
136
296
  items: lineItems,
137
- total: Number(order.total || 0),
297
+ total: receiptTotal,
138
298
  currency_code: order.currency_code,
139
299
  payment_status: "paid",
140
- auto_send: true,
300
+ auto_send: false, // Sent via dedicated NotificationSender.sendOrderNotification below
141
301
  email_subject: `Payment Receipt for Order #${order.display_id || order.id}`,
142
302
  }, container);
303
+ await notification_sender_1.NotificationSender.sendOrderNotification({
304
+ container,
305
+ event: "order.payment_captured",
306
+ order,
307
+ documentRecord: record,
308
+ settings,
309
+ extraData,
310
+ });
143
311
  }
144
- // Handle 'order.completed' or 'order.fulfillment_created' -> Packing Slip
145
- else if (eventName === "order.completed" || eventName === "order.fulfillment_created") {
146
- await documentService.generateDocument({
147
- display_id: `PACK-${order.display_id || order.id.slice(-6)}`,
148
- title: "Packing Slip",
149
- type: "packing_slip",
312
+ // -------------------------------------------------------------
313
+ // 3. Handle Fulfillment / Shipment -> Packing Slip + Tracking
314
+ // -------------------------------------------------------------
315
+ else if (eventName === "order.fulfillment_created" ||
316
+ eventName === "fulfillment.created" ||
317
+ eventName === "order.shipment_created" ||
318
+ eventName === "shipment.created") {
319
+ const isShipment = eventName === "order.shipment_created" || eventName === "shipment.created";
320
+ // Check for existing packing slip to prevent duplicate generation
321
+ const existingPackingSlips = await documentService
322
+ .listDocumentRecords({
150
323
  order_id: order.id,
151
- customer: {
152
- name: customerName,
153
- email: customerEmail,
154
- phone: customerPhone,
155
- address: `${order.shipping_address?.address_1 || ""}, ${order.shipping_address?.city || ""}`,
156
- },
157
- items: lineItems,
158
- total: 0,
159
- currency_code: order.currency_code,
160
- payment_status: "not_applicable",
161
- force_source: "pdfkit", // Packing slips generated via PDFKit
162
- auto_send: false,
163
- }, container);
324
+ type: "packing_slip",
325
+ })
326
+ .catch(() => []);
327
+ let record = null;
328
+ if (existingPackingSlips && existingPackingSlips.length > 0) {
329
+ record = existingPackingSlips[0];
330
+ // If this is a redundant duplicate fulfillment creation event without new tracking info, suppress
331
+ if (!isShipment && !extraData.tracking_number) {
332
+ logger.info(`[Documents-Subscriber] Packing slip already exists for order ${order.id}. Suppressing duplicate fulfillment notification.`);
333
+ return;
334
+ }
335
+ }
336
+ else {
337
+ const genResult = await documentService.generateDocument({
338
+ display_id: `PACK-${order.display_id || order.id.slice(-6)}`,
339
+ title: "Packing Slip",
340
+ type: "packing_slip",
341
+ order_id: order.id,
342
+ customer: {
343
+ name: customerName,
344
+ email: customerEmail,
345
+ phone: customerPhone,
346
+ address: `${order.shipping_address?.address_1 || ""}, ${order.shipping_address?.city || ""}`.trim(),
347
+ },
348
+ items: lineItems,
349
+ total: 0,
350
+ currency_code: order.currency_code,
351
+ payment_status: "not_applicable",
352
+ force_source: "pdfkit",
353
+ auto_send: false,
354
+ }, container);
355
+ record = genResult.record;
356
+ }
357
+ await notification_sender_1.NotificationSender.sendOrderNotification({
358
+ container,
359
+ event: "order.fulfillment_created",
360
+ order,
361
+ documentRecord: record,
362
+ settings,
363
+ extraData,
364
+ });
365
+ }
366
+ // -------------------------------------------------------------
367
+ // 4. Handle 'order.completed' -> Completion Notification
368
+ // -------------------------------------------------------------
369
+ else if (eventName === "order.completed") {
370
+ await notification_sender_1.NotificationSender.sendOrderNotification({
371
+ container,
372
+ event: "order.completed",
373
+ order,
374
+ settings,
375
+ extraData,
376
+ });
377
+ }
378
+ // -------------------------------------------------------------
379
+ // 5. Handle 'order.canceled' -> Order Cancellation & Invoice Voiding
380
+ // -------------------------------------------------------------
381
+ else if (eventName === "order.canceled" || eventName === "order.cancelled") {
382
+ // Void any active/unpaid invoices for this order in document records
383
+ try {
384
+ const existingDocs = await documentService.listDocumentRecords({
385
+ order_id: order.id,
386
+ });
387
+ for (const doc of existingDocs) {
388
+ if (doc.type === "invoice" && doc.status !== "void" && doc.status !== "paid") {
389
+ await documentService.updateDocumentRecords({
390
+ id: doc.id,
391
+ status: "void",
392
+ });
393
+ }
394
+ }
395
+ }
396
+ catch (err) { }
397
+ await notification_sender_1.NotificationSender.sendOrderNotification({
398
+ container,
399
+ event: "order.canceled",
400
+ order,
401
+ settings,
402
+ extraData,
403
+ });
164
404
  }
165
405
  }
166
406
  catch (error) {
@@ -172,7 +412,13 @@ exports.config = {
172
412
  "order.placed",
173
413
  "order.completed",
174
414
  "payment.captured",
415
+ "order.payment_captured",
175
416
  "order.fulfillment_created",
417
+ "fulfillment.created",
418
+ "order.shipment_created",
419
+ "shipment.created",
420
+ "order.canceled",
421
+ "order.cancelled",
176
422
  ],
177
423
  };
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLWRvY3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSwyQ0F5TEM7QUE5TEQscURBQXNFO0FBQ3RFLG9EQUF3RDtBQUV4RCx3REFBaUU7QUFFbEQsS0FBSyxVQUFVLHdCQUF3QixDQUFDLEVBQ3JELEtBQUssRUFDTCxTQUFTLEdBQ1c7SUFDcEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFFeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsU0FBUyxzQkFBc0IsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFNUYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsNEJBQWdCLEVBQUU7WUFDakYsaUJBQWlCLEVBQUUsSUFBSTtTQUN4QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1lBQzlGLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFckQsNkNBQTZDO1FBQzdDLElBQUksU0FBUyxLQUFLLGNBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkZBQTJGLENBQUMsQ0FBQztZQUN6RyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLGlCQUFpQixJQUFJLENBQUMsUUFBUSxDQUFD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
424
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLWRvY3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSwyQ0FnZEM7QUF0ZEQscURBQXNFO0FBQ3RFLG9EQUF3RDtBQUV4RCx3REFBaUU7QUFDakUseUVBQXFFO0FBRXRELEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxFQUNyRCxLQUFLLEVBQ0wsU0FBUyxHQUNXO0lBQ3BCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUU5QixNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxTQUFTLHdCQUF3QixJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRWhILElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUEwQixTQUFTLENBQUMsT0FBTyxDQUFDLDRCQUFnQixFQUFFO1lBQ2pGLGlCQUFpQixFQUFFLElBQUk7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztZQUM5RixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXJELDZDQUE2QztRQUM3QyxJQUFJLFNBQVMsS0FBSyxjQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUN6RSxNQUFNLENBQUMsSUFBSSxDQUFDLDJGQUEyRixDQUFDLENBQUM7WUFDekcsT0FBTztRQUNULENBQUM7UUFD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