medusa-product-helper 0.0.22 → 0.0.23
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,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const validators_1 = require("./validators");
|
|
6
|
+
/**
|
|
7
|
+
* GET /store/product-helper/inventory
|
|
8
|
+
*
|
|
9
|
+
* Returns product inventory levels (per variant) and pending order counts.
|
|
10
|
+
*
|
|
11
|
+
* Query parameters:
|
|
12
|
+
* - stock_only (boolean): If true, only return inventory data
|
|
13
|
+
* - order_only (boolean): If true, only return order counts
|
|
14
|
+
* - product_id (string[]): Filter by specific product IDs
|
|
15
|
+
* - limit (number): Pagination limit (default: 50)
|
|
16
|
+
* - offset (number): Pagination offset (default: 0)
|
|
17
|
+
*
|
|
18
|
+
* Note: Order counts are based on orders with status "pending".
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```bash
|
|
22
|
+
* # Get both inventory and order counts
|
|
23
|
+
* GET /store/product-helper/inventory
|
|
24
|
+
*
|
|
25
|
+
* # Get only inventory
|
|
26
|
+
* GET /store/product-helper/inventory?stock_only=true
|
|
27
|
+
*
|
|
28
|
+
* # Get only order counts
|
|
29
|
+
* GET /store/product-helper/inventory?order_only=true
|
|
30
|
+
*
|
|
31
|
+
* # Filter by product IDs
|
|
32
|
+
* GET /store/product-helper/inventory?product_id=prod_123,prod_456
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
const GET = async (req, res) => {
|
|
36
|
+
try {
|
|
37
|
+
// Validate query parameters
|
|
38
|
+
const validatedQuery = validators_1.InventoryQuerySchema.parse(req.query);
|
|
39
|
+
const { stock_only, order_only, product_id, limit, offset } = validatedQuery;
|
|
40
|
+
// Resolve query service
|
|
41
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
42
|
+
// Determine what data to fetch
|
|
43
|
+
const fetchInventory = !order_only || stock_only;
|
|
44
|
+
const fetchOrders = !stock_only || order_only;
|
|
45
|
+
// Build product filters
|
|
46
|
+
const productFilters = {};
|
|
47
|
+
if (product_id && product_id.length > 0) {
|
|
48
|
+
productFilters.id = product_id;
|
|
49
|
+
}
|
|
50
|
+
// Fetch products with variants
|
|
51
|
+
// Note: We fetch all products first (without pagination) to get accurate inventory/order data
|
|
52
|
+
// Then apply pagination to the final results
|
|
53
|
+
const { data: allProducts = [] } = await query.graph({
|
|
54
|
+
entity: "product",
|
|
55
|
+
fields: ["id", "title", "variants.id", "variants.title"],
|
|
56
|
+
filters: productFilters,
|
|
57
|
+
});
|
|
58
|
+
// If we only need orders, we'll filter products later based on which ones have orders
|
|
59
|
+
const products = allProducts;
|
|
60
|
+
// Build product map for quick lookup
|
|
61
|
+
// Initialize all products with ALL their variants (with 0 quantity initially)
|
|
62
|
+
// This ensures all variants are in the response, even if they don't have inventory items
|
|
63
|
+
const productMap = new Map();
|
|
64
|
+
for (const product of products) {
|
|
65
|
+
const productData = product;
|
|
66
|
+
// Initialize variants array with all variants from the product (with 0 quantity)
|
|
67
|
+
const variants = [];
|
|
68
|
+
if (productData.variants && Array.isArray(productData.variants)) {
|
|
69
|
+
for (const variant of productData.variants) {
|
|
70
|
+
if (variant.id) {
|
|
71
|
+
variants.push({
|
|
72
|
+
variant_id: variant.id,
|
|
73
|
+
variant_title: variant.title || "Default Variant",
|
|
74
|
+
inventory_quantity: 0, // Initialize with 0, will be updated if inventory exists
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Calculate total inventory quantity (sum of all variants)
|
|
80
|
+
const totalInventoryQuantity = variants.reduce((sum, variant) => sum + variant.inventory_quantity, 0);
|
|
81
|
+
productMap.set(productData.id, {
|
|
82
|
+
product_id: productData.id,
|
|
83
|
+
product_title: productData.title || "Unknown Product",
|
|
84
|
+
variants, // All variants initialized with 0 quantity
|
|
85
|
+
total_inventory_quantity: totalInventoryQuantity, // Sum of all variant inventory quantities
|
|
86
|
+
confirmed_order_count: 0, // Initialize with 0, will be updated if orders exist
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Fetch inventory data if needed
|
|
90
|
+
if (fetchInventory) {
|
|
91
|
+
// Query inventory items with variant relationships
|
|
92
|
+
const { data: inventoryItems = [] } = await query.graph({
|
|
93
|
+
entity: "inventory_item",
|
|
94
|
+
fields: [
|
|
95
|
+
"id",
|
|
96
|
+
"variants.id",
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
// Create map of variant_id -> inventory_item_id
|
|
100
|
+
const variantToInventoryItem = new Map();
|
|
101
|
+
for (const inventoryItem of inventoryItems) {
|
|
102
|
+
const item = inventoryItem;
|
|
103
|
+
if (item.variants && Array.isArray(item.variants)) {
|
|
104
|
+
for (const variant of item.variants) {
|
|
105
|
+
if (variant.id) {
|
|
106
|
+
variantToInventoryItem.set(variant.id, item.id);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Query location levels for all inventory items
|
|
112
|
+
const inventoryItemIds = Array.from(new Set(variantToInventoryItem.values()));
|
|
113
|
+
if (inventoryItemIds.length > 0) {
|
|
114
|
+
// Try to get location levels via inventory service first
|
|
115
|
+
try {
|
|
116
|
+
const { Modules } = await import("@medusajs/framework/utils");
|
|
117
|
+
const inventoryService = req.scope.resolve(Modules.INVENTORY);
|
|
118
|
+
if (inventoryService?.listInventoryLevels) {
|
|
119
|
+
const locationLevels = await inventoryService.listInventoryLevels({
|
|
120
|
+
inventory_item_id: inventoryItemIds,
|
|
121
|
+
});
|
|
122
|
+
// Aggregate inventory per inventory item
|
|
123
|
+
const inventoryItemQuantityMap = new Map();
|
|
124
|
+
for (const level of locationLevels || []) {
|
|
125
|
+
const current = inventoryItemQuantityMap.get(level.inventory_item_id) || 0;
|
|
126
|
+
inventoryItemQuantityMap.set(level.inventory_item_id, current + (level.available_quantity || 0));
|
|
127
|
+
}
|
|
128
|
+
// Map inventory quantities to variants
|
|
129
|
+
// Update existing variants with actual inventory quantities
|
|
130
|
+
for (const [variantId, inventoryItemId] of variantToInventoryItem) {
|
|
131
|
+
const quantity = inventoryItemQuantityMap.get(inventoryItemId) || 0;
|
|
132
|
+
// Find which product this variant belongs to and update the variant
|
|
133
|
+
for (const product of products) {
|
|
134
|
+
const productData = product;
|
|
135
|
+
if (productData.variants) {
|
|
136
|
+
const variant = productData.variants.find((v) => v.id === variantId);
|
|
137
|
+
if (variant) {
|
|
138
|
+
const productEntry = productMap.get(productData.id);
|
|
139
|
+
if (productEntry && productEntry.variants) {
|
|
140
|
+
// Find and update the existing variant instead of adding a new one
|
|
141
|
+
const existingVariant = productEntry.variants.find((v) => v.variant_id === variantId);
|
|
142
|
+
if (existingVariant) {
|
|
143
|
+
existingVariant.inventory_quantity = quantity;
|
|
144
|
+
// Recalculate total inventory quantity for this product
|
|
145
|
+
productEntry.total_inventory_quantity = productEntry.variants.reduce((sum, v) => sum + v.inventory_quantity, 0);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
// Fallback: Query location levels via graph query
|
|
157
|
+
const { data: itemsWithLevels = [] } = await query.graph({
|
|
158
|
+
entity: "inventory_item",
|
|
159
|
+
fields: [
|
|
160
|
+
"id",
|
|
161
|
+
"location_levels.available_quantity",
|
|
162
|
+
],
|
|
163
|
+
filters: { id: inventoryItemIds },
|
|
164
|
+
});
|
|
165
|
+
// Aggregate inventory per inventory item
|
|
166
|
+
const inventoryItemQuantityMap = new Map();
|
|
167
|
+
for (const item of itemsWithLevels) {
|
|
168
|
+
const itemData = item;
|
|
169
|
+
if (itemData.location_levels && Array.isArray(itemData.location_levels)) {
|
|
170
|
+
const totalQuantity = itemData.location_levels.reduce((sum, level) => sum + (level.available_quantity || 0), 0);
|
|
171
|
+
inventoryItemQuantityMap.set(itemData.id, totalQuantity);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Map inventory quantities to variants
|
|
175
|
+
// Update existing variants with actual inventory quantities
|
|
176
|
+
for (const [variantId, inventoryItemId] of variantToInventoryItem) {
|
|
177
|
+
const quantity = inventoryItemQuantityMap.get(inventoryItemId) || 0;
|
|
178
|
+
// Find which product this variant belongs to and update the variant
|
|
179
|
+
for (const product of products) {
|
|
180
|
+
const productData = product;
|
|
181
|
+
if (productData.variants) {
|
|
182
|
+
const variant = productData.variants.find((v) => v.id === variantId);
|
|
183
|
+
if (variant) {
|
|
184
|
+
const productEntry = productMap.get(productData.id);
|
|
185
|
+
if (productEntry && productEntry.variants) {
|
|
186
|
+
// Find and update the existing variant instead of adding a new one
|
|
187
|
+
const existingVariant = productEntry.variants.find((v) => v.variant_id === variantId);
|
|
188
|
+
if (existingVariant) {
|
|
189
|
+
existingVariant.inventory_quantity = quantity;
|
|
190
|
+
// Recalculate total inventory quantity for this product
|
|
191
|
+
productEntry.total_inventory_quantity = productEntry.variants.reduce((sum, v) => sum + v.inventory_quantity, 0);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Fetch pending order counts if needed
|
|
203
|
+
if (fetchOrders) {
|
|
204
|
+
// Query pending orders with items (using OrderStatus enum)
|
|
205
|
+
const { data: orders = [] } = await query.graph({
|
|
206
|
+
entity: "order",
|
|
207
|
+
fields: ["id", "items.variant_id"],
|
|
208
|
+
filters: { status: utils_1.OrderStatus.PENDING },
|
|
209
|
+
});
|
|
210
|
+
// Get all variant IDs from order items
|
|
211
|
+
const variantIds = new Set();
|
|
212
|
+
for (const order of orders) {
|
|
213
|
+
const orderData = order;
|
|
214
|
+
if (orderData.items && Array.isArray(orderData.items)) {
|
|
215
|
+
for (const item of orderData.items) {
|
|
216
|
+
if (item.variant_id) {
|
|
217
|
+
variantIds.add(item.variant_id);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Query variants to get product_id mapping
|
|
223
|
+
const variantIdsArray = Array.from(variantIds);
|
|
224
|
+
const variantToProductMap = new Map();
|
|
225
|
+
if (variantIdsArray.length > 0) {
|
|
226
|
+
const { data: variants = [] } = await query.graph({
|
|
227
|
+
entity: "product_variant",
|
|
228
|
+
fields: ["id", "product_id"],
|
|
229
|
+
filters: { id: variantIdsArray },
|
|
230
|
+
});
|
|
231
|
+
for (const variant of variants) {
|
|
232
|
+
const variantData = variant;
|
|
233
|
+
if (variantData.product_id) {
|
|
234
|
+
variantToProductMap.set(variantData.id, variantData.product_id);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Count pending orders per product
|
|
239
|
+
const productOrderCountMap = new Map();
|
|
240
|
+
for (const order of orders) {
|
|
241
|
+
const orderData = order;
|
|
242
|
+
if (orderData.items && Array.isArray(orderData.items)) {
|
|
243
|
+
const productIdsInOrder = new Set();
|
|
244
|
+
for (const item of orderData.items) {
|
|
245
|
+
if (item.variant_id) {
|
|
246
|
+
const productId = variantToProductMap.get(item.variant_id);
|
|
247
|
+
if (productId) {
|
|
248
|
+
productIdsInOrder.add(productId);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Count this order once per unique product
|
|
253
|
+
for (const productId of productIdsInOrder) {
|
|
254
|
+
const current = productOrderCountMap.get(productId) || 0;
|
|
255
|
+
productOrderCountMap.set(productId, current + 1);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Add pending order counts to product map
|
|
260
|
+
for (const [productId, count] of productOrderCountMap) {
|
|
261
|
+
const productEntry = productMap.get(productId);
|
|
262
|
+
if (productEntry) {
|
|
263
|
+
productEntry.confirmed_order_count = count;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Recalculate total inventory quantity for all products (in case any were missed)
|
|
268
|
+
for (const productEntry of productMap.values()) {
|
|
269
|
+
if (productEntry.variants && productEntry.variants.length > 0) {
|
|
270
|
+
productEntry.total_inventory_quantity = productEntry.variants.reduce((sum, variant) => sum + variant.inventory_quantity, 0);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
productEntry.total_inventory_quantity = 0;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Convert map to array and filter based on query params
|
|
277
|
+
let resultProducts = Array.from(productMap.values());
|
|
278
|
+
// Note: We don't filter out products without variants anymore
|
|
279
|
+
// Products without variants will still show with empty variants array
|
|
280
|
+
// and will show order counts if they have any
|
|
281
|
+
// If order_only, only show products that have order counts
|
|
282
|
+
if (order_only && !stock_only) {
|
|
283
|
+
resultProducts = resultProducts.filter((p) => p.confirmed_order_count !== undefined && p.confirmed_order_count > 0);
|
|
284
|
+
}
|
|
285
|
+
// Get total count before pagination (for pagination metadata)
|
|
286
|
+
const totalCount = resultProducts.length;
|
|
287
|
+
// Apply pagination to final results
|
|
288
|
+
const paginatedProducts = resultProducts.slice(offset, offset + limit);
|
|
289
|
+
const response = {
|
|
290
|
+
products: paginatedProducts,
|
|
291
|
+
count: totalCount,
|
|
292
|
+
offset,
|
|
293
|
+
limit,
|
|
294
|
+
};
|
|
295
|
+
res.json(response);
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
// Handle validation errors
|
|
299
|
+
if (error && typeof error === "object" && "issues" in error) {
|
|
300
|
+
res.status(400).json({
|
|
301
|
+
message: "Invalid query parameters",
|
|
302
|
+
errors: error.issues,
|
|
303
|
+
products: [],
|
|
304
|
+
count: 0,
|
|
305
|
+
offset: 0,
|
|
306
|
+
limit: 50,
|
|
307
|
+
});
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// Handle other errors
|
|
311
|
+
const errorMessage = error instanceof Error ? error.message : "Internal server error";
|
|
312
|
+
res.status(500).json({
|
|
313
|
+
message: errorMessage,
|
|
314
|
+
products: [],
|
|
315
|
+
count: 0,
|
|
316
|
+
offset: 0,
|
|
317
|
+
limit: 50,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
exports.GET = GET;
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3Byb2R1Y3QtaGVscGVyL2ludmVudG9yeS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBa0Y7QUFFbEYsNkNBQXdFO0FBdUJ4RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBc0MsRUFDdEMsRUFBRTtJQUNGLElBQUksQ0FBQztRQUNILDRCQUE0QjtRQUM1QixNQUFNLGNBQWMsR0FBRyxpQ0FBb0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTVELE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFBO1FBRTVFLHdCQUF3QjtRQUN4QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBUSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV2RSwrQkFBK0I7UUFDL0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFBO1FBQ2hELE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQTtRQUU3Qyx3QkFBd0I7UUFDeEIsTUFBTSxjQUFjLEdBQTRCLEVBQUUsQ0FBQTtRQUNsRCxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLGNBQWMsQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFBO1FBQ2hDLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsOEZBQThGO1FBQzlGLDZDQUE2QztRQUM3QyxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsR0FBRyxFQUFFLEVBQUUsR0FBRyxNQUFNLEtBQUss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
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InventoryQuerySchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const booleanish = zod_1.z
|
|
6
|
+
.union([zod_1.z.boolean(), zod_1.z.string(), zod_1.z.number()])
|
|
7
|
+
.optional()
|
|
8
|
+
.transform((value) => {
|
|
9
|
+
if (typeof value === "boolean") {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
if (typeof value === "number") {
|
|
13
|
+
return value !== 0;
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === "string") {
|
|
16
|
+
const normalized = value.trim().toLowerCase();
|
|
17
|
+
if (["true", "1", "yes", "y"].includes(normalized)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
if (["false", "0", "no", "n"].includes(normalized)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
});
|
|
26
|
+
const positiveInt = zod_1.z
|
|
27
|
+
.union([zod_1.z.string(), zod_1.z.number()])
|
|
28
|
+
.default(50)
|
|
29
|
+
.transform((value) => {
|
|
30
|
+
const parsed = Number(value);
|
|
31
|
+
if (Number.isNaN(parsed) || parsed <= 0) {
|
|
32
|
+
return 50;
|
|
33
|
+
}
|
|
34
|
+
return Math.floor(parsed);
|
|
35
|
+
});
|
|
36
|
+
const nonNegativeInt = zod_1.z
|
|
37
|
+
.union([zod_1.z.string(), zod_1.z.number()])
|
|
38
|
+
.default(0)
|
|
39
|
+
.transform((value) => {
|
|
40
|
+
const parsed = Number(value);
|
|
41
|
+
if (Number.isNaN(parsed) || parsed < 0) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
return Math.floor(parsed);
|
|
45
|
+
});
|
|
46
|
+
const stringArray = zod_1.z
|
|
47
|
+
.union([
|
|
48
|
+
zod_1.z.string().transform((value) => value
|
|
49
|
+
.split(",")
|
|
50
|
+
.map((entry) => entry.trim())
|
|
51
|
+
.filter(Boolean)),
|
|
52
|
+
zod_1.z.array(zod_1.z.string()),
|
|
53
|
+
])
|
|
54
|
+
.optional()
|
|
55
|
+
.transform((value) => (Array.isArray(value) ? value : []));
|
|
56
|
+
exports.InventoryQuerySchema = zod_1.z.object({
|
|
57
|
+
stock_only: booleanish,
|
|
58
|
+
order_only: booleanish,
|
|
59
|
+
product_id: stringArray,
|
|
60
|
+
limit: positiveInt,
|
|
61
|
+
offset: nonNegativeInt,
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvcHJvZHVjdC1oZWxwZXIvaW52ZW50b3J5L3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXVCO0FBRXZCLE1BQU0sVUFBVSxHQUFHLE9BQUM7S0FDakIsS0FBSyxDQUFDLENBQUMsT0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUM1QyxRQUFRLEVBQUU7S0FDVixTQUFTLENBQUMsQ0FBQyxLQUE0QyxFQUFFLEVBQUU7SUFDMUQsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvQixPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyxDQUFDLENBQUE7QUFFSixNQUFNLFdBQVcsR0FBRyxPQUFDO0tBQ2xCLEtBQUssQ0FBQyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUMvQixPQUFPLENBQUMsRUFBRSxDQUFDO0tBQ1gsU0FBUyxDQUFDLENBQUMsS0FBc0IsRUFBRSxFQUFFO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUMsQ0FBQTtBQUVKLE1BQU0sY0FBYyxHQUFHLE9BQUM7S0FDckIsS0FBSyxDQUFDLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQy9CLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDVixTQUFTLENBQUMsQ0FBQyxLQUFzQixFQUFFLEVBQUU7SUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzVCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkMsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzNCLENBQUMsQ0FBQyxDQUFBO0FBRUosTUFBTSxXQUFXLEdBQUcsT0FBQztLQUNsQixLQUFLLENBQUM7SUFDTCxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDckMsS0FBSztTQUNGLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQ25CO0lBQ0QsT0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDcEIsQ0FBQztLQUNELFFBQVEsRUFBRTtLQUNWLFNBQVMsQ0FBQyxDQUFDLEtBQW9DLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBRTlFLFFBQUEsb0JBQW9CLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQyxVQUFVLEVBQUUsVUFBVTtJQUN0QixVQUFVLEVBQUUsVUFBVTtJQUN0QixVQUFVLEVBQUUsV0FBVztJQUN2QixLQUFLLEVBQUUsV0FBVztJQUNsQixNQUFNLEVBQUUsY0FBYztDQUN2QixDQUFDLENBQUEifQ==
|