From 04ec5bf3aa412baaf149a8af3f33ff526c6d90cf Mon Sep 17 00:00:00 2001 From: Bruno Fargnoli Date: Mon, 19 Jan 2026 20:01:59 +0100 Subject: [PATCH] trying to fix "vertical lines" bug + Updated Cumesh --- nodes.py | 290 +++++++++++++++--- .../cumesh-0.0.1-cp312-cp312-linux_x86_64.whl | Bin 15059746 -> 15059768 bytes .../cumesh-0.0.1-cp312-cp312-linux_x86_64.whl | Bin 3926770 -> 3926792 bytes .../cumesh-0.0.1-cp311-cp311-win_amd64.whl | Bin 3336344 -> 3336366 bytes .../cumesh-0.0.1-cp312-cp312-win_amd64.whl | Bin 3333129 -> 3333151 bytes .../cumesh-0.0.1-cp311-cp311-win_amd64.whl | Bin 3336341 -> 3336363 bytes .../cumesh-0.0.1-cp312-cp312-win_amd64.whl | Bin 3333173 -> 3333195 bytes 7 files changed, 253 insertions(+), 37 deletions(-) diff --git a/nodes.py b/nodes.py index b7eedf9..fc65500 100644 --- a/nodes.py +++ b/nodes.py @@ -136,6 +136,34 @@ def remove_floater(mesh): mesh.faces = new_faces return mesh + +def remove_mesh_infinite_vertices(mesh): + print('Removing infinite vertices ...') + vertices = mesh.vertices.cpu().numpy() + faces = mesh.faces.cpu().numpy() + + trimesh = Trimesh.Trimesh(vertices=vertices,faces=faces) + print(f"Original vertex count: {len(trimesh.vertices)}") + + # Remove anything outside a reasonable bounding box + limit = 1e10 + valid_mask = (np.abs(trimesh.vertices) < limit).all(axis=1) + + trimesh.update_vertices(valid_mask) + + # Removing vertices can leave "degenerate" faces or orphan nodes + trimesh.remove_degenerate_faces() + trimesh.remove_unreferenced_vertices() + + print(f"Cleaned vertex count: {len(trimesh.vertices)}") + + new_vertices = torch.from_numpy(trimesh.vertices).float() + new_faces = torch.from_numpy(trimesh.faces).int() + + mesh.vertices = new_vertices + mesh.faces = new_faces + + return mesh def pymeshlab_remove_floater(mesh: pymeshlab.MeshSet): mesh.apply_filter("compute_selection_by_small_disconnected_components_per_face", @@ -430,6 +458,7 @@ class Trellis2MeshWithVoxelToTrimesh: return { "required": { "mesh": ("MESHWITHVOXEL",), + "reorient_vertices":(["None","90 degrees","-90 degrees"],{"default":"90 degrees"}), }, } @@ -439,9 +468,13 @@ class Trellis2MeshWithVoxelToTrimesh: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh): + def process(self, mesh, reorient_vertices): vertices_np = mesh.vertices.cpu().numpy() - vertices_np[:, 1], vertices_np[:, 2] = vertices_np[:, 2], -vertices_np[:, 1] + + if reorient_vertices == '90 degrees': + vertices_np[:, 1], vertices_np[:, 2] = vertices_np[:, 2], -vertices_np[:, 1] + elif reorient_vertices == '-90 degrees': + vertices_np[:, 1], vertices_np[:, 2] = -vertices_np[:, 2], vertices_np[:, 1] trimesh = Trimesh.Trimesh( vertices=vertices_np, @@ -500,6 +533,7 @@ class Trellis2PostProcessMesh: "remove_small_connected_components_size": ("FLOAT", {"default":0.00001,"min":0.00001,"max":9.99999,"step":0.00001}), "unify_faces_orientation": ("BOOLEAN", {"default":True}), "remove_floaters": ("BOOLEAN",{"default":True}), + "remove_infinite_vertices": ("BOOLEAN",{"default":True}), }, } @@ -509,11 +543,13 @@ class Trellis2PostProcessMesh: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, fill_holes, fill_holes_max_perimeter, remove_duplicate_faces, repair_non_manifold_edges, remove_non_manifold_faces, remove_small_connected_components, remove_small_connected_components_size,unify_faces_orientation,remove_floaters): + def process(self, mesh, fill_holes, fill_holes_max_perimeter, remove_duplicate_faces, repair_non_manifold_edges, remove_non_manifold_faces, remove_small_connected_components, remove_small_connected_components_size,unify_faces_orientation,remove_floaters,remove_infinite_vertices): mesh_copy = copy.deepcopy(mesh) if remove_floaters: mesh_copy = remove_floater(mesh_copy) + if remove_infinite_vertices: + mesh_copy = remove_mesh_infinite_vertices(mesh_copy) vertices = mesh_copy.vertices faces = mesh_copy.faces @@ -577,6 +613,8 @@ class Trellis2UnWrapAndRasterizer: "texture_size": ("INT",{"default":1024, "min":512, "max":16384}), "texture_alpha_mode": (["OPAQUE","MASK","BLEND"],{"default":"OPAQUE"}), "double_side_material": ("BOOLEAN",{"default":True}), + "bake_on_vertices": ("BOOLEAN",{"default":False}), + "use_custom_normals": ("BOOLEAN",{"default":False}), }, } @@ -586,7 +624,7 @@ class Trellis2UnWrapAndRasterizer: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, mesh_cluster_threshold_cone_half_angle_rad, mesh_cluster_refine_iterations, mesh_cluster_global_iterations, mesh_cluster_smooth_strength, texture_size, texture_alpha_mode, double_side_material): + def process(self, mesh, mesh_cluster_threshold_cone_half_angle_rad, mesh_cluster_refine_iterations, mesh_cluster_global_iterations, mesh_cluster_smooth_strength, texture_size, texture_alpha_mode, double_side_material, bake_on_vertices = False,use_custom_normals=False): mesh_copy = copy.deepcopy(mesh) aabb = [[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]] @@ -636,6 +674,85 @@ class Trellis2UnWrapAndRasterizer: print(f"Building BVH for current mesh...") bvh = CuMesh.cuBVH(vertices, faces) + # --- Branch: Bake On Vertices (skip UV unwrapping and texture creation) --- + if bake_on_vertices: + print('Baking colors on vertices...') + out_vertices, out_faces = cumesh.read() + out_vertices = out_vertices.cuda() + out_faces = out_faces.cuda() + cumesh.compute_vertex_normals() + out_normals = cumesh.read_vertex_normals() + + # Sample attributes directly at vertex positions from the voxel grid + # No BVH mapping needed - the voxel grid contains all the color information + vertex_attrs = grid_sample_3d( + attr_volume, + torch.cat([torch.zeros_like(coords[:, :1]), coords], dim=-1), + shape=torch.Size([1, attr_volume.shape[1], *grid_size.tolist()]), + grid=((out_vertices - aabb[0]) / voxel_size).reshape(1, -1, 3), + mode='trilinear', + ) + + # Extract base color and alpha per vertex (vertex_attrs shape: N_vertices x C) + base_color_idx = attr_layout['base_color'] + alpha_idx = attr_layout['alpha'] + + # Get RGB values and squeeze any extra dimensions to get (N, 3) + vertex_colors_rgb = vertex_attrs[..., base_color_idx].cpu().numpy() + vertex_colors_rgb = np.squeeze(vertex_colors_rgb) # Remove batch dims if any + if vertex_colors_rgb.ndim == 1: + vertex_colors_rgb = vertex_colors_rgb[None, :] # Ensure at least 2D + vertex_colors_rgb = np.clip(vertex_colors_rgb * 255, 0, 255).astype(np.uint8) + + # Handle alpha based on texture_alpha_mode + if texture_alpha_mode == "OPAQUE": + # For OPAQUE mode, use full alpha (255) + vertex_alpha = np.full((vertex_colors_rgb.shape[0], 1), 255, dtype=np.uint8) + else: + vertex_alpha = vertex_attrs[..., alpha_idx].cpu().numpy() + vertex_alpha = np.squeeze(vertex_alpha) # Remove batch dims if any + vertex_alpha = np.clip(vertex_alpha * 255, 0, 255).astype(np.uint8) + # Ensure alpha is 2D with shape (N, 1) + if vertex_alpha.ndim == 1: + vertex_alpha = vertex_alpha[:, None] + + # Combine into RGBA + vertex_colors_rgba = np.concatenate([vertex_colors_rgb, vertex_alpha], axis=-1) + + print("Finalizing mesh with vertex colors...") + + vertices_np = out_vertices.cpu().numpy() + faces_np = out_faces.cpu().numpy() + normals_np = out_normals.cpu().numpy() + + # Swap Y and Z axes, invert Y (common conversion for GLB compatibility) + vertices_np[:, 1], vertices_np[:, 2] = vertices_np[:, 2].copy(), -vertices_np[:, 1].copy() + normals_np[:, 1], normals_np[:, 2] = normals_np[:, 2].copy(), -normals_np[:, 1].copy() + + # Create mesh with vertex colors using ColorVisuals + if use_custom_normals: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + vertex_normals=normals_np, + vertex_colors=vertex_colors_rgba, + process=False, + ) + else: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + vertex_colors=vertex_colors_rgba, + process=False, + ) + + del cumesh + gc.collect() + + # Return empty placeholder textures for vertex color mode + placeholder_texture = pil2tensor(Image.new('RGBA', (1, 1), (0, 0, 0, 0))) + return (textured_mesh, placeholder_texture, placeholder_texture,) + print('Unwrapping ...') out_vertices, out_faces, out_uvs, out_vmaps = cumesh.uv_unwrap( compute_charts_kwargs={ @@ -739,13 +856,21 @@ class Trellis2UnWrapAndRasterizer: normals_np[:, 1], normals_np[:, 2] = normals_np[:, 2], -normals_np[:, 1] uvs_np[:, 1] = 1 - uvs_np[:, 1] # Flip UV V-coordinate - textured_mesh = Trimesh.Trimesh( - vertices=vertices_np, - faces=faces_np, - vertex_normals=normals_np, - process=False, - visual=Trimesh.visual.TextureVisuals(uv=uvs_np,material=material) - ) + if use_custom_normals: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + vertex_normals=normals_np, + process=False, + visual=Trimesh.visual.TextureVisuals(uv=uvs_np,material=material) + ) + else: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + process=False, + visual=Trimesh.visual.TextureVisuals(uv=uvs_np,material=material) + ) del cumesh gc.collect() @@ -864,6 +989,8 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: "dual_contouring_resolution": (["Auto","128","256","512","1024","2048"],{"default":"512"}), "double_side_material": ("BOOLEAN",{"default":True}), "remove_floaters": ("BOOLEAN",{"default":True}), + "bake_on_vertices": ("BOOLEAN",{"default":False}), + "use_custom_normals":("BOOLEAN",{"default":False}), }, } @@ -873,8 +1000,8 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, mesh_cluster_threshold_cone_half_angle_rad, mesh_cluster_refine_iterations, mesh_cluster_global_iterations, mesh_cluster_smooth_strength, texture_size, remesh, remesh_band, remesh_project, target_face_num, simplify_method, fill_holes, fill_holes_max_perimeter, texture_alpha_mode, dual_contouring_resolution, double_side_material,remove_floaters): - pbar = ProgressBar(5) + def process(self, mesh, mesh_cluster_threshold_cone_half_angle_rad, mesh_cluster_refine_iterations, mesh_cluster_global_iterations, mesh_cluster_smooth_strength, texture_size, remesh, remesh_band, remesh_project, target_face_num, simplify_method, fill_holes, fill_holes_max_perimeter, texture_alpha_mode, dual_contouring_resolution, double_side_material, remove_floaters, bake_on_vertices=False,use_custom_normals=False): + pbar = ProgressBar(5 if not bake_on_vertices else 4) mesh_copy = copy.deepcopy(mesh) aabb = [[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]] @@ -1010,9 +1137,95 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: new_vertices, new_faces = simplify_with_meshlib(v.cpu().numpy(), f.cpu().numpy(), target_face_num) cumesh.init(torch.from_numpy(new_vertices).float().cuda(), torch.from_numpy(new_faces).int().cuda()) - print(f"After simplifying: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") - pbar.update(1) + print(f"After simplifying: {cumesh.num_vertices} vertices, {cumesh.num_faces} faces") + pbar.update(1) + # --- Branch: Bake On Vertices (skip UV unwrapping and texture creation) --- + if bake_on_vertices: + print('Baking colors on vertices...') + out_vertices, out_faces = cumesh.read() + out_vertices = out_vertices.cuda() + out_faces = out_faces.cuda() + cumesh.compute_vertex_normals() + out_normals = cumesh.read_vertex_normals() + + # Map vertex positions back to original mesh for accurate attribute sampling + # Use BVH to find the closest point on original mesh surface for more accurate colors + _, face_id, uvw = bvh.unsigned_distance(out_vertices, return_uvw=True) + orig_tri_verts = vertices[faces[face_id.long()]] # (N_verts, 3, 3) + mapped_pos = (orig_tri_verts * uvw.unsqueeze(-1)).sum(dim=1) + + # Sample attributes at mapped positions from the voxel grid + vertex_attrs = grid_sample_3d( + attr_volume, + torch.cat([torch.zeros_like(coords[:, :1]), coords], dim=-1), + shape=torch.Size([1, attr_volume.shape[1], *grid_size.tolist()]), + grid=((mapped_pos - aabb[0]) / voxel_size).reshape(1, -1, 3), + mode='trilinear', + ) + + # Extract base color and alpha per vertex (vertex_attrs shape: N_vertices x C) + base_color_idx = attr_layout['base_color'] + alpha_idx = attr_layout['alpha'] + + # Get RGB values and squeeze any extra dimensions to get (N, 3) + vertex_colors_rgb = vertex_attrs[..., base_color_idx].cpu().numpy() + vertex_colors_rgb = np.squeeze(vertex_colors_rgb) # Remove batch dims if any + if vertex_colors_rgb.ndim == 1: + vertex_colors_rgb = vertex_colors_rgb[None, :] # Ensure at least 2D + vertex_colors_rgb = np.clip(vertex_colors_rgb * 255, 0, 255).astype(np.uint8) + + # Handle alpha based on texture_alpha_mode + if texture_alpha_mode == "OPAQUE": + # For OPAQUE mode, use full alpha (255) + vertex_alpha = np.full((vertex_colors_rgb.shape[0], 1), 255, dtype=np.uint8) + else: + vertex_alpha = vertex_attrs[..., alpha_idx].cpu().numpy() + vertex_alpha = np.squeeze(vertex_alpha) # Remove batch dims if any + vertex_alpha = np.clip(vertex_alpha * 255, 0, 255).astype(np.uint8) + # Ensure alpha is 2D with shape (N, 1) + if vertex_alpha.ndim == 1: + vertex_alpha = vertex_alpha[:, None] + + # Combine into RGBA + vertex_colors_rgba = np.concatenate([vertex_colors_rgb, vertex_alpha], axis=-1) + + print("Finalizing mesh with vertex colors...") + pbar.update(1) + + vertices_np = out_vertices.cpu().numpy() + faces_np = out_faces.cpu().numpy() + normals_np = out_normals.cpu().numpy() + + # Swap Y and Z axes, invert Y (common conversion for GLB compatibility) + vertices_np[:, 1], vertices_np[:, 2] = vertices_np[:, 2].copy(), -vertices_np[:, 1].copy() + normals_np[:, 1], normals_np[:, 2] = normals_np[:, 2].copy(), -normals_np[:, 1].copy() + + # Create mesh with vertex colors using ColorVisuals + if use_custom_normals: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + vertex_normals=normals_np, + vertex_colors=vertex_colors_rgba, + process=False, + ) + else: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + vertex_colors=vertex_colors_rgba, + process=False, + ) + + del cumesh + gc.collect() + + # Return empty placeholder textures for vertex color mode + placeholder_texture = pil2tensor(Image.new('RGBA', (1, 1), (0, 0, 0, 0))) + return (textured_mesh, placeholder_texture, placeholder_texture,) + + # --- Standard texture baking path --- print('Unwrapping ...') out_vertices, out_faces, out_uvs, out_vmaps = cumesh.uv_unwrap( compute_charts_kwargs={ @@ -1113,17 +1326,26 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: normals_np = out_normals.cpu().numpy() # Swap Y and Z axes, invert Y (common conversion for GLB compatibility) - vertices_np[:, 1], vertices_np[:, 2] = vertices_np[:, 2], -vertices_np[:, 1] - normals_np[:, 1], normals_np[:, 2] = normals_np[:, 2], -normals_np[:, 1] + vertices_np[:, 1], vertices_np[:, 2] = vertices_np[:, 2].copy(), -vertices_np[:, 1].copy() + normals_np[:, 1], normals_np[:, 2] = normals_np[:, 2].copy(), -normals_np[:, 1].copy() uvs_np[:, 1] = 1 - uvs_np[:, 1] # Flip UV V-coordinate - textured_mesh = Trimesh.Trimesh( - vertices=vertices_np, - faces=faces_np, - vertex_normals=normals_np, - process=False, - visual=Trimesh.visual.TextureVisuals(uv=uvs_np,material=material) - ) + if use_custom_normals: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + vertex_normals=normals_np, + process=False, + visual=Trimesh.visual.TextureVisuals(uv=uvs_np,material=material) + ) + else: + textured_mesh = Trimesh.Trimesh( + vertices=vertices_np, + faces=faces_np, + process=False, + visual=Trimesh.visual.TextureVisuals(uv=uvs_np,material=material) + ) + pbar.update(1) del cumesh @@ -1132,7 +1354,7 @@ class Trellis2PostProcessAndUnWrapAndRasterizer: baseColorTexture = pil2tensor(baseColorTexture_np) metallicRoughnessTexture = pil2tensor(metallicRoughnessTexture_np) - return (textured_mesh, baseColorTexture, metallicRoughnessTexture, ) + return (textured_mesh, baseColorTexture, metallicRoughnessTexture,) class Trellis2Remesh: @classmethod @@ -1145,7 +1367,7 @@ class Trellis2Remesh: "fill_holes": ("BOOLEAN", {"default":True}), "fill_holes_max_perimeter": ("FLOAT",{"default":0.03,"min":0.001,"max":99.999,"step":0.001}), "dual_contouring_resolution": (["Auto","128","256","512","1024","2048"],{"default":"Auto"}), - "remove_floaters": ("BOOLEAN",{"default":True}), + "remove_floaters": ("BOOLEAN",{"default":True}), }, } @@ -1282,7 +1504,7 @@ class Trellis2MeshTexturing: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, pipeline, image, trimesh, seed, texture_steps, texture_guidance_strength, texture_guidance_rescale, texture_rescale_t, resolution, texture_size, texture_alpha_mode, double_side_material, texture_guidance_interval_start, texture_guidance_interval_end, max_views): + def process(self, pipeline, image, trimesh, seed, texture_steps, texture_guidance_strength, texture_guidance_rescale, texture_rescale_t, resolution, texture_size, texture_alpha_mode, double_side_material, texture_guidance_interval_start, texture_guidance_interval_end, max_views,): images = tensor_batch_to_pil_list(image, max_views=max_views) image_in = images[0] if len(images) == 1 else images @@ -1300,9 +1522,8 @@ class Trellis2MeshTexturing: texture_size = texture_size, texture_alpha_mode = texture_alpha_mode, double_side_material = double_side_material, - max_views = max_views - ) - + max_views = max_views, + ) baseColorTexture = pil2tensor(baseColorTexture_np) metallicRoughnessTexture = pil2tensor(metallicRoughnessTexture_np) @@ -1468,7 +1689,6 @@ class Trellis2PostProcess2: "fix_normals": ("BOOLEAN", {"default":False}), "fix_face_orientation": ("BOOLEAN", {"default":True}), "remove_duplicate_faces": ("BOOLEAN",{"default":True}), - "remove_infinite_values": ("BOOLEAN",{"default":True}), }, } @@ -1478,7 +1698,7 @@ class Trellis2PostProcess2: CATEGORY = "Trellis2Wrapper" OUTPUT_NODE = True - def process(self, mesh, fill_holes, fix_normals, fix_face_orientation, remove_duplicate_faces, remove_infinite_values): + def process(self, mesh, fill_holes, fix_normals, fix_face_orientation, remove_duplicate_faces,): mesh_copy = copy.deepcopy(mesh) vertices_np = mesh_copy.vertices.cpu().numpy() @@ -1502,11 +1722,7 @@ class Trellis2PostProcess2: if remove_duplicate_faces: print('Removing duplicate faces ...') - trimesh.remove_duplicate_faces() - - if remove_infinite_values: - print('Removing infinite values ...') - trimesh.remove_infinite_values() + trimesh.remove_duplicate_faces() if fill_holes: print('Filling holes ...') diff --git a/wheels/Linux/Torch270/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl b/wheels/Linux/Torch270/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl index b5598464bffb05cfde18950826717e12e3c825d1..85ef28ae649b7fa3fc202a89010bbe9235989aec 100644 GIT binary patch delta 4319 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 diff --git a/wheels/Linux/Torch291/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl b/wheels/Linux/Torch291/cumesh-0.0.1-cp312-cp312-linux_x86_64.whl index 91d8d095f36c8eb4612747c316122758b1514cdc..9803f4d5cb09f9dfb619a450029863fa66c04a58 100644 GIT binary patch delta 3644 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%0DizNfB--c zAOsKwhyX+ZVgPY~1mHG65+DVT2FL(p0dfF&fC4}f00SrilmRLL)mA7k++>vJ|NUXN zK_C{8Ah4DH1{8!%!^4HhrCVVt?y1;jJX{UTi6!9S2yhZsW(RHs&c-J1!0jM+6P2;| z5|yQ~4|d?RSiW8OO)wu;eHX4l@?sv#zX#{S*3QEjv2SBz*PVM delta 3597 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 P(K~Ps%4q@|Xyg9?0w2E# delta 3575 zcmY+{cR1Dm`v>sj*s}LtSvlsBM7EGk_TEBCIp#4Ak%W&!#xaf=CuEPztjIicvQH&K zsFO|zr-Q!l-_>8g*L6K!*L6StxbOSly9qZUe*o*}vVu=sU0=Ba#X z$*g;rgMF(cHooZV-DmfwtAZy;HgQYQX*?`6pZS`Nf$u zRGR-88u^LtGAX#M8MHrw-kMqB%$3n;VqWj7Ot>)wGuYc*aI1J$K zy(rk%yZ(-|q=dtCy(iE0fnU*;iOuOKN#H9Jh5MLi7xT?PikC9aEZYm>UF{Ku+YPfG z_jv2f@YPo@NBl|8>7e;aJsH>;@W9X^$lyKNTC&F~fi^#sk0ii-sz^#tL1+&g&ADA| z>lqTl9)VY1-P^}db^um1#q%`xB`BhF2 ztMc?Yo6|W^e=?$eZIg(iIpa7Ne#~;?bncDWc>xiBKUP_M=8?n<^*AB}f;2}piPCjE zX-_I-dJw6^rywt#6G=1Im{fW>y0;VoS}0g7k$JIBj>0ivb7h_i>3NUW)1aGnM@LrMU{30s2Ne~%Sq1jLcrpZ7RR$K@ZJRkxFttf% z7B+rL7kT>C5O^O`CPEVuCbjPlC8hTVPG`!?Da%))Mt=Lzfd_70e z`qJ8q7Bs!!aBRx<;R~zg!T5(->$IoDt|RWG(^RtV$Ba;IkqMISOh)WQ{H;v`iWy$I z_yd(>O_)v(0s}D`xZ^x2dzl|@e+A3ISob`_gepgt=XYwsJ!NbaabO?vy&k7`MN*V-j{k2&|=)x6C@Ej^^k&%bS8~&%OcgiIA zJNx?76$LPLWjX5WK{`sAB|h~?=fS$z09q#QdYp&l;(HkjVNsQ(`6-@>HR(jofPIq@ zul_(uqLg#K*{?4a?&%@Tbj-KR=FIJnOG~!tZ?#*%q$PQ11S@*3`F+XBH+D%Z2pCBz zYl5{PN^iGN{_(7K)P)7DntC1w%8oLd?Kv@l)VA(=uWEFE;a^-2`An_KVex76R-`_f zwAEY9C3Dm#YjHE#x>Na;rUP4QeoC2iq~dl8yCDh=_e2Mb41zOX@GamY z9C_C@48khm5-+_q3F6}L<}qQ16HZlxT}LmQvHHpu$4cT=ffXV~Ju#$$Tvp*1L3v3V z->bX5ufaoc9W#w{m~;=;Io@RaIJFnygVH8pYWM=sm_UfzFtTCFIUwA3&g*4GVGxPn zdx<%0t6ElK2c4B}QTJx|sbVEXXR07KmVF|JoVFBwi)}1KzZ91Il!3$>=YaV04&uNS zkyq1IFYqREo#79aReC=sg~(7McM!paA+<;Lk@cvP-W8iMRityz!!ICC=n=D#-$AFO zJwt|G=U%To9v>q_FB*5C9LolX+l~ty)DrPW+m8qM?7xs2vSm8|Mi=7{OX9F6-~d*BU3ke*vsA)C-|9X zcqbV0WHhPwhpZao`fJ}n(3Zx^M#Mzvwy}n`GJ_l^xWi(PT7)3|M+lBcHI_-Z62(;l zw)#v(1J+qkVi%Wg>6j;v-7Qa-!`!Ax&b^KherPei5gyKp_I!liuP_w3CIfDE4A4+q zBD7a^hinWDWlAfj{<=C-;I@|gENhH>`<2mKh5wcUZx}NWhXs#gAf&K(h8<$O%{-U! zK~Tca!uwu5bym~t@H-}m$Rs+mlS>8Qg)6_4|ZKTDyaPm-pHpb=1<%96F$|l znb4TGtbuJ#^ky!X#zyWbG9r!1Q+(FWyk>7lZVCjZ2sxI84ke@^P8$E9d9zK)tN*Pt zYLrn)mx>kTai>ZQO|LQV!V*5+7g|g%pD|pf5N!;V!}#*y?52~QAKqip)Hk9nRB!I8 zaM7a0$fp??}adHts>QFP759WDcgJo=O^S_nog zy^pU|abK0Kp@j_l*m)gjC}6@Nhv9>Ch#_FUV2Asp=tSKdko74}`YjV>XLtX#z|o2KVrqAAa*FRr2Zg5sM|%zsh`~ zn5=w*oVv0JnmrO_^oT5bD8ubhPRT=-Up?~OS4%jm{(+#jI*wWi|A>>dad^^Ed2Vid z-8#mPpH%H?gvN#J>C$0;N8Sp3T86UdeVk}&$0q8DFnIK~?m5XB?3?;FB}?1YZjax} zzgt(<R<3{q+eUcrvi5QMDb7-%{BkMs|gkr0i@dN~&1 z8$xoaLtG-Q-VAXXz{kYCJ~1%b|_=|xq{$76?RC=n@hLpe^=TIHFd%i zoG^UlXLV0{GKpf_smA#N$N4wV%vLvF)%3X1po}71W*B} z0W<(w03CoHzyP=eU<5D$m;o#RRsb7-9l!zL1aJYk0XzU+03U!KAOH{q{NGGrfCxYo zAO;WzTn0!0Bmq(YX@Csi3P2VB0muR50SW*`fD%BtOHT;OJt6x4?j|`9hyx@6`u9Xd zL7;Zl+&NY*ROU96ktR18XL~mRRkjV)q=2A4Y(upuDo}i1p{A5mi;}4GMM-g#`d26; zD(@>)m~!-oBI@La;^lwQ77&5I&7-JxpxR*P1yuG9ln>>;162kZA$OqWVDXKA+3^lk d3B0uVuh83ts)5C}{uQ~qP%fJOEhwg0mkL+>7ha7iTc*w{G7IXsm;%A^sPv*NWFny?F73cd)RnEse`pv=&oS(YMG zm_OkVY!%ulH2xbdS7Xq%Xcceeq=rEBGn0$()reVQGIYJpQkB0s?tR<0>{t{&mdNakfB_NGD@QLOGzV8=F-l z8$A<)e6nW~j;@$=gBi!9&8Pm&>*cWBX82^J-AE9+ps?(6A(+~1tP>Pj|B`+o5XaNQ zB(m@Zc{=y}fJZ?!M-dKRs(kimrtLT675;>d=ea{-t#b@eUR9(S+OCTv)=duSNR;2a zs)`DRYaPo_Nv9j0c7K~ed=8x&_q3PeFO*C}&Zl3w;(9gD{RF94=DW_SZtkeLLbB&l zr4&_i2OspcSj@4tZ%6!0Wf$<`)A5mtrUO9I`qD7G5*;)U+LiJ_^@2ahw;>6B_*I|Ki<(SGjd`j zU+Q1fpU_oSdzpqy&z4YovK#EYYk-g46$CZ9#1y_@kNFF4E%Ly+zY~`{uvv|pJuMK; z%$8P#XTyHsJ1zKP;vF(kX4AS1xgnuog;G5;W(q3W)X#fO?_<4uAg*P%Ji~ZHHXTuX z!%ip^cxzHpr>(5nz8^jOyuzKhCZ0VxTp4CxnL7)KsW0qQa~6E9O$`%SLbhW0QeymVe)3a~G0u=%M-9 zqeNDCpB0SlrMCOrop!@@%Uii}x?uF(c)+)^{?0{tf1^Kb9tTW2#_jH-#U=DdkCvUf zHu)gej#cbQG?cd!ZBnVH9w0UE-EixL33#YHX(l|TAI%-Wbm-Z1#r(MG(C`U@P7 z?o=;Kq@B}&|2!{n(X}nHj@LN*o8^@g=xj7U#z?+0MK{31upxyjhcrBj)8L+o&JvcX z$=xMho4$;n*~ZFQw5~NobsA7aXG@X9a{O(^NvMWtS2)^gC`$C;C9JFw|9+YH)WaaZ z8Zk`z)D-XE6%YaSV)ZBNm~Nh&7iW;&QSu3Ieq<)T)T0>d%yVmK3||+^bk@hf zTV+&SoiAHxfJbV2Rwbe2GCNH{l4DoJiMV{EkKKMztFf zw31o#Wc&Muw)f|_=Eq!0cj-?xp{+CzIkQG(sMn zV5K2^lK)WNCNiox%wa*^v3~|39_?%1|1W7hK@02>o_V}`xZB;GF@X=-$sQhhaD2sl zPu{=NAn}c}oOkpcKN#0#2y@4qk9-Ouvqf#`$ntdFAMw7bH!ph1T&_)?^$rQY_^14Y zZFC7OF2Pi8O_7g76|0%AH}zDu%`KbCSSzY{l`vRwQ@KO%2 z1tfbQullhJJ&Z-TaJS%{*y?xy*kFT!Ji67AFl_?gy7t}m&5iJn$P%)S9&4d`$Y_Q- zId;_?YZ7_uy|=F)25Cij|upcXUJJo z|DwvgAnnsox?NR@BV8KbNYU}?{XSQoXXwQ_!zxx*s_#veEAnw?_)>7DUl2NZUML(Z z`0bn^Q9DIF1>g2^t$no@zQ+T8b6&cN3Zx}_#AZvq3GFw0me4a}eCS0rf#9_GI9?>l zgw-pUIuRKSoG#ymVl=!5ldGQ%>~p-BaALSDstB}G=B*XhOLrmApA==Dz5TU$q;74T z*(g}dS51%vujTfq2bMa<>Z8BLb;|j6vFZ!S93q!D(r-TvX-|^1#W+CwX8!6#y~}Mv zn%J3XCq#}h{QT9H&TS{wPta~&O@CL`J0{4zsg;RL=Ix?^p}ZZKz7aBa3Zx?ZjA^Ro zwc?|xAUw7=mlz)f=il0|2w)Gh->I>G=-+!h{8%{niH?Pbf!&O)1QzWa?h^5H(Rw0o zq|Xk9g)V81?q7TtfrP0S-M&fH6W0(bIHEuCddnc>vk%7D$HjoGW2J08k1n$PIHdWp z5?A(dd_(KQm+9N;_A*R6-5*weQuDAmlR6gtc~1{=zhE&+4^HN8N^&oI=IW7H91Q-g zam?GWI1@Pvwm^;Z7XC&fiK2eqj+ufVFOaEc8Z?-i0x$B~(LzeTPnr}Qy?#k0$hAKfX(>$w?JMT*1#NZP&bO$?fUo-;F|Oyu?haE6xf zj{NDRzRw)iSdJ=E+tF4w8SLZubG3bsx+j6n1~Kd;&uD}hdBLPM)3Ew0q@_AS*2>fS zH&y%<3A{=H-^kEAWL`_-Zj4EiO{8=V-@K@UK9fQC1Xh}G6x$T^S}WOW_v2sK=(JRq=&Cm4XP4yZl;3b>-ol?*tClPm>tbk)&&SPW-K{V6nY$8*aKt|8ZK z+!Y@;62by?(o7h9_vFGB?DljpFs!u3oga6>+-&e4Rz^UUS0V{HoeSQ zl}hV;?5))E=tU;nYi`7Bz33gQp@PE=+pLw#gJ@bxofm6m@%A0XT`DKRIHdELly;~z`cWx2ku62dc6z2HH$qOY8f#eRrDFLy zSOA~pxk*M!zpkEGOl=k=bdgWR#;@jprDA$XLUZ2UNM)MM2%255^X!hSj%6So$jxe@ zy~+n=q8G({i%b-o{j3z3hWjQhbx7E5q)py_u#ejym4X|cBK+k{@Z=ZN$K!IJqiCsz zviPs21|t<~&Wo}eJWG_sg1Ni8G(TEW*0Uo5-@;ksQ`^q-4sr{>+cNu2hQx@}9qNak zqH8U8sc0q{jZO*r?!q~if_8Ikc4{21OUIJK%p7I4-06A{=f6;1_;Ck5&?$&&w~Q$nX@OEIdE$WFnUV4 zX1I!b3hrnDh5&2fWENpaa1+jN5oQRXUJ%7GEr?#nJzs>;<8~Hd0ua>=Ih@vpobdmo z;7c$8us#m81k->t55aIScQpQ%*E>r#6%MJ8S30cd)x?^!(_KE4y#S0;*_kF~%0r5Ca9 z$KQKauxoJj9dAhqkNJ8}p34KDqKgw7(-AU2E0c`&vdk$Knt>HBWu92I7sR>Pqm8#3 zX5H@z)>)9MFJB1zlb+iF{mL-u-|6?j*df5^J=R*L2N}xr@qA@X)9LC#`7Y7>in64^rG~Uu>k-D{eD)&>a?0y{15XY6J)+#~ zraEV5XGh04qTbYJ62vZO1lT_FLL2M9Sx;|f8b_i?EyDI(j;zWCe0nHZ)l$_qg?g(* zXRdkHrR^i9(F&&X8RdLbQmzGE5tuJkmMbLuu*vhK&id7uJ&yQTstmJupE5Po@@SsO z>y9i>pR+lh1NA4N>(@3Y80ZPlsrX}#YsYhMEKUn3r28?Kq-GvT&oGRmGho@4m?lZ4 zjwkJjg=`PPRfUw5$C_08~&MmnwWv-cs&%`w5?cH z=t^iUDy%#b#nulCtnfMeG6ZerSUEa!+TP`5$bC>zp`TS?|4Sf4gi~!`vE8&(c znC^00y%E?_%*l&a;b{;(6G5;3?KTuTyn(J|sVdb_M!#LEIJ&MytV%V**qBcP-mU-n9_B?pLm=?)BlhWtSd1=)t||TIg7ioVFaEL zWQyBUOVUQ^^`LPulYu+VlL{AvqwO!^d06Y7hndmmDhT{eDY$pZ&9IaWM+lwz+nhlA z9dwJ^64j4#A*z?`re8h}=Xkn3hhD1Y@UbXvF7nf~zab)m#tIQ_U>#s?T;Ftc&quWaF{gov_C8@*%+I=u<#kPqOa3^h(re4}lh|aFqzmZ1l5kb0s90E+=Sp^iXFyiI4qu&T zTuhgTwf>4Y{On}opgEgBoc|Ha-7Tn`^_`9-rBRJpm3M|AU!y|`HSmyeSfm)wWu%Hv z5Bug6W*5j|H(xi&aD{DEtLdDsc*VUiZ9TPyxRkwx16gmBKiEFw-(vnqo6fs>^`m>M z@IhgV?p1SG=exaZAvtdjji6to+Eay_TVpY^(T6$ zVD_|0lejn|cg5Pt3}QgJmxepsA8%yl@sVanMr)O*h3Wkq2C zmF#_vJ!G?5L3$gTm5!);^DRxK65N?0%8%!s$fcz&Mc&{V3opPy6Q#Vgs-#wp+~0o^MWOY68Hniw^&ko6dqZRIvHHF8B@=8?s@nH#0x)QH}To) zl(A>YFzDRrRU(n1#F!;xuX=_qTNNw2HfrmN*D08DQ6pb?ERsj!Mgt1+aI*4wemS^qIAntOZO6sA}^!^vBMximir?XjZQI@kG~kf zR{}wPqK88C7F4;V590U(4=Qq(c%vg8r^@@=H6d^23yQ@!4*fV zMR=q#8nBBg@4S1qwS1Uk#qK#2D)3)_Q zNWE+(IO;8@f14At#jSH=BllETvrTDJLe|cL7H>zci})vtIhF+v#iyc=8vkGgbIfVP zf7V&G%IM`v&llzKr$`S?udxWC;y>OOTTCjSF zHg{Fr(qY8q`_i*nrnr57)Y^!N@`@nv)kplkNiVUwowU4K<$vWHSt2*s$!I?FWF(tv z)Bo2jHPlzfJmK}v1+4%ySzHDrXtGUgR(!54S<>XL#}!xbopx5_c@;&YFkVn1)7AYu z$)uF1^pA$%NX2e9ok#pz!x^uC4|Bg%;Y-}vL%PxZRj%xGHwVdm90aZe zV}!>qN%Y&hPU+Tu`0UV)?vIC|PW)k0j<|r=N&4}$gk6XTW&C*rQ?qHutpQ^JL%J3n zG%KFj%NtqTS7mFAkmnvdtpg4DO*mv6+BTXeBiVEmZvT)S<8j++c(kU!I4Mpmi=&gl zPIrUypZ_i$I*0xRJMcSJ-^cBS)ZY1l)>V1Tg?O4O!d7B*kEFf&TR^o^$gq!6EUo!f z{v&v@@=f;C#SPHxfh4PYc-cdFe)n=Z0h$u=z!9F#&rNAx(}x5^xx#(-ysmABB>|tYcXidHW9x_m;C^TH*DI z9OBo+6jO%yBwEYYaD%@1`2Aa_+?$%NxYuX1R#|9~LpWlAzSM8`N`n`B&g0wd6tYr$ zZp*?l_5CPowpR+&ulCa8t+IRRRc~*%49_(k2Sh>4SiL!psUZGmQC`z>}DQ|7sXyMHR|vaPN!-DLhtXR9A^N#oB^F*>> z5rvQWccM}Wk>biR!y7l+<7Aw>9r~j=Ur;32%jt{ss=v$7#DD$;B^ii4F%Sa-AOJc5 zJ%9lK1uz1b0L%auz&QXbfDOP7-~ey}xB%P$9snfTThH zm82wQbpwqgTiA1jx;?_ILVArgr@a+g_|WkhE74A~<|h&awF zoE*MXzt8XY{pk{wyNbUebcX`g5-*RZeKKyIQS;WNjhpasnrgltus%&BY zgky+xSd;MhZ)I4mVb_9n*bP%5O$!?nRK@O4rs&viKnZl9iJ$q{mUJug&X3R0@`2r_ z8~H<-2QYV;EQ04ZQU8(oOKrz~gH`C_KvE^6fl-Unc>a03M*zNJtUL1JanCLuzml!0 zfFXqL>Gct15=c_1W@g?B?B=i!O0BLZ0+MMt$yLpgh}!iZG=7N5QPjrAU1eCl-CoM2 zXqvu+@-It8QxuaqOIac^0op}He{B*G$bC9D@j=S(V{T5f1&SmFS$i_d5pC1dq88QU zl@#ooJ)3xN!J-$!JSJl?^-o?em)!=_M`N8Pg76uYRhKKl%yxB!pveB0{0o6NoE|1q zL^R4Xc;pA(53W6kbo^ZHyE`-OuqvQX8%z>&=(PApyJOdQ7>YVPJ(aeREbS8v3+PTg`9dynP{V<=4H!`9s&7Py)lw zC=_^oQcAb2yv3m(J^ZB7gY-=zdvdrc+@UU6q+H~eMOzWQcF#OL-NxgBoEQ69A3b!6 zF^DRoZ&UT(RbCP`U_sl+`Cf|z)MrL%ZO4a|N@sK*D@nhpNpbYqN;NVQ-^(R+3#J`& zy!k`3kC*~ynv8rFt{EHQoNH?<)fP|@)drPwX$|G0*PhyDqFdzOzPG&vN!<6;`s7(E zC$h^9#`V(Lf9g)Z>bCBqQZ-#L`erF^K9C<=)Cd_&!;!l z3m0wYb`(6#3tDh%ORDEL$==EoY#SEcF&dKxvR^5l?*NAa4xGcj2rvbDKH z(xvJ1gqaN-%(C@cV|1q>RZO-tSv)7ecASiAoOV-2TMtEx?LCK=Hx<2IBt7yp%&$QV zlRq{m1at*PLcQ4o2%BbWN2ev36gQQ8BUN)ZYI#*BqhOd$GmzBSMM+X`q=FGE^4;4El34V6f%ZFm0vMdrm&!f$>oSTM zuWUTp$#mkXiq?_i@KtD4d?To4EXfYhE!P`v-+Orrjdcc%m$}Q_UnqIQrhc`?9SK^( z)IQwUS=I6R6yNfIN9h*hu@lXv~SXF-u3OxF5Kkm43Y=kQyFYDrxXwza;Qt-mj5O1DVb5&i|q z8N{z~D9Z?E6DcGXyb)g>4+I;oGEv5~S`nsAmDexrxV^d>@c~&%(a~cg+yEKP)S$#I zTi{HiuD|tBmpK*XOw4DVi7zZpVfLIt`(LkdN!m^SnEMl3Aa}3($?#U^GY9Kg%e$|A zI?N@mbJ~Y}eLV3X2M=m~lo6Adbx6$}TNjovvK%JIe)kr>q$aCdDNdlA>V3}q?!d$i zlBY4ln2O2V=l6;GwvP3EJA+O=WGzKSQfmb#1)-Xs>$pkTgH%EyM=+7Rg!0W@w5 zK8%f^+lUm$mImr|T0Ti-KI4qFKARF^3`ZJbSGIx}7ZVt^I4HzO7Syqn5WUiO{$jkF zm6SSc?o?&ET=&@;{2D|-k{(-v>8}a9MwMK+M8BimX1~^xVA1#kwxnrCb>FtTVWiW@ z(jCd0g#K63(Ac5ZZd>svg%^gS=x`F>Nu>G>NRO-WrHsL^%U|N2yttY2^Ore0<-<}i z3KBN_eJ|c~hE9bttd|{}JraM<^RqIGT3OW?xt373eq?Cigj%Fe8%G`zic%jVXUzhN ztMY<%j>8y;YE%b$bbe7{<2Ac|ZhVi?3v))*?Cdl<%~ebC@h3%PV2pn-I%Qrs0w=V6 zN|3CZqMcIS@OGMQs8g7{TV@JPH_h4@9~{5zba&}lpXy43V-RL*D%}7&w zbDhMfF{Yot+A?_U#rp|5Ez22i%6rFzc-OQs$Q1rAIylP5k!72J*({Kb^f#fap4U!@ zp@Hz(UHi&>KP3P9Ze<{6xWi_x!@Yps!{G-aArEyeJq_(=>?Cn$mk8I$p9?k<@gsfq za2)ij*68lpjwmEtqxi-(nx6Q^Frg8HiI?k!p`U!QCcdtQ6dg*1h&~T7t+3bF|{F9cC!-d?j5Ws)Dm-`uqRl0jLcTI|S(JNP<%;sqLPpwnl zs^y93L5L-4oWJll8c7oK_i@4qeKqZOJywjEyDM0;Oh_h5KD@u=9 z)TVcR38`Nm@s80um^03^G+9t+Zkgwmg9`(Z%-i?!XQS*vf%CkCPJ(Qw*PRrk%Lp}R zR-h#@!ur_%`p1khLB*5v&>!8Yhby_6G{uUfKuG%S?lml0aGo0zSuT3xE;v(LWK;h5 z+`xAZX9A;%(s8nrO9A^j{akL}qU}lKutf|z%QG8eN1m~$&onOo3VmM_DQE5F^P48& zf(%}!QeMr}-)H@n&f655ESE&>60vqx4}C0)@C~Xmnx<|JhUN*|$PSu4m1fgu z`StoiQ~on_re9NoQ8WbQ9r5L4>DukSUB@&~E_>Gz4d!?x+{o}ZtF%X;OdYBkdTOqU66o0$OzPd8P$Ylo>n1`6;*6Dl zKR>qa3MG_~zl69oYTRU{Z#L!`#`mqHfxR&@5$XE~4w(Y7W%7OGQo9E4hqv7d0B~ z)3MjmPhu8W@Gp50vkhW5t%nNsSM9Qv&i7*Isdb-yD^GCfDCtr?3c*7aPR5+YgT@E` zmO>oRTko{-WfCq7=@M=%9zQ8fUxC%I`pa}emsNjVsdC@DynMrQK}1%%Niy6irM>u6 zicb!>PndlSO_N!@M!xZwYI%N9CXRfxbw?Zx%X2cC`^IV-%WP)w>`J{?cT`Or6KM}NtBv-q z7?h1!5cexKRc!IMR%99Oo3zp;bQL?v@_ikN2r7*^xo7mD%Le+D`NKatn9tSp6qMV@2!t4Z@Dm zbyh?gx=Ci^V}gN)NRE||{TzqAI+xqmL#d+RFQbozEP`Thx88GZ?cY8%@UW?@N-0y* zG>8nht(4Hea*}h2VPnvu_3(X2ik%Pk#USs~io<#yL=k+kA}x7;z#nvv{_o*IZsu=> zR;T*?!#^~)jUkkrAP|Ta6y=O{AUI__LXaKYTIsiR@0l)}g z0x$zu0IUEu06TyKzzN_2a07S%yZ}A`Kj0ET0Px?QmjOZmC_or+1t0-b{*^{hX?DYQ&AP^YD z3xc&Mt9qp3lQ-Z9ur|JL1C9hY<2K<&;AOn=CfpRV@B@Zl{Q(ofLpR}!_|Z-HW$-zE zXA`bT;r9vex&`OM>k{D#6o~nM1BM8PQz(A_H!Kt3@)X{a)uhp65LOdj9=-iJu1N0h(WPu^94uw$yk7%bTA|ZY7$?z>^v3fUI}{d@iFd< za{P1P35wArTMjobLwJj9tFE?f>6t(gWE4X(N7}0%5t=pUT2y zg>o>NpBPR;M{WA0*2!drYm)oYg(jWEe!A2c-}5>gY-tg+~#ZDxh@ZU3NKD@mvvwtVpFJ*yEX^p|t3*z@aXi1m;|?!N zowGTa1N9}M>Q*;MXu4DGGttNFS5M~NSe)gP2=}8eNzOcynxP#>r9m@qpc};*+Ml!~ z6tF%BR}oZFl+6yOn`=lYxe(b?f&#tIUnrJ)u||o&v*Mn~J%t!}j@Qv)8n+cn3taIn zg#{JIBAB`%{$*ZgU)rF}EGtJx4%@ptwAl~J%k?wz?SJv733I6SFSOY72` zd{oYJ4XdEYUe8H`mFg zS@seuu2_h^hXupWN+%aoG^JS+l8I^Y!Bt|azvC=zjC;N2T5Fsd?k-{q4IXfO5;NW7 zvU_eS3`V&&;Az#8tGDZJmTClFz1X+J3E&4q6`i2pBMt~u9 zUo}x1q1TPVLQVSbI8Vx75JK8t#BsCKJ`Xda$(HB;ot%H~lAB=(D;6I*^|vXW@;m4j z*9}A;!evFhcrR5=0>+-RJ%?JXV)wBqYAW;p=Sy~;>8<#Dzu~0P zMnp5J)M@*`{(yH2bijm<#M6|Jr>LJMm_pJ~;(EkA8s4>!b+ zH+!mh{A&F#Bg;9C}n)7W=d{QWmMsrq0Q51mqheGq#qJ4!f_g@;8MeO zoWkq^+3n_QCuuLUe$Z-U))g(k7pASJS|6Ld|Nc1#pCB>M^C;C>rC!M8KF+J3bIS~Sa~%lLThRpNV(?VSoE!S{qP zM}ajhqmT-u)JsooqNF6UX;jqVm`5FD*WSZvs=2($y&SJ5yiCGs#s`&CO3Qu1sF`&M zJ^EXFTKwQE*lE1Oq}yG+qYajiQ@deaXk9Y4TF?)J^@q9+W!6tQ`-OVXdAuwy2p|)^ znb|@%tK_A&F&U|rwQqKwDp!Czl12D%Toc)pl*P#FoTEX8C5XhQOk{x=2h^XpPzTGo8C1egW~o4%tk6_B*8Q znbHh8c6$^FgeVB3c+3^g&?T!PCD#URUC~;3b53$(O$fshOkPaO%YNq0aBE2nL1%UL zE$G3=cSX-%g=>T_f8if$xrz#VMKdJsufL!VS$t41$hA(RP7^jJ$;O=)-{R|V`BNWm}igsgIEYrGc%F4A&GGG^`&T3l22^_z9<%CG^PuFvL?xho^$Wlysc^7M9S z2Nm?mNJ7sKc@37e*WUi1O|9kiu!)i_Q!U*~ObR?y?UuW=Vno?L5F{$uR4(pf1aC1F z{4)(5mEL<5E=k$u_Ib)^U|FgH_9k88vnwdkhnC~(p`jd@+mA4N<;G%{<*1q*{j`)9 ziEWi#LF9UuSf2qynyRJUV$rz>Fd}T7G^xvZYRZ}L?kjPOKlpGSvv`vb&nddd# z4~Y9&aNnc57Cy~|ykmw6PhhY(W?t__5)O?#UBHZA@fux!Rp;KRJ%cW!yI_lusu3P3 z^agAYrQNsBww8{vtk^tfYm+n=!P3Q|Wn>x#H z>Cj{Id}&y3B)ffo)Y5>C@`}Lo)2N05rthy= zN~o`ndHn02@3jI@L{VvwfXVhslfrXt@#02zJDSD76=%UmItogBt<-JaP#*Cusac{)dK=#q+!nE-! z)qNxCbnAiBN%sZ?aZ+eS@*0(B;?a!Px1;PYmAGPewvaAVU!^M>_00idFFT$y-q_OP zmpE$du2ZVDA1*U=qwCXAs1skaDajwv^)OYFH-l~GlvWKsV*>iqvI@?m^rh~Pj+|9eyVSH8psQs(ywkUR*nRdGX0c!`F8Vba z9qkm7ZcD&5mH3tF~7qAwYJDb+z1^JVjaUo&(n8kxWAMM)e5guU>Cg# zQAi%-6>BM5#SZx5;tp<|acye4Vqc%nT4kVwk6@PXX-fR|F4udpWj(&#Mj|T4WjDWH zBEK79$@EI5^Q*b^c&qeYYUSAN=ApU9lYl5HGp2Cd0^f8v9enXs)^@rdETv|(!f?Rh zYIx0MunJSpNs&lFNu4vt_rcIe$<{!#u!Ckhv?=3U{@p+2c9~Y!7H=~CuCRwRb|93T zu!3c$wNJX!NfKMhrg_3gc~>!P@N2KCd!n4`rk^L>8LvjFWyIKZOE}(_%N5RmMie~e z+l@-WM~W&%4{cm;iHyda6OmC+RHRehJHi2nQwN;H5xF@S&pQ~+uK4S*Iv z2cQQq02l#G0A>ISfEB<7U zKoW2PAO(;H$N*#ka)65fc>olk08j)d0h9qMfJ>bQ5E%D_$p8DB6hI(ukQC_OiHoBj zY{8`Io+aXK1LM%eTQF@f6urC!(*c*G`M$!;!Q*JpuP`g{8+7wm7#zHnzYWs^+oAQh yVHQ*}OK5{_m>?Rv4TDiZ*8i1*ZI}wx{Kmhcy93jp65ae)vUXs+blsaUVEKP?$(%s| diff --git a/wheels/Windows/Torch280/cumesh-0.0.1-cp312-cp312-win_amd64.whl b/wheels/Windows/Torch280/cumesh-0.0.1-cp312-cp312-win_amd64.whl index a5eddd0375b34654b4ab9f39e3533a3a8c72568b..8d0bcfd98b3e5de6b9ab7255a6f20711ff9cc61a 100644 GIT binary patch delta 3589 zcmY+{WmMA-7YFc-?ruSbG)N7c#72pvfW%1YZl!yGAcFj11KFgel1d07-6bF;A<}{{ zLP23e2K+&Ne$RPcJ@=f?i~Hi9@44^pZEhO}j{_RI*_em2mG1?8x6N^40)d$G#@Iwq z2|i?Dy#jD&#GQk1Ua3@mJ3H4Tr$_QfX!@)3HUd^7Qx1{Kq32OkGw*W`RGB-`l^Jp+ zMN>|pHWAGtlfPjK^+r8QHW9bXgtaVfO_5dmBROId`+;SUp=JS=6FbtKoO?e$$0`Q( zo^2P6ondb7qr_pM@Lr|e?Nm@IGe51SMG9WO^@G+Q{&5_+{b3)bP-K6Q zekGQ6Ah~jJ6+cb!F@H5zR5nltkN<0%0!JLuyGsmHeVuT3o-0-+G0HiRkxnSv=2rEX zX7AJxzr4AWqf1u(P?iZ<%jtg$`?>A6nLn85HWNh7sjYk52jY(vzvN$VIB{l_ zOcB+j$mm%V6c$o{6z%l6)^C4y#&JVY=}*LDp(kacZN3rGrN81YTM)<^CVNkPMe92R;_`k6BQZKCMYf0$?yS1dblVWjn zo~$}75Bdw=Z6z3=?1V;I%;+;0ghzmtDhw>xsA(B8Kkc==N%Zlfbg#VW9VrmL>5LQ{ zbwMJ*TOXzMIx1To2T`L>sy#_xB=bIw)iNufmE$-5vCBcVD!ys6yF;0B=%xM1 zt6W}mp975Tr*rt!n|0lN%U88#rg;4IWYD+D!R{r+K$AZmUI(l@rk$SSW#vpqVJj{@ zn}U>Ah-!{xdYW6QcA0e3_YvB6uY2@EuX?FHY$YTxjTa1Ix(w`k;{RNdYHV?oiAk)e zaaZ;aA#FK??n@rjF{Utw(ACAeKH~eED7vz}g}&^A)UBG!f6K&#*uC{?-oEU<_7umj zKiv-%>*R3~Ix7rba_>lO6fn*EW_{@bIvp>HH&Lv~&=2x5Zpz@zCy$QfwD@M@az*9p z3wB9YW-gLvx3LOV?O&Q=yN#&h@?^*o`GIzmWMtEfI}Bwr5-Wc23|iTYf3re*Lya{;l1+xkq-S=_fQxY&}4;&Y}iuSYj%z6bsh-N zD!TsR_V*24-%m-c3A`$Im`=1I?eq_La>wQBbY8kF#7JBucbL8%>^~2-k|3wv^Zl($ zmJAKq%aAYg7(8k5V%*_LU{}je;5vWNyYSF&3Y9A$6s{Q2IR&nuJj?2Ho?cBn>MtI$ z(Goo_dZ1_*6I&MPw5aGjI187I^S2!Qm%N^$19po-6L$}HdwX-H@F6>Sqa*i;muz~ysy&j%E#0G5z(jrR2_4U zFQX)-SgUNQi*U#?4a@bGzM78t6>~Y8#bD(<#_rKKO0`mYAWVB>3;WH zU9-fR#oT=3t08+P#+6dUGMiLVn$F@ijS9F~=bE~o^`YP=rda+#?~~EJ?x&76b5{3X z`F2@I-sEzKSbjW}kdFhkJj#ws$tBY8#5Y7FkF7<>bKJj!E33=xRY?@Aq;AV!*dLm@ zMe;IXoKQ8L|J;^xXy?>8@O{|1kF2e%Olq&>kt=dfZ{`@BH71fuub5gtA@{_KmB#u_^w?`z`+Mry*iVN9?IHP8xn4_ajJW z(dFNzZW9Jy%0S{rUb*ijA(fsRjiVw-{HM_xw6YHkU5DU67U(15p(8& zr8R{ix+f8gyXw?O`t<%W;*)jz1Md8fQA_j2wHzF@-&<-{6_ZZ!6<~Bg2r7L+Bnm71 z?TjGRFikfN+xBs9c)l04#}9saRrU9>695xyAhas8F%!%`e|2Q@IYp&Hd^iu1Lq7ddCNW{lw7((a?u_R$fL9v-VP0lxvh*^v@;Rsid(1 z2PhV@tUbPe{#}eRQnU2d4cfk>rU>CN!>JcrM&Y0QFs6QPMigDEmFtC!F`dNl)&v#a zJYsTF`-5lM+nSDYtUJAL*M8FRbGnkdmI4J%4hlYFF)H_u=Wj^!t#}t0klCG#{;hW| z+^{+oI|{WzP70L#Mj=Sz0lv;?;rHi=%u_9TOntErRl|6Rx=-esG6iUG4}PA(ZB6Al zhuraLEF%pn!rwCagm5K#m8S^_&#&>mbaZ9hCG!ou_}L_PRP3@Kshcd~UJ%NE;nF91Ap{d@ZJKJD7YX9iQsyFCU(MIoMD1ZQJmK$7AgMdvTOKeig;vv^ zF&$8SY)TH?^F|3)iZ;nwRp~m9FZv zI%gBFWS+z=vEp9v!ROwI-?kYkKHRX+UA;JnW1!J{`lT}2v8${{?Kl(%Q97M)kqDj~ z`dd!vh}wIrgR78qWz3RvXZ8F^W%d%RjxkuH7rv_Y>spP+!PT`}R!gFCGR;zv&gq?{ zXVU!gz*G$`M5k@Af?9gfrA~S9v+Dcm;49v+Mg#3ODj>zr{<*Ie? zReY}ZCIvbBnr3Plokgt3c@ZtAkcJbMmh~AK#dB*TlXWg9WNy9DyEmpTk(qR$FsFm^ zsT!7xTaxfEHB)X4uu*0m9r$RiN5=Ld>cjNN~=62p39+3xNR?07?KAfEqvppaswY=m87>MgS9l z8NdQy1+W3w0UQ8M02hE8zysg~@B#P%0)Q(3LBM}AuL6Vt5P%5a8bA~v1`r2G03-oY z0BL{>Ko)QvAP0~KC;$`zO094qXhEmo|Gih&K_E_$7_jVr3j)Fs7op-b3av0T&kUU4 z5)=;B!PzfC5fm-rd0pbdxYi}845i4TI8JI&{2GpC87c!t;*^%5=HM_~@-kElyou{y zhFVi}kKw?pP=1`^3KU8)@aca|!U|LojKZ!$1#tKUC^K$;1sER#dIcKqMJSN}ACpqE ADF6Tf delta 3573 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