medusa-pos-plugin 0.0.33 → 0.0.35

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.
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const barcode_labels_1 = require("../../../utils/barcode-labels");
7
+ const VARIANT_FIELDS = [
8
+ "id",
9
+ "barcode",
10
+ "sku",
11
+ "product.id",
12
+ "product.title",
13
+ "options.value",
14
+ "options.option.title",
15
+ "calculated_price.*",
16
+ "price_set.prices.amount",
17
+ "price_set.prices.currency_code",
18
+ "price_set.prices.price_list_id",
19
+ ];
20
+ function isVariantRow(value) {
21
+ return (!!value &&
22
+ typeof value === "object" &&
23
+ typeof value.id === "string");
24
+ }
25
+ async function loadContactDetails(scope) {
26
+ try {
27
+ const dynamicConfigService = scope.resolve("dynamic_config");
28
+ return (0, barcode_labels_1.contactDetailsFromConfig)(await dynamicConfigService.listValues());
29
+ }
30
+ catch (configError) {
31
+ console.warn("[barcode-template] Could not fetch dynamic config:", configError);
32
+ return { phone: "", email: "", address: "" };
33
+ }
34
+ }
35
+ async function resolveRegionId(scope, requested) {
36
+ if (requested)
37
+ return requested;
38
+ try {
39
+ const regionModule = scope.resolve(utils_1.Modules.REGION);
40
+ const regions = await regionModule.listRegions({}, { take: 20 });
41
+ const inr = regions.find((r) => (r.currency_code || "").toLowerCase() === "inr");
42
+ return inr?.id || regions[0]?.id || "";
43
+ }
44
+ catch (regionError) {
45
+ console.warn("[barcode-template] region resolve failed:", regionError);
46
+ return "";
47
+ }
48
+ }
49
+ /**
50
+ * GET /admin/barcode-template
51
+ * Returns raw template + contact details (legacy / preview).
52
+ */
53
+ async function GET(req, res) {
54
+ try {
55
+ const template = (0, barcode_labels_1.loadBarcodeTemplate)();
56
+ const contactDetails = await loadContactDetails(req.scope);
57
+ res.json({ template, contactDetails });
58
+ }
59
+ catch (error) {
60
+ console.error("Error reading barcode template:", error);
61
+ res.status(500).json({ error: "Failed to load barcode template" });
62
+ }
63
+ }
64
+ /**
65
+ * POST /admin/barcode-template
66
+ * Body: { items: [{ variant_id, quantity }], region_id?, print_width?, print_height? }
67
+ * or legacy { variant_ids: string[] }
68
+ * Returns ready-to-print HTML with all variables filled on the backend.
69
+ * Quantity repeats labels (unique SVG ids per copy).
70
+ */
71
+ async function POST(req, res) {
72
+ try {
73
+ const body = (0, barcode_labels_1.parseBarcodePrintBody)(req.body);
74
+ const printQueue = (0, barcode_labels_1.buildPrintQueue)(body);
75
+ if (printQueue.length === 0) {
76
+ res.status(400).json({ error: "items or variant_ids is required" });
77
+ return;
78
+ }
79
+ const uniqueVariantIds = [...new Set(printQueue)];
80
+ const printWidth = Number(body.print_width) || 2;
81
+ const printHeight = Number(body.print_height) || 60;
82
+ const template = (0, barcode_labels_1.loadBarcodeTemplate)();
83
+ const contactHtml = (0, barcode_labels_1.buildContactHtml)(await loadContactDetails(req.scope));
84
+ const regionId = await resolveRegionId(req.scope, body.region_id);
85
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
86
+ const { data: variantsRaw = [] } = await query.graph({
87
+ entity: "product_variant",
88
+ fields: VARIANT_FIELDS,
89
+ filters: { id: uniqueVariantIds },
90
+ ...(regionId
91
+ ? {
92
+ context: {
93
+ calculated_price: (0, utils_1.QueryContext)({
94
+ region_id: regionId,
95
+ currency_code: "inr",
96
+ }),
97
+ },
98
+ }
99
+ : {}),
100
+ });
101
+ const variants = (Array.isArray(variantsRaw) ? variantsRaw : []).filter(isVariantRow);
102
+ const byId = new Map(variants.map((v) => [v.id, v]));
103
+ const ordered = printQueue
104
+ .map((id) => byId.get(id))
105
+ .filter((v) => !!v);
106
+ if (ordered.length === 0) {
107
+ res.status(404).json({ error: "No variants found for the given ids" });
108
+ return;
109
+ }
110
+ const { html, count } = (0, barcode_labels_1.renderBarcodeLabelsHtml)({
111
+ template,
112
+ variants: ordered,
113
+ contactHtml,
114
+ printWidth,
115
+ printHeight,
116
+ });
117
+ res.json({
118
+ html,
119
+ count,
120
+ variants: uniqueVariantIds.length,
121
+ });
122
+ }
123
+ catch (error) {
124
+ console.error("[barcode-template] POST error:", error);
125
+ res.status(500).json({
126
+ error: error instanceof Error && error.message
127
+ ? error.message
128
+ : "Failed to build barcode print HTML",
129
+ });
130
+ }
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JhcmNvZGUtdGVtcGxhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErRkEsa0JBWUM7QUFTRCxvQkF3RUM7QUEzTEQscURBSWtDO0FBQ2xDLGtFQVNzQztBQXVCdEMsTUFBTSxjQUFjLEdBQUc7SUFDckIsSUFBSTtJQUNKLFNBQVM7SUFDVCxLQUFLO0lBQ0wsWUFBWTtJQUNaLGVBQWU7SUFDZixlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQix5QkFBeUI7SUFDekIsZ0NBQWdDO0lBQ2hDLGdDQUFnQztDQUNqQyxDQUFBO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUs7UUFDUCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLE9BQVEsS0FBMEIsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUNuRCxDQUFBO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsS0FBNkI7SUFFN0IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxvQkFBb0IsR0FDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBdUIsZ0JBQWdCLENBQUMsQ0FBQTtRQUN2RCxPQUFPLElBQUEseUNBQXdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUE7SUFDOUMsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUM1QixLQUE2QixFQUM3QixTQUFr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
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const barcode_ean13_1 = require("../../../../utils/barcode-ean13");
6
+ function readVariantIds(body) {
7
+ if (!body || typeof body !== "object")
8
+ return [];
9
+ const ids = body.variantIds;
10
+ if (!Array.isArray(ids))
11
+ return [];
12
+ return ids.filter((id) => typeof id === "string" && !!id);
13
+ }
14
+ /**
15
+ * POST /admin/barcodes/bulk-generate
16
+ * Body: { variantIds: string[] }
17
+ * Writes a deterministic SHA-256 EAN-13 barcode onto each variant.
18
+ */
19
+ const POST = async (req, res) => {
20
+ try {
21
+ const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
22
+ const variantIds = readVariantIds(req.body);
23
+ if (variantIds.length === 0) {
24
+ res.json({ success: true, message: "No variants requested.", count: 0 });
25
+ return;
26
+ }
27
+ // Fetch variant details with parent product & options relations
28
+ const variants = await productModuleService.listProductVariants({ id: variantIds }, { relations: ["product", "options", "options.option"] });
29
+ const updates = [];
30
+ for (const id of variantIds) {
31
+ const variant = variants.find((v) => v.id === id);
32
+ const barcode = (0, barcode_ean13_1.generateDeterministicBarcodeSHA256)(variant?.product?.title || "", variant?.title || "", variant?.options || [], variant?.weight, variant?.width, variant?.length, variant?.height);
33
+ updates.push({ id, barcode });
34
+ }
35
+ for (const update of updates) {
36
+ await productModuleService.updateProductVariants(update.id, {
37
+ barcode: update.barcode,
38
+ });
39
+ }
40
+ res.json({
41
+ success: true,
42
+ message: `Successfully generated SHA-256 deterministic barcodes for ${updates.length} variants.`,
43
+ count: updates.length,
44
+ });
45
+ }
46
+ catch (error) {
47
+ console.error("Bulk barcode generation error:", error);
48
+ res.status(500).json({
49
+ success: false,
50
+ message: error instanceof Error && error.message
51
+ ? error.message
52
+ : "Internal server error",
53
+ });
54
+ }
55
+ };
56
+ exports.POST = POST;
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JhcmNvZGVzL2J1bGstZ2VuZXJhdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEscURBQW1EO0FBQ25ELG1FQUd3QztBQWF4QyxTQUFTLGNBQWMsQ0FBQyxJQUFhO0lBQ25DLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2hELE1BQU0sR0FBRyxHQUFJLElBQWlDLENBQUMsVUFBVSxDQUFBO0lBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDekUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ0osRUFBRTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM1QyxlQUFPLENBQUMsT0FBTyxDQUNoQixDQUFBO1FBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3hFLE9BQU07UUFDUixDQUFDO1FBRUQsZ0VBQWdFO1FBQ2hFLE1BQU0sUUFBUSxHQUNaLE1BQU0sb0JBQW9CLENBQUMsbUJBQW1CLENBQzVDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUNsQixFQUFFLFNBQVMsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUN4RCxDQUFBO1FBRUgsTUFBTSxPQUFPLEdBQTJDLEVBQUUsQ0FBQTtRQUUxRCxLQUFLLE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBQSxrREFBa0MsRUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRSxFQUM3QixPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFDcEIsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFLEVBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQ2YsT0FBTyxFQUFFLEtBQUssRUFDZCxPQUFPLEVBQUUsTUFBTSxFQUNmLE9BQU8sRUFBRSxNQUFNLENBQ2hCLENBQUE7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDL0IsQ0FBQztRQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsTUFBTSxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87YUFDeEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSw2REFBNkQsT0FBTyxDQUFDLE1BQU0sWUFBWTtZQUNoRyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU07U0FDdEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3RELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUNMLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU87Z0JBQ3JDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztnQkFDZixDQUFDLENBQUMsdUJBQXVCO1NBQzlCLENBQUMsQ0FBQTtJQUNKLENBQUM7QUFDSCxDQUFDLENBQUE7QUEzRFksUUFBQSxJQUFJLFFBMkRoQiJ9
@@ -3,38 +3,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GET = GET;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
5
  const POSMAN_PREFIX = "POSMAN-";
6
+ function isPosManualPromotion(p) {
7
+ const code = String(p.code || "");
8
+ return code.startsWith(POSMAN_PREFIX) || p.metadata?.source === "pos_manual";
9
+ }
6
10
  /**
7
11
  * GET /admin/pos/manual-discounts
8
- * Lists POS manual-discount promotions (POSMAN-*) for POS + external UI.
9
- * Includes inactive codes (hidden from Admin active promotions).
12
+ * Lists POS manual-discount promotions (POSMAN-*) and Admin-created promo codes
13
+ * for the POS Discounts page. Includes inactive codes.
10
14
  */
11
15
  async function GET(req, res) {
12
16
  const query = (req.query || {});
13
- const limit = Math.min(Math.max(Number(query.limit) || 50, 1), 100);
17
+ const limit = Math.min(Math.max(Number(query.limit) || 50, 1), 200);
14
18
  const offset = Math.max(Number(query.offset) || 0, 0);
15
19
  const q = (query.q || "").trim().toLowerCase();
16
20
  try {
17
21
  const promotionModule = req.scope.resolve(utils_1.Modules.PROMOTION);
18
- // Fetch a window of promotions; filter POSMAN in-process (prefix match).
19
- const take = Math.min(offset + limit + 200, 500);
20
- const [rows] = await promotionModule.listAndCountPromotions({}, {
21
- take,
22
- skip: 0,
22
+ const config = {
23
23
  order: { created_at: "DESC" },
24
24
  relations: ["application_method"],
25
- });
26
- let manual = (rows || []).filter((p) => {
27
- const code = String(p.code || "");
28
- const source = p.metadata?.source;
29
- return code.startsWith(POSMAN_PREFIX) || source === "pos_manual";
25
+ };
26
+ // POSMAN codes are created per sale, so Admin promos are queried separately
27
+ // to keep them from being pushed out of the POSMAN window.
28
+ const take = Math.min(offset + limit + 200, 500);
29
+ const [manualRows, adminRows] = await Promise.all([
30
+ promotionModule.listPromotions({}, { ...config, take, skip: 0 }),
31
+ promotionModule.listPromotions({ code: { $not: { $like: `${POSMAN_PREFIX}%` } } }, { ...config, take: 500, skip: 0 }),
32
+ ]);
33
+ const manual = (manualRows || []).filter(isPosManualPromotion);
34
+ const admin = (adminRows || []).filter((p) => !isPosManualPromotion(p));
35
+ let combined = [...manual, ...admin].sort((a, b) => {
36
+ const at = new Date(a.created_at ?? 0).getTime();
37
+ const bt = new Date(b.created_at ?? 0).getTime();
38
+ return bt - at;
30
39
  });
31
40
  if (q) {
32
- manual = manual.filter((p) => {
41
+ combined = combined.filter((p) => {
33
42
  const hay = [
34
43
  p.code,
35
44
  p.metadata?.draft_order_id,
36
45
  p.metadata?.applied_by,
37
46
  String(p.metadata?.amount ?? ""),
47
+ String(p.application_method?.value ?? ""),
38
48
  ]
39
49
  .filter(Boolean)
40
50
  .join(" ")
@@ -42,23 +52,32 @@ async function GET(req, res) {
42
52
  return hay.includes(q);
43
53
  });
44
54
  }
45
- const count = manual.length;
46
- const page = manual.slice(offset, offset + limit).map((p) => ({
47
- id: p.id,
48
- code: p.code,
49
- status: p.status,
50
- amount: p.metadata?.amount ??
51
- p.application_method?.value ??
52
- null,
53
- currency_code: p.metadata?.currency_code ??
54
- p.application_method?.currency_code ??
55
- null,
56
- draft_order_id: p.metadata?.draft_order_id ?? null,
57
- applied_by: p.metadata?.applied_by ?? null,
58
- applied_at: p.metadata?.applied_at ?? p.created_at ?? null,
59
- created_at: p.created_at ?? null,
60
- metadata: p.metadata ?? null,
61
- }));
55
+ const count = combined.length;
56
+ const page = combined.slice(offset, offset + limit).map((p) => {
57
+ const posManual = isPosManualPromotion(p);
58
+ const method = p.application_method;
59
+ const methodType = method?.type === "percentage" ? "percentage" : method?.type === "fixed" ? "fixed" : null;
60
+ return {
61
+ id: p.id,
62
+ code: p.code,
63
+ status: p.status,
64
+ origin: posManual ? "pos_manual" : "admin",
65
+ // Admin percentage promos have no rupee amount until applied to a cart.
66
+ amount: posManual
67
+ ? p.metadata?.amount ?? method?.value ?? null
68
+ : methodType === "fixed"
69
+ ? method?.value ?? null
70
+ : null,
71
+ discount_type: posManual ? p.metadata?.discount_type ?? null : methodType,
72
+ discount_value: posManual ? p.metadata?.discount_value ?? null : method?.value ?? null,
73
+ currency_code: p.metadata?.currency_code ?? method?.currency_code ?? null,
74
+ draft_order_id: p.metadata?.draft_order_id ?? null,
75
+ applied_by: posManual ? p.metadata?.applied_by ?? null : "admin",
76
+ applied_at: posManual ? p.metadata?.applied_at ?? p.created_at ?? null : p.created_at ?? null,
77
+ created_at: p.created_at ?? null,
78
+ metadata: p.metadata ?? null,
79
+ };
80
+ });
62
81
  res.json({
63
82
  manual_discounts: page,
64
83
  count,
@@ -73,4 +92,4 @@ async function GET(req, res) {
73
92
  });
74
93
  }
75
94
  }
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9tYW51YWwtZGlzY291bnRzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0JBLGtCQStFQztBQTlGRCxxREFBbUQ7QUFFbkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBUS9COzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBYyxDQUFBO0lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUU5QyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUsxRCxDQUFBO1FBRUQseUVBQXlFO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sZUFBZSxDQUFDLHNCQUFzQixDQUN6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
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9tYW51YWwtZGlzY291bnRzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUJBLGtCQWdHQztBQXRIRCxxREFBbUQ7QUFFbkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBVS9CLFNBQVMsb0JBQW9CLENBQUMsQ0FBZTtJQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssWUFBWSxDQUFBO0FBQzlFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQWMsQ0FBQTtJQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFOUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFNBQVMsQ0FLMUQsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHO1lBQ2IsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTtZQUM3QixTQUFTLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztTQUNsQyxDQUFBO1FBRUQsNEVBQTRFO1FBQzVFLDJEQUEyRDtRQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ2hELE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hELGVBQWUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoRSxlQUFlLENBQUMsY0FBYyxDQUM1QixFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLGFBQWEsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUNsRCxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUNsQztTQUNGLENBQUMsQ0FBQTtRQUVGLE1BQU0sTUFBTSxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQzlELE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXZFLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNoRCxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDTixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMvQixNQUFNLEdBQUcsR0FBRztvQkFDVixDQUFDLENBQUMsSUFBSTtvQkFDTixDQUFDLENBQUMsUUFBUSxFQUFFLGNBQWM7b0JBQzFCLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVTtvQkFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2lCQUMxQztxQkFDRSxNQUFNLENBQUMsT0FBTyxDQUFDO3FCQUNmLElBQUksQ0FBQyxHQUFHLENBQUM7cUJBQ1QsV0FBVyxFQUFFLENBQUE7Z0JBQ2hCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN4QixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFBO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN6QyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUE7WUFDbkMsTUFBTSxVQUFVLEdBQ2QsTUFBTSxFQUFFLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBRTFGLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQ2hCLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTztnQkFDMUMsd0VBQXdFO2dCQUN4RSxNQUFNLEVBQUUsU0FBUztvQkFDZixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJO29CQUM3QyxDQUFDLENBQUMsVUFBVSxLQUFLLE9BQU87d0JBQ3RCLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUk7d0JBQ3ZCLENBQUMsQ0FBQyxJQUFJO2dCQUNWLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtnQkFDekUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUk7Z0JBQ3RGLGFBQWEsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLGFBQWEsSUFBSSxNQUFNLEVBQUUsYUFBYSxJQUFJLElBQUk7Z0JBQ3pFLGNBQWMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLGNBQWMsSUFBSSxJQUFJO2dCQUNsRCxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQ2hFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUk7Z0JBQzdGLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUk7Z0JBQ2hDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUk7YUFDN0IsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsS0FBSztZQUNMLEtBQUs7WUFDTCxNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6RCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxpQ0FBaUM7U0FDN0QsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const zod_1 = require("zod");
5
+ const pos_setup_1 = require("../../../../utils/pos-setup");
6
+ const bodySchema = zod_1.z
7
+ .object({
8
+ stock_location_id: zod_1.z.string().min(1).optional(),
9
+ sales_channel_id: zod_1.z.string().min(1).optional(),
10
+ region_id: zod_1.z.string().min(1).optional(),
11
+ include_all_products: zod_1.z.boolean().optional(),
12
+ })
13
+ .strict();
14
+ async function POST(req, res) {
15
+ const parsed = bodySchema.safeParse(req.body ?? {});
16
+ if (!parsed.success) {
17
+ res.status(400).json({
18
+ message: parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "),
19
+ type: "INVALID_DATA",
20
+ });
21
+ return;
22
+ }
23
+ try {
24
+ const result = await (0, pos_setup_1.runPosSetup)(req.scope, parsed.data);
25
+ res.status(200).json(result);
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : "POS setup failed";
29
+ res.status(message.endsWith("not found") ? 400 : 500).json({ message, type: "POS_SETUP_FAILED" });
30
+ }
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9zZXR1cC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9CQSxvQkFpQkM7QUE3QkQsNkJBQXVCO0FBQ3ZCLDJEQUF5RDtBQUV6RCxNQUFNLFVBQVUsR0FBRyxPQUFDO0tBQ2pCLE1BQU0sQ0FBQztJQUNOLGlCQUFpQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQy9DLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlDLFNBQVMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUN2QyxvQkFBb0IsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdDLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQTtBQUVKLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7SUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkYsSUFBSSxFQUFFLGNBQWM7U0FDckIsQ0FBQyxDQUFBO1FBQ0YsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsdUJBQVcsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4RCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQTtRQUMzRSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUE7SUFDbkcsQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateDeterministicBarcodeSHA256 = generateDeterministicBarcodeSHA256;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ /**
9
+ * Deterministic EAN-13 Barcode Generator using SHA-256 Hashing.
10
+ * Format: Product Title|Variant Title|Color=White|Size=3-4Y|Weight=200|Width=20|Length=30|Height=2
11
+ *
12
+ * Algorithm Pipeline:
13
+ * Fixed Input String -> SHA-256 -> Numeric Conversion -> 12-Digit Base -> EAN-13 Check Digit -> Final 13-Digit Barcode
14
+ *
15
+ * Output must stay stable: printed labels already carry these values.
16
+ */
17
+ function generateDeterministicBarcodeSHA256(productTitle, variantTitle, options, weight, width, length, height, prefix = "200" // Standard 3-digit in-store retail prefix
18
+ ) {
19
+ const parts = [];
20
+ const pTitle = (productTitle || "").trim();
21
+ if (pTitle)
22
+ parts.push(pTitle);
23
+ const vTitle = (variantTitle || "").trim();
24
+ if (vTitle)
25
+ parts.push(vTitle);
26
+ // Append option attributes (e.g. Color=White|Size=3-4Y)
27
+ if (Array.isArray(options)) {
28
+ options.forEach((opt) => {
29
+ const optTitle = (opt?.option?.title || "").trim();
30
+ const optVal = (opt?.value || "").trim();
31
+ if (optTitle && optVal) {
32
+ parts.push(`${optTitle}=${optVal}`);
33
+ }
34
+ else if (optVal) {
35
+ parts.push(optVal);
36
+ }
37
+ });
38
+ }
39
+ // Append physical attributes if present
40
+ if (weight != null && !isNaN(Number(weight)))
41
+ parts.push(`Weight=${weight}`);
42
+ if (width != null && !isNaN(Number(width)))
43
+ parts.push(`Width=${width}`);
44
+ if (length != null && !isNaN(Number(length)))
45
+ parts.push(`Length=${length}`);
46
+ if (height != null && !isNaN(Number(height)))
47
+ parts.push(`Height=${height}`);
48
+ const inputString = parts.join("|");
49
+ // Step 1: Compute SHA-256 Hash
50
+ const sha256Hex = crypto_1.default.createHash("sha256").update(inputString).digest("hex");
51
+ // Step 2: Convert SHA-256 hash slice to 9-digit numeric payload
52
+ const numericVal = BigInt("0x" + sha256Hex.slice(0, 15));
53
+ const payload9Digits = String(numericVal % 1000000000n).padStart(9, "0");
54
+ // Step 3: Create 12-digit base number (3-digit prefix + 9-digit payload)
55
+ const base12 = `${prefix}${payload9Digits}`;
56
+ // Step 4: Calculate EAN-13 Check Digit
57
+ let sum = 0;
58
+ for (let i = 0; i < 12; i++) {
59
+ const digit = parseInt(base12.charAt(i), 10);
60
+ sum += i % 2 === 0 ? digit : digit * 3;
61
+ }
62
+ const checkDigit = (10 - (sum % 10)) % 10;
63
+ // Step 5: Final 13-digit EAN-13 Barcode
64
+ return `${base12}${checkDigit}`;
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyY29kZS1lYW4xMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9iYXJjb2RlLWVhbjEzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JBLGdGQTJEQztBQTNFRCxvREFBMkI7QUFPM0I7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixrQ0FBa0MsQ0FDaEQsWUFBb0IsRUFDcEIsWUFBb0IsRUFDcEIsT0FBdUMsRUFDdkMsTUFBc0IsRUFDdEIsS0FBcUIsRUFDckIsTUFBc0IsRUFDdEIsTUFBc0IsRUFDdEIsTUFBTSxHQUFHLEtBQUssQ0FBQywwQ0FBMEM7O0lBRXpELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixNQUFNLE1BQU0sR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMxQyxJQUFJLE1BQU07UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTlCLE1BQU0sTUFBTSxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzFDLElBQUksTUFBTTtRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFOUIsd0RBQXdEO0lBQ3hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2xELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN4QyxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztn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