From 6c298b0685f7f9160d3fdaed0aa7c283095e4774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E5=AE=87=E4=BC=A6?= Date: Wed, 12 Jun 2024 21:43:46 +0800 Subject: [PATCH 01/71] add supportment for non-centralized pinhole cameras data --- scene/cameras.py | 12 ++++++------ scene/dataset_readers.py | 22 +++++++++++++++------- utils/camera_utils.py | 10 ++++++---- utils/graphics_utils.py | 40 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 66 insertions(+), 18 deletions(-) diff --git a/scene/cameras.py b/scene/cameras.py index 4a5d84a8..db68dd63 100644 --- a/scene/cameras.py +++ b/scene/cameras.py @@ -3,7 +3,7 @@ # GRAPHDECO research group, https://team.inria.fr/graphdeco # All rights reserved. # -# This software is free for non-commercial, research and evaluation use +# This software is free for non-commercial, research and evaluation use # under the terms of the LICENSE.md file. # # For inquiries contact george.drettakis@inria.fr @@ -12,11 +12,11 @@ import torch from torch import nn import numpy as np -from utils.graphics_utils import getWorld2View2, getProjectionMatrix +from utils.graphics_utils import getWorld2View2, getProjectionMatrixShift class Camera(nn.Module): def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, - image_name, uid, + image_name, uid, principal_point_ndc, trans=np.array([0.0, 0.0, 0.0]), scale=1.0, data_device = "cuda" ): super(Camera, self).__init__() @@ -46,7 +46,7 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, else: self.original_image *= torch.ones((1, self.image_height, self.image_width), device=self.data_device) self.gt_alpha_mask = None - + self.zfar = 100.0 self.znear = 0.01 @@ -54,14 +54,14 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.scale = scale self.world_view_transform = torch.tensor(getWorld2View2(R, T, trans, scale)).transpose(0, 1).cuda() - self.projection_matrix = getProjectionMatrix(znear=self.znear, zfar=self.zfar, fovX=self.FoVx, fovY=self.FoVy).transpose(0,1).cuda() + self.projection_matrix = getProjectionMatrixShift(znear=self.znear, zfar=self.zfar, fovX=self.FoVx, fovY=self.FoVy, width=self.image_width, height=self.image_height, principal_point_ndc=principal_point_ndc).transpose(0,1).cuda() self.full_proj_transform = (self.world_view_transform.unsqueeze(0).bmm(self.projection_matrix.unsqueeze(0))).squeeze(0) self.camera_center = self.world_view_transform.inverse()[3, :3] class MiniCam: def __init__(self, width, height, fovy, fovx, znear, zfar, world_view_transform, full_proj_transform): self.image_width = width - self.image_height = height + self.image_height = height self.FoVy = fovy self.FoVx = fovx self.znear = znear diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index 2a6f904a..517801fc 100644 --- a/scene/dataset_readers.py +++ b/scene/dataset_readers.py @@ -3,7 +3,7 @@ # GRAPHDECO research group, https://team.inria.fr/graphdeco # All rights reserved. # -# This software is free for non-commercial, research and evaluation use +# This software is free for non-commercial, research and evaluation use # under the terms of the LICENSE.md file. # # For inquiries contact george.drettakis@inria.fr @@ -34,6 +34,7 @@ class CameraInfo(NamedTuple): image_name: str width: int height: int + principal_point_ndc: np.array class SceneInfo(NamedTuple): point_cloud: BasicPointCloud @@ -84,22 +85,29 @@ def readColmapCameras(cam_extrinsics, cam_intrinsics, images_folder): if intr.model=="SIMPLE_PINHOLE": focal_length_x = intr.params[0] + cx = intr.params[1] + cy = intr.params[2] FovY = focal2fov(focal_length_x, height) FovX = focal2fov(focal_length_x, width) elif intr.model=="PINHOLE": focal_length_x = intr.params[0] focal_length_y = intr.params[1] + cx = intr.params[2] + cy = intr.params[3] FovY = focal2fov(focal_length_y, height) FovX = focal2fov(focal_length_x, width) else: assert False, "Colmap camera model not handled: only undistorted datasets (PINHOLE or SIMPLE_PINHOLE cameras) supported!" + principal_point_ndc = np.array([cx / width, cy / height]) + image_path = os.path.join(images_folder, os.path.basename(extr.name)) image_name = os.path.basename(image_path).split(".")[0] image = Image.open(image_path) cam_info = CameraInfo(uid=uid, R=R, T=T, FovY=FovY, FovX=FovX, image=image, - image_path=image_path, image_name=image_name, width=width, height=height) + image_path=image_path, image_name=image_name, width=width, height=height, + principal_point_ndc=principal_point_ndc) cam_infos.append(cam_info) sys.stdout.write('\n') return cam_infos @@ -117,7 +125,7 @@ def storePly(path, xyz, rgb): dtype = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('nx', 'f4'), ('ny', 'f4'), ('nz', 'f4'), ('red', 'u1'), ('green', 'u1'), ('blue', 'u1')] - + normals = np.zeros_like(xyz) elements = np.empty(xyz.shape[0], dtype=dtype) @@ -210,12 +218,12 @@ def readCamerasFromTransforms(path, transformsfile, white_background, extension= image = Image.fromarray(np.array(arr*255.0, dtype=np.byte), "RGB") fovy = focal2fov(fov2focal(fovx, image.size[0]), image.size[1]) - FovY = fovy + FovY = fovy FovX = fovx cam_infos.append(CameraInfo(uid=idx, R=R, T=T, FovY=FovY, FovX=FovX, image=image, image_path=image_path, image_name=image_name, width=image.size[0], height=image.size[1])) - + return cam_infos def readNerfSyntheticInfo(path, white_background, eval, extension=".png"): @@ -223,7 +231,7 @@ def readNerfSyntheticInfo(path, white_background, eval, extension=".png"): train_cam_infos = readCamerasFromTransforms(path, "transforms_train.json", white_background, extension) print("Reading Test Transforms") test_cam_infos = readCamerasFromTransforms(path, "transforms_test.json", white_background, extension) - + if not eval: train_cam_infos.extend(test_cam_infos) test_cam_infos = [] @@ -235,7 +243,7 @@ def readNerfSyntheticInfo(path, white_background, eval, extension=".png"): # Since this data set has no colmap data, we start with random points num_pts = 100_000 print(f"Generating random point cloud ({num_pts})...") - + # We create random points inside the bounds of the synthetic Blender scenes xyz = np.random.random((num_pts, 3)) * 2.6 - 1.3 shs = np.random.random((num_pts, 3)) / 255.0 diff --git a/utils/camera_utils.py b/utils/camera_utils.py index 0af952a5..a2a978ce 100644 --- a/utils/camera_utils.py +++ b/utils/camera_utils.py @@ -3,7 +3,7 @@ # GRAPHDECO research group, https://team.inria.fr/graphdeco # All rights reserved. # -# This software is free for non-commercial, research and evaluation use +# This software is free for non-commercial, research and evaluation use # under the terms of the LICENSE.md file. # # For inquiries contact george.drettakis@inria.fr @@ -48,10 +48,12 @@ def loadCam(args, id, cam_info, resolution_scale): loaded_mask = None gt_image = resized_image_rgb - return Camera(colmap_id=cam_info.uid, R=cam_info.R, T=cam_info.T, - FoVx=cam_info.FovX, FoVy=cam_info.FovY, + return Camera(colmap_id=cam_info.uid, R=cam_info.R, T=cam_info.T, + FoVx=cam_info.FovX, FoVy=cam_info.FovY, image=gt_image, gt_alpha_mask=loaded_mask, - image_name=cam_info.image_name, uid=id, data_device=args.data_device) + image_name=cam_info.image_name, uid=id, + principal_point_ndc=cam_info.principal_point_ndc, + data_device=args.data_device) def cameraList_from_camInfos(cam_infos, resolution_scale, args): camera_list = [] diff --git a/utils/graphics_utils.py b/utils/graphics_utils.py index b4627d83..0f3851ef 100644 --- a/utils/graphics_utils.py +++ b/utils/graphics_utils.py @@ -3,7 +3,7 @@ # GRAPHDECO research group, https://team.inria.fr/graphdeco # All rights reserved. # -# This software is free for non-commercial, research and evaluation use +# This software is free for non-commercial, research and evaluation use # under the terms of the LICENSE.md file. # # For inquiries contact george.drettakis@inria.fr @@ -70,6 +70,44 @@ def getProjectionMatrix(znear, zfar, fovX, fovY): P[2, 3] = -(zfar * znear) / (zfar - znear) return P +def getProjectionMatrixShift(znear, zfar, fovX, fovY, width, height, principal_point_ndc): + tanHalfFovY = math.tan((fovY / 2)) + tanHalfFovX = math.tan((fovX / 2)) + + # the origin at center of image plane + top = tanHalfFovY * znear + bottom = -top + right = tanHalfFovX * znear + left = -right + + # shift the frame window due to the non-zero principle point offsets + cx = width * principal_point_ndc[0] + cy = height * principal_point_ndc[1] + focal_x = fov2focal(fovX, width) + focal_y = fov2focal(fovY, height) + offset_x = cx - (width / 2) + offset_x = (offset_x / focal_x) * znear + offset_y = cy - (height / 2) + offset_y = (offset_y / focal_y) * znear + + top = top + offset_y + left = left + offset_x + right = right + offset_x + bottom = bottom + offset_y + + P = torch.zeros(4, 4) + + z_sign = 1.0 + + P[0, 0] = 2.0 * znear / (right - left) + P[1, 1] = 2.0 * znear / (top - bottom) + P[0, 2] = (right + left) / (right - left) + P[1, 2] = (top + bottom) / (top - bottom) + P[3, 2] = z_sign + P[2, 2] = z_sign * zfar / (zfar - znear) + P[2, 3] = -(zfar * znear) / (zfar - znear) + return P + def fov2focal(fov, pixels): return pixels / (2 * math.tan(fov / 2)) From 15b3aa83886939116dc6f20e782c91091acdaa87 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Tue, 23 Jul 2024 15:13:19 +0800 Subject: [PATCH 02/71] feat: Add normal loader --- scene/cameras.py | 10 +++++++++- utils/camera_utils.py | 26 ++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/scene/cameras.py b/scene/cameras.py index 4a5d84a8..7233367a 100644 --- a/scene/cameras.py +++ b/scene/cameras.py @@ -16,7 +16,7 @@ class Camera(nn.Module): def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, - image_name, uid, + image_name, uid, normal=None, trans=np.array([0.0, 0.0, 0.0]), scale=1.0, data_device = "cuda" ): super(Camera, self).__init__() @@ -37,6 +37,14 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.data_device = torch.device("cuda") self.original_image = image.clamp(0.0, 1.0).to(self.data_device) + if normal is not None: + self.normal = normal.to(self.data_device) + normal_norm = torch.norm(self.normal, dim=0, keepdim=True) + self.normal_mask = ~((normal_norm > 1.1) | (normal_norm < 0.9)) + self.normal = self.normal / normal_norm + else: + self.normal = None + self.normal_mask = None self.image_width = self.original_image.shape[2] self.image_height = self.original_image.shape[1] diff --git a/utils/camera_utils.py b/utils/camera_utils.py index 0af952a5..96573387 100644 --- a/utils/camera_utils.py +++ b/utils/camera_utils.py @@ -13,7 +13,9 @@ import numpy as np from utils.general_utils import PILtoTorch from utils.graphics_utils import fov2focal - +from PIL import Image +import os +import torch.nn.functional as F WARNED = False def loadCam(args, id, cam_info, resolution_scale): @@ -48,9 +50,29 @@ def loadCam(args, id, cam_info, resolution_scale): loaded_mask = None gt_image = resized_image_rgb + if args.w_normal_prior: + import torch + # normal_path = cam_info.image_path.replace('images_4', args.w_normal_prior) + normal_path = os.path.join(os.path.dirname(os.path.dirname(cam_info.image_path)), args.w_normal_prior, os.path.basename(cam_info.image_path)) + if os.path.exists(normal_path[:-4]+ '.npy'): + _normal = torch.tensor(np.load(normal_path[:-4]+ '.npy')) + _normal = - (_normal * 2 - 1) + resized_normal = F.interpolate(_normal.unsqueeze(0), size=resolution[::-1], mode='bicubic') + _normal = resized_normal.squeeze(0) + else: + _normal = Image.open(normal_path[:-4]+ '.png') + resized_normal = PILtoTorch(_normal, resolution) + resized_normal = resized_normal[:3] + _normal = - (resized_normal * 2 - 1) + # normalize normal + _normal = _normal.permute(1, 2, 0) @ (torch.tensor(np.linalg.inv(cam_info.R)).float()) + _normal = _normal.permute(2, 0, 1) + else: + _normal = None + return Camera(colmap_id=cam_info.uid, R=cam_info.R, T=cam_info.T, FoVx=cam_info.FovX, FoVy=cam_info.FovY, - image=gt_image, gt_alpha_mask=loaded_mask, + image=gt_image, normal=_normal, gt_alpha_mask=loaded_mask, image_name=cam_info.image_name, uid=id, data_device=args.data_device) def cameraList_from_camInfos(cam_infos, resolution_scale, args): From 9c49968f67213116d220e6cb1b6db72705678683 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sat, 31 Aug 2024 00:13:28 +0800 Subject: [PATCH 03/71] feat: Add ranking normal loss from Wonder3D --- train.py | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/train.py b/train.py index 614573eb..d699ba8b 100644 --- a/train.py +++ b/train.py @@ -12,9 +12,10 @@ import os import torch from random import randint -from utils.loss_utils import l1_loss, ssim +from utils.loss_utils import l1_loss, cos_loss, ssim from gaussian_renderer import render, network_gui import sys +import torch.nn.functional as F from scene import Scene, GaussianModel from utils.general_utils import safe_state import uuid @@ -28,6 +29,19 @@ except ImportError: TENSORBOARD_FOUND = False +def ranking_loss(error, penalize_ratio=0.7, extra_weights=None , type='mean'): + error, indices = torch.sort(error) + # only sum relatively small errors + s_error = torch.index_select(error, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + if extra_weights is not None: + weights = torch.index_select(extra_weights, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + s_error = s_error * weights + + if type == 'mean': + return torch.mean(s_error) + elif type == 'sum': + return torch.sum(s_error) + def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint): first_iter = 0 tb_writer = prepare_output_and_logger(dataset) @@ -74,15 +88,35 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) # regularization - lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 + # lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 + lambda_normal = 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 - + lambda_normal_prior = opt.lambda_normal_prior * (7000 - iteration) / 7000 if iteration < 7000 else opt.lambda_normal_prior + rend_dist = render_pkg["rend_dist"] + dist_loss = lambda_dist * (rend_dist).mean() + rend_normal = render_pkg['rend_normal'] surf_normal = render_pkg['surf_normal'] + rend_alpha = render_pkg['rend_alpha'] + normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] - normal_loss = lambda_normal * (normal_error).mean() - dist_loss = lambda_dist * (rend_dist).mean() + if viewpoint_cam.normal is not None: + prior_normal = viewpoint_cam.normal * (rend_alpha).detach() + prior_normal_mask = viewpoint_cam.normal_mask[0] + + # normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + # (1 - F.cosine_similarity(prior_normal, surf_normal, dim=0)) + # TODO: Add geo_aware + # normal_prior_error = normal_prior_error * torch.exp(cosines.abs()) / torch.exp(cosines.abs()).sum() + + # normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=0.8, type='mean') + + normal_prior_error = cos_loss(prior_normal[:, prior_normal_mask], rend_normal[:, prior_normal_mask]) + \ + cos_loss(prior_normal[:, prior_normal_mask], surf_normal[:, prior_normal_mask]) + normal_loss = lambda_normal * normal_error.mean() + lambda_normal_prior * normal_prior_error + else: + normal_loss = lambda_normal * normal_error.mean() # loss total_loss = loss + dist_loss + normal_loss @@ -116,7 +150,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi tb_writer.add_scalar('train_loss_patches/dist_loss', ema_dist_for_log, iteration) tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) - training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) if (iteration in saving_iterations): print("\n[ITER {}] Saving Gaussians".format(iteration)) scene.save(iteration) @@ -136,6 +170,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Optimizer step if iteration < opt.iterations: + # visible = radii > 0 + # gaussians.optimizer.step(visible, radii.shape[0]) gaussians.optimizer.step() gaussians.optimizer.zero_grad(set_to_none = True) @@ -258,8 +294,8 @@ def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_i parser.add_argument('--ip', type=str, default="127.0.0.1") parser.add_argument('--port', type=int, default=6009) parser.add_argument('--detect_anomaly', action='store_true', default=False) - parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 30_000]) - parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 30_000]) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) parser.add_argument("--start_checkpoint", type=str, default = None) From 79a475becc12da4acbd3a801b5e744da380cc720 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sat, 31 Aug 2024 00:13:48 +0800 Subject: [PATCH 04/71] feat: Add normal gradient loss --- train.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/train.py b/train.py index d699ba8b..76e299fe 100644 --- a/train.py +++ b/train.py @@ -42,6 +42,21 @@ def ranking_loss(error, penalize_ratio=0.7, extra_weights=None , type='mean'): elif type == 'sum': return torch.sum(s_error) +def normal_gradient_loss(rend_normal, gt_normal): + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + + return loss_x + loss_y + def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint): first_iter = 0 tb_writer = prepare_output_and_logger(dataset) @@ -88,10 +103,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) # regularization - # lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 - lambda_normal = 0.0 + lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior * (7000 - iteration) / 7000 if iteration < 7000 else opt.lambda_normal_prior + lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 7000 else 0.0 rend_dist = render_pkg["rend_dist"] dist_loss = lambda_dist * (rend_dist).mean() @@ -100,7 +115,6 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi surf_normal = render_pkg['surf_normal'] rend_alpha = render_pkg['rend_alpha'] - normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] if viewpoint_cam.normal is not None: prior_normal = viewpoint_cam.normal * (rend_alpha).detach() prior_normal_mask = viewpoint_cam.normal_mask[0] @@ -114,8 +128,11 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_prior_error = cos_loss(prior_normal[:, prior_normal_mask], rend_normal[:, prior_normal_mask]) + \ cos_loss(prior_normal[:, prior_normal_mask], surf_normal[:, prior_normal_mask]) - normal_loss = lambda_normal * normal_error.mean() + lambda_normal_prior * normal_prior_error + normal_loss = lambda_normal_prior * normal_prior_error + if lambda_normal_gradient > 0.0: + normal_loss += lambda_normal_gradient * normal_gradient_loss(rend_normal, prior_normal) else: + normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] normal_loss = lambda_normal * normal_error.mean() # loss From da4d0381b20563204731258d362c9a9696d1f373 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 1 Sep 2024 16:03:12 +0800 Subject: [PATCH 05/71] feat: Add low contribution gaussian pruning --- train.py | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/train.py b/train.py index 76e299fe..5cc00734 100644 --- a/train.py +++ b/train.py @@ -29,6 +29,25 @@ except ImportError: TENSORBOARD_FOUND = False +def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): + top_list = [None, ] * K + for i, cam in enumerate(cameras): + trans = render(cam, gaussians, pipe, bg, record_transmittance=True) + if top_list[0] is not None: + m = trans > top_list[0] + if m.any(): + for i in range(K - 1): + top_list[K - 1 - i][m] = top_list[K - 2 - i][m] + top_list[0][m] = trans[m] + else: + top_list = [trans.clone() for _ in range(K)] + + contribution = torch.stack(top_list, dim=-1).mean(-1) + tile = torch.quantile(contribution, prune_ratio) + prune_mask = contribution < tile + gaussians.prune_points(prune_mask) + torch.cuda.empty_cache() + def ranking_loss(error, penalize_ratio=0.7, extra_weights=None , type='mean'): error, indices = torch.sort(error) # only sum relatively small errors @@ -80,6 +99,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") first_iter += 1 + all_cameras = scene.getTrainCameras().copy()[::3] for iteration in range(first_iter, opt.iterations + 1): iter_start.record() @@ -119,15 +139,14 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi prior_normal = viewpoint_cam.normal * (rend_alpha).detach() prior_normal_mask = viewpoint_cam.normal_mask[0] - # normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - # (1 - F.cosine_similarity(prior_normal, surf_normal, dim=0)) + normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + (1 - F.cosine_similarity(prior_normal, surf_normal, dim=0)) # TODO: Add geo_aware # normal_prior_error = normal_prior_error * torch.exp(cosines.abs()) / torch.exp(cosines.abs()).sum() - # normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=0.8, type='mean') - - normal_prior_error = cos_loss(prior_normal[:, prior_normal_mask], rend_normal[:, prior_normal_mask]) + \ - cos_loss(prior_normal[:, prior_normal_mask], surf_normal[:, prior_normal_mask]) + normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=0.7, type='mean') + # normal_prior_error = cos_loss(prior_normal[:, prior_normal_mask], rend_normal[:, prior_normal_mask]) + \ + # cos_loss(prior_normal[:, prior_normal_mask], surf_normal[:, prior_normal_mask]) normal_loss = lambda_normal_prior * normal_prior_error if lambda_normal_gradient > 0.0: normal_loss += lambda_normal_gradient * normal_gradient_loss(rend_normal, prior_normal) @@ -182,6 +201,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi size_threshold = 20 if iteration > opt.opacity_reset_interval else None gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, size_threshold) + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: + prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, K=5, prune_ratio=opt.contribution_prune_ratio) + print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') + if iteration % opt.opacity_reset_interval == 0 or (dataset.white_background and iteration == opt.densify_from_iter): gaussians.reset_opacity() From 340792a6706730e0b0761eb2037c622019312653 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 1 Sep 2024 16:04:15 +0800 Subject: [PATCH 06/71] fix: Update transmittance recording for prune --- gaussian_renderer/__init__.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 3b217802..6dd0cce6 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -16,7 +16,7 @@ from utils.sh_utils import eval_sh from utils.point_utils import depth_to_normal -def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, scaling_modifier = 1.0, override_color = None): +def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, scaling_modifier = 1.0, override_color = None, record_transmittance=False): """ Render the scene. @@ -24,7 +24,7 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, """ # Create zero tensor. We will use it to make pytorch return gradients of the 2D (screen-space) means - screenspace_points = torch.zeros_like(pc.get_xyz, dtype=pc.get_xyz.dtype, requires_grad=True, device="cuda") + 0 + screenspace_points = torch.zeros((pc.get_xyz.shape[0], 4), dtype=pc.get_xyz.dtype, requires_grad=True, device="cuda") + 0 try: screenspace_points.retain_grad() except: @@ -46,6 +46,7 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, sh_degree=pc.active_sh_degree, campos=viewpoint_camera.camera_center, prefiltered=False, + record_transmittance=record_transmittance, debug=False, # pipe.debug ) @@ -93,8 +94,8 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, shs = pc.get_features else: colors_precomp = override_color - - rendered_image, radii, allmap = rasterizer( + + output = rasterizer( means3D = means3D, means2D = means2D, shs = shs, @@ -105,6 +106,13 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, cov3D_precomp = cov3D_precomp ) + if record_transmittance: + transmittance_sum, num_covered_pixels, radii = output + transmittance = transmittance_sum / (num_covered_pixels + 1e-6) + return transmittance + else: + rendered_image, radii, allmap = output + # Those Gaussians that were frustum culled or had a radius of 0 were not visible. # They will be excluded from value updates used in the splitting criteria. rets = {"render": rendered_image, From da727ef81b500f9e69957dce74b17d124bc6f7c7 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 1 Sep 2024 16:04:55 +0800 Subject: [PATCH 07/71] fix: Update normal_prior, pruning config --- arguments/__init__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index 2977a888..e6e7a37c 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -55,6 +55,7 @@ def __init__(self, parser, sentinel=False): self.data_device = "cuda" self.eval = False self.render_items = ['RGB', 'Alpha', 'Normal', 'Depth', 'Edge', 'Curvature'] + self.w_normal_prior = "" super().__init__(parser, "Loading Parameters", sentinel) def extract(self, args): @@ -83,8 +84,10 @@ def __init__(self, parser): self.rotation_lr = 0.001 self.percent_dense = 0.01 self.lambda_dssim = 0.2 - self.lambda_dist = 0.0 + self.lambda_dist = 0. self.lambda_normal = 0.05 + self.lambda_normal_prior = 0.25 + self.lambda_normal_gradient = 0. self.opacity_cull = 0.05 self.densification_interval = 100 @@ -92,6 +95,10 @@ def __init__(self, parser): self.densify_from_iter = 500 self.densify_until_iter = 15_000 self.densify_grad_threshold = 0.0002 + + self.contribution_prune_from_iter = 500 + self.contribution_prune_interval = 300 + self.contribution_prune_ratio = 0.1 super().__init__(parser, "Optimization Parameters") def get_combined_args(parser : ArgumentParser): From 33095dae8a16db3877c3facfba7674816f001ba7 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 4 Sep 2024 13:51:44 +0800 Subject: [PATCH 08/71] feat: Add appearance network model and update optimization params - Introduced `AppearanceNetwork` and `UpsampleBlock` classes in `scene/appearance_model.py` - Added decoupled appearance parameter and new learning rates in `ModelParams` and `OptimizationParams` - Adjusted lambda values in `OptimizationParams` for better optimization control --- arguments/__init__.py | 7 ++- scene/appearance_model.py | 93 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 scene/appearance_model.py diff --git a/arguments/__init__.py b/arguments/__init__.py index e6e7a37c..f4a965fa 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -56,6 +56,7 @@ def __init__(self, parser, sentinel=False): self.eval = False self.render_items = ['RGB', 'Alpha', 'Normal', 'Depth', 'Edge', 'Curvature'] self.w_normal_prior = "" + self.use_decoupled_appearance = False super().__init__(parser, "Loading Parameters", sentinel) def extract(self, args): @@ -82,12 +83,14 @@ def __init__(self, parser): self.opacity_lr = 0.05 self.scaling_lr = 0.005 self.rotation_lr = 0.001 + self.appearance_embeddings_lr = 0.001 + self.appearance_network_lr = 0.001 self.percent_dense = 0.01 self.lambda_dssim = 0.2 - self.lambda_dist = 0. + self.lambda_dist = 10. self.lambda_normal = 0.05 self.lambda_normal_prior = 0.25 - self.lambda_normal_gradient = 0. + self.lambda_normal_gradient = 0.1 self.opacity_cull = 0.05 self.densification_interval = 100 diff --git a/scene/appearance_model.py b/scene/appearance_model.py new file mode 100644 index 00000000..a3f15e01 --- /dev/null +++ b/scene/appearance_model.py @@ -0,0 +1,93 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +class UpsampleBlock(nn.Module): + def __init__(self, num_input_channels, num_output_channels): + super(UpsampleBlock, self).__init__() + self.pixel_shuffle = nn.PixelShuffle(2) + self.conv = nn.Conv2d(num_input_channels // (2 * 2), num_output_channels, 3, stride=1, padding=1) + self.relu = nn.ReLU() + + def forward(self, x): + x = self.pixel_shuffle(x) + x = self.conv(x) + x = self.relu(x) + return x + +class AppearanceNetwork(nn.Module): + def __init__(self, num_input_channels, num_output_channels): + super(AppearanceNetwork, self).__init__() + + self.conv1 = nn.Conv2d(num_input_channels, 256, 3, stride=1, padding=1) + self.up1 = UpsampleBlock(256, 128) + self.up2 = UpsampleBlock(128, 64) + self.up3 = UpsampleBlock(64, 32) + self.up4 = UpsampleBlock(32, 16) + + self.conv2 = nn.Conv2d(16, 16, 3, stride=1, padding=1) + self.conv3 = nn.Conv2d(16, num_output_channels, 3, stride=1, padding=1) + self.relu = nn.ReLU() + self.sigmoid = nn.Sigmoid() + + def forward(self, x): + x = self.conv1(x) + x = self.relu(x) + x = self.up1(x) + x = self.up2(x) + x = self.up3(x) + x = self.up4(x) + # bilinear interpolation + x = F.interpolate(x, scale_factor=2, mode='bilinear', align_corners=True) + x = self.conv2(x) + x = self.relu(x) + x = self.conv3(x) + x = self.sigmoid(x) + return x + +class AppearanceModel: + def __init__(self, num_embeddings, num_input_channels=67, num_output_channels=3): + self.appearance_network = AppearanceNetwork(num_input_channels, num_output_channels).cuda() + + std = 1e-4 + self._appearance_embeddings = nn.Parameter(torch.empty(num_embeddings, 64).cuda()) + self._appearance_embeddings.data.normal_(0, std) + + def get_embedding(self, idx): + return self._appearance_embeddings[idx] + + def setup_optimizer(self, lr_appearance_embeddings, lr_appearance_network): + params = [ + {'params': [self._appearance_embeddings], 'lr': lr_appearance_embeddings, "name": "appearance_embeddings"}, + {'params': self.appearance_network.parameters(), 'lr': lr_appearance_network, "name": "appearance_network"} + ] + self.optimizer = torch.optim.Adam(params, lr=0.0, eps=1e-15) + + def training_setup(self, training_args): + params = [ + {'params': [self._appearance_embeddings], 'lr': training_args.appearance_embeddings_lr, "name": "appearance_embeddings"}, + {'params': self.appearance_network.parameters(), 'lr': training_args.appearance_network_lr, "name": "appearance_network"} + ] + self.optimizer = torch.optim.Adam(params, lr=0.0, eps=1e-15) + + def load_state_dict(self, state_dict): + self._appearance_embeddings = state_dict["_appearance_embeddings"] + self.appearance_network.load_state_dict(state_dict["appearance_network"]) + + def state_dict(self): + return { + "_appearance_embeddings": self._appearance_embeddings, + "appearance_network": self.appearance_network.state_dict() + } + + + +if __name__ == "__main__": + H, W = 1200//32, 1600//32 + input_channels = 3 + 64 + output_channels = 3 + input = torch.randn(1, input_channels, H, W).cuda() + model = AppearanceNetwork(input_channels, output_channels).cuda() + + output = model(input) + print(output.shape) \ No newline at end of file From c0d1c27a45759c7c65d4a207e5a3bad7d96d522d Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 4 Sep 2024 13:54:15 +0800 Subject: [PATCH 09/71] feat: Add edge-aware normal gradient loss and appearance model - Introduced `edge_aware_normal_gradient_loss` for better edge handling - Integrated `AppearanceModel` to support decoupled appearance handling - Enhanced normal handling with expected normal calculation in renderer --- gaussian_renderer/__init__.py | 6 ++- train.py | 79 ++++++++++++++++++++++++++++------- utils/loss_utils.py | 23 ++++++++++ 3 files changed, 91 insertions(+), 17 deletions(-) diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 6dd0cce6..1b630870 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -149,9 +149,10 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, surf_depth = render_depth_expected * (1-pipe.depth_ratio) + (pipe.depth_ratio) * render_depth_median # assume the depth points form the 'surface' and generate psudo surface normal for regularizations. - surf_normal = depth_to_normal(viewpoint_camera, surf_depth) - surf_normal = surf_normal.permute(2,0,1) + surf_normal_expected = depth_to_normal(viewpoint_camera, render_depth_expected).permute(2,0,1) + surf_normal = depth_to_normal(viewpoint_camera, render_depth_median).permute(2,0,1) # remember to multiply with accum_alpha since render_normal is unnormalized. + surf_normal_expected = surf_normal_expected * (render_alpha).detach() surf_normal = surf_normal * (render_alpha).detach() @@ -160,6 +161,7 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, 'rend_normal': render_normal, 'rend_dist': render_dist, 'surf_depth': surf_depth, + 'surf_normal_expected': surf_normal_expected, 'surf_normal': surf_normal, }) diff --git a/train.py b/train.py index 5cc00734..07bf40d1 100644 --- a/train.py +++ b/train.py @@ -12,11 +12,11 @@ import os import torch from random import randint -from utils.loss_utils import l1_loss, cos_loss, ssim +from utils.loss_utils import l1_loss_appearance, ssim from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F -from scene import Scene, GaussianModel +from scene import Scene, GaussianModel, AppearanceModel from utils.general_utils import safe_state import uuid from tqdm import tqdm @@ -75,7 +75,45 @@ def normal_gradient_loss(rend_normal, gt_normal): loss_y = F.mse_loss(rend_grad_y, gt_grad_y) return loss_x + loss_y - + +def edge_aware_normal_gradient_loss(gt_image, rend_normal, gt_normal, prior_normal_mask, edge_threshold=1): + # Define Sobel filters + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + + # Compute gradients of rendered and ground truth normals + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + # Compute gradients of gt_image for edge detection + dI_dx = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_x, padding=1) for i in range(gt_image.shape[0])]) + dI_dx = torch.mean(torch.abs(dI_dx), 1, keepdim=True) + dI_dy = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_y, padding=1) for i in range(gt_image.shape[0])]) + dI_dy = torch.mean(torch.abs(dI_dy), 1, keepdim=True) + + # Compute edge strength + edge_strength = dI_dx + dI_dy + + # Create non-edge mask + non_edge_mask = (edge_strength < edge_threshold).float() + + # Compute loss for gradients + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + loss = loss_x + loss_y + + # Apply non-edge mask and prior_normal_mask + masked_loss = loss * non_edge_mask * prior_normal_mask + + # Normalize by the number of non-edge pixels + num_non_edge_pixels = torch.sum(non_edge_mask * prior_normal_mask) + 1e-6 + normalized_loss = torch.sum(masked_loss) / num_non_edge_pixels + + return normalized_loss + def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint): first_iter = 0 tb_writer = prepare_output_and_logger(dataset) @@ -99,7 +137,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") first_iter += 1 - all_cameras = scene.getTrainCameras().copy()[::3] + all_cameras = scene.getTrainCameras() + if dataset.use_decoupled_appearance: + appearances = AppearanceModel(len(all_cameras)) + appearances.training_setup(opt) + else: + appearances = None + for iteration in range(first_iter, opt.iterations + 1): iter_start.record() @@ -113,13 +157,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Pick a random Camera if not viewpoint_stack: viewpoint_stack = scene.getTrainCameras().copy() - viewpoint_cam = viewpoint_stack.pop(randint(0, len(viewpoint_stack)-1)) - + viewpoint_idx = randint(0, len(all_cameras)-1) + viewpoint_cam = all_cameras[viewpoint_idx] render_pkg = render(viewpoint_cam, gaussians, pipe, background) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] gt_image = viewpoint_cam.original_image.cuda() - Ll1 = l1_loss(image, gt_image) + Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) # regularization @@ -133,6 +177,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi rend_normal = render_pkg['rend_normal'] surf_normal = render_pkg['surf_normal'] + surf_normal_expected = render_pkg['surf_normal_expected'] rend_alpha = render_pkg['rend_alpha'] if viewpoint_cam.normal is not None: @@ -140,16 +185,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi prior_normal_mask = viewpoint_cam.normal_mask[0] normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - (1 - F.cosine_similarity(prior_normal, surf_normal, dim=0)) - # TODO: Add geo_aware - # normal_prior_error = normal_prior_error * torch.exp(cosines.abs()) / torch.exp(cosines.abs()).sum() + (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], + penalize_ratio=1.0, type='mean') - normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=0.7, type='mean') - # normal_prior_error = cos_loss(prior_normal[:, prior_normal_mask], rend_normal[:, prior_normal_mask]) + \ - # cos_loss(prior_normal[:, prior_normal_mask], surf_normal[:, prior_normal_mask]) normal_loss = lambda_normal_prior * normal_prior_error if lambda_normal_gradient > 0.0: - normal_loss += lambda_normal_gradient * normal_gradient_loss(rend_normal, prior_normal) + normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal, prior_normal) else: normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] normal_loss = lambda_normal * normal_error.mean() @@ -202,7 +244,11 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, size_threshold) if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: - prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, K=5, prune_ratio=opt.contribution_prune_ratio) + if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: + print("Skipped Pruning for", iteration) + continue + prune_low_contribution_gaussians(gaussians, all_cameras[::3], pipe, background, + K=1, prune_ratio=opt.contribution_prune_ratio) print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') if iteration % opt.opacity_reset_interval == 0 or (dataset.white_background and iteration == opt.densify_from_iter): @@ -214,6 +260,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # gaussians.optimizer.step(visible, radii.shape[0]) gaussians.optimizer.step() gaussians.optimizer.zero_grad(set_to_none = True) + if appearances is not None: + appearances.optimizer.step() + appearances.optimizer.zero_grad(set_to_none = True) if (iteration in checkpoint_iterations): print("\n[ITER {}] Saving Checkpoint".format(iteration)) diff --git a/utils/loss_utils.py b/utils/loss_utils.py index 7ef1d77d..202f805a 100644 --- a/utils/loss_utils.py +++ b/utils/loss_utils.py @@ -20,6 +20,28 @@ def l1_loss(network_output, gt): def l2_loss(network_output, gt): return ((network_output - gt) ** 2).mean() +def l1_loss_appearance(image, gt_image, appearances, view_idx): + if appearances is None: + return l1_loss(image, gt_image) + else: + appearance_embedding = appearances.get_embedding(view_idx) + # center crop the image + origH, origW = image.shape[1:] + H = origH // 32 * 32 + W = origW // 32 * 32 + left = origW // 2 - W // 2 + top = origH // 2 - H // 2 + crop_image = image[:, top:top+H, left:left+W] + crop_gt_image = gt_image[:, top:top+H, left:left+W] + + # down sample the image + crop_image_down = torch.nn.functional.interpolate(crop_image[None], size=(H//32, W//32), mode="bilinear", align_corners=True)[0] + + crop_image_down = torch.cat([crop_image_down, appearance_embedding[None].repeat(H//32, W//32, 1).permute(2, 0, 1)], dim=0)[None] + mapping_image = appearances.appearance_network(crop_image_down) + transformed_image = mapping_image * crop_image + return l1_loss(transformed_image, crop_gt_image) + def gaussian(window_size, sigma): gauss = torch.Tensor([exp(-(x - window_size // 2) ** 2 / float(2 * sigma ** 2)) for x in range(window_size)]) return gauss / gauss.sum() @@ -64,6 +86,7 @@ def _ssim(img1, img2, window, window_size, channel, size_average=True): C1 = 0.01 ** 2 C2 = 0.03 ** 2 + # C1 = C2 = 0.01 ** 2 ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2)) From 0df56b53f96455f8a8f023775f5e13d14db364bf Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 4 Sep 2024 13:55:41 +0800 Subject: [PATCH 10/71] fix: Update submodule --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 4d2d1242..e3855950 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "submodules/diff-surfel-rasterization"] path = submodules/diff-surfel-rasterization - url = https://github.com/hbb1/diff-surfel-rasterization.git + url = https://github.com/hugoycj/diff-surfel-rasterization-MCMC.git [submodule "submodules/simple-knn"] path = submodules/simple-knn url = https://gitlab.inria.fr/bkerbl/simple-knn.git From 69fd66405ba4fb6581104ca2e76c1be60f7dea7a Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 4 Sep 2024 14:01:51 +0800 Subject: [PATCH 11/71] fix: Update default resolution --- arguments/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index f4a965fa..c153f46f 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -50,7 +50,7 @@ def __init__(self, parser, sentinel=False): self._source_path = "" self._model_path = "" self._images = "images" - self._resolution = -1 + self._resolution = 2 self._white_background = False self.data_device = "cuda" self.eval = False From 99dba7b42293045f1a65adb507649b2d18f9e756 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 8 Sep 2024 18:33:52 +0800 Subject: [PATCH 12/71] fix: Update diff-surfel-rasterization and appearance model --- .gitignore | 3 ++- .gitmodules | 6 +++--- scene/__init__.py | 1 + scene/appearance_model.py | 7 ------- scene/dataset_readers.py | 2 +- submodules/diff-surfel-rasterization | 2 +- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index d9929e19..7fecbd5d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ data *.out eval *.npz -**/tmp \ No newline at end of file +**/tmp +eval_dtu \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index e3855950..da5edc04 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ -[submodule "submodules/diff-surfel-rasterization"] - path = submodules/diff-surfel-rasterization - url = https://github.com/hugoycj/diff-surfel-rasterization-MCMC.git [submodule "submodules/simple-knn"] path = submodules/simple-knn url = https://gitlab.inria.fr/bkerbl/simple-knn.git +[submodule "submodules/diff-surfel-rasterization"] + path = submodules/diff-surfel-rasterization + url = https://github.com/hugoycj/diff-surfel-rasterization-MCMC diff --git a/scene/__init__.py b/scene/__init__.py index cbd196d0..5d85d918 100644 --- a/scene/__init__.py +++ b/scene/__init__.py @@ -15,6 +15,7 @@ from utils.system_utils import searchForMaxIteration from scene.dataset_readers import sceneLoadTypeCallbacks from scene.gaussian_model import GaussianModel +from scene.appearance_model import AppearanceModel from arguments import ModelParams from utils.camera_utils import cameraList_from_camInfos, camera_to_JSON diff --git a/scene/appearance_model.py b/scene/appearance_model.py index a3f15e01..f1bf8dcd 100644 --- a/scene/appearance_model.py +++ b/scene/appearance_model.py @@ -56,13 +56,6 @@ def __init__(self, num_embeddings, num_input_channels=67, num_output_channels=3) def get_embedding(self, idx): return self._appearance_embeddings[idx] - def setup_optimizer(self, lr_appearance_embeddings, lr_appearance_network): - params = [ - {'params': [self._appearance_embeddings], 'lr': lr_appearance_embeddings, "name": "appearance_embeddings"}, - {'params': self.appearance_network.parameters(), 'lr': lr_appearance_network, "name": "appearance_network"} - ] - self.optimizer = torch.optim.Adam(params, lr=0.0, eps=1e-15) - def training_setup(self, training_args): params = [ {'params': [self._appearance_embeddings], 'lr': training_args.appearance_embeddings_lr, "name": "appearance_embeddings"}, diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index 517801fc..6460bbe0 100644 --- a/scene/dataset_readers.py +++ b/scene/dataset_readers.py @@ -89,7 +89,7 @@ def readColmapCameras(cam_extrinsics, cam_intrinsics, images_folder): cy = intr.params[2] FovY = focal2fov(focal_length_x, height) FovX = focal2fov(focal_length_x, width) - elif intr.model=="PINHOLE": + elif intr.model=="PINHOLE" or intr.model=='OPENCV': focal_length_x = intr.params[0] focal_length_y = intr.params[1] cx = intr.params[2] diff --git a/submodules/diff-surfel-rasterization b/submodules/diff-surfel-rasterization index 7bdbd515..b611171a 160000 --- a/submodules/diff-surfel-rasterization +++ b/submodules/diff-surfel-rasterization @@ -1 +1 @@ -Subproject commit 7bdbd5157fe5667b5cfbc5a51ab402c957f66e22 +Subproject commit b611171a903099eb137e0291726dc4e032cc741f From b48e3321c62f75d55165ac0c3da05237a08f1650 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 12 Sep 2024 00:54:22 +0800 Subject: [PATCH 13/71] fix: Tune hyperparameters --- arguments/__init__.py | 8 ++++---- scene/gaussian_model.py | 5 ++++- train.py | 15 +++++++-------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index c153f46f..f2717876 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -85,7 +85,7 @@ def __init__(self, parser): self.rotation_lr = 0.001 self.appearance_embeddings_lr = 0.001 self.appearance_network_lr = 0.001 - self.percent_dense = 0.01 + self.percent_dense = 0.0005 self.lambda_dssim = 0.2 self.lambda_dist = 10. self.lambda_normal = 0.05 @@ -97,11 +97,11 @@ def __init__(self, parser): self.opacity_reset_interval = 3000 self.densify_from_iter = 500 self.densify_until_iter = 15_000 - self.densify_grad_threshold = 0.0002 + self.densify_grad_threshold = 0.00015 self.contribution_prune_from_iter = 500 - self.contribution_prune_interval = 300 - self.contribution_prune_ratio = 0.1 + self.contribution_prune_interval = 1800 + self.contribution_prune_ratio = 0.5 super().__init__(parser, "Optimization Parameters") def get_combined_args(parser : ArgumentParser): diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 9d05b2cf..abd920a4 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -393,7 +393,10 @@ def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size): self.densify_and_clone(grads, max_grad, extent) self.densify_and_split(grads, max_grad, extent) - prune_mask = (self.get_opacity < min_opacity).squeeze() + if min_opacity > 0: + prune_mask = (self.get_opacity < min_opacity).squeeze() + else: + prune_mask = torch.zeros_like(self.get_opacity, dtype=bool).squeeze() if max_screen_size: big_points_vs = self.max_radii2D > max_screen_size big_points_ws = self.get_scaling.max(dim=1).values > 0.1 * extent diff --git a/train.py b/train.py index 07bf40d1..ad1a62b2 100644 --- a/train.py +++ b/train.py @@ -169,8 +169,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 - lambda_normal_prior = opt.lambda_normal_prior * (7000 - iteration) / 7000 if iteration < 7000 else opt.lambda_normal_prior - lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 7000 else 0.0 + lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 + lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 rend_dist = render_pkg["rend_dist"] dist_loss = lambda_dist * (rend_dist).mean() @@ -180,7 +180,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi surf_normal_expected = render_pkg['surf_normal_expected'] rend_alpha = render_pkg['rend_alpha'] - if viewpoint_cam.normal is not None: + normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] + normal_loss = lambda_normal * normal_error.mean() + if dataset.w_normal_prior: prior_normal = viewpoint_cam.normal * (rend_alpha).detach() prior_normal_mask = viewpoint_cam.normal_mask[0] @@ -189,12 +191,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') - normal_loss = lambda_normal_prior * normal_prior_error + normal_loss += lambda_normal_prior * normal_prior_error if lambda_normal_gradient > 0.0: normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal, prior_normal) - else: - normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] - normal_loss = lambda_normal * normal_error.mean() # loss total_loss = loss + dist_loss + normal_loss @@ -247,7 +246,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: print("Skipped Pruning for", iteration) continue - prune_low_contribution_gaussians(gaussians, all_cameras[::3], pipe, background, + prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, K=1, prune_ratio=opt.contribution_prune_ratio) print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') From d799e51882d20dff7bc8aaee2799915101af268f Mon Sep 17 00:00:00 2001 From: Yuantao Chen Date: Thu, 12 Sep 2024 22:15:23 +0800 Subject: [PATCH 14/71] update --- scene/gaussian_model.py | 72 +- submodules/Propagation/PatchMatch.cpp | 477 +++++++ submodules/Propagation/PatchMatch.h | 83 ++ submodules/Propagation/Propagation.cu | 1191 +++++++++++++++++ ...aussianpro.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 1031912 bytes .../gaussianpro.egg-info/SOURCES.txt | 8 + .../gaussianpro.egg-info/dependency_links.txt | 1 + .../gaussianpro.egg-info/top_level.txt | 1 + submodules/Propagation/main.h | 55 + submodules/Propagation/pro.cpp | 29 + submodules/Propagation/setup.py | 28 + train.py | 5 + utils/graphics_utils.py | 150 ++- utils/patchmatch.py | 109 ++ 14 files changed, 2207 insertions(+), 2 deletions(-) create mode 100644 submodules/Propagation/PatchMatch.cpp create mode 100644 submodules/Propagation/PatchMatch.h create mode 100644 submodules/Propagation/Propagation.cu create mode 100644 submodules/Propagation/gaussianpro.cpython-310-x86_64-linux-gnu.so create mode 100644 submodules/Propagation/gaussianpro.egg-info/SOURCES.txt create mode 100644 submodules/Propagation/gaussianpro.egg-info/dependency_links.txt create mode 100644 submodules/Propagation/gaussianpro.egg-info/top_level.txt create mode 100644 submodules/Propagation/main.h create mode 100644 submodules/Propagation/pro.cpp create mode 100644 submodules/Propagation/setup.py create mode 100644 utils/patchmatch.py diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 9d05b2cf..00f8819a 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -404,4 +404,74 @@ def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size): def add_densification_stats(self, viewspace_point_tensor, update_filter): self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) - self.denom[update_filter] += 1 \ No newline at end of file + self.denom[update_filter] += 1 + + + def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, filter_mask): + # inverse project pixels into 3D scenes + K = viewpoint_cam.K + cam2world = viewpoint_cam.world_view_transform.transpose(0, 1).inverse() + + # Get the shape of the depth image + height, width = propagated_depth.shape + # Create a grid of 2D pixel coordinates + y, x = torch.meshgrid(torch.arange(0, height), torch.arange(0, width)) + # Stack the 2D and depth coordinates to create 3D homogeneous coordinates + coordinates = torch.stack([x.to(propagated_depth.device), y.to(propagated_depth.device), torch.ones_like(propagated_depth)], dim=-1) + # Reshape the coordinates to (height * width, 3) + coordinates = coordinates.view(-1, 3).to(K.device).to(torch.float32) + # Reproject the 2D coordinates to 3D coordinates + coordinates_3D = (K.inverse() @ coordinates.T).T + + # Multiply by depth + coordinates_3D *= propagated_depth.view(-1, 1) + + # convert to the world coordinate + world_coordinates_3D = (cam2world[:3, :3] @ coordinates_3D.T).T + cam2world[:3, 3] + + # import open3d as o3d + # point_cloud = o3d.geometry.PointCloud() + # point_cloud.points = o3d.utility.Vector3dVector(world_coordinates_3D.detach().cpu().numpy()) + # o3d.io.write_point_cloud("partpc.ply", point_cloud) + # exit() + + #mask the points below the confidence threshold + #downsample the pixels; 1/4 + world_coordinates_3D = world_coordinates_3D.view(height, width, 3) + world_coordinates_3D_downsampled = world_coordinates_3D[::8, ::8] + filter_mask_downsampled = filter_mask[::8, ::8] + gt_image = viewpoint_cam.original_image.cuda() + gt_image_downsampled = gt_image.permute(1, 2, 0)[::8, ::8] + + world_coordinates_3D_downsampled = world_coordinates_3D_downsampled[filter_mask_downsampled] + color_downsampled = gt_image_downsampled[filter_mask_downsampled] + + # initialize gaussians + fused_point_cloud = world_coordinates_3D_downsampled + fused_color = RGB2SH(color_downsampled) + features = torch.zeros((fused_color.shape[0], 3, (self.max_sh_degree + 1) ** 2)).to(fused_color.device) + features[:, :3, 0 ] = fused_color + features[:, 3:, 1:] = 0.0 + + original_point_cloud = self.get_xyz + # initialize the scale from the mode, if using the distance to calculate, there are outliers, if using the whole gaussians, it is memory consuming + # quantile_scale = torch.quantile(self.get_scaling, 0.5, dim=0) + # scales = self.scaling_inverse_activation(quantile_scale.unsqueeze(0).repeat(fused_point_cloud.shape[0], 1)) + fused_shape = fused_point_cloud.shape[0] + all_point_cloud = torch.concat([fused_point_cloud, original_point_cloud], dim=0) + all_dist2 = torch.clamp_min(distCUDA2(all_point_cloud), 0.0000001) + dist2 = all_dist2[:fused_shape] + scales = torch.log(torch.sqrt(dist2))[...,None].repeat(1, 2) + rots = torch.zeros((fused_point_cloud.shape[0], 4), device="cuda") + rots[:, 0] = 1 + opacities = inverse_sigmoid(1.0 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) + + new_xyz = nn.Parameter(fused_point_cloud.requires_grad_(True)) + new_features_dc = nn.Parameter(features[:,:,0:1].transpose(1, 2).contiguous().requires_grad_(True)) + new_features_rest = nn.Parameter(features[:,:,1:].transpose(1, 2).contiguous().requires_grad_(True)) + new_scaling = nn.Parameter(scales.requires_grad_(True)) + new_rotation = nn.Parameter(rots.requires_grad_(True)) + new_opacity = nn.Parameter(opacities.requires_grad_(True)) + + #update gaussians + self.densification_postfix(new_xyz, new_features_dc, new_features_rest, new_opacity, new_scaling, new_rotation) \ No newline at end of file diff --git a/submodules/Propagation/PatchMatch.cpp b/submodules/Propagation/PatchMatch.cpp new file mode 100644 index 00000000..5487a7e6 --- /dev/null +++ b/submodules/Propagation/PatchMatch.cpp @@ -0,0 +1,477 @@ +#include "PatchMatch.h" +#include + +#include + +void StringAppendV(std::string* dst, const char* format, va_list ap) { + // First try with a small fixed size buffer. + static const int kFixedBufferSize = 1024; + char fixed_buffer[kFixedBufferSize]; + + // It is possible for methods that use a va_list to invalidate + // the data in it upon use. The fix is to make a copy + // of the structure before using it and use that copy instead. + va_list backup_ap; + va_copy(backup_ap, ap); + int result = vsnprintf(fixed_buffer, kFixedBufferSize, format, backup_ap); + va_end(backup_ap); + + if (result < kFixedBufferSize) { + if (result >= 0) { + // Normal case - everything fits. + dst->append(fixed_buffer, result); + return; + } + +#ifdef _MSC_VER + // Error or MSVC running out of space. MSVC 8.0 and higher + // can be asked about space needed with the special idiom below: + va_copy(backup_ap, ap); + result = vsnprintf(nullptr, 0, format, backup_ap); + va_end(backup_ap); +#endif + + if (result < 0) { + // Just an error. + return; + } + } + + // Increase the buffer size to the size requested by vsnprintf, + // plus one for the closing \0. + const int variable_buffer_size = result + 1; + std::unique_ptr variable_buffer(new char[variable_buffer_size]); + + // Restore the va_list before we use it again. + va_copy(backup_ap, ap); + result = + vsnprintf(variable_buffer.get(), variable_buffer_size, format, backup_ap); + va_end(backup_ap); + + if (result >= 0 && result < variable_buffer_size) { + dst->append(variable_buffer.get(), result); + } +} + +std::string StringPrintf(const char* format, ...) { + va_list ap; + va_start(ap, format); + std::string result; + StringAppendV(&result, format, ap); + va_end(ap); + return result; +} + +void CudaSafeCall(const cudaError_t error, const std::string& file, + const int line) { + if (error != cudaSuccess) { + std::cerr << StringPrintf("%s in %s at line %i", cudaGetErrorString(error), + file.c_str(), line) + << std::endl; + exit(EXIT_FAILURE); + } +} + +void CudaCheckError(const char* file, const int line) { + cudaError error = cudaGetLastError(); + if (error != cudaSuccess) { + std::cerr << StringPrintf("cudaCheckError() failed at %s:%i : %s", file, + line, cudaGetErrorString(error)) + << std::endl; + exit(EXIT_FAILURE); + } + + // More careful checking. However, this will affect performance. + // Comment away if needed. + error = cudaDeviceSynchronize(); + if (cudaSuccess != error) { + std::cerr << StringPrintf("cudaCheckError() with sync failed at %s:%i : %s", + file, line, cudaGetErrorString(error)) + << std::endl; + std::cerr + << "This error is likely caused by the graphics card timeout " + "detection mechanism of your operating system. Please refer to " + "the FAQ in the documentation on how to solve this problem." + << std::endl; + exit(EXIT_FAILURE); + } +} + +PatchMatch::PatchMatch() {} + +PatchMatch::~PatchMatch() +{ + delete[] plane_hypotheses_host; + delete[] costs_host; + + for (int i = 0; i < num_images; ++i) { + cudaDestroyTextureObject(texture_objects_host.images[i]); + cudaFreeArray(cuArray[i]); + } + cudaFree(texture_objects_cuda); + cudaFree(cameras_cuda); + cudaFree(plane_hypotheses_cuda); + cudaFree(costs_cuda); + cudaFree(rand_states_cuda); + cudaFree(selected_views_cuda); + cudaFree(depths_cuda); + + if (params.geom_consistency) { + for (int i = 0; i < num_images; ++i) { + cudaDestroyTextureObject(texture_depths_host.images[i]); + cudaFreeArray(cuDepthArray[i]); + } + cudaFree(texture_depths_cuda); + } +} + +Camera ReadCamera(torch::Tensor intrinsic, torch::Tensor pose, torch::Tensor depth_interval) +{ + Camera camera; + + for (int i = 0; i < 3; ++i) { + camera.R[3 * i + 0] = pose[i][0].item(); + camera.R[3 * i + 1] = pose[i][1].item(); + camera.R[3 * i + 2] = pose[i][2].item(); + camera.t[i] = pose[i][3].item(); + } + + for (int i = 0; i < 3; ++i) { + camera.K[3 * i + 0] = intrinsic[i][0].item(); + camera.K[3 * i + 1] = intrinsic[i][1].item(); + camera.K[3 * i + 2] = intrinsic[i][2].item(); + } + + camera.depth_min = depth_interval[0].item(); + camera.depth_max = depth_interval[3].item(); + + return camera; +} + +void RescaleImageAndCamera(cv::Mat_ &src, cv::Mat_ &dst, cv::Mat_ &depth, Camera &camera) +{ + const int cols = depth.cols; + const int rows = depth.rows; + + if (cols == src.cols && rows == src.rows) { + dst = src.clone(); + return; + } + + const float scale_x = cols / static_cast(src.cols); + const float scale_y = rows / static_cast(src.rows); + + cv::resize(src, dst, cv::Size(cols,rows), 0, 0, cv::INTER_LINEAR); + + camera.K[0] *= scale_x; + camera.K[2] *= scale_x; + camera.K[4] *= scale_y; + camera.K[5] *= scale_y; + camera.width = cols; + camera.height = rows; +} + +float3 Get3DPointonWorld(const int x, const int y, const float depth, const Camera camera) +{ + float3 pointX; + float3 tmpX; + // Reprojection + pointX.x = depth * (x - camera.K[2]) / camera.K[0]; + pointX.y = depth * (y - camera.K[5]) / camera.K[4]; + pointX.z = depth; + + // Rotation + tmpX.x = camera.R[0] * pointX.x + camera.R[3] * pointX.y + camera.R[6] * pointX.z; + tmpX.y = camera.R[1] * pointX.x + camera.R[4] * pointX.y + camera.R[7] * pointX.z; + tmpX.z = camera.R[2] * pointX.x + camera.R[5] * pointX.y + camera.R[8] * pointX.z; + + // Transformation + float3 C; + C.x = -(camera.R[0] * camera.t[0] + camera.R[3] * camera.t[1] + camera.R[6] * camera.t[2]); + C.y = -(camera.R[1] * camera.t[0] + camera.R[4] * camera.t[1] + camera.R[7] * camera.t[2]); + C.z = -(camera.R[2] * camera.t[0] + camera.R[5] * camera.t[1] + camera.R[8] * camera.t[2]); + pointX.x = tmpX.x + C.x; + pointX.y = tmpX.y + C.y; + pointX.z = tmpX.z + C.z; + + return pointX; +} + +void ProjectonCamera(const float3 PointX, const Camera camera, float2 &point, float &depth) +{ + float3 tmp; + tmp.x = camera.R[0] * PointX.x + camera.R[1] * PointX.y + camera.R[2] * PointX.z + camera.t[0]; + tmp.y = camera.R[3] * PointX.x + camera.R[4] * PointX.y + camera.R[5] * PointX.z + camera.t[1]; + tmp.z = camera.R[6] * PointX.x + camera.R[7] * PointX.y + camera.R[8] * PointX.z + camera.t[2]; + + depth = camera.K[6] * tmp.x + camera.K[7] * tmp.y + camera.K[8] * tmp.z; + point.x = (camera.K[0] * tmp.x + camera.K[1] * tmp.y + camera.K[2] * tmp.z) / depth; + point.y = (camera.K[3] * tmp.x + camera.K[4] * tmp.y + camera.K[5] * tmp.z) / depth; +} + +float GetAngle( const cv::Vec3f &v1, const cv::Vec3f &v2 ) +{ + float dot_product = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; + float angle = acosf(dot_product); + //if angle is not a number the dot product was 1 and thus the two vectors should be identical --> return 0 + if ( angle != angle ) + return 0.0f; + + return angle; +} + +void StoreColorPlyFileBinaryPointCloud (const std::string &plyFilePath, const std::vector &pc) +{ + std::cout << "store 3D points to ply file" << std::endl; + + FILE *outputPly; + outputPly=fopen(plyFilePath.c_str(), "wb"); + + /*write header*/ + fprintf(outputPly, "ply\n"); + fprintf(outputPly, "format binary_little_endian 1.0\n"); + fprintf(outputPly, "element vertex %d\n",pc.size()); + fprintf(outputPly, "property float x\n"); + fprintf(outputPly, "property float y\n"); + fprintf(outputPly, "property float z\n"); + fprintf(outputPly, "property float nx\n"); + fprintf(outputPly, "property float ny\n"); + fprintf(outputPly, "property float nz\n"); + fprintf(outputPly, "property uchar red\n"); + fprintf(outputPly, "property uchar green\n"); + fprintf(outputPly, "property uchar blue\n"); + fprintf(outputPly, "end_header\n"); + + //write data +#pragma omp parallel for + for(size_t i = 0; i < pc.size(); i++) { + const PointList &p = pc[i]; + float3 X = p.coord; + const float3 normal = p.normal; + const float3 color = p.color; + const char b_color = (int)color.x; + const char g_color = (int)color.y; + const char r_color = (int)color.z; + + if(!(X.x < FLT_MAX && X.x > -FLT_MAX) || !(X.y < FLT_MAX && X.y > -FLT_MAX) || !(X.z < FLT_MAX && X.z >= -FLT_MAX)){ + X.x = 0.0f; + X.y = 0.0f; + X.z = 0.0f; + } +#pragma omp critical + { + fwrite(&X.x, sizeof(X.x), 1, outputPly); + fwrite(&X.y, sizeof(X.y), 1, outputPly); + fwrite(&X.z, sizeof(X.z), 1, outputPly); + fwrite(&normal.x, sizeof(normal.x), 1, outputPly); + fwrite(&normal.y, sizeof(normal.y), 1, outputPly); + fwrite(&normal.z, sizeof(normal.z), 1, outputPly); + fwrite(&r_color, sizeof(char), 1, outputPly); + fwrite(&g_color, sizeof(char), 1, outputPly); + fwrite(&b_color, sizeof(char), 1, outputPly); + } + + } + fclose(outputPly); +} + +static float GetDisparity(const Camera &camera, const int2 &p, const float &depth) +{ + float point3D[3]; + point3D[0] = depth * (p.x - camera.K[2]) / camera.K[0]; + point3D[1] = depth * (p.y - camera.K[5]) / camera.K[4]; + point3D[2] = depth; + + return std::sqrt(point3D[0] * point3D[0] + point3D[1] * point3D[1] + point3D[2] * point3D[2]); +} + +cv::Mat tensorToMat(const torch::Tensor& tensor) { + torch::Tensor tensor_contiguous = tensor.contiguous(); + torch::Tensor tensor_cpu_float = tensor_contiguous.to(torch::kCPU).to(torch::kFloat32); + + int height = tensor_cpu_float.size(0); + int width = tensor_cpu_float.size(1); + int channels = tensor_cpu_float.size(2); + + cv::Mat mat(cv::Size(width, height), CV_32FC(channels), tensor_cpu_float.data_ptr()); + + return mat.clone(); +} + +void PatchMatch::SetGeomConsistencyParams() +{ + params.geom_consistency = true; + params.max_iterations = 2; +} + +void PatchMatch::InuputInitialization(torch::Tensor images_cuda, torch::Tensor intrinsics_cuda, torch::Tensor poses_cuda, + torch::Tensor depth_cuda, torch::Tensor normal_cuda, torch::Tensor depth_intervals) +{ + images.clear(); + cameras.clear(); + + cv::Mat image_color = tensorToMat(images_cuda[0]); + cv::Mat image_float; + cv::cvtColor(image_color, image_float, cv::COLOR_RGB2GRAY); + + image_float.convertTo(image_float, CV_32FC1); + images.push_back(image_float); + + Camera camera = ReadCamera(intrinsics_cuda[0], poses_cuda[0], depth_intervals[0]); + camera.height = image_float.rows; + camera.width = image_float.cols; + cameras.push_back(camera); + + cv::Mat ref_depth = tensorToMat(depth_cuda); + depths.push_back(ref_depth); + + int num_src_images = images_cuda.size(0); + for (int i = 1; i < num_src_images; ++i) { + cv::Mat src_image_color = tensorToMat(images_cuda[i]); + cv::Mat src_image_float; + cv::cvtColor(src_image_color, src_image_float, cv::COLOR_RGB2GRAY); + + src_image_float.convertTo(src_image_float, CV_32FC1); + images.push_back(src_image_float); + + Camera camera = ReadCamera(intrinsics_cuda[i], poses_cuda[i], depth_intervals[i]); + camera.height = image_float.rows; + camera.width = image_float.cols; + cameras.push_back(camera); + } + + // Scale cameras and images + for (size_t i = 0; i < images.size(); ++i) { + if (images[i].cols <= params.max_image_size && images[i].rows <= params.max_image_size) { + continue; + } + + const float factor_x = static_cast(params.max_image_size) / images[i].cols; + const float factor_y = static_cast(params.max_image_size) / images[i].rows; + const float factor = std::min(factor_x, factor_y); + + const int new_cols = std::round(images[i].cols * factor); + const int new_rows = std::round(images[i].rows * factor); + + const float scale_x = new_cols / static_cast(images[i].cols); + const float scale_y = new_rows / static_cast(images[i].rows); + + cv::Mat_ scaled_image_float; + cv::resize(images[i], scaled_image_float, cv::Size(new_cols,new_rows), 0, 0, cv::INTER_LINEAR); + images[i] = scaled_image_float.clone(); + + cameras[i].K[0] *= scale_x; + cameras[i].K[2] *= scale_x; + cameras[i].K[4] *= scale_y; + cameras[i].K[5] *= scale_y; + cameras[i].height = scaled_image_float.rows; + cameras[i].width = scaled_image_float.cols; + } + + params.depth_min = cameras[0].depth_min * 0.6f; + params.depth_max = cameras[0].depth_max * 1.2f; + // std::cout << "depth range: " << params.depth_min << " " << params.depth_max << std::endl; + params.num_images = (int)images.size(); + // std::cout << "num images: " << params.num_images << std::endl; + params.disparity_min = cameras[0].K[0] * params.baseline / params.depth_max; + params.disparity_max = cameras[0].K[0] * params.baseline / params.depth_min; + +} + +void PatchMatch::CudaSpaceInitialization() +{ + num_images = (int)images.size(); + + for (int i = 0; i < num_images; ++i) { + int rows = images[i].rows; + int cols = images[i].cols; + + cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat); + cudaMallocArray(&cuArray[i], &channelDesc, cols, rows); + + cudaMemcpy2DToArray (cuArray[i], 0, 0, images[i].ptr(), images[i].step[0], cols*sizeof(float), rows, cudaMemcpyHostToDevice); + + struct cudaResourceDesc resDesc; + memset(&resDesc, 0, sizeof(cudaResourceDesc)); + resDesc.resType = cudaResourceTypeArray; + resDesc.res.array.array = cuArray[i]; + + struct cudaTextureDesc texDesc; + memset(&texDesc, 0, sizeof(cudaTextureDesc)); + texDesc.addressMode[0] = cudaAddressModeWrap; + texDesc.addressMode[1] = cudaAddressModeWrap; + texDesc.filterMode = cudaFilterModeLinear; + texDesc.readMode = cudaReadModeElementType; + texDesc.normalizedCoords = 0; + + // cudaError_t error = cudaGetLastError(); + // printf("CUDA notification0: %s\n", "test"); + // if (error != cudaSuccess) { + // printf("CUDA error step 0: %s\n", cudaGetErrorString(error)); + // // 错误处理代码 + // } + + cudaCreateTextureObject(&(texture_objects_host.images[i]), &resDesc, &texDesc, NULL); + } + + cudaMalloc((void**)&texture_objects_cuda, sizeof(cudaTextureObjects)); + cudaMemcpy(texture_objects_cuda, &texture_objects_host, sizeof(cudaTextureObjects), cudaMemcpyHostToDevice); + + cudaMalloc((void**)&cameras_cuda, sizeof(Camera) * (num_images)); + cudaMemcpy(cameras_cuda, &cameras[0], sizeof(Camera) * (num_images), cudaMemcpyHostToDevice); + + plane_hypotheses_host = new float4[cameras[0].height * cameras[0].width]; + cudaMalloc((void**)&plane_hypotheses_cuda, sizeof(float4) * (cameras[0].height * cameras[0].width)); + + costs_host = new float[cameras[0].height * cameras[0].width]; + cudaMalloc((void**)&costs_cuda, sizeof(float) * (cameras[0].height * cameras[0].width)); + + cudaMalloc((void**)&rand_states_cuda, sizeof(curandState) * (cameras[0].height * cameras[0].width)); + cudaMalloc((void**)&selected_views_cuda, sizeof(unsigned int) * (cameras[0].height * cameras[0].width)); + + cudaMalloc((void**)&depths_cuda, sizeof(float) * (cameras[0].height * cameras[0].width)); + cudaMemcpy(depths_cuda, depths[0].ptr(), sizeof(float) * cameras[0].height * cameras[0].width, cudaMemcpyHostToDevice); + +} + +int PatchMatch::GetReferenceImageWidth() +{ + return cameras[0].width; +} + +int PatchMatch::GetReferenceImageHeight() +{ + return cameras[0].height; +} + +cv::Mat PatchMatch::GetReferenceImage() +{ + return images[0]; +} + +float4 PatchMatch::GetPlaneHypothesis(const int index) +{ + return plane_hypotheses_host[index]; +} + +float4* PatchMatch::GetPlaneHypotheses() +{ + return plane_hypotheses_host; +} + +float PatchMatch::GetCost(const int index) +{ + return costs_host[index]; +} + +void PatchMatch::SetPatchSize(int patch_size) +{ + params.patch_size = patch_size; +} + +int PatchMatch::GetPatchSize() +{ + return params.patch_size; +} + + diff --git a/submodules/Propagation/PatchMatch.h b/submodules/Propagation/PatchMatch.h new file mode 100644 index 00000000..b0c88252 --- /dev/null +++ b/submodules/Propagation/PatchMatch.h @@ -0,0 +1,83 @@ +#ifndef _PatchMatch_H_ +#define _PatchMatch_H_ + +#include "main.h" +#include + +Camera ReadCamera(const std::string &cam_path); +void RescaleImageAndCamera(cv::Mat_ &src, cv::Mat_ &dst, cv::Mat_ &depth, Camera &camera); +float3 Get3DPointonWorld(const int x, const int y, const float depth, const Camera camera); +void ProjectonCamera(const float3 PointX, const Camera camera, float2 &point, float &depth); +float GetAngle(const cv::Vec3f &v1, const cv::Vec3f &v2); +void StoreColorPlyFileBinaryPointCloud (const std::string &plyFilePath, const std::vector &pc); + +#define CUDA_SAFE_CALL(error) CudaSafeCall(error, __FILE__, __LINE__) +#define CUDA_CHECK_ERROR() CudaCheckError(__FILE__, __LINE__) + +void CudaSafeCall(const cudaError_t error, const std::string& file, const int line); +void CudaCheckError(const char* file, const int line); + +struct cudaTextureObjects { + cudaTextureObject_t images[MAX_IMAGES]; +}; + +struct PatchMatchParams { + int max_iterations = 6; + int patch_size = 11; + int num_images = 5; + int max_image_size=3200; + int radius_increment = 2; + float sigma_spatial = 5.0f; + float sigma_color = 3.0f; + int top_k = 4; + float baseline = 0.54f; + float depth_min = 0.0f; + float depth_max = 1.0f; + float disparity_min = 0.0f; + float disparity_max = 1.0f; + bool geom_consistency = false; +}; + +class PatchMatch { +public: + PatchMatch(); + ~PatchMatch(); + + void InuputInitialization(torch::Tensor images_cuda, torch::Tensor intrinsics_cuda, torch::Tensor poses_cuda, torch::Tensor depth_cuda, torch::Tensor normal_cuda, torch::Tensor depth_intervals); + void Colmap2MVS(const std::string &dense_folder, std::vector &problems); + void CudaSpaceInitialization(); + void RunPatchMatch(); + void SetGeomConsistencyParams(); + void SetPatchSize(int patch_size); + int GetPatchSize(); + int GetReferenceImageWidth(); + int GetReferenceImageHeight(); + cv::Mat GetReferenceImage(); + float4 GetPlaneHypothesis(const int index); + float GetCost(const int index); + float4* GetPlaneHypotheses(); + +private: + int num_images; + std::vector images; + std::vector depths; + std::vector cameras; + cudaTextureObjects texture_objects_host; + cudaTextureObjects texture_depths_host; + float4 *plane_hypotheses_host; + float *costs_host; + PatchMatchParams params; + + Camera *cameras_cuda; + cudaArray *cuArray[MAX_IMAGES]; + cudaArray *cuDepthArray[MAX_IMAGES]; + cudaTextureObjects *texture_objects_cuda; + cudaTextureObjects *texture_depths_cuda; + float4 *plane_hypotheses_cuda; + float *costs_cuda; + curandState *rand_states_cuda; + unsigned int *selected_views_cuda; + float *depths_cuda; +}; + +#endif // _PatchMatch_H_ diff --git a/submodules/Propagation/Propagation.cu b/submodules/Propagation/Propagation.cu new file mode 100644 index 00000000..b3a7573f --- /dev/null +++ b/submodules/Propagation/Propagation.cu @@ -0,0 +1,1191 @@ +#include "PatchMatch.h" +#include +#include + +__device__ void sort_small(float *d, const int n) +{ + int j; + for (int i = 1; i < n; i++) { + float tmp = d[i]; + for (j = i; j >= 1 && tmp < d[j-1]; j--) + d[j] = d[j-1]; + d[j] = tmp; + } +} + +__device__ void sort_small_weighted(float *d, float *w, int n) +{ + int j; + for (int i = 1; i < n; i++) { + float tmp = d[i]; + float tmp_w = w[i]; + for (j = i; j >= 1 && tmp < d[j - 1]; j--) { + d[j] = d[j - 1]; + w[j] = w[j - 1]; + } + d[j] = tmp; + w[j] = tmp_w; + } +} + +__device__ int FindMinCostIndex(const float *costs, const int n) +{ + float min_cost = costs[0]; + int min_cost_idx = 0; + for (int idx = 1; idx < n; ++idx) { + if (costs[idx] <= min_cost) { + min_cost = costs[idx]; + min_cost_idx = idx; + } + } + return min_cost_idx; +} + +__device__ void setBit(unsigned int &input, const unsigned int n) +{ + input |= (unsigned int)(1 << n); +} + +__device__ int isSet(unsigned int input, const unsigned int n) +{ + return (input >> n) & 1; +} + +__device__ void Mat33DotVec3(const float mat[9], const float4 vec, float4 *result) +{ + result->x = mat[0] * vec.x + mat[1] * vec.y + mat[2] * vec.z; + result->y = mat[3] * vec.x + mat[4] * vec.y + mat[5] * vec.z; + result->z = mat[6] * vec.x + mat[7] * vec.y + mat[8] * vec.z; +} + +__device__ float Vec3DotVec3(const float4 vec1, const float4 vec2) +{ + return vec1.x * vec2.x + vec1.y * vec2.y + vec1.z * vec2.z; +} + +__device__ void NormalizeVec3 (float4 *vec) +{ + const float normSquared = vec->x * vec->x + vec->y * vec->y + vec->z * vec->z; + const float inverse_sqrt = rsqrtf (normSquared); + vec->x *= inverse_sqrt; + vec->y *= inverse_sqrt; + vec->z *= inverse_sqrt; +} + +__device__ void TransformPDFToCDF(float* probs, const int num_probs) +{ + float prob_sum = 0.0f; + for (int i = 0; i < num_probs; ++i) { + prob_sum += probs[i]; + } + const float inv_prob_sum = 1.0f / prob_sum; + + float cum_prob = 0.0f; + for (int i = 0; i < num_probs; ++i) { + const float prob = probs[i] * inv_prob_sum; + cum_prob += prob; + probs[i] = cum_prob; + } +} + +__device__ void Get3DPoint(const Camera camera, const int2 p, const float depth, float *X) +{ + X[0] = depth * (p.x - camera.K[2]) / camera.K[0]; + X[1] = depth * (p.y - camera.K[5]) / camera.K[4]; + X[2] = depth; +} + +__device__ float4 GetViewDirection(const Camera camera, const int2 p, const float depth) +{ + float X[3]; + Get3DPoint(camera, p, depth, X); + float norm = sqrt(X[0] * X[0] + X[1] * X[1] + X[2] * X[2]); + + float4 view_direction; + view_direction.x = X[0] / norm; + view_direction.y = X[1] / norm; + view_direction.z = X[2] / norm; + view_direction.w = 0; + return view_direction; +} + +__device__ float GetDistance2Origin(const Camera camera, const int2 p, const float depth, const float4 normal) +{ + float X[3]; + Get3DPoint(camera, p, depth, X); + return -(normal.x * X[0] + normal.y * X[1] + normal.z * X[2]); +} + +__device__ float ComputeDepthfromPlaneHypothesis(const Camera camera, const float4 plane_hypothesis, const int2 p) +{ + return -plane_hypothesis.w * camera.K[0] / ((p.x - camera.K[2]) * plane_hypothesis.x + (camera.K[0] / camera.K[4]) * (p.y - camera.K[5]) * plane_hypothesis.y + camera.K[0] * plane_hypothesis.z); +} + +__device__ float4 GenerateRandomNormal(const Camera camera, const int2 p, curandState *rand_state, const float depth) +{ + float4 normal; + float q1 = 1.0f; + float q2 = 1.0f; + float s = 2.0f; + while (s >= 1.0f) { + q1 = 2.0f * curand_uniform(rand_state) -1.0f; + q2 = 2.0f * curand_uniform(rand_state) - 1.0f; + s = q1 * q1 + q2 * q2; + } + const float sq = sqrt(1.0f - s); + normal.x = 2.0f * q1 * sq; + normal.y = 2.0f * q2 * sq; + normal.z = 1.0f - 2.0f * s; + normal.w = 0; + + float4 view_direction = GetViewDirection(camera, p, depth); + float dot_product = normal.x * view_direction.x + normal.y * view_direction.y + normal.z * view_direction.z; + if (dot_product > 0.0f) { + normal.x = -normal.x; + normal.y = -normal.y; + normal.z = - normal.z; + } + NormalizeVec3(&normal); + return normal; +} + +__device__ float4 GeneratePerturbedNormal(const Camera camera, const int2 p, const float4 normal, curandState *rand_state, const float perturbation) +{ + float4 view_direction = GetViewDirection(camera, p, 1.0f); + + const float a1 = (curand_uniform(rand_state) - 0.5f) * perturbation; + const float a2 = (curand_uniform(rand_state) - 0.5f) * perturbation; + const float a3 = (curand_uniform(rand_state) - 0.5f) * perturbation; + + const float sin_a1 = sin(a1); + const float sin_a2 = sin(a2); + const float sin_a3 = sin(a3); + const float cos_a1 = cos(a1); + const float cos_a2 = cos(a2); + const float cos_a3 = cos(a3); + + float R[9]; + R[0] = cos_a2 * cos_a3; + R[1] = cos_a3 * sin_a1 * sin_a2 - cos_a1 * sin_a3; + R[2] = sin_a1 * sin_a3 + cos_a1 * cos_a3 * sin_a2; + R[3] = cos_a2 * sin_a3; + R[4] = cos_a1 * cos_a3 + sin_a1 * sin_a2 * sin_a3; + R[5] = cos_a1 * sin_a2 * sin_a3 - cos_a3 * sin_a1; + R[6] = -sin_a2; + R[7] = cos_a2 * sin_a1; + R[8] = cos_a1 * cos_a2; + + float4 normal_perturbed; + Mat33DotVec3(R, normal, &normal_perturbed); + + if (Vec3DotVec3(normal_perturbed, view_direction) >= 0.0f) { + normal_perturbed = normal; + } + + NormalizeVec3(&normal_perturbed); + return normal_perturbed; +} + +__device__ float4 GenerateRandomPlaneHypothesis(const Camera camera, const int2 p, curandState *rand_state, const float depth_min, const float depth_max, float init_depth) +{ + float depth = init_depth; + if (depth <= 0){ + depth = curand_uniform(rand_state) * (depth_max - depth_min) + depth_min; + } + // printf("initdepth: %f\n", init_depth); + + float4 plane_hypothesis = GenerateRandomNormal(camera, p, rand_state, depth); + plane_hypothesis.w = GetDistance2Origin(camera, p, depth, plane_hypothesis); + return plane_hypothesis; +} + +__device__ float4 GeneratePertubedPlaneHypothesis(const Camera camera, const int2 p, curandState *rand_state, const float perturbation, const float4 plane_hypothesis_now, const float depth_now, const float depth_min, const float depth_max) +{ + float depth_perturbed = depth_now; + + float dist_perturbed = plane_hypothesis_now.w; + const float dist_min_perturbed = (1 - perturbation) * dist_perturbed; + const float dist_max_perturbed = (1 + perturbation) * dist_perturbed; + float4 plane_hypothesis_temp = plane_hypothesis_now; + do { + dist_perturbed = curand_uniform(rand_state) * (dist_max_perturbed - dist_min_perturbed) + dist_min_perturbed; + plane_hypothesis_temp.w = dist_perturbed; + depth_perturbed = ComputeDepthfromPlaneHypothesis(camera, plane_hypothesis_temp, p); + } while (depth_perturbed < depth_min && depth_perturbed > depth_max); + + float4 plane_hypothesis = GeneratePerturbedNormal(camera, p, plane_hypothesis_now, rand_state, perturbation * M_PI); + plane_hypothesis.w = dist_perturbed; + return plane_hypothesis; +} + +__device__ void ComputeHomography(const Camera ref_camera, const Camera src_camera, const float4 plane_hypothesis, float *H) +{ + float ref_C[3]; + float src_C[3]; + ref_C[0] = -(ref_camera.R[0] * ref_camera.t[0] + ref_camera.R[3] * ref_camera.t[1] + ref_camera.R[6] * ref_camera.t[2]); + ref_C[1] = -(ref_camera.R[1] * ref_camera.t[0] + ref_camera.R[4] * ref_camera.t[1] + ref_camera.R[7] * ref_camera.t[2]); + ref_C[2] = -(ref_camera.R[2] * ref_camera.t[0] + ref_camera.R[5] * ref_camera.t[1] + ref_camera.R[8] * ref_camera.t[2]); + src_C[0] = -(src_camera.R[0] * src_camera.t[0] + src_camera.R[3] * src_camera.t[1] + src_camera.R[6] * src_camera.t[2]); + src_C[1] = -(src_camera.R[1] * src_camera.t[0] + src_camera.R[4] * src_camera.t[1] + src_camera.R[7] * src_camera.t[2]); + src_C[2] = -(src_camera.R[2] * src_camera.t[0] + src_camera.R[5] * src_camera.t[1] + src_camera.R[8] * src_camera.t[2]); + + float R_relative[9]; + float C_relative[3]; + float t_relative[3]; + R_relative[0] = src_camera.R[0] * ref_camera.R[0] + src_camera.R[1] * ref_camera.R[1] + src_camera.R[2] *ref_camera.R[2]; + R_relative[1] = src_camera.R[0] * ref_camera.R[3] + src_camera.R[1] * ref_camera.R[4] + src_camera.R[2] *ref_camera.R[5]; + R_relative[2] = src_camera.R[0] * ref_camera.R[6] + src_camera.R[1] * ref_camera.R[7] + src_camera.R[2] *ref_camera.R[8]; + R_relative[3] = src_camera.R[3] * ref_camera.R[0] + src_camera.R[4] * ref_camera.R[1] + src_camera.R[5] *ref_camera.R[2]; + R_relative[4] = src_camera.R[3] * ref_camera.R[3] + src_camera.R[4] * ref_camera.R[4] + src_camera.R[5] *ref_camera.R[5]; + R_relative[5] = src_camera.R[3] * ref_camera.R[6] + src_camera.R[4] * ref_camera.R[7] + src_camera.R[5] *ref_camera.R[8]; + R_relative[6] = src_camera.R[6] * ref_camera.R[0] + src_camera.R[7] * ref_camera.R[1] + src_camera.R[8] *ref_camera.R[2]; + R_relative[7] = src_camera.R[6] * ref_camera.R[3] + src_camera.R[7] * ref_camera.R[4] + src_camera.R[8] *ref_camera.R[5]; + R_relative[8] = src_camera.R[6] * ref_camera.R[6] + src_camera.R[7] * ref_camera.R[7] + src_camera.R[8] *ref_camera.R[8]; + C_relative[0] = (ref_C[0] - src_C[0]); + C_relative[1] = (ref_C[1] - src_C[1]); + C_relative[2] = (ref_C[2] - src_C[2]); + t_relative[0] = src_camera.R[0] * C_relative[0] + src_camera.R[1] * C_relative[1] + src_camera.R[2] * C_relative[2]; + t_relative[1] = src_camera.R[3] * C_relative[0] + src_camera.R[4] * C_relative[1] + src_camera.R[5] * C_relative[2]; + t_relative[2] = src_camera.R[6] * C_relative[0] + src_camera.R[7] * C_relative[1] + src_camera.R[8] * C_relative[2]; + + H[0] = R_relative[0] - t_relative[0] * plane_hypothesis.x / plane_hypothesis.w; + H[1] = R_relative[1] - t_relative[0] * plane_hypothesis.y / plane_hypothesis.w; + H[2] = R_relative[2] - t_relative[0] * plane_hypothesis.z / plane_hypothesis.w; + H[3] = R_relative[3] - t_relative[1] * plane_hypothesis.x / plane_hypothesis.w; + H[4] = R_relative[4] - t_relative[1] * plane_hypothesis.y / plane_hypothesis.w; + H[5] = R_relative[5] - t_relative[1] * plane_hypothesis.z / plane_hypothesis.w; + H[6] = R_relative[6] - t_relative[2] * plane_hypothesis.x / plane_hypothesis.w; + H[7] = R_relative[7] - t_relative[2] * plane_hypothesis.y / plane_hypothesis.w; + H[8] = R_relative[8] - t_relative[2] * plane_hypothesis.z / plane_hypothesis.w; + + float tmp[9]; + tmp[0] = H[0] / ref_camera.K[0]; + tmp[1] = H[1] / ref_camera.K[4]; + tmp[2] = -H[0] * ref_camera.K[2] / ref_camera.K[0] - H[1] * ref_camera.K[5] / ref_camera.K[4] + H[2]; + tmp[3] = H[3] / ref_camera.K[0]; + tmp[4] = H[4] / ref_camera.K[4]; + tmp[5] = -H[3] * ref_camera.K[2] / ref_camera.K[0] - H[4] * ref_camera.K[5] / ref_camera.K[4] + H[5]; + tmp[6] = H[6] / ref_camera.K[0]; + tmp[7] = H[7] / ref_camera.K[4]; + tmp[8] = -H[6] * ref_camera.K[2] / ref_camera.K[0] - H[7] * ref_camera.K[5] / ref_camera.K[4] + H[8]; + + H[0] = src_camera.K[0] * tmp[0] + src_camera.K[2] * tmp[6]; + H[1] = src_camera.K[0] * tmp[1] + src_camera.K[2] * tmp[7]; + H[2] = src_camera.K[0] * tmp[2] + src_camera.K[2] * tmp[8]; + H[3] = src_camera.K[4] * tmp[3] + src_camera.K[5] * tmp[6]; + H[4] = src_camera.K[4] * tmp[4] + src_camera.K[5] * tmp[7]; + H[5] = src_camera.K[4] * tmp[5] + src_camera.K[5] * tmp[8]; + H[6] = src_camera.K[8] * tmp[6]; + H[7] = src_camera.K[8] * tmp[7]; + H[8] = src_camera.K[8] * tmp[8]; +} + +__device__ float2 ComputeCorrespondingPoint(const float *H, const int2 p) +{ + float3 pt; + pt.x = H[0] * p.x + H[1] * p.y + H[2]; + pt.y = H[3] * p.x + H[4] * p.y + H[5]; + pt.z = H[6] * p.x + H[7] * p.y + H[8]; + return make_float2(pt.x / pt.z, pt.y / pt.z); +} + +__device__ float4 TransformNormal(const Camera camera, float4 plane_hypothesis) +{ + float4 transformed_normal; + transformed_normal.x = camera.R[0] * plane_hypothesis.x + camera.R[3] * plane_hypothesis.y + camera.R[6] * plane_hypothesis.z; + transformed_normal.y = camera.R[1] * plane_hypothesis.x + camera.R[4] * plane_hypothesis.y + camera.R[7] * plane_hypothesis.z; + transformed_normal.z = camera.R[2] * plane_hypothesis.x + camera.R[5] * plane_hypothesis.y + camera.R[8] * plane_hypothesis.z; + transformed_normal.w = plane_hypothesis.w; + return transformed_normal; +} + +__device__ float4 TransformNormal2RefCam(const Camera camera, float4 plane_hypothesis) +{ + float4 transformed_normal; + transformed_normal.x = camera.R[0] * plane_hypothesis.x + camera.R[1] * plane_hypothesis.y + camera.R[2] * plane_hypothesis.z; + transformed_normal.y = camera.R[3] * plane_hypothesis.x + camera.R[4] * plane_hypothesis.y + camera.R[5] * plane_hypothesis.z; + transformed_normal.z = camera.R[6] * plane_hypothesis.x + camera.R[7] * plane_hypothesis.y + camera.R[8] * plane_hypothesis.z; + transformed_normal.w = plane_hypothesis.w; + return transformed_normal; +} + +__device__ float ComputeBilateralWeight(const float x_dist, const float y_dist, const float pix, const float center_pix, const float sigma_spatial, const float sigma_color) +{ + const float spatial_dist = sqrt(x_dist * x_dist + y_dist * y_dist); + const float color_dist = fabs(pix - center_pix); + return exp(-spatial_dist / (2.0f * sigma_spatial* sigma_spatial) - color_dist / (2.0f * sigma_color * sigma_color)); +} + +__device__ float ComputeBilateralNCC(const cudaTextureObject_t ref_image, const Camera ref_camera, const cudaTextureObject_t src_image, const Camera src_camera, const int2 p, const float4 plane_hypothesis, const PatchMatchParams params) +{ + const float cost_max = 2.0f; + int radius = params.patch_size / 2; + + float H[9]; + ComputeHomography(ref_camera, src_camera, plane_hypothesis, H); + float2 pt = ComputeCorrespondingPoint(H, p); + if (pt.x >= src_camera.width || pt.x < 0.0f || pt.y >= src_camera.height || pt.y < 0.0f) { + return cost_max; + } + + float cost = 0.0f; + { + float sum_ref = 0.0f; + float sum_ref_ref = 0.0f; + float sum_src = 0.0f; + float sum_src_src = 0.0f; + float sum_ref_src = 0.0f; + float bilateral_weight_sum = 0.0f; + const float ref_center_pix = tex2D(ref_image, p.x + 0.5f, p.y + 0.5f); + + for (int i = -radius; i < radius + 1; i += params.radius_increment) { + float sum_ref_row = 0.0f; + float sum_src_row = 0.0f; + float sum_ref_ref_row = 0.0f; + float sum_src_src_row = 0.0f; + float sum_ref_src_row = 0.0f; + float bilateral_weight_sum_row = 0.0f; + + for (int j = -radius; j < radius + 1; j += params.radius_increment) { + const int2 ref_pt = make_int2(p.x + i, p.y + j); + const float ref_pix = tex2D(ref_image, ref_pt.x + 0.5f, ref_pt.y + 0.5f); + float2 src_pt = ComputeCorrespondingPoint(H, ref_pt); + const float src_pix = tex2D(src_image, src_pt.x + 0.5f, src_pt.y + 0.5f); + + float weight = ComputeBilateralWeight(i, j, ref_pix, ref_center_pix, params.sigma_spatial, params.sigma_color); + + sum_ref_row += weight * ref_pix; + sum_ref_ref_row += weight * ref_pix * ref_pix; + sum_src_row += weight * src_pix; + sum_src_src_row += weight * src_pix * src_pix; + sum_ref_src_row += weight * ref_pix * src_pix; + bilateral_weight_sum_row += weight; + } + + sum_ref += sum_ref_row; + sum_ref_ref += sum_ref_ref_row; + sum_src += sum_src_row; + sum_src_src += sum_src_src_row; + sum_ref_src += sum_ref_src_row; + bilateral_weight_sum += bilateral_weight_sum_row; + } + const float inv_bilateral_weight_sum = 1.0f / bilateral_weight_sum; + sum_ref *= inv_bilateral_weight_sum; + sum_ref_ref *= inv_bilateral_weight_sum; + sum_src *= inv_bilateral_weight_sum; + sum_src_src *= inv_bilateral_weight_sum; + sum_ref_src *= inv_bilateral_weight_sum; + + const float var_ref = sum_ref_ref - sum_ref * sum_ref; + const float var_src = sum_src_src - sum_src * sum_src; + + const float kMinVar = 1e-5f; + if (var_ref < kMinVar || var_src < kMinVar) { + return cost = cost_max; + } else { + const float covar_src_ref = sum_ref_src - sum_ref * sum_src; + const float var_ref_src = sqrt(var_ref * var_src); + return cost = max(0.0f, min(cost_max, 1.0f - covar_src_ref / var_ref_src)); + } + } +} + +__device__ float ComputeMultiViewInitialCostandSelectedViews(const cudaTextureObject_t *images, const Camera *cameras, const int2 p, const float4 plane_hypothesis, unsigned int *selected_views, const PatchMatchParams params) +{ + float cost_max = 2.0f; + float cost_vector[32] = {2.0f}; + float cost_vector_copy[32] = {2.0f}; + int cost_count = 0; + int num_valid_views = 0; + + for (int i = 1; i < params.num_images; ++i) { + float c = ComputeBilateralNCC(images[0], cameras[0], images[i], cameras[i], p, plane_hypothesis, params); + cost_vector[i - 1] = c; + cost_vector_copy[i - 1] = c; + cost_count++; + if (c < cost_max) { + num_valid_views++; + } + } + + sort_small(cost_vector, cost_count); + *selected_views = 0; + + int top_k = min(num_valid_views, params.top_k); + if (top_k > 0) { + float cost = 0.0f; + for (int i = 0; i < top_k; ++i) { + cost += cost_vector[i]; + } + float cost_threshold = cost_vector[top_k - 1]; + for (int i = 0; i < params.num_images - 1; ++i) { + if (cost_vector_copy[i] <= cost_threshold) { + setBit(*selected_views, i); + } + } + return cost / top_k; + } else { + return cost_max; + } +} + +__device__ void ComputeMultiViewCostVector(const cudaTextureObject_t *images, const Camera *cameras, const int2 p, const float4 plane_hypothesis, float *cost_vector, const PatchMatchParams params) +{ + for (int i = 1; i < params.num_images; ++i) { + cost_vector[i - 1] = ComputeBilateralNCC(images[0], cameras[0], images[i], cameras[i], p, plane_hypothesis, params); + } +} + +__device__ float3 Get3DPointonWorld_cu(const float x, const float y, const float depth, const Camera camera) +{ + float3 pointX; + float3 tmpX; + // Reprojection + pointX.x = depth * (x - camera.K[2]) / camera.K[0]; + pointX.y = depth * (y - camera.K[5]) / camera.K[4]; + pointX.z = depth; + + // Rotation + tmpX.x = camera.R[0] * pointX.x + camera.R[3] * pointX.y + camera.R[6] * pointX.z; + tmpX.y = camera.R[1] * pointX.x + camera.R[4] * pointX.y + camera.R[7] * pointX.z; + tmpX.z = camera.R[2] * pointX.x + camera.R[5] * pointX.y + camera.R[8] * pointX.z; + + // Transformation + float3 C; + C.x = -(camera.R[0] * camera.t[0] + camera.R[3] * camera.t[1] + camera.R[6] * camera.t[2]); + C.y = -(camera.R[1] * camera.t[0] + camera.R[4] * camera.t[1] + camera.R[7] * camera.t[2]); + C.z = -(camera.R[2] * camera.t[0] + camera.R[5] * camera.t[1] + camera.R[8] * camera.t[2]); + pointX.x = tmpX.x + C.x; + pointX.y = tmpX.y + C.y; + pointX.z = tmpX.z + C.z; + + return pointX; +} + +__device__ void ProjectonCamera_cu(const float3 PointX, const Camera camera, float2 &point, float &depth) +{ + float3 tmp; + tmp.x = camera.R[0] * PointX.x + camera.R[1] * PointX.y + camera.R[2] * PointX.z + camera.t[0]; + tmp.y = camera.R[3] * PointX.x + camera.R[4] * PointX.y + camera.R[5] * PointX.z + camera.t[1]; + tmp.z = camera.R[6] * PointX.x + camera.R[7] * PointX.y + camera.R[8] * PointX.z + camera.t[2]; + + depth = camera.K[6] * tmp.x + camera.K[7] * tmp.y + camera.K[8] * tmp.z; + point.x = (camera.K[0] * tmp.x + camera.K[1] * tmp.y + camera.K[2] * tmp.z) / depth; + point.y = (camera.K[3] * tmp.x + camera.K[4] * tmp.y + camera.K[5] * tmp.z) / depth; +} + +__device__ float ComputeGeomConsistencyCost(const cudaTextureObject_t depth_image, const Camera ref_camera, const Camera src_camera, const float4 plane_hypothesis, const int2 p) +{ + const float max_cost = 5.0f; + + float depth = ComputeDepthfromPlaneHypothesis(ref_camera, plane_hypothesis, p); + float3 forward_point = Get3DPointonWorld_cu(p.x, p.y, depth, ref_camera); + + float2 src_pt; + float src_d; + ProjectonCamera_cu(forward_point, src_camera, src_pt, src_d); + const float src_depth = tex2D(depth_image, (int)src_pt.x + 0.5f, (int)src_pt.y + 0.5f); + + if (src_depth == 0.0f) { + return max_cost; + } + + float3 src_3D_pt = Get3DPointonWorld_cu(src_pt.x, src_pt.y, src_depth, src_camera); + + float2 backward_point; + float ref_d; + ProjectonCamera_cu(src_3D_pt, ref_camera, backward_point, ref_d); + + const float diff_col = p.x - backward_point.x; + const float diff_row = p.y - backward_point.y; + return min(max_cost, sqrt(diff_col * diff_col + diff_row * diff_row)); +} + +__global__ void RandomInitialization(cudaTextureObjects *texture_objects, Camera *cameras, float4 *plane_hypotheses, + float *costs, curandState *rand_states, unsigned int *selected_views, + const PatchMatchParams params, float *depths) +{ + const int2 p = make_int2(blockIdx.x * blockDim.x + threadIdx.x, blockIdx.y * blockDim.y + threadIdx.y); + int width = cameras[0].width; + int height = cameras[0].height; + + if (p.x >= width || p.y >= height) { + return; + } + + const int center = p.y * width + p.x; + curand_init(clock64(), p.y, p.x, &rand_states[center]); + + if (!params.geom_consistency) { + plane_hypotheses[center] = GenerateRandomPlaneHypothesis(cameras[0], p, &rand_states[center], params.depth_min, params.depth_max, depths[center]); + costs[center] = ComputeMultiViewInitialCostandSelectedViews(texture_objects[0].images, cameras, p, plane_hypotheses[center], &selected_views[center], params); + } + else { + float4 plane_hypothesis = plane_hypotheses[center]; + plane_hypothesis = TransformNormal2RefCam(cameras[0], plane_hypothesis); + float depth = plane_hypothesis.w; + plane_hypothesis.w = GetDistance2Origin(cameras[0], p, depth, plane_hypothesis); + plane_hypotheses[center] = plane_hypothesis; + costs[center] = ComputeMultiViewInitialCostandSelectedViews(texture_objects[0].images, cameras, p, plane_hypotheses[center], &selected_views[center], params); + } +} + +__device__ void PlaneHypothesisRefinement(const cudaTextureObject_t *images, const cudaTextureObject_t *depth_images, const Camera *cameras, float4 *plane_hypothesis, float *depth, float *cost, curandState *rand_state, const float *view_weights, const float weight_norm, const int2 p, const PatchMatchParams params) +{ + float perturbation = 0.02f; + + float depth_rand = curand_uniform(rand_state) * (params.depth_max - params.depth_min) + params.depth_min; + float4 plane_hypothesis_rand = GenerateRandomNormal(cameras[0], p, rand_state, *depth); + float depth_perturbed = *depth; + const float depth_min_perturbed = (1 - perturbation) * depth_perturbed; + const float depth_max_perturbed = (1 + perturbation) * depth_perturbed; + do { + depth_perturbed = curand_uniform(rand_state) * (depth_max_perturbed - depth_min_perturbed) + depth_min_perturbed; + } while (depth_perturbed < params.depth_min && depth_perturbed > params.depth_max); + float4 plane_hypothesis_perturbed = GeneratePerturbedNormal(cameras[0], p, *plane_hypothesis, rand_state, perturbation * M_PI); + + const int num_planes = 5; + float depths[num_planes] = {depth_rand, *depth, depth_rand, *depth, depth_perturbed}; + float4 normals[num_planes] = {*plane_hypothesis, plane_hypothesis_rand, plane_hypothesis_rand, plane_hypothesis_perturbed, *plane_hypothesis}; + + for (int i = 0; i < num_planes; ++i) { + float cost_vector[32] = {2.0f}; + float4 temp_plane_hypothesis = normals[i]; + temp_plane_hypothesis.w = GetDistance2Origin(cameras[0], p, depths[i], temp_plane_hypothesis); + ComputeMultiViewCostVector(images, cameras, p, temp_plane_hypothesis, cost_vector, params); + + float temp_cost = 0.0f; + for (int j = 0; j < params.num_images - 1; ++j) { + if (view_weights[j] > 0) { + if (params.geom_consistency) { + temp_cost += view_weights[j] * (cost_vector[j] + 0.1f * ComputeGeomConsistencyCost(depth_images[j+1], cameras[0], cameras[j+1], temp_plane_hypothesis, p)); + } + else { + temp_cost += view_weights[j] * cost_vector[j]; + } + } + } + temp_cost /= weight_norm; + + float depth_before = ComputeDepthfromPlaneHypothesis(cameras[0], temp_plane_hypothesis, p); + if (depth_before >= params.depth_min && depth_before <= params.depth_max && temp_cost < *cost) { + *depth = depth_before; + *plane_hypothesis = temp_plane_hypothesis; + *cost = temp_cost; + } + } +} + +__device__ void CheckerboardPropagation(const cudaTextureObject_t *images, const cudaTextureObject_t *depths, const Camera *cameras, + float4 *plane_hypotheses, float *costs, curandState *rand_states, unsigned int *selected_views, + const int2 p, const PatchMatchParams params, const int iter) +{ + int width = cameras[0].width; + int height = cameras[0].height; + if (p.x >= width || p.y >= height) { + return; + } + + const int center = p.y * width + p.x; + int left_near = center - 1; + int left_far = center - 3; + int right_near = center + 1; + int right_far = center + 3; + int up_near = center - width; + int up_far = center - 3 * width; + int down_near = center + width; + int down_far = center + 3 * width; + + // Adaptive Checkerboard Sampling + float cost_array[8][32] = {2.0f}; + // 0 -- up_near, 1 -- up_far, 2 -- down_near, 3 -- down_far, 4 -- left_near, 5 -- left_far, 6 -- right_near, 7 -- right_far + bool flag[8] = {false}; + int num_valid_pixels = 0; + + float costMin; + int costMinPoint; + + // up_far + if (p.y > 2) { + flag[1] = true; + num_valid_pixels++; + costMin = costs[up_far]; + costMinPoint = up_far; + for (int i = 1; i < 11; ++i) { + if (p.y > 2 + 2 * i) { + int pointTemp = up_far - 2 * i * width; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + up_far = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[up_far], cost_array[1], params); + } + + // dwon_far + if (p.y < height - 3) { + flag[3] = true; + num_valid_pixels++; + costMin = costs[down_far]; + costMinPoint = down_far; + for (int i = 1; i < 11; ++i) { + if (p.y < height - 3 - 2 * i) { + int pointTemp = down_far + 2 * i * width; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + down_far = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[down_far], cost_array[3], params); + } + + // left_far + if (p.x > 2) { + flag[5] = true; + num_valid_pixels++; + costMin = costs[left_far]; + costMinPoint = left_far; + for (int i = 1; i < 11; ++i) { + if (p.x > 2 + 2 * i) { + int pointTemp = left_far - 2 * i; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + left_far = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[left_far], cost_array[5], params); + } + + // right_far + if (p.x < width - 3) { + flag[7] = true; + num_valid_pixels++; + costMin = costs[right_far]; + costMinPoint = right_far; + for (int i = 1; i < 11; ++i) { + if (p.x < width - 3 - 2 * i) { + int pointTemp = right_far + 2 * i; + if (costMin < costs[pointTemp]) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + right_far = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[right_far], cost_array[7], params); + } + + // up_near + if (p.y > 0) { + flag[0] = true; + num_valid_pixels++; + costMin = costs[up_near]; + costMinPoint = up_near; + for (int i = 0; i < 3; ++i) { + if (p.y > 1 + i && p.x > i) { + int pointTemp = up_near - (1 + i) * width - i; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + if (p.y > 1 + i && p.x < width - 1 - i) { + int pointTemp = up_near - (1 + i) * width + i; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + up_near = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[up_near], cost_array[0], params); + } + + // down_near + if (p.y < height - 1) { + flag[2] = true; + num_valid_pixels++; + costMin = costs[down_near]; + costMinPoint = down_near; + for (int i = 0; i < 3; ++i) { + if (p.y < height - 2 - i && p.x > i) { + int pointTemp = down_near + (1 + i) * width - i; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + if (p.y < height - 2 - i && p.x < width - 1 - i) { + int pointTemp = down_near + (1 + i) * width + i; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + down_near = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[down_near], cost_array[2], params); + } + + // left_near + if (p.x > 0) { + flag[4] = true; + num_valid_pixels++; + costMin = costs[left_near]; + costMinPoint = left_near; + for (int i = 0; i < 3; ++i) { + if (p.x > 1 + i && p.y > i) { + int pointTemp = left_near - (1 + i) - i * width; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + if (p.x > 1 + i && p.y < height - 1 - i) { + int pointTemp = left_near - (1 + i) + i * width; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + left_near = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[left_near], cost_array[4], params); + } + + // right_near + if (p.x < width - 1) { + flag[6] = true; + num_valid_pixels++; + costMin = costs[right_near]; + costMinPoint = right_near; + for (int i = 0; i < 3; ++i) { + if (p.x < width - 2 - i && p.y > i) { + int pointTemp = right_near + (1 + i) - i * width; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + if (p.x < width - 2 - i && p.y < height - 1- i) { + int pointTemp = right_near + (1 + i) + i * width; + if (costs[pointTemp] < costMin) { + costMin = costs[pointTemp]; + costMinPoint = pointTemp; + } + } + } + right_near = costMinPoint; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[right_near], cost_array[6], params); + } + const int positions[8] = {up_near, up_far, down_near, down_far, left_near, left_far, right_near, right_far}; + + // Multi-hypothesis Joint View Selection + float view_weights[32] = {0.0f}; + float view_selection_priors[32] = {0.0f}; + int neighbor_positions[4] = {center - width, center + width, center - 1, center + 1}; + for (int i = 0; i < 4; ++i) { + if (flag[2 * i]) { + for (int j = 0; j < params.num_images - 1; ++j) { + if (isSet(selected_views[neighbor_positions[i]], j) == 1) { + view_selection_priors[j] += 0.9f; + } else { + view_selection_priors[j] += 0.1f; + } + } + } + } + + float sampling_probs[32] = {0.0f}; + float cost_threshold = 0.8 * expf((iter) * (iter) / (-90.0f)); + for (int i = 0; i < params.num_images - 1; i++) { + float count = 0; + int count_false = 0; + float tmpw = 0; + for (int j = 0; j < 8; j++) { + if (cost_array[j][i] < cost_threshold) { + tmpw += expf(cost_array[j][i] * cost_array[j][i] / (-0.18f)); + count++; + } + if (cost_array[j][i] > 1.2f) { + count_false++; + } + } + if (count > 2 && count_false < 3) { + sampling_probs[i] = tmpw / count; + } + else if (count_false < 3) { + sampling_probs[i] = expf(cost_threshold * cost_threshold / (-0.32f)); + } + sampling_probs[i] = sampling_probs[i] * view_selection_priors[i]; + } + + TransformPDFToCDF(sampling_probs, params.num_images - 1); + for (int sample = 0; sample < 15; ++sample) { + const float rand_prob = curand_uniform(&rand_states[center]) - FLT_EPSILON; + + for (int image_id = 0; image_id < params.num_images - 1; ++image_id) { + const float prob = sampling_probs[image_id]; + if (prob > rand_prob) { + view_weights[image_id] += 1.0f; + break; + } + } + } + + unsigned int temp_selected_views = 0; + int num_selected_view = 0; + float weight_norm = 0; + for (int i = 0; i < params.num_images - 1; ++i) { + if (view_weights[i] > 0) { + setBit(temp_selected_views, i); + weight_norm += view_weights[i]; + num_selected_view++; + } + } + + float final_costs[8] = {0.0f}; + for (int i = 0; i < 8; ++i) { + for (int j = 0; j < params.num_images - 1; ++j) { + if (view_weights[j] > 0) { + if (params.geom_consistency) { + if (flag[i]) { + final_costs[i] += view_weights[j] * (cost_array[i][j] + 0.1f * ComputeGeomConsistencyCost(depths[j+1], cameras[0], cameras[j+1], plane_hypotheses[positions[i]], p)); + } + else { + final_costs[i] += view_weights[j] * (cost_array[i][j] + 0.1f * 5.0f); + } + } + else { + final_costs[i] += view_weights[j] * cost_array[i][j]; + } + } + } + final_costs[i] /= weight_norm; + } + + const int min_cost_idx = FindMinCostIndex(final_costs, 8); + + float cost_vector_now[32] = {2.0f}; + ComputeMultiViewCostVector(images, cameras, p, plane_hypotheses[center], cost_vector_now, params); + float cost_now = 0.0f; + for (int i = 0; i < params.num_images - 1; ++i) { + if (params.geom_consistency) { + cost_now += view_weights[i] * (cost_vector_now[i] + 0.1f * ComputeGeomConsistencyCost(depths[i+1], cameras[0], cameras[i+1], plane_hypotheses[center], p)); + } + else { + cost_now += view_weights[i] * cost_vector_now[i]; + } + } + cost_now /= weight_norm; + costs[center] = cost_now; + float depth_now = ComputeDepthfromPlaneHypothesis(cameras[0], plane_hypotheses[center], p); + + if (flag[min_cost_idx]) { + float depth_before = ComputeDepthfromPlaneHypothesis(cameras[0], plane_hypotheses[positions[min_cost_idx]], p); + + if (depth_before >= params.depth_min && depth_before <= params.depth_max && final_costs[min_cost_idx] < cost_now) { + depth_now = depth_before; + plane_hypotheses[center] = plane_hypotheses[positions[min_cost_idx]]; + costs[center] = final_costs[min_cost_idx]; + selected_views[center] = temp_selected_views; + } + } + + PlaneHypothesisRefinement(images, depths, cameras, &plane_hypotheses[center], &depth_now, &costs[center], &rand_states[center], view_weights, weight_norm, p, params); +} + +__global__ void BlackPixelUpdate(cudaTextureObjects *texture_objects, cudaTextureObjects *texture_depths, + Camera *cameras, float4 *plane_hypotheses, float *costs, curandState *rand_states, + unsigned int *selected_views, const PatchMatchParams params, const int iter) +{ + int2 p = make_int2(blockIdx.x * blockDim.x + threadIdx.x, blockIdx.y * blockDim.y + threadIdx.y); + if (threadIdx.x % 2 == 0) { + p.y = p.y * 2; + } else { + p.y = p.y * 2 + 1; + } + + CheckerboardPropagation(texture_objects[0].images, texture_depths[0].images, cameras, plane_hypotheses, costs, rand_states, selected_views, p, params, iter); +} + +__global__ void RedPixelUpdate(cudaTextureObjects *texture_objects, cudaTextureObjects *texture_depths, + Camera *cameras, float4 *plane_hypotheses, float *costs, curandState *rand_states, + unsigned int *selected_views, const PatchMatchParams params, const int iter) +{ + int2 p = make_int2(blockIdx.x * blockDim.x + threadIdx.x, blockIdx.y * blockDim.y + threadIdx.y); + if (threadIdx.x % 2 == 0) { + p.y = p.y * 2 + 1; + } else { + p.y = p.y * 2; + } + + CheckerboardPropagation(texture_objects[0].images, texture_depths[0].images, cameras, plane_hypotheses, costs, rand_states, selected_views, p, params, iter); +} + +__global__ void GetDepthandNormal(Camera *cameras, float4 *plane_hypotheses, const PatchMatchParams params) +{ + const int2 p = make_int2(blockIdx.x * blockDim.x + threadIdx.x, blockIdx.y * blockDim.y + threadIdx.y); + const int width = cameras[0].width; + const int height = cameras[0].height; + + if (p.x >= width || p.y >= height) { + return; + } + + const int center = p.y * width + p.x; + plane_hypotheses[center].w = ComputeDepthfromPlaneHypothesis(cameras[0], plane_hypotheses[center], p); + plane_hypotheses[center] = TransformNormal(cameras[0], plane_hypotheses[center]); +} + +__device__ void CheckerboardFilter(const Camera *cameras, float4 *plane_hypotheses, float *costs, const int2 p) +{ + int width = cameras[0].width; + int height = cameras[0].height; + if (p.x >= width || p.y >= height) { + return; + } + + const int center = p.y * width + p.x; + + float filter[21]; + int index = 0; + + filter[index++] = plane_hypotheses[center].w; + + // Left + const int left = center - 1; + const int leftleft = center - 3; + + // Up + const int up = center - width; + const int upup = center - 3 * width; + + // Down + const int down = center + width; + const int downdown = center + 3 * width; + + // Right + const int right = center + 1; + const int rightright = center + 3; + + if (costs[center] < 0.001f) { + return; + } + + if (p.y>0) { + filter[index++] = plane_hypotheses[up].w; + } + if (p.y>2) { + filter[index++] = plane_hypotheses[upup].w; + } + if (p.y>4) { + filter[index++] = plane_hypotheses[upup-width*2].w; + } + if (p.y0) { + filter[index++] = plane_hypotheses[left].w; + } + if (p.x>2) { + filter[index++] = plane_hypotheses[leftleft].w; + } + if (p.x>4) { + filter[index++] = plane_hypotheses[leftleft-2].w; + } + if (p.x0 && + p.x0 && + p.x>1) + { + filter[index++] = plane_hypotheses[up-2].w; + } + if (p.y1) { + filter[index++] = plane_hypotheses[down-2].w; + } + if (p.x>0 && + p.y>2) + { + filter[index++] = plane_hypotheses[left - width*2].w; + } + if (p.x2) + { + filter[index++] = plane_hypotheses[right - width*2].w; + } + if (p.x>0 && + p.y>>(texture_objects_cuda, cameras_cuda, plane_hypotheses_cuda, costs_cuda, rand_states_cuda, selected_views_cuda, params, depths_cuda); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); + + for (int i = 0; i < max_iterations; ++i) { + + BlackPixelUpdate<<>>(texture_objects_cuda, texture_depths_cuda, cameras_cuda, plane_hypotheses_cuda, costs_cuda, rand_states_cuda, selected_views_cuda, params, i); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); + + RedPixelUpdate<<>>(texture_objects_cuda, texture_depths_cuda, cameras_cuda, plane_hypotheses_cuda, costs_cuda, rand_states_cuda, selected_views_cuda, params, i); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); + // printf("iteration: %d\n", i); + } + + GetDepthandNormal<<>>(cameras_cuda, plane_hypotheses_cuda, params); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); + + BlackPixelFilter<<>>(cameras_cuda, plane_hypotheses_cuda, costs_cuda); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); + RedPixelFilter<<>>(cameras_cuda, plane_hypotheses_cuda, costs_cuda); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); + + cudaMemcpy(plane_hypotheses_host, plane_hypotheses_cuda, sizeof(float4) * width * height, cudaMemcpyDeviceToHost); + cudaMemcpy(costs_host, costs_cuda, sizeof(float) * width * height, cudaMemcpyDeviceToHost); + CUDA_SAFE_CALL(cudaDeviceSynchronize()); +} + +torch::Tensor matToTensor(cv::Mat& mat) { + cv::Mat mat_float; + if (mat.channels() == 3) { + mat.convertTo(mat_float, CV_32FC3); + } else if (mat.channels() == 1) { + mat.convertTo(mat_float, CV_32FC1); + } + + torch::Tensor tensor = torch::from_blob(mat_float.data, + {mat_float.rows, mat_float.cols, mat_float.channels()}, + torch::kFloat32).clone(); + + tensor = tensor.permute({2, 0, 1}); + + return tensor; +} + +torch::Tensor propagate_cuda(torch::Tensor images, torch::Tensor intrinsics, torch::Tensor poses, + torch::Tensor depth, torch::Tensor normal, torch::Tensor depth_intervals, int patch_size) +{ + cudaSetDevice(0); + + PatchMatch pm; + pm.SetPatchSize(patch_size); + + pm.InuputInitialization(images, intrinsics, poses, depth, normal, depth_intervals); + + pm.CudaSpaceInitialization(); + pm.RunPatchMatch(); + + const int width = pm.GetReferenceImageWidth(); + const int height = pm.GetReferenceImageHeight(); + + torch::Tensor depths = torch::zeros({height, width}, torch::kFloat); + torch::Tensor normals = torch::zeros({height, width, 3}, torch::kFloat); + + int numPixels = width * height; + + float4* plane_hypotheses = pm.GetPlaneHypotheses(); + + torch::Tensor planeHypothesisTensor = torch::from_blob(plane_hypotheses, {numPixels, 4}, torch::kFloat); + + torch::Tensor propagated_depth = planeHypothesisTensor.index({torch::indexing::Slice(), 3}).reshape({height, width}).unsqueeze(0); + + torch::Tensor propagated_normal = planeHypothesisTensor.index({torch::indexing::Slice(), torch::indexing::Slice(0, 3)}).reshape({height, width, 3}).permute({2, 0, 1}); + + torch::Tensor results = torch::cat({propagated_depth, propagated_normal}, 0); + + return results; +} \ No newline at end of file diff --git a/submodules/Propagation/gaussianpro.cpython-310-x86_64-linux-gnu.so b/submodules/Propagation/gaussianpro.cpython-310-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..2b5705694def3b5a6c0f45d448e321e3de4758ba GIT binary patch literal 1031912 zcmeGF3tUvy`UZ|~3=1s_yNQ~GriGcta1$##AfiKpj)F-S8wMC)6qs>lP^c`d>|kbL zWyk7NSa}YW7FHHrEUYZLW0#Yivhb9NnT2++TUndjN> ze%HI+wbr}VUTf{)s?6+3y&@tG)8uiOcAgfY1Nuyp-^-pj#$eO5RP9K*GE5uFWh0F% z;a@tA7uxhsEn3Jhwm174D^pWGH@_=*{S)sK>FFkies25ckvswY6Yo2muB6>_G{2tq zNa$zVAWm!XKB-UI*^6j)U;6_>zWu4t&jKbuhyEEQpvG)uXQRBXe#S~U{ZqZKRoYBOYdR^`wl1@%u^ zJGd{|C01u9Po1feds>(+dg-(8$4ktvcii*su0?I7lh4msxNm8n>mT2L-_fOXSv!Ih z+UQK9??=(OD5|#Cv5}D{X$7&1>`f8T!_s2Y3e$&b4R>hM4%5!f)3VYUVuw#8=M0Rh zt)<$!C-OC|UOT$)v9S|0ZRl|g{Uc&lX!#LZZDeg)#)RI{4QYp;5H&IC*1i*aXWIK} zy|a29s|`IOR?~*1X^~fJacL1+uWOGd^JC*{7u7{+k!RGU_Zi|l&ZhN_JwEoLqk1=J z1=@8iJ1=Y6M28lo9X@pA%3h0xYOkKDO*$$vA}vyj)zao%+bc@z-K%fkH1bMqL0*y; z+qX8hp%=+(X=$-q%*1G|R?Ci}tG!| ziG8VWyhaTrDlMjeNisJ@ZCt|dR!E~>qDqDJP#9u}uveQj(XiWOn@LC9{aRY@ zNG(o_kB*CsI=8lVD47{)k3C~zeQlqK~+M=<^Xeo9J98xku$EyZ*TR{setC)AYcNarRx+3^Z}w#x6X z)8`v>zDeiXl53Nno8{*_@{@HT@6q`_ogdKoA)Wg15q$rYzHg)Rb2_)v`30Rj=^TDk3N5<^H)0e)A<{n8nx_RbRI@$B%Mdl8Aa!jbW$_aj-j(Z zoyXD1juYu~Af1EhJXvzF@^dJCo=WEkiBF@?)9E~e&QWxZp_3g6^qEL!GMy=Oj-_)P zo$NSAevYTl^XQyFX9k^_bh2YIecI{FqBEP$sdPH%oI&R-IxnR2VmdFSlN|;0Sxl#! z&T={{==9R*qmvze`5C0o`E*`R=T(whM4#8tc`cobC3hWt*2(Ye{u}7~GKp`b&ztGI zmChA(uB7u$I`5+M9y;}-L4LoNKJTM*HJ$&avysjR=zN&Yb#y*KCp((y^J)40Ir;g# z{A`h*FVJV%YhR72@V=YA_^|Dxe7zg*yXZeBZ@u%fe~sw%S>%aztJnW<-_1Ge&yBux z(g$bG`oVtx9UVum7&~eH^}9Yf_wioGo#e{h|IAsRHh)`k`SII795Al*-oWBlkNs%q zvPIbi55DtVFhb ze);>RnA-{;yw3gb!dKQfx4(JMG0VMYT=e+qw_H=5`&O^&tKc{--ZkO z9{c(!rLRA6`PdIWE=^5)seIb&D`&p;>2goXtL>jP|MYC^8JWa&EI2MZbI^(#GhZ9n z^7D#|pBuI4hPN^wx@o~6YY~7hIP-yK2RIFW&X!6Sx9=Kk_k-xaz2hT5Z_ z{wC+smv;Q~+!OPsys3TBQu)RazW-L7|K6zge|UcC&A(NDT0G_BD_{Dt?~`TU44(dB z{3Ao&o%Y3@%MTmsc7M~n>Bu=VQr7f)|6kYEZrQgc@XCF&$Ncl9-5J~8N(r9$)AHac zU#=hh?m1sApZLEa8E5UNzVev?IaTA2eQC!CAFDh!_0#5a$1mSA@br}W=;H>r-Lq}t7ZWbu zUD$les{__<|3y16V9kXG?q9xi^~2At|9aT=HLpZ}eWl~MZ*n#@Rk?;OiNAZ{p!_L= z{O7+{{L=qyuPk`?m835&erxIR$6S8qWmhgdx#o>ePWx&2HMV=6*!BI-H$R_v*Bbu~ zXN>>a+j{X^zMI~?+IG`V7oD)b<%;`9M^nqLN>6h@)-Ic?(t(tav{cU67>W|I&aar%LcmAS{ z`((j~EBkCa?v4o)PQ5>=BXh^2&#k}igD1asw#*p%oh|N$)VG^DH@ZK*ee`2x!Dr5I zUv=Lg@AC`Sj-NXJ%ZuM?-Vk%!{xe)Hjc={oKkvRLc8&Sh()PFkf4gf_uVcTDJM7ub zXPj|q>X#2xzg$xKmg~a*-k7%Mo|xMnyXD=hKe%ezN0+S+yz<$sl)Iav&zyf@WWj-v zpI_q{GU)A;zD?B?$2|LZ$^7|W@1B|Z?d>zyRjoUtD1{17<`X-s}1c_fLPof8!&^72f}LU90QBjm4)u z`P}+*w3o66KRWR1hR;&##-_yG5P9BHH)h`UKz8!=DKqAs*Y?cBw{y1T&)xOXPa7#e z|9)au?Bc2a%pP<3n$I4oIX*b|v=^Sc^3{s_pX_+?nGYJ*e*2GiuWpGL@ZxcEADEVL z;PNdsspmYEa`mZC@3^dR!EGbfcsv)a{w#XTl*{_RP&FVY`OEbDqo=$)sOrcSgYJGY zabDrorRk5{@>}7h-|aneqIY%Y3H{b@*czO=`1*_Ac=FL(dc9mbeM|hB|NQjKmMc~~ zeBWg+uH94DdbcC)%X6lG{p6g%Ga^52x$pC*AL@17oXh|IiLcZD{U@*9e9r5AzMS`X z;+grjTZVkw>x;%yJ{%r+<>zCv&)NIX+x^q?&RKNY|Kdj8_N4c;7alKpA!1?eqTs_rhs?X<*$)@gjVn9t zg~Fev}$+24NZ4E)mmob!dtlV|w)?d^;_^4m#m z&qTzWQ~ZzNAH?2~6a92q;ky;5C6#_y*=OhplSfRL{_qpkFaHoY?S&uzId$H>TURy~ zwzaSIe|Yg*|BC*4^4u$4+~ps<;`@bPTl75P|GqJpjl9E;e&fyg{v&Bf8!oPu zoNO+C-6`hsr8aZ< z9_~NgT)u?-Y${LwH1pd}spj$zCYZ~=U{QZg8ES6N@gvOnHjDBde4)8~f1WQMsGR$6M%eC!5Qk9cRuju<+;SRBz4lb>BJW z<-6XZ+;b>inc4r`x(k%>1x{{9qOjt1aU2>LKRxLoCw$ zuSGk$+oGO-W>LP6TExTWE#%L$u;*@za%rwK_s?vLde~?Y=TBu5b|!J)BMbQt{pRvV zTg3ANCz;#X<}v4sXu{E~+i3X616PMSEGEV4mNl{ml8(%gyx{ zkuhfRr-pbldwN^M&k~=xd^3%!&GfG#KbYx1VBxnj$z!o$UemM~i@1?w5wG5{XzzW< z&t~>CTgXo!|C`CbVDTIgZBdR#TEwgE73TVfS;VEIqs;w$J+*5y|Nq0HUEJh1k3X+j z)XyI+`l;J2>PbI}CuZ^R28;4qW>LOg3qM3#l*34e#<6Dh$6NFZ zZ(I1`Zi**n^=FjD`1S{?{AThI)6DIBi2P3Af6U|;Sj4?Dil1ikpQf1e zw+}Gqwq+VxC}`Z>*Sp5JFJ;@-Fd zbNLQ3(yYAZTGZQfedc;jv1nhbE%LQ{pn1B97U{lf!JlL?epqc0f6hJ0-2O(3e)%bj zdi$|Ox|1y0W3h#QZavZ5o(C=T-)T{QBB;Jm)eSo?w&<6yvxt-R7JgoCVb3db%*9EL|ZMsl_+M9LD)!{9oGBL;hiUTI4?7 zSjm4jNa$&28`|ig$1Z+6?-0C?Z3v=6_rp2U1n-a=hV*>RqU5+eY{MKKI-f7)3#7cR zXN~lm?+u|}_uIqV{sCI;y3qW(=E!un2>EQ0jP}?i(r^C|{6L<%ru~QXGk>Ie^o-F*| za-#4*HGh6g8zJmzC=iCvlYG>rf^V1hQ@6#BfUIw^N`3pbOxW4-uCP=0=g+dfHOcxW zw=ZiWsX%#sYY^$`@-b6|AAFC7`ZEW9piP6h^aH z^u8~Zk8h9G+U5uY`${_-`^a?vDF{6doI)Ar_Pi|kt9b5cA7Ed>H%NKi&mSHk_)h76 zT~E$X!52I!^sxPs?D$stGgc|DMY0_0B~Qum<955qSE~{S9y&wluV))a=^!zFysD@B zl;Fn-H)$ENy|gHPTSVg=mf!ZTguF~%8-2d04{0)<(6$PGTp1_)U+)w0qeOMlE-#h& zZ4(K`$aF_Y`!_XbbX$d>zCU&vjl&rqE9NlDGhNFZ%Y`-%*ZcP($CQXSm@A*W&95#_J8ZPqV5-Fdm$Pbz& z^tUPPaf8$oFZCQJ^_*i7ua2eq#@c&lP#CD!|Ch_8{W31;{m7fg2%c}CCf$0wh#e;7 zpAmW%$aHU#?Yf0+e5FHg*PqCKxkc%hqhx$5ko81Q_p}MZKicuaKQt`o$BnWa3)tpr zIx_gbn$}mgJD)5s-OjcGk>BV$ggs@lTr?Rs(qtTnl6uCve3q_5`bW?2owEMK$okVy$}f`nidNdi>?xvL(guohq3Xns zxiT)bEB?8BD69X`TI>)Z|EiRyWVt<^w+lP<{^(KZAMLJC{{D2)j>?pFu_{aWElL>= zY?k>gkooN^)6J0evp}hz11aOoKLs*fUA{U|=ucJj&$ozsl@o=0^Lh~bCh;$3qh;%QB6nfs5@xh_QhyKH)o@Ye53uL-YvL96A+qYC+EDpCTD+$o5bkU9+N;`77Wx8*P{ObMw z1G2wvlFt{E96z?sl=4b{bm0KYY`Lo;Ed(#R|UuU&7A2rF?>npN>le zufJ#Y>v_y?Lo~bc91%qgfz_Wj88`IuD%YPAzZQD*@y0$Hz_4OAAlz0^{+fka*zm#SO|8y$tH$n0Zj|sn($#h>OgPHyDO1t%)ok;K}NbPxjYT4fqi){oJmM&$Ffq z`Lw~JyyB$%Q&R+AE8_#Xg&!-aVX|`ZtrF?#@pifF-!XrG2JIa{;0a~4$ zuh7%Ykowc4e#$0495Ox>DDmM+>7SO5MO?B=`R{1}!Sz2W>NAB+e%zle_-JMP|MWP) zw<>YtZ7Lv^-xj4@M$5QVt2{@aO>SZG4yE1>Br_P_ptP4>v4U6Q%ssN7YFD1?7o>~$ zT%g3~-ZcNi;#=(J!Vl@9c(lz@-lxcq`kRPXX-fT%m+hiV;fJP)bgLCTHaYH1Q`+Nf zncpU5ymUvV@N=qC4_i+Xe&8=$Qc3Cc_EW0Z+@FfyZpjdO+GIIWb>hbha-82F$4k`Q z`0@Bap(kF}Lki>kNagX0=A#sQ&Xe;PwMuw?VdFy9r|<4S28ZOD{*Nu z1s3M#cx61fnc^sGM?TpubbBVtcC=54+yCh&^wcZmHJHp``qg+|O$E((pJLBW8HYP% z9H#8>!$S?3+o_Cy&T|O9X`{%m9ygxh?R0>aueA650hTWsS0swKcdFFC`%IxnjsJxd z*jc)1vR*|=`BbMIS19AX3n$3>DSwYak3YA{_)wt4hr9xzr}K7UKQ#w_93{(LQ_6kB z9BJo!LcUXELmNot#q8`<{Q0hYE{Ik9(|?qZZ;}(VH2mPl4jJDx*)LFW@FUS8o@dMz zdKx|y_FN(5_se!yptQTs`Uv@2rQd9n^|MW}|KG<-J7u}+{pNnzz6zA~^^?r6L&3=moC(1YzE96CiNz5F;|_6tq2U!dyBj}bDzY4W*`+{=&0Wqezy#J4*piu&nLo};k>l!EIj*MegCAa54+~_vdcAsif`|`oa(?M#DgUud zS5x9-J6&h?rz!1vr5ryrN&R}gs^a4=8viJ9>4j6I9{JocMW(w%K1Xy)KkIfrO69=P ztyj{WBimi)Dp6kJrJhpRzFL&_byl$`-+1`~x?X?kWSp#(adMc{vrIl;x65+W0|j- zia8{jZnxU$0j=vYxlE7XG2?!H=QTk1>BXDD}Bj_m7c3IV@RYdFD2b_$}cZprJpUoRJIqT-*1%lyh*9&|Kas*fR?H}UpuHj zW&T{LJa_o{IFQOq8D}n)<=Co}<2ISEcA2kMnXh&^zN%N+`?*EJeurF-epAYyk}L9C zuf(^JWrDALM^xl}Qhx8*f{#90@S{X=YWqeC{cUpIiOk?fs`RJYuZ@!9t9WJHPT`;X zzg^A)Q+Ve`y{zXgNP$TqTd$>?^hkU+hP{u7IW!!FB zCFIj&x_J~BS-L)1&#Bt;<1zY|@oK+wiSB=8eqfAW*yGzS%4@pFo;G2ksE4u2yii=G z;NxUm)#G6e-Okcg`yE;`=RE)M9I}nf;D_&T;(0SwX^(59o%OPwP;rQ(ztH25{R@Q= zeyk*WS-MS1JI%RJ*x9PYrSsFpb8Eix+?q=Pjr&dMN1m1G`eeE^T;a!i=QI7$TAQ*? zs&W5NJ(2y0ZvTJA340t$JG~%Zq+6i$Yk!x1XqV;nZ<+2Ta{OPbjQ@8?f5s{P+$GCJ zjh}leMY*>$iE_V+`XP2aOZ^D*LyL^V`t$5h7V%_~tp9DY{*$}-(T^$yi(~tg=bhry zMY`>CMSZ4jg&$k!3-f2K^8EXyjBo9V-#(P(-lCNITIrv5#Xq;m_EIa`i)`-NPjdX( zBFk5ANAG6~d(xD7<{`2^$1Cl2L3 zboql$r{>Jc%W)RF{q9mvAn5kzcq(1xp36w^qN!7I zgULm~8lO9>C^NO#>s;U|c2{N=u}g_Xw)lj2Pi4?w74Xb=JAFaFlTt5r2W?~h?sB&) z;CA}m0dJMR$Q{U>uQ_TQey`8%57s#INFh@(wrGAyxvR2rtgEudQ{gMOr35Nm<>gL- zPM^2jQ&f{RCv#!~-P~5)DzuY+)8^= zp{EqfaB6P6bDX=vM)UQAY6551(UG@2Hcg)l2G zHuq(-<9_g#FIBxPF z#roAAh|`RhD2MLorir)i3)B3cm2h{9p(hF~s-CqGrW2>#wix;f>mwNCX&h8SZ>f}EBBVt zw36HJ_xkmDVr#u}KFwO7+YZaMjCdhqWj=(fT=2&uLQlrA{-o3;5xt0rw0Fq3_> zU=Yllk?UoX#XQ7#$2oIoGCe@cR#_F9>{6cjV_CR9nyUPLeT9ZTM-3|$XSUZnx5`Jw zn^j5k<&{P59CxtHTP&8#qzn`MqXP^xyUGKZ=5rEZb=xYOgk@GA^#0E39!(e>%55}l z7N`{gKajU;h@D#f0dgW zVpUO)!%4340OF~%_#iKfcAG&$_w%ja`f7PIuJ z8>8$_6x}$xN{&e_p{O;9v}KA0LsVjpD;U<>v%cDCcLmCvg*8EUfR=D7Dp)#26+WgZ ztg3|9y3qI@R{oSgiqq*Om2Ovs-eQYbvPESsTA22`Ji!1JIW=MOE-j(Zut7>^ zote2QPRA5lASyRCD7<~Mv1ynYG$^6*3RCX!QgSBgQ}0IQpGj8|oLSxgJ85mKn{67a zVtCqJRbwpgJ!n0Wyir`^r2fP-s)tGO7C~7ssz!L^HBlWFfK6mr9A>pnt8iDag*9?= zZZIL<>EzYYN%gHXSSC6VR@F(0jAkVvo9{ShuCs`8L!-xv3cdM~RFSU+q)1_|Q>--m z-9Fk4;q|*p-IOb~F`{U$v#4yYv&7|LMN9=S&Pcs$6e-#nxghAJd)NXp4~w}0DlW3X zOOcs1^~{PQ-3aGJY$%%Qq~H=H)i(M@_p(|Sa8l4=`x$~BY>Rpk>QI&zYX%{GcZN*{8On`vN%q`%Sz%Xr zE>v;SM9vAwamplju&7LapX&9~1`oDSX~Z5rz7b;zHl)e(yNcX}R95T`U5H)Ca8(7| zVWgLqyQ_mzJB2SQa4tmSqiID&Rery_Scbe}cZI96lx=@ubt=Ub2zW{>Wmsbj>*y=0 zSW~15#z*Xwg(TVwBVr$8sKO@cRmNKtbb3pie$wf7mQ)0(-dsjz*b<$zeC;f!eM7XJrO=c=j2YQB~~9b(Od?sB0TnM1T)AS#|Je3{G|jIU{c7Zb~YmI3&K2 zdF7^2^Y@}QGbV|pn^ER2n#;A5IYx5X)I)KSr$5m>-&5qyt*I=c?yyqsa8_*Nca0)H3lMsr-rB! z>Jw~Kfs0(_G@(R6E4{Kf!&Tw-yJoO{Hi>L=W=+j?CSKq!$|}qDBxbTBmxeZMt~{%R zI<^!c&$P3Cg7#jqhBjjg-9?>mR;8~h$nB6+f^%9`(BMcYIhW*}S)R3zWI&X~g4kOyTJn|_%cuKl_ zWlN@QX{@lkmBN21CFNdMFi}d(5HMi|TYya^Rp~52jb&rhp4u?H_ z)Vg!TCO*DJh*xzAE;Mu!{VCXkRsF?h1uTaiIsAlp+|Sybb2`CS!kYabc@Me;1#hvZ=qpSJ&aD@l~Khz#D3XOz*-KX*B`n{OXG@umE zav}F8Q2FsF$6E()Goja+6)XVq>nzu~K^nQ33}N}BQ)X_V7&qtHoSD;T?3_E6KNz#F zRXj1UD$aaIjCg>~tf2NP`qAzx<^yu3T`0;($P$UOep_$glt6~fgzuU8JSCnAJ-qNI zl_1+Jo8=hm^zvAqYjd)uNx8+*-Z*C#ZHNuhemEM@r@H4=(JW@r%f+bmmeB)`yd}{| z1H&A8m=_}kc7<(DoJw(n2CWm_C9bOSptx8}V?k=&@)Gs06>K9df%u*Dm&?b7%lstE3 zfcmj=KDV7hD@a*1+-XSF{<-ZDOhkmC7UY=p~T=%r)d7Iu+WgVB~XXs_18>dk0`W#H^jD7-83tk zLabm~lbwp0X6l*GY_ixU(5}wZVpq_`#{bND4&gmM&>+Vp#8>&~GL0%I+*DRk#FjXj43d@SIzr`n*Ww8~o*$P`O1 zp|=z4N=+ zaLU2zB^yOe^i87)TSv{zN>33j)jHDyGxH{;(%72yax7!?j2Bqo^3k*qdtRMDlT&=O z5i;kR709hBWEC?+B0V6VVemGtRuBP7EJPyUlvl;Wfs-zVSe9AIOe|LJ(Us^nJ8CA; zsLSo-J$*4V$-vpv)~8lg6uQ~d6y=PKu-$&z#9V<=6WGHwzdp`Kqev!Nr@O58V{&!e&8Taqpb1p*@BcxdMu(n%f`*}Le~rvjb4ju=#i49 z%-FzFzcGpCi2O7XUm)g$Cl zqC(E%L>`YzRBPFsHjOBpVs|?=3^t+7pO(5>lO8)V<;cadQPHTTJB^BlK#4}95)%rt zc95^ATIf$R^4aPCqA624IBZRb&#J7VCnM!K1N#^@aD)GurS$BUS~Qm~2Z>^YXzph=cI>&AnO{SOZ@Cmzl6)?YKa1L{V?Hli zDispznuDb1$44JFdK3s5mj(#RVJQWB)_t0fN|UWerTmilsFc*1j!M~xRE$i?0c>td z3}-WGB3C>QB(O&y-daCJRia$2dQ@c@~=4x$8gX(7-ujLpm-+2sSx6nnA{H)qhU1>87^O-O3e#B&1TUklP>FB z`y_fp$jBNS4N`=p#SfB@`J`Jyvd>0b@)8p#K_g=`#QTd~_figIa=JD079EnnRO*)L z4q*7Cj_i%YCdm`n6csD#&_z8KOhjKGI#DQ)c)X^2m^-hOt(EAE@cB%d;iTsWcd>9j zFQN3Jc~u_2TX-GwOEP(7o&b~?T?G_ckFo;#0<|I~mNrB0oXB7K%3xFR)aS{nlIxnU zTR~M0HZO#)93?F%qv5y+0pnc5TsYCise9(%^x1LEwBg9uG%LCmPY-9O27u}U27Dx*yP;IN?MK#h?jBsJe3%+ zyF~HGsd~Z5Dg6-6Rp|ALSwUm6rJ{(frWW(v1F}xj_<)TsGbUA47O}}UeMqaDM$Mti zG*j%NmXE(GQtYi?#U!maq7{8(4b@ParbHR0BnWvC}+^z8od^ewXy7EF5Jg0OqT z(+#&f?56MpyKz%^N|rgKd3SgnQ#9!CG<$S=c`%LIzr3Ma)>|q!$*HAYE6e4mq5GE08@gq=rE(L?E%jPiF2_dQw_M)P zEz2#Hn^^q z*%E1aD*ueM5-Z(u`%IX3X@9MkoNHb$X}daY$uhr|P^xdZ{y!}e+NSVlcqpNqUWVk` z$Nz70Q~Kv5Lq7ueXXM5`@6SjkvBLYO1e#Rd6pB6b|CCJmybJz}bjH#i z@29$F^N@Qe(;gu)P*wP6_%4y&OZqd?VZHzFjUC3)bv}GCkHjf-nT<^7s*}BQKufOj zw~!~fg5qrq!;SG>+r{LTX_{naoq`xB@_{4oBTx{w6$>$aw{_Qz`U~&C$k)-svCKkJiQXW+xspi2;^mek2W?GaiP;z}ugXig{6eDf;vT((=gpWnNg5tcOO^7q8@U~fjeiqL9Bc!XErqUL;BhaQNZS$k z>U4+vg~>8E_yyNQ^FgTKH>7x|8g{An|0O`FB6Pe|17bkN&QRsKSEarn(L zHA@}ibR8mfbCbEPrYcJKi$*qG2{(l7=&2fMWeHbj8!H`Y_f~jIX?t&3jdTYMq55Oc9+lO zFGHBRgw?-8_Os`Ysx)&nuV;UT@!W4T@um1JX$JKS|NrT=|9jKPXDReHiQ+Q$CM6$F zQ1BPsms+R7+mk9`RuxzY9g1$cFPYxVSFD6OWf{3lf*CWSJGZh#*^5FU;m&3hNl%kJ z_>Gic$o76)BK`1HS9fiU<{k9nib=rYBmEiSbCID!2*2!92N{v<-y`LvcZV+t*b=&y&-YZ4T&S#D^~TmB#nb*Sv;MCf1og&OPk zYK=X7?DZWV#XI(U6r`VRl+UA0l08(X-^I2<&?`2=hQg{6YXidXAbTzD;EzW1G6e18 zq~9&jw{qqks+9-%=^WutW6Pudz}59@9&$r<&z+7>YO;tE68TG*S+v6Ir{5+_53t_= zQ{KkZ(_@cwzgIKp2U@~w2D{1p@8^U*gqq7352ZaY7v3K=SBh@1kiZAnWNI@Wwu|`! z`m-Q3Vz4F2FByDcT>nKz`7muen7EOpgG!>E2NxD5>sH`$4Ns94e^Ti&nzqGOmL})Y zA02Y*70cv`eCiLsl93?Zoy5036PzjZPA1hLwx*D*M+CkEB`?sFqbS;M71SJDFX%r#DWE z7pwJlOeyqqg9h!nWUn*vKX(O-0?LFrE53tP|DG;avG-d;UgxGNPVZ3Do8zgjsvvuS zFSaG5%Wt%i-^FV{N|CFi#GR1J-d|y4LW-Ne9#KW_^7wo-{X`3u3 zWkXdwES6B`q_-7bIZSfhy_eG2OQ!4{$lv#%qDvNP_ty6KyLTaP>Z`6wtZ>bxMP?b& zGVv9{!mcG!u)#K#rrDgjtDVAO^sZi2rDt9h|9fa`T{6MkZ|n!)lJs8`DCY0T7{B{s zv(X#qd0z3>KL7b2_R}`J^q8BI*iVWjB+|PBlx6XDewXWiU%wuEDFpH#IuO6ss&{X!4vQ4RqYAwp82Vy44;0ML zT+vt>Nzo5*xh+-cA&0$dPPNjO6a}d6x-T;;1>P&^eoLfI$ViFR z%G50O>qT-gUate0yep$k-AqDsW~}IB?*xS0}eCyvz^YVPG`KWgnj@nF`k+&y+3M9a#6K*CM6aoC6^>8 z+7kJMEd3-~V6M|soJlVh(XYv{*CNx4i^WSrl*~AzN&IeWU~g^F--j!upVSL@T=eU1 zUQ);2uae_8_AXhac#TvhB7S%&f#=#W>35V7T%g8H zh>7swhqK666@q;=^gG6tl47%>{vf;CW*ZaFZVCj8i$;xNObUY)#<$WUdSd00jOQt) zXp=KCoQZVfKRORwb(+mgeXBBD5agne&FRSdMUNCCV18u`rVac*I5b0rGc|3duNAS%%GnF zIZG5nVp0mbeir*fuMzUUUi5hwoso31@9aOF6R0;a?5guy|>gKsr4n?i{H~ra!2y(eYK;AXY!GBx6miBo_cS7Uq5+`Nr?aYg0z0e zVWdU3i%CUt-ABn3_4Ip@HM$mNC9_=EEA9{)*cJUhp`ZOL@)<#YLH8Jb7jjGoyUzY) z{?c-mdd!Qu9bKQo4q+E#Sx%Xp$T721w_jMO zYtipuRxod|dqw_*ZjpAlw4Uz>`m4fSwL;v@{uO!BwF_N;{ri^({_=pC2SglxH>gnz z(6m@O9jDbCscHSRUBt12-SsM5uNvg(qfvzX7OpqK_4d&p(O+)wtuapAAE|AV*Xd7_ zYqu`H?Qo5v)&a>K@A1%IZa+fnTP17=4rKZd*N&H1q<0vk*H?R5-pllt?fVD)q4Q(4 zSSeq_aewVBiN77Nzc15#p2Ysmk5K-O(Xw^@93Q1!D6xy*f239-@sg`XlK#G0mBaxq zAEjL*@w<=Ar9U+vsntsy9C>q;Mv?4J!t6+Ug#N%f9Yl)bLh<*`?F!#8UGNTt_vH#c zU*R1W2);n!WAg=HrtmG2uU7bG`FH4R6~0aW9r`+j*BXTWdWCP7@+%cSTFN&leC=wX zr%B-(q&=+)-*OyPD>^z9KJ9qHcPe~~#Env)?tkB4A>X9%?NYu);TxoU{HvkmsAKK5 zP`)-v=-1O{xg19)YhUbWlj*4ZJ_|msN$3xgx8UoZG?(83`WFk=b9?lBGpaxRquZGZ z`jK~7@MRW!tp&f*f^V|mTP^r@3qERHmmkpnSPMSYf_GT(Wfpv`1;5gQZ?fQ9E%N-&98&pwsLxoAJ_~-O1>a=BYfyjkDbnjl z6!51)yNI#iqk+!?J+Z*g20kA62H?|x_c3S4!w&qdAYX04H(KypEch0vKd8Ucf{%sr zMR|t>Uu(hVgFQ)*uL9tE0q+BTGVpc4zXg7)2mWG^Zvg&$kZ%V5Kft#De=g{01KtCC z2k>iw?*zUG^lRYfxgZ}6d_Ul0fFBBc9PrNr9}j#yq?-nO8Sr-Cuhc6ceKu_nag_#f z8uIxd{|)FV0A3CSxVCBwzTSdwc)Tl~qn@_syX--}UiR0_6y$xN|3$E~4*0WyZvg%t z@Mk0NLwSzGKV=YSkZ*dn%TDAwz)s|wLH~w`t_0eEzYX{;z?XuZ9l-Adc@5g*Gr&gy z|1ju@0e%L^#{>Tu$fp9o7v$~0e-C^C@Gk*h27EK7XaS| z{2QQu3-E;?-wymV;5&e?1wEa>PX+mXz*hp_0r4Dp4dVZ4ARi6<4oEi!_|3q_0{fX@fM5%>b&9l%FJzl?kt$j5+uHSk-& z&RXEF1-=e=2k`a4U!wmkgo;rk^qd~p}JMgK%XMmnG;2#5dJMixT?*M)Y@cF=h27CeVc1X7j_)9?E2mE0mUk&^);M*Zi zB3}#g+dzLk@F#(umB1&1d;{=>z&8SaIOu5tej3O(1K$GjEx=C#z7_cUK~Ed-PT;oy z{}Ax)!2baJN~mwhcYypRklzP<4%n%|bE2H$=kYBH_$ts74ZI8Z7~rn~{jtEG0(>0s zw}75_;O_!H75Kjcp9cKnpx+Ms6yWorz9H`b`C~!80Qg%W-D=>k0KOLZzM!Ygg0Ba@ z2J|!l{{`@k!0!RR#e$D*?uu_H-wg6cgPmJ|F9-eYz$XFU0sJ|jCmPa4ejmth1bGM4 zXXG`|GY`^j1$pG7Kt3Jhk(v1f`1^86pZwEaE7JTDVU4BOS7|1HTS=@B{K?AfEv8KH#qbz8d(Cfv*MrUa+$c_(wp#9{3AEekJgigM0(<(IDRl z{7jH<0)8X#&A?9tJuSe03i7SM&jA;r(|1Z$v1AZ~cR|8)Hd@b;4pr;=A8jxQJ{8b>|0Q^+on}E-t znxL6ez>fw!&7cSQc92g5`A*=+0>2OVbAZ>NzxW&QQNXVTzr_MS73AZA-wpXn1^ztX z(||7oJ$B&dgM0z-zX4wcd^PYs;In|Q27Vr-TMPU@A-{FNp9*|E@VUS@0Dn2?-vZ@` zd?UzT0rJhjF9H26z#k8M8}L_yo-M#H2EHBm>wxb7ek=H`6Zm@IH5ktngFR8eF9-e6 zz~2mfEbzAi9|!!;kZwHi_kesW_!;?BkZ%C_G~h1+{dVC04e}1)8-dRU{xZ;00Q|!s zUk3am!25uI6!>c39|OJ?_ydq`9q^BXd=vNw`FfDw4|*Dae+bIA5%?yMZvy^X;G2Q3 z20bmnzX5i(ft|>=g8Z8(5B$5pZvp;wu%{jP_d&iB`2PaG5BRm9M}z0bPe48j_;Wx$ z8u%x{4>7=R2R-fJ2jpWx{wt7=2mV(`Hx>BrK|T%mpMbXme=XSQ0RAx0UjTe0@MXZK zgB~C7Y^S7tR0IDD=&1#M9>~`Le&z&8S43+Xli9|Q8uz`qQ9 z3-EJ5Pb=`JfczHV?Z9^eKL+?ls3*v$0{*L8Z;NJn>4t#I2QY0WWq`ic9gpM;g+amI^#=$Tf~M;MtxP{jdYy9};!|&urC?eBeI<`wM{A_n5MK z%7CX0&Boyao;D^MM>X&R!Jb;+Y2&hS)B*n{*i#QYZLBtqmB8aXOat(rgPum3-Bib-wynCu)hQN0U+NA{6OIM0Y33(|{iVydC({fOh~N z2Yf#8BY`gfeiZO!z@G`c5BNH$=heWE0=^b_FZiJj_%Wcr9(ewunY^|V_;H}W0r+^( z(+Io`_$J^JfNusq3HTP^lYwsqJ_YzT;8TI$0{q#)w*!AJ@EyR92fh>d^MKz6d>ZiD z3tja;9r!5VCjcJ}{6yemfWHpPF&6ktkdFg?67ccBPX;~}csuZEz-Iw(2mXBE9l%ck zJ|FmO;0u7y0lp0QX~6q{cK}}v{B+=Jfqwz~RtNkHkgo?m7xjb=#K{83Gy+(7XTj%ybJg^;ERBd2fi5iRNzNIxugN_26;R1CBQp?F9kjy z_%h%NfcF4j2K*f0eZbEJz8d&);A?@e0KN|RO5p2(cSE_X1l|ks4Z!<=Zv@^Cd=u~i z;G2OD0^b6B74WUV&j-E@_#2=cw*bEY5mI^b^sz8?4#$k$5XSAcv2@V5cq2>d^QZvuWL z@Xf$4h4O6y{&tXW1%5Wz*#`U_Aio887wB&X{!WnZ0RErAcLIMG@cV$j8+dI~SN&fF zd=&8a0v`?heZa>6e?RcCz^?{A4)_Ovj|cui;8TJB8~7&;_=iB=4*VM69l);zJ|Flv z&|d(26UdhVzYcgG@O4n`)xbXwd@b-^NVg97^`O5V_$Pp03H+15Hvs<>@QuJf4SW;u z&j8;H{IkHf0KWnFR^Xolz76>2f!_jr3-Im0Zv?&r_!ofh1pY5=^?wua zQNS;Ra)}21Wsr{n{uSV3fo}yq4)|Arj|cuW;8THr9r!fh-vZta{M*1gfNujnANb9{ z7XV)bekcR}9gz0{{~qwwz?WkE2mU`GUkCgLz}Ex61^AV~e+Ya7@c#z;8-f1_O7L3;@SlNvC-9#GzYq9}zz^ChUG@J9 zkdFd>2k_CrcK{y){7&Fwf&UWtIN)~y9}oO);8TJB8u&EezX9G3d?)Y@;P(Qb5B#^l z7Xbeq@MXYX0{-*?{{zTZ1OFrNwZQKKz7F`Gfv*St7vNU{|97yb0r+1*z7hESz&8Q^ z8}QA*9{|1ucn#`jEASD(w*lV^_$|QS417EAy@Brl{z>3Ffj=DheZU_9yw=)P|D%A9 z0)7MdGaC2+$j1QR2l!av`vM;a{87Ni1Ah$gslaCdp9cJ~z}tZ@2HpYualq#Te?0I7 zz@Gqo8Sp0p?*o1S@YTQ%1ilvdLBQ7mKL_}F;0FW068MvVZvcJ>@QuKq415#tvA{P2 zKNR>D;D-U<3jA`YKW)Gd2l*|)j{v?M_|t&z0RD8~JAsb_ejo57f!E}E))CaE&j3CO z_))+|1Aiv)F~E-oJ{I_AfsX_JEZ`xu{Pp!O5B%kUzdZ1l2mbQFUmp0&1AlqoFAw~G z)&t)jbMnvjYrcxIFYW!*-TgHC;+9~q18w$eUWyX4oClKscTYcU?|~7Y(Z?~TXiT23 zWA5F#?ZANp^&GQt_THVF4a}ZP_U_zh;KMjxXW&SVR~fiB$IA_TILC_&%pM~4?wn`f zD2`nQ?!)nP1NY@P-M~k3Y%}mt91k^cKaTqwm_54h-5FuvV>sUPo1Wijj<*@OKgXL5 zd@RQs4SXEO>kNE6$Eyr{0>{e@d?Lq-3_O72c?OQ**k#~>98Wj!Adb@wJeXsffluOi zsDX!Y+~2?_a~xsdQ#jtUU(bIm$J-1%l;h0?9>(!T1E0$AIs*^qc$I-iaJ<~Wr*XW< zz^8LO&%kjUy9_*%@HCG1{H*8S!SOZ& zPv>~EfoE{M(ZIPJuQPBS$EyrHljG$EzJTLJ2A;+7JOk%*>@x6$98Wj!MI5Ia_+pN2 z2EK&jp$4AKaeo6}%5j8&ogDA^NzZ=)$J-3-;&`)x3pw6s;3AIK8Mv6^RR(r*yxhPg z94|6(DaZ2+%sQaGJ6#6$a6H|>b2v^n@LY~<1}^7#sDUdu?r-2qjw1~0<#^9NJ^wzA zw;6aI$D0l8=Xj%m101h2aFF9w2Cm|Gxq;_%yvV={IG$(VYK~n7uHksPfiL4Y-N2V~ zY%}l`91k_{LXP_z_)3l=415*Gdw$gOU(4|}125uuvw^SXc%y-@;dq^aujP1^ffsYU z+`!jyyvV?R=Xjoh>o|59cnQbT4SYSv=>}fPvCY6Ya6Ht&%Q)_D;2SxPFz`(r@A*N` ze?7% z;dsw?dj6X@-e%x+9B(%8qa1HE@M9dWGw|aauQKp@j+Yzw362*T_(_iE8Mv8amw}(+ zc)Ed~<~ZHJ&v0xr@Ut8bHSh+G`y2QkRxJ$EytdKF7-q{2z`N8TbQ^=NWhl z$1VeZ$nkUo|Ci%*1AoM^&A=aXJk-EjIqq-ZPdJV+@TVN_*`w#bo#Sl=-p27}1OJcX zjRyXV<8=o9oa0pn-p=uI1AoEsA_MQ>c%FefICdF$C&$wb{3XZf2HwT7&A?xAJk-Fu zIqq-ZuQ`q|@HZUq>D2Sz$?-M=@8Ni}f%kH}(ZJtwyw1SialFdF-*dd&z&~)j$iP2x zJkP-UICdHMCyu8Z_-BsO4g3qoHUt04@lXTr=eWOtf8#j9zy~{|06Y z@$~#}V735H&;JHyFJkW9xz51s1U#ZSurZax2O0h{t~ zV772gL0x<6pv8w z5Cxy0;C>43t>FDidfzK}w}Q7Tc&mcnSFoC&P0IBR3SO_^wF+LX;JXyOLcz-vyjZ~t z6fiSY-mT#63Rdgy z`^xn<6}(BoYI|6(Twkl;)e62#!7CKJOu>s4yimba3a(JFTfwsxJX66r3eHsUcm*db zc(j5?D0qm1Pf&0_1@~6)ekHzrui)JZ-mc)S3VvU~Zz_0`f;T95y@J;&c(sD>Qt%1| zFH`Vh1us-^m4Yi2>{jq>1g$k}xaD{^13ZAXtnF`KPaHfLCD>zxfqZK?t!9x^$f`a=gxVM7$ z|6M761@Bhyb_H)$@cRmWQ^A`Qyg|Y16}(o#s}+2gf>$VbnSvK9c%g!;6kMTTw}NLY zc&37L6r8Ex@d{2>@Mr~(Q1B21pP=A=3hu4o{nshwui)JZ-mc)S3VvU~Zz_0`f;T95 zy@J;&c(sD>Qt%1|FH`Vh1us-^m4Yi2>{jq>1$f}E(Nbp@G=E2R`5avS1Gtc z!EOc5R`5&(=O{Q+!Q&O2tl-fK9--hN3O+%>{S@3=!TYaO%3r~|6}(-+TNV7ig5Ol| zCIxR$@OlNWRq$#B-=*Lc3SOq*#R^`i;3@@IDA=vw*$SSi;2Z^KDtNqtlNCH#!6Otr zM8`AjOZMBBUKMR$d?0v~eQ8y!edKQ)r_)XV`;u>-i=%na**gak%3gBdIhy3sI*t;T zI`U|-AZzKl!|m666JsCuX|S(-S#bC<9cz!%G`h1RnJ(LxP8=Rk>0`(o)8QtW>?J!ocGH}E_L3hvHqqV;rgtmH2Rf2zt}>hOX#V+Q z$7;IHH?cssTc z$pBkz?8uW>*wQEWFT29l0XxoSSC)L*@eWPbGoQS+OZeyohAFk^j%Lmr=xCx(CecWr zyB?))*~{)9Uf+v!98P)K8K5F&&h=2bJLeN%vR9C-09;jtROObcW^?>w$9kUcZ#ve} z=g!Go(Kj6p42))qsNTeO%~qoV^hu*?G56bIn zEUxFt>o>^jdJw*L9tCP@;$L(mkOcGW97UqgkcgHNb|yisYsvPG@f}oT(X44F(l-{l zN6{y1uGj43LLGy-x@U*SQ+L7|#1RK>9nM~`voF1NI9umoHRD+OvS)|0MK2MZm;831 zjj3#>4LUNN_v!1dMpk;S@1SpY+m~)g-Fo0a#|A?5J)V7EC%#9q@2lxMQ*jsn+|jW@ zTuWoumWc0h?E8KmR6gyf;_Z7!M}@r4&19BsX#0d@E)?>uAJg|`ELY1mtYmz;kf~+g zs~Ep@1K01N@3k8mNWB(3xtaGj8{7YX)V&LQRmIi!pFjdZ(H#^ptyrTTHBnJ$r6vNB zNCNxR6HO~<6i`|av0lJ>f_Q`INea8$qqJ44t!-`9r}nDt;{_2hAwa-e5xk&y!7Fo& zLKL}(V&3m>_C6;kf%bi#_x-&8|L5UD&YnHjHEY(aS+mxf*(^0p4-j<&wEm<5=4Th= z<}^I{(B9b=r?V+wF16X3mCb3AqX*3tD`EKuwn-zf9u2}B3jc|4Y6x7Z;mNfs)g6Wn zL|GUVFbCSoH|?Fxq_ZhtHggk8!;>A#<}?nX>g-};!T zwlS7lKB*V;Q)N3*5#eBVydMmj;h9GM>k9i%TI3gsv_j;s2=Z9u?+ON}LY00*xZ%kV zU9#(@u`oCr7UVeKT9Y&qMSFkME777(8CZ)8 z&GSDE%FR*r-&OSpAAU|}Eo(2LT>hK3(`BX)Ox(zy#0p&08||vs^dr9g!JyAKsKUKv zpjBG+=+1${nw5bjkg@%x8TNcd<%C%B=mfigiEeV}Wpgcpb!H=wul>=p>2S<@$3@6I zOrz!J|Cmu|D9edoPq-H_5_THvw3_(&KOwh$*RgEg*QMX(6~g=Sbbfh3@&3c~`#r(? zsX_ku9MX;n!)Fm*^24CbV{~{#V#2DNTqLtYDK6mr(Z3^uxt<=TX28^f)RzD>NS#Dg zR$e-v96{o03IvINqY}HGwBHdVJ(5XUPYvc6)p}W`)}5E63+Ag}fl^P;qn##qrPtZ*cn)a+nP9iR^{)iYLy50+fz5HD&^XE;BaAHL< zrJxvFq)tWr5iLNJsYpeBm}73(JNNg3+<&Ixp1IH3JNM)ucar|}%zeb(x$g*a|6w1H zYaPwyRfn@%s6?U8UOGLGQRURa{YOg>83|_ z&$+3ut@78ml5??gPD)pK^gc7*hCwgsRtLs)5svDMH-D+js(ajK3$geK9%T4~vGrIWI z_b%?vuU;c}HorO&aGJmoa`;`4Zu!-mFf4wxU)W|3esw9u1E%xI zMPTMx$RUeg9i2)2GgVoB^(S%!%%O-HgQ8!N&HR*vG{4HvBps!sIjXgbUyY}wpx{KM z)+zOL7(!6(tC`fzg6LGGcJZrenVJUxkr|@YE`D{<^mNT5RrV{!Ig4MNl<7?k`OGGz z?wel?9o1%s(LAe-zdw2pt+L)sfvi59eLzm?eu`TEE?C>|*buqN{9o!(zAHWmTz^I5 zc5B?Z$vM1%ami^7pX9&N<{$AxJx~gG9d65(F>cGQ-fr$H_l2+G1F2wWSV2MOrWv-K zba}1W4WlPgHmCmhiEd)_@5u>h?@N0(`b=OmYhGn>o-TCe4<%pj6v}4WSNYV{B&Oj> zjNUL!l@0dC7ba^vy>knjn&%xtk${0)M&04Gj3;`2Dm9dTFPf3X->rth^>&8){Q|QQ zIaDhm*g`a%;(E)`35Y1cciwlmIrFM3lxEyybph!s zm2NW=QL8`)v8$W`WOHWa=eOnpbajq8!IRdiX|;OTBnc|c;S~UgNOyLv>sK&RW9!%iXGVsSAPIx+v)=+2Is3OSg&-s9 zmx9=+x4y=E+VyJ+-16t+M!RL=uD6=f(em~6=eVe%%b%~`Nba1P z@)zP~yG?82gI&K;Ic=VJL5(-?MWs_wVbt4CW1Uf3&t@B9<$w6EnWjBS;?kmA5u>_Y zY3G5e{8qOrA5oQ2znVFGb|DJj_>gE@wMLURYI54|24i&zrKl=WV)`)cMt7n*m_Mee`I_UUD^Ud*g_YB!BR1}hE7VTV*~$wl zFKlH#Oha|@l{RV1UxPibOxESP)3z~TT`!LE?bonR5oiwW*LWr>ai930>9!X5M5i+# zCU~mR>L9ZVnz^irP0e!;DsP>4U|0P=p#Eh7S^KT`#g->h+WhL3K%I$mx{c9a&_b z_eJip&%apZu~YhRq}jeNjjZLFg?PY6T=Eb5^#w5Bj_psnss!YW*d2s>IGmp!y3dgWY=~4^(-n zsMk!V+UOJ&1^e4LieG>9z;t(x54&@(o>ZJxTs|`yi)2$1C=R-GFH^>R15jvWJdH@+ z&>lC_$WMYs&VW)y^Mx`0=m$ZGaHi?fs!^uw$R6!Xqn-L;S|q-#2)ptu#!kV%dn(+v@peIU z28=J@uZX`A{>sGWPkd6NzhE|G>tY6)Tib#~{G#6)vueR@ z3X!XUCu?RGGYjuKu*{t`(SNFz9AdHg=EWCCaE zTHzOh@LGje5^i|Hb|ikPzdvBCnRiUEt}Sh^Eg;9iX;9GLSWuQD2ms2PH2;9AxXD&` zU0JwSz$V5LV$YP?6kzEW5>^<3N*}t2NMdn(`NHH5gj9yY!X!6JRM_k%6 z!W@6A#TpuYDn?cq)Zk-mG5;9DW6!H3|ctEYoGBTAqwAwJca&L0I%OZ8# zoD0^fMx|CLmHaJsD@w#LvfW6I4KtjQmTk^}36X)$s*RhRgNH=Suip|6DI|*D-e6=% zgdf}BdCRvs=ba7kFHf65DJ70ABye_tb6%@+@K`7*z*uG(bDGYCf3TDZyIE3%<`vxL zfQJ@i)5028D?931pv-h8=50}ba&mHeIi)w-G@&ErO^?(mViTG5>b>QPxrdk=-|2LMN}72SGpqzWr!=r1OIVnl*j?x} z>Z8LC^mQ8VB^P_FqdRF5b!+?_H?h>hl@mY1UmAIlQS$A8;)x zBrSuk^w`Ic!RpN8%w1JlntwNoyF5I0QHs!Xs|uK zH0-H8O-H*wfNIL3O=| zPD$d86KB!t@5dV|^~T6za=RWDhVQXktSv}g0k#-A0rzLjA*oeRL`bna%^Ji$At&`N z?VDdclbO|mr9F`rE02cTr^BUL;p(jL5n18US>as5!TJ))OX9~Hof5OHO5E=R*yk(T zoXN=dikKWJ6aOV*a%6}iCPb<%m#l?p;+_JZTuXFeEON3QuwY^~z;P!;3Y-$yXkk1O z<8^YR$SHZoS=GGBS+!2-dE*o^s|Xl&+_*PU3u9l zd7AxQ(EpdKA{~G^S?dmqfx^=xpYdBITohgw83h!t^QSf8BmSmGT5*bmQvAh)77GLy26XK1TG;TH(SBCJJq6D)q8 zAzwRxppdw?Z7Qqgd0;7gE8uN4f9$eYq>dr}Ia^yHA>cgkL;fZ(d^Wz0eq8V@`5c~o zc#h9&?V<-MCMesNzq9fvMuzjwBv8ldS$LKjI+LHe7BdUlbWUt$@o#p%lmF`9VM{0r zW}tz|=)Z*D%5#?-$^-~E_lW$F+fmI+1A>s8_-Ll<552$kfbQGOI;)j8H#{%4f^NaD zFfsqW5>42eruUr2wY{mZ0cin4)gpzRW%0;ZvD&Xo(q`lF&GjlelIC8xjUC3f{>f`{ z&}zbVm+g8h$;B>dcU!pcrm%#cL9b$qGw%@_Me7nh9$g6%WXtEhNV+vsdU5$J@0RI5 z%yTuhJlwOEtJUaldd6O**o8e~XDRkaJ!3Cb?Bt%YGZj0oXY56a9o94U2a5fA&)BJo z&D&?}mQ_7)aiQ{VAU5hx%!!syEN~j%5SvR@Mcm;VrFp5yZ1)js;*qLw&tDb62su3x z(`$*ck5P!tW>w@gg$fiJ?Rt5UP|i)}VW%xT;Dm>?w&mSq^=l|H{92JBEQRg6>-x3* zos(8e!x8gq2l8OXoKRb|a6)9X0#Nq}6~(-rwvYzre9Jj0f764xIdhJ)Ra8-Q&f&y8 ztGK~7&Lz%Sa0*>Y%h9aB6%d)0cDrqKy_A(*mT7CKID%ai?up8)k{2J@u|xQwe{1P(=(X@T>@=t0R$1^3v}M_H-wJF ziBF>Xas6`(yX|sT+ejSgN|(DW zyYnTAdWRsg+@gEXwdpC2B_Grdyn6UX>Cp--nM-DGpk#Z$z-|E=&qxlLqyaBLZo<0S z@^1d{b<2v$6Z7EHZtjN4#|3R{+Ux?qqQA)B3`O>gO^ZoyW-WD67RIEyd|G-s(wUZS z?SgLmU%1U8w~4eSIO+?Ee| zncG!LX?}fKU^4WxG7TitJH5<3s(}5uKX-!j;M_WQ8uMW~Wa8-#KVZpGVx?bivO(|T4g6gccre}4% z%mxH%*PqBn^~q*3`lr*_>2>a%^sd6T_n6IqVj=mYG%wwt>1FQfN|i3AN9uLyR3u7K zDid*_bpWkD)ty#5!JSr7mqwUMOLhlG#jZcQke#Opev*)97536$r_P5`%tTbt8U2`S zHhx8&wPV=%W8Wua-YX}#{+t4|?{1>4Aj*V5nwfPVf9Dih4FI7F5MgG`80HK(YnSVf zEA!9Ea|WD?dhJ5gYZsR&SDTD1l~Tr6h(>LwR(pVgjzq=4TuLCK&j;>v+$anOO5ZO_ zLJsUv%zsg@I4^T*vvHmheOpUawmvuo2e)J#7bTLf%7r<@X+&uIw57`3t(MHeEU3BgN3-^~Z?)cB#glroX8eYHaDot?{Wrb-If!1&fA{Xk$~2e|?)<+7@r= za1*l%a_b*wkXdanEVLd{hq!)U7;qsB_-q&bt4prqbL(#lq6>(=emv1*mK9O8naO@B zRZsoeXC)8#B+35!7`2%kal67Bxi)ng#mweqU7FdA zOyaBo2;{-2x3lt`sQ0q0J$obx!f6v9xvH&DVgnMxWilUNImu$(Rgp4Dg*4@Quf@C_ zA_+OP4PO^HQ=3`5uu_@6&9o22Rl@fTed`H z{~DIPzgyY9Dr;H0+{?F`oowIqyft0+1if7umc67~*=NWbXeffRPlRR97B(4r*7&V3 za5e!0s_t~HU{MlQRIG{;U-WjGz61a*PGG^>rshyd1`C&jHRe)dObZM(sz-gyTTcX- zc!g(I;c`KwRUyPgX;{8xS%8UgdFsu*VcB1GE4$~*?wI(PcjazMmsR7@#H#+bBNv8s zoNJ$g%=YHwP628Kr>*M6SLQ#$YEGjXmjy^j0U={2n<2LOtsw@#GS`PW2P$WfX{y<| zM8zPNE-4150O2;V!tIh{TFq%oy9o6vRuWOCObb_sVb^O-U6%>3OkJA^x2EQ0!YflZ zWWuef8#CdRsfJ9rH6@LXSn@O zlPi>$Fq*!fmW1FmY_ql@3k71&X<75BnvIL|=mOmy_dtKA=~ejb1BFi0+ia(Z)+KX^ zO}UNDPGbi#uHPFrQGYuAA<4g1Fk&pXdc+TamsAv>=CQAj=O~E{B>rZ|I5WItr6Q8Q z9>zm1XiW+@k2amIXz$Hcwp6b3*zKz9hqx=;ek=hV5grShj^Ve;Z_n!*>Xo>oBTsfNT+`tOv+}am>#Jop}C;&rh+Tq-? z9d6(zzRGtN9Iot%Rkcw+uaDO>kSw;A`&7iYMY1Zxd)2x1Ya}g3Xi^2a&Mo^{WG7X5 zP~!?kBwA`+KQGs7QoOD4RHD08)yui{Z-B9wwMtb<7n_0VXUYszHU7zc)b$ZacH@#K zZ)d7^22g3KY(`+2NlcaZsb2r-CU1DCt!X+jVs?S5)b*aUpiO(81-|*lr@P)i zozkY+FJ8R>V|c<*t(gXJ52*ZZ)(9;s*C>ORNh%zlse%H`yTcCEK|ee>#Q9H zouuBUpzMJby@86z?@QV~IYa6y+e`&Bu+MM=5mf?Q!a&GD+<-rXP<=|Pt{<&UokF=9 ze@<=cbz*Gb5@MDOv7l^){=^1(!PwCx8dcC-{RpL(P5*xU`^86$E|zltrQhV{v{e+H zIWZQiTs&2y>>>Xr4|pTd%_e}#>Y|8=A z4`56Q%>^srs?@3Q$aMJInQ&WbOjh{#On7DL6vA06l9jj9Yf+82BGCEW_|ctA=9oXL z!1ZSpx;{oL-mOPXAUGrVA^q6}Jahc5F|v?M($EEG;HJjPKXw}DfgeswYEs#G6Jj{5W5XmVU&XnyZN z#^FNH2p65I)?($`>wgyWE(Pmj@qj}$&wjnkEgxGEM_w9RVf}zytWO=ZDl3$19-2+8 zH`|1B7!fBJ{$gzdX8U5Il8uqMWRlfoHczsO^{iHWv*Nv_){s);eWmzaa3k2Rv<7|u zA+|D$pjKEaUK-g&s{(Tge#Hc49sRAlWz7m4dSr32dH{jub@C=4#p{%^$%f&8fi02f zT*0}4Xs7f(3z{|20Fs`I!sk8qiHRnB7s%$XNMg(mAX&2{p9+8u@61yKi}$bvG8>jG zKrAyiZ!&{%1!UiHU6IrH{s7yRy94YbuSSP>u65n})ERI%eZ;Uyn*?sQKoP*tNzfc* z&~Oh^m8(G7DgyI}ITx?K@fDVG2AqX=-*~${&9~cAEIe^avZNj;_fYoYi+N>F)nlLP zCdL*{)lioOL;LY30vJ1?4B2Z8${n+P}u zZO9&|l^Q5wF8=oe^&%x1sJEHv)(j_ZxUYdKVW1=e_^jEFHb$(NXL=lZzsjY6L*C|I;%BwO&>}^E zw>pwVgdNUcQk+swHM8DW4Iqbcwi>Ix6UVUpT>Qbj0U?kSqw-oxo5TKQXF6(kJJZ43 zi1Y76f=SPGh~-~QsOkU-#O3lxE+0h9-I zWD`!S2#1*Y|DJFrP#1(#PNO26JJsgC2q&E3@_=JV_S+(enc}=_Ztng#crTU`1ikJ% z#wdpIF4oK>C%ae8?QrJTnVEJLli8g4mtcO6|C9p`TcN2PHaqE&F`g=TKh6j^ZV||RQqy)=J#!p+4kie&F=<+>G{p;LLnl{ zTK^CTsv=(a5~WFU4RUEHWtLAu%fMplhdg`RNa66;Vl ziuKZ5{dcYND{^Ba@3WKFX_|;!q#3@+GMBSic^V^kDvWw^m<5K(US=n^vNb5l3mk2f zb(ejA*jA=YyA)YQq+T|N9h5nPueZLnRH(gRjx#vzoEw+h?)7rpy*tuCid%j*emRe^ zoLae-{BAN2#q*~8STX|FVISisE`uvoVl?Pq2>}+Ax6Cgn?{Jc5QAm@OKUw@g#;m_u zyk!`m5XS0!+!pI3bpZxq9HlVr54cR`>I*O?Pg!k^`RB=pip`FB`_B>$F;iDy5ym`$ z?f(QrX|tLHwPHmPvYgP&TQgay(9)rLfkx`Ml`ftea#k5J=(gOzd{E{6C0H$?ur$*E zk-C8$DDcyL*j{!KN(%Yb_ohpb*hDt{>&Dpb3q=>?2D&Nd=AgT2)ij+3xC_|J(J_7n ztZ1sj=5CDChR>hNd75HLXV1)2K?_LrUP~^$?*fFE885!;!W2iIiub zFms-X-T6-Aeo(%*Jn>Fn`}R7N^2c4Qdhsc8^wRvwiGMGgi`LQWhiFnX_XXZwj$ZvU z^RI`$S4aKFxCg}xnmV1Pk6=51A4rB)lev|pMfd zV3+H*2gw7om41yq5yRPt^gg6o`;h8lwjqb%X<)Y@J=(1tiNov1jP7j~8`%Hc8Z2uR zo2b!eTL6v-Aan$?S{|G54~xM0NIsQ!+1G1R@GA7X%fI?`@Rl zsLayH1_Jo@+#I$Qc1YI8{>h>Os>r5ey7f#2ifc04X5zexLzp1E^Yq9kY z5Ns8N1g7GJ+2S0GNrTxiQ*~!8Sp6X^Dma;FO^;x`QYQTq&CVt)pen*=El*T0MfSW$ zxAjVO1mixJkUKK)6=UenhRL};D}j$EXaXjj>t@W*TJ+Iv)2r#a^QdK)jLdR&bZ(06 zw#C%dd=~`r98|?qxPJ)fc;Al>`wj4Ko~KXd=X+DV#7y3u65Na~SnUjy_s(n1z*n8Y zt|=+8`W42If>XKBP2X?x4o)@l0B4%7id zv_V0W@@*s*VKVi1V%x@3MtFSKZb!{E_mXqlr&6n+59zjSeq%dHD|V@HdOc>iRtu9^ z!*xCH^czYDMvI{nJ*LS~1GZN0Z~zt6zYJxCR3_?@3ICT?b5up<9&(2&y#B+~wV8D9 zE6Hn9W8SBxfaN~*wH;P31bwl=A+x5)E6P%qnJ4nVRZ{9Jq=8UB6(WOuo4NA$RP!7? z4)kj*b}ByGT!PG=x{vCu&nIG@I?@sJgLR^d(`nDHe`Wy~-OKs&AK2W`@O*Kl9)n() z#iP6P=kLgncK*CS2p5~!AD{~)%L#C*)U6O-2zPo%A(gmfa}=YX`7?UQc&C9fU;T$& zZE9g^U9PgM6}^Z^Z0eiXMffHmE6v4&MG!773t_sNeXN1qxVZXlwlN4IwO@h7v?!Pw z3c#U%5I(EBXh}Y+U+O8J)qi~6)gSt}NPP?jK)o;xdLPSxh?4G9BUdQq9W-y+TYXvFZL5rWOyY!A?K!G%hFY6nW&G@qRq~31<4MZ&h%kFTRQbp1kY7P0IJX(v?iIB2~ zH+RjCY`P660kO;Q-fVXN)=D9_*)=+iIr#I^h=gGR_l1(gZFX_6 z9^O4b99;r<= zt8h5+1;i^f1kQxaR5KM3?jRhFO6nR^*yiU9b6`GfO&!H{DNxF;NR@|SnJWLu97^XI zo)!N=R(!gw^8Y<6{?}RI0a<0go)zAjmB-17KQ1dgI4j&MEBsMb*=Sa{H+ixY#+B!4 z!UX44!u!(XV1YkcMiGp&2rIfLe+f2A6_5eMED3^x1bJ?vFQ!Ob+>%p@b~NaIr(Q(* zQ-Twi$rD;*?{9;HIoPc~NU z5nrx<(M@tdMGMD+cQfdeB6IzES+Iw>iOX|10v)A(^Y(O+?`70LNu(xIQ@Sh45eldA zPk`knsjhnX$4V^f@@G54AB7M+z94|T0agolcG<`Q)-IHaezYRG^Air>0$1MJsJBiF zX{qZYhg``KVGd{iM3ws()7EfH5Rp=LsDG~Kn z2Kw_1m^J0bS#UYiwgy?fvC)D7>a#=$OlP!&77GI_lZhiovC^+}Fwy!Q9r*wQyC~*g z3F^-)jFoTW2&(Kb2WwJjBGDtx_qgR9^#`|?WaNWHGu>DfKg1nbSpR8&+&Amj;1Q9V zl3_185`Bu(xJI4y2B(KC%8)S%Z`R+_{!+BOx&A;m@iDf(%cOc?05H<%ghp{q@`@ri zS(_X621osK3U=HS(npPdMG+B&(d6Wp@N#{l{_ytm!gbR1s*!0{LKyt1F6bvd%pP|J ze?Wg(q@w;c(Fiq*0K6^c&R+tj@@w$PU%yrW1mt08ypP6gqV^4ishgSGwzT-bStrsf zOHXe)P3uSrj#a=mZ@-I|KUwCKJqGnh2=!U=o0h#x$lLzA>fxQKD=1*j|5chPtW4bt z4+|K?%2ab!_;$jeKky9Z8d&xpqez{+T z^y@lR9Y_PK$liHR5n1VPhPwVwEK9__QRSGWBCm+do7J=#Cu$bZv5 zvb)X@2nTk2_v&v?eDvt=f1&?-ivLaf{~zH0=zrJ#|F*yX-Tq4f*lj%XhyHKc??yks z)9ron-s4%HU0=`qJ>RWINq2Z|?@>PLt@R6|evVg|MV#6PS#Hwp#%X_^4qsRO2d%XXw$NNn^-hb5N{RchXzt{C%EO<`u@&3)syNvwX zEEDxl)RE^w+JLS{QeTFqf@Nc?=|kSIzhbYG@DV^N1?s#%(n)CG`hnum?F^@7X%Sb`fTTKt1tueWDeyoDj4*S+(f zLw>S%&)h(zcKr9wf6RZg{vE8*|GNIOtqTmWo9D>~5YS*YKDyHXw$Jp5_D1Ax{Z~FU zh|{$_lgN5k%klIzam?S9Um_d!4#!3FAzl8Z^thUFw*3B9|HUS+N7-tIE*#Wg{%bvz zFAc+~TM)~>&fxlG%9Q$&n!2RlfW8CL>B_%4EB~|m%J1hNHl&MQzINN*^s?vB?)0+# z=h^gf^{>0p3m`s6{xtoqA#XQ)lm6Ep_1)jCzGHjT=k4^rnfg@K1oD%&(|Popso_M} zcU=WyZ-%zC`4hmGfOr6xWIkU680EDE@nYKiK5Ygrx`TMq+9rZuS5&4c4$<%%{jkU>V(^~s|?ban3<{O z`lp%=lyv>e8S_J3wpB;VS#5=lgHq^eKU^-LIUVzZ?zDOH#v*WA5=tKvgd@X_U9Q64 z4>UN9x2gXlM?d*Bu3Ns2KqE8~|B-f1__z%~P2gvD?wne49(cDi z!l=Lazm-gqE)8eF6=u&J0yY16OL2qxQaf@vcO@RCfq)@h%x3L$!W{@k?O+f0*gTjNzhxa+biCHSOb4W zWE`J+adLP1R~Ltbn0P)n_0i4Q9S+)OOvCzJzZdQpYT{Tm@z$;C`SPw-)Wo%#&KZ=k z1x_A4Z3dT}zM4h9`5zDBenC~c=j@n&Fp4CEMSXn zrmHt5@e`4wO{{+xsO+2{0u2_K)#9N34a7)*D~8g|?Z2>5MT*jWXC=Czd8` zC#5Llnl`Q&U1j$0hC*iNRkGQ?MANhl<+#0j$NVy@Xp!4})ITZeai8-0?T?#SGL8tf+hw7 zi}|wwv$Ekdff>zRC8fc1Xv}gPUIgd_3up{tkM7(aEq^i2`5{zbC!orJJ=f$|T9ndu zq&Q}HPh3%!CL%q4;_A@K+i+t5xQ?#O6^`hG7#<96RK#rdH9Di1SKw)t*#IoMv2G{r z)<0l%Cn#Y+AVs6Pa1Z#cs_Q_8DaLV%4^fqnP7oz^jqUKc=??F!y{p6aGAwomEvlqi z-7b7psOgdD?7(TNKh321BWCL0p1YUhque&IE7h4%S>=2OK)UGMjzund1XPo2;;UWn z2Jw zHQsB|Pn2#+Y#vjsBayrMxbl^MQk#kBG7A-SQj_f8>TTdeVjmrK&3&1Z3iGPM_VLbf z8bvpi2}7+PR&g22`gb((6`9ydobf()*Kdj*bx_pr7eCkSw>s*vgl@^LZ?%h@_bRF4 z*84NUJJ-2KP0Zmuejb*Ys^uAn<%T*c)U%-mCC5O- z@qO(rp)H$qTEJb>Oa=U#&z*%%<3VU_p;K!MbDiq7 z?pz-`>Kk?lqfXU&w5w9m7FJr-X6Y6YSgdrNrKW(CW>nhx+6Rd*azHq-YfO9`#&gj~ zJnFT?yyZ3Y-*+G^@73sf?)0w7iS~QJ63Zd6BVJ%uM4f8x0Xih{#hCghrD7evky`4P z=-??jei7Sa()1UCz9MwhadZsmap6(1(jBH5!AK0RuqJnFjdwz%MmB*cSqq6Q5@lFV zs!A2^K@}PNy2*L8l=_^B3rYe+*>2fOaXISvv+v?RKgWY2pTcUTe@?0&xx;ysp1q2ftwHCq0X zv*71caAtB~DI^k2o<1h(L^-X#t4}m}aw~Uf5*#Bt1p?_O5aX%Q+~t*tcg93Zp|@AA z;n4226|v-*yI>dIhDv*wA^Mbvm46Mf(huBHXhc|HP=gVDUd&53o;0vF2 z@dZU%zR(f!1r+)HoW@Bqv32o=r!*i%v0Q_meT?fwfpmADn&inZx_7xPAD+szN^BZ~ zQv^3<0%oGEBAVDz01vAv|G;U~4V_IJou;#RGWlbr??8?PNc(DgnQ)KfWpQloYqW+5 z-Q`#iAM|(y9dq04jIN?@>rJ#@AHSM4xu&oOEN*hh3n47x7O~{O!T@vYG#MB6S9e5H zurTgAoG8L6%i>#E>>wPd@8`jM%9-`cqt4iuEZ;bvsH}|TYqR-=&aGJ63tJAe$F4;6 zm@RjJ5u|jtv?EsjLC85EN$xk5r}!f`iPU+i^fsK49Cb>K*!P>jI(%J?*HYuX6Hu=A zLc0^JKZ%yyXd;yxKc&Y1rpV1dM7;cnRc^oKmR0m+Ho+?3)O{15kHJEbSPrXT)?sQ% z<<_r(9+|ruMpwfKb$$-VJNciww5#QF7+~tuSh9aXW#Vm!ZjFYrB^=72}qkjKLv|lr*i5}G_cEqazYih<;Bi6JenpgpAQbqNT;UUA}#*bB3 z{lnI*RE1rrg!vOcD5jJ6-p(k4$eXWorn^V4a(k}`YG zQDOUtJ}F%WlHtddk-!oWLeGOhSHAAWE1qU(>RRvMf;vhK?S}5$UgWK zi;E^FL>w+3fjQM86{8e^1wfx)VAg(6=^i`)@pFrLTha{dz#n>Rp95flA304DJ#~J+ zaLLzfR!$_LWcWw;t*-`X!cD?beFUSzfXnJG-SVyVGhILbZEE4LA(}z+!2;#H&L&M! zMy>%!-xXZ1rQB|_1GdbztO~IFq5V`oSyPm{7R;sPC+ATl(S=lynm{c6ear&KjQc$% z(wil>pv^F4db=weU!(>pk&)_$L@HNR4Jpb=>5Q>Cc%DESy_9cunLjjT{4d)33FAn8 z?RHMnUE87HGiQ!@14Do`8yDHG+YSX^2U}qiwwf3TU9&0FkLb2e-4I;a^6}x?7@Td@ z>Djl~u<8wO-nr3n-%Nbb&-pR>pPa-O)0`jU6_#`37n@D-HSr+potr(ASeeHfzQ23p=fC}N zZqC&!_0g9 z-Ofa+*TTHPl{fAZkXJ8DjvWRL=AiD&-`Sh%`Zp%erpUlTiWMz9CwC#ca}!qk7J;eVUv+jq$!e67 z>QD%@=UBP%Nd$nL)a%5Vjn`#N?wRj>jvPG&NJR)c%oD%WEZSIeYw;wcGv?m zO7|-;tX%vRW3H_VN0Jym?y1C;^Q&O|xP(nF!2tfv4&bMO{a{&o@Y{!XQ5=Ig=5z=8 z(75w5|BgF(85g{CZrYyj{1}SQP{9Y@u0&fmDp;ngIyhVF;xP3T2y}hdX!Kzq5J08( z9O8t?Kpy-tKR-^#qmQ?4FPVJn^6e$eNAZ$38G2OEYoj~g7P%$f`4XA7msaxRz@OlAker*J)v*t52uQlhpJ^;v&t>e;S2DI5)JkZZ zCZ};(0Mujeug=iR+&=b$U|sKhQ%^$|fp~JaJ^b8$`%{*3{-JnFIS+_(es@ip%dE_z zoTG9@IpV)J{#v|ctLX=Dne|iL2z%uCGHHm>yY#gmWr)}P>kl#>Y4 z=u-?R+BgRL7H-dz8RBdcs5ulty#04Q+PB*29{dWRaFKyKjvReq4wuc;r!{&wUh%Do zb9iOz#K+F;>nXarFZ1@b?xR)@Kr0F-F;Y3^x;eDJDbv2WRPW2X-Y4n(-psrBe_u21 zZieZ4#>$MEyAS@G*6{_G)3A`@$DOs1mgvI+({)W4J5%|fS;t4N-a#QNU^^ zr2ZpZEEJnvfMkz5yrYS~UqX|HU9BWYI!c}919B)-EL=E^f6&12iiED$g}gHG(k#$s zky$KhMh$OKeZRD|r{De}fkFFtm1i06lWWeiT8MO%IZgrqn|#(U_7}Dpa}Kx>$`K&a z%PwBuhQ@S5 zs`y$GeHU2L6v#0L0T*E9vHfXUS3g(+$x~OWqp+H{5U|WAtn-pqdJW(46z9Zp%ss*+ z_Lk&K6v?A^@9EDiNwcr{!6jErA3oeg$Xzmv09x9Q2m-D8zUWSKFI+?IJi`PKtlYl! z2H@7e+n&n6aJXRD+_hMQ>(h?$!+OQ#V#0Xq+t;aM=V$f{YNPu|7k3-xqTy_+-V^gY zh(fXmvf&TZ)X*~9acxq3>8QCb9f2LQ23Lj&(BBJ%-qy;_m$JWG8zVN*d%B5H5xb^t zHm8Kx?vfgvCSM3ltSGMXOd9E}*%kGsjJWBqex&D4bCs5Rd zOqRVK_LYFXZ|H7cDF%fZ`-=8ZVrqbfw;4WI9}= z&=17?@4#VP6U$xWj{Hu?oIdVIw_^_Gk5y(AOq07$qarbX(6>K_hb5M4yM%m#m3dLj zTce$9o0$ea+g}R!tG<~Nd{4xFNa`hXhb3Yeog|pGm~UHRPS?6=S9YzIr)T)NoxjMR zcK^tFyu)d{pP2*bz>U>5>b+#js6E&+#$8MY!DjI&nvn84+$_e=?Aj{dq)c$zzUKujRs5d2tZQ5Z)IqeU?1P>d< z_N;*R()>K=PZxe(VXC}j=7_lM4IElXjQW$o`SP86W2bBWsy;j0WD<2z@WQ|1hj*oG zZSoJben_TRM2uONdwcL{z)T9J5-W!x)LO%V*#zkjjRm!S1H9dUXYu$=_Q|KJ4;GS8 z&*ET^dJ!@gJq38{?*EhCE%+DG%1JK9)(bN9Nc~xKem=(>BfIv<_9rboDmOC! z+U@;WUP2fOfT2O-)DsTwnG+oHAMkrCGXMaa1%M4nUoMQT2tG;|$Q%3O7XiPr-(edL z?MX`M)=L@Xdt9ux}$0{m$>!J1y(1-iPuAsZ~t+Y5W zVtz)t>#LY}cR7BazhEb8gy1qiPPM^yqRD4KK_U&D~g-!rIcK=apt>OPq!X?)78a@Xn z&wAOq*;<6g?)a5*?CEEQK&(habLG~dNpZF4X`gm=whQJKCYzP$L(BR++p@K+zg$1c z)`1sbja;1MXi!@q@ip)@sJ~T1k=Yg7&!K@Yplkntr-WvG&n>{m|7`lI!?rAP%%-pD zNYLHs>r>W@e@9>6w5!N}kG?jQLtkHGP`c4q7fp7vF5(q%HA9W3R7b3IQ!rUqJB=k$ z&ong$mjY{n-os>F?dGnw^YjDf(KU9e{%3lszCqw|aggB~IU|Ax7TTIq_-qo#owOoy z1rfY}Ax`gy*mTN@jCsiW&Mvpy)PKa4z^AZ<+8#e7id|UxV9I@JUO*z!GN1d2&X~7p z%5%}gWi68WI9{WvyIIqp+D$%_k$Eqx!4!K+T@!zw{sGp7*DGNmss1Lgk#M*-#RUqruM1^!3j`}-0f{)_m&9pe1I!S_Tf zs{Ehed(XGQ_qTtTjqhLq3N)OFkBV{7J97&%mw)2)Y%L2rMVC(p${HejMZ0B>NGAS* z2MGR=KhA+^-O+YcJ4Cxl6E`=9NQg!jl}&>Wd7^hjHB+NnZqQ^wXJ9Yw+iI?06NY}l zN}Y*4s8&WR-TS9yms?CHGZPH61#+71RXs3D8Y^_MOct6J?#|PmKGgZYa6r)oJsM&q`x*mbv!3k@YFB7mQWo#YK-137(MQL0TZ+~1v! zXkQh``N=biQV-j-2KsJcnLDEkKHX3+_^RkaY7&E)-f!Itz*e^&%v+5^Uo&qZk@gG3 zX?~T4s>VBUYyj1G8Z#3?tDWlTLHPFL=toY5DxbFMq^+h-okop|XH1c_ocq~9Hb+po zK=~srr^{}jY*b}$p=^487jTX6ChI_FKernx&qNb_X}cXDOV9G!MUgNJN!)3SaZQQI zhY%H2Ch0`u^t$kn9CSNvK>)v1lP|DLDGy^3x%qci&6r03Yb}xKpDj? ziR6rN^tevPO$6F4<&gn0m(*J^%29Z`QA!!89e_0+1yT4X=H6q%j70~FN>bHsou z{RGJcrc8ay!r-u!FntqHsGkU!CJOd)-H|gpuI_8i5%cyBcC+RUrj130Uu#z76_(g= zvKFQLpbw2|nNBU0-s|2Ql`S6~zVi*oZBOjMnAAaZVh^^YPYB$&Com2u zl8)ic`jNFqnAg^BDCi$^NR-6ioqa^cZYP z>=F0*CMP~mqgOV32Nxr(p|=4QgPdXPR{+xeqPbpcgeOw5u&K^0eqRXnY++-NyY{s-@| z2%%z2MR~WA*?O1Ap(-bJ832kcyJE}Jx$ic^mS4G04YRz2gYjFcsh^x?$#)G6VEw)t zDpJL8ik#G8RQCkjBqw#St=KX^WSCW^AYHc>lj$5MCvKD(Zn-(mu4zcUE` zoN#I|{j1b*=jx)=HJ=MymK`%!NxH~IuXW}Uy}k@G^;&Dr*Xxa>h8n||cTo;Qax?)~*sKjDrF#byZvQl$bXYoo)S%_<37QKQroSs> zr$o@ROWvhtR<=0Ntemfj%eUMma*P~(W+rKv`4dSRfp3Bs)ty504g#nXGlB@mTDm5O zqvE#(y}y*=?F*HfW+$J#11D%i#sL};Uz8lydpf&{XKkjMFjJw4DAQ@YcCp&bekpxN zM=W`DVdcbFau)3IQ+tRFIWesqb-PJG`f!Jze=&{lIc6(1Is^J5uObeON6??)jW0HD zpC<@mW?H%LvvZm=i6aMH0!28D2ivKCJ{AV-ML%X3U>ULG4MpZpNQw52a((KjzM&q8>R*)D&)Q^^ps_>l%EQMM7Iw} zFrSl?;a>2A@u!$?pP1 z;gU+qne(Utbu@WT3G)^!Q?VOlGSlGT2sHt}+N=Fbv)cddaq0F)WZHjsQ&;=P_H6$+ zwg0LRYTJJ-%-g;Fci9O1>-O6zo#}t3{YUIT*#2j=e-i24`Y$&kb6%$XQ})^Zv~KPD zbww#-8FT}M8MKP@c&3hrTWBdd+#<=25B{!i*;UDmr4?(%XPnNmaIm8CJsAi<1J9UR zcJ%ODT1Kq_J~?7)sW{zcGyZxJ*;fkQtiei-s0~wwk|Mo?l8#VVHu<;A%iGkL2Hks& z+<7*4r`ZZt!g{Jy5A8x0w%t**TYqdeB*zgW6XREA;dLsu*_@9S!(4Z+3Tj?oNp$;j z;sPb+BEqTfFnz^AQ0lcG6$Vrzlw{l3@MfAJ9d1shKz92}Gik-9C`?P^uQ!Q*=V`<($ESl#rS_HVssU{p#a( zYCQFqbYKE`_QfBupT&|F7hyxgLa~<{Ca0g~7w2#c7O=B51^0@4(Sl_(1=15(uM*vd z1>zQc!qn1IEuO-bYtYhTSh&u&A_7xuXaT+8z-N)XLXa*|%AszaApHbBmtLXSWEpHm zVX?LT>jI&`4jn$2LspF~&P~B6Bo~Q{`kHTC14+H6eXcYBh4#(#n;77M7VmhyKc>MI z?T3ehqWWkK>cV_wm%6^@HCZmQ+DUJ(mlH24{!U#s5>=7>-?WT?y1kqS8s;C7Q~w=( z(@)oka@|ue4i4ALP^p(bys)ThZ>Ni(%q{eIRrL|XW}_N!Qxr0R@zI>YU-PESb>PnsT1u35Ns2xE;rXqLdd#YgOwaHkrB|)+>b@uGMKIATKc1?rKkxNUND)PM;b`ROb2bJPxy3w;K0&2M(P|e-h5n#vdo0wF<%WbROm;Duml(y& zLREhmy$c;nTBF|kLZqiNt6R;5Q-YcJ7*JYryBqEWRGwQIjQV>Bjre3uwM|JK*E zR*c9~C-KTXl^%6(D}J>3;(I|4g*R`#jIe_~JKC~IcN(AZ%w2n0=cX=zQYXM)(+D}o zoM_t_G#)gd!>UztZ7mE4sIbSe?f$@OI|7%t_n=OV1u$lA6Zr5|6)rP(la`_NE0eY1f?i6Pt~degEpugf5i9IYPaS(#r(6HtKUa+lPs)dW~iFm0<7kepw^p$ zTAyJ`bg%V~J!(CCAGN+=3zwN!;DxC>)BI(udb9h2pf^W`y|FrO^VwOpD+dIPo+uo2 z>&nSJ8kJV2C+60MUHO3;JxX2qO;GD&7NsN1hMu*)X)!D9Q!pMA_EGCWVORRA*5_E6 zHQcGWs(wsReO*xf8fEMT^!y&xZ?}4s?!&#mfMU4+N?LHiRq9N-2K52dP)2vR%`oC9 zb&jzN8ZeO_RsS-(>LR=UwQ#NlVDk%Vq^5_0n%3-v+*j<7bfKXpyD}6$tC&0c+fJ65 ze8IWuOKPnQYCS)wb>v>P-q@qoo$N?@4%s7N?;j*BHJe&3(1!}>cM#qI`iobDpAq-H zoQ+)e;O594)!#`Ka&a-|&F2cj@fbJ>tp!pj^RR{)*Go%)50(hCc>!m12KsbIG?dixHwcde_=@O5TI zOg$Jh@umJbDHaTt+_XHe^9lcftue()fPNq`dMJLm*?8>!s-{P$!k(--3oE+v_ z22I$t40x-#?!{nP-3C_zE~QkS>w3G=Mwb`eCF!r_S|1-b#-Vkcu^fiy0@@O{beG=n zJF&MGFL#$r4F2WXbF#0pqi3esbFzHJk)!Z(4bXKCxyzlOHA~(oiXBgR=h0^JIZZKJ zV4c%+y#lDF?e34;-)C{&yEkZ#ayBfQJgZjL?lQ%r4&qwsF$$6_GvX>8Ld_%cYNgCC z43c!k_55O`e~y{4jkn-yE(+9&8|>GiFOAx=T$t+I`VO*Fl$zYAKi=*By-~ZY*)I)( z#%TGf`jb*mFvc?$+5Bi=T#kTE#UE~J_j2~w;!i~lNge4wqgJ5xkLVY{OOMH1E6-zk zB>esi;HGR>fq5l2sqAnD>~BGI25_zafJw#9fN8_{)M14);HrJ~;uaL}oo!>KVnHag zo~XN`Fp3a70n{Xs6+v)n%zL+{d`tZ|Q~yw3EZuNsj;`}z;l#>)bSJ7$Dm7(y$C-6Q zjz5u)zt5^EJW0?}0Kg5(v>fRS|OV`sn_bmD9}F)8fCrM45{M_(uE zqpyx^C+RMP8>A6*Aq|p%Xkw25RnJ4&rnbJYq56T0w}r;fH*~rBU>jKj0?d%$3w1NTacFJgnp}76^B7 z*F?spc^ro;^6Xb5()F}IigD}Aud$_A0CN)Kpz^f)a9ew*18Zw9Ggnh5Zk)QzXEN+q z183fKf%{`KnIzqNStvKOnsnl-AaRTm@s%yikuyN2d64MfJ?>}^YrW44jX^v$W09!M zY5W9$tZYBf49j{u(Yzxxvle_fPAyJ`k(9q4|GW10pwdjREvCyJU>**0zYaS#e+XY5 zq-g3YaM`se1^hDOBE@wKOG@ogmC5+S$X{wcE*K|qz%o{9V3EDJhZ+|7xAAXZJMeGg z0~YB@ca-ft_1RwDQy*HFj18J-;*mQEZ~}OEr$2TovugjE(#@j!Ho|9X)=etrXWB4+ zF0JsY4pAO>Lvr#VeBr78A>T>njpSn;huE32%Na2FkYe#eXTbDBn1h!c0w;+d!smwA z!r*vyA||c*QHb$^9* z7_nSv9pVku#{X#jucFIXqV;b+DgYO6R&$UQ{szkbiaSSA14z?8^YJd+h5lE04IDIX zi1L~6cAPp!FC7d;Zihc~$qWC({n<>_-u_0Pv0QieH@b;+{onZ;Ew}QX#pi$7pKbOa zaQR23MuxvwdY>?SomEvZQr4@LrHsQmF@Jw|=Z>1>z!z{}j_Rtswdgx_;1ltxt$sVM zNN)Ml@zL_{;jRdnk(}CgM9bI4`{KjCLVniC4R9@l{7w>nr&#X=O#2EimzWvula3BfeJg&VWjWEIO6^b*|@5bp|k}>-d{m z>8?%J^ZP>k(}Vr&-_Q=vSRLh#~a@>FuMWVczvlxF)w8uDK(Ql}W(BVy_l zGnK&9D9bEj1h+W_2cYC)Lz`Sz_hyI!%T>YBYJS{Fj}^y8u~a<>5^Voud8Gcn!m5f%d3nCgHgc@Kdqa^{(7N z>Ly;?)y{w`?<8WAlts>fYaSqM2zM|*%Gf~|4jo-h*!t2v;65Ib?SXFT2F}>e$t zKZ?M%ZcwT&gv)2&W`TSgB7()!Y1)jKV9&I6t%v5&F~r>pW&-)q?63EqXWlcnqQK`_ zj$>@JJcJ$-kw6Eg5r2q_>Y^vspJeUK7@LbC`vq8cN!B#9H)JFSR&cA%qG-$J-t7;; z`dheM+Uy>?*ZLgl2jN-UEW^@wlN+D51J=RCS)gzf_h<7SOP;Wu2ZHie^E22U`aSFC zgphB3P$40CA~IY(b2T_-#n%I3$(llG6ZwSuC-5`>+gv17p5;KyC=W=5~6_edPLh z@y{r(8!cS#(xPbYbJit77RBGIS`8VOqgC^O2QV|3R`?1D1{A0Rj}{Yin*Kvs(Zpv- z>FND>RPOy+AJ4^8;~e8OeT`|Vn+6>h>sZq3Su4mlCp=Mjh7Id!B z_ntx*whJ)HBM}E{@J}UeLkX`!_}$n4|D*YIdUf~tbP$mI7w1#Ke}6u`sI9~QyZQ7! zlxU_hH0k+t+o@Ue=`omDdOlq$#s(ID4j)YGSAx@0kkL1~O&=X;#lfb|P4wp0|1ZN^ ze1}BLDa^&F_#xwaG_E7;d!U#u4Ss)!4`Q(g(p$}4BWW=?`ojZZhKC?T3lbPu`=sDn z-%$22pE4fOqmc~}8-s%xMl)z4b2WSXL8q?Z!DbCTdn+M(LuPf3nRHsZZ`>=jIqJP` zKEF^s+-yGKDT@7Ln1eRe@#8>1`&;SxAYcM6!o8dwv~4*_E$5KBp~4kowdbQzguspU zDTNYggRG2T{uggB{qf@g3C4;}P@|~}Mva=dhAK*mXxJw@)Uhx=>A& z)~b=2QO033tsAY{FV$+XZd4Rd6vGV3T}YflHcon?&mWzL6o-7^Z!53 z@A>6X=6>#a?z!ijd+xdC-a8vU3ARt}HvD?uT|8J2gxCPIQClfaADFiwX<0#e(@xyT z0MsJ|x@3s}{TmYpas(tt5;KkYr3O$*k)>~9d{B?eT4-7`MB80mUBe@@e@ZSihN4{i z*|Q$a2WyxxPKHOKn;531;o-djc9R6>pAVlNYudQl$}2SNwQ^#&f{JcKQCUa(_S$1jLy;&6ina zJ-0F+sCc^KKwsvXpv?H9GE7mcTz-JY*D8r%fpK$a#$+?%*UhduQ z{;zgs@QM%S0(8;PCxTaeN{2lQ)X@8p!G*8Pt3EA{PZY2+n@LHy#L2 zh^B@PjAkZJCo4f9n*6E-C(qDNW->Yq36od)FEb9LCRZvlGkFR>s!Q)|PHrQIewPKm za@E#12Nvvi62DqqL_3C-5oAUj+7SFIiSNlG^C0L7LA=j=Y-;itg5(<)#Hdw*{7hFu z>Vy*a3-HSYuY4?W*Fpo0sYLZMC5nw+=lHp~=%nW=&h;DU-DMVs@w&dpCk+z{)2!f_ zY|**WgNHs1np16Zy21Ya8I-Qk7z3KE>Km;Jd>6dw4Bhrwvw@)CE-38o@^acVI;Ou! z-$eBke%-@RyR0a0sfLVy=}W?9j63)g4ZVM|&+W;FD0pXnz2r=vR^onxaEqp|Yf=w0 z+g$Uu3JmTK{jiKeSTGC6EzML0gtS{RK=|4F#mChf;K!lO9H)nLU0+?NS^|mF4`|H4 z`VUZNbn)(%-6yj=0FE1P|z_ zZum~|55Y|7^^{S@PVlpkM*z!-cGrSbFfk>wmE`7w)vc6dO1OlU*1L>M+U#=?!%>0d9> zrHE(r(igo*hp32hrD$pyIQZ-~NG;wAuVy*u#DxowhfL{f-w~oX36d#2GD-!hxbIhK z371$a)2pOZA0gmxH|!K}267frvuUSq#TgtVMr;fF(Vbbi|0BHS>6*tffvDukFO=40~&>$!*}*mCfva8By5)LaM|qg^%+qMXuf~eRm1_s155C+bRaqAA%)&+gE|zxF|k*=f4!0@RT7y1k)Aw z%>l*f0TF%}NVn>HtTq-NoY&j3F9VA|@pS-Y?ev-0C_RD&op;E_a8&88r5yKc!K0Uz zibq$udxf-2#eBT`10{AIETt(Fiv7s-vyaksAk<6Y^nvfpCTz+-G!Z%phu&KIx&w|= zaS5!zi_7ZSF^G+Ji!HI(iXW=R^nmX?tREV7Wq>K*N(?wDm3NX;RPjfZkRZ#s>ny6v zrLB@sBB+9K?v+CVv2c*k2UG1sjp4F~4H0&x(g*HLvswo2?z_SLe}W@`+Sb4Oy3>EO zsoq3`*zUdg9)(&|+rIJin&;_YoT${( z!CCMTbZ{p*LDiQ02tjYwF^{?{fwUpc2mmlxTcRWZn5bFO?-Z%BR2HLOs zzEr7n#UP*cmLO|$zNtmIy?r~2az_h@lfiNJ42U;~RmCHP_e}6;s;eRYYE-$YDeh zK3dQmt}tC&!gvd%=dy32uAaqj_8H`s2c~xcn5{i9F%QhW4|v?^)}gRhkB0$s)PLjKC(^7{kv{NFtA0^#qzB{j0fN>9T|yA0E0!oj zdcZ#Xh_*HysMthxEAp)yYewB7whM~|P$aPcMCnAxU8H0m%wup#cIH=w&iqY~Rw3C}tDDB}h%%+cu-#?vJdNlVbzM{n4 zjZ;JGC0muW?B-^!)-}BWzFkk+Sjtr=y5ypai86Ycc#_{!Mi0DVNEql&-&cq~rL6T59JGf=nF{Kp ztu{z29T-cWS?P`tMN_(&=0&~*b5JB{7UsB~LJhByWPdzkmMc43(77n@zYTLRZU1XM z1NsLW>~hwW(fb(`z$=etE@4rDA09U2MxaCaFL!$~q-v2=*?3pAnBP0ABLCITytgr) zq1tG_N`7YUbao-M9pAuUf8?6%%QezTp^+9}zOPS7ZdYTMqME(+IO3|bhe3SUMrc(o zBi`K(z6%laZkNBtM?7a5V2vEkPXIlM&aYVi9-iH7CpzB;2_ip01A#uUL3?nbvY-??k^_H&Qtwcy=M`0fKb<;9P^`!rf@ z0@qmxi~N2y{5SaCKEZoM(#4?FEg!d~*oPu7Jg#|`ArP$TCk6dkWwv7y?o+uXCRi)h z%GjIPX4U_Ro5w*WNOlf5r7QjoDMhv4muf24F2*9kByDLY4_rsCpARg`?dzsVL;+;y zULH|%YZ%|_f{zt@@-dqnpwQ4P6YGZ=kx8Jwcu=ilYzw9{M|PEmD5AK!GT*3 z48}n_?9q~E?3d-utt~%;_%Vv+&&QgawbPZuDszwI{pw2pMrCR)cR%%;7vi9{^f8?{y3bLljsv>dW35iqgYDWoUtKC}#*37*j z+Rc3)%%A@LL%MagNTu*R^=9Yx1g(^W>)erLh%mE1_O?G)sDli`J4ZFzXR zhS3{0LhjYOD6vB6l}^VKh4 zUaRG75btsJs?mj^_YIpwD*Aye(0lm|kKU8$PcYtY|FHbAlow?CF?QLZ8pU$D<)y}w zT;DLTmyo@qxEBBm;JWPvD#d>xT;+wa$!52Xk;pygfg4l+uE7I$1yBLp+kf%EJ%S(# z8@nzTw!C`chx^ z4g9)~(xieFUge6R zW;V8;(~Il%XOy?Fzcz}hXmd0VjqpBuV|sfzPKEP}9S)!r{!`KVPuLrz<_cU4d>Osb zzGY+T(B;RIzW4Fe%V~(Bdhb`g zja+Y=xj{Js&nmN(&|0pISD16}L{k|h>WVLK9}&Wf9IC3iF$n$vk=dnVSzIOT>_zE` zw$AFlnch!wkn>i8y6C?3%-(yDS;X@zD2|Ds{qZO*yPS9;GXVo-Lzy~jJ02QKwhJ4| zi9mcdm>BJ7sM2F-d}``cbc22)eH-fBS?{VAb`DK)n!FtF>1VQEt#ggy&dj_q)UM^m z)exgHgbEN^$m4e)K2M9K50TEin;Gx1@E$nHR(c~E+?I?;b{jB0KCnj}CSvbU>zE{# zx|1MT8Tna*(y{(-T|ZNoYhtNGa)0x3QvzjMH-89>aFd&}TS(%IvNNayQF%PTx>~du zPx_1eI|Ew0nc8PcAdpr7saMOkb-$!CG#7JG*#)OJe+lKyV3%I|C6mgZOde@gEoYj2 z$zMwuUP(C`NKCiVnYxYSfi8Be<_e_K^w2!N9Yx`%()r^NORX{W`^iR^RoQk>qnL~?<1Ebe3Cvg zeMEcKr4t~MC^q13a)Ti(d71igTxTWMZn;~YZxch-&?WY)4Zc%M;+QNfz`ODNhxS0E z{J#2h6A#Rv?ok%p#$CF&=IhT6ez=RMlXWQ8-lgtM2H@)#Bfh5IvNy8HixD?8U+iBz z-2#%58CKUeG^TsWw}R(#tmrpfkjQ*`9?fgsvNh~dcZRheT#tB`)$)zkBc{w#NBn(+ zrZ+7rb_m>u-c+kBEJBH=i$_9vN+(e7T6hM~%U3sVr4VFiuBP8hkP5f569tUQoxES8 zgUMF~7|?PGb&|~yhDnBC!>E79G1_CPJ0JKpfLGndLh~pU%2cG+=)ACE`34_xn9tSM3dCcucH4$eFxw*QNcXr&BBi8nu__vMvse0_YB8uy0J}nm zUCsNt3ROiN_?EsANu0C;Eoo5{UqUy->?67G^YqHm>GL?)f&(gtXc@oZY?V>2Jjd}G zTQ@yb;cJ={9dtl-ByqqtU$2V&Jvj>By`~g>i5@;Ot`(3#xY9PC`iRw;jj$CsLb;L4%wy)5FC@H=DOiEz-Yg7C5fR1*! zZLR&l9%%4S)z<4qsF0FKc6GvTN2&Xxi~?_$YrbBkj=2*DF~Ne#Bw*p0xDQL_cRsXa z_Z4%molb+1SSJp6F^GSMctpbW3t8ce92;M`VXMv|Q$~(OJTAYLwRmJc=W=u%i3hGB z!OduEa35K!HJes$W%R=WRSM+!xuJE#C6UC-y-G?5T^dQ8T56%aBgw6`XAhl2(NXXf zBOq7UXnI%t8MwnFvoqh+c+f0r>*!6go_RFmoJtz;~7kGbaL$BtU8G&O5v^~cg$n{b+9 z+&h?y#fmHV71)+HFdu6Yf$^F&&UNm)_xX{ZMlryRk67-hD9_)0>5@e-TfvG?1|Miya4m7A&`~8!AwQm~0aFsh( zA{Q#1u5yrFlYam-GvH~1+V7;g4soyDh;qlxl9#^nsK1XzAo=3HGqLng=P!3>CC=sU z-_hmnkt?^*FlHVM_~A`=TxD424^=0aYy}3h`gx28)w}&HW8g<6;W%jU?v#imm-iLS z0qj1Zwq#D{-SiOVfPYvKx-#Y67&WuLSx=LA{m+$U@-z!n$xFu8-Xd=D{2 za%(g(W1-Z-cGtW8{ZbxQkH6hRS3@%mM)lI{pyR9AOg^(x;7QIy_EphzuVr2gK#0jv zmgc+cz9ws0i=+k>)K}rsIG6?Z#qy4wDWqjf^}Q z3;9H&-ji8r=~8EgZ~Zh)>e~Ss%iJ_*x5tbZ_JqqG0~bS5?J8x@{M}0=caPtxaZT(* z6^-e`T8}&z#)P1CHC*|3dP)8KJLWrvHeT(TJzb< zp}D|5fkspbC6^**!$$3P*PvyNgkE%fER~Bcc&C(;g*%s(G>;HE)EKyUYn8A6O42I`c zWeo1f{59Dp{)NASzIchV13&YC+^^OUi?6aX$Y8A0?s~yR{$yzj8%f*?YsAqk2XQ~O za-3R|U+q$NG$Z^lqpv~ShW>cv?szmLFQR(h#Iic*vWg(B{E*ufQ+W#T2Ug47Q=nRs zz~?bx(SD$A|3uSGFm$pRj+q?;tVBDB+*70xFjS`yKKlkP8W=oZJThFyOwWH zl;_f1SUAusG8j7WmC=V0TyA$R9)DTJTW=d5zqTJ3BK7cDx1SL>@&jQ6$5Wb~u zYhYmK&UT?L@0Rj0NX=iL_*oyz#x2qRY(7)B_m?!E+B!JHLZ+noxYof*1;P$QlH;Ko zBvDlf_e;~Tu$E612s?IbXbKIr4j!s1BFSSYYU}k=CYc&I2ni4J_a+s_PfS9gW%uBk zsc==;ULMF}0Wy0*H-3{OMrcuThF024wPn%FSd&Z18x<3X9mv(a&G1h>*ksPA9$t{n zUlU30v7T(4I4R2xp+F#KCFpxLa}WVloL*i^FLmyPb(4--hr`as1FKIIuE_Q6T7Z5; zzhw;SeSJ~Okmz_Lglj0J1M4+e^R&n4}L-_ zhlI-fWRTqx_~;!=;78Vl>(LnRsoKrrI~e*)kANB*&6#csB4Vj~yugc(DCv>y8;pl| zCze{!f35o?teai?dC`2Ur9a}!>kRu?o#+hd0Y3#@QWKJ|(RB7kAPM-AUN%J2C|PXw zr6*Oor;K$THElQ==c?97a=MfVrE}6m<60g`o?ubkl*%XD#9)8gQh5{At-_#J4F6^c zf3O5*vjU11VWVr_DTG7sGL^ZQn&+MbE(Op`t@kMsw&Kq3J4KSeu*vOEb_;aM;)=yJ zNSRYkLw5>am&?A#q~z<()BbT=fzI@qW!YPpH4F1iKK&5V&9g6r=WES=rXGZ?g-x;P zrLNM~fI35c=u?ax%o$KnUb1>m%E;{F#t!-3iDTn$gU1)~ksZ={+1Qdu>JxgQ5ok=E z4sH3lNiyDUA`>x=iKek?tFaQdHE|Kr;N$CZFiqCKv22+8ITx%BFmB7dtUoB z$?cdlB|MHa2J-7V6h%#~w`hAMGoTEcls+^5vrq7O8J`HB8I;fV5KXlO{1JFw!XhgI zNZSQzNEm^M!?@}PYl_E1;-LY1gWH}V^u98Y#4vdhYY#G#yb4uL=Htb^7_MIz^g8z` z5lr^MWxII|2H5w)gdw52TvqqzVHVqWF$Lr@MU{GHNB|(su*90quRBvo%fATeNb;nW zc3f!3nL;GF+d@#otwCjY`?lY0h z7_Adv+#b;m=z?}rLlG{a{YY$7?;?o+ijOwIubI)^&fa0R&*~6<(-<

z>;xPS?0||D9!h60dMHhe%9MWjcmKIkz*C#Dh-qH6U#-k<7ySt6w@vW;cgz064A|A~ zpa57^Z)yj23RQm5tsdAJ)_kxi&s4l3faRX*SMu(B=G$;_Wmn8{{%I>kd0LWB&D65u znoLW+A}v8Wfq7o|m~Ks2!URhg8YE~I2qf&WmawZOh~qEDmaVcLSyuJ{%kqJVZM>4) z@no@8MBX-)9Sb9d{Chl>Mxg6wlR;sAn@|wm%!jF*nz8xtdcXRnNRH)6VM+{E<;DDd zVK;scbrj)Z4F=}y6HKz2mu1opiSQmzoJ9od77H>B@0oNdUr9LmGXQ2^qJ)M>e;PhM zMPB-I$FT(?dOSv(I^fFkQ_kqmZ@ih~yU}Pc48`TQS2+e!z*vVZwZ`1_ivFT1U0 zLN8z3)*=7_ei9w^TiBCCCYm>vxJ#t~r7PyAkkRP@yXyyGw+`7B%rnB%G8Wj`=8p_d z(r@PK`zrq}{-2`$-LA;pi1hQB%C#wKFQW27;xfgImi`usjdK)pylHe0diFSAH*VB$ ze0>gv^&tlIvU;aE(&8jeT#{a=P7p>pAHT&zx1f?r|h4_Gg=TOxpkf{Z?1 zK?Bf7t3Lk5M;>YCDMlBqv*UIfvcx^M1$z}^O2UzP_B$l`k$Pckg6WDKrr1ceT;)e< zH2G~4gN@Q%f&yS zALz*5payB!3pbMmU?_1`Z@Y*RH}1H3<tSYK{s@86+h>Cp2)LVC+wcBlZ_-Rt>j05DL?&$%RfX&yIAve)DrJIFUCFTg{5W6i#?m*O-Q=m|EFYZjm0wIN^M*@gOY z!#(70p}_$;h9&o&>P=Vd>nocQR3^x5deE-LaYdC4p)zU9M@d}dwG+wHlA>k~341*} z2xPYjI+)$QKv3Cp@7HwyjOJa2=>?44&XzXv0@wWTe?@W$JVjB^5 zTE@5w$YLbtd;d-;3F`e4=Y)uKMXkD>9&q*KO`!6G4I4zw+r9vu%|gBf!<4HK8U_Xc zI}x7rCr{(c1DJ{g#g)`8De|8CXFs(WNPxcxv^8kWVYPR87>^2JT7?T1nJ>b17 zJdE8&=x<1mu!28_fy04%3RjJ|e}{=oJcHC zW!0~`{Eg{ah+Io=eJhKy|13~$?wBxg2p!Ux6mi>?wBSc=ia7So-F%MeLYx<+KUEHs zvkQa7A^|#zM4T2FQcZ7vB187K1xm_oBjE3bl(S1&*K9;ETU*&Q2}1u_Dtj3p0iLqQ zb%p48atq3O$@ZKum98kKC`kWht4B{Gx0Zm_?+dGcL85uAURNkK%@=!3`8od*6x)ts zKI?=+)^mN<`+U|&kag8pek8MhL{SOQnJbnZOGORH4wGs>Q(qo1C1>ym0ks`Kh5fp< z2tUO&B!U`jD&AK$Or(b5^Ai4!al7}X$UT6S8D1;Eb{du(Yotb}K5n!E z6a8Ra48@O5EzRoU`k>oyy0d-;6pR@uACrjjN1d(jHYQw&q%pagmPnVEY#$Aa4W70) z4<4Ob!ywxuLNPpAGuMgzxJkMBdx6=C43t!!VKg4|Luo`2>(OqPW36po)|fh?Gsim{ zvs5~_#QpuV4Mp}k@oo28r@rP=>SoOI+{aaTDK4d1$)$oJ_l5T*i3@RWt>H?JXnJ&6 zWBt>S#NndE^tn)@oogO#thh{t>B1ZSd_~4&+a+WCYpLECXP(02aCdAd2V(3h4VA%f zmHnoNjT1A$j>k1YMh&jUUU#iWzs5N}dz~bAcPPI6AoO{>oTz^e8KCFoiMZ2}8 zOclF2Mp@V^H>U%g{K0m=+xw975c9fY3v2Ls@{!dBTI;y6|2IC>bSk@kZ5U5D?t#U7 zOr6X9U6mjSM59|`Q~vwqiqO^})OqWd$Z`W7gq^9$d>0yROg~!PBmgrli*k*@gTuWjn+`jz(pe&zEG;rdv7tH)%2`j95FmF5lD5RQ8GM#wIdkKAD_ zzoFDGqCn4}w>NJq#_}bisRNcrGu+xtmh5Cox#L)Yi1_4}rWYW8@iZf_%oLE-?l4vs zLf3o%A#Go!-9uV1%j6CY14o8|;0)~&8@1fPAX;^N2YpyRun%C{7sCIl?KysbqPmL* zs{ds^Ln_EHgbd!FJvh(zxjBaF7E2^OVnRC|vK4omu4?Sf>FF9y9a*W;29`gvA_qmT zN;|c>a&7C~3`S4lvCgtl56N-G>LT7XZRYK}LGEnnpSCC4a+Iw2B($sw&a+%+M1UJd z(Iht2Q$X=ef_Zyrx&b@)3FAab4>rP@xo!P?7H>D|njWn$YxzWYDC^R5(;d-zpyZY_ zLQ-RGzSQIE^waO{Xlt>{{gW}wjzhrZ?I^2UE6*=joV$qE+=3ynQ)X^Jg-7~_yi{7) zEWj?MTt%<^+L6y1y@K8isnP-VoD)hRbZ9Sy;AGPQK%Pyro03BH#`xbZg|=M3fr}JLX(_jgN5bo$TjqwqZLHMeJ zbOsSB-(K7=>6WRO_<{&>gOPMz0?qrGcoaXdraBW-MRKSN0UZkK9iepA}RP5oHF1kZzhN`=u( zFGoaW>oIk9AwsdT_N>yosb?G$z)xdRRnN#(7l;^V>n4?9HgCjNejH!cbIPzfIkw|3 z$Fyf1ev3-H9Bg9P137qtq-46{#uk%<>zchBd=4@W^^?q{$iXk&spt|W2OHP5AO}6& zWp~KSLFmHdU}Ngsjpd+9NDek;Mj!`!XS@E57>s?0mad_93wb^e5H7sPKse%JDWvdV z>2`ui+?v|b9U1UdC^WBR#&p*q;3Uv`1k0!tnGl+vEG6w?(n1mW-w4f@n5V?%mtsi~ zb+iN)l>=3GF=hR0lFx8_kf9G53Je~e=jy+<>!v#KgRZRWa9bkZKqAK=i{xt{T#;*e z-(YRaq)Wd50bOma;7G+qvj@mVot{wUww)Eq1k+4d7vwb)G?8$4BoBsV_$?9WNgxg;@vC{vEX#JPX_$G5p@$6B2WMw}%1S&Z00`bME5{v`h zT#OvRB`EcG=7p=px|vJlhk4U4Wn9}&gys)_UPkpJ`v21=v7-61LgSAdfd-4t1lYXT z(Ed@+{_XMi%(*i03uHqR?8(|tP35BY>b?8Wal-`4+$-18_w3EC1^eLAu`b)Od} ztYThlA0Z2BEaXCc zERaLf5h&R6H3;664(#js=&gD>EY#Rh@NOGLXE1FPB>5eGmG;=Un z?J59L*(I2QYb}=K5LuizM94}F`!tsyrZwk#o6B1F0~u(^^fHNIvmBxsd>AWZHxH|X zN;WcINfv!fX0@3O3jL|5(3@fDXA8o|##8a3e!-oeT*mM@r@LR!;doTHubq$4&Eknl z6E7E)#Rh#3$4)-no%e-u1`R1Dd%{}gDX(*|;?ZQv8z!cUn6QbZYou#6);}9bjAW=s zvkcN*{CyQGi^N9Dpet8P0lB=JurV!%HRd-68`>MEhFPlsNd6W`U+HO|p3_yXCp zC8Z>8h7(`^LNm`c?y%I@IQ=8Ek>9++!hKm}GSaaml3w z3Hvz<8iA_}cVfmjw~y7Ql*Uk7vwMLBLksvl7t6^xny`v*G~nT5U_sVIyUUt_yofI; z&n+zwE&af!E8~08JOsERiJ#`>&9V!TLi9zkKPbdr@P6}7{h!Z0Z~j+1EX`t)4D}X& zVks$%m?vg%J8ixTzH`};sx0*-G&s=x>M!E6H99nVaYKR3!9n%`1cn~#5!sARogcNO zbYZ2Z0E1`Pi-5%$dyqo+BFYiu9TDk$O zFG7~q>TvJ*kmFy`kfe-MN>1`Sot$B&z}CpZV3n)XWF|^>^RXz4nr6$gOo{U-L2YlU zwo|DsEWIKO6l5NUvb@a8Q*GagzOtVMmF+=gf&Rk%-Tl`Voqk%cLD%}QNSVQ@!pPFq zirLf0A{}u`w*@4|%9hKto4yia)Stgr)VpEmJ5uX++156U#p!g4oKe%ILqHgl;n2tR zHP8)31cwhF$QG^Eisrn`Udo0Y@QTHPZsU0m{fU9C3>#jlR{0Z9&Ijobu5Ecph5!#WZV~^J(+`g*zv`iCzW2rw|aa{d-N9z|wuKcbNPZyCiLw3}S<+a5>-Sk7hHf6y?1T{KqvtQ#pA z15)Y??0W*Fyiq*H44}G6CRHLwP+^c*b=4F^XsavP@()xHx1K zlN^e z4&T`Aqf9?`>Z8XZIf9ncz>jw)w@7!40(K%12e@8H#wq_mKm|tv{)ErI*ZfjTT?E

Pyb@m1(l-!Q^IB%_V+dUUbE2&b0Y7;9|tVcfcRblvmOy>@I!bVVb>G2{1cj4$qC z+A%^(!M+;gmo}bk?z+lV6d^`)#T3z$KZX+9jF^ z$}_BW?q{!qessj-;S5q__K2}Fsv^njBoqJ!20l(9f zfY>VLB=~ctML)_B3Q67bZ?Vc@JVD3zpQ{C$e6B1b?5i&5e2C&Xrz2>ETa}O0`qm<~ zUS7Hj9u)}Oj&RpX@Dd}RL#n+A3?+vu^E7qah=)JBJAgdNU|L@atSon0HW7it7xm~l6a zAadn9>x#hpD<9c)*1~YQ1PQfKp*sZgWww)Ag8hli^&WYoPg44Iza;&be7f|?_E%V^ zA7C|=d=p&1F<;{b$}97pWcKyDxV~%i-yt0RpKx~_i=oEkb@q5le-k|C1J6eV|7b1J zc3P``UN}Mfgwgs9&3)a0uWqng75@FXQZAX`j`*hndR!^5JMP@hEMQW#3uT;3!pF~@`kU=XGZKRu+JG{cTwpUN4zbXTubk0xEG<9h) z#Fd>+(*=1cdD=i_CE3pu-`0Oc_H7NF#6|;=+FbmRzN_H0qJeV z7F5ity~)PZlfFMpz+Pat_I~@K#CCW%y+Fynj2CzAQQO!E=KAy@-D|l2`3)RnJzrfDPJ}qN354_uKJ}!ZN%xY8;%eVsm48$ zxQWun?&tki8kEkERnb-c)oy1^B=M2SIeqJ7^cJi&8If|Mq!L=v9}8rT-`Rs>k>pzF zA{xI$YV`IdIN88LPAG5oVQFRE25K%Vr7+pB*bj7XcI0|uIL*ESIYQ2Pk}sYj?KE1@ zP=A{r>)g4oZPe7xyU`S?0FWMS3h_^?DqZD1d#@D)+sh=uCB1W4)NGMFgcX z<#mssm!@e1BsLa9ipHsxd?6K}&G8cL8o4g8AdS{9h{UhkM#;X-XsXwfVf&(zs*T3E zFvPkNz=rrj)bwwc=;C>UD-ozkL0jNYUC^IKLD}3LvX!FpRJof8X|~Gtvnh3Wbu==& zVeAYfz*9D|rGG!AX!5)LBWW_jO+0OKP+Fl3lM}(fL}ot`ssf(>Z^n>m2dzRqAdn~M zCx&R`M4+Ph{5e#y?8kXM1$$Yo0o0S(*bjhhY2C@-Hu7GKm?&hRaC&od@MH+NHha11 z%HM|-QmP?N@@d|)V8+X%FoTEYR2@-(C(yHqXce_GGIg>!o_a(Rt_#|RiRE|o1Tm^UvK?xHy(nN|V?lG)t4%1Z^U zoU~Q~_GOVPmwo~Q*mOcJaDTxTEUkSv&0NZL3ssRTZ&#K)yLY%_FivJaT@&hg-^9G< znTfW+xKIN7Yjkqq2*#bU&+CgJop}A#ZpgCvWIXw>M4IhSWX_tmd3-GOd5GUjn~K)m z8Vc;>(V{4vmlRc{CbEw!5D3l|8g?@qNn? zm{?%c2DXr!>au$g9q3iSqW8IX0Y(1JXp47WJq7;1o5!2W>3dhcXK>}ifImVU+}v}! zej>xygaoMpG`WXaPHQN1TK7PwPyonL>^|)P8ihsu-1?@U-Z(zWG3^>RMLDTK{L8U4 zJU3#hpWS;CZK*|WHmX5ksmA@>cK>wM3yNj+YL!>KMIn5JwI^~V`6VkSszx~~r%UG@ zj~Jpp4k~s;k{1>WQ}blT+#N|C8$^3>b=1V7_Yb1$!s>kVmKIG9v3Fz+{J%d7=3dpg z??uzSFfmSK2X>wNfE~-=4CXp_#xnv-iMr2|UriG_XB%I{bc!_PX!$YEDG%X?Q568b z;z!^NH@IO&QSiDPiR42Bn!WrAE*-Fo3fu=0Kf2n7Y#tfP=J8+`X1KrFxD?^WcjnYG zS_5Sp^>JVjZDUhF)D9NyyJ>^$>5}sWtbe)wZk3w_ApM^Y99~zs%8zfK|6K^Be;nJZd@?(wdgrBz^BM zLOzO8jYvN`j7m1&3 zwQ?H;v@B|h)h=+QkXq1}b#59gq5R`yx@`)uT)W(@L>&zKSJbnAGo_jTJJ!GKn*97W zAbzJYy?cUq!(n55OF1*eFsMwY=aJcC#>U_2;cEX*dM3DZ0~>~PMgbqyWi3};f@ILX zl~}@xPO{`%ygGsSRCfKj1tJYm+_3Gaz~0b-%rvE2jm47@VbOsVdj#;HHur#m`DoBQ zhDuT;^XxphTP$T-mEWg{jRkd;QK)BXcj6s}0x`t?g5v9RwxbrfB71kVwZrz2Yfy-m z2l7kju)g7utB1PRl$}hqrvwKM%W^-tPqf?)o{pG8> zln1lZ_XG%?_q^eCM133nKtL-95Dqj;hd5NYEkF#xX%_Tmr|Chovdjp=?iv~k<(4-) zz30AM&H@GxPw<087WpCx+~T_d%bT3~VqQcInV?(qk}=U{U~1JXN8_?T#>O#E4TxsS z4d*?jX_~ir_P9pNZ-ywQ3A-5t(XM zH}z#;*e|5F!din9-4I4YtR^yuQ+fS~IN?0qo@Fdq1M`S9=9=Bq=d(pT*RuTac9Cxb z;A!8hH3DCDZ3J+xCsyA|=_lCXktK`*%fPazZP?kUOtVDsR{ttmm%9;ASm_OntW z%DfY7c_i^&jXrIJ_3B`(+Vkx6)%zN2&$jL(eR#(K-VgYbn9}CU8=q8s$P1xNPS&Yr z2%^S4WCcOEyE_P#yXBflG_E%wQ3IBTm;*4+EYv=5)3qaU1b6}VxvpMBTNkj>Rm_fxgE0y!3nlY;6spz1c2 zW14*54HnlU7sg4hpn|w_C|5wt;dG4@*IP4{p>T@&y5&=bn7Wup%tY&mN6eK&Ku!Uf&1RVpkSl6`U8zk zI$HK5S(j`bl>CCdlt!GvvTFzwVJCSw*g1SPafk!Nb;xy4MXVN~#NEih>+n=y!c-Dv zwxsJu_L*Zd)vNliC{kTQCELw-r{1PAY z9Q^C(>$l|RQHcH@$1)=bl3kiyCp>G|IdB zoWCgVUoBji+}Ij43JGL7i6ysZ zuNT|Qr850p9+GkPP@=nSk7@EwzRHG8_6`KE`{Co^0nLsl@`!p`I7?S-1BT$@^G5PR z$HZlli1ew>)q^4VE8%O&xx)Ol2nt{5{g^l+`BGMA@q`==l1tK-C^gtbZH)iBS4*us z>MqwB4i ziF`Hgb==mX@vrb=+8ekCvGO0K5VC6Kqj-Mp@_%ZN3)Y7=`d6WOQiuDQl8T+%q;PGJ z@VPpeEsz z(_pf4nzld#xl~BR?Dn3!G)S^JG+Z3|6WBiqlDbXEK53MaK)`cgFofgbFz}R8ZkVSg zIW2e&CLwpRh$Qgj%a;GW;Nov5l7B{CcRg9$vBrR_-Ni-q=KHses|%9HknHvfK8`8M zdsGO+j|9U4<*-3K+qxpn=QM>NGKo^x6ht>fQ*XFo!3Xpjo=K3`|$79%kIpq#ppQfw(=SOoT7wDioIg3U0on zeh0865aYQXE&W`Kr8(5{*-avlb#5D)ay77D_6P~-)W5S)c-U7aF7lOO`&W3M5FK3N zU#v_Zu|v|h^i2UM%nYMu?XRbDxrAG~j22i0hBasB7lmgOg|E+tmxO-Qi*m!dH#d0Z zQ0XpDAzp;7@6cp+zRld51ggq85bFo-KII)t8(u&ki?|Ljd%TdGuDF4!kvnULc+5VF zfbdzX3t4M@)}Q;VPX$?TCu@MWT(bhX&%@7igFyBwacpMr%nXF^2AYe1_8ZB(67tcX zdu%aaWCqM8M*!GY&?8*_^l$-IQR;^r5O-1YaUF{pQR4QIAY-iifoGAU=18}IZfDN` zF+ubBgc-sIxzwt=S-I+qa#77IkePpyC>Z(hZV;$IVr7nzArq%N&8iBeBQuWhT;)cp z(m2YMZ+c1gU#L)kfQcAVP%pm>YkOWPg*Ura6#7s zc7s7uzR9)HSoc(BRpqnPpO7j=DJUy@9%)jhn%qb$sZYy*8($>(G0^Jh_>;4R{Q(zT z?>R6H2<}d(EBl(%jufwy@t9W8G?ZObxHh4X0BbWvW&c8&C(yX`25)k0a#t=A=GoktFnBOU1B70 z>b{b-ZR7EdByI&!(aeKpEpo4rC#$O|eD9o?j)Ah}>$sxJQkKx2VIhRMySjJBm%WFw z-ckt#jmv%>FcRu}HcL2`T9Pec)fXT=tI6Es{RQ#0R}NoYp!O@iYv>;E>%pJ|0_djm zjDX60xtj~+ru%YlsQ~xiY^vNg;*QMVBU51J7l`=)4yK0e9frWcdnu_YpOmM);L3)Y zP-V&Yo5srzGn)}zJ|DR ze}w?EucJK%m20LMOO6MAOO82#Kx@~~u6a$J@xGMqo#3NQDKCqs(AaG?8Ln(MbJ-a*L9({p#bl`oQ9cH3+L24$2M<9>Qx>X}-f%`G*U^QyxWku!YK0 z>*n0#F%e6jgSFsVV#9j#jBWQ}6p*{PC=a?TV-k?bJ@e_ACzHQ1%|j-i46@-qjvrxt zeubhpx=*Ev&H9;j*DLL!Fno>rOz)u^6Z_k zINf%@uWh}a4(?tkKH*q=ys_Ke3!HE~K_G7C?uEY6DgT!fj=^48c>Tg%>aGqxdo*eH zZVNW+qv>wv9Cx=U@TLnGboRM$&e8KaNGNglzD!+6FX7u;2{OC=>_(^x(ItV9KXUZo z0UG{|4m@u8d(A1qfybZxUPS0&lAT|7G5p|2#rdj4sM|g)(1ZSHP5lg8V(5j@%xUHB z3SbFOKeD#{WIJwm>!lQ#6P}V`VR8QzIwfQW0RWB-(@OS9Iaj|yPeCV%}eZX7H-HP`bB8e}xgOFM;_tRHNjn=L)*NIdwR^;QccW|RamF}j`vyWPkZ-yrc8-F zf_|jFkPn>BXMt!d#u+U;fK`X8ErfKEU4OnmzlL;KmDiGJ_MIP9$``SvpNBejBOp0C^%7YB?o$?gwvdTEejdfY3sJc{cdRta2`cr$oZ*=TM_#z=dVh@w&vT)l#| zN%xZQ(qQ1H8krq$10*}pI%RnE!I8unVyVpFucW+Ip(lj<>yhw1!dQJnStPLw+n#z( zuy5{Bv#;E*0+2fmz5p*l6Uf$2HiY|^k~|3a2FiPRbOGViil zx0|szPetX5Z<<9TAd)*O1`2t7gKKD_y!RGKoXDtKYh1&;Rd5c~_ELwYod8sN!RHa0&I$>ufdugyY#Th7*|lU=e|$ebwJ)AZk@+k7^rKW=1#{?E`9+7jjiV2Z}hsKiT z)7*p$yCG-7rjT=ZfSd_=gm<%<9p+ zrmEr&YiRFCa=MrfE5q4$fynDbW5{oB!heo6T=sqb3GbJ{*j=9e7dm-JhfS5)U18B6 z9a7KZzg4YOMbkeh;|e-0fh8#9Dx@*^Nayh;6vkkp#$c@bC+_Y=1Uhk3V{k|?1{3pR z@N8iWcKq5Hct0HQKTw@2;2$RNGkQ1tPXgWG|Ge<>n@Dn3t9&>&|HH=7%f1`fw{fub>Z zWOV&gk;I+_9B!vb%{Kn{_wwd{Ko9cWM@>-~E|_|Bid5*gU1AROv6an%N&&y&Jad4b zXIfP)^UQA9*PtSZCZTLZE#o|m3MQ#`Db|Bvv;+-@K%$Ab0~e zJI2V^x9=|D90MCn>6uj~#&us$V3QOWtYe}yA|L|&Kn z{UgeKAmwx|vbE%p?#)|c`?`8d*UyK%TfzECb7HsmbR&t^KvJVl7peM4_8D^J`Dr73 z4pW_m&%3^c&zt^td_JmbH;>Qc14a0(DZ(e{6RTcaWls3$C>^7!)E(9f$folvBYj7e zche-o{%I464oQz-3aNiGlK2%vtD~hAy1p(%ot`)Dvz#okR1b3ya$o*UpxiBU6W%C;2yo`04;C3OaH9GmZjwldxzt5md%?` z1u8_oUKQ~7shtw5{U~^mc*q&q76FkyuQIy=T)2IyH9K7uY4n%b%wIhEx*c~DqklP& z6^;H;QpMpMC%L@xJgsUq{$bb>Fc_h+4dz$9dU><_aSb4JW=iwUu3EFkJzk+Es z{!4o94FzNFBg)$pPNQqs6#lrs*%Z3=^EQQ7?kwy}!n@o9T}*AGfMOHWwr2rm$r^*z zF3`YV^I!J@8-L-14}rx~WVnLy_G@BO%7Pny>DlPNnKifI5|o zMT{|?T#`{ZJ_r2_X(EzXZ8h}a+4L5n(>ID($A=L>dEX8AU&3{F|;?x=vwaT z5XKg8#|sciSCp+$(w7Ic!M}vcCIdr!Sv~m zx42I1-TIhLrEXF1VVdmh;KP)Ezn`?){rC=%!D{yevPR3BAMzbm+BXP3(4~16eTs{1Tv9{a~T){Uz{fKhi>-J;T*5b&s!MIZ{q=j1{|a zX+;leRtsNX99Ii}BR#B`yB+;}s|bH{E?3%=xm!O3s`ObbO;!)-y52VJ{kziJEljKXPUZFCzU7LFWZS~ ze14V_U0rJ;3q}!rc{ck7SQuaMUh(&T0a+!-1pB}sC23wzcCXOm01oTW#_4l5lYY}? z(l6dj`bnEfKYTOkJ8dR?-QC~bzgISsK4&xOH*F^U;?1O=w3+n7HZX41FZDE*2LWcZQRCsU8yaS(($49VIW*NbMY zPmjk%Cu1(QI&6b&6i0OSO=5UVVZgu|@l)yjHC8@h#!cOe#9|Xnj1wm8W);QM5u>dy zi&>_an$RjMd7sZ$rBJ8Rx#s4ag|gaCFHSeR?yJ$XKXgJCHvNNrNXj5m6M@yUG?HXB zLh+dt7p!JMnBc}CpjoLN+GYNqgR^^aZ=nTa)su!(ZL6}g-kX3CXkrW><>^GYzu&T< zYs|@N_EkRf*0Po|)MKG>k*m2`!&fAqk@Qp?wXQUAUz5c2;!0$4gTEoafd4gA@c%OW zhq!JR=wL-8q`@d4JQ#;exD(?o$m~^K9Pc(BooEt8eCoha(fDL{|BuG!uVDY%$7lUbn;)NE zH-78*XpJMj!D40N$s7s~<8n`rPHl(rla|xeW#SC+c?pKSM!( z`dtSKX7)1_5X2E!C>SRc_(MxbPgUk_VXQqhsN3BUp-wGw@87@-nfIqwf3vF)xyAG0 z|KIz6**EkbO&k&k`(OT_^q*ngO#ksI+o=DCgXcECZWcbm{pb_88S^WY2k0q3^$usQ z=4Q)~n8Se%hnHWQjMEbtpr+$fpJYb%8=hJY>6FD6Mux)_eIktuhh%=#Z^8Or@dc4c zaq@W9-G(CYagEK zT;O&e-lKE*`b<;5czYxgT{xou6S^npk#a^{|I-+?bkfY?Hlg|_wm&o`9Un)kRi!3- zxgVGWiX`srjYSPo@7I6rrGtf{Eba3(lYT%fs)Eq0#ftJLpWJFx;JAdJ$Qc4vn?&U8jd8lXqxa5A0OA zG{d7CzN=ClkDS&^O@HL(uvg$WHss(_zdDi}L4FvZ7lw>$QW!EC9}gkny0WYsXajl% z@}LiHkDvojTuWO;@aj93`gI;&eQyNsQlh%Sdsb-(?+Rc8)Sm>P_W2s9-ytgu3$Nn; z6$}ikKCy0-d&4-Kd&Ypc2-J&+7M}WT1ggG^LDlz0pzg9UsDA)5kJ>s9>RAD(KmOgu zSlt~chH#zM@cN%t_u?^cKEDz2y*%Vev;(xQ57_;|#7#@->!v|d(e$ht_BC%hKSPf1 zn$<>Z*Q_b_Z>#+~$^M;a|4y)fMU5E8+bPmDYZ?FYgvVTd+|p}oc52EVXqK$uH1PlH zCbtipJc}j^@fs@4+zz*mDtdSGFsYZ&P|_vx*YWs$^J7-5S> zdMeQx=|kB@-!wbzr<5Xg()UJVzAsVT$a8jn%#Zl3k>}5YF+aC$<1wEHJl{CTM+QLe z(;etnm@fqMMVQ_*0Q$-FHv!$Qlp>(@y%Erl5!DUoK6#*@2TFiGKLC1*uK_KCYwXOQqC=gD z@y8BB!zP|-<~51*BloY=ag7CU_j1GGD^f-MLC$$&$Z~XMhdV@O(Rrb~b32o>sGEcM z)Y!a(^|M&Y*>~#Xyp+@TMx9$pRJYC@3&egzK8G9V+=W5s_7QU+f2+*nQUdwU$O^?w z$g3QYE7+t6nG<7R(=ReBX>{2! zN9tQwu>|-(Oy8rCTEX`|`o4#5ZfZOxP){D;n;4Jbl>4^yH#SrL55VCOPr6@eJD7=`kY{l^piWPaxA^qDMS~qn4<|1ylzpRv- zCUyHP(M6;^L!=O2Tq6r|Lu5X;GoGV2YhZ3vJ)Gi7Uz{Z2^B#6*tu#!dD|21UxQ)El zmf7ZAk{|i2D#;A^Az|#|yZ#13dIrYYWPQUg-b8)(=j%Ix+`=!+9 z)#S7&Z!o4_S}%4uCI0j;-&Tv-O_8w7FMxy0rGStwSw<)ofDM7?^W`F>t`cu46?J-$!CnC(DsYusT|M8K$@N}vKh~j z$RqgBjarH78bb1JTuB*Vw6Nn>e~MqjuYg|aO7myLVpTZ6@|^9KzxJ)sb$2w z1CceXe7q-YbZ$u(3z?EK)iso4MtV3LnlPxw4=2!|LX$Fd7MBy%W}dO^6dANw+tjkC zeLHQWsfkAnb~vh2csfu-#_!(xm5d-#jqqM;f_qKK&mgdbQJy`fYNB54z92>WSReB% z#}4j(S>+xS3?#m8iC;dfR*)Z}sj+cDpxOX;s#DY;oVzzPBcN_F!ll33M!U7vd=+k< zoTb?TXMDkO6_u*;%k@jAOnT9&t=GgS>;TQIqAGO2W(_sON<+$_zi9gUJh`>Zoiy(aUCENt(AZ&35)JQ*3>Z!qYH>gH1Sv?fuSi~@F%{G6*YS1cYwEFK+2 z3WDY{P9?8?;*&^u>HX({?+RsQUERR13`TX3Nl#rgG|-&^KZEp%(KE3qN6$RI`Zv1n zxRrdckg<*6%6pWSjhg`)!};f*e<;Y) zcZ`kKxxLcd7fet_3n%+~~=Z?wfi=VT$&L~yF=O)8qa*Q&MHK8@+WQi@* z7Y*~8*J?plk}A?om__A;xVP6BVic{{oBW< zlCLU9M{){3q$pP#K@IfMA{#=Nq zcRLG{M3)5pX zeXH0`+_EKuDcb3hR*^OtKr{`NQ^M6=s#u>nlbk@AVBYl9rvcJk3UAva_NIG;>|(tK zR4kL6uHrH@5s;y`R#6IZrz{^B<_(i6#F#NR75HV29>=XvN$ z7@Ae?=1V+zT*oiyUP+B0zmv>xc4K_?K;HDJaV?}a)}K)onR+*fCsY}k`dc3=k4%*f zXLS9#77XSldEJ%JTI*v*BO9SZ#1fgh4{B!XV>1bFj4qK_nBK1RNHRt3Q0zdyAXkxC zH1kj!UtZ8yE%ZoCtpYx1ZTp~_3}RI(2u=%vZf6tF$r3samLFO}yeC_ple?jeF9xPg zKbs&~>n%fh&=v*C?Xaq>6;H(7=yhe#EVYR;0$@4`N=y;^DnSu6LG?d~T^8hx)IJoD zrQmd@o0#6_{+@lbntH69KA=6clB6ymI;u3Bp0FS_iLX>fMCEN{o_z#E$Ua_}(zXgJ z!IL8+z?$JP@nXmkx6`ySHI3PPgg~oPYaPi3e$)kcNHK0Mvu-qV>lAY4>D1)etr}DJ z#jmWU(m!d*o_TB%ai-2A#25jQyDq=$NRFc}p#un-RBhkOs1~u9CujHEBu~p7`c2&JR3cj?)%_6R`{xm4~3o0Q51^0x_2tmPmrEPTm=LHI0{A*FLMqpzK)lfvHCMfW2 z0>P)-Xm7*;8g^e^?02fQ)3%9rM4*wW&DPHJO{CAT^xs(eOr_(zO3xVdiF~0Yz{V4W zr!Ou7PwAxaiq1KSC^3$oPu=U5_)r6htgX_f7#BuAmU^h1{2;%QADZI61F$Z@&-{Pb zdl&e)j_Q8=N?JWEOWL*kh@Cj`)x(jT*w*`LJCb6{mWXT%KOh0pwH|9rM3$7@l`Wa1 zk+I!Gbwu0%t?APZ6jDlCH|3E80wOVqLwT44NSab&ObROu#E?J&h3NnNp1E`P?$t_u z;28S*dq2|dojYe{&N*|=nKNf*?%mB_>|c~$ypI{bC@)rKow_zrX=H`E7Vn}+U5kH| zr>+YLBmUIE#^a6&&y8pdNE^s*8Vx-E&W3k2+}iL*4gOoX^t=Y$HhPyY(uWiOuse7? z0772lcj4<0?$3|B9rwrE81rM=jI3jNot3`Rj8q{l5-`d`Y!Hw6k$iQ_=N;t{blmbq zX5kiO!h7Ih+!_BqzBvDJ+I|s*(QT+0!p}tHzp;N(0e0uZXTdd+e-f95 zJ3qqwd{%rLis*RH=wpX@KSRnLQRUu`{PErRa<1<@_8{S2LWJ6~=-&NzCKqyCVitl@zFy5st42h1Nku8&(`WjthK{FA6t z?H4?_u2}C2CL&Kn#Y6I2Z$_xF?2iyDH~v$GiSX}L z@DsNR{ALaR7jfX91d_%A5<`!)RA?`xN}U zHGDxF_zuEvRq%cV-=N`NyL~dfWrW|P;ENRe0uBFE9QY){Z&dIT2(g3SpRpME`4@5E zp9RdLEeihY3jRwPen%Ym4->vw!T+6t|0@k&6$d^<__YeYPr>(V_|!P?s|mka!PhDH z9qktW&-G8{&uqfiD|oMhpRMcvSRDB8-vanm3jRf0gFioDG4f}39Qc1He6522R|WqL z4Zki9{64~0Dfqh-{M~I<{a3_+-%R*&1;0_j-=gdPVc%qW^9Wy};1?hXD<2qnhsvw`-_>*Wh*R_U=sLN+*GS+IC8%Z zJJz}P>P7E?C7f>{>|Si&sj}`A+IM~dMAqZrHQrB*g;AWA3|HXf%m&mb`^r)Wc5A(oEAD?W+C2jc-vo+ijMi< z*z2{0@%wMXw2bSEy1jt~^ncM@3()&BM@INZvhayhJgu)Ec;>F}AW#;W1Cxo@njbpY z`ugZwCPtc&;k~aFE+I2%AIDc){$V&jHS+EMfW!71IBf9en0^xJ7?$n-s`$M1z=ioA zCH$jN_&;a502M}7_5f>px28HjG`au&<&`-7_h-0yar^ImsPT8~zfZt{y|Dg!ru%p4 zzb!CvQ}$mKGGqF09$x9~?7tMGr|Z8TJRRGA-)36+?~Zq$OaJ}!XL0)P8@L&-|7s@b zANM;Fy{P^rz`ved|9%YDFt-0*Kp{?`OS?E>j@84j zM)mOXO}Ms|@gKy)#JtzhevCfub!5cT$NeyAllrsX(ns3I@iK=#u04+a_;FOfDv^%u z&&Oi)aUS769)(X~`U>jfCqU)d_3@fBar!d>H!p5~zVY(!+@A~K`o{0i_U-4+Zby2${#;9VM}Jl_E&cf&P#Ld3@$9pPEoz7yc?IjP z!%!&4BIZ2fV0h!w`u?2^(Ur-2b-C8fP}0#I3@QDRBiG2|kxd|?;otz40$z^% z5)KIWT6jx-SptwBMHa(Ma2>zCdBlU)$UNiSpT|m|PQ`Lk{C}uqc&y3Y-=Riftsc*c zXpNL$0q2L!OO8jLMC%x_U;GIqY_zo=Qf3{yIGFrS$O!j)bW!xw?i19y4U36ilp%D* zs@qYDJ5lhQq9>*HXnsN%9>!nCT@_E`w(-_u=;dY9+Fy3sAqDjqS)QR@*vy9$?t6KD z(~4C)e>_tj?)1~hRVdUv@*Vb4G5Zu%H$mq$KAg{U{5@a!=!Ey-mXAZ&S{#*+Qiwpa zB_G=%l`-;>EXMVM<>RAh9ewkK)05?61!ZPh`FJZz#mdJzO9~wF5tfcl9t9sMIaA9= z9?QxeEy_nGM&64p9}C*z$;W0Wqf0)D@xmb`AKz|2i+rsAk(Q7D{h}=&KK3c(qY%C2 zln;8KcN6SNI9+vpa-oJR(%z!_T9`EIV3pwcJ`2c^e|$iPz*F z%5Ni^x3Lwq_3qa3Pr>*}oLd5W2a^ws+sqiB0b^+I|FrT0$Y(Vc!y^BK5uLS}K;hQ$ z9a7scuGM+2hk1q1m=vj5=ewiH8P{%1yQ45BZQPNjzUP13SHI3YP*dYPjb2D6nHL!Kq z%EP6nRPTYG((bfFa?H|MQ6%PyfP2M%=sK%pBBex!Hs(CVerIX?m@4bHodkdfHaMQ^AhT)ZX z|K))M+_Bn&d1QNag!wEn#0U7GCPDDYu<5An;QGT&H4SOrd%1f{Re3YUf|%uww=gT- zI!DuJ1EzOh^6tmeBORMh`J@ffFMCg4gF-Yt)sRLk#(yM+9_?&B+%&ox&)UJWy;iWS z-RVs=iQaoZ0a!dQ1b6_uM_CddkdPoXrlWvR-SpIIsn)wc5x3y~HjhH+n`@r*?yrrl z)S~i^waPm>cxz0xL2bXNl6dg3X#Gsztmq~DHm0#JY$8(mN6J2NH`(_=*ca$bM~-k%7~T3&9B|^qADNL= zV(72_+y9{%Zk_*#6%fb}m45D(kMI>^2YvdyGM*;Y? z&w(Qc=NA0{fCnp%0xR0fduSS5upf&&09fR%ANfsWhfuNp@WWhn#j8+mfV}zcl!t?~ zJj)tmv(lLLTBKxhR>GZ-s;@_`Kn@$e3k^SIA2=Xyo~$pyyGOuc+8t~V7~g~L(APIx z*VJzhmLFel8u>Z*i`(8{hIJnQUgZrw-CXl}cv15ssFxo|->+b=m$cM;^^U5heP4u_ z9UpiZ#(Q7}J-h>Z0mCPWTE3C0Y@plnjpW%+u;!iER}R$kX|zWx9(yZA>4%XDcD>p; z`lpt!Ahw+Q_aYC9-}%ExKh(NqWc<-;HZ)rCG|Iwm-;Zt=e=~COo%Ax2XQ9{8`R~Th zqcsY2o`}Y(_Ym~aTlLszKZ5^Dr}Jf|XE~6?-^bvXt|A%VLFj}wb&g++jX##b=H-Y7 zX~+J?-&&i^uU?6=cn`?HI*dW`IF&SR{GMU$BDdl-e1IZGz5g00IoOy%sI3_sC|`gO zL2c$FK2OlSr>f{yeZ8SPJ+)pN!8dxCsi6z)5{40MaH-MrRNhqh*|!IDrR( zo&M?}gE_7U_Y=W^M3dsEe9*U|2^u;-29jDgYEXCZ}Bzb zA&pNq29;)tN<#PUCD>DqU8oUTC3?R2RAZQz-dT-EVynbRqpxHPDV)k|EX02`{+sZB zGjq3(H1=Z+{4h)4gWH4H8g>sZ@nX4VK8UBQ!TXuVj^f7leG}Qc_l&Ol-<8R`uCE`S z@P-#dR{or_k|Z|1B3Hy`)pPiXeC-w)%3<%GZ0t{H9$Bj7#E#4jAPUH+oW0{0j~CA@ zfm}Yypdw`STS`XnWMz9%*`dg1VfrGKxKvtstm)vLUF3dp1cNrh~UOHRBO% z=nv_a6!Z(9S%}B3o&F)fn=nS+jF-5oQrAN%aI;>ecA^fXikZqqgz^(7F{5r8eS5}$ z|KK_iwYO*B>6HVjPPlREy|BrVau(#O`t@&T4LAt_!`Ffb9b04AkD&pm_U^Q%n<2|9w<;obtIM`QtA_t9U{l;Zo+q zWE`I&1jenri9f5}M#iPRBi0|I9G^|z!92=4_3U606$65fM<5GBXGR765aipAMrwTZ zUS%Co#@uw-kH71RfE4oilzdlJHk=x24b|Xvya(ZaaHi$pa=bzjy)cG{{v%KPU~J}I z-h%fWVUD@HVR-b@fJ@kq*ZsAzg3)*7&lldvHnA5YANUQ&1#ZBHM{9Cp5QgRXC<1ed z890urMZUqVz{y*aovk_)nDUH29t(e<47HAzPN(a2fDzbQL@;er z;XQDMgzY<4?JyS&ejO*^qx5}IDF9-e@xSlaS_;(ORxJZc08WVCF_i%PH@txH?~3d2j>A)jloUkx5ha3gBGVnW|i!ljmdwc^0H?s|^ppP<$3$;D4 zjz6n5wxY}4`Zid)7I0VQKsc-QMKC~K2^0A=rERog0wt~O`eEsXxgUi5!L$1Gcj#HY z99a%yWR=#h%lXo2h+2G_Z6%=KMcOwJWBr}yg$yw(LNFNeI-wEp#56)qpZ zFZq8je#bYWLM>}WV2${V{C zkv=>^u5zm$2i3qojGm1A8_cqdzBt{2y=hO?7vnAl@p?M*{Dly}{EW2T{8T+w(&^CS zdG@m~JlE5hnBG}U7{%+i;lCd`fs==a=pWT7<;L?y!--EE8lTxpjBOj;07TD}JOj5? zJT5-8xaD9$^J{0;k1qY@`h)B71XMgJkwbs;!6k5jnn#{pKk{XG*qGpa4P!l?JIwmu z%}3LgJkvaaXY?OO>E@be2j0f{dCk`b5Q;!Gcvk#oJ~VNjdT64838$?ene$ENqaw@^ z(peXx9s?#{s(u6(OrEhyp?Njhx|oj=Z_q;gK~S$B+*Dg}>z7 z=jn-U#op-0!zr+1H>M>tADo3dc*M8k4s7aHOuX$oO#<^^%$+L$b0p@@Jlw%-+Aejl zaemY2`iEOacOHc_w~S(THhSlgrjhl-%_C2@Vm3a8!;yz^Y^4=vSz1PZ%{`?fjrT-; z0olTdz8BvS`Kt|7fQiWa<@dG7LHT_-vJb!LgyF~@b#YJRcDZm&+XrySE$}?eZFF~H zs^xkD(>RvxA=+7Ur$@|gp7tB zVAgVQ*{3KJ`|v>E(TYOg2BU1b8NTLyjeJgU51x57jF}UCc#fi-wD;l}=rM`IeKC8A z&#MNF52Uf?PTqTiUjA44HO6-=<1HWj_RdTGb2PiX0oA+<1s)NXFZ1VUzri~TD+Mg@ z1iwzmz{qI@^A4p zqZ#p%`J#};FHk#o8aOOSf1_DlK1Zfw)dDh$5kyXHaF{%fUS>t&cBHGfA^f#~itB;b z5YYdk!Ma@@m4PvTj?AR7HI-odjy36pLJauYA4_idHU~K#zQ9oU(p%UDjSHs(>0(!;&RR%cS#%fJ|6BeTIuqx9&CdqI;ylLxY?rM5+tA5fvpY(q#JhVnQ zn@gYITgmso2&u+l;a}40DLkDkb`w4H1RU`vF|y$yUz}j!r8>BhWh%az0-P*ts`)lw zkRX!$^GF@pic$a`c(#S2WXVi3_4#&${P-~bYUu-#Vn948AiApM%>C}b(|DhJ!uU2I)4T!!eDD6J zMYQMXE^Fp=rMc$214mAOtGQ-uAggKLPY@%MxfD78FC1zCgt;ECA3&H86ZLt`cpHTM zCW!TT(l~A)^6;*2;XuKE4=g%;i}s)RzM_3!f?(hu6;?xj!o@NiD|zV2uV-M!G780T ziz0b1(jvmZ$G}4?IKv+yj!Sii_7l z={}Ba+0^1_9}MJ>^$z1fxAa$Qv9$d6jU^M~y(kd*5wNjTaJ&l9bbY2N8h=IW)tK&RRv5`W8n!7Lh&5g}INnGgbzEA}-QSe_sGcr$Gg zo}~w#G59s`5QBaumuIda6KZe5L2_6-iPirQru-IoI}r~m6944thrSN84Gk=WRYd2& zQc;RVH)AfRq6d)&sh03%sHV&05mk)y9F{-ZU={o=@B>pp0Rxj)SN=)Bi~kCtz?qaL&NRAJ=BMk2b}M8xeAU*m$C znq49?Gy0zSkuNfL^gX`F!|EdKo#X$4E7ea@Oiw@IgTBYqv(MG0HTis0?!qYkn>F|R zN9Z5hw_Fz2k{xX7fnSC#;MD{0@D@jg(bK4vy5Sh|?xu+B!|EQNC32`?BqLu=#-7F_ ztuYT}WrdhDp{0+Veti3($n|hW9)T9fsmpIfmZDAs?H(jtKLj0`^w+%hu+M4HBIzPu zuo65w_ru6c7Ugh_w>WttkG+DK5gae?cmVe!Ujt2+2nbB%Z;;RG8c~Vh!(8n@!&5!f zu(e@}^q+dh>MPzqPX5_fVnRP$`+@~GpK3e=N*S!gU^QAzH0WPr>2dVVF@zuwH;p{j zBzKGX{;wqmOeApsLHs`)$>+RoH1P2Lv4K0_1|Oz}+=LV8fYDy^XJLM!Y*I<&1FO}1 z@Lu`F{tWqjEpmtaPDH}^1uV-)y5!p72zw8F1p^kH;ieJiQ5~_@t4-noRtox92>Qm4 z@FE#d(Rc`W11FLe3BwKHk{Y)NQZ|)GkD&}Cqs$k7l!!u5$(TZQQfS~RMc@EB)gtiD zBjeYgBD;Mq+PoI63vY?)har!t>lOIzVAd6?F3usOuJLcfjN0|wc?82$v>rGH{ZQJN zdj1LZpoiEyWEN?9zu0J~sZC5W3c?D+6buRi-u;0|(1^YD!D(rd$9I)4*-eP!L5f{Mm|_9MLxwFo0>*`-7@lAL+kpH=e@JmAI3ifdHus&7kG>S zc(A~kdXYia9(hS!lbFc!>YB|&zM`&)R%A?FlcvZg<$CkY-cNr@NILi!8;>kwZ>ej{ zSR(HO)c82~8hN!rYxWbTZ&oV)#OXfk!a^zHR}Bb4o7J@-v`$?MLMzm@AXKET1))53 z-9#*|P}kMGzKS6^1Y(k4S}e>Wuhnt0mu*j)4$d9;)=Z3VetTlbaR$vv=o}kUR z{JG45%N)4Ofy*4Y%z?`sxXgje9JtJZ%N)4OfjAu4+S}IN6EMSlW=C5nY_<-CyZU;~ z?%q(it+zw&ufG0zGd$EEFbnfK1KYcM17_kOFNk<%Fnw{`b~mKg60?CcK@`P+Jj zZZ&oVI>LRymF<0fJvY?W`q%q`K_D3Rw+#$V&fDJI(_;Y`?QNm%4u2>d?C#xxf}8yv zeZW09&=EF!2YPzU-oCK8tF5QI)2KB!fJmJyh>)7j99JEIU|T3)EDqJ0et&;o$SmC5 z)!or$c8AQxdj^)6H<;nB?$ELuLfv};g-cwyC`O9$-4-@`$g9QOMqfXw1a+&75WWLu z*&4IIue&!KBG>zShD^{CFm|^axK1|$J%OEpULXzf1B2$`&UB+6&#p!afIWSvcW}}j z6m!AsnRKUja9v z=AoUQ13cLt2(tTF@7jj9veS9l+1D|^ z-oqOnP$B-h`gRj6)Yr2M%0wK|QBb&@Jju;ZQDna-8aw! zPDNR}GY|^3?Fg_)_fAl%`Y%415+z~43>25FT7i(0uyrj4&)Ey2i>u>A04b6v&phq2D zHh(&hFT7FWw!G_N*SjUq8|n)-@9YQLEpsGBDi~<%>FMjxwutm>?G0#7+h+2{TedWA z_BU+yZ{D)0dBZwO=m&xU2!RuR=*FRNpdlD+8}c`VHj7D%fo1(GEhB4g-GD{T=9Y#V zTN=$ZTN}+S8_k9d8@DtyZZaEhUftNbrFr9q8w?|T8h9J7)`Si0xGmJv7U~KH`g__s z0>(gi`?Bh|&D~(EY+T>E7s)U2Sb` z5SjzshcH;&YBNIt>WWyg<)+PJ8Hd@NvAS(wN0(^fK<{n6eY<&bxF=68W8eAX8?-#MecpLtIi46`%@Lz)eG2~4}j~bbQkC+mU#-cK9VQ_l@ z76ZNbZWyKyDb1W2m?=t zU;6@n3Vb27Qt6Y$cn)XGP%NLe9LHvuDUNP1+9>1Sgn@mia7m6K<=_vt4fKTlJK@rG zz<7k>HfHCt#i`3p)0i%&y4(++FK{;6ocL;82N}|QylRY%B8Or`K&V+@*!}L}YBZyL zpt~mwL4lCKyG5s>^X*b(aWtixw9{JK+j=mBbPoAp+$?#BqbEv*Y(;_CZAVuR^mCXs zF#NR98MZ|8TqOvOBpkGus?04dQE@`OlK^TV2TtQI7;Ac?c8n5D;(^rmzFKp@o?yV+ zhQT6pnIm(7T(FL^4aWJ&1d(ebu3Ksvp+L`e1A1?mt4w35SpH)DFN$axk zIzWY%n%7--+iqShNjEmaatH;T=JtVJaqpI=ryI-Nbj-!_!0GEm=OV$mqXNQ&NEt#)VgsEk%!@OT+{ww5HJdb?l${fu zE;Kc{aX7L&&~}^h_~DpaX49d`di-|Dy$E_&TgcoA3)#()POHkYU|~-l2Xj62Lj@!boKSXl+;?9Z4G)henO#^%^mQ^9K+#7 z3MdGtEjfS!MrZhjmSuyoj@cAq5*Q#E?=Vb!40G8Hrjg#2j|@Sq^Gax z?&R#2_7@#VhiY4%HPbX#>TWLzg)!H;VOyQKG3dBU4)z2Fk+U>C3ai=N#v)6d;9bGK z-aferw|2R?xevCfZ6Mr-DQkB}I=Tw-7s6Coq1z{JIz4xo5l$GpK|^3L9BeaHKtUoV zoO`N?acBB&%$u!H6ImdWc1;2!P8gFd|9!Gwsj)^&u=c%-5)Hs9?SpxcjALn;-7(VOz0fd^w zt!i%BP~-RS=pCR-TT<$8>Fc-+Q82^`h8jy7WS4RfuCECel+r6m-*PUYlAYauJA zKvA>AUA3eq)n8KH-o1lCR|~zfR6MEtH2B41`LxIZ!%6kW!*803CzYQPKZn3LkeXC} za{KWMTHKyge#-VY7yE1Mh_|f{lgdwSKYqcf+IO@;5a@TMe=}yNeFKndC06I7zOhXtNgg;>h1r{nvU^heK?pE?-g^LNuwzsbNzTl{zN%|5WXF$7?+f z{&Cu$qUiaxzx~47pQ7mbwcmc>?N3qk{Mvu_g}3i48kJ8yFbWz|enEe0och~|^&yN; z&F430VwBxn=5O5G*1W6n+(!7q_bk413H{>@eZ7Gxu``U~;^LCx(&Dn>^5Tl(%Hpcx z>f##4!AeR?%1X*hDoQF#s!FO$YD$YsOG-;i%Sy{jD@rR%t4ga&Ys!ktO3F&h%F4>i zD#|L$s>-U%YRZetOUg^j%gW2kE6OX&tIDg(YbuH>N-9b#$|}k$Dk>@~sw%20YATB> zODan%%PPw&D=I51t17E2YpRN?N~%h$%Bsq%Dyk~0s;a81YO0H?OR7t&%c{$(E2=B2 ztE#K3YifXE4Vte()io$qgIiOP`2QY#6E`|(#fw-B9Pc%f@jskl7`LxVuT%NM^6N8V z;n!ffY76Z6O8=IAtkiPFtT)gTGFPoKcP`f{%r@`118EL-ec`qqq>*3Do5`;FR9k2G zBqf9YcqZ3f_@DU84=t$s%MX31Zo@6jn0f^-`a01DEVWq+I$U)2V*(!b8#@NDH0YOQ zR_mIX)+Hc}-B?5P%RRYLkaEdftgBgtJ9?-#SZYJ~#xJpxw*G!hQDny4iRGk#03%c+ zzi^S|w=XC^2oI^>?p~ueu){zz$ms}l1C@Z$6E=2)4a{!T{m$-PMt|RKgKK!aM!dlY z4YV6=ot;ELp@<8?8oxvo^VN5hly3@jwssE&de$P083?xCRJj^qqhMQWrIaae-LBv& zZ^VMoZD)Z*eO2oM;Wb!lp~JsH)Sp!uCUe_{O{OMUg2-vu%&Sm7TNs8CEH8N0%gVil5&5m ze&sbpuw%eqUe;b-u^oms+!aJ9s8TIy>se!Qhzqp6TxBT3rR^!L3GC`dEDxbuY(~%_ zq-7&PZuz1XcWAIr3{Zw}VLEo+P4OD-PrP;7~bK|BhSUBhA5ib4bUesk^ zh4b>R+}e`L%1P_eSmwq8NOT#RSYPCIXpI2sUER7B^Z6-xxF-(Rs`wn42fTr{V^_hY>S?{;pIcjVj<{~w!Z19x*L3$GD1$f|my8*l3u4Cv zqG4T-M$9v0x`e$x#iqIH2Ge8+*uKSXGO(gbbKV~gQr0(Mm5!rgZ7m~v@X-2tRS!nN zmffJM^)Khrgkwx}0@*FuP?vz01L5u-?54m75`r$1C@N2RRoOZ8e}6E5h;oO2urIi~ zZ?_+jy1}0g>q`v#vNU>GvU#9=bKv&qjZ*iG5?3~W zv22UwtQ~DTceeS%+|p)9ycJz+g!>>Sdc5DtweUcv0sMN}x_26mpc~u_ZX3h$Objbf zoeGpvG_WRvO=XP1$H35@bca_&B?nW$3^{lZt}H-taXkL4p-s6-T=W7kEIg9hxcDzf%i(a(Shl|5YSvgY2f?1T$JYDLMV8YnI!Ri4YIPWrZR>`JT z)(F?CMe0#At4k$YnmmpV6;zMH$46z1Uu)bPvL} zU2QR@=*bpk5nOB0&+KIUmiiA_Rcmu3t{Vy$G8!yW*JCFTcpdgzAR#|t&{T|Z!Nvn+ zMX->EjS^}@t@5whwqq)au@r5zVOMOYSQ)J0VGSI0T7DVypybW&M=E=~!3jNBc`oJ@ ztBTk}X3f$j(Z3aJcBn%L z8=iyd5dn{G-Ho-#?oBDN0%{nt?olBt{PtX!6{_`+;4_yiKi_my}x^&4Z4Wxsi8=dvBx zCm+K6XITh)f5Y5%RD=kUT0ajJIpPRKt$5Bu%tv@&b`J3T1tiZI@~Dk&eSt_u_g=^; z5&&}9U-m}G?%iA?*WgZXLnDJ-jB=`>4G{+Hq{Esnw$MaF8t5=*W7cLF!&+`G3l5S7ddpm<0w{v#n?c`{qJfz2pa@nf|f{E1bJ~1!BYydvjAg|W4|+C ztcLuEjmjP{tcHaV?*p~gCc#44_pX_^c0*}fxKc@JBcfcczwX$c)up1pt-oUhh3}D3 zV!6WL&ZXu>PeT>dN`kW?5TN4Atv}g{$I|+Y*Ap0pHjG3gA)y|>4_j&8<0lo-;Z}7i z-?JRo&da+RTh=BfB$V+1aQq}1pEvjxPW^daqTPmZ^XqC$OlxwhQEyZm9(?CA0=+!c z1#5~aB(C)D&`y<>Uw^2pw{y@~-n$FuFt+y@%dvMNyxbYboI0MW3!Mje2xo8to##E7w>FmHu)?idlFIkhi7e!JpO{-2>y)-SlrS;OZYRT&*TLg3% z)=S!^Ewz`fRfh;&x<*}6bmPge2Ugo- zdrbYqadus6PQR~}C~BlOuw`-9rI>Gd;cwdFJyyf8g#yn{=q~N+@AhxMAb;PFV^M88 zxkJNYI;ZJwEgI(r4K8r{s(CA z?**5stjeWF=9~@7r9y3zZMk#}yF*&B5iPie)5o~w0tntNxw({&lhSzX$h|jLECwBLW}2FYiu7QNG?j$;h!PiT-?4;G_4E zl+T3RH?5RmXtaFT5RznM+xPWFNbX;yllE_N65(gtX?+or`wMl_{;lxfSvST)qdr;P zs<-&`0o+eA=Gbuhf^bR3)jDba-iw27Nyc0|tuHcAUoPP5uLc76w5lKD{nq_Mrgh(9 z#8r6f9N|yqsQadc&wTVxk}*$LYyZ9~_phU~! zkN3B^@cFuR|EPsetA)>rOxCY^$*$h`w=CXY6un_xWniOFF7DSKQ#ZC*d^l{~Kk}4y z-{Qk!h!o+Cr>zRCc9%jFk_^5oKKAnuavz=M`g}|7g9z8B6zOcALw_w+-2}PH_BrIr zy1xSWX8WS@!?TS1ynrUNeGYk8q6oVe{gUl-^ow1t2ws-mw2xr#xa-$VgP-%2aVYktVj;r9*~y4jg_FW5VeIX+7&4dZ^^ zg9Ngi?sdMIjvw8=wiUcbxC`aym{l+9;YZsFSO1M=d8#cfQSIGpm1EodOiAA`Xi3}0 zul@Wwz^^~y*WLWOhhHQ7`cr-#Nh3w|Bu*N6D^ zm;CxGejVZ0-}CFk{CbdI|H!X@;@2nm^>6(8cYb}EU!URE!~A-LUyt(ZbNu=|zrMh) zF@AlKUyt+a34R^p*O&P9B)^{G*KvM5&95)>>p%GQ6@Gn{UtizTfUcv@)RAPVc(Ztw(tLk?7NS8kB{!p%l7^M-k|NY2PfgP^W&ZaUAFK4 zcbqV1e;!p^{tfrs^dJTeS8ckaT;tyk~i~#BYs-?-`3;O{bpAd-elh1}7H$ z_i$o1W4}&utee3Kc}LA(-bDJ@(D^gLO+OjqpkL3o&tMMEk2_|e>;#)WfPY0lt6*o4 ze{VLu=hfdt%1tltIq22%-jg~8>59dW2cDudJS!XL>3N-(W-R7Sd_38X>sgL#z~n0s zfw8XvV_yR%&jDj!1IE4v4BO?0ZOJvud9C5?>ne|&!%Cw9*3db-k#Vzg6?xzAMeF#5SIA&fS{cAaUI)HAc} zbSloY8E2wxrWnOByi7J=5>6>EAqo$%E=l=i=>~mup8m<)@ z`q2;l4!(EA@KNzS+7E9o-!qIe!0Bi&`ra`BU9{p#7$ zd@F5QzlGLsvGrRmzhI5^tIFdHrT^7p&S-{B}v zx&4F{+hTo8f5+m7PJ4KPk50ecRsL>Q`G;KPKSA4NmFF0r?@Hg}N`F$IReK!c*ErG~ z!`+{kYkvL4jmv*fmuO!1>zV)bo4Q{uz5kAn^~|V$dT7nc&TD7ae>vgnwFPgzvcC8$ z%U=0jMoxX^XMXeE_f;&ech_?{eVGH7IdGW+zi$rUS;P2@*DYAKX3PKP{A$JT8=uSV zUwjT+?&FKk)5|qp=D;5k2l96%Oc?2iUmNdBHI8|W{9TC?3`R-%l-GD<4`w54fiYkV zr1N(rO&GUC^L>K}2@f(Dd~zbyIPNv}4$VmPYys?oYch-nvyh&d=s|swj$|1NhAc-s z2lon@#xFk%4sU1IYsKO~@YfrM>}je5Y8y*T@JOK2A;g z+fo1VjZ9~7>e9cxADiXwGuB)47MY>_2=#@NCOChy>knr62%o|F*SS@zj#+- zmhmpk>6rf&@-H!w<%M4lWEqQhrDPfJ0Q;H$W#$_x9%4-Xp2{+24jPGl+52jZlfduE zjmF&}Qjbp>T6uM^v3^8S_`(bl_<>(O_CSC8&lSH0=g<5t=*?pN=wIJp(hPQ|^e6j! zFf)r4&P-SNEYEa*`>&HIFHCbP)!+VV66o`gUn>1eNwYrIAFVHYCd*5EfX|;lcP9Bg z-)cWv{&mpfH5R{ZUZzby@L4dJG{M;Q%sHrq`Pa^$@64a|P~uE%T{R}mVWDU5Eyg^X zUzjv6o;PQ%13qomLrF6!aY^}@0H5-D_AZ$<--drF5%kZV$vI^<@k9UZT`*^ko!>db zSp1}Cwp}0ivG);gqMhG0!`S=uJdd4jpN0NU6M5A7tCG%Xi!pg+H~( zlYcxpS|9m40{PeSjY)X^x{yvyCexuFv!-ZzB1rRJC-x*3@Adl3)1<=3W zSnc;08GD;&rFcGPr61T}`0knQpbzqW&)g_|hsM{a=?Qh^JmAxTl`Pb z@LkCc`1?HhT`~Ph{S|$d{s(>e?W(!kN!}RF5z!NBHOd=5&NUVxI*lo z-g1vRfE9G%KGsOe@Eakh9etLGItc0?@c0_RxJNN(K>L7#E=`>jJ0?4QVe2IVK(Um`!z@sjd!d`47W(B9qOH(=25 zQT;3ZFa5XuHwo5wV&VJC1d+eT6+JVw{5)aI5do6&siZ&KreEQ&#-DjVH!ORp^Zzj`!?tf-36M{3hG(gkFQi9&=`s0F&q}xRDQ}T%CqF&;5vRSl&(Qs!t?kA0 zF8lJl%N{+W_-osjhn?_{=Z8H}c{yHW+jkrOK^Odk4tq}iJ>aVUunYchx}$!;Tl!+x zf6vTVdhbb!g@3QAer<4 z9riKO!0`eCf{)05LgL*YHj*V&uF}+x^yqk!K>bL9rf7JMFBwt$l|X$<6aA!r`GVJ2 z2Y>B^G@$&oeM5;fXK(;f%LBAuMgsLs>+8%QTu0{9|9fF0#useeM>0X{%RaaUdVD;k z+OzFD?P*A@CkQ>SCP@3Oj`n?no`i?BeK@s9{9Cps{t5WKZ)k?cXu%EA4}Tx{dgQ^Q zOv8W8A2gEKyyc&O-wDPMS-ApzKR|y3lLcSH!WZ-;O7j*y>yX%{;eW*TW_pY!t3A~3 z8%#DZ9NYFB^mt~pTKS-t^~q9$qdv8Arua+vnHv97vshmes}uf$KJ-tr^v^c%m-Y

+BrYyR@z>hUn`yaVR+IQ1)$N?|-YI=Y#+qdo66z#w2YQNr5pY%ul^zHi` z@Y24ao&$!wh1_9$=8_D;ImlL?@cK8`=r@be@U*n*e#G=5flG@s7);GQe}vGn7JqrA{p zIDLEl4tQx#<7c%e^KXZ|Jnw3+*il~E%b&hI!vQbtY5c7AGF4XTr$CX&N^z?U@dEX;0&4wa4+x+1^)N?VXeX#$n&)Pv72A z2fVbW@w3_!f6vi>$6f99JIV`voWM=P&w2;Ew5Rd2+Jj|^q3@WhJqZXo`;P^tY43!L z$ci7*p2p8=kK?NXCDu5Ac{jCJ{pWU+|A)TeMDNKAS}J z1z+vY{gMdpllmHTyi??D5#pJK@^8mfykx@(0tR{_Qv6 zf56xm3&L7IrFlgk{INelyf6v<=UL!Gyl|tjKBj&8Q?c;-hOo~F4wd3xmXQ;*{6n^J ze4}9wiZQ7(jCzCdi`e?Tlj>iG_QZc6{bOEZzTH0R`vXW{`uH~)iO;q8m-x3hV~B0* zv<&Weu_4kD52y0svl##F@TZ;eZN$IfUyJ$D@#NTeb`j*uXV9NaKBeYIjIWA+a5rVd6%k_i&Na7u7 zhAh{5u}*>gItzxZgQbj*Z%2Imk7rB}9`SIm%BMGm598_X`1wnSpYO?(3R1Y=75l{z zA2(RuvEMtB?M=1cd+(4pEd>i;QTo!;QXaI@r+^RkgTphl_j~6D69xZFwO<$f$Vf{$ zYQbNN{j$3f6S-eZ_Jd=6MfipC#?{vB=e6Yl5ycyf#E`ZB zh-KQ}XXJ%vVYzj$O}2KIS#nU_D5!7mvyQ^u0rwX(?F16n;LC1$qI;59vjk`?c)#Ow^YX%p^aC2_pI& z%*qtph!5yBgUM=tmZV8vvWNQz*vE?ASt-O{r_(|nwZV}@7H5&4sj^>-{DA!Ag_DsS zu9HIt!cUKfWkn{1f61x5mQCK0HfAwDm5VNt#{MOIq&?tIe%14a#jl)TdMfxeEQ@{? zzrdLoehm{BL-8vyI8*h7@N*H?FPX;=`7i5piR{1>uKz_SPexh_9L%V^LLUiE`4atv zJYoZf8!LAY`BT0 zv(r+r;YZT#lqba+;mR?rHwH73)e2ZW2E0m`GY**fQ4c&$^$+nh3o0k=W2aZw$G(p&GpmC>zfM(y%T&~ z@GP#^BA@%)?EObbFBr^}{B)J?%MW6^E#T8FeaIg4dYP8F@T&l6DI`bB<}eBk^D#DDlM zgWFCyC%l=%l=M{Pq6XlLf^UthOy1jp2lZl z?7gw@i=+4(4tTDIlHX$Qfe+HNRT}35fKPs6EdLVk$uzj1L+ls&H}9S-^3TsQq$lt2 zEb>pKk?%X4nOTo4=|A+>tU({db9ijxVPy{+hZ2o#dOkz=!R+k4>|ma!!gz@DC$rdH zKAyip{rQ7g5YJ(KUI+W_v$O9)zBdARlurx!)CPMBd@k4T=aL@S6VxL0WoNTK8Gndx znC5)Aj?dwty@dVu+4=%`;&{QTgg!~nnag~!u`1uk{TaNc?Au&dewL4QOFr~T>q{2( z0p(-lA8B83wwL-R^fNt}Ih*XzX~=ix8_0L=uaE_B%id8RB>zUnr_}z4qa@go&!qIX zm4CvO&;5W}9z z={w~|mmgN;qwwl{7W+f^S1u;S39{tDqiXHiBLu`F)LLMdt{bRlp zzZ}coBKzt8#O^l&f5Kw^mA?pjTZfE{R@w0TgpB8`?+us4a6clY^Ik2Rl29b6pM573jpCtoTQ{~qV9 z7GQj3`3dT)$oFE|ud_J1UuQ9&UnchG_(tk${*_EmasCwX4IJo2jeJ1`+5>)zNwJ*Q z#CeE{u!rhiFGwLjF_^4uJNb{al;@5Zt90wv;kSl$}l|Jf9kGaw( zTG8SJrYl|SO4qy6t*-PoSGwPo9(JV7%anm@9q4l|Jc8 zpK+xPNL&p4uC(b&7rWB+u5_y_z0H;Gccq72=|isc5m)-CD?R2)pKzs5y3%J{X#+MS zhJIJtbfvjr-3edsO1HYw+g#~>S9;i$KIBRtaix#C(qpdl30L~0D}4rOo=>vm-E#)& zPI_L#{@Ov$l|28QDE49z>~&%Sv$a1*`-9TT{=>ek`%l9#D|rK*_#r}F*navodKavp)_>5p;z0=8WMpgl!=iSV3jTIb`LR_BSh|C0E+ z>3;;2176dgKRDw`?%$O0@|3XPx2S~=ayf(-@iM)7ou-Ueh)e1H%7l;AE{qI|3kvhsZSPuoUi=B@Xx6~7Jfgy zDEM8t{tP?&7y7bIrv*RHl{^nQ4gaF!o7?`!*iVh0W4y(96>Hxi|09NRWH}K~<8RD( zi}3^T--Y)1cZnBgE%cNFoZ}_Nn+iPN1S6}8e?RF>!1~5QPm`4|@#I+xJ%!G+XQ8Lq znf5O9R9op&eEv;ZvhhdQKEm-E;|1c;3qAQx`0R!D`FN?nXrZUonLm4>{d@<>pR>?Y z@64aO(6h#wp105*{|j**f9Q&Z@*I59C+YbMWiSYNfDI)uG@UP&Dia7qL`2NeX-qguF zHUj)(Xm_tFeozD3?sGh*erAR|_Oug{2;@A3>=o<;t0 zGh*d;Nk*)^F3*US&$8(AA*B3u8L{$Qkzva(^d&7+Y0w{)pi^#ELgP@9aT3!L?XTs9 ztB^fhS4k)N_@czTU~Od;F2&`R{#=%~l;F}o8__?7c?EX*KJa^4>h(x3X=bo; z4%52-%wS#~&4Hw)e+pA`k)p~IJ}+1~n`zx1>RUo{W7UWH^HR%@&ci?85x=g^kv!sy zbY8G<$#uAt`cOaQX_ljX;Ik~tkw*C{Q(&#~X7Kv!XMSgFX%e15Y3YL$ypIU48FYFD+Qw~RJJY9tOSe}v%+9Tkb z7%Wu!s>g@HT%&j{@~rflA*_eV6Pdsz4nqy?1@$kN^h$rhe&z*p3&|_#UrFc9 zWFFu5%y=gAZTLz2C=z}MujBE9`~g4e=bVxiyw9A)AM8HO5i_? z2IPDz_)!;+AE`D!3Q|cQcxcg^TEP09{9s<4&5zUq8-5CY2!7M>qxA|@=-|hpbSFQ~ zTRzh2QJvV6xbjg^3H*lz~Zqr?DE0k+M0jF z@i%U`!IlTaD=@yU5O|hR{sxjxeD+h_{<>>#YyK!|9lj8(tm5>on*+vdGG}#*6wyC%u(t@vm|XXMdZ)6<4U20o2>$g-!pD9sN!Gm%VhpFRexjtwgP3b{|WH0*YvmD{e8qlo}<6(6P)yyot1uPf1AOT z3xwZB{Z#ayrT-_7kF3u@zpMYxK0cnc|8rdQ8&3MqX8-bH`adU_o6Gr~=6B3|1M6#; zZ&XNM5eD%*=zp#B2h$=C1xOCp<*~nHzELIeO&w7Eomb2GUX&jN^O#pF@SJZ{Rnb2Z z_$mAa*^Z#)KaM;cC4vrlD3&KO>-k32dC3Fmx8+~yf8F%@U+tFvy6PBu^Q8Zy^NH$e z(mIv=bG})J{Au-{6*%aveYJqhwdbz? zwP)4;d>8${b<%&n`d_y|_&qiKXX*dR`p^16gO-0+|DRp|1s{jJPqP2q+vM#3-#F>N z*!sVc{;~Qf{V$(h|5f}^^jXCh${EXv@-GQXNm|0O=@;D@xY(-;qrUW*1C z{3!lkCqHV=st?ZbAddd8nqL2F-TJ?Z`V^&C>HjL5-rCx;>HjKnThkYB{HMWm&|Cj& zC%v_2r8idp%dZgr8ue4@zv}Pv(0|l7N&m~wUH{9$yXnV&3Y3%nUpeVNU;SUTK=?g1 z{b%X_$@;GB%e~F9!*PZlFum3UYDTvqY9m0BqiTb!6ChH|wA4#*)vVMW} z6(rSq8R4;BGRK+5`i9R+=h9!8>`(L)J^It)PvqW^%OpSWU(H}yg+2bf#Py5v3W?3L zKY$5IfavC|c~jOXfjI^vtxP<|;A3Vum}UEi_$fX}K5$+Pnd3!L@m1=rGrXnv1px6gPy!#lgxJn2KXbMe$86svkrw{ z?e#W(STD;77B)$qonLdk6F>M{g-SjFpvGS$hwGM7ACED<`^3Wr+o7{CN|D*KsrO6)nXdw6|vt-;-yAs zKh6^@Vmdd2#XI}a-$mG8kiqKJ{$=?N&-)CnEN1-^-;?t-p5#Gl2X8lVDFFERg1L(+Z`OGi@S`PWKVeEp&S$Fgn>bII5-L!- z&;IVjx_vm8y;X;Qu|GLsneM4H-Z#(|TA$nE=#R!BkHPKSTAr|8S}xsf)LZk#+%oDD zb%^uDoZyD&d=vTr__a1X*7MRrg~kTLTJ{SZ30~JE zz9#DcKT@#%Ci88PXP&=myh+uEeC&sW{k=}wBm4tgUt5CYaGlsYneQ$sd z7Si`p5%IZ>`RoKWA1>U$_OByP#6MoMgk=RM;1e4!--!OnQ}3#$ywX0vUI;!qP5&2L zP@MLnnEShxeN0LWu5tN;B5lZrena2V(BDpevcFCsSMt^Tx6!7*o%H7l{c>nX=+Da} zy}~o0C$o{XMCr}lz`RDA-b@(}1bz~|MM7^Q;Dw$k=skihHcoo$Uv|=)IW4_8;YK#C z&ah9zvRux3Eq%vjld$W z7?0LC@^OB>VLfFH+QR&_oZ#xr)x741^aShHFdqsf`kEK4m-6*YBR?m2WA2T-=Et&! z#oQn+&mSkhR<5-9g?#LX@h7eF;O9!4p8{WVV~tdfFKMr~-tu?^pPXQ7 zU207JiW}5=0B(X`9FMlW=D=q#gW>%IeIAVG=WY4M{4RTt?`On$OgV2S=M6GYIzj9m z@QLvUpGW=B+j?nV=@0FdwC|A5LnPRtk4N#IKP{hbdzJ=&MaugCg8t15uYdp!e?jh{ zf4P4~=|2pP(x(FEiB2Dze7@5R);Q;jn4eY`DE`+AKOqk_ioZIYS?$cn{7B}bxs*4x zKeB-RmB}>P!~C&8@gL>EADpkx{lu5B#p@*W0r(-EDd{=zuPuMsB>C2O!Tp%IOp=Qz z&++4oq`^<5^McjY#81{I(f?`i-^Dg^4&To4Nz~OjKIOW{r&e7b#tZh3l$ZX&_yqr> zm;&YKpKU)Ng4%u*o@M+g%!I(;0}Yb#N8axVbzz$Lrxq3>SB(cu7p4-P_sBo@c$XGR zRe9|HTt0uqV~i1&{8Ii*wUp&8vA-E$Km0lNhxjuYQorvO@cn) zGb5M*$Dbd}H-tY)l2Z72SiL;5Cs z>O5A)9y|%Z%bFj--r{^#YQ``C_`E>8k7^C{nXH%o$NYo(Y2x`J+Mc=3cjJ8wSH-+< zG&tXRUKQtGed_(JL<;;}FgWu{!4H!@CGUyG2`(^^e&oacEhfk0yb$R31=FvbkF@r` ze8Cxb!CN%V`5jPJ{ekj}cj0mS+dzYL{%l>dVQka&L;ih(DOcI=PXxSszLz-Yk*<;c zMLy=+KIuWu?=X@PKccSBuTWoGNsxs<`sb=&=>DcO^%Bc_uKJZ-p7QG82kMXV^XJxiV9!-Q)9|2g z-4bAq`m}s49!!x3<_Q1L|1tc5e8!yD`v|BCrpzS&mHaJAi)kPDAzqLs_Ti+QA2Jdj z$l&p1)nCX@d?3{zKeax^+Ji-656754Nj}u`9oU~QJLy>vOV0wFhom(V|H9qhpl9)5 zn!Ha$=*4&m`s95dGM|3{?>h^6Jn1Mull>J#5BQ1au_oT{qUZipL*&J>53%$p`#y&H zob)Jp(*2Wi)lZ!CfVsmO9`eicorIr|^PMjFg+5<6J&-Tb^IjJ{@4ZlZlt0M+IqjsU zJC+{y4=voq?;kl2Xe6F;(R1oT>5=oNqQB!#dN4S<`-k#!@%u;4v*Em`i=KxrlpfSa z{o{EVj0f7@x$ObvO~%iQE^kxYgR|++QJ`z<&!CY){nqw)om2l2{~`Wa$iMjgapC%Z z1o&wD=|2zaH1wPLK>9DfK3uqdAJO=6ym09+`I}9AFS>kOIKGFR_(DJXb=tC@be-Qk ze5cn(p3gn8oCv|+0X{L~EA$c1cXOThbDYpBmZ<2ny$PJJG*kmVim`P^j0i;JV@ z|N0ppFNvO)%O!s*Bow0KA-+9HQU4nFW4`7UeCe_u+lX|wSNs>I<#~BtFXc;Idh{pa zZ&`DZk~x>mAG5ROAx)i8^GR6u&)L47&9s=dzh zjJ{w^CFfGs`V7_+vWk(!d=DSQ%X7kBhU2U>;xT)ws#N{;G9NVeV0z8=g@2%TFq_K~ z_V^Q{5A@G=;ds!yKp*YPm)W0r*{<_~*|FyZGqYpmzaZOnUNAdW-dAMD>Q8RAtuLZa zOR_z!z|WTV<=LKkXSy~!R$s2mj@6Hq*|FyZS2@qe#5pf`1Ex2_b!xu}*M}QcF@7a6 zYseGMx8+eim3+lLFPM2fa+eVV@hmgA>KdlCJo3Dt#8NE&V?HkN2buuF=LJ_S$i<~@ zFV13~^BnE-ykLqWjq*2?O50X>o)=WYQ*YImw}j?K zw}<$f#Pg(%V~nTe$$2uFv`PCh=LNyPwX$CawORG8oB*g2fcn{n;`gNUf(w{0^a(vn3)ufsC(<}y zHcy5Rg)h$wra02buUj75-i@+9P}76+g4a0VVV{;Yp#BN`tNvTHi2RB6f355 z)_Fnq`T}P+{HXCh-g!Y={(ukH?@wxYq!C}f5&RmKTd;qS$3M999Q_-Bor53!&pP?x zUVm`&BhzUQA-`+Wr{~AY)#yJbKi19^=HRQH@!~uro$F5pnY0}u{}@jo?**)1M#6HE9k5#Mw z(B`8TEF4s$N9=f!HntoQOond!~Y+9?*bk7m7j+V2OtQ506D|}phP9w!HlE< zNlBzgLJ~!a7=RCeBuIcyy(N&6wY%Qk9(IIoK{l;Htz+-{C1ztMb{;LGI*Hr5DNpO3 zI*F5|ZQ60x>z2(qbshJ`s5-8X>m-chB#xVe{l4$s|GoEr=kdo-+BI`d<{VM@&3*o! z_xa7G#5iAQd)??_{Oy>s5CV?N0FSMFCs{trg?I~wO3V<-~xf15PtXXboyztZ`Y_$`AB z=MxS0S@`<}0l$?o>ek~0Yr3D%PT!obhWx7ifZy9M*>uZq;hQ19wM>2`zXIxjzOnv$ zLh{YkTs(06|E~01QT{c^Z}nLUtyXaC0k56E8F2k{&0 zf4}^hIyU^44>Z&N0s4>pW53p)%HM)tu8%{0)qcS5?bmF2qW@nG`Q4x4|K*hav48M{ zy4*b8Ocwfc2hT*?GUJCwSg{`FS^Qrxi|JP9$>4g7Z z3i;2*OG%#2{|}TT@7DZh=)ZA(%=)~&8~^wE&-VXJ{l5|Me=Fp_Q~xiQrGMIIJU^EI zPicPysR>?qpY%bxssA5{{eNFt9##3j|Gj_%2N)mP`M>rj6a8cTr1le<{O>zHT zI#d0FJLf@bPAIy3h`f5d;Qmu?zG(6bA0m0Qh${uppn<^OOMfem zFIK<5uKKJ#o5c71N=J>MeA~?L_mh{vzjgonlg#fOzmOOCz42XWAmDfB&xQPU>fbmY z<$8(dl|Mzi;LuQn7c>vv@P6{D@Pb3;Y+u2b1I(xJ$pV4dFy-{@bTvyx4GOFF2E=)86W* z4gS;0v**2{dB2SMZH^Z#qPPj!z$-W61<#bRee3X>P4I&ISb^e=?q`>^K2&_c{AjFx zPWW48LH|ni@xOAKs5&w$#W$byDc)?n)py~_x{{m_Z^nLSZ9RK%&7d%bg)7c z{3CyBzn%cUr%`q#$M#_FJfBwk0l%ex4`~6vH~%|k*8J)|@Pfs%WKVsvy#~DC%#6do zq5l}aXNaE)@PaHpSt;RP^4B?Duo&S5i=E*Gi)ScbJ0AxA??~C)KfqV8SBys|f^__T z`>`|ZutsI!1?P%$EY1(|!l-ZK8*Q` z;&TcwIEdtSctOIaQ+Pq(qeHx4Fh6X87gYO!ecr^>F|^N>pU&e8GyiXf7gTxrpYVcQ zo~(RB-(kE0e~07`e2-QBQ>`+Ma|Fh-_&vx{eY$GoSEGD@7o4gZ`HO}<6sLo9&_h#U zI>tM#M~j>^n){wwe-4pGd)R-i8u_C>=nMG3VuTkQ%D@W_$=`COd?Q|PYKr~SeFf;Z z_q`#rcJt#CC%kRPrv+qy4DEfUM!eu+9mzrb*!kD;_`>Li@n$QFGoAL0^O_oITOZc< zgF~VrHQ@z^NWw%((_aQ-yrA-rvyAkm!uZGZkN9<^QUB$pc)=;9vzX%V5bZU<3l6D% z3dPvR;1oLqo3V6p5am~-W7*H3Gi<^5o!Qy;hYFww}5?Q`g~@1=F8 z)^BJpzuYC!CiZ&ua`&U%cz`NdztO*LvpU;9*0)ae39qI1H@p5Bbp`_jzK`jBN(a6L z{m)+k_n*TT^aremk={jbN#rr}*K_PXKIkvjAF2M~Jv+QV^JsVSUi*i@qb+wmXLZ+-}dDwf6?eq8joi1bt_B{_~ZQ`_rBau1n(&{^pES^u1C8+ zw(>IXA9b1j2p@y@&ANU2=x^c2`yO(5#fJVEeB27V6ZD7n9lmeo;!~^s{O`^BBfJsb zFN^x~Q+*GGc+9kXn)ipIb$BD_FS9@J57|>nKFRxJQGb56?;(dDU8Q_BsXwTX@n|*r z`c||4wAPoyr>?R;9G^PU*R5v#X{|4ZUtMK?Mmp8k&o%2$YkfKV=_>oPxl?`pOtb#9 z)|bPNw&>3#w4eAF@kq{oe_i9}#af z5We4rc)B;jTLIt138QNd_@`P(10QwB(x?ybYxNOtrT4WszFom==4GTaXhA-Wcq@48 zD>fbblUFbAjPO>^M0l%R5#Gw;tNu9lJI7fb`^~6M{VfCA{od{fZ?z}FTfLz1JlS6@ z)z|BF6MRU5-s`+*?Pkfc;$fEo6^tXQeXXcj^ zdrSCJ`5})={rSCPpnd+md!GQU{E{F3`YgUk#?vb(`Gt^1$uD|()0KVwA^vLY%lp?m zd==Uo`!cqVn4cfi|M0T;>79L?-+&%l>fenNvt+~X@1@@FRr-2bqfN*AzV!n5ZU3t;ASCjtp%flIXE5Ku3$99*;TMb8et6}F4@{i(hgtr=w@K(cVyj6KP z!dDGP_^RQweLpuG_*?$!b`e=c8rHOKqtAa*T(PI+FgPy|E`*mNg(h`oERN>-+!Y zlhaIQI_k&%)n27Jd6av(RxdM)@M+^+q^*3>zwIT`Nq;K!C$(Nzo9bVHmqPtGFYeZG zVEcph{?o2~<$roCOs~|BKg<3c#DAv$)!uFRlWm&*Z0#bwl{D(ddub)ossr^^>eJgO zFSViiw+$R;Ubc_*3(p%ETJ$O7yrF)0Gxh7^QE?l?JAK@=f24=$fqtGKUBiF0*ZlIc z{`WON13$Q#_Eu)P`cvM>x^*6*{vPaMx|iq76QsR7=bj_~i9E5twVC?!{2%QhE&ipS zV^5G4|Ehml_g@nJu|J~oQ_CO5t7l)}`1GvBk8A%4Vwte;0*60vYb_X1=epk-G8tlFr|6Q~Ue}`sIE@?tAe!X)BLAe=(Ft`}1V( z@2fs1kK-HK%VY8gT3kVE$$k0bDo;9)N4URFdy@WP|J*NQ{jzV-71`%;`oB$g`62(b zeeBSFi~5)F-^4x&e-d>C^0@sMLV0v-9|Lo!P9E3PK5DfG-9Ad+mzKxPKOf4YQ~Rju z2QpjBL-z?+D6s^O)!shFi%#E0|1lm*_Tl}dC_I+zsfB$gR<*H@o!^hX1@>{{&xP{n z)IR1mw6~9gJl|fSIIKM8n#rRq`zQXp@qCE&hyDWp3x40T{rM30C)K|;@~C|k6$bLS z{u7}*I<}92X;jzRK4xan{}p9v6Hk5o_|DtM0@jeBJg)tCD34CG=X01Z9#(#qG2<)9aK6#-ep~c=&IXTl*ztd~!uSXo zYyQ}5eARuKfPb~0(3o#r`XQ7hZRZ=8ek|nwsF^F;^v3sdi_z~7H{dZQ`GX?*h~F~E z@V-D<>n-Zk&KD-hOQ7#(m^SJ7J)-;D%HLwVm}FfEf0$3G{e%X;i$84BEx#*28uEK2 zliwYz-_5ToJ0;&-&8vC{V^QtJ)jF%EM+X+FF^_+D;G`rtRRhbqXnc&sV(V@)}K zF!yIT=i>UYng35Qjrykk;SXv*q3QqEY`V3FOMfbqM`!lXO z_Rz%tkGJ>#Lopuf_#t%1^IMVr{eHrsL*$h<(JJ1>`w414;CJ!IP?mIJ|34J+8^71l z#g_2#`%RLc8~Tra|8tz82(#M&9 z`*4KE8jkT;HRh+i*mx4*v5u9Q&JXOjRIeSRzi53fJl52~X-6}Cd`~S!A1ogXXqhy9Hsl_N;n$~^Y{Hu;0~58R)u97U4q zQ27Qt)*hBO?QuWxjMh7hX>5=EOP4>i-Sf-+-0?H%{!OROM=;+SSASTa8Gk{Bc&u~V zCXu8%)n1IpI=hYYH_24}kMUT=J-A?xPtEo>#$%nI;r_RDruvJ!&w|#RP;_~gym~y= ze}G3N=bXT9|1g3c%BSAmhl#k z$C@#+xAubj$HMn`Jl1R~JztOUS;u@j?r(9uVSd2hjF0(cS#N;HD)!?BgTog!#?NP; z?IwSWpD>zy{kXwCvVWNW6zao|X*>`UAuger1=8rYnK;1jrCd2dx1Va3rC@>x&w z_atAL3TWI17$!N%8W^t&^^wO<;Lqg#W`0?b)5r_y#5buu%OBTkyw56oMt{eaM&vI1 ziuVyOy!YDhxRY-e=AYd;osC=jtJFtoEWj%w%s*Ct{h;9owBpMM&wp|+FN&?R<+W51zir~5-dmSZn)&_fl;3l-Ptn=)8=mjV9$N5QyKd7h zzt^vZ{KoMw&F{q0bL?7xuNtT5js2p%v8Ao-uA$-oc>i%6=humU18+5wqkSu$y+iw{ z%70$vci-B9`|P%Tdc{SU*|L64HN4M0(kb3bV`HH2+FwH5q%Hpo-{bhdAH0?DNv-i# zBf?wx^Q?*-RO>Oc-wS!{M^}>lLfX$=($+s4-)DQh_!^UG50E$fsiN|vWnX2GE0ZI# z7o9JuJ^6?Cmlbbc<^4?a`-daqr@22dJ~Y11ruGB*UjGmk2J)>1@?DKT>GuHKe4^pK z!`GEgl^K5m8Sa-ft`}bC_=@ayy(~QH>uVFby+489*HJcww^I87zt{eA)D`f%@Sk{l z>im7Sk+Nh@{UM$;;;l}caQGqU6XWv<{$4_Ww_@>6g0~up@Kz(8;jKnqE29H;z6-q7 z9N!x?AJ}WDUVbh}2i|JoHFj8|tngN+M@|R%@%szUF6s+I${$)dl+Z|rJdZnhD*x;$H-A7{TsCx*kkFh zAVXk}rT@^`V*_4?@3E;o{p~T1PkfGb0{ zSIy}6MXfzR|HHFEI_M$*g#0K!^gCRoe207SkGb!u^=6SY+9STo$Q${gAKAgOXA=I5-@o{)s3FkL z?Paf@Rp6^^|ED0INxTP|%pXb9KZ?Rvne$SukClHMO;Ua_{(<*_lorI>o6O7p|09hr zGfL-IinqhG&j4RFtop^H#+Tv@Mdjn|ND<{%q+^plOn+8>$e;7I8fdlmJ3D00${X18 z-Je2oAg{YAdBx`s>G{golKg2><0bAN^vS>2B=|#r`s$PS)R&g{s^SZ2eANs3sk>x; zzNua;QhNcu>V*hjRh(QwjyCwJ8t@~n-(Tz9;_y-*ZNz&5`P_{OG-&4sh2`}RaR*ZU zfqoIc9_t0I_r(}5K99eX{D>D5O9o$+tanoDE$9R9jcsxG9sGXC)yw^lb`PLJyZ*v^ zPg@+G#`@14Bq#l0`_zEN&lvpFzu-48Fyg0>-lKHj8(^=%J8f}zC#*l1PJWX0Ces~W z=GVbbUoN+ZbYm|up26a&Xn^eRhs0BLKg6Lv(HHPk=6*SUALTda*W};t&#^zUFZ3t> z{`#CO$l6=lUksk=8uMHEH}zCtAJNd03-Nl#XTsOxTher(kwG}?{EDALAr?oyg9=GeyBGQxo&>w3Fjq#*u zJi~&kv3;Yj0{m|?l3TS$yjpua*H9;TF2vU?JQwg`Nqqb54Zwc^kA(?~`Y(JJ@K{NF z`KTG5s}|w8fY(a=N#*hWRV}O!_^ZU8Q6KPJ>(h8H3|=Wb7w}mquKsZU^9r=Z%{tmA z_9L%e240H;KJ|@Fv8$JNM|dv0@0E;)N{{he*sn%$Q$O)s6A_;4*$B@ysi{LUf57~G zNb!|cacds)^AUp&BP~4F(2&Mg(VCy;`_Y`{T$9zvP8IABcrN7MHk$T_=SQ7C$v>t>Lx1RfZ(6F;ewgrF2cgN8$!YF~U_FZS z#OZ_ha~l6qAG%K=1H^nD^eXUNBim8*DV8^QF71!eWi(PcrJ#EqH35Eu|KB!M#+98&I9_Z z$j?52U-Yj5&-Db;ll~CT#r~;H^{-kIwkTJV{Ws#d4n6JKSN^AWxcs0i^%KvtuiB## zUG3innr)i?G~l_OV7ls1{zKc?AGM+Sw+(2&n*G6g5&Ny%7+UlxbN_l~jQaKQXk^wq`f>( z3SXDV6TfFPM*VsIkN1$?ivNr}=5#+z{NJMd4oy*h3IDJ+o&Q+=FkU@B$?@s=Pk`sT z`Lk$%LPUE!Zz+8~58|dhZ;sDfx{$^X{2TL)W_T{ApCle6`9Wj9Zw7r|(O2J;{vNpd z_P75!dKbu}@VQVP@p()vj}ad)VUMNyi4E=LF~#%rP#!0oJzv!M6v*`X0qsHh*Z$2& zmG#TMMOS2>Cm646y2}swr_bYdXn#ljW25j7?suvEgvS2Zoxg!J($+q5pAF^Fv3(4j zL{*A+P3>cP`a!pkyMGhi59D$8yFz(%Y9H0X_VPG*FtU%P{^HM<#z&mKjsD~FTG@v` z{~8gVOZL>lJ`}4GduU=GxxbZ`$DMaVd30(YCpWa0$Kk_~eVk<1^a=c>&3SH>^@sif z`Q}bKe`$aI#QkISuZ=tke;XAB_Hp~|P#zuI$ADsguIA@gs9y0`@$_hn*LmRVqx21Q zH;~88i=jL^wT~))AP=8f3wazn7THHrd3gKy&f|r5-bD8UdEB@V%A-^JIJBX?JWd=h zr^lB=Y+9edUwr(i#_>bvJ)yraR`~Z8+THgs>&7_7d=0 z*-d?W{K~BEfAc%-$9*l_4>tOqVp_r<#tXHd(BOCHFWPj=?~OM@erGfJ4fT!R_t+)* z=4vh;IQ}i3OZllU!@u+$+B^9bKYqTn;`LpAhH0PVK1QtXowraS<&p6JM#z7*y@&e7 z?`7_hyj$}h>AxcV`}o&*KZEso{wupFAFu!H@i9~XzZCKRddPoP{Hvt!EMxWb{fs7f z4$ddd2m5naFGl#5s_dac`_O(yeBZ5dknT?@=BX%#jn=-0l#WLq3QpB z2W3P1e>LQHD#QQp6VF8b8vdnkZ~xOV|I^S{;Qt2CauECMW<51M-Hw0kzZ`_Er0`s^ zzIXmg#Q!TH|I?ZLOP)5~m+FW2NZz?xtN53p|3?33ecs-U|9kys`+uhX|8B(p%OU@r z`hU4Rjq0@D6|X08e`l<&`7v`Oc&=m82WiRw0-<4yWzj%36<^RVNFSI|y zA3$!4=i>dGw*LQ3o1XapOQAfn@lByUH1YovN@pLM`oFO@& z$o-TC|NmCR|GAL=PW}JHo_K#Ln*U_zztR7r{UnY5UjNztpQ-;}i}*hq^55S78_zcn zk9L<(AJ5x_=c*ELh zit~cQ^cSs1h37hWnDN5UOs_sWouUtyUA+F7@uNC{@y5h_(AfVMK1=0qeSrQPJIwf^ zkJ77^uzvhL*xW1Zd~tKt`|GODj`vOC`;^jA zV<=xgziIIA==TXK!Y6)``Mu*8@*=;5|2fU??S+uvPW>DHjPniS-+W(dbTqnC%( zZ!LSp_+O}xKBoOrhv(Xy)BdOA#rqfY>P~Y1AYWhb<>4kyvn&BKNt&}hF>-z+@kD@?a|F8rLZ+0S9Tte0P6dEs%8pYb*(zZ!V876#szd+8nKS zWQ|B)ap#Lp9^j`5o@=k;m-1Swh~GBxZ!crHjMB_+-=zHZay&BgU-2uMHt@Rx{!#Jo z#nFCXA2Gj$Uq@X5zqgNv{KoMw&F{q0UUn_Sb5Zoh-l+cuJlEcFoL?vY4LsLob3c>z zYw%q1A6@}#j_2A;afJ8hH-Az*SK)s}jRF5FM;-s)20Yj17|$gK)%@ia&!;!%gb#A# zXBM98&5<`KE7}9~3p|&~la_t)dDNB3&9WEaxzwKgL-r$oS@HH&evxT@|8TSLT*}|X zzMA2=)PCSkmwp2k2J*cW$agjV#OrW=zqkR<^`_FPGUHDm!~OAw`2+(@>E?Pv3cS zE&f@BKY`yjQ8tC=Qu_hFi+>+=1^lkedVA^|&$YQM*;9Xze)hsZ z{F@)-uhdWNW%?=7@Rv&cw90FgMmpYWEZY%U^5T3WjpsUf(#Z?*#D2@UqpXV`l|ORE z&VW=N@;vF}sr<*zy7{Z}2Y4{_2lu;99Wu4q`cBN7^)9|_isu?ZayvX1;jO9nvw&Z1 zkLOCQXEDFM`@f;>z#bQ-oIN(hbE!PzkMLY45N}t$q3?v}I&nhwAKmtI^@@D9#{dmOr8)RtLPZd*M@xtJ_ zuKgcK4)l{d==H<#dMk@F9sO(aUY70u6y!4rJXbP*Bu)Pq5uVGOACVqceysteFILV^ zGJhG#!gC!}Sr$>e9i@E+c&<^^PobE2I&zfq_3?J|2+FTW$BMTjqx5IxCx2g4q`)`q zkD0$HujIw}2mIUriR3_DrIftl^M~|&1;1~g{%X9$eXhP`(z%-2Lx1|}Q}@)DmUym_ zNusUnd>rp(O-?d2C-d`7^^p;3FTit6MtH7~DX@0GcrLsT^*Gy0-iIQdtF{MUP+pK< zq29mcA-4Yy?yZA=tQlS2aj)>@ocT>Y*u&`ZPSHDA1a#`XEYSISw|U!w^2Pdw`natP zQDYyj{nNOQkM{WfF(u695b4x@m(tUCF}{DL{*R&|#KZ4@FSn-aE^9!*`DhLAv-jr~ z?R&{6ANwQmWB(?RKl*p|@`eFvSo>jJ>HdQs;=i1}5WgJW>fKA-?Va|O_}gQ!KXmV2PjY|tVdP|X z>Idid_r)(8puWKGW8jze-EZsn{22Qw{CIblW}ieGzxpS{&a)g zwf0n~_wfk+3olPef5O;%C^TY?;pkUPToCKkK%ii{%C&rG#h9Y zAF}X9z!x!oQ~%ok2cGEpkdEJv0>0?6Fdg_J4#=)N@I$=3P5Pr|c%y?6-U#?0E?``F z;DKr(4Lr~xUmx_}-5zfQyb!XhKJL#o;Eg6CywS4}-srgyZ-n=JQg|cat75#-^AX-? zZ-h6RPT5B@ypimUR$}o+91rYz1@on1z67esuPokZ41a2lAbKeO1Za;p+OPW>$`5;~ z)L%TfE0zD?K@O+N4}a_&Z-nPZKMQ;8{a_vadF;!z47|~l_@DB4BU;xa{=;~?qZ!_4 zuTR(eQQDC9c%xb^jW?R?6mK;BVBwASW#Eloi10>-BD~RIg({CXI)X^KGHLD~aKGiK z&f9c`rud8BZ&$!Wya4^}z#C~lT=vZM=*){xQP&(aKGyty>o)wUIXq~z-=niDlOK4H z%E${yui!uC$9l}a7X^F9{f%8ge$;K=?is@kTwurr7?XyQ+LU~%{yiwkXKRm!1J}Qqr(OHX|MadP9sON+f&H1qe?~u5 zy${7UO@A8jM$b@xssr@_Kcw?bwW0dA4J@!M+sFI}`+?gybn8>*{`|2gs9&#-k!@UG zX?>>pj`uTNHY0f)-c35O-~93m5#H#?6SOxgKhz)Njb{6qZtV^7o!d>?%k$Je@}I~P z_^T(VKhOWke$rdZqnlamiX82^(Oqo-gv(};Scl67p93fdLfywVLfBy!|~dj z2T-1F{(<$j@P2UPeQ?(A_a6-2 zXo3C@|A4*d{6zi$`Ex$!?PCYla}`4;_Rz#W7XEQs9@ln-^61z;2DG=Ct7$!*x*sb0 zXuy*^aCm{myJ>l>JQK>JQ~Rh6wwK2d;tN;MV)9;6Q+fFN)8Bc#(WQTazR`ZHzg*fG z%A-^JIJKd@JZ5KM%PVLtk;f@Etxw=DZO$93tUvS@$TxS&`AhbFD)q08zpVToDh%YY zxFeKD$M!Lx*q^Jl@Rzwc^nV2{Ch~aT?Bm)$Mc)E>EIb{`qf`5+4z`!ai4&21G?j<9 zkMBI*==$%c|>^xzxepkIKHs{&|f%~c)U&a_@e%` z@s}I_3>60UvGd7L9@+Mx?coCI!2GXqJXx4`_JI92%omR-KeF5NRFL6$Y6ITr80T-E z|LPvdGw1IcpUlJ?9b;Po|7t&>G5@;p&uzMmpF6jQ{GW{OV>He;o@M<3|F=nVerE7S zhm_8*6d%hV!}&x5-slkd^ZZtxrM^AB?6~gd^E-+j2pf1WI;eTt$f404c`YzQEJtuj$=0DPZMf&&gukro>>+}3qo+ZCt z|JmbXrvCqB#Q%86e^&gfQ|{J)}jf5iF! zVZELGxoI;$!^(g!DnWssA5|@kSB; zrYisU_=_Wo4~z-T?4cR{Cbowg{|04)@nB~qw1;f`O*kGj@&BXk{eLF5|D(}-Px1e# z^Z%I{^4iM&$?s9hqMiTKxB`A_<&fW*O#7Gooc*7e;Qbu!2U`6{iyr|A3~SVAKq_?^?jY2)gk|5A^)BF|Iz0p?_ABY1;@0$q5Oq6I(p2F zN9Z5!Z|zlmN+*4+?B=UT2R`O`%8PRh?#B{uT{uR)g z6N--Ck2<8^+h>jB2m7ZT%H=3etdi>FXiN%bU zynpmH{J#(X+4GnDvMjj+e9;Rpbh9|`L-77W{gi+23F}+pi?lx);ES~1Ib4!`O)RC~ zgUZ*>`0|qX%QCG*-YGnh_&v|ojXW?PYs44572%6sKRK!bHTWa(MQ^;~Y2u6C)cwoE z|C`~9&ak=UK2ekRqIf?uXZg#<7cFMtiw-l^yvaI+FS>9{^^;aS+064E^CptT7hPZ) z<2C)aUVfG7Z}2@wvBiDI6ejO?gHhz4_!3-Iob0Wp66=5LjEwH zQ~LqGm-09Rf^wQ>#-#FgM`;Zy&3GrfLNzcu7fG^rNj`QjizKHfM`+bM@Q18lc@OO8E@?X+G`<&gVPuiXvrV_Y zwR@~W`=OOd`qPEA3EkeGus?bMWmEVfwIBG?&A~LkrD5k!`A;8Tbmol1%YYw@zh|bv z$^(QiTBLmK_y&B@>GEmO_y_ii`$PMJbl{85FVg-r$_iif@@8BQF(2fw)X(l?`dNO1 zcvY#NQ~7hGkv>*`sr(ZE<_F_7=NoB!(Wz5TUP#CO%FA|!W6RH;ck@xCL!PIcJeB{% zOJ==}`qkddIkTPsjsD=i)mgKCO41ijFW^soaDK!7Ea-uiuPA=v{W~Ooy7(fs7ue%M zA#IO$2b?`N;8plul*$*-8 znyVUl*R1|W@!%Oh2|Y3wrZ>YEQ9mKR$gNkQpHClOG&jfoeLL|*cQ>W=bA5x?&jW}r znj42a^ijOc#23wRzU$+y!52x#<~%ABU!=T&J(u|SRWM(UH=e& zv{M^+W<7~`_V}}CUh6aXYrfu-`aPi(-U#cP$G<%EOl}d=Gv3c*{KDET#2e+8yEOHX zKG2`k{uXHB0ZJ5*oxk9{Df51WUB5jJ{0TKQWbgmQ{Sp4?_m~3#>EkZqg&uMEBJ-Zq z<6THi)|)9j5#lrP6>R>}Xr1w<8~hu*#k-fxdh}tWAzl5$d^XkpkNMtI8b4I1Z`kq- za@+M-U)*2fiTYWc!4m;L)GyKKAM_{x^`6`Yrd#_>{=H+Z7L z`#rLUEy?=v{eF)xQoLqo_%ZW&%8Stlc$7THPwMYRk`B7CyustUetqK__HQLg*Zx7* z7V1OtLH?9H;qTCQm(w@w$>9fR4-;d*XX` z>JObb?l1UzY^iGt?X`>X<5RJ(_WgzYd*vS%zcjJ5Lt91q=Qqs!?#9!WpN4oM`-$E+ z0v=~4^3$I5dt<=!FkX`u-UxUfB0?M;Ell)@MFM);zx z6uv0GJmBqF_BQO_GlG7uUIu;$&8ffKp9}FtNEbd0n@a=K7yRSuW#EZuz~pay4e&(I zM|h*XA>PQxi$Bi%EFa^IUWo8U`%-wL{PI+4yeic<6*N5NYVe8)@?-c@yO^R2`4Z>?{v&^t`hgnbgYrXOmHK3j?E3t*8tq&8 zA)ove{PkIUk<53lpyU@q8YREz=}lLr3u(O3!Aj4JJy>|77c=li`y;&3kqB=zBh^Wvdf#Xknp~MQ_YH|R zI6Q4iTDos+krRI@4e8zVUPGdjmf8=KRJQyv*CTC-NJsD{K6YCJXBZ) z`5W;@Grd86)IWP*oOv0qm4Ey8qoi&7IFEXw49eO+@kY9zqCN@FGNbp8B%fRKmt*Bw z?8V5ywM)6 zZN-!5?Rx(x=@0Qn?4R0H{~GW{yEPnGdE)mqo_6gk|I@ueI{JHhKl^hG|51L}57qlc z?1Smg);-(s=T_3_f2IDk-ak?u%71hl`=d5g|F!|M-%`_l7xo9YF|_DY=6>s3iTd^W zII)X#ppP!niM>uN?Z4LxIyoPKKDQkwjsHx4XG^phMO_$6zcJBHAO~sFurvxOv}rBd4Dv93)}Y!;`?+})*t!{=x8&4@%GU;zOeq#UpV*h_Ybqj7xk}= zzm)h`WMCgR|3xT|Z2OoXZ+3i1-8a^Fa{82;Z(x58^Nl&>XBiVOK!)e54S1tD&fh%$ z)d|LnId)Ow>p~{pXbxG$pN$u4KamH<*Ag$^h5Y~XkpBfUSG4Ik&)P6!E-W7JH`Mv#5LVmOH6_TIx|7^UC^0NuUzx3_xzX5N- z{j9+MD~k8C&i~uvE#UvNkll**ix3~Uo{IHdcqZciZpeQ&-a_(p{2$vZdAIie4E;Cy zKkI9)|7`!y)c>xC|9>3v->LtX%i7Cf6_9so{KxsySY7jDB;sTIe_r|^-PHeQWB;G0 z|9W{;<^S_+PvgO?;sawstMPE2X^H(ev4_&`v^;M9qfj1M@BNjt#{c8({r_mZJ~|%F z_Z0t+JARKIC9fP4TJg*Mvyk5g|KF45_x3*w`8}F3{+Cnnzf_-pPV#MS|3=?zVwL`n z`WpOye)ay(2Orw||3t+9?}q$$>i@?*Uc}meH2=xaf204q{ZHAqiT_^z+5VrY|7Roq z|KE`R_Wqwbf5&|K>SerNRDy2Zd1L&((W#E{MsYle@J6R)`)HE;VWs-a9R0=Y*U#g8 z?YQ0>vitYk@7kyOXrJgW?u(V(d=)hI!(X7hIL9#Q;}uumtq%~tjz#YWRV$iL*!uAM zRi}8LYnGDVQ`(2hl;*CzJZdM`w zX0>0R@Q?Xc#`{LE>pVj|tGyU+^qTNS;#u`K;EndZ&bFOA;`fc-IJp(6(wXWXdEqtC zBP=31e&6WG8%lHOo#Tz%_;(BAKju4nJcIEcH22r<{B~&X+4DQqXUF>{^SdKTXMat6 z0~xMo8~i)M&ztv+KFR#v@e6s9-@AM)B;fb%{}b}tsegY`ybjW;LhxX-2cSd;r-`TA)y_nF!UmpBSEWMgaU%RZE z&yN4K%P+HaLt{SHh&Q?r;f>y0;C)Nu-}5*Red{$(Zv?#^#T%(SGn9G1xe78_&+g#(63u5D-ZOfe^?wq)k=m#IB>w+mZ9i9`k$WK$_oN zir+Zi$@|ba_UC?w{_-Nb)&bt=#c`ZpC;qMXjA-9E`sX{eAA>i#!0*08c%wU$Y5s5A zp>TCR_(y^_I!NB#c$xK{(c2>znV(&z{Q_^K@}y;7Wsn`=jSkYE{C;8Qcq6r+*c-;v z+EiM;*8};k25)o-{R!o9o3!5_ep~5zd}aIzWZU@z157ROC;dLv+pEVLy^XRdyph@u z_}w|3=J&?`MP(R!`taUbv;otmVJm>y?8gCTf zvyhJcl~?Ty$Cf|#vYU@09r8TmEex2_aWeaHxH%lapgChJvPM~sXXHkZfaMSPGk64`G&p|-sm&|+t?pK z9U70SRiq+S6)5jZ~JjwojJMl(~T)b>VBak20S37^x>*oQ)8=cfz9o;qYHWP0oyuFXN25%%C z%YL%oGg4m42mYkrzu@J~Kwb+edBy9|ZuS%(GhfNZ8y(5Q8%;U95A3T_lY;+{d;nhtX~|S#@>G?zG!i`Pe zUoPY%AuHd)^57c|e}VGJ`zl@i2A@z^?tRGdkMzgCJgWDH3g-S^@96ULdM`WB3-s#;- zYZ(uT?^s0cq`#^D8T`_t-GAWU>j6IMA%~xWyoguYz~U|6KkCh~e~JCacqNQi7EdPm z=>4JV%k16vbI4A6;CdbWEU>thf0`ez$Gbc~27hATs}cTW zP5$c}e1B;VKi=#4z18^sPW)aC`nNHU)-PQ&`kvVu^rz|jG+lnbG}RyI^Ec<$6(Yq!4+{LIdf2Hqxx?*YDr!HfBY_lfa6 zFGTpBebIYD`#rwrqh{|3orvBOdNIQL9Ek8flWDxql_yg89^iL+)9(vmCI+2LUWjK` zF9Tl$Qv6_(Ie+(-GbW?;l}9&X*6~7bU^p_e?C!rTnE- zA1le8X%)BTIsY&9vwxcJ5#LiP?R7Ng_hWeiV#fF#{0sX_c>-X{jxObSAHHO0^jQ9B~`0KOy+m3(vD=7JekVeTbdV159p z-%~CtKZ>yahnJ6w|KkqdQ#yncb^+--n!G18#_dd-PJGYoan7AQz6Z~LvVW2n)=yXP zdgEL7 z`NQ}w=Rfj~CwHaa)2i%BSh3P<@fCBu7&i;U1@*YzAKG?o7k1c%gyf!-`DDW zZ$YeTe?a&i{(S$+q57yrtuQ#+ZaBS4*Bza)ssxK`oZsO%qVRQzWSK8=X?wEUpG1>rj+AJmWcge#Pn+EDwIeO^A?uio09rk^|z&?sNsHjnbY|4%*T`h)t% z>Qz3F>-MW~-~R>5n|(6<+uB9i$_M>>@A)AgK>f%DB(H5fb(K z_A6>yA7ejmJ6%zqGWR#n?WcaNJ_ewl?Po#L$BliQ-^=tsKa->r`^_&;MDGcm+E074 z@+geeERqPvlvtzcNYvS^gmZllw_~dAz)rw3o-} zd6rN32R~=o7t0^w&7L`K=1jD~_fVcL{$hVx^5Q>`r+)wM9GD>uez-nf{1%zJY4JVr z{&W}8_#)I2Qe$Zp}bLY_a6@7*H$n#&7=NA`sJ^?a0 zpJ0618l6v6wo+EoC*m#qVI$??&nK!|DKF^@?Qwlm18w@dL-$W5Yc@*$o5NxWZ|ApT_4DV^zZHFD_}BL2VW`ET4`&9sLBo~KI-P3>VJzJLC}*~9gh)AFeOT`!Mp zdl(;#`M)E1nDG(g3-3p)=&Ppw5Zi+pALai>-;qBUd+`2H-kN0(S^jYSm5Bde@%(pg z53g;A<&lmLXU;_N;kC4X5WW(|hw(T*jI)04A0|G$#x9$9F`gA4)W0_Vaf8mrbQ>>s z{v9umRoH{ar&@owgQ|Rdn1AU(w}%@PX2}09d;UAOhw(u-e`p#X&c^tq2QEI`d_66X z(l2>=tim2L@Smq&e$egV<{J_Jw>%%{a|0hqj8xL_m{~XGu?&qRGuYdBt81et}A^%zLKb3Qmr{n+pLCL!{ z{~7vkxX)5$eF6WG{wzL0c_+|Ak^#8Zh{O?S_ z&i+qLNxrS^-{_l7tkVBcUxWXjTD||D%JlztBL4qY$bYB)f99a}Mq2Zqq5nqzXMM5% zd;MqozxtEt8|&i+{eM@)|IdZ|f7hhvx%nuKOgfykNO(?|E%->`T2JIWBlg@ z=Jw%a8~va4wbp;O|7Ys|^AZ0)8}i@Y|5N8B z*nhiv`RuL;pR>#TKAz4$UfIxFW8p844&YflkA z=gl(H`N8@f_^`9a-)qzYYG)A1Dv~TX-{b9!Gg)`?quz#COLpzUrO`4@G~L5o%%PFK>MRXIE|)lZQ*N#~)F7>HD2axNr0s z+?Q8%H603LzJU76%Ky$KjQ2Z4tG!{+zX^NbxRA7m^Nd2h9G(XQpCf5O;E)0ACtp8r zWN+n%`#}1=wWfF+$`kk(wddshmZx!Fh4y&2mkgQnl>D+R)w~ac`N@U%-YnrpLUNx! zecp`vuU_7>$Hhk&O}@UEn`L!u59PtnV~hAR`F&!_leCc^?@#b~2g9D>@1idcekYcA z9owg`U4Dn8lgHZScRdYx_q6LiJnq+Cc<+n5LV4mmPxH&~ zX8j*+>?NLrKR+OS{1)TMmvr97Z%jO?yu=DWXK0+?nfHG_Z_~%>TVHYU2mKwZPYAEW zWXhNC4Sb1z7x3TCM|u9WRW!d-d>se5GO7Ep=r7JowLc{;HD7Hw|N0W!<4*>e`Rwk@ z`K;oxv&V7MpM*xdyY}y+GScWj&jS~3u=1Nc?*l$(cQn6|^&#EZZ!h%k_$xQX=S-ye zt%%@ooZH#Si?2=Y48F;CH2-=6CVG3HgoVU7FvCr3rQ| z#OLe=ZR{28jV*2U_6L8z@ZQAu9`Db%-&4+AWdG}8yP592>% zEG(Bv{!`gMK7^(kX0Yp zEAs32LhN|gQ>lN~7un(OVg})JK3o2*GK)rhczc5BZ}U6&OQrsf%4<|cePi`^D|STI zc*FU{P27jRcke5@uTi+Nxai~sd&Yf)&uYJy^{M>n?{f1|q+@=w=;W#V=iWWXy!XdqhP>FH#ngL1WhA%5=P(?ue9yg`xKHQe-Muv~-t`6X z4f8j~H?de?Gryp}nEN#Rj`EA|J9GR|8uf3-pBv2ULjr}y7$L(ZZ>1T)RS$P9{-uWM;<#i*F*A(Wj=40fI_(uDkRQ$yK zl0GvY*Hk~+@2j7@C)>@f2)`1aPh!3?=kO@7zrym|9JQ0ozc;~t@}vv!PuR!6mE0UB z$65~|egfZt^Bv@9gU7kv_Whr(Ev|jpXFj*00RjAh2A<|2*B|H;@yg;$VE^b(Vfl$Q zC5&xJfAjTzf8U+&g&=;ElKQy*!}~lAFM|4s2U7j~2XwrD#r6h}Bz`e|2oFOQXg>;g zm?n6UMb>5g3-dRFw;8>p`h|!2=d1t*_)(YmQT^}!p3*0luoOh9{t^HE{(T_upTC0K zkbg2hvi*LLm)`v{Xj=cRAt z?^1qDawP8oy&l?B-so=%uK{_d<;nMlfOnxUQGP$Uf$MdPcj5dN_>%V{d`b8|4*Hk& z=O*t9J#6=?_7Tu*{O~?T?OjKa}EsbOVbso?HG$N!xf(_-eo2 zA9{#*vj+Z~w7)m2{h^_58l0E^P~84dy8UOUf9bnL``4I1;eRV^E1?_oPx<4$p%OCq z_6w=@zuJ|fe7{`fN)cpAKq z^H`W4cpVHtzWgH@c$)bAoXruQW;DXnq~Fg0ex^T-pMmvoKalndePI8}<7Y5P=dTn! zz6Sc#`#MQHz@qW$|dqz{@x4aJfL+#(onOK@i#aF(Uqv0V}Lx1Nn z-zo<0;}B0%C_KaZnf@{77n|~9pf>R<&DVScHhwS%qip4aZ=G*>Wj%}|d{pXj5Gw?LSdM`)salxOjUakzM@ib2k zJAaUW6o=Dzn(DCgANkAn;k5mihtvMCbvTWud3v}TUG@I*;&2*Ivu!wyr`bQ8#?u@b zPUC65?eFCjx1+mH;Xh-4Oyq8l__-FqlpRKzbt^MzY z_i{#qbkx`IUe4GybVYM`^=IpD(imo~e4gG+T6L&D9lw|J2=(jrQH$%{J>9nBkMNjiPGmYO!xB4d@tvbBgpUhUwDSJ_?JAg-peWK{KoS4 zsl1nS`>U9t+wqP2=Y^l(jQyteU-I>$>8nkT*IQhFGAY^b!}@;E?8nqJ|8Kk>J2!{E zudoR5hS>jX`o4o%|LQzJ>t)Gb>(8?GYyJAv;0Mh41ND)OCz0&!c+(6|bLVSmdE|aP zlt;Y3&e|TWBX|E7utvS zm!j}jvZogIk>xLiA5P2T_K$}0=+r*4-^+>YjoIgtY z*!e+P9yh)o%A-^J$bK&;vX2LDe5qYa%j5c=3gywMeSA9a<#_vO9AB`-5bOt6H2*ou zF5B@ZYkXn(WPR6cyj>vwc7DP6$2H2QgZT%y7n1o$<9y@vDQ6Ej&%u0SPWf5J?1zI4 z&mSB1!{hgI^d6=*mBoMO@8zidWW2?B!UFvv=bFXvgN9buQ0Zr;mL{ubi}=d+={)qcQljqxzx z_d4UH<2UQQoT9;^TYh;SImh<6K0$v{{G0oz70H`T82+Vi&wn-MpYx^Qe7(Gfy!!L? zVwH2zR{S?RUyt=&HG@&bMXIJ>4UWFp(=a8 zA$u~v*7+7=nz8rFEayL79_2kun^k_UH;g?fe+z$@WnGE=<33Mp4-1@62lBY~gRFe@ z>#xurQuc5B|5$tdXTFys{U3AucK%+D+E4gLysQ1$G{4umzHt0zzn3HVIsc!XkbGPF zztK0FkiHoX!gxOuuPG;onFC)}j)qrL|JpYKC?={xhita$FF`h(toPYOT4#Z{8E50M|<#7I{F&^guy#K}X z0oy*$Z#sN0r>OUGG$+*gLgRZmZoa7WqAp}=53I%fZk*lWc!vD+cQ^js0*(33&g*G= zzi~CR_w4z;>a+2#Nqm3c-peWdr8K`cS3-U}^>6rd3Xg;P3}+#0`m4d?6cwuiJkGU2 zDg^6a=xbu>2$K!I26Q7nXINJQ1ALD5PjkfQV85Ms9EJ};o8!6g zH*YRT{-TM$dFwS#6MwUKJfMMJ7$!N%8hBn=sE<6(`-tv-SCjX0)ZTDO^8@-Xw$YOr@;HH!FuL4@4K4y4ET-Xoo@Fa-JBOTc`t|RF!ly}X~g5i@8yi-&Y^(f*E_`H zROLSx_+8WYaz;3mh4-IF;``5tboiM5HN)ei&V!)u!e34EzjE2}e?NE}?XP(}j^IU* z$5i4!x-jj}uPSm-?Z3d^d*2($9c1?d`?*Wn`e!2^=k4M}CbP?sH};1rDoeaygC1sf-Yh zBRmAxkIR)2;&Cddl<&U~pP;{cK?{!);2SXi!22f`IRM%D?yBC)VTUY@=J&cDd?^Gt`o{M-LtP7&7^+Tn3v;l7>i{}kji2|P|ReW_HTepB%zMRku=h#o1T?Uj>`E)LV5m7n~5 zEwslSny)FZlcAH~DDe8sb-a3jo{*5;{Af8nt;*gse&*E9Gf^bh`ZqaOuqJSxObrs`tFs!r-^?t{&<_Q*5*fldIvyVn*KfEmHyZ=(?H)vey;Cfdn>3g$?wwt z0n%Ylo9g}R*gyFP`umm31@%Vy{P0oqck?|qXZnlxChC17>qtWdu)p4krBNj%>AcTQ zdscizyc??D>toh?H@}bgxHS*g*AKh$NY5{C%>CN8zV%`fZy&A?Y!1?U(cWl4v%UdS z-w&|9USI$F3BBH=f3NU(y~_g|-+lMpNl5|x_Ad7&bT`MZ-sSa{h7pM#Ow#3FWA&jS z%2%I{=82Cp^0M#$jsgDw6Eh$1GgjZUX?;S&em2$D4>x zHI%<8PJe>@AFdB>X8V#i_@zA3bpJ@29vF5s_=S81Gvw7D=!f#O@=fFy$V2jp<=G#} zFOYA{ujDtlPWI&F7s%Jj&ln(>mi+n$)A9@CZREE;l3&VxX-|}QD8Dqlek4r~;sG(6 z-^eevH!Dxcr;Yu|-eGT9@{8>+TYl1S8~Hi=lRN`?NuGUPo`^3^?9Z69v%gq=vAp`d zykwt)qZ#tE{weuTe%Ah+Jgt1?&-Wp}#2#1Z-|*Mo-n$$??fce+<#p?5FA1HBpRv7u zJP&^j>=X8o@^33&XRpQ{`pQKxP_9yA`ht&9Q{X;*G5%@=B>TAH#iT$rnXuYS%c;@lyjBo4wd<6P*@;#0Do%I*SV|{Kho(1E9;@754v`>9R z7mIHEi03EJpYZGYfdIy{&#=9gJ3qY{=(BL8uL}SuJD>dw=0kn!=um#X*>C)d zzmI_Pnu(?LDgEY`2fRM;dj${Id%eCeeqsFRHS-t9|5rAy>0Ry}u=16?bH2{*Tw?#Q z9vZ9n_WF1|&+)HM(`mNij~HEEyTh+%&F>2=%D~XS-;(_qd*J%i{@zM@{WW-h>n{_Z_`Yh> z_1B#!KU9+YQFwjNB_D1^;h3o zH@}5GF#k9HVCP?r>#yEHF6aFEYdG?khVkC|hvE<7UH_;n4}Z@uk9hyOMgLmAIY>vm z>m3eg`kNiE-1^Jb@8VrJpM$-vA4#vjdJ{SspDdlMzXpO44 z-26xDgI>Qr72Q9WP9N~|CnLYu-oo*l@@ip!$#|P3zy6Npr~W$o8ybq`=j>1N4CEzw z_WJoJ;t|ImMA~ruZ_L@Pzhe2t@{0EZ8rJ`@{NnY#wLiE13g<7Yu)kP-eTjW){N?;4 zz5ZIemiz|mFCRZ+d$sdTCtuhD*I%)GoxK`+mUNN3ne{kcO^`B(@704qMj}v*u@=N?d^364_zt*iwufNQE z%*W?q(T!K1)E~_H%gkq5uD=SweB?8jj~I6{`@!bDY0ZE65B&Av`cO0DGU4N}xmtKFZ_45(LdpBQn>#zQPbAAPR-QxPISNrv#bRIZX@9We3Fh{RnuiwHU zZQ_}k-*7x=zW&tU_G*7ZC2oApk( zzQFoxUAUg*`PRnt`fHume`L?DH+s3AR{KrYU+7=59>V$%z5ZGo%V%x0{_^sH{JH)T|CGTuwf-^+YQ6q? zE?$4FBgzV3`)$`- z;qSwvJwIPSe_T8b&bxR#i7K_<>eAhLSD((~{QkpmYQ8$L6z`t~@k{(|Nv&V=%a5df z-(_N{aF6>(a-v_>dg>ABpZ|#N-RNjD|J@SOoX^U?Zc2ZBSbuE_(i!iJeVOw#&3{dP z#M4_^Z>%@8)*G<@-hy3!CF8rLll9j6B;B5W4J5Q(e+}!Z2PK-*c;9Q}=jOj7BW^y1 z_Q&d@8h=fGoiA#?Tk?kd#_F539#Fc8Z+*J&!T6^2!?3B&&3^|Tp}YCZ@-X9lLMQ7lODFOSxN$QSlN`;6u5?A6#~ zual=;f32j?zZ%wGcR7H%{r{}^yy>3CTRZ>c{Q>@&v-hzkmL7@bpIbD2P&(v+c-k)h zGQL{>$9(b@?<=I@FXo@?eLP2f`Q?J2uY&gFV}Ee^wf2B`19|%RjBc9sSExVUPl)`( z#Ur~O3+LW8wM9ruxQczS2ue zckyXrX&{=f7yNn)@or*iIP!;0kv|l8n<^MzH^uXff*UX84+CcX%tF%V@NiH*&?o#y z_k#xfd$CiFe-!W5d--a9xz6loP$_mjWb_Ap=zOeUJv8_!ug`i| zU%T~L&>!ftu|J>g`mCoXy*}%S<zdqgdSbr4X((`|=r({q32k|4nyd{cn zk3{RSQnVi16#2&h#c$%B{G~67f2r|3n4cxA{3{>oGUJXgy))OKv?eGUE1U6~9Jxo&uKbdCvMinoGDIlX)^d z9-qv5%v9&rV}m8O@7H7fIi@@+1^P(H!>%*oTrH(8Hm*<^%(W9 zkLD+VeS#m_XDna0J~RI8_gC&~J(d-pw?yl)LNq@qMf1-`qWNdr_{;cd{XbccrQ$Ev zV?jKJeWlJ1K>PA8zQpSbA8#N}+(%5}M--ov`DGGslKmcM4{kkX3>F&8iqGgD*JI9K zAe2(LBzmLcAk3Jv2!9V0>?cJ@%tbCk5#PQne2mA!_IU3I(FUdFM4_J?-Bt`m3t+%KjYrn8( zt;hPzd8NxgXzm*tInvU_x7a=u7gGZgO5W ztn*qQ??!aLRy6D;`vMS^;mFT)@(htE;ujac)zYk=SzM)W{zug{<8t` zCTl&`9j`aKgY^c^%ewt~gYsxNFYE61{ONp1`)6&=%ht)DZ2y3Viq>P@{hI&LKFs<|36u|MhcSd;#+LbliRybRZ8xufd()9HFF=+8Gl1N}E?KdB%3j_)h#{A!8q<3IUd z&%F!lpWUxT1?ZndeeC{Z{zo>N^#!%_Gt=5Hw0ORITrp@q*TwrfYwqo|^lx?Ldj8{X z19fB^9zGSlcgQa1q30DNGEkD2KP-y}!^^VVAwJ(jew ztHfNQv`uDqr$^)1lH-`Pt#u@?t>r4RSLJdxW3Sg0$Ga9*p%i(nb+NX*>)5qbp&3Sz z6*)`U&f3X3#(v*-&b{~C+dzXHjb$aCt{M*hd!GOE{O3O}bkg(QZrf|e>3)zi{A7Aq z-&H5Q#pT*xK17_!f8VY@;-l!p{gBK2Tk%+PKZo)%>V*4KGOarPK>LC@-d4R;_-TTn zpS*9kvY(T+ReRrmZ{oiHOe^dC%%^_spefJ#*mC@yCC}q(0g?5CKmLl)X=E#a+256H zmgnVjO#@G^g=jBCTmT%>Hd0t-l>b!i;)8CX2otMvM1$$_K=LdfS zXNvh?jg3#2FIs+&R&+nE>HmqQl^2{>hPDuW=12eQmnmLte!!g?*smLwFVEo)pfbjT z-nHWI{DUWrJU)o?)4t@A$Y>b-u^w$dl;N3xPec8sQh@eAyQk5We{w z>-R%=9ey{N7V;bXReKJ9uR*U}{x%=mn7<3eUq8FPdwFYYPeG55y_B_=kw7B>XM+3U z`8@1jCg_){sy)c>tCvbmvzI>mK&4v1$339RgKpt`5lJ*P*x^qP#HZcpA&JDFo*vYf;E&FS zveTA7tS{zIPY(we$spRJJ~o-x@@IafzQ*<Ld1h_$yl8Z{#ZYEPQepPnwJQrhz9{^0}n`<#I{=%lAGAig#Udh{@rhz9{ihW6W=<7?$LorWzD3ZSh|2*YEKDz92(bL~C|N96_ zAJ*mn0PF+swfx6@6Q!T}^rstM6X&7P|M``^HJXc1zL8!w>E?V4?Md_=Eb`}Dd1VF8 zSr77G{*?9S8D9gx%OC60{<$!I3;7x_@`d*ye{abj_P3U-BLDbOZeh z<(2*<SIN`g zv3wN?Z!BN5FA4b?NXw5Iz|44r^+V_b=ude;d>z}c`p64MUaUQWd{SP&i>tCidu_<%M1Q zcI2gx_Q;W!KH8%aaISdFhMKlSy7SvM(FSOFk_xDSLCz^70+GFW$dP z%FE52uDonEe%-UYd>7i6guJ|EUqX9^^QG&JM{|Fgl$Y10U3vNIU|-;py=7nIPu-3G za_-+J<)vMB<>jw~eM!j6TlQrW`*QXFOUldg+g*A2&)dGNH$Q4}0%hmZ<<=(tO3Q<= zc}=fr_R}GrjSB#<2d0eq5!UM?_#FHh?mvO|X68Sb#C-$to-u9jH}3!h5G2LUJIgFoTK z2XP;6<;U|3@Zi@}eC~&S!t2*uiuRc6tBAjFIx2brAI39?e|%r66HhYtr7FO}EarY# z&aV+a()@+*m74n!)CTbj@@Bn<`2`oTVBxjZC!3z0-z_t*;zzT(zfXC?_yO)SRR2O4 z@uaJNk&=HsX0&SKx!vt0;@dGj6pxqi*!CIE>tRcF{K|M&Ta4#|fj8F_e=oQ0Gy5wz ze?mN{|0VB!&aW@*zEjftyR~&IVa=y*%_3f7;$?;(OT2%tU-*z8w|lUD)o=FCv%W7k zyd#h|q~Hg97+(RuuKt_&ex7ox$36d&onP@al@8})nIId-7ct+0JTpLI?t=q7i1LJW z|C`-k)l`6>E&7!M-4EAR|G}^5e2#O!+XW$D@}vG-1n&+)#@oZ`)xpHasN^UCesMixZZ!74()aE1eq{Bp zjQqME*{`9!FX$WWO?)3Z>OlLr&%VYqWU}||vTpuN`&{o^rAJ}m&ha3d8V{WHO7j0M z#)H*+91m`Qf?|eD?crt>03WQfBY}(IP_;=KPC;rLt>N}19y^Vi<@Fvp3?hm~2AF1HceT5z4 zNku9X+Dmsl`R5Ny{AH@D$jrzy+zsefN7vsM_=sncx853;p3rn1D$NJ{mK3W;&J@OUL+>cO(eWCf4 z{|S1$aw%Jp`QCy1ob^6ju_6bRu-=EuRb;>jWBxkU>e2dR?{+8+?A0LVE83s&IO>Ny zjz6p9}asu81$8ZlGpQ-$S=6p?6+ij`Ue=VnvOn#p4l(`P_Nf3 zf6Ls@7U?VUXIiYSJ*)8*_2n-1c*M^uSM2zy>G~{lasNvu=!xe$m~T(6^fBp|nauHd zAn4arHTIYKX+Dj=@wxlC|Ds=YF&@D6E&xqsF!qD|XZOu~LjF?^uSeH=RaTx{ex}EN zoR2o;qxnitpH~5eDIaJ*v3~u!_Rsb8gz1py^nS6BUpeyY_Jdo%4|BhV_(Oj5X#T%O z`h$LBtz3#r}rzkYaY$;(;)nCpM!PdMM?`Jr;i->;|m#r*~=Z}E%n zPTuf~`eV)$IsD3p^cTPKDSny#oiV@6eIVWVweI1a`?ry@t9xsyh6k;+dg6F+h9->e`0y7X$ z_BTr3w!g6%zv@r!^kRSGEq=Wbe)UEEVaeQ=?)Zn1e=d92G5_lDH#XzfAAV_<<8Qph zuQ$Rk`G;owGUwGDentMG`1S4k8^3hsvA6tJd8{>Fd#e?IOFNB&{& zJ^F{bK7Ljq{&oFBo~LpB`BEyrVULSgdhvXT>iSFb53PR|$2WR6@eh0N#y^z5f%TC@ zJVW!Z+%V%?_I?8RBOU(XF!7E3Llf`l=FdO=-b0SR@fN>Q_VBLwC4a;6D~e}`U-^Xp zu@1jbT=?yv46K!Y}z7mS2&7A%68G{Ev0`l~3wde{WQNgZbB& zzyFNa{~fc3eJOjWcyJVNg*{Y!TKm8LQsTXDu07=WOU0l055|Kq{wx0j^iHe~03K`I zXZ91V=Z|20p#QSh>wOsU>%l+Qdipy2)qM)FKHk^M1CF6Sn)gd={1@_4{`ye%@BYct zCO(e#fA9~y3eS3Gca;0N-wg5d`f!qhWqu=f6BVUe0>Q{{TnnbRyHl@00KIV!eGu$Sei@l5+G z{?nEp(BIiF_F#v+aDPaGf0vT{OY9c_y*kgc_L{YHuE&v|DDU!Teq})H4A%<=TZMT4 z8TiZm9M403W&(%*kXP=Xu5dyV?so_tz90N)JL@qIvjO-0n>iXJn;-pum;3A_jwt_E*&llxn?$dYKUK$Ga6QfUxc(5H*PCCdrS2o!8J}kcKk)vJ zul2+n%G}=CkNazOIxy19zU%?hK_9&LS#{Epzf^Nzq;IW8`B8tl_3*>V{c}A%=(({U zNQZqMlECnM{}r6a{fL6SHv8}8aUY_Ay)6bVal(sV zJEQ$xgR?`kg7FXJ7xmRmeQf^<%J=u%{9Ba2Iy;=oKV|Zp{^f(MTWx;TH~IAJ_Ei39 zli&1zEEuXq^g;WRyJtsI`DaXi;0Jo=@jjZVANVl;;OuNY+5b6{AN|*Rw)gE!)L)&Q zO4Yy1` z+y6PI|9R}!vH8V6g+DJeyl(1fwqCafW20KioVmI0_eXxm0#<Obu3U@)+Q^zOCv;r`O)vw_>BD4{!%}$bjWusFR(A@Z(2SfAGlB>lJ^4g$M&22 z&ZOljs|CzZKOFvB`yI+RDrNb>*}N++sNaqUA%0oSN3x;*?4FJHGow86+wns75%liu zSG<(t8Rb1?-^YSn>iwR)SsygxBkXY`uf`r{lJ-82{pv=3VXr}d*bnTcaO~w^(%wTq zG#^&~AuoCCZ?xqtJtBJ{IN`4#KlDTUb@JB!aQ}+@S^67jAN#$GzvS-s3ioe(BjxX` zqaWP=5zj~HUle2i0_{_t-TlX~CozAaKag*22nqQOepvYi{}S?T_=9vSzv1{4j_)9% z=o60bZTTa}pRi}NcT`x74@Um7uKdieWE1iq(Z}vLCVr9r8u{yu%0vDW_!;?$?Irp* z2K(&j1IPD-{E|P?KRZ9l2LslghyF^|`Y#wijs4SoTOmH$ujKBp54-~9Mem7*??D2N z?O!hC&)VyR7%%)R{nJ80+tb(|;G39#0$Xhymz{{erJv(sjZneuDW3_%Ho3@@3k;!3n$_U-2FnYD0vG@^tHgnQTnb4wyyi4F&^{2qe%ahJ~yHLi!6`*b8q`-ZoBs`+>gQi zl9;dS{Ztmvebc>2FBH7@!QWB(6{HvR-i!A)P#)()c>az4i4I-Oo%J#oyJ-}-eRkTFlv7w6x0X}%W0_w8Vst|U=R~5BclyD&hD5`I`)ObNp(v2JRQF1hw5Y0Zrjw zfqi#jAMc3~S2<0>zg}d2#Z$nAiv_RF@)UwO@cW{-M=;wwul<7n+l>NY#4B;$5DyH; z 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

hm&c;IZs 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 b-}V3XbM^Pj@WFNe#BZtl_gXhtUsL}VL%$O& literal 0 HcmV?d00001 diff --git a/submodules/Propagation/gaussianpro.egg-info/SOURCES.txt b/submodules/Propagation/gaussianpro.egg-info/SOURCES.txt new file mode 100644 index 00000000..5b846518 --- /dev/null +++ b/submodules/Propagation/gaussianpro.egg-info/SOURCES.txt @@ -0,0 +1,8 @@ +PatchMatch.cpp +Propagation.cu +pro.cpp +setup.py +gaussianpro.egg-info/PKG-INFO +gaussianpro.egg-info/SOURCES.txt +gaussianpro.egg-info/dependency_links.txt +gaussianpro.egg-info/top_level.txt \ No newline at end of file diff --git a/submodules/Propagation/gaussianpro.egg-info/dependency_links.txt b/submodules/Propagation/gaussianpro.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/submodules/Propagation/gaussianpro.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/submodules/Propagation/gaussianpro.egg-info/top_level.txt b/submodules/Propagation/gaussianpro.egg-info/top_level.txt new file mode 100644 index 00000000..0c90696b --- /dev/null +++ b/submodules/Propagation/gaussianpro.egg-info/top_level.txt @@ -0,0 +1 @@ +gaussianpro diff --git a/submodules/Propagation/main.h b/submodules/Propagation/main.h new file mode 100644 index 00000000..13254fe9 --- /dev/null +++ b/submodules/Propagation/main.h @@ -0,0 +1,55 @@ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include "opencv2/calib3d/calib3d.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/core/core.hpp" +#include +#include "opencv2/imgcodecs.hpp" +#include "opencv2/highgui/highgui.hpp" + +// Includes CUDA +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "iomanip" + +#include // mkdir +#include // mkdir + +#define MAX_IMAGES 256 + +struct Camera { + float K[9]; + float R[9]; + float t[3]; + int height; + int width; + float depth_min; + float depth_max; +}; + +struct Problem { + int ref_image_id; + std::vector src_image_ids; +}; + +struct PointList { + float3 coord; + float3 normal; + float3 color; +}; + +#endif // _MAIN_H_ diff --git a/submodules/Propagation/pro.cpp b/submodules/Propagation/pro.cpp new file mode 100644 index 00000000..d52db3c8 --- /dev/null +++ b/submodules/Propagation/pro.cpp @@ -0,0 +1,29 @@ +#include +#include + +torch::Tensor propagate_cuda( + torch::Tensor images, + torch::Tensor intrinsics, + torch::Tensor poses, + torch::Tensor depth, + torch::Tensor normal, + torch::Tensor depth_intervals, + int patch_size); + +torch::Tensor propagate( + torch::Tensor images, + torch::Tensor intrinsics, + torch::Tensor poses, + torch::Tensor depth, + torch::Tensor normal, + torch::Tensor depth_intervals, + int patch_size) { + + return propagate_cuda(images, intrinsics, poses, depth, normal, depth_intervals, patch_size); +} + + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + // bundle adjustment kernels + m.def("propagate", &propagate, "plane propagation"); +} \ No newline at end of file diff --git a/submodules/Propagation/setup.py b/submodules/Propagation/setup.py new file mode 100644 index 00000000..500dceb7 --- /dev/null +++ b/submodules/Propagation/setup.py @@ -0,0 +1,28 @@ +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + +import os.path as osp +ROOT = osp.dirname(osp.abspath(__file__)) + +setup( + name='gaussianpro', + ext_modules=[ + CUDAExtension('gaussianpro', + include_dirs=['/data/chenyt/Code/opencv346/include', '/usr/local/cuda-11.8/include', '.'], + library_dirs=['/data/chenyt/Code/opencv346/lib/', '/data/chenyt/.conda/2dgs/lib'], + runtime_library_dirs=['/data/chenyt/Code/opencv346/lib/'], + libraries=['opencv_core', 'opencv_imgproc', 'opencv_highgui', 'opencv_imgcodecs'], + sources=[ + 'PatchMatch.cpp', + 'Propagation.cu', + 'pro.cpp' + ], + extra_compile_args={ + 'cxx': ['-O3'], + 'nvcc': ['-O3', '-gencode=arch=compute_80,code=sm_80', + ] + }, + ), + ], + cmdclass={ 'build_ext' : BuildExtension } +) diff --git a/train.py b/train.py index 07bf40d1..0dd3c4c0 100644 --- a/train.py +++ b/train.py @@ -18,6 +18,7 @@ import torch.nn.functional as F from scene import Scene, GaussianModel, AppearanceModel from utils.general_utils import safe_state +from utils.patchmatch import process_propagation import uuid from tqdm import tqdm from utils.image_utils import psnr, render_net_image @@ -159,6 +160,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi viewpoint_stack = scene.getTrainCameras().copy() viewpoint_idx = randint(0, len(all_cameras)-1) viewpoint_cam = all_cameras[viewpoint_idx] + # Set intervals for patch match + intervals = [-2, -1, 1, 2] + src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] + depth_loss = process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) render_pkg = render(viewpoint_cam, gaussians, pipe, background) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] diff --git a/utils/graphics_utils.py b/utils/graphics_utils.py index 0f3851ef..9e5759ce 100644 --- a/utils/graphics_utils.py +++ b/utils/graphics_utils.py @@ -13,6 +13,7 @@ import math import numpy as np from typing import NamedTuple +from gaussianpro import propagate class BasicPointCloud(NamedTuple): points : np.array @@ -112,4 +113,151 @@ def fov2focal(fov, pixels): return pixels / (2 * math.tan(fov / 2)) def focal2fov(focal, pixels): - return 2*math.atan(pixels/(2*focal)) \ No newline at end of file + return 2*math.atan(pixels/(2*focal)) + + +def patchmatch_propagation(viewpoint_cam, rendered_depth, rendered_normal, viewpoint_stack, src_idxs, patch_size): + depth_min = 0.1 + depth_max = 80 + + images = list() + intrinsics = list() + poses = list() + depth_intervals = list() + + images.append((viewpoint_cam.original_image * 255).permute((1, 2, 0)).to(torch.uint8)) + intrinsics.append(viewpoint_cam.K) + poses.append(viewpoint_cam.world_view_transform.transpose(0, 1)) + depth_interval = torch.tensor([depth_min, (depth_max-depth_min)/192.0, 192.0, depth_max]) + depth_intervals.append(depth_interval) + + depth = rendered_depth.unsqueeze(-1) + depth = depth.squeeze(0) + normal = torch.zeros_like(depth) + # _normal = (rendered_normal.permute(1,2,0) @ (viewpoint_cam.world_view_transform[:3,:3])).permute(2,0,1) + # _normal = viewpoint_cam.normal + # _normal = (_normal + 1) / 2 + # _normal = _normal.permute([1, 2, 0]) + # normal = _normal * 255 + # normal = normal.to(depth.device) + + #Vis input data + # if not os.path.exists("cache/ref_input"): + # os.makedirs("cache/ref_input") + # depth_vis = rendered_depth.squeeze(0).detach().cpu().numpy() + # normal_vis = normal.permute([2, 0, 1]).cpu()/255 + # torchvision.utils.save_image(normal_vis, os.path.join("cache/ref_input", 'normal_ref.png')) + # imageio.imwrite(os.path.join("cache/ref_input", 'depth_ref.png'), vis_depth(depth_vis)[0]) + + for idx, src_idx in enumerate(src_idxs): + src_viewpoint = viewpoint_stack[src_idx] + images.append((src_viewpoint.original_image * 255).permute((1, 2, 0)).to(torch.uint8)) + intrinsics.append(src_viewpoint.K) + poses.append(src_viewpoint.world_view_transform.transpose(0, 1)) + depth_intervals.append(depth_interval) + + # ### vis rgb depth + # for i in range(len(images)): + # cv2.imwrite(str(i) + "rgb.jpg", images[i].cpu().numpy()) + # print(intrinsics) + # print(poses) + # print(depth_intervals) + # cv2.imwrite("depth.jpg", depth.cpu().numpy()) + # exit() + + images = torch.stack(images) + intrinsics = torch.stack(intrinsics) + poses = torch.stack(poses) + depth_intervals = torch.stack(depth_intervals) + + results = propagate(images, intrinsics, poses, depth, normal, depth_intervals, patch_size) + propagated_depth = results[0].to(rendered_depth.device) + propagated_normal = results[1:4].to(rendered_depth.device).permute(1, 2, 0) + + return propagated_depth, propagated_normal + + +def check_geometric_consistency(depth_ref, intrinsics_ref, extrinsics_ref, depth_src, intrinsics_src, extrinsics_src, thre1=1, thre2=0.01): + batch, height, width = depth_ref.shape + y_ref, x_ref = torch.meshgrid(torch.arange(0, height).to(depth_ref.device), torch.arange(0, width).to(depth_ref.device)) + x_ref = x_ref.unsqueeze(0).repeat(batch, 1, 1) + y_ref = y_ref.unsqueeze(0).repeat(batch, 1, 1) + inputs = [depth_ref, intrinsics_ref, extrinsics_ref, depth_src, intrinsics_src, extrinsics_src] + outputs = reproject_with_depth(*inputs) + depth_reprojected, x2d_reprojected, y2d_reprojected, x2d_src, y2d_src = outputs + # check |p_reproj-p_1| < 1 + dist = torch.sqrt((x2d_reprojected - x_ref) ** 2 + (y2d_reprojected - y_ref) ** 2) + + # check |d_reproj-d_1| / d_1 < 0.01 + depth_diff = torch.abs(depth_reprojected - depth_ref) + relative_depth_diff = depth_diff / depth_ref + + mask = torch.logical_and(dist < thre1, relative_depth_diff < thre2) + depth_reprojected[~mask] = 0 + + return mask, depth_reprojected, x2d_src, y2d_src, relative_depth_diff + + +def bilinear_sampler(img, coords, mask=False): + """ Wrapper for grid_sample, uses pixel coordinates """ + H, W = img.shape[-2:] + xgrid, ygrid = coords.split([1,1], dim=-1) + xgrid = 2*xgrid/(W-1) - 1 + ygrid = 2*ygrid/(H-1) - 1 + + grid = torch.cat([xgrid, ygrid], dim=-1) + img = torch.nn.functional.grid_sample(img, grid, align_corners=True) + + if mask: + mask = (xgrid > -1) & (ygrid > -1) & (xgrid < 1) & (ygrid < 1) + return img, mask.float() + + return img + + +# project the reference point cloud into the source view, then project back +def reproject_with_depth(depth_ref, intrinsics_ref, extrinsics_ref, depth_src, intrinsics_src, extrinsics_src): + batch, height, width = depth_ref.shape + + ## step1. project reference pixels to the source view + # reference view x, y + y_ref, x_ref = torch.meshgrid(torch.arange(0, height).to(depth_ref.device), torch.arange(0, width).to(depth_ref.device)) + x_ref = x_ref.unsqueeze(0).repeat(batch, 1, 1) + y_ref = y_ref.unsqueeze(0).repeat(batch, 1, 1) + x_ref, y_ref = x_ref.reshape(batch, -1), y_ref.reshape(batch, -1) + # reference 3D space + + A = torch.inverse(intrinsics_ref) + B = torch.stack((x_ref, y_ref, torch.ones_like(x_ref).to(x_ref.device)), dim=1) * depth_ref.reshape(batch, 1, -1) + xyz_ref = torch.matmul(A, B) + + # source 3D space + xyz_src = torch.matmul(torch.matmul(torch.inverse(extrinsics_src), extrinsics_ref), + torch.cat((xyz_ref, torch.ones_like(x_ref).to(x_ref.device).unsqueeze(1)), dim=1))[:, :3] + # source view x, y + K_xyz_src = torch.matmul(intrinsics_src, xyz_src) + xy_src = K_xyz_src[:, :2] / K_xyz_src[:, 2:3] + + ## step2. reproject the source view points with source view depth estimation + # find the depth estimation of the source view + x_src = xy_src[:, 0].reshape([batch, height, width]).float() + y_src = xy_src[:, 1].reshape([batch, height, width]).float() + + # print(x_src, y_src) + sampled_depth_src = bilinear_sampler(depth_src.view(batch, 1, height, width), torch.stack((x_src, y_src), dim=-1).view(batch, height, width, 2)) + + # source 3D space + # NOTE that we should use sampled source-view depth_here to project back + xyz_src = torch.matmul(torch.inverse(intrinsics_src), + torch.cat((xy_src, torch.ones_like(x_ref).to(x_ref.device).unsqueeze(1)), dim=1) * sampled_depth_src.reshape(batch, 1, -1)) + # reference 3D space + xyz_reprojected = torch.matmul(torch.matmul(torch.inverse(extrinsics_ref), extrinsics_src), + torch.cat((xyz_src, torch.ones_like(x_ref).to(x_ref.device).unsqueeze(1)), dim=1))[:, :3] + # source view x, y, depth + depth_reprojected = xyz_reprojected[:, 2].reshape([batch, height, width]).float() + K_xyz_reprojected = torch.matmul(intrinsics_ref, xyz_reprojected) + xy_reprojected = K_xyz_reprojected[:, :2] / K_xyz_reprojected[:, 2:3] + x_reprojected = xy_reprojected[:, 0].reshape([batch, height, width]).float() + y_reprojected = xy_reprojected[:, 1].reshape([batch, height, width]).float() + + return depth_reprojected, x_reprojected, y_reprojected, x_src, y_src \ No newline at end of file diff --git a/utils/patchmatch.py b/utils/patchmatch.py new file mode 100644 index 00000000..fdf6aaff --- /dev/null +++ b/utils/patchmatch.py @@ -0,0 +1,109 @@ +import torch +from gaussian_renderer import render +from graphics_utils import patchmatch_propagation +from graphics_utils import check_geometric_consistency + + + +def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs): + with torch.no_grad(): + loss_depth = torch.tensor(0.).cuda() + if iteration > opt.propagation_begin and iteration < opt.propagation_after and (iteration % opt.propagation_interval == 0): + render_pkg = render(viewpoint_cam, gaussians, pipe, background) + projected_depth = render_pkg["surf_depth"] + rendered_normal = render_pkg["surf_normal"] + + # get the opacity that less than the threshold, propagate depth in these region + if viewpoint_cam.sky_mask is not None: + sky_mask = viewpoint_cam.sky_mask.to("cuda").to(torch.bool) + else: + sky_mask = None + + # get the propagated depth + propagated_depth, propagated_normal = patchmatch_propagation(viewpoint_cam, projected_depth, rendered_normal, viewpoint_stack, src_idxs, opt.patch_size) + # transform normal to camera coordinate + R_w2c = torch.tensor(viewpoint_cam.R.T).cuda().to(torch.float32) + propagated_normal = (R_w2c @ propagated_normal.view(-1, 3).permute(1, 0)).view(3, viewpoint_cam.image_height, viewpoint_cam.image_width) + + if sky_mask is not None: + propagated_depth[~sky_mask] = 300 + valid_mask = propagated_depth != 300 + + # calculate the abs rel depth error of the propagated depth and rendered depth + abs_rel_error = torch.abs(propagated_depth - projected_depth) / propagated_depth + abs_rel_error_threshold = opt.depth_error_max_threshold - (opt.depth_error_max_threshold - opt.depth_error_min_threshold) * (iteration - opt.propagation_begin) / (opt.propagation_after - opt.propagation_begin) + + #for waymo, quantile 0.6 + error_mask = (abs_rel_error > abs_rel_error_threshold) + + # calculate the geometric consistency + ref_K = viewpoint_cam.K + ref_pose = viewpoint_cam.world_view_transform.transpose(0, 1).inverse() + geometric_counts = None + for idx, src_idx in enumerate(src_idxs): + src_viewpoint = viewpoint_stack[src_idx] + #c2w + src_pose = src_viewpoint.world_view_transform.transpose(0, 1).inverse() + src_K = src_viewpoint.K + src_render_pkg = render(src_viewpoint, gaussians, pipe, background) + src_projected_depth = src_render_pkg['surf_depth'] + src_rendered_normal = src_render_pkg['surf_normal'] + src_depth, _ = patchmatch_propagation(src_viewpoint, src_projected_depth, src_rendered_normal, viewpoint_stack, src_idxs, opt.patch_size) + mask, depth_reprojected, x2d_src, y2d_src, relative_depth_diff = check_geometric_consistency(propagated_depth.unsqueeze(0), ref_K.unsqueeze(0), + ref_pose.unsqueeze(0), src_depth.unsqueeze(0), + src_K.unsqueeze(0), src_pose.unsqueeze(0), thre1=2, thre2=0.01) + if geometric_counts is None: + geometric_counts = mask.to(torch.uint8) + else: + geometric_counts += mask.to(torch.uint8) + + cost = geometric_counts.squeeze() + cost_mask = cost >= 2 + + propagated_mask = valid_mask & error_mask & cost_mask + propagated_mask = propagated_mask.squeeze(0) + depth_mask = valid_mask & cost_mask + + projected_depth = projected_depth.squeeze(0) + + # Res Vis + # normal_vis = (propagated_normal + 1.0) / 2.0 + # propagated_depth_vis = vis_depth(propagated_depth.detach().cpu().numpy())[0] + # if not os.path.exists("cache/propagated_res"): + # os.makedirs("cache/propagated_res") + # if iteration % 1000 == 0: + # torchvision.utils.save_image(normal_vis.cpu(), os.path.join("cache/propagated_res", f'{iteration}_normal_res.png')) + # imageio.imwrite(os.path.join("cache/propagated_res", f'{iteration}_depth_res.png'), propagated_depth_vis) + + ## vis depth + # K = viewpoint_cam.K + # cam2world = viewpoint_cam.world_view_transform.transpose(0, 1).inverse() + # height, width = propagated_depth.shape + # # Create a grid of 2D pixel coordinates + # y, x = torch.meshgrid(torch.arange(0, height), torch.arange(0, width)) + # # Stack the 2D and depth coordinates to create 3D homogeneous coordinates + # coordinates = torch.stack([x.to(propagated_depth.device), y.to(propagated_depth.device), torch.ones_like(propagated_depth)], dim=-1) + # # Reshape the coordinates to (height * width, 3) + # coordinates = coordinates.view(-1, 3).to(K.device).to(torch.float32) + # # Reproject the 2D coordinates to 3D coordinates + # coordinates_3D = (K.inverse() @ coordinates.T).T + + # # Multiply by depth + # coordinates_3D *= propagated_depth.view(-1, 1) + + # # convert to the world coordinate + # world_coordinates_3D = (cam2world[:3, :3] @ coordinates_3D.T).T + cam2world[:3, 3] + + # import open3d as o3d + # point_cloud = o3d.geometry.PointCloud() + # point_cloud.points = o3d.utility.Vector3dVector(world_coordinates_3D.detach().cpu().numpy()) + # o3d.io.write_point_cloud("cache/propagated_res/partpc.ply", point_cloud) + # exit() + + valid_depth_sum = depth_mask.sum() + 1e-5 + loss_depth += torch.abs((projected_depth[valid_mask] - propagated_depth[valid_mask])).sum() / valid_depth_sum + + if propagated_mask.sum() > 100: + gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, propagated_mask.to(torch.bool)) + + return loss_depth \ No newline at end of file From a56dbbaff5e046184a15a01454b79ebf2cdb2788 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 16 Sep 2024 14:32:04 +0800 Subject: [PATCH 15/71] feat: Enhance propagation and normal rendering in patchmatch - Add new parameters to OptimizationParams for better propagation control - Refactor patchmatch.py to improve normal rendering and consistency checking - Update depth and normal processing logic to handle new parameters --- arguments/__init__.py | 7 ++++ utils/patchmatch.py | 81 +++++++++++++------------------------------ 2 files changed, 31 insertions(+), 57 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index c153f46f..f92e53ce 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -99,6 +99,13 @@ def __init__(self, parser): self.densify_until_iter = 15_000 self.densify_grad_threshold = 0.0002 + self.propagation_interval = 20 + self.depth_error_min_threshold = 0.8 + self.depth_error_max_threshold = 1.0 + self.propagation_begin = 9000 + self.propagation_after = 15000 + self.patch_size = 11 + self.contribution_prune_from_iter = 500 self.contribution_prune_interval = 300 self.contribution_prune_ratio = 0.1 diff --git a/utils/patchmatch.py b/utils/patchmatch.py index fdf6aaff..51cd1eeb 100644 --- a/utils/patchmatch.py +++ b/utils/patchmatch.py @@ -1,8 +1,6 @@ import torch from gaussian_renderer import render -from graphics_utils import patchmatch_propagation -from graphics_utils import check_geometric_consistency - +from utils.graphics_utils import patchmatch_propagation, check_geometric_consistency def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs): @@ -10,23 +8,14 @@ def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, backgro loss_depth = torch.tensor(0.).cuda() if iteration > opt.propagation_begin and iteration < opt.propagation_after and (iteration % opt.propagation_interval == 0): render_pkg = render(viewpoint_cam, gaussians, pipe, background) - projected_depth = render_pkg["surf_depth"] - rendered_normal = render_pkg["surf_normal"] - - # get the opacity that less than the threshold, propagate depth in these region - if viewpoint_cam.sky_mask is not None: - sky_mask = viewpoint_cam.sky_mask.to("cuda").to(torch.bool) - else: - sky_mask = None - - # get the propagated depth - propagated_depth, propagated_normal = patchmatch_propagation(viewpoint_cam, projected_depth, rendered_normal, viewpoint_stack, src_idxs, opt.patch_size) - # transform normal to camera coordinate + projected_depth = render_pkg["rend_depth"] / render_pkg['rend_alpha'] + rendered_normal = render_pkg["rend_normal"] / render_pkg['rend_alpha'] if viewpoint_cam.normal is None else viewpoint_cam.normal R_w2c = torch.tensor(viewpoint_cam.R.T).cuda().to(torch.float32) - propagated_normal = (R_w2c @ propagated_normal.view(-1, 3).permute(1, 0)).view(3, viewpoint_cam.image_height, viewpoint_cam.image_width) - - if sky_mask is not None: - propagated_depth[~sky_mask] = 300 + rendered_normal_cam = (R_w2c @ rendered_normal.view(3, -1)).view(3, viewpoint_cam.image_height, viewpoint_cam.image_width) + + # get the propagated depth + propagated_depth, propagated_normal = patchmatch_propagation(viewpoint_cam, projected_depth, rendered_normal_cam, viewpoint_stack, src_idxs, opt.patch_size) + propagated_normal = propagated_normal.permute(2, 0, 1) valid_mask = propagated_depth != 300 # calculate the abs rel depth error of the propagated depth and rendered depth @@ -35,7 +24,7 @@ def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, backgro #for waymo, quantile 0.6 error_mask = (abs_rel_error > abs_rel_error_threshold) - + # calculate the geometric consistency ref_K = viewpoint_cam.K ref_pose = viewpoint_cam.world_view_transform.transpose(0, 1).inverse() @@ -46,64 +35,42 @@ def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, backgro src_pose = src_viewpoint.world_view_transform.transpose(0, 1).inverse() src_K = src_viewpoint.K src_render_pkg = render(src_viewpoint, gaussians, pipe, background) - src_projected_depth = src_render_pkg['surf_depth'] - src_rendered_normal = src_render_pkg['surf_normal'] - src_depth, _ = patchmatch_propagation(src_viewpoint, src_projected_depth, src_rendered_normal, viewpoint_stack, src_idxs, opt.patch_size) + src_projected_depth = src_render_pkg["rend_depth"] / src_render_pkg['rend_alpha'] + src_rendered_normal = src_render_pkg["rend_normal"] / src_render_pkg['rend_alpha'] if src_viewpoint.normal is None else src_viewpoint.normal + R_w2c = torch.tensor(src_viewpoint.R.T).cuda().to(torch.float32) + src_rendered_normal_cam = (R_w2c @ src_rendered_normal.view(3, -1)).view(3, src_viewpoint.image_height, src_viewpoint.image_width) + + src_depth, _ = patchmatch_propagation(src_viewpoint, src_projected_depth, src_rendered_normal_cam, viewpoint_stack, src_idxs, opt.patch_size) mask, depth_reprojected, x2d_src, y2d_src, relative_depth_diff = check_geometric_consistency(propagated_depth.unsqueeze(0), ref_K.unsqueeze(0), ref_pose.unsqueeze(0), src_depth.unsqueeze(0), - src_K.unsqueeze(0), src_pose.unsqueeze(0), thre1=2, thre2=0.01) + src_K.unsqueeze(0), src_pose.unsqueeze(0), thre1=5, thre2=0.05) if geometric_counts is None: geometric_counts = mask.to(torch.uint8) else: geometric_counts += mask.to(torch.uint8) cost = geometric_counts.squeeze() - cost_mask = cost >= 2 + cost_mask = cost >= 1 propagated_mask = valid_mask & error_mask & cost_mask propagated_mask = propagated_mask.squeeze(0) depth_mask = valid_mask & cost_mask - projected_depth = projected_depth.squeeze(0) - + # Res Vis + # rendered_normal_vis = (rendered_normal_cam + 1.0) / 2.0 # normal_vis = (propagated_normal + 1.0) / 2.0 - # propagated_depth_vis = vis_depth(propagated_depth.detach().cpu().numpy())[0] + # normal_vis[:, ~depth_mask] = 0 # if not os.path.exists("cache/propagated_res"): # os.makedirs("cache/propagated_res") - # if iteration % 1000 == 0: - # torchvision.utils.save_image(normal_vis.cpu(), os.path.join("cache/propagated_res", f'{iteration}_normal_res.png')) - # imageio.imwrite(os.path.join("cache/propagated_res", f'{iteration}_depth_res.png'), propagated_depth_vis) - - ## vis depth - # K = viewpoint_cam.K - # cam2world = viewpoint_cam.world_view_transform.transpose(0, 1).inverse() - # height, width = propagated_depth.shape - # # Create a grid of 2D pixel coordinates - # y, x = torch.meshgrid(torch.arange(0, height), torch.arange(0, width)) - # # Stack the 2D and depth coordinates to create 3D homogeneous coordinates - # coordinates = torch.stack([x.to(propagated_depth.device), y.to(propagated_depth.device), torch.ones_like(propagated_depth)], dim=-1) - # # Reshape the coordinates to (height * width, 3) - # coordinates = coordinates.view(-1, 3).to(K.device).to(torch.float32) - # # Reproject the 2D coordinates to 3D coordinates - # coordinates_3D = (K.inverse() @ coordinates.T).T - - # # Multiply by depth - # coordinates_3D *= propagated_depth.view(-1, 1) - - # # convert to the world coordinate - # world_coordinates_3D = (cam2world[:3, :3] @ coordinates_3D.T).T + cam2world[:3, 3] - - # import open3d as o3d - # point_cloud = o3d.geometry.PointCloud() - # point_cloud.points = o3d.utility.Vector3dVector(world_coordinates_3D.detach().cpu().numpy()) - # o3d.io.write_point_cloud("cache/propagated_res/partpc.ply", point_cloud) - # exit() + # torchvision.utils.save_image(normal_vis.cpu(), os.path.join("cache/propagated_res", f'{iteration}_normal_res.png')) + # torchvision.utils.save_image(rendered_normal_vis.cpu(), os.path.join("cache/propagated_res", f'{iteration}_normal_init.png')) valid_depth_sum = depth_mask.sum() + 1e-5 loss_depth += torch.abs((projected_depth[valid_mask] - propagated_depth[valid_mask])).sum() / valid_depth_sum if propagated_mask.sum() > 100: - gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, propagated_mask.to(torch.bool)) + gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, rendered_normal.permute(1, 2, 0), propagated_mask) + # gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, propagated_normal, propagated_mask) return loss_depth \ No newline at end of file From 4fd89f0a934b30c56353e5498fd746c05362bf63 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 16 Sep 2024 14:38:31 +0800 Subject: [PATCH 16/71] feat: Add depth rendering and camera intrinsic calculation - Added 'rend_depth' to rendering outputs in gaussian_renderer - Integrated generate_K function for camera intrinsic matrix in cameras - Implemented generate_K to calculate focal lengths and principal points --- gaussian_renderer/__init__.py | 1 + scene/cameras.py | 4 +++- utils/graphics_utils.py | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 1b630870..759fb147 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -159,6 +159,7 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, rets.update({ 'rend_alpha': render_alpha, 'rend_normal': render_normal, + 'rend_depth': render_depth_expected, 'rend_dist': render_dist, 'surf_depth': surf_depth, 'surf_normal_expected': surf_normal_expected, diff --git a/scene/cameras.py b/scene/cameras.py index 17879082..203130c7 100644 --- a/scene/cameras.py +++ b/scene/cameras.py @@ -12,7 +12,7 @@ import torch from torch import nn import numpy as np -from utils.graphics_utils import getWorld2View2, getProjectionMatrixShift +from utils.graphics_utils import getWorld2View2, getProjectionMatrixShift, generate_K class Camera(nn.Module): def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, @@ -55,6 +55,8 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.original_image *= torch.ones((1, self.image_height, self.image_width), device=self.data_device) self.gt_alpha_mask = None + self.K = generate_K(fovX=self.FoVx, fovY=self.FoVy, width=self.image_width, height=self.image_height, principal_point_ndc=principal_point_ndc).to(self.data_device).to(torch.float32) + self.zfar = 100.0 self.znear = 0.01 diff --git a/utils/graphics_utils.py b/utils/graphics_utils.py index 9e5759ce..211f294f 100644 --- a/utils/graphics_utils.py +++ b/utils/graphics_utils.py @@ -71,6 +71,25 @@ def getProjectionMatrix(znear, zfar, fovX, fovY): P[2, 3] = -(zfar * znear) / (zfar - znear) return P +def generate_K(width, height, fovX, fovY, principal_point_ndc): + # Calculate focal lengths + focal_x = fov2focal(fovX, width) + focal_y = fov2focal(fovY, height) + + # Calculate principal point + cx = width * principal_point_ndc[0] + cy = height * principal_point_ndc[1] + + # Create the K matrix + K = torch.zeros(3, 3) + K[0, 0] = focal_x + K[1, 1] = focal_y + K[0, 2] = cx + K[1, 2] = cy + K[2, 2] = 1.0 + + return K + def getProjectionMatrixShift(znear, zfar, fovX, fovY, width, height, principal_point_ndc): tanHalfFovY = math.tan((fovY / 2)) tanHalfFovX = math.tan((fovX / 2)) From 3273705f6de0fad760e12ebb9259a6da1ab86837 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 16 Sep 2024 14:39:06 +0800 Subject: [PATCH 17/71] feat: Add normal to rotation conversion and improve depth propagation - Implement normal2rotation and rotmat2quaternion functions - Modify densify_from_depth_propagation to include propagated_normal - Enhance detail and filter mask downsampling from 1/8 to 1/4 --- scene/gaussian_model.py | 64 +++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 00f8819a..3509775c 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -21,6 +21,37 @@ from utils.graphics_utils import BasicPointCloud from utils.general_utils import strip_symmetric, build_scaling_rotation +# adopted from https://github.com/turandai/gaussian_surfels/blob/main/utils/general_utils.py +def normal2rotation(n): + # construct a random rotation matrix from normal + # it would better be positive definite and orthogonal + n = torch.nn.functional.normalize(n) + w0 = torch.tensor([[1, 0, 0]]).expand(n.shape).to(n.device) + R0 = w0 - torch.sum(w0 * n, -1, True) * n + R0 *= torch.sign(R0[:, :1]) + R0 = torch.nn.functional.normalize(R0) + R1 = torch.cross(n, R0) + + R1 *= torch.sign(R1[:, 1:2]) * torch.sign(n[:, 2:]) + R = torch.stack([R0, R1, n], -1) + q = rotmat2quaternion(R) + + return q + +def rotmat2quaternion(R, normalize=False): + tr = R[:, 0, 0] + R[:, 1, 1] + R[:, 2, 2] + 1e-6 + r = torch.sqrt(1 + tr) / 2 + # print(torch.sum(torch.isnan(r))) + q = torch.stack([ + r, + (R[:, 2, 1] - R[:, 1, 2]) / (4 * r), + (R[:, 0, 2] - R[:, 2, 0]) / (4 * r), + (R[:, 1, 0] - R[:, 0, 1]) / (4 * r) + ], -1) + if normalize: + q = torch.nn.functional.normalize(q, dim=-1) + return q + class GaussianModel: def setup_functions(self): @@ -407,7 +438,7 @@ def add_densification_stats(self, viewspace_point_tensor, update_filter): self.denom[update_filter] += 1 - def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, filter_mask): + def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, propagated_normal, filter_mask): # inverse project pixels into 3D scenes K = viewpoint_cam.K cam2world = viewpoint_cam.world_view_transform.transpose(0, 1).inverse() @@ -429,23 +460,22 @@ def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, filter # convert to the world coordinate world_coordinates_3D = (cam2world[:3, :3] @ coordinates_3D.T).T + cam2world[:3, 3] - # import open3d as o3d - # point_cloud = o3d.geometry.PointCloud() - # point_cloud.points = o3d.utility.Vector3dVector(world_coordinates_3D.detach().cpu().numpy()) - # o3d.io.write_point_cloud("partpc.ply", point_cloud) - # exit() - #mask the points below the confidence threshold #downsample the pixels; 1/4 world_coordinates_3D = world_coordinates_3D.view(height, width, 3) - world_coordinates_3D_downsampled = world_coordinates_3D[::8, ::8] - filter_mask_downsampled = filter_mask[::8, ::8] + world_coordinates_3D_downsampled = world_coordinates_3D[::4, ::4] + filter_mask_downsampled = filter_mask[::4, ::4] gt_image = viewpoint_cam.original_image.cuda() - gt_image_downsampled = gt_image.permute(1, 2, 0)[::8, ::8] + gt_image_downsampled = gt_image.permute(1, 2, 0)[::4, ::4] world_coordinates_3D_downsampled = world_coordinates_3D_downsampled[filter_mask_downsampled] color_downsampled = gt_image_downsampled[filter_mask_downsampled] + # Compute world scale + fx, fy = K[0, 0] / 4, K[1, 1] / 4 # Assuming K is the camera intrinsic matrix + world_scale = propagated_depth[::4, ::4][filter_mask_downsampled] / ((fx + fy) / 2) + world_normal = propagated_normal[::4, ::4][filter_mask_downsampled] + # initialize gaussians fused_point_cloud = world_coordinates_3D_downsampled fused_color = RGB2SH(color_downsampled) @@ -454,17 +484,9 @@ def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, filter features[:, 3:, 1:] = 0.0 original_point_cloud = self.get_xyz - # initialize the scale from the mode, if using the distance to calculate, there are outliers, if using the whole gaussians, it is memory consuming - # quantile_scale = torch.quantile(self.get_scaling, 0.5, dim=0) - # scales = self.scaling_inverse_activation(quantile_scale.unsqueeze(0).repeat(fused_point_cloud.shape[0], 1)) - fused_shape = fused_point_cloud.shape[0] - all_point_cloud = torch.concat([fused_point_cloud, original_point_cloud], dim=0) - all_dist2 = torch.clamp_min(distCUDA2(all_point_cloud), 0.0000001) - dist2 = all_dist2[:fused_shape] - scales = torch.log(torch.sqrt(dist2))[...,None].repeat(1, 2) - rots = torch.zeros((fused_point_cloud.shape[0], 4), device="cuda") - rots[:, 0] = 1 - opacities = inverse_sigmoid(1.0 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) + scales = torch.log(world_scale)[..., None].repeat(1, 2) + rots = normal2rotation(world_normal).to(scales.device) + opacities = inverse_sigmoid(0.5 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) new_xyz = nn.Parameter(fused_point_cloud.requires_grad_(True)) new_features_dc = nn.Parameter(features[:,:,0:1].transpose(1, 2).contiguous().requires_grad_(True)) From 6d9c32645ffabf85c082807d271f9cc262f9c1d0 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 16 Sep 2024 14:39:54 +0800 Subject: [PATCH 18/71] feat: Enhance PatchMatch with normal initialization and improved plane hypothesis - Add normal vector handling during input initialization - Refactor plane hypothesis and cost calculation with normals - Simplify and consolidate cost propagation logic --- submodules/Propagation/PatchMatch.cpp | 18 ++++++++- submodules/Propagation/PatchMatch.h | 1 + submodules/Propagation/Propagation.cu | 58 ++++++++++++--------------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/submodules/Propagation/PatchMatch.cpp b/submodules/Propagation/PatchMatch.cpp index 5487a7e6..30be650e 100644 --- a/submodules/Propagation/PatchMatch.cpp +++ b/submodules/Propagation/PatchMatch.cpp @@ -325,6 +325,9 @@ void PatchMatch::InuputInitialization(torch::Tensor images_cuda, torch::Tensor i cv::Mat ref_depth = tensorToMat(depth_cuda); depths.push_back(ref_depth); + cv::Mat ref_normal = tensorToMat(normal_cuda); + normals.push_back(ref_normal); + int num_src_images = images_cuda.size(0); for (int i = 1; i < num_src_images; ++i) { cv::Mat src_image_color = tensorToMat(images_cuda[i]); @@ -420,8 +423,19 @@ void PatchMatch::CudaSpaceInitialization() cudaMalloc((void**)&cameras_cuda, sizeof(Camera) * (num_images)); cudaMemcpy(cameras_cuda, &cameras[0], sizeof(Camera) * (num_images), cudaMemcpyHostToDevice); - plane_hypotheses_host = new float4[cameras[0].height * cameras[0].width]; - cudaMalloc((void**)&plane_hypotheses_cuda, sizeof(float4) * (cameras[0].height * cameras[0].width)); + int total_pixels = cameras[0].height * cameras[0].width; + plane_hypotheses_host = new float4[total_pixels]; + for (int row = 0; row < cameras[0].height; ++row) { + for (int col = 0; col < cameras[0].width; ++col) { + int center = row * cameras[0].width + col; + cv::Vec3f normal = normals[0].at(row, col); + float depth = depths[0].at(row, col); + float4 plane_hypothesis = {normal[0], normal[1], normal[2], depth}; + plane_hypotheses_host[center] = plane_hypothesis; + } + } + cudaMalloc((void**)&plane_hypotheses_cuda, sizeof(float4) * total_pixels); + cudaMemcpy(plane_hypotheses_cuda, plane_hypotheses_host, sizeof(float4) * total_pixels, cudaMemcpyHostToDevice); costs_host = new float[cameras[0].height * cameras[0].width]; cudaMalloc((void**)&costs_cuda, sizeof(float) * (cameras[0].height * cameras[0].width)); diff --git a/submodules/Propagation/PatchMatch.h b/submodules/Propagation/PatchMatch.h index b0c88252..f222816b 100644 --- a/submodules/Propagation/PatchMatch.h +++ b/submodules/Propagation/PatchMatch.h @@ -61,6 +61,7 @@ class PatchMatch { int num_images; std::vector images; std::vector depths; + std::vector normals; std::vector cameras; cudaTextureObjects texture_objects_host; cudaTextureObjects texture_depths_host; diff --git a/submodules/Propagation/Propagation.cu b/submodules/Propagation/Propagation.cu index b3a7573f..db932ac5 100644 --- a/submodules/Propagation/Propagation.cu +++ b/submodules/Propagation/Propagation.cu @@ -516,18 +516,12 @@ __global__ void RandomInitialization(cudaTextureObjects *texture_objects, Camera const int center = p.y * width + p.x; curand_init(clock64(), p.y, p.x, &rand_states[center]); - if (!params.geom_consistency) { - plane_hypotheses[center] = GenerateRandomPlaneHypothesis(cameras[0], p, &rand_states[center], params.depth_min, params.depth_max, depths[center]); - costs[center] = ComputeMultiViewInitialCostandSelectedViews(texture_objects[0].images, cameras, p, plane_hypotheses[center], &selected_views[center], params); - } - else { - float4 plane_hypothesis = plane_hypotheses[center]; - plane_hypothesis = TransformNormal2RefCam(cameras[0], plane_hypothesis); - float depth = plane_hypothesis.w; - plane_hypothesis.w = GetDistance2Origin(cameras[0], p, depth, plane_hypothesis); - plane_hypotheses[center] = plane_hypothesis; - costs[center] = ComputeMultiViewInitialCostandSelectedViews(texture_objects[0].images, cameras, p, plane_hypotheses[center], &selected_views[center], params); - } + float4 plane_hypothesis = plane_hypotheses[center]; + plane_hypothesis = TransformNormal2RefCam(cameras[0], plane_hypothesis); + float depth = plane_hypothesis.w; + plane_hypothesis.w = GetDistance2Origin(cameras[0], p, depth, plane_hypothesis); + plane_hypotheses[center] = plane_hypothesis; + costs[center] = ComputeMultiViewInitialCostandSelectedViews(texture_objects[0].images, cameras, p, plane_hypotheses[center], &selected_views[center], params); } __device__ void PlaneHypothesisRefinement(const cudaTextureObject_t *images, const cudaTextureObject_t *depth_images, const Camera *cameras, float4 *plane_hypothesis, float *depth, float *cost, curandState *rand_state, const float *view_weights, const float weight_norm, const int2 p, const PatchMatchParams params) @@ -535,22 +529,20 @@ __device__ void PlaneHypothesisRefinement(const cudaTextureObject_t *images, con float perturbation = 0.02f; float depth_rand = curand_uniform(rand_state) * (params.depth_max - params.depth_min) + params.depth_min; - float4 plane_hypothesis_rand = GenerateRandomNormal(cameras[0], p, rand_state, *depth); float depth_perturbed = *depth; const float depth_min_perturbed = (1 - perturbation) * depth_perturbed; const float depth_max_perturbed = (1 + perturbation) * depth_perturbed; do { depth_perturbed = curand_uniform(rand_state) * (depth_max_perturbed - depth_min_perturbed) + depth_min_perturbed; } while (depth_perturbed < params.depth_min && depth_perturbed > params.depth_max); - float4 plane_hypothesis_perturbed = GeneratePerturbedNormal(cameras[0], p, *plane_hypothesis, rand_state, perturbation * M_PI); - const int num_planes = 5; - float depths[num_planes] = {depth_rand, *depth, depth_rand, *depth, depth_perturbed}; - float4 normals[num_planes] = {*plane_hypothesis, plane_hypothesis_rand, plane_hypothesis_rand, plane_hypothesis_perturbed, *plane_hypothesis}; + const int num_planes = 2; // Reduced from 5 to 2 as we're only testing current and perturbed depth + float depths[num_planes] = {*depth, depth_perturbed}; + float4 normal = make_float4(plane_hypothesis->x, plane_hypothesis->y, plane_hypothesis->z, 0); // Keep the normal fixed for (int i = 0; i < num_planes; ++i) { float cost_vector[32] = {2.0f}; - float4 temp_plane_hypothesis = normals[i]; + float4 temp_plane_hypothesis = normal; temp_plane_hypothesis.w = GetDistance2Origin(cameras[0], p, depths[i], temp_plane_hypothesis); ComputeMultiViewCostVector(images, cameras, p, temp_plane_hypothesis, cost_vector, params); @@ -567,10 +559,9 @@ __device__ void PlaneHypothesisRefinement(const cudaTextureObject_t *images, con } temp_cost /= weight_norm; - float depth_before = ComputeDepthfromPlaneHypothesis(cameras[0], temp_plane_hypothesis, p); - if (depth_before >= params.depth_min && depth_before <= params.depth_max && temp_cost < *cost) { - *depth = depth_before; - *plane_hypothesis = temp_plane_hypothesis; + if (temp_cost < *cost) { + *depth = depths[i]; + plane_hypothesis->w = temp_plane_hypothesis.w; *cost = temp_cost; } } @@ -852,22 +843,25 @@ __device__ void CheckerboardPropagation(const cudaTextureObject_t *images, const float final_costs[8] = {0.0f}; for (int i = 0; i < 8; ++i) { - for (int j = 0; j < params.num_images - 1; ++j) { - if (view_weights[j] > 0) { - if (params.geom_consistency) { - if (flag[i]) { - final_costs[i] += view_weights[j] * (cost_array[i][j] + 0.1f * ComputeGeomConsistencyCost(depths[j+1], cameras[0], cameras[j+1], plane_hypotheses[positions[i]], p)); + if (flag[i]) { + float4 temp_plane_hypothesis = plane_hypotheses[center]; + temp_plane_hypothesis.w = GetDistance2Origin(cameras[0], p, ComputeDepthfromPlaneHypothesis(cameras[0], plane_hypotheses[positions[i]], p), temp_plane_hypothesis); + + for (int j = 0; j < params.num_images - 1; ++j) { + if (view_weights[j] > 0) { + if (params.geom_consistency) { + final_costs[i] += view_weights[j] * (cost_array[i][j] + 0.1f * ComputeGeomConsistencyCost(depths[j+1], cameras[0], cameras[j+1], temp_plane_hypothesis, p)); } else { - final_costs[i] += view_weights[j] * (cost_array[i][j] + 0.1f * 5.0f); + final_costs[i] += view_weights[j] * cost_array[i][j]; } } - else { - final_costs[i] += view_weights[j] * cost_array[i][j]; - } } + final_costs[i] /= weight_norm; + } + else { + final_costs[i] = FLT_MAX; } - final_costs[i] /= weight_norm; } const int min_cost_idx = FindMinCostIndex(final_costs, 8); From e1926b095c8548a162570fd11f7b5763824320ea Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 16 Sep 2024 14:41:10 +0800 Subject: [PATCH 19/71] fix: Clean egg --- ...aussianpro.cpython-310-x86_64-linux-gnu.so | Bin 1031912 -> 0 bytes .../gaussianpro.egg-info/SOURCES.txt | 8 -------- .../gaussianpro.egg-info/dependency_links.txt | 1 - .../gaussianpro.egg-info/top_level.txt | 1 - 4 files changed, 10 deletions(-) delete mode 100644 submodules/Propagation/gaussianpro.cpython-310-x86_64-linux-gnu.so delete mode 100644 submodules/Propagation/gaussianpro.egg-info/SOURCES.txt delete mode 100644 submodules/Propagation/gaussianpro.egg-info/dependency_links.txt delete mode 100644 submodules/Propagation/gaussianpro.egg-info/top_level.txt diff --git a/submodules/Propagation/gaussianpro.cpython-310-x86_64-linux-gnu.so b/submodules/Propagation/gaussianpro.cpython-310-x86_64-linux-gnu.so deleted file mode 100644 index 2b5705694def3b5a6c0f45d448e321e3de4758ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031912 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 z zy!GuOeSOhK@~82R-`2yI@{y1i;Cu72B)(n(-|puriEpGo2H)MHbr*ai{WADUpJIHg z;#Z7sU)2XH@_`J0b$@q^Z(o)4Q2urJyPiJW*q6k&{0Agf$lvbgrxWp3=o&DJlyYQL*?29gZwmU$61&pKh)Yn&I-g;Q0+h{xf4Sdr;91JfQp z#`3BY@>mJ-``q?W|Dy$@Q-^H*k5U}s`ty&mKG_SDM|*pi-?oST)b=oc*dEWTp==wU zSRd@C&ND?Y`m>+q)gSdgzn|s9`auu>FknM3jdwawu21TJ!GF?8NBh-7fNlHePoeq* zV76iCQ_CNT(}BP5pJ1B!L3|4N1|a2Ee~;CUDjoj-27Ri>@u#H^@L4D{!*uk&5=Xsr z7tR3EHv=!8bzqDaJ5?Uv%y>}%==viCjW?pV%I9|y_t<{+oo1S@Fj9I!lkhKA|0T?1zUKS07cBgB z!pr^HmW6M5@=r8&Tm39t?04w<0QK$I60#fmE`i_q1>!3Cgudc@g6P-J@e})bAP3IQo#`Nqy zKJ`MrB{>VUDA=Kk4hO%wl8JZnL;y21I& z)(rizxiJ4Xs2@3x@*nC4-lILMWb2qn zOQz*dne!B!0~vkGCGWco3TK!W^DifTQvMD63$^Fy!`woWf3MwSW6}rkJ7;Ve^IzYJ z^F3K6;s<<$f8LY4mhlPp0q;F6OIEw!uXG20Bkw3L{0jiP+6SNXbL4l4vKr%`@30R| zq?`WIKGaQri4XMy_F(Q%3jcq>{2~5ne=>=Gr#+}mWG7HO@~`}f?5Kt1Pt_-~6${tt zk4;TzMU45Y8gCCv_eh^xTeFm(W)Jd5c<*P@c@~9u<(Gx5$nbmmT{{+j2_67BySODzQe}d!5efZCe zKlujBs|}T}HkyE|_|J@oh2t!5>xaM4f1KrQ{RO@shPvAL6xMf=`JMVsGQa8rKK4E6 zHa=PU%*Xx@?*GSpHIKX|UHI?a8_6Tm{a{}6fq9k(414^jlMZ_9)m5u>p-uni_pvWw ze$Yeyh@}Vf%imFcwLgDQd08Iq)Bj-kF#lw*_ki*;9rOqOkDK;Qe)uEvHKtKMFrTGA zMtiPrU%3Lf*jES4Z?G3zXrGGw+v;Z}n3|s=tnzGsY8TtnH;u1TT8<83*rzF#XAxtc z0Cu%cQ^Y6M&w}pjpQ1fb{hjt{nRUyanDJX}hx!S9Rr?{#`QOn@V*K|0ZxlZeU|Z+LV{k@KX<%FJVp4&^ZS0iKW^oh`Xv82=1+bH`AwP_{LT5(5C(lU ze`GT4C&%YL{OQt}lk{8tJr)S**WKPh zf3~9SHcN1RkvLBYcrwV9q3A3}ZSA*L-|PyNTyehIvX zy|(spa6$V)O*|yVm-zXnyyT-Hd+wb`;&=6*v$G+7IV0=LPx|3JXp_lyJgWpoK0Oas z=61uYAij*mhJi(Y)BpA48Ty(&|JsLmv*%rFs(z)*m`Cj)e%T8E1`rAg`NMtsIlgy2 z&TmFvMk0E>uJbQC4{PF;=6Lo45nEDXUoLm`aRp>u{um^rHKEe;I(|i4j z&VQ>d#Xn7bO{T^5DXZGU_?77IZOUuT>7S`j1z6whe8>Ib<<@qd95C^1;D`9^cK3Yp zdiP1S|9}yGbAQ6CmvkM!!LMrkuUU2%&3V<&DE_=knEeNTecY#xzZiG z`TU5Ux46H?-0$V+hr-Jj&dEPb-N%LV`;hND|JtSB&=&6+YUKI@?rp?=oGo6so`87y z{EC)KnqmAn6Z9EdM0`NcUaT+a#|(hA9&y9g2YBFeW|Z;kwMv`o2ieSJjO6b?30q$I zZ@T$=M!omLU3v%^pdXpb813Jg%74e^|GI6D8qfZRa5)86Qt(_7F09)6AfFar8!tz^ z`ZqAmfa-_xpByh9gugbb{fcq?3-NtUu;lNZMLO04=0f;>z=)@DfQ|e?#JBdjFyd(^ zTp01Whg=x(vbqa9@wCsge#GaN-E_pu7{G|yLwv63!ie`Bu`ujS<}$SZ`vH?bqCXa_ zzR$wo=PQ>Gp984+9@^qfe)RCT^79+y`;|*i#OoW7r&lgL8LyWJZp86Y{$4y~&R@$J9RS2mE8^M)|8)FJonm-#7Q?eeq&}-aCGIu^#lR zm!ZGMP=IQT`}p7X(eVYY=Zteb=XLV4HeQV6nez4UcrhWr)$w8|uVy|oUJT`3@XqmK zD6fM3@nR^?f~Uuep}Yz{K3;61FO*loC&!DSeh8i!FNX3g_{4Z|r|4WNRZxR2I-+Zs&riNrQUQ~idY7a9_{96M5rfNjTz*j*3 zN2+Z85q=WArxfp(&no^rGJQNuhd#kyubpIGBM&N&*QQUQzPSGnKOFT3^-l)1V@iwY;m?!a z>;v#cf2MX3w)6$Ob3fs*KYs9V{WM^;ss7a;CH;jj>PI|ucLXc_%<-sw!N(7{>3;Cs z3HIkKt3W#9+w~Z{GfPNXW4hWu{TSuV(hv3fCDuJd z`l`QY_b@%C=hFuX$Mk&uB=HaF=?Bj|M*hY4Kf8yp@K=A2A0#aNRsWe&EFa>J{w=XD z7C+b5KSd?ZJ&OKj6t=c^Q3g>l5rF_*akkcOLv(sR3*^O#F%Q z*eRd*i~is@=s!i;i9dpCdLIHqq2vMjF%{*v^k^c<&|_Bf8__<*AM?31J?=c4q{p4F zvb>>3`hB0m#cB%w=Zb0kZ?d@cpC^N-oeT92_sd8|A@! zAxV#$ud}mvD-ZR)H2ybPJd%ggr&IEf(ucG>nDG%b3*{lD4@MqheW*@tCJ&qGgZGXU z{=dP-->5u1Urf^@DGz7QrsU!Iq<*CBLp^OD>a0K34`UymkMyHf-^@O!e_iyW{LUmj zZhR%C$L98-UWmp^Yaeg2cq9)?Pk*<|L-}1P{QnvI|3>AZ-j}9FQXZavCM6Fk{YcBh zcYeI6ygNyc)i1~N*jygY6w~!G5!KT*I%fm?ZGnjJ;uNO zIPKwbg#R;|kI28+V7y#rTMqteKZM~wRo9W|5Wv~-=T~m@Sli(B>(3A z{in=+2&4;NZjWd;V*kKT`v*@Eml)sLlc1mXRD|!-q7T1y`isUtc#3Hue(;afeh35K z^81qb-uS015aRpvrue%2t^~_Zh`wI4(?2l#;|#yqe}ljH9pisIjsJ1f*N*Y`A1AI_ zM3ujI{5a{e5&qcUvW&9ven8-#=6Cu1Dg3{P3M2fFZ;HRm?@I7gL-h8V8{xkR|7&Ud zYpl<~KgIv5?w8&Of5!he<^Q=9{{Nec|K{@rm;c;9bezS>-}HEh^?l42=pUNjm!BI33f56CN8}lEd51fCx`jD1~$_JA4SY2g-P#^A19@f$S zv)%RoxitUJrsfCY|JexN=bq~(|Kz{s>Y=``r~l`Z_}=(}i|=!r%D>D1N^trK(bsE6 z{EzIP(SO5l_J3XdKb6M+6zc2H|I>XaFa1AtsvG{$|I?f5|M#Tu|8*DtQ=8(S)c>;$ z(R*Y3H{pM${S{^T>m%a|BEU7|5q3Pd)I%)J2uw;r^WF7-F+Ki2 zzlfqSJ!;bbcs{VWNdJH`vC(*#o)2{B|Mw>8vHHKTvQYmQ?@1ok(f?<=>;LJr{69;5 zit+WO|IbGHfBJMc`KSIr%kFp6{|_edz42=-5aN4!Q+$*9|NIjh&IgVD8-Cw|{-eGQ z{eS-M_5b-z_5VXD{QrrI|Gnz}vklSPYi?x!HsOD#{1l9P^jW104nHpHaY z?f%dv>c4{ioLN#@lwR}Q`u*VPXP-uzVlcP1_7*PAB=$cdUi|DcNRR6`{=VBkmKO|s z{NUMT@=x{*{bm1>x|A&M(bR_$^Mm{bM}N%ukWUjK2We4HN%neD=91`WvcK z?aj=v?HSgn`l{7w{%z^!2j`}a15z7G_qQq@8Ku|iEGzlF&i;SksVTtXndGFbe8((sM#V?AMpWrgDg^E=Vrv3JpY7wt1X?tNdz*h9dKkKggwLxNy0N{TAAvnep29u|4Q3_?5%@g7`U9!A9Y;fXB^R zE#dP&s`5&I@j{mOBh9aT08fe(7##0=bzEqy5J?OZ+_3Y80LECi)S4;xxWhfRt|Q&?Op7SJwKdjeUR-N zdLccB^%u2Ad3cfUDeQp4hWoQ-LC+74e=wqF58^95@p}}&2m1p~vA~P?kMc1Yd}zt^ zA28^R^rxAAp6OVh<9gSJ_&4>L_AsbE$Mo;vH{_>1b<0l%CqKY+{l1L#IM`E_=LgsW ztakwn<5#n&FCD+yq4}w!?;m3QaeRM==JRS3_^h}7m$q+eKh%Hd`^}GJ686peC3a5s zttS)gNcnR;OvKN~FW0{!ddR+YydQZo!k6?~@r7>}`=<3$7hlrvWaPhYZr@I_dm(<9 zzozlML5G0pkRRIf@-MPLh;Q1yCGnkKImxcs^AX_pN}Z%{ump z2`@e$L4Bk=OCKSx;J5VUd-?6Fv)FH8+oz9n9(`-=sNpYn|K^VL{!Lgi{0u+1f3z9G zx3GT`{yZy)=mCD;_*+T*SN}(55dN9;eoL0;_^a}iFSmZ!FPy)q5#e}$XO$rEUkLTb zr+uzP{PU%t{6_j0K#wN>raoEuxkK36|8cf=LmxDMhkiaU3&8rIZ_p>d$z;NkuWFO} zv_tLDKdGrb>4)b3(w8=wXyO6YCewV512&xqtglbB55AAGiTGd>`CaoteI zccV{-S)W4>gFg6c;=vzMI-0Ql7(h23+~F_Kz%*lg{lmoXLmV`OZ+CqHz8@04Y!CeB z{%5rx>KEjxvXaDi^&cXym8Z`A13gT{&&Vs^Fa4QM{o28BJemx4=)R;d9*}8KdhL6< z;CK1*yWZvfO*j5UQ7n>tiDq){z3nd|D= zHA*9WGI(Frj>u8`VpSIky(<5reEA*ki0B3WVgJGV72jojDu3p^k^hNw(DNM;J(Yj? zeapv(H{4|8G1LxZ@h=S;}^bEd(5N%jQ#;07d!-i*!s5> zkR$Hj__%DFXUZq<$E18MKgIsZUW4DX&+^Zr@ks8pJ04Zjnb&qh4njMwX^ZCv)B_?Z0sM*5}4w*ux9N-HDX zjz6o+OMV)AyR3A6()hB2^4X{t0Bir_4)sSkNU(I=ic0=~`^{rl?^ovabKlG=E>NOtyshp?=1HqxaNc50Ty%r3;^$Hc;!Efwi4Cgn9l)e^Z{#eJUlv#8>jm>bl;i zqWAnX9;^OhjiRoPf;;b1k-S>@g}=c2H52}k+7IbN{eLM*kE=h61|oS*pBG17{UEQf z_q=aJ^d^4L*Ge!t%Kk}Mt&1N9yRiVkHVkia_?6urSBUlQ9fdMDeAnSkuTbl zz7pr(bQj65cl}Gvyf{0snCRtM7hPec}9{_0V2YK6%sv zGB5p^Ul~oEU&zMsC7oXw?c@1{(dhibsnO(ln?s|~`5AM*U^F_PBY0snI&UL*aWp!g zBY0^v+eCMw^9hGXllR%29*xfbDF4~f==_b~Mj|=zO@~<urB97!D{git+yO-{$!bT)*@#$Oq{M|M!(k zMZIq(e5-lccTXY>en4I@A2@o7^-G?){!lu4D1xs*9;-)A0{6z0czL^bl?CGY-`vq;yR2JmEXqI8_a`2&po+-K?nnpS`O zW3=~Se$1~=(7r2=%0KN#^9$LNXP%xyy2b#&g^MMR>k;An7Uv1hOcQ2*m4EsK!^8S! z;HRH+V2uCMDvxi*o>u|38zt(K#{a7J=L=tzFHMtnu|4yjVcN9vlRiz&-;{p?d#1iP z_FV0UFzk8d)l6c(zxo+8VC>nJOwjCV&ywfiC@;^CM)%`=p7HY1Xmpx5qzjqYc= z#rsdtHgTbTqyL4AV-9_J|H+<)>k=QpB<pYx@lG)7s7={qX=#`i~zs=Q0zCh{A5#PbPt(_e?47k(f~&kH}p{2CuX z&(W^*?1g+anf+T8d;dw*;7VBcpNtvY7%$fSC%(}wttUJLeWv>o#`k#tNtLKK@E_!V z39!Oh21dO20~b&5{xRqN6RckpnAz}y_lN4dvhdUWCnrQJ=l+vsm|y-)(X79hQ4Idg zWYB!Bi9f@52;o>kN2hYc;6&%)FFp6UP9 zO@Cede<+3jPqD)x{-u;WC-LvJ54hiC0>z{Ca@>C+1r5*pO{eZdnMvJ;GImP1l0I5* z>q*^*;&cBLen`Jg`#*Xz%CC4v^<u@xzV}@UKP}m@b}Z{HiW6 zy^8-#{iVfZ{WYB@jK{CBr4z{N)W5{>#i{=+)1CUyGCiyx_USO&R~u@-c9`wg@E^yw z$zY83t4+|rqoXJr!6?7X`knI2tY76tpXzS)jr3CduEhCPRK5}vA9d0>UhiUG)j#8Z z&J&h?iJsLxY%A=4B^W!9EMI(#={7&&iwkqgi*M||AB^p1eU@IdAA6NIPCv-BKwg6c17{wAC^7|+#qsGrbR zwI9N;S9g9mlNitM{3JUU>T7p<)v2$zPqiP#sjr{qdD_tgy=cGO@f-1K;UC8{s+7l2 zzM+pL+3T1;r6(7VPM#Y7X{~tJe%N^iHZE5&(Zqb!hVdQJM*4yIIr`I^W!_cHr`2Au59N)Ehjf(BVz$no zEkD{NK4kPqw3j@=UxWUrKOqeJbKy!-zApSYtEc{a1o^xBziIn}_mv)?{A9=Q9@p1- zp9K5`@-CWx_r~{8)H(lf?vwaD@88%S-$x<)H4?|m@BAqJ&0dWK>|%B67V4v+M^pZ? zzcPm8c4I{H%<*Gvg!V~10)PBqq?d4PkH+gv>y6}pWQ_4?<%fJ=yyA7}ZG3|K&Zgq$ zTQNWI!~HCfFVGwGT)mp4XXVFOIJ8G23I8ieKi*FQ{HXxeepB8np}a#LCWGx;qyAui zh4q~6M*f!{`Dg1C7A%c&VAS=(U)z?f9(@J3!)F>cOCa( zr{lL;s)*yaeTsLgJ@h}l{?HM>1^v7qPtxz^74#*dU-x)r!hV2%h)?M~mkUqZ_Z(V< zSf5S0-Y>fFH0%Z7JnoA^>-_2c4AiIh24s(HIz~|Z+Oj9qM?}la&!$U%so#K6Uhf;q z9w|Lni1Ziq&$qI=k4hC7IGY#H7C*~DF23I%@g3X`m5c7nhkj5#qWz|zFYwJ#w#|L{ zONQP;2=*HDn=#x!L{RI`XfN@8fa)KD^r4502crJ@mErileAJ(iSH&oyrBbrbk4L7sAB6nD`O{el12OM5L?{(o<8B;TMP@57UP z(x#a824fE*dCf~+yWGEN-usk1v%Nx{ZRrsgwcqW2s9ETr&-ZZJ@}Yna_5HO^CgpYR z@1ep-Ueov48R$P})@&`ZRWk~Pr-!ShbW|Cy$d3N^h_{hY&Y=%JQ(z9e8~PJ;-lA@zRike^y7PhgZMLkFED5PyO3T;AA)gH`qxeV9AwkLJ;2``?|K0b#N%O|@V40A z*M|Y;;_*u|LC> z-{`+1FQ~u8(a>v#@uR_DcsuE-`k?=yxBO4l2RL_edra>a>Ca~+pC#=NrGGW(QJ++w z@+bM@uWV;`EPZF;UycKAe?h$fetw$%D`V(RoL&jCx&V+}HuJ3=V=OBfAiwc`jOL!? zH|k@2OXG)yxnBeIHN11MFG{!gMEUcc>@i{3bL~%d-uFrS|J+{{%}>yNLjTnt=RQZk zl)pJLkoHdL!=~?1``crEMLPAZ8tTt2zK=5!<45~MeM4=bei7at>ffzi#!C&pY!mVM z!o?vIyJ4Z~L*yUAFNyt)+4OvD4jI&6jF+_USAQzB@9)?CP45SpE`M%IdVde%8NTEJ z+Y-Fn@5g=-j;HQ?D?2rX4{>~NO8UWXv`=Yz7ohL*7eEutr?({T=M;T2F@3+r@zu}C z*Q30E-^g#}2j$6s#M7<+Vg0)yfbE8isMa$^)E~*0%4a2SD6R5{uldqn3r_|^cK>yl zKGsWHBK%Mu{%KaYu|L-d@5n_k(&3NGKbQSsdn=?DD=Z7ar`Hb1d_`d2pvKz>EvZQCOHLf=8pZ7R<^ z=eeJY&q=xT?A3ft^hAC?$Zli*j~wh#RMpjQt@i3h?brw5Be zxNs3~Vlg|V{ygoa&~f7*y=i@m@dG`9U*wNqzZLbb{Fx*^?T@j65TD*n;vc;^!yoEn z1Nt~Xuo1^Ua=q-k@fU@k@(Ul)hi&l({9zC1e=5!BqvYd8m~QrOjVPVpBo6~Xr`_n~ zfGYhOQ2oNu&~G5pC&Alz0c=}7uT3Yvm45?yP~MRL>*&Ywf0v}+)dc<0{web67vejx z8NOjW!s1JHaPb`(VE@Gf;WIEo`HJO#+W_&E%-QrP{|5LfZx?)<*OK^NdxZ#v@-mQ^ zf2ZX?WpCHxuX)d%Rf@mc(47Rn@>gSgvWhP`_>x|2*%0BI9U;ETzb?Khdk6hc*${u) zzyCgo?`v&#F2pz672gWpH#Pdvl)lfejG?QsKUryw^qu(q%g`64<34+&N<<(Z=r87P zdazA((4MzO``&ZqV~r8YJM;(kPX3zY_jNNL5iOc#zEcQ#&GVFX9 zRW_@1;*a$c*hjq=sC2|6(ziiX^6V}J~{#<{s91LtDYVv1MKmEhVe*?WU!7h*Ui*P*2h4d&_ zG{49MrG!73@OM>y*qd|8XM%h@K2bhaWN&BX?;86zN_xs>kw2F~{tNg(dBA*M@J9fb z5s$I+-)qJn^=N<7{t^2_2V4C|d!7F1wwNABkNii*Cjm3QnWV>9jIYf<82XopXR2C}HY&VSmFbjPf62ECv%zR90ORQY>2Jz5GyV#otll+1FB;v!L=Y6%H7duS)-7@j5o2;Jn zLjMxk8;4e{E|J2^l6vbtmjW2}l6-hs(Z`($D7}CRE z8KgMRR`C!0u}K4efgtl&TEl~X{tw&OlHC-3;Kvm8S?yu|S!rz_e)Zp1!|@RK4i2%x z(EcX+2Yh-j?lkskSH=3n#a&B(zw8a#^QD8qko42`ANGFRVALM;1LN0l`}l7i_s(NI z3H9Z${w@1XdO-g{{~^*}?TcSSyM`Xbo3E@N{Uv<|Lwkkt@qO@3*={c(pU2H%^t-=WN+C%^wVF_@~5Te66h(|&=dXlgUX|iqP%`MpX;~s zBfq!xH@={l1IL5bSE zedbq;D;vh&##+T;h_jIwq<^dhZ!i1-=6JP6*!JgREn#kQDBX!qviwU~PFDES{pW)% z^FH_5s*R_$xE&1V$N7FS_@8;H7|xHC|5q6gJcb<1#rj{0#`A)?FTAMhFT78~-a?)j ze}(2m^uF5a)p}&(=C`&|p88wfAbmNlFQC4wLB2r@8n<6odvC-0+tjT!5B+(43G!yd zb?xRK>wa>a&(Kh#cs1h5<(E7YpSz81tyn)Rx30=AdtRdq{M!Vr{Xl(N zypN**(?WYDkUcF?@tNQcvW$)EKyIp|&L;M@>Z{$5Z zSZ?C=4|wH5aa+Zye=IY&#`;V0AFmX~G9?kr_pB8$HMd% z+5ga=OvEGMZx4p{Yhq6RCFGf=pe_D@e)Y?+ADK35Kp!6K1evY>{1)#pK(VwyLS{m8&jF*&1PB&gs z+ALne0*2luUef$W;4tyIZsK9fe~TGH|D&==yrd%ej`xemo}>Q@q7U9Ls#H*$d5>E5 zUHSQq?WOUrwDyj;<7ENkx$;6CxIbvHwWg;b*H+v1{rBqH=YM|s$)SqJg+gWY-NXD>{Bd$zHyJs~{08_Df2MD4Y_ zd5+g69>ww6o9B4V?6fC-Ykr>Nv0${%@p4&!(HG7i)V9?x`kxi1hcMz7cYZM`uXjGe z457U4>FO^RE?WJx@>93Hw4*xJ;mHsdf@d>JV`YXa;uve|1 zfP5I6&a74b(}C}-<^#$b;{Ts=1)E?f% zVRpjo-*0sIH(=%F{*Bh}P<|c%Mxh;z2S`u*H|5KGm*L|ye~5aTgv8`}G{f0OW! zAm4*6pW+$&H{e$dAA}#|`Mbg2;et{Zf5#AjWJ5%x_0i^V`AH{B|%kza31?ZwFKJ z+riZQc5t)#?M&MK&lvk}=+R;SZTsPTc5v|9p5IcH@526@{iy@NjO@pT^V`vm`K|Ej zoZlM!GF4f#$ls3Vx9tt)x2i5Nzm+ZWn(NMQVSjZLW^MHcG{3@rY@o|uQ}#52_*P_Z zAwRU=WygMF{uSEmUg|UJi|je3Vkuz&tT`BG%hWnc4} zP-~2#eGQ87c^<)@(%EBUkIi@_sGm3qfzLS9RFa;wJIJQrCFlX7-fp zZItKG-lzR(_=iRL15vzik_>YE>A^VO3;KWi_B5~1Kp3A}Cw{1Sn&LSd*waaLu!}v_ zP`a@_9W?Rt(4YR#*`9)5gRNnPpNxHhyuu$GHulZfld(6`-lDzoruKGM+TQN^j@etR z-zVaSj0cWd`fxo8`x`s`>0RC~${XW}um>^y?06Y?>VFvj%~Y8izsR4SwElE^1AD6C zjy;|18ZRujcI}e?Y~>gBbdvfI+f%Q@o>m-t3j1lw(;g#!L^!gi;2-?y*xmx)LTeb+ zTl>oUj_RdBtUenMYiuM_sy56tp;&Eel(kAhW?*8gq_BC9e3H{Z-ZuV8%9bNl6@>gqL_onUZ-oIM=YU#6~ zeKqlR$G%$nMfO$wkL|0XnT~y(-^9MExMN@EyT&WZt-X6w_H|zI(#T)!w6D#ieKqA{ z`?|NgeH}sdZ>oJA>26;~WM56Zp8hNO=d$IO*Jv!n)#kfWo&C zy|G^*5f4beFW>3EikP(iW`2Npg~kdSuSlftLn# z-f^wm*8S><^>D;z2431$>C^l#9dpK$H(P{Q85nd{|fZ}au?skHr_GW{{@ z$sO^8H*>vwJ^!|#?XhOPdtLu_O6$Fj{k8Nn{VfNc`XAZf!6{0=V}GYNi5IJQWDjt^ z)>^lCLAfNZX?MEZ2iaVJ$-c82OES+WUhU?;Y}r zj6XR3@HBm2**N5fKTI&Z&m@9t{D^ei-!hDV1Aa}rK5Jsbq7nUP8K>Bu!yXMm{mp&F zXdm%_BWWlx-5TP{TmYkroJs$ z-`>XZdG<^Dq4Oij{+DLhpSb?Pu|dFL{h)`A{-{pXKRn{}7yTa@aqt0t{%FK+t&iu) z5l?jrA8%Z3u?fK=V;sLkH`I^y^KlLsA%Acmo>|L{>7(<>8b4KjPks;bSMeX?zqGea z{%zM|xxQT?Xy=1E|9>N6V6=Ax@vio1W?0q!k@R^n-UnS_GS{!6-~LJkqR{?=zHxtI zP^mz6aNZbNqxn;<#x%(b>QCPXo!AeG{^LA$yuTRxyKsMAk!6V!@!@^w{4-pi$pjTo z!@nJmRo{n@f&4}OOfVVlFBAM@*dNdQjlva;uQ+d9Q-wTli2U52H9*|7Ka1t79`{p) z@v2X^dK11Hul88w!TUeU;2>^FyisOOlg zgnVLtfE5z3kUyDXd_OeGLqFp6DACtQkN!0Y~I!Gx*|LHG4BqMyw zm$4n++5blRk1ivf^!mEthuU*s-KR+y>(iOb;Li8i`t-gHkGnhaaXIgK-*3~wADpM$ zQenD{S4@5s$1hl(Kgi$YM?qfZ=MQk@GR{LOy{Z1Qf3&cse@l{=p>q~Se=3)UZ22bS zf&0hN`(sEa5m6uRE1VEMx-a7atnZ22%}~C2Tjn+l3ApGrmhd-Uximb16VcIr^MN3z zt3c#$8GjA2A*735Ti8D%PY%3RNv5yOrQl`?UQWU1Qt*Wse)ZC$QWv8?II9>Gv>$V= zV)h@tdI^@C{ilA_d*E*g8_)-Ebr$^THTYQmaDR*zXlcK`CVy7vX)c^I_s#Hpn*XD-3*{5~gZ)ju>SKBCzX@_a z^Gm3tU)xJWFg_2PlfNsZ!LQ_bgjvXY-SkiTY|bOh{a?U|@O69sa}j?>`)RtJZ(C2E zwoj0hI)9+^2qO~(>auel;SQ@0{fUctv%i~VbRJ>fR*W5O=J399h4grIpMYjWkL`l- zkM<*t0&F+Tembm22cvmPFll7$ecmS=(`#%y(_(t%b$_z*Z$K}#7urAUw>tMbNqV(U zu`!KLIKPqHUz0u`2mhi^Z5jSz{LdB0tGK_97RmpJfByx}f1^3k>l^T|AYbZ_=*9cA zhfB!cmVIRW@glaqGCO}}zZSqy-bkO3Sl%Q*xe~|fm_GUKY}?$=%JDuo!oEfQ`GmVa z&B&A53+aRLT=E*ipx4!Zo}}0ENmOXZ^Gx8#7sdzNZ?aEqkv`x@THlb~7p0s27aj}y zC%CTtyUGK2o%>FP>ujEbrlAi&mp+a@n)-){zs7gLCEa&2%t6DXQ=t>|X#zIUH=&JzKiHvdCz{j)z_f;Dr~2JMg7U|nglF;mH%Ab zRRLVZe;iN!;0ZoBVakJle(?AX`crZK{X1xnlppDtR?fU-X8D(RKMwNswvXnX~9ZNPZ6HiXnfM-pmz4e%<1IiVL3XRT*{4Uq3{!A(7>N;Na-OAtVX5 z`hT+rAMAKh2_C6EOi=ve{o7MDqGRB#u&0ky+598?g!^s$U`qEzPYEVJ9+^H6ri1=` zpQXVx)dznoIQ+QEZowzh-WUuh9N{5jH_eK7r-+Dq8d2mRa0_fw+& z_`$<<_D^l9fAvYyU-+Va#5?vxu;#yq4@B)N|A8?l9sONA$o^2I41el#zf^6g{+Yre^OFA1H;kV%l23lB(%(8(A%87D09R))88PFf z>N~!h=?;HJ35!3n_XiX66WqsIp}bl8p+5gn*3CYe{vO%Q^q8I}MhRQ~LY_}Ih<`{= zKR7ko1Z?pG{Tmg+F+EQ1CLGh_aFgXj{DIF=_9evcZ67`GBp;wWNPENarx82K2qH zPw*eWzk0+!jqf$t7tvexWy&Z12BtjtQ=}Deu;Y2{QKpH0kO%0;RFvP+qshD)UuQ)R z<+b*EJ$hXI{Ukk>Re_;LdVJ@5f=T=ri)s9CvUzI{abNIp^slW?2LHt*{=V=Re}#Wt z_Rzq@uUcpQG5$s#)u!;T)+71okOzam@^-`jRtkR#bmZ^cvpmRMk-n}g4+{&xt<4q` z&-gBshim^bNss1}?CjmjL%r`bvwO|RKfXyYl7~ZwQu2_}hqOGH@ewq$@?TBqgOP_= zAF5NE$-`#)aP4*qf1VzC!}4%i?vP85qatACKfpYyE<|C7d7C;hH>#s}y>Y-e@{|49DLdA_F7nMe5g0NwX!kEi{E<4t6Z z@%6WZe$IO%$B+Af`K{AmH2y)8Y3#4XSM7%|@O|wYNqpxR(24LpzA3&gzbnD9VbRxX zM)okm|C~4@K5o-`+LNkFR*-9{(m!t|2zx4 zF@2xJ`@RhpCqJ!!c#|;oAMtw37Z$35@ekG~p#O)u>wl*|a0o?XdKmpb6zPAX!yi~y zduaa~Mju$-rH9&g^kMZ6lk})4fECi?-sFMyFOq+w|3@S*?8CbHzmS&yg(Jus<7@Q) zNQCdgLO1y*|5@I}w?qH`Z4%!(1?WP27dDmur2Zco7Ja>D#Qz9?qyL8A?Ekv@Z{8QH zvd?BbYofjm{XZ1xf3w*Qf9U@q(5}1w|34W+AJ}uQch4yx8RFmE6#u0D9~lw7H^zSx z{&(tscm8j#|C{pvP6~f*5fAa-e17QipZeb5x`6DO)n=g;W>Vt4&NoF4xVFQRCy z4@UnNBYil0c(d`Jy_fD@l*a91Dc>IDAj?u#Wzp?ymnw)B1ljIsY;Ge>%eV zXdFM`Zq~*3=%)CJer1%YGG4SeEc$xQjr8B}`yTWk^>yg~;@#{2 z;->ol$0__3Obq#bulj#_MD*Sm|4sPcssG*izq$Tz%Ktw};jiFkh<|tePpp?fzFxU> zBv-6J7PubqdESSI^^$^xwH|@>4uJ7`6xJ`ez!R-sVf}-$M7Tu>7yvT%R~}*4Ewv?oT_#zpZ|7K64UaTz{=fdu94-`p5EufsY?Nd&~!< zJhp$y@<$a9x8<{le?FV+-{Bdze~iznKWxH`zX00}U1Ed%DSq($^a7HEv)bFalkM+h ze&JiK&hT%qDcBF5n{EJ78%p=LKF{PRy;f&g+3V}X=YL1|HXV<*ds9vj#@;UC&_`1`__FxuDp@1JH8<9(AIitPL5{+;Tx{9MPr zFDRW=I`oa_Hy!%DKwRSS%$GbbMD~4i{U*QM@hrj@^dr7k|162`vV`-E>NoTk>k~%5 z`Mzo{SA5pOw;teo9Sz}fQ~T#|-)_dcb{{*~)_%Gi))&Ojp$Z(Wv$(Gy=jE78825#; zywYF1pz~<+E2^%k^=0@ANUtjYix=P@&I(q0LxAmltCg@ltiP9E%JIImHuiUIr95SV zV}{mNKJY#?@2mDM?7mYn>4y{PnczeUJ{rT6r(hw5RsUiPqrY6gxlgkb*dM9ujvHzO^u+xiZ#&EG5FgUBg~fNgFDrT> zJ%{*8o?nRHi+JyKB~No;%0nK`z5Jfsdm?)FApX>2VkK7ouz#S*0`J0ql%L7qy+>3Z zVYG+z<4mWB11@kq?7jS(`c8cgs?Rh1o&1LUw6|{g$>87%OxF+hbI{(ZJU>)Xex(L5 zjBm}NzFNw^&1?QDrfL4;znAsP9tzIas2^&x!~U7|!LA!e<74S%`!=jGG)=fTq9XZXSU2$~^$s{#G>V}Bj} zll}jTB>rab753j^cuKNwn`BAV-zy_!wX-$TEstJ z3d(OBe+!_;0RN^wS^2p`*y`sv+qK=s?mw)lJ?TfR zFKsf>#uEmZ=J$ngUic_~hd$9h_}pNgh##o^P~Mp)xLx8 zO%FQa;A>8V8F}LVcnWZszQFfd^#eYTAMV%xnNR)N!APHid{wk3KiOW3rC&O%^5A#* z^4YWA-?ZZa`j7GYtj6m@X1vDxuPom1EBKfAtyE!Znv1ojf$^SB^<}U5n}Aq9?kBER zwcnD15XLjV<>wFn{6B8!d-`U(GH_0OF9b}pYj9nlN)M7;HxV=T*`${&8}uz^$_^gJEWQ~6IkeIiU( z{-euBLm2&mKfbgO!b)E}gZa7nfnM}?&i$#=pH>dZ_WTj*=Xs`8<%T?bjpvUz{@e3M z|}QhSa(Ug+tGR9&7iCuAJCrm8%sV# zf7mA`TYHQBRma#r*=z8V_8APpc!mGYb3Br}?T$y)^mruMwC#~UDlh(EJc4~J_a^z% z-oXY8e`sI2k2iJOe^5d1-)Q)3#N$n_UPo_SE zNv~@OdO7>Gg&*?jhyFu9j6dBr?@ztH)$5afu}P$(KYc+%S6>3wecS2%PvutbNoue4 zzj1%`lTShuB7Yp`ON2^zp11$9_oVk>%%9Fs+%O2zGdR~Lt*cb-WR1C`=b5x`etD5pATWuM}N~^nfF2u2qsgEd;;vc zfBrxoSvB6O{%Va3JOI8J`_?I+u|Chj9{Swyp74Lven=nsKZPVc?u?@DNWatanqeY- zMqX)eL~r5;edPHY37DZ@ArW5zJu`u`-yZT!e^BLFrRY%wxT!zr>Z|0%Igire4>no1 z`a3IsC?Oxjzb}P99gGP7?&ncD<=@|@<#$JZR#_d}H|uBIFkpTLUw|(EYq=^?MMLpB zr}<*64^^EniSf+|U*%s{AJ&ooViI3-z}CqBX6Gm15AAjNn?6qg{_kc`dl@xkg7{JHzHfG+I*4<(jIyi5~VkM9%V z{alVe%TE4RFD)1X^UxSPXO!3Yfcs@j@+XkL?Bq|zr}*CY$z1VMXfTTRAI%ki#KMaA zpU4$I>B3ka__zz7$`yawh0o-QpL5}3x#Cq9Ud$C=bK%pu;x!jOo-6)>3s2>WZ5KY9 zD}LUEaX#ZE7hcL0f7ykx9`OS%jP(kPcfwcrJ)JAQ=)%wBir;VHTlXVgw=dj(ULZd* zFYOP{yW0CY_U((-M?inZQ@jkylb_%(^x^T71idEYgXPyGhI@_)s$GX6aG z0AOc5b)Of<2g#3ifejdar@VOHwWh)MLE3M1 z$h$%Ny)~oxLzo}^r@km2K%CKkoNszY_>jIDAF|#}{Hgloe;(SebgwD;gI|ZDc*1$b zYXNrEmqSD-=4b8cD&RvAKlg2_FKR#JANZ;ELm2osw}D4iA2^@CrtwGm0{-ty=}Q)^ z^Jn-;dPtrldK`XE{M(QohxaQzriaxBRB7me>blb7aEcz!k{*X6dQ>;1huRPE2R+pP z5C%P#hk6q9xT^K7kRIuHTaq4~_G9NnaRMET?8nSRk^VYi*^h@OiWLjjX>T5xD6&eX zS2cc|B!03Nh^HOBl=YhEp6IXfYU<=7LDCcU4&#^I?*mxzk@|@!-Pn(#(1*}|@Vwwr zjxXVOf$`3+?}z25PetWXKgPEsEKeSw{(g)%M_69tiK+k0e!$i~vHmklfW!J>?~bv& zaMF3w>0>OkMnso)YZl(*?ZJ?mie9f&N9F1Lw^`gM%gw# zS^7-vQQt@}#RIEVz1+WzCbSzYH9!~P(BH``V^`j7E`ELpx@ zVYp6h(0%Ba8lcPVe2KFab+hy8}Xu*1}kkLvHvLpzz5_@g9lvb#wcrzJ&S-eO3D*O#40BlhD_jee7JQuifoer@mGviv1`~ z{rfD(bGx6@(u?}1y>@o|!1|)_H}gA=*UtK)_+!TRm_OC+hfqCfV8`PT(l>-b-^0R> z=~b%Pue-g&exa@Cdz&T9_=o?Kx0XJW z!M-x|z0EI1UaK0gV|nxUMfL#lM*qoY-XZ*VUhzyS6&pxf!U2Cd;N=M)H zYs(+yb}J7DwEmzYFt&dby%0Z~?>)%8O27W#mUKMvYO7En`}F=E$|Js* zdlB&3&2MRapYg@4V668e{c6zHpt>~ddwkdrVBTlD{j%^aw;ByM|B-jP@kK+w)jP@f z;wMd0$2T0jVGD&*$!^KPq}?{Q>cW$&Z!d^T)5_z0FVH$r997 z_#1ei`0IFY_!Hg(q(y=672`gnv^*X;*~z~fzY_EB4D`YLjC_u@Y7+JE{U)w|dlF%T zAJW%G@u_CtPsM$Zy3gyvvixV=e|Ak3u2UcQ7v+E2Zq;i& zBnS7yuzxMH736~AIgl?X%S}`r<{xZ5>|=e#3-249Uzu4Wc@+PZ{?%&Pus+~}`$;hz zw;OtY6ZID^P8;8W_`LmoZ!DOZ0YcGxDgMgNDdhix{28s6?c{@kF@C|+G{^esCjPm- zb;1v(4crF&Wwy6-D(WBnEy&Z9>bmhQzMswhpm^I;e*ouO)9fwDulo%L(I0fc;D_`w z>SvdsD{!ikjN%y&beqnB>;`52$Y}sI8GV zQ>MH((E@;9W#W$bmv7ZYN_@(aALT&&jo#OU{E*+C)ce|sY`*RPnLYmx`6esy$*z|;@&|cK>r*DM;}z|R?my%91>i>+!TRj-C9itn zU*G}HwSTJmfIsAA?Pa}pg#KneHf6>;l{fY)8b2|ffnTP=o8TAoe|*Yg`Tw7~H-U~T zJI}<51&{>U09nLFvej-DUXd&ST!01%?j#Be34j~GtygvnO|_+#C7pv5aXKJRPF!p! zu{4XDquK14WQOTXPLy*d36JBP*faJBmT6g*H8YGdaU3U^Fr7Y%#+Gebix+uezVEyD zy?5WOLOm3_B{OvnyYat!-@X5O_wQZx=eE7O&k8NS*q>zl{CMU|CVx*e;mg>cVxi0r z|GiTy|JP0aLW}a7_@I9_+5JNH$B;jtEebDf`onFRe2caNQU0jf*Pd)Y<3ILK(DXO@ z5bICK3;#rX%3s3x%(t-k%7Ds)ebq25>>f5@w zTj>SsU+{PH{nF@u3&m6H-;4c-7yRsbxZL8d-4P9b&>r;v1w>JM0R4d8C3<3B?R)m^ zqUoy~d(J!UMZ!Mtf6$Z{_WF+Y3q${(A2#LDUW4k7j6cGEdcn_+7ruh{;{NmJ&@47n zxh6d-|Lfmld^bns)4rxY;~!r~eYl^M@88w?nblmMiTxAz0YJWxpYq8C(|^H`b54CB zKk{cc|LTWPf0uFcBOY~OOc<}(Y*Jr^&vO07w*T~(&lWRF5I7va;(fJ0;roTps{N1J zbH;xO+K~NVuT8Kg%3FH$^CrG|9%8P^>I>!P7I*KyMFWTSM*GJ0OYIxpkUN;00_ zQQw|DPX8$R^UQDkf$217)IXN@?qzxU!M_sqga57N-Fw&{YrF)S{jF?!AMpkn`KAB) zi->RK-}{L3+dW?YH{XT$xkvjI)s^hE>3)CMj_(swJw^6kv@hgidD5TkYsNp4N9hH9 z-$e32AO8F&p?~I=J#b!#_l4X1bam)N{n;jbPlg6le1Tv8ypGNvIQdZ?)ln%-S$=Dj zKf7FhTmPVw-g1MrFFn$H5%I_RT>k9(5Ar}u;!iK*KZgI6^xt>?*SNo7`I_$VJjK$+ z%ofnm?+K){HzD_WaLE1$@@H>iG4iUVq0hwke?ez&{z$z4`aau(RjYK~jq!l?>(-5r zJk!htQ_fGmK)lh@&osYiX{={%4fU}T&w5EW;Sc-*{1dIlBcn5nZ!&$mk~2H-Kg5m^iJj++8^^X_UHFxbps{8&kFg`UhN>q^Vhzw_GEaWnc-ei5K=$o)rtOH@8`g< zeSbB+Z>Jw$K>qFJ><-qy-S!vw-tH=HP%0kLUg`aO{66Q)bDG?OKk2_o=f`Y*eed?s zpw0hH^L^e&C6Au<=sAy`_vng8-}dM`9(~uNmpuBuM?diBhaSxiMc>D@^5i_46Ert{ z(4$KpJ?qhP9zE~T6_38{(RV!hu17C<^nH(h;L#5~Is=b$<;!_=-lGRSy5!Nb9zEyL z^B!IC=-VEB$D{9h^pZ#4_vi;6{m`Q`&7S-oo%iTLk1l!itVhpz^t?w`Jo>gr-|^_X z9=+tz_dWW7M?VBj(4~#v=7(q?Xn(BNY+r1C`Y+g?slC{S_BXqV$zlJ^_6Kj9_8jdC z?-$G;-~$*D<9D`SoG#2?`yObTg;O{-2mq2}b0rh=@{Xq*}z)$;CO{#w_$oXsdJ~ZYZCVE=^k4b0!BbaNja=+%f8ybq@#zrOsx0LhUa%D;Va-P7z3nx(&iWdCO5TNlZP z`6Tgl5&!Sv{D@mV>f`zwnrkfjK%c)ovnuha6-P0sp&<#&_#MS1kM ze^<@#_dgVV;UDDpJ&)h_8t1n|{GvSa`!m)2^7#G-*Dw5+{C?i!_w$YO+a-Qc9{K&R ztNHz-4~1XE6Zw7DKh7^cxPN{~`g7yQ^7s263V)9uKNZ)$h?lvL7Jto8f2%%!asTGG|B3c9qhRG=I!qL z?awrGfg*Z;;F;!Gm+p9``It+0KGR%s>8@v*CtSMwnW+E7O2n-jo1bZB2gLG4Z+WIU z=h9oBY35pTl-|;!_kRTW1N5i7PlWTyXugWk#7mY&d$Z>Hvl)tG@atHLy7^pu{|Lti zH;3Z;Mvyw<$5C)5or(L@eg#84(*5YS_L)-qGg|6;g=Zl%wH%U=m_v?s0@^k^|k?}MfLA#CjX)Q_}<_?rXR*X!{4!u`{H!)x2I)E=f~@8R-~)|ge_fiC8c z?Z2;`{$lxs{fjxS^^-@#e_u1{KGLuU&U1B;RvjwuP(S$>Poe|iarQ*^I=GSL$NqP? zi*zi1N$26DQnGkB!%q(zBfU< za7B;M{=pxMdY=!j={zq;_dHzn_hhLn*%$38;z{4v)Fz4O^zV;L*R}Kkd+PjCH!5)S zapx&lAO3kRrtxRSFV*<4k@fZUaqJi@P*D*^A0xH&v6lX&^F772v_EvH{)Bj3mhb9= zX(P(7_}BS1<*)LO0nFD6=CF4iedITzKt~_9iKlve|7a=UZM9D|{bTq5c&#YQ6Y3v> zTfm*8j|%a0kvf^{h&p&F$OY9%LzJK`NXHk0<$IDvnXVvqMBKfQ1 zAEm7}9qk$0k9p!NBYpUILZH)|Zry|JKyU$U)CPO10tzL)9=|eEf{r z-)0?7`%#MGrT+IO7%$+gu0CeDVd4149Pzi2J{tB9U7xgkyc{O}rGg5=@3lX1{xQc5 zB}X5#Yg~Oa>L0~*(RiSyf9&7y`A1EC#QyQa?_cJzh3M*|#P1C}wtpPb^-9b8hwz#e zR1o^dp<3}0w;$F03-#^yFNdOdsrP*+)4#}Gb=r>#woF}p3^u#^NcRtR*YSB-%s)um z_2QoLi4&1OV7&t4jibuXEM~j`(j9M9;q8tVkTsUSsP9?F-+Nk{ikCUcx*Yjce@J8e zRe9E?+xBy?sWJK49l7$~Cr$aydEsM9=OZI8$hz_h&+Ev$1?@}bSY+=5sq%99!p7}IP#YGy|+kSA8*ve((sGNi_%{--#oHe$2~Ho<>KGiyMg#ec~$Wre}5!3{;R$} z;@f+EJH&D2=lA|1`5TS@k*(7A^75zHzdHU|-tzWOkN;Hr^Q@99Kfmu7$^T);|1sgi zQ9&60`(+Q(HRHeP{s!Gw80*8t|Nbcc52xPWp!G@0`###A8vQ|KC(;~!4E~v`kHa4{ z{*Tv>|090LZIbVjKgd%kPielx5M_N>UwoF^S1iNSe`Ht0ANI@eJ>e;(Md^ok zx%^?g)oc6{8O-<_r2GB$)BPN8s7%#YNcn#IwASBMhxD;_+iBKq^^5g+ zT)&sitUS}8LwWf98Oo|d;7IQ&A2{R61NjSlmw9T9_c^|keZuw)?R(_^sGsY}b6o6q z{C)O&Sv*);@%p-J&l=;q1GV%UuWwYv_W{b{#J9fZWcKH1@AUYlzeyhGi~U(7FKNg- z%MAxd-Z|da5XoD=f3J>j#P5rEUGdHDx3{)N=cmp0+t*5#2RPp*{3yo1ZOCuu|B3IN z==<%hnN}uu=HZX}e!JF7GyHx#*4J@fEl~O!^RV{-_N!Z2yg9#&`2*8cpY#3p*|5If zf&VPDZA1PM{FA?A7v)Xnd*B!^_bjw>wr|qWzrKF`VCx!e=iqzltN2lpT>01_%NKqI z@~mEDbnpQ>Fub2FA27C~enGEZG|?EQQTiF zda)!js&e5L4VVEPWj*24D=WIy= zjDT5S&z|!6c)kh#kpEPaANzU4JDq3VX#UbR?W80A3X^0=X z^n-o)eR<8d<{ek|A?|JHd z(#F3)Rz_m~3Vi?Ke5(@sSMfROzpxJfG5!}s@m|Bfh{wXaiTQ=7~4;=kw z%k}+>_NRNg`tajP=`@+-Er6`Mo^0ZY`6XXb-}^baI;5TNf7F)uq~zuMNauJ%^*iz| z4I|Bw_u=m{v&L8Wp1nWbNVXr<-*<0Q2NA9(R)639`0?m_<&X#c?eRg>Hc$K}`~lx{ zS9})ocu090|Gs;h_kH)a#=h^~b}m5Gc0AmQ{g1%*z;^r|==(P|eNCY}dX5YudYF#y zD~-2}^KbqrPkCfQ0+B|%6mVY^%P)~eI=;sgjPY;&to;TP-*-QDEYcU!alUHYj%e)r z2SzoXwC_Wo$0B_y|KTw+pFjrHccf%TJmROPymn+Q-{nu~M^Bjj0MKav*dHao@7~Jg z{Z%0zjCkhAzcIgSUu;ElnfShYD~`jiQhNt}663+&Livc>66?0@ALj$A-|^2m3hemj zUEXJI{nN*f^7}n{KZh*%UO-`i*Ns%ZsAu|q#ZkMzfCk6JQ;}(GGiV-v z{RPJ#ntVF;nfpd;AGSArVSe!A+Y9siHaHA^h#>Vp^dI)mq{;tUec-|L2c&z~GK0oj zvKQaw&-9->KcqC;Kj3{e&6y=8Gu@154k?|F)c&?Y{qFbPTUEYnBL7%>i1o$&P1{<$ zUy%=(^j7La`6(abr3BjWW5zSe>-h5^9nR5LC7~~Wzc$(4;{GG?tM(Q1hjokkK7L8{ zfuD8dRt)_4!+b;fX%c1lA)a>aPQ+vQy@BT3&9)}sK`Y^WAh)=4Cn6)7A8abGT}%0# z@4xT#zW=_qwSo-%p71i?f6qJLfA_x^m0N872=QiNd$PT}#l@>O4=>~%Q3IU5F+R2~ zKJ~Qt<&zVE~hCfXM?+P@vlFZ>te&z09dy#=(&hkkP9b^6|VNb`Iinjm8jyuahE z+`7yh;=*@itkx{tp!dGWa9w^VbZ1 zh4DH|fh_;9&qux&moI#7^LJPR^!r|u>eqD}oZnHt#g>nJC(Qr;##Jnz_K)yxQGM!P zo0;CCbl@}I=ljhc`P1lq`m3W4lppI8cm$jO55xSBZxX>>L3yEn?O0s%l(-fCZCeum z2K^`SdjAAcmDfB){Tu(=){>|n^VSdNM7`pkk8-=XzzD7K)&YY z^?3g&`#pzP9^pGO+0T3Oe12_)<%R7-QXbR3FEQPb$M{odpEV!(Jy#wmw-V-u{}SKH z{EuXx8u-4)mIwZY?}KIE_T+i{apf`NLB`wfy7GK7DG%+#7Vg8hkMMw*?0cR(?>(+O z!k;RB|D7ujI%nTL^p_9cKEh)GFY3wjvyUr}X+MOQc@qpX{%W)b^f&dNAG*IS-yWpJ z&t0$@#SiY&VSI<}@uVC7SpOma8<76t+vD-${|@*G`RDk#64Hoo#slU5@Z;g}E@%a4ScKJno&WE&ZKe@E?gX6b;JQAOKe=iv_;RR7X@OQm#e&FwRyYzk! z-v|617hI$Ip7rp3+hTkl>I0r|ZGsI*e9dvgz1w zxOHQvhX?HO@PPT{@qoR2ANwUy`Kz&BJQ(Bu^nLi}V!T{H{S0fU8je?UH=E+|HTVa9 zZllWMEaBb^==P25kIj7X9n3E`Zlr(3^T)OgU7$4Q()_V~LpNx~48||O&u!cg!VB2` zW^bak`V`V^dt4|F?MIVl-p783^z#Wfecyg=sHi;X3;Ppo8Kj4J!$Nug{%tn9DIW!Y zI)1+hRmjKo<*T%3p*@MlO=guby0rBE6T_EwvQL=j`c6R;F=`8>sg0J`MY-~A zZ;n3Z|7TYp{{Dlnk2X&qr`Ffk$FXtPuR?WLeVmd$NneZclkxsjv5jqq{2%ju_`B}= zl)sBE$RAI!{jup${wn_%(Eg_QqrC8Eu8*qzkmmW18KgP-nESe`kB0rDWfH}yeX8jn z$B#eh{xLV3)W_`q@< ze>r;8^N%O4f4OrxsgK;hboJ4wf285jC%C^`L5*SiQ4^0Iw;$F03-#^B3)_m3C|=rx zN3Yj@$X<2glklHWg;!{xQZIW6Dq3^sgZ6o_82y z{~60)9DqKZ`^LtFFXA(;Hzvkkrhgq{8s)S7tLhJF^sjfHx9J!Ua{QI~4Ojm9_s8+P zOAlUg<-bpw<1@3rcueVhBzXgnb zFwHs7Q>1>DlfTw^9@W1QFVX(6_Z?@wi1yC?x+{OWze}Hy{KxXr_ww?4_Aki(_4-Ga z7t3Ghp}evE)BDF%`@e(&sgKb9UvcG6YyS%7z8WikPdRzMClUYO(0qgAN%O<{58~gu zZ>K1KF!vW}yr6hy%$xCZLHAw9`UvzrpBOLLCVx==WyViB-xAs%<0n)Y#|Pv8WlM+g z|7)&38uJIrANjwD{}b{T)@j;1&;G|0&$O|TH#kwt{u}obRjI-dEwJXm2O}3u^C+>rjT|uaB2P{PX+z ziSvBEz3*H_S@efc{$F+FPsd9o-e{~LRg{}skR z%Bzb1_poPdvQf$$;hY2m9sAM~*XI zw4Nor;8E>w7@Fz5&qe(c;vf4Lf!3mFFVNUu(D6IFUX1iUeg8}E-+Kq^r4z@M#wzrF zuh!4Q@(bls0VO5yg3`Z@j{@#fA4hszzK<8|eU9&&`pD0D&3D+Qh5RMoA943Hh!;Gc zuL0MzG;IRwQc+uo<7%wP!ZG3aQfBOwo;KY0Wm$G=U z^7VC$_ot`f z1%Y>S_mhG5Gtm&@&z6sQ^h8YKJP`ML@*JDm{g~{c zyw~6pvEK3e^|lSInHY~aywLur1-T_3#!HFz^y@rtiv4NmTl>>^U;1Y8)IXdmTRv&N zRZ9M$pKSS5%n!<2y*S0(rUKB}@?@M}>8HK)v+?`)cpkQ6JMmWL{OvZJU${h9jqp&! z3r>dV^tbXwga5SpTywo6)4>{O-`aRVCYvU^CSLGTfaTi=zgYt>cvR)H{n7ezp!uQN z7mSa3%2$NHMIE-i4#uPW*pDV&kjq{1_@!gUNk{uzC^0@&p7yUhW=Sg# zj?0uUZXbgyOuMZ7>>oSSA1FWcpWJU9fIk*8T;7#D@=t4TN8UR>X49>_x&P6Xx1+AS zJqra^ZTuJY4=;2i;sbctb5T0>SBZZ``(^xjig>|}4C6=sBD~&^!1uxQmFhR;mh1Z$_wx_2Zbu*YNyqES7nM$vneiM*cm2G2J^}le zVtEUPXs?T_@gK!o{rLpsy@+=!8P*4X=logqJMupCbU&jP6YgwC@7|BU2%ctOIa6L>-3qg}k9Gd^4fFR1z*|GbT% zqZ^Nvf11SuGyeDSXT%HYea4^gf}EaIzNlyDuOQ!q;$amWRPj?RGL2r!_N*E&I94?J zD^Wi<&pBE&`WFp<=ooX-LAQ^(>FDn?AMN0v(VX|x{Ii`j>cjeL(dZxL!Ct@%c6fNf z_7uEeyW%Zl-mk_Bj*gN)omYT;Tdud8xm(;n!Cv+Ir&(lx4()lSf_Y!|F?hkjGLoJ4 za`3;+;(@WxO7Md1EMEQ12=MCdB;lgaBKXDm93L;(#tglDMfTz!{2BhZpQkk1Kd6Zp z9924BQTy9Ye;w(iJv5$aSNT+m@sGAq)(4-lbVnQBugJ#opEl`V`EC4`m{Vtlf0ku;4D`N7Y+a@!;EvMgS(eVA|+gU{O7 zoLd|oUWEcIo!L}wZ*L-mRJ2U8lV-tvNA&Lw(uBCaG5T0gdza&o<)%s&M|s_`1)!EPpI-t;!Q#OZdK~ z@6l#(K;ZkB&grG_DBwSP6Vktl2ed!t!$@ypw1oPY{DlnJ#}D#j{*mAh_u1k8nP;1E zA(8lb7kISArY#YE5%OYwy+$4r-7nXiS;OK&|NGf>8R|duza$>b;Oi<(cjV*wpy+zU9x{f7E375k3a@n>EMvgWudwuiFyg6``LbKL#IHAv+E~^zZp= zC=d1_ej;k0mgDFDsKt-)M!3JsI(T`|J0DZ?$zRFd3#0p)fMv7)u_FGu@*ne z+bhDKu8^P2joRzyYVotYy(0YRGW^V={xH50@$@@>`(xw#pEg#1g!f#g{yDdP#7`-t zm#hDuEMGs{lL(JlqdxWrOF9gW_O)jD>pi?xQ+z*~@K(TI?FWMf?}Yo+fWP8|D#AZy zJ-k&*jJFbgqz=C7J>rd8-TT|no*wq_R=_uLz!=pB{8P!LfsdN7G|I#MTI-0n(*0WO z-)>?w^CHsi_@f$cg=l@rrel5b){Q|AZ}psqw;J;BRu*5y``3E;KGvI2ocIlZ?Y_Rx z!&~k5@K#6EpNH$K`SMe`T}57TZ-(RT^(v2Eg8R+#<@M{;zlr8}@u@6_a_qCrc)KG@ ze3iz?8h@|PGTzpkbmSjCoX6kF4}U3?4;}6S9p^uMcqeG(m;UhAC-5NbPjBMQPq{SS z{B%rjx_NZHi@)l5>)2Bfz6$mAyoKc>=I0OPZ(Tep(T{R`1G;Bn{XV3aDI31Om$<)I z=}*xcZ94AvEuY~2X@tkh-^BN3$e-0u{^oI8UrFQV>|$pM-U{%Tt61)e@m8H4-l{W- z2gOH6r-!%d^zc@lNxW6i>EWw7J$zMX(!UROI`Njhb)&yC84m|KllZHVPB$J}u9svw ztH~M|4)=gjkctJorltZ3GD^+y#l;d$1c3T2mg%!^=kbJa|Vr9 z6Zk3EpZF`SKUw<#-*HIqlArhKj}CqcH0p0=`PQDmXB9d)-!Jfy(mP^&mC7&mIQhAL zV7{Mf%O}2SjPFMA)6o)uvi^_q_cW2V@_;VoNtf`C^Dpd=2Gp18Q2l|Ahmtu$eo=!qyJFxuZ%VT?^`jvlgkDFd7pE*E&#_`YaUu@~epRCjH)7M10k2K21 zeQ9~pDg)&e%47Z1m+DaY{jF!1m-S=*!u|I`|$ zJNDU0x`co9*X-hf`1=~5fgjvVe+!r{eu9lGTl*2>cYF=gV|`BUBpvJX>_N&O>J#f* zn`ysT{^>QOCBN)*dM9bguky!q{w0(j>m%Afweq3AI&g&j(*cVg*ZLFQ*ZAaj%>8ZD zXVm^;JyZG$+hgp9EWK^hQ6Kk19{!^&9xU1Q3xEB#iKXFZ#sgfxRe6}cSv*!-WFP2H z?Ln9yG`=r+61-RR=&Q0{F|yw^;g3MN>$|D<>ujWLVth&C_qVBj{s;Eu{?PrOz~7{; zJ|6sMu0HDTCv$yY@>-+R4*&qJT^)i+({}x@4 zf1Y9d+w>?u^q=&P0qq}&zfk@f{_)^HLRpSJ?*FH*J{tCq*0U&15m(bcN~I^=KOX+a zNqsE+LsuV-`bSY8$Xs3@I!{=k#zH(+egEj~i0p0b@8hxLA91{N2#+OyTE;)rR@L#3 z%uj+h$3O1=16Lo7`p4M~_5EX<``Z<&!|LN~Eqw&?|JrygmhZ+3;x7|_-?RSy5cgZf zUmbnqK8pe!ecbsOS04@gN9!1hTi!n=C&7P3S?aW>ar^PZ_m4d0kgh&%|Fo-*M*XAM zR$m`eQ=Wf3asA8SUrXwv^7mbRH0mE?8|v%h%yf|SkFi?u68lHdZ$Gr3YEjG5sq@cf3(` zf1CF`XM@K&8OcAb^V`s|#*el7SDlw}|E{d4WLlE!xzM7e*+HWAEpfHWJBuO6Rwgf0_Pbgk^>DVLYMw zLmKi9{!N>1<*oc3SKd>p@(!^4Xna)|lzua%X#RPh>9qg1WbcCVlYb*WNLT*U^AZD; zwXhEVvEwP~XF2(6otIGk8}ZWnW_&sLQ}~;7DF5Gf zLG_0;&yh$iRCTG{_%Rk!~|ufPb?>|zn-A_ z9eD@;F5V>_`v2c><@N9DXktzH#p_MdU)29i4NAY6(sJ={?A<{8qr9s4pIUkRPo>8H z--9@={D0k*ztQ+VGbDX4FMo>ttK*;LEpPwy_)oR}-}mJIYp(qD<3D-6gZpLUoy~ca z$NfF+rxZIqJXU8jl9k@e{JT0mJXWWV$0{*D{l&H?9vEeU;~)ufzJ^slq8F z^)ZjVzfJLA;{)d>3)4ta8G648kF}rgoBFt(cuDgewrQ-7{3YL?*cHpm@m24oB!6Rx z{Sl0}dc_aRGyN|}7mszNe*{S?Q}y|Htjqlzze%U!-^XKh?8gCn{7RNz|Nge;C%OJD zo2mSceV0LNOei{-qO36e}Dp_dReNo=rKSY6!ym$T+SKdbB zyU>}$V|8|Vcq{=DTs+pDHq>wD|HBI-6xHCXV8817+&VLz%-)%Y{&b(4)<4|)+>~Ai zkChMW!}$o{iQN5U;IT}!#CWVpqkHQwIDagBPmIT!N~CAYK0fPooR0HbTyHQR@HhQq zc2VBz;ITT^;{-#5FRE@o4;*Nw{A@qrG}-bQgMB1_nD6Gwo!iwP=sq>-uPdYWUHanr zi?ebiZNfvp#Lwt_HQxt4yujo1@Hg9@u3kJ((mX)=>c!cZ#{6u}b;lm>^80=-cXcU8 z3GqDu`h{uPBSU%y-*0^Ja!m7kk}r)qG|mHbk{nSH_b5--j&mTw^PAa4wVXy@NGHBY z^;!8iU*maJ`7`+KS?E%@s63oUeEs?>oxPEMn=t-t#(nHeg*}kJQ0^-61s)OM`Nf{{ z)o~*aXtgh0-2chEz;x{YwOlXo_<&j8V0&2(t}vZPP?(?Xt^0mY`QY4L* z|JbHOzuaHE{dN`))cyf))#Z(E<&8);{>=TwNFR`=2HxsmBro-~P>{TJ+CSa5E~k`y zg{#!xLE21o`uK+XyYh!+#@WMf|7U2(j7J8|A@1y80v3UZ=z|1Ju2^jmWDyOMa)_W+{tMAdzVSCvkanRo)}u9sBL7p}5@MRvPhCOqoZ z)gfI!o*?g4yqmyVseVV^x&H!XIr7f_hp|63em`4RAl=h`(0?`F>fE^qKLmTCe?G_W zeK>e4zWzb*R$U(6s;e=)Ro5#47_j4A;-`4usQJNP^X1^6lMcMq>?>qgy{zz77rQPx z`SJaQgG^VijCjHK5A^;F^Ps$*@`d0+nBV&A-NgNDXU;_WLV8bm^5SHeU++)MPJ}el zq0cjsK9zs!LNtC={*yCiJs&TDADr(xKNh~P^wVcghjdN6RR@xjc&jDlM}LC#;PyqF zA57w{fG@RptKUZdwoaPG8>au^`i<&y{PE#`iDbtg^Z$P2k5%`35nrYE8E?W@@jBMZ z7xhf|s?(?C{|>&2X=+m;e>J{ps%Z38qJ40lb5h?Iwf+G6cTPF!pgRB{EWvk-l`M#9b0|nDZbSg>g$NcUwFS7Uo|;N z{$hMprqS`5%RTMu4vh$B(2L zA05J1nf+4Iy~^KENq6Rla0Y|I#r@ zRmJUXR|np&$i^nUlku$l&_Bm(CD6t`0~ntbGRo`t^U@cP?C9%ZLSO#=Lvp;*v!Hky zQGbc^2kR7HtP=8ppLOMtN8)8!d{xJhB);m1K6Mw4&o{xJXgvpCb;QG0b&OPyqYl2R z1pLUOM+T2seg9g^(-B_ky^Xj}Ae*^6j0(v=^p{(FY718&#SiR@_G^0!Xx%SH|NkWZ z4)bIFH@sl*RpERmG2c>o%}+=89eh9J){XVgHn*ZcJO9FcPftg98XG?kkR0;E`e^}+ zpE3BUKjsrS81Yj`U!(MI+xxwmo{sQNn13*x@`UqE;Gv$5@G`$?+P^uZ8-MZf3>HsC z2PD7m5>M5XY8B3iD-Ef1yIP9+Lr^|D*Y{QU-mck^jAT8)V?fc zn%TcZctkf|m%~S1#tT*aEN@Tt$MyJ`Lwd-MKmM%Qo?*gOUB9tc4)M1c$;;J8yjp!c zS9>FPF0`*{crM_>!uIW(8-V`;9t#5&@h^NA@K|B{@?I@GSINV30k0LtlitVuS0%SR z;IBe|MtQ(*9y&pEqGGF4oaMu^xHr2Jl+!@M&)>iru=g&%<-! zey^}URJxDn!g@7cH{}!0HSFQJ4tRL35e*%}@dL)w?P^~+q`EhQ@p+fQhmjVZtG!+Q zt7wf+v+Gfv##|cTcV+XS>4Rpx-=6KkpIXyIds`?UEbRoX{P#9uzIdcG06NZJDh-DD z5wF6-eF6`tAH1Kvi8nvx(s=XJF}>;LiS{I(3wSE#=kFfocW+^Niuw6N`CAuHNc0mC zo~wNrDI+F*0R3xr)k6^SZ{)}Llkg3jPCVDq6C4{q`oD2MEYgABI-bOHVL3+il~jLr zu{#CN)jh%m$nF@=)$QTAx|4XWu5J&{)$QTAx|9ANbUX0@|LW`Z@Lb(V|32L9;JJ{$ zzdIQZhq|M9QhbbdyYbL+eN3j)dYJHB)dw0YS%E$Vc&Krg6k=PGdUqpWL0C~Y*6`pG+(?foU=OTZq zQ~VY4!WLyp^8ac)*Tmkae&ydg5akD5D4#n-UbRLey12d{H0w0{RN=XHGF@dT|3p9e zQ5`D3zg6qi`t@WF?Hjj8UHzv(YyPY9rq(ds`Wy5yHb`3bf&XR~ z4|#a5@gDk{)gQ_aHnQv(&vkMQ)2+Xvyy-#Gu|CfWUl-~V-!tl={bKpgtRanQiPgth zollee_o%;#QR*+0AO5EOA1fdFt3xB~pALNhJlE}?M+Hf?S({*ze{OLo86-*0I` z8h?my%wKEaxgz_7?Ln9yG}ikj!FxrIF#m`Bp1AY&cYXofIr_-G>FUGZkMZ@<6}Ol0 z$9(zRhWh##<$k)Wk8_bfU(@~+$mIS3{XzEE`b}4n<;%ZC7v!Jk*k0N6C_nU{+>aa3 z`i}TxrHBu%cd7o6#{T@>e}**D);}_zaP`r!f3%)QQEKmM`p4MVlkOi&{~YW)`gr)G zu09&|k78SWeTJpwy{ioFOa1*Pu7`@hI{J9pXG(@$g@OT}K~F*Ia!x>K{dZAP>LNGWs}u z+VhW^`iTAGhmRM|EP;JTA9r7O_0gz*Ol+vHk8@{&WdAb3s`Yc?C2l{8e*2;Q9yeat zR>b!$)I0BC`WNxXN|)(ha=(l;M;~|QTz#bbht3P9zLGy{MpDK44!LJ`H|i3 zSA%r-tE=!_lWb38`HMQ=JQ=kYXLSA>I+j1y>R%_B=E$%5Lz?H`zGTyF|9a=6uKZ`b z^Da#+4Zm>w)s@*t(vkl@X{MX~qEV&uk?b9SbjK5ce;#3!vc&Qh_R-!keq~DMzxhn- zai4S7gN?mMnHI{2{zCPKG~~_vicPoj-hIuLcPdq0*WUQP$B^`!DMjr;B)`RTDL?IH z6Wc$%e@wOiuX^%db>&ZM{|X5_OHVm@J|hwT*uTeogX2l_!}=WN z8y>!;D1Ru>KeV3VpLZ*abNmzQBY2MOL5y!P=X3aMxp)|7TIm0X2j3rZU$*IC{J-Mr zqcMM|ao+c&{DnN2_TIDqsE_A3SA`n2tRzI<}O^qna!*Z!s0zdHU|UhMBC{$u;6$A7B*f8CS+MOXet<39+-P@LAg z{Q0EfU*luu2=QE}We?Kw2S5HN)SuJF#@>a~9KXc+C@TI>tG&?r3_pNe7th7>Id$Xz zt2RB1{})_+q~n`hf2a}v=afz!YR138X9rAI{}-H#*2_d2`^W1Er%u)Lf6kBm^@OVU z{|(gT#{cuKylHrDKmJb-NxzxWa{h1Z-9Y@KysG#=z4G|C=d&Oq{E_P^Rq_8dPyQ>e z{Ef!{x&8k7k~jWIv43^^d+SN+|6}{7$A7B*|D`AYWmo?C@n5~ad9u4XkMg+RCOlW6 zJKBHKe#Y7EW+a>aIPTA3|0CLeBaQtNwxxVO;CP|BJ@N2d=L43Q5`oHj5djH-#;OF#7wlDfAy;yL|$M?a` zP9ah2&%$%x8<#)6Z|WmIXD82sQu}B5OTK?f>*?Y9z!#iN z@;9OHr-kVlZ}pn^M4_hrVR((~Vm#u0n?m^o?Po}bs;{t%b;s-H&-ZcsCYi;55cGo% z%g6rB0bwCBCCx9Z@7H>9x(~T!GnL;p{5)ul2}K7yVCmqwMqiA^iza`8?@C6*bFKNE zbRUjy5bu)Lwr|8UJp9)vz-jN6E@bgwX~pa7D$n-!HQM)4rK3bwzw!8{D!#q%6BL9` z{2=4|NM7iR@;+b#_(nWqf5XH#@7LYI6f%-*k+#B&i|Uk}gK zo#{q~OlKbY6P`=!A18vX@uw6oYDHH^u_ZRGh!z^e~>ND#_uCuh8Hd*(pN9q)8u>s>8lqnvo;K{Kx2Nk z=DK5#ce#IZbu-VWn0Oxm{n8oPBU6I@i069w`Isi2>y>eb#(sY{$q|;o_BvPIyki!B z>O6q_m90Z2f#*_vRzCLM>@K7a@Y}PnnazPIPk63ZyAl6ZzqRmOo5%RVD=b5JuGdZ) zc|fE7LV2_BlrJ&e;<@lSVY8mY_Ocwj!1sm6L4LNk?)yFE!!I&jKa1zm`+N{^|ELJE z9-eEnzd!IA%a8F~n}z36omK5$Z9JFixBjj6@86(6r#)CYo5cgQf53BX_U1eCMxu@A5^|ertymi{Y!)(jtlxBSU8ufRW{gD~}N?z%-O5Op)M%niLL`VM0bR_=|0ME7A$8#w_HGa9r{prma;e(?7GY!x6 zTGy-875#zs1)fXqla_z+deq9uX8DWoT&hp;A^%alRAT=Mjx#M@Kin)lSM7KjKzvu@ zxm3RsPo>{NfsTIX9sRB(o_HKCUN5e~bG@c?n#{x#NOyg_YCORPrWDItIL6p{Z8iS0 zf_Q?wui@PUo=f#R@(%uQD9e$zG8Ow%<9M#kfpky%A-=2eT(h$gJ_-Dzf1W*otPY-w zuYV9c*JcmTwYf1o*XCELUpxKANF!bf<%@b>y)@EsUt?f<>>tb1SEgAOe|rDaB|8Gr z`_Sk4NT14o`f@aWRelE#27Yk9>%xR7&6am=#>{u|uqK|X3(58HT!gnK?#}{#wLYFJ zF`vcwcIkgd-Ht!bjz<1i6VIjh+5QO6bq?)q<%@bIJlDB%@_z@<#Wc+~Ab&NU>vYlR zt3-VO&ox~%`W6lQcb|6BL3d5N>4kE)@L%06sKlK2EYdz*q){L7Tt?q05B33`tJ}kK zb=AKwtE(#-f8qUVJlFIz`HS&f-DWPvLDn@iON*OfpZfg~$8XS~oj(=K`)V%?o@?&^ zM6zR_%y?`c_Sb!Uo$27uzuye=Z_EEE^fLlHS2%to&G_gNp3CeXkv91?2b8^7IDg^z zr7I23HLZ8~irU+5`lo~E>J~p#ifK=~rm5e!z1`e}_balo+S{&f#y+sFX%5< zUjOtK*3a|7_cpHTUL1Iodn;qU$p?SvUK|uX$X7ro?#lw5EjOFHEvR42Z)lJES`an< z5!HWD^HSt1^_e+)UozhJ z*_z$_vf24@P^2rYvHlxnQrZy zj%Tvx^QjMm2WvI;!(PIxZAjejoPE1~{j?YTdA|GM8u(Xp)qQ6n9`EDdUX!u-x;tdo z>TCOAtMG?g?0L_G{$M}oyEW1`{NdIO@c-xbJ|F0FE9|HET7x1HpY7$QN7UD&eYnpJ zH0;+ze}DR$@OS7F`u;%jQobdW7wVh-PX7wyZ9DuA>^)i&o?qRHoXk#nv48(q^0ETj z3-WG`g?+o5*haAJ}V+Yp-;FY>MN<_+yjrkK`|k2lyjRExLw0v`>ZUmjB^}L9WC^ z-`@fM>*cT4O#4K9Vu{(Azb4)Z{)VPU`cK45r0+E}kJ|Sd{Ahf+*Org-#R>n0KjOZl z6uc4eMQp!mf35!mPjtwo{rjVUFWT;=17E}rIeH)XAs*f){a!7+(YS{<0zQZnnCN}r zfl4k7JkUg39_-&-A8!P_5VEU0uFqBBjfOqE(E$%{bkM~c;Xa=P-U#?AA8&NX!y6s; z@J3?^|EPsGlE2YQEZ&Iyft{~lyws7+gX-WTi#O`QpBf{GZqM!n9pjCT>AZ&W!(R&J zsB7N=dxYNTYb8u_p^}bTkETbi~6OO?Y^tlWMABywNGNl$8;4{($Q()7o#- z9-7);ocB|MhxQ2c4+3wb^>Fz!=cALy_t4gCB+(vW{NLA)KQ)F2jr!MU@5^6wpT(!uZS5%M#If5tvV-4De& z4L?QMRpt+RZW^<#X5^}v31-TDPwpFh2m_Koe))zA5r=4UGJ z%zCEFXQYpl`$&iWn_WEO;f+r1q`z7Hp?n{2G_{`T*59Dtv-?QL`n+(I@`w5a{%R-f z7t4QsJ?TFDGy0g>M_TgVll=N#ZzwjDN%j{6+gG ziU;VQG)5&1tz>f`p1tB;2Lqg890nUdCf66ZtZA60mg zC(b_xA13utdCt{GqyABBtFMn!#1~djV|ZUuO?|}Yr+@f(qtYLOH~NchKjsHreKhJH z7dF(_$JCV9eq4~hQa?_-)Y)$=vV1pQpx?}eC|=UfQ;EMYK5E3v?6*;%qmQ`(S04@g zN2}WYOlg^TIeQlTS5V^<>mPI90dI~zX7{@KXw*N7ZT0nW?wsczHRC1rj~_nXX#TrN zeU$dN`e@WYCO6dA$28B!RZwH-ACtA>C2l{e`xln)#tZwB7;lr_zlgs&@lyF73UvHq zaJQ?EbpO!ua1Lc){8!zd%+5sqfb}{eozLep&hKiCCnlH{%7^w*^@lX%o&RH-ZsjfYyYi;vt6X~n zZ!|3ZW=c`}7|Dgynt`- z`9DEf)JG_PpDTa5zq|I%mnRNN-^t3GezpgvqVYmH-iY&Q zHy(U{sC?h1hw)!@_0gC=)HshiC4V6glGnF?)%`J3wd_9?$(w$EjOO}byw{5VKTFD6 z+Ud%hj<0a-pD&*pmVPs(<>KGiJBoic2X1?R(#IQdJ3ezkQ|wG&JBKd2G^)Ai$j()a&qZ@j1We>#f)$w|t(oc~ka zY3ib0{L{G{c}syS?_{d~OMj97pBv`+9IXdh`+NPrv3CRUkMgSG|J=&s-<}@=OW=p= zDZahuxmfMW-{Z>PX#7tfl)f{i$p1b0Q|wBMp_G|zgU0r@J6!%lJrA=js1etn%_|W!W&JWj{2kbnO;1s@{~^cbP$bK zkq&&!A?k}`46eTsZxoex?;W&XQ^LbA*`ya^Jd)l&Gjj$>y-c@wBelOaKJb0`ne#}B z%df&49p?LrpL^tI=E4jpwP%*Ur*3_*f^tg?IQM z8D?Iq72eGdO$hktheCA%n3 zZUA3&^-%|3r1j3uy!^|*4=P)}6u&QhzbMxV^_{>I zN#5sKyU_>6W7YVgk9zo`tLMA*LJ9Fme9@~f#We9nuj%|{82`2KMVD9|<&l4~HTWR- zqPaAD(Mh&7udx>4i(Ws?^Pl>uJ=x6t9&;y>#TUKKM7GzA-*WIW(_iH?WPJ8z{^?MX7n)RIY@eKEKHC~~77|*GGN8ZwU6h``<**~4%?8@u6 zcZxn_M*D>JVt7H<%{728I@*i<>IA-s{+(fbzCr&fDt7CZ3eshj~SAs7ZVR?=|?vtiI%=+-_N~g=3cmi2Bp4h;Y9H6`6 z_0iYyZUSGV`ki>X-IkO$-xvDd%?`tQNHS%ykh1PpurE$ zTU|Eur!al?;w=8u5BoRdXI2-i{Dj(1+<%AU4;Npg`W%1E=aT;Tur>0>D!dBsi_-f! zaJ-%U@hrNZ$`|!a_@dca`M-lNVjBA>%3qByI;Zc+TKfZEbhc>pU9$G?#)W76g>=_h zH@z0Vi1u;uMbUf}_WAJfMQ6{FzaJ#NXlYZ@K6f_6_IU#FMQ3}V5B=2Mrs9jva=aV2 zw+3G%8=L*8RD6;0I{y5yJ*lsygueXwXmY%gjxU->!xxQ3conQ4C?qGs#f7j@txQT_1u;f2lwz9(0H&ftse{D=6XK`r2!`6Sx29S2ao=4Xi4 zYF2jk*VL{iE?kRkv}{g&L7`iALEPEUXvOA z%y^#qV(SAuN|ya6?RPg!2c28o5aYXkbK@%VR|(U#e$ezZ?IHaje?p&#ci6irvN!xG z!Vl0N-o<@hAzsMxOMHzZ5AN@B_=kP7Z?DO)zS{a!|BYS@@_am&=Qi_Of6OhmeuQ`- z@tb=882QcRnkfMJHF%Vq%ipHAn~Z<7AYR1ZdJSDe`{zEpCdLQV(m&#}6~)V+t^V(m zUGj_lAlgU%?)Y;H^V6SEUiK!aH}Qb}^>z3U{JVlb^*-#g33xjBFZuKBgLsGjH$?XP zYK*rF<3C|9Bfqte@Hp~!@*m2Zg}>Lc5B=*7^ILoP{zQDD_+b$H{6fC%3r$bcUz^x| zd?@}^pI_*|Me$+rOT!BTS}M|ie#?yS?(VhnRJAAa9}jN?JkB8U)1UOcG2nUFUXvEy z2zVbNLL%D78v#$W-A(uLM!+NOcGLa)jDTlK;EP&3d{I*ZUzA;Jjs02v)*0Vt1pC~& z0sIiE6Te)abMZw;7d{P(ORcmQ;^Wp0;ECwKl&^Oc@I;3^ywPD7Zxpu|Kf?Tc-^Uvr z@$g1R6L_QS;%K73%9l6g)IDZOh@TnEN4j#v|CsUUI~cF#azhc#`Nk&Ui8k?>@I_tO z9{j0QOwqY)9&`@>C|{v`qQv$=`Jt~ud89;f10sdZ!`rgJjuON_rR^g5I3HxF43va~cp}=>LzZ!2e+2Z6!`BNu)nV0Rg z^6%O;P1@Fv{ivM*DC_^k8|i$CcoLpvQuiN8Kld0frvvIsb*Q{5ywN^3Z?=4_r|)WU zXuMzO#b+=v~O&Wb3>#Zdo+;_{dIWZ*rOKE;rWKa}s|jZP0SJ=W*>CepD!FCC}+p+2#no2UI^`DcenOMcnoLKA7p zFMUkwd$OVY;7|J%RzCDU$3}@aI%ek^T93i|W_)D6KSupV?Jw5LrLV9(#(L&_51fTG z>LcE$l*xivdThK=WS_7-VEuMH#PdJky`o1LkHLOV+7Ea+J`c|F<*yhoqJ7Z)H5VEGqSMcVi$7M1 z_^O3By3NCwjz02#$-+Z@`0EqCJ_6%!91tKrasHxJ`y=o&Gamy!6-m+`{N?`__g`@a z?&u@;7p^`U^^am(eSJ*vJU~S%suM5q`RN}%-smpB5aZ}0^XINU8ugD$8|v$$3a@yH zRqN-(3q#o6SKyzgE3$kyUZCI1CFN)Q)ZZ`Rc{=gON|%Y3rJYHAJp8_^kB0rDRc-&W z@p9hBlhkZa|0@0CJ{OxE|9J4Hu09&|k78SWeayu8k~;Ac`^OI-Z}fnh`;I>D|B0)Q zM*U-YLw$Xm;rX}+GXjz28@kt_eK87tcKQQY5TewbhVju~%oImMO#zA_-)>?fa6 zI-g120HiyfsKOf&-|EO)I0XGU_=&di67N$rKdc8M{-^XlpU5AIAj9)n`d+P%H<;pFE!Iac z%=RG0U!>!WIDd8HLG?TS@NjQZA4}hM_0gC=)HsiNTK+;FOnc|qzv_MyotKW~HTIA3 zmFf4JXs#d1hxw-J4{5Y_4+fI*-v2{a-gJD0^cTf{I^IV4S%r~b_Ky9(3U9&nEGPa8 zYVW6__^*$*K>SZZcL}_aZ|?_#p8OA8`P1BG|Z^6{Ty|LXW>dCS{BJ^oYe z|C}fPAGq>28vj9{wHy|K_Bhf1V}Gfqtno1t@iXy1BYTjp8UIs${Le6cV|^4A|1+#l z{lS#l2et{z^@lS|3;iGQ;QPbFp`<>Re&5wc+I@e4i7)F9HRAtF{rI2u=SOF}@t)fM zGm*U0)0CBc!gBI*{mhlOD*pE+<-PxVuDsJJ{eO^X|MTUUgVOKv{%`EfDpnZ(D6cC1 zXI38nyzrrZ{O|YV|CTF%qw#+x#*0}0zfb*hz0Hh&QtV$H|IzxV{M)quvHjEIKh^%j zp8UV-%3nYJ6Z`KNPv5$M`-}1rH`;IX?>D;8Fy6>-PdvQQMfpBee2@DFlV=$(X1#s} z`)g-(-;iCu=X%#sl}G;szc?=zMB`P^SPwr!eQ}Io(t8V0dH3Ey`*qs8Kd4yHc*2&4 z?^j*md9Gf*U-N#W*$cBsip#IU8y)5Q;urGZd*_!ffKq#A`Afb(t?zeP`G_~Vpt4zn z6-YDw-P(SfE_YWog{lPa~e@`FZsl4Ue_ftwIzovZy z>CR`X;@iW|oBNGE$oM{z7y6{UOS~+E{T<}ze!|25*Oj-?`2L`HBf`IbsCXlHKN)zV z^Rx^G5YPeI=fwR*pjR)NXb#hHo=f+!hUdSs<%?$QL4B?aZ zSTp%ydx=3X@j}8wvV64n#2aaS)SkEFeJNV+?99u*h8Hd?w8H(eZ23z3KI9o*csY^2 zdQm5zBl%Y^zR21QjqzAD-sp7?Z}i$M&s&=Kp22?TM_-BQjiBe8`;IW)t8t&v6;>CX z7h7a&@ImlK*V6DtlWc3|Sc~vRA4}Xvg!_!R-(&Dd*zaq(UdVimc^Th~-*Rx3=^y1Y z*o*Be&xh+L`nbK{0#7X7NbfU4!1K*Tkl}oGfc=X%o~^pi=wmGZgW!!+Km7;%DgKXp z@&Ers@xLOxQKS#ZQv+{wJd)S6cak@r&sDW|$Jsy0Db0B1W7IEMG~@U5@r=$Jgz{nh z?#p}kL{i>NLSDbUQ}m&7vwke1raD@J6rm*$)YC zbax~v|J?^v?h@B0|4Q&iFVpTb`dHUB<|oVaU*L`OK56+^0J0&x(KzENUN3AM zZ>0J|e?xzo8%^r>j-%g|;Eg80kE@USr0IWVefVQa&*G7ZCy;f=4{TscPCV)RR3BS8 z-sod^H-R@&{f@kuv823r|1TQD_|u1vH@b2q!q1?6K>vGX47EK$c%y4dhj{O_$Hze^!Nd9o~Mv3zfh`-wtNq?;TR^*R0@kV-|?GH|B7Zxs}`>A|U z&xAL+cv1fE;EkB3ITYlt#v9EPjlN3M7v`7ei$>p~VgK$KCmnPbE}Y`eq!VvM{kr!V z(LOHTD4I{gJ|8~b==^!|_k+Y64RZ3b5tTrHoNo;Nc5I&~5N~u|b9Jz5+S^pTk?{6$ zdu#AUva!Z9>Gv5aFZF|X;`nTihc_L4%_j8a&qtfdDSqfLu-}-DH#(JuHyVxbKJe$< z;wXE!XnbA+Z#3%TjZU$%eoVX(&)-v`aQ+hEY3%uT;)~|?S$Po;o64^m{1Nd5@UPtB zdUL-F?>hqj*~MH&8nXJ$Ew;TH;V1dV^2MEw*flo;`eeDE@$==Vi#Nt^#-e)@boxk>7(ZV}@ml{HY z_1CwG6-W4!@Ha45ipFr}*c3$_nbwzTHw6uSWaLx%I(}3sY2*90y-)f({PSl}-(F^@sC}<4A9x!sSV!yYz|Rc2H1IYFd=Ky~Y`mCX zcpo3%bHu~<9QE!KIu_%5-m7(=&^hluq2nIj=Y)s%8A;-OZthIrdw}0*N!~Ankr-?) zeW5+Obp!Y!kdgQRszfiCd^Y;l4-*Ym7?-^b= zn~0ZuxhF4wrdQmX;rKtlp8RRNM|@8{e>kE!zVFEr5YxkFh%c-!WeI=@B08VtdHB4c zk^j^=u6HOu;sf`6oI3$J&VTOQ26qSh^GrU8 z?>XI*#P@jbZyll)0v zm_Oab^&RAoG~~@L4rSgTNqJCzA|B8`?RabGEb%=8 z%mH>354}TC{3t$l4<+x@Dhws@Z~a5fY=ENo_YXCfT>AV_GTwF#CGl^=LrJ{c%#eG( zR?GESiK_Jh;d}V`{>q5CuY%`cF3)m5NNphWq5X9^AleJi`SRYPuocoL_rLmzW_$}K z-+u@1?+te2eKj%izdr3ZqghjbiS&LpA4-S*dB5s;rdj*o`x=uEA)HiuD{Pi`Fw)z2oyN{C&`2jwum;9+t@z;Bl`Vaj-U+!NY(MrF# zKdN8!{u6F`q5SeN`OzK$(t$5JLi@-Eq_6%a(*5|y_$rk5A1AFcl>g!`@}oLb{;pQD zUQyEeEY{<8F%=@2l6-nphfs zh;N-QEyV2u^pEdhwng@_?ZN#pKj@zFl`G)AqDN>Sx&Ox?Yf1=n&eaT*^kMo-nXv6P-&Yw!xtQ7uK3(qq5d{Q5?zY*)B`h2aA zUwL_hFaHBpZ^ySi<>#LVe-%A4^1qyvzaaVJ{fg@I=PW;#-}vLpWKsGEw7)I?u=2~d zWiKPY_^T)X3!eO6jpcs~e`w`?x~x#sA7=gY=TDqJ%)gk_N9osNeWd$CZ<{aw1L?!` zkLX``KBA&WHRHke2h%^wzQ*2OJQ#n7<00sa+KXlUAuS%}U-IPtN-Tfl{_x5MUmwZ# z;nF3qeRw4qAB3;C?L)8MKJ>EuI6h4K@CsQr?L}`|`yl@6#7Bj}#&p|W4*puKj}`bs zj8C=k@Bl@{?ZeCqPr5%;s7zP>FURsX?hn0f(fFZe`*7LEFFkSX!|kg{edK>N*2fC` zAqD?=@x>?IA8xGgi0p zQp+F4Se_$))E=7s*XNbaJd(En(%pZp!XrITSz>vMW6)oQLmDIR3u-UlqlO4!4$CC06 z{tH*$ms8~}QJBd8FN{jR%lp5vH>+4-{G+_8_`k67_`i@E|8IEm|B@?zqw#-fTx%oC z%b#NZ>iB1Qe*DMwPmh1`6WSZ=1y%O{QBVF~bmjlBhpJ{8!Bf zE_>?*ivP=G+4Kih^8r8pxqehP{y(17NB*C?`e@7_YQ+CV>7P8*jQ?3b{`LJ`-~RFU zK4xdr;$P$OdiMWBQr^LT=E|FfM-J%ePW)dUm45lOcK>he%_?ff|BNsH49csD|I1PQ z&&<@5AN@ZMFxT(@-}L1F1y}x=)b>yIjM~48QFOv$^DOj^MxRo zVSch?{mH}UycRH>Kg{2O54&vQy@d5Z?oV90tnmo_5&U7l;iSro=LR8+pcfilZ%SwyViv_oQoUeO{XX~^EBYaN3S?jg_f%AGV@vL54eic6FB;OC$ z=dr$gh1-+#akJiCoJhVu+ZXW%`EY*xr6hmn`&|CGK5P6F<(c>cSsCFc2{QM%KKt@j zjyF^$$}5!n`&qZvucf~r=mRbOl>W+9j>lAo(hDcG9%=OpefIKQ`R_fJcl84CJF=PH zFHG?LSiXP<=*;>r(tFCYSCximM*j2td{;8UA8O5a{PnNM|4~2BL(P9W>F=fg!S(m_ z_Fd&!d)8>*XKU#k=)6!id6&GDA%6%)=jl zO7F|wZ_MMo(Kg^qR9s1$!Wb{0{6P8Nm`8sFv_5XL93 zUw!lKf~`6Q=g=b{&;?Z*E<;T zjC|MP_aX1_0*_8lstAQ|an_2S248v0&yJutCK`@GBjpidP{JeClT1EAl0QL(Ie zCtl~1_I@0ubN}IdmCGbCn5Y^_V@}#pT+z*_+%fgqq-v@loK5u*@??bxr-xk(_^S_s8*!^F2Z48u??qz+YkSfG>QC&%U-z z{?g08JMj-0bBh7V@5uk551fY!9zFW;@_dQs*-U$amJL5+51tn*h4gzPkiTHY8m|1; zlk(^On@Il0!RN^TGMQ1t%Sa}_SfuMhAEebksXd7IrwRcxC}!Yq^qw7+`-_h^g1u)~pQ^wKnO5$l6^}G7`|JZvMAi1vdOzciizk5LR^z^*3WKTDx znE^lz9vqUANKS(2vkMnKP;LIcJU|dwf2pMfBEM4g4oR zH(ITcpnZI?ZQzBC#nvZ+_HP5Cea_ByTCHh(-OA%1#At zqwMfUm_g@ro^3v>%z|MbKD^5G5A!$ZODlX@6amK~8b-cVjQu^)PC>jmxC zs9rdI+R+R0jQt4DYQC5Csr;iKasDXM;oqEg^i=-GpLv{l`BDByo;LG$fYBfL-yc4u z#3=pAr=E;p(2M;!oj9MsKb^C8TO-cil|1_f|Bd!d?RoNepp%rx zt6y~T*!O&n%G3VP9&bDe_IAIl-*i6b$tSlc|0AeF_F-|6X_5ip-+Mmi@kK+gHtB`< z@(In)TYi)OIAF$)(kU-b7=9QS{>dWg+oF7#{h5p8Pm?g(<9;|p@3#1j^Es_w`s(8C z0sU$84{%d(9saTPcdHqcwc`WY)BK6r2Y)$UTw}7ex7bhh1p6m{1pMZCWXfMW9xV~{ z$D^h6cx3u##v}4a<;5S2NANeUoKN!S;xEMfxsLNWw*N;!AC5N~Ue>(vW@!l>H2wwk z#q6iyZ=_#(zca@lrIG)3{CSCaV|)9!()p9Iw?L=6wp0Wxf30Ud?s4irWG0dq4&Yt! z+{jPQdfWl#6@OMF&&un`bMXC1dcEY)>j?Z;^D*>>eWU!Y$$nygNy&`IZPkzVOX0~a z$!^fq`IYqgB>asN?mPZze3q``!6o z2<%5As*mv>-sf@WMNmJ_1F3%g1Du|}VtZpq622HebRLE*(0mlm!}K{Xa+-Bn{eu5y z&f83#RsA{-^KV!I1n`wn;iLMW`BSB@ZXgsys{RT8a{N9J@XuU8ZqPp(AK88x;Mr$B zPI~bCgkD2Cd*;tAeMaZpc_hSV><{^QcIr8$$MnSc4xhfybTZ;M@{cM%oE*`6Os|Lb zr8oMUIIjVEC+W%ehj8A7x;d!$j{QI>3 z_F?VUYFP?gO#fQC{aUj9gXF*Xy-oWUnLomR8L}0@J^UyA@!n7a8RGVuio;CneE&!2}pqbcFrEMR_U@OwF{8%GlMmG9+fcnI3)?>hXg3GaOz zo~Nl+53+uyze@jNJhK33oIlB5o5(cq6dEsoi*=_z(wBYpr2IGQN&Q%^C(qNot)4|!V|}@+o;**px1Kytb7wtyp5}pi@;uGA z{k@!tedz8j_%rgiG||LYs=SfUTb5~lln!}gysGxX_cT)OH%I^|%b4}ULbVuAg&@{js&IZW8%1Ni7P;iLGY{pj;vPGdjQ3_h4oUOJS7 z_f2^)%J2BSoCW&J>;v#cf0i^qWa$fdpC0TM&cL_NdpQl6fA&xGSw7@o&42g2mow$1 zqrRT^au)WYEArvhpXI}ZG0a-}yltAW>QH}n{9evH`5W_NBK7{w!v~q}@h9O9S{dCHrmAMk1JX5D5zQT#l}^q8JQ-^-bQ0QqD5PaPyI{6&vp@8wKr{l?<=hP;<^ z=`--q?fAy|^Xlj6v2SYrB@<4VzS{J3yv6vFNzr^C;`?2U_a)EppL_Smo;ZQNca;V9 z5%ZsY-*+(auhtV3FN^+)KbxAbjpI{ue!#3hkRQX(lZf_qyy(j)ksPmlEc zI=xALO#E6rH<6;p8}nYy1iPSkeQ|=eOZ*o-CN#g|(}QX8{+WqIm!I*>5BdJIiPy!i z0rc4X;Uqn-{iIKi9m~hi_j115<>SiVNz&u$-}C9QQ~7vf-ph&QV<{~kJ^DiVi1lSc z=dUDB+sMZ-eYyH0NqSuQtWS@f%E$2ca#Hf~UH4wjwZEIB$L3G?^w_a{ydm%9{AJ2V z@M4l4Fa5YrkDbcL@b_|3^6_0azEm$J>2c}De0uCuKHix3a$@=D9bYiT;LQiOtE3SxJdf!!2jU%Lgat+`Wufv;^YDAIq)}5C_l@X`EY># z`eV<0c>28@y@#nuW#PZ`_j1&JG~Qx8p+SA{@u$8x{D)AY^*0^)!Qt^3U@pZzH}j|A+5i z8One9OFsVe9~}O}>|ZOv|Ala(DPFJ&%m1tRD*68gF^)^UWVxD@E`tO&S3uc z>iG=4fskBdL((_{F1Ilesf(f{Lv`9Ji%9P$6S!*}QJ<@E6X?$ zeop?^SJ%nQ?e%|M`PsyE>Obo1(f@Tf{ttaGYaP0S{WfS1;{pBMG{37qlfwT8eEfH+ z|HI$Q8O;A){XdSbr}aPP|8V_h`GNZXvnl*P<>NnC|C8(QTwgg6uWxES1?w$Ew9oZU zt)Dy+-zT`l{8;~}+jPNLKcOr!f0O<~uRTef$9eO;9FWVdSA0j_%c1|KF&_Q{_kVGH zz_!ozn;pKFGokl#pS5>=?E81!dpXxq_-=N6e0Qqf(C5T?9PDR!478@cn)5glvQ^%BoQu22 z5VL<}b>jghoAWi`U+?*xy0!*-=W{fF8t{A$=G%E5hvot>#{2%~ajH>!*nd$CCtmk^ zIh4P?=X3hLmm_I4=Wj5-@zlAADt0UkIDa$jy_|aLy`0H!^LsfS{lCEd$WKj9lHMH8 zb^hiY>% zj6OqNa6fnxkf{&+f9l+sI`rMrcNFVe*`Q7Fw(`~rCwtz@G58>h?8)Sg-^=mKFNCl6 zy`0JPdccQSKenn^e|FIO*EeZ@XWHI<7)71^Lwt9Q`;|Tae)Bn}|2U5`_&#>7C#pVY z@3O%a)*sJjeb>F0bM@zw_+H_DR};?w-?Y8c?jC~=>_wmVa>x!NZ;+SX^Em1Eawdbv zQ9$R)$-}=6nGs&UM-~T+B-v10shmTp$>~|g~u^t3|U*&#YkKbMHk2d(f zmh(88Pl?at=y(z6aU{|oZJ3VNuUb-2&A&k3i{~bTd)a+Yey$O=`q_IP=fe|cn9MGN z-k2Y1sXSrD3r&DKdSClqGBBPmH18?%H^u|$_1Av$g=#?|Gb|@8w7zTMcx9 z@%}~=Q>XrUoK`b=9;ew%p2ulT@;r{tL$G|OHOcchEmX(%UwA%2-;02C9>+W10RIE; zpPbuWFN))?V^_mC94!bROs1{a#Kz^b;!0 z-pi>|zRdnk9xx0h2!sDTk8=!Pg$3*r&fnBi=W!;|=W!Yt<~QR5;;#wkf1!Nud7Sin zId!vk!a`?YmO7JkU=T~5jOdkSSRS0+`mtKp6EG`v&p=%y-mHBQ>T1-=W*)l zk8q^D2q#XGR9mb<@Z<#A?w)k;M4kGq{C0e4Gfnhbk-w(AqL+zBFaF~sy&4I6rQ^}0 zzp}6)ee%xd5T*)19?-v1_`sI>vhDeti6QUhOiWO`yz@Ef_i`p42u25<&p9>Vd`{-V z4e@!CS9Xu^{7SKk12)z_B76;V87v8KAz8W1NWr8f4qkJn6C4h zNPqr(J}-&q{KCy6@XrfUJ>yTHe?Nrt5M>mw_NW>bZ$S6E>ObTk{4R>$_wf9S@%OIK z*4q5&PjL*;*?ay}=au$!m~&FLl;5TQA<`jF<6*hL{z*U3-xtnT)f@5i z3pb*_(_3sV@_%N-(qw@!SOEDeu5L^zDN5&lcFMEtBkWx*+$u5a*5;>qK5k?-tkhk3 zq-Q$2ga7e&e&?>p-p+<&(_VTJ?M-l-um{V?k*#`S+Pf-5HdQ#y}V?2PSx=9y>K zL6wDgVW=g~v-Nz=2OqMt|KG`^zWu7c#r(a)o=rJoT%AT9cpcO~iP z(c93klA>Qieko6+w@<$$T$xP5yYPUR&2Q+JmN!dJ(Px1CN!}rE!|0cmzv1)~e+SUd z$)D)y(M$9!#q@-I=_7weoSpoo>6fNgIi{E7bJx@m`dR%HeMmnme~zA(zS8H{K)*;H zyVP&!Yq5BZ1E_u9y4ooeC@&G5u%BspeRUoB>d7bMA)()vzD{0^JeHh1zA~cs%`W~q zJMe<`zq38cv+OnPIqdUQ8BF8eH|=r4zS4dVvB$gn+hfO1YwvNM z+Sq5y?}(pcbz_fVZ$VGk;|PxIv4zDy*ymjloTEKR@Z&Yv{_fi4!JdEP9vf z`zZW7t1q<2`dp?x^Tq?&ukmrpr#^xwCfxXu_D{e+onO}l0kmf~vAvx9Q?_UQ(@l?` z)eEIj9DuU^>`m~8N(CxZ>~EHhe(`<;tkJDRzoumcEjA`s?h@S@sX{&_Y-&#`b!h<6lYcG~53c@Pj;R?$*lV3+K^48f@D? z(7(X?jDLQU`XhZ|Cwlt>eeLa!;=MuriQ2RMfu`VN#)lWq7fU)&rvBV0{U;5p@)88{or?cK4PkqTZ!XYbHBi82^jkK4auL82gaxN zzLjMBwd=LTU&cQ1ebv74*Df1>t!}7!7q8ShyW@Ba{7J`Sz42G!225=@d4+r{VAFj{ z{o}6!_2;$6U!|P$Z@~}v|3)9I|J56R6?ZY5i{r0)N?&@$d#fL^Kd^V@DOVo)p6N`+ z`gNK5RhjnEVeg7{52n7^@yf+twti>te18t|R+&u3U&RQH#wQC$@z+?C?&2?Jk2Ky_ z485HHTdg|zwf4;ExBT65#nIRLch26W{k3l@{_2Sz*nS*86zfU2v?~c$rW_1<#_`m) z^z!3lj{m+t0Q!0KF!5?cpU8ho(a)oA8eiitNxfw+?D)X`>SO6=1Q5T7erbQnqj!3I zF!W2vFXhSkKZ*~EaeOMcyepYL7W+?zerb90$8XYW8~KaI+hO!8@0fn-uam!8Elocs zf1;;HFVV9Y`=78!9DiVG{rKOAvx~pd^h?t#Js;2$|EKAfj`ywnx%kWXU#>&`()24u z@~QEc{z)?a%H@c!7k|a}GcB*y-*ohaJTU%B)7QzXkw=bPhMxW7FZoN`$6wzmdmP1I zZVq54to}stmq(9;J&x#^reCBFqHoX}e-#SJ z_{;cXv3;JHaO2hM)dv%Q8GmNm_^ayqBR9bxG3sRIgUx%>@_+dc`Z^odQvS$9D*hTz z$6qz$k4Exe8~6Q-OlLghkBp6Z>F`G;COp_1UtRoV>v#N{FzrR-!Nhnn{u+y5EAKT6 zNAf=&!8ZOX6q4~*F7`)Y@14Ks;;(YqtY3j%ml=N*HD3=%>wyblsigg34z5&m7Y<=# z&y0V=@t}YFwR>>hw)dT?Bem>{$Tv-?N2iP z>eHX7y}t1mrmty{T>O>GCF8GLnm)Ny{1wv&^k@7f{7HkC6@M89Z6AN#o{qn|QT#>! z;zDhP>rq=($$!?x=Zwc7pW_!MW_Y>kZ2iSR>q8hk{rIff$@}YJBZ>7elz;wwu9k%Y znEmaT&*=ntw;qP}S2yw$M=$=`6~|w8zv)#C;3l4}hJ_o@{ekh8e?L6hi~R-k$JtYF zy^G6}s8aK-F5Rtnm9!og&p*@?{_5&Rdj8b2U&3!L5x-_S^NIUiRyV3!oIjEheNFMy zy!g+5f{VKyZ2aFjAErMm{n`}&N{GM4y>!|;BVT4cP5!UR4|{r9@kYhKiZ>wt#j1_J zqVe6rQM^@&((U@!SOnYntFEmcq-db=zG&#@{NKq*=Z~TNg>XvaugS0VMa_4M-k{$? zIIVa<>Bhd5wBLjFP4PqBROkHPv3aUnJl>afC*jIm5-yHA*wDj_ADb@zDtYu(yk%hL z4_NwZe4_sw)5DDS5gf%|7LMrY(L0T=iNEsdpQE2gFUT|YmrXi<7UeNt7RL*!&*O)o zUpYm;gghhunoq`8#dtp2%3m^lO!I-FcdtB=UY4Gsk0*a_y!GYtI_Ov4G5wP9S1^T7ON`uRNEeS1G2K=-D&h@9QJ!<Tf77Ec;rmvG%BacN#PaA)Alj~nS@z*sDpl<$un0+4K z(s*nAPwpS!*TC+_THTmW`JZ!gACwMyz@84WzqGGb|KU$w=6;2Q{e}NoiS0S+%XF%- zzX~`mpVkM*Un>u=H=t*1pV3VdfBF35{)Ci%ID2H{F<-v9KVg7HJXFGm*^b&m&`T%-H_F43f{RjF7sE_j%$#^WE zve(1)!|4O+TL?Y=r0w-K@tD7UG9Kw7(EmDzaxt zrhF`fnc45<^S64zkIy*X7md7a6Q5-|<&?dv#PpSa zSupb%WQvW44FA9nt&jD@L%ZJK_$<%*2E}Jyf56Y){=BjASw5eP&+=*de!9(iSt=e&?oWg~Djs9Js`JLz6OVc8VcW!G!`8pv z*m$g*vTsTMpYfFBiT_|fGM%}UeVb3kV~tciHlEUtF_PcdJLyX)W&aZ6yXT)p@mR@^ z*J#h;@f`LLaO}^)e#GNj6pxjn`6O$vD$)E?WUr!h3-5|x7mvB|Me&67ms~tCIqBwS zWxuAho&uEZdQPQ8aq;6Zi6_(3o588c^&ji%j0nR zrQ-j~AagdRqEM z@z^l=OVclsNBJl6Z+04wk^lP0Kk?)f_)tF6^mXx>(dT%6~4LU&LdcJ%@ZH)(-&3<(+*=#}~1^0X?xFF|r>i`yBa~k-drL zdz?JDc+3baI5x~aqkoLYoW4jO-e~)rw#Vhz9!oz;vHb@ApqG_*7mr!`IDJUl>zF^l z$Ft9=@eK45eG~eCcq~Eh*A$Np(+{T)qPJ&%jDE!S`nuw=Vfv8VpP1Nx2>z~ar1vL| zrSzd<)*I=hh(C#Vi~Ot)$&jGxwrG=DZ=y{sUC zvi-w(s8l?bEzAF-e3>HUgYzuI8?_>=zSx1OrpcBg_0z+Xgt?EYHjM|Yd}g53Gldo*8Y&+~0DVvs*K z%KbVcTL&!sjnN?gx3fln>y2X2ywRk$Z93ksYHe`&ue+v2OT-&0e=3olLx29coX{x! zv`zn}ZSQQHKXabV{pwfH$sl;EZLb@rx5B*PC)1<)E_&%5F4z9*J;a&(Z`t)n{3!Y) z?-MZhb0{xoop66jrn7`EXkReL+h%YPewtwDC-2*Byq&??roHb!m$>gg)5!)rPjAYz zKDHdcXUX%pT0ms|;7@Bq=&WTMfZ5-TY?kNc^KAn!Y~-`a^YYnj^1OUL$Mf={FUxoG zIi8mnzB(_T5A>b#q4V4Emf8T1fv* zm0#j}jGjD+9yti?u}z0xm~Y9xuz>I_Q*d5zb(BqTOW$k4o&`7|Ua9149!~SK$F{!HBgZ#d5zG8-VYd=I^HDTz> z_vzSNq|cc!AIlHq5%(==zma`EO#9dU^9G=I#rV%{$s75(=U@D?$IsFDz8LnmGaCHy zBX`^#@tgbs?D1z5;?rFlC5gnJ(NWZw;E&FSveTA7tS{!z=qLvm$spRJKDL?H@@I8p zX^ZVSe4&5UKeqhA_(%P_q{pEn{Tof_U;4cbuGjnbTVy(H-RdLud$cyRyuX%j;Ai2J z$9U2{UT7P5VWW^w>R&#e)W5xWXJ-6G zb9@gvEnnC#y-Vul$;VaF-s&ItUxfk&+wtF=$F=RFKahti*T+P4@w?O`51UGd{83(g z{_ll;b_yl(Q-=gZuR?+R*Df2vVW~y@B($POS@~oB7Yg)OHRku>KlM}c=ILkk|F-?ADgLu{%YU@LurUg8?XKa+Ah<$#&~ccxQUkE?E0rh@<+gzrHp-=> zJd{dFc_*bAAo{u70wl{d3X$E#zz5 z$QRy+{Dbx2=yLKr6Xa>!tS7XseJS+F(-rhDl2`hZl%MVGOBv$RT`QBtqJO1K`EvS& z^BS0&K*SiZ`Hx0f&4mxO$cr{%{CU}ikR`XTfI z^ryUFejVGeO5}wnFV-GGJ}ED=NqM2Xa{P(pwbvdc<%9P(ZlZq4Pd|GEee5SMo;^y- zOUfRVBriL$N0?9qjD_9iJW zrT9FV@3?)r@@GkTxw_w%mto`Aj^*XM(7q((?vgJre;w>gLSEjqFGK9h>Hjw= zFQ?w>%gcY<_N8BZ)Mfx>!@N(Nnka1LlWXpB?3N*V*(9AN+}6OtBR0G1pfy z|H5!o^a4Jd&mjKseW~7jl6g-{6D-VP?uTW3jrk+RFMO}m+?Sv>h+kMR>pjdbxQqph zpsPOF^mKf8ig`7Ew4(d_lsB3`zGXd{$-f>m+O+ezgY6~ew_|!}K3>9O z+vj}VC|k1QS0=dF;e0L_cy&wj@72yOv%iAz6Xt`)o(pbZe0}!NwTj~J&hFiW6;Hjg zg83RVUuO8R&inVqgb(@g>L}K)#?1bC*7vow;6BJ3Qt$yjoL>RIF8*Kf{XEsqsDJ(? zySmX*C>_OPnJ^pAFCyN8JadA?+y@7^hVq1U|C`-k)z$<-SM;lfx*x8q{)1oce2#a& z+gTxC@}vG7*M|q)FA#{tCV%gFm%N^@@Xos!@#T8P7kOW1Uh~bSKfIsA?ss+TT}yHP zS51D3=Jxsb$N6vOeSG<>+aH4aXM5}CVhTR&Pm}vSbGhXHh^(H|PI^jvTUla5NJe7i{Q!wveH=nP+$o$Kx^t~x~Uka}8cjb4Fp!_YV^tYwpl@we* z5SM5B2UF>Xl5p#=gDJn5Kd8F>rjkdUNA%A(`}PR*f8*rgl^go3*XMG{{nJ^~9`(=g ztL6It9pP6i=GSFU-@Nm$mqdS~KjWc!?nU~7`Jxxj>;6`|-hhdqpFVlF!smX zC(8PSk9VFG>tDD}JnQu9_tw>)OJ09aACi;zCBGE)=Nqzzux8y)$R4si*h>^o+?Q26-|5yp6q@j0)& zT2JSFD~$q^qVwe(FSZ?D)PAGE`sl;a-nYVq1;P!%>|e7c(Y0Qv-Tx99`~c)&c>Ua>t`#WpP6vl=r-+dT3>+=$D_8h|GNJz9zX1O)FpZj zzd_>>$I}7hk@UTlrT)s^y!<5XM^4}6-_yVJ#w+X(V*f6>{&D@UvBmMl`0qCbH+M#7 z1>5_=66f2ozWJ7qH)eQ`d?PUTBUE8uXny5?f*#MG&o*Sf=W(C2-iIqUaa=ud|&|tv}|bpfs>oHN-30pK&MZhdj=9a^^l1dcm*02)LxJ1KJ-Bds+)i6`&N1 z{v`4X&YAs|EKmOc<5kc4(7|o~gH@uF3tyVy$e8F z8I1iP|Ji*LPso27<@M-#ugc1k&(HMukMq%{yo*;xOF;t^rhK6N#QOEi+CNtsjnW~{ z>HT66zw+eQt2d2+ALf1!@rV2vRs6q2`h$M6oqUR4dENIA^DCbx{>r}%zkYakCCFR< znCpM!PZV$R{7^OG?>AHY;(mjTH~B?(r(pO+{W0f>Jbo1-`iozM6u->=&X`~3K9E8D zTK}nPPtmvWGWGpEzG7ddnW#`{*tI`q;w)^(p38N&7|=j>SZ30W?4j!Vw%NmS+8&mN*u(Pm*u#p)FRqQp{Icg29KUS)grRS>uq^(> z{3>g|#UOtD{x8f2Wyi0|4*69PzqEeecl^?Jza8;Qb$#3TRY~)!GK621>*1IDjaP9$ zQl}E{_lABY{14f~T*@Ar`-@_J<#LYS+l*g7_qGM=Z_wX*lV2FW*C74ypXF~{7r(5( zL4Lh%e`6TGKKyHM_56)D`Sn`(75f{N*X?f%7IY+ z{BzmEp7^WB-x$WPfA!Uap1<)Xzg`Q!b8^7}K?Qi-U+sDh- zHGaKu{>J1`f8#&~RrGFP<+^UEenU z(E4Zb{6=nwf0(--|4{x0)<+Wa8H&I1lbqkO_Y=S$>G2OIiEr#5n)!}F{`{REyvOr5 z-sD%x9$pu}ikkqfSoGZUg{PneuJ{*jF$LwJ#We+tU?B-ix4>don{a@df`QA6y9`gL9 z=AZcw<3Tk4EB^!ZPOJ|Ap6%>1`-%GbBUm38yAb4p@4@_a?Ju;R-iN=sPa)RFT{#|b zjP%jGUt;HfAurW$*0X=-&mJ}N<7ofWe-t!$)-yX_9pip8%%AUKdY1f0{>&@m@qE3_ z&-KvUX|DU-*^>b-7%HPuYufUF%E5Xq}!cjV%$Tai!$@h7&-oByn z)y%J;{lxkK{58(kYkimFnf6!w)s`R7-`g*CQ;)oGe@KFV=ac+P>=yvNde5`w%vw6v zjkw=G2VX${xUzu^N63B(BnVkmHVd~3}~YL4&f~~fInStJ?0iR z;J<%!fCkCtNB?i(g3qA+Y5snS#Cq&y%0qVattfByr)m9D%WGyo0Qalx8kIjn`Ih`- zcO~;L#ra=h{y8IGasIhv{sVD-tj|?D^P};4zxp%p^8XI|V~=B#=uPsc>Ddder?mpE zKSbyCRyP(?_mS<7&ohG`cz>s*^~5~Nyt;b~_t)(AV5C=DvIk5Deem9A(@RJG%AyA& zeRtF4NBz~#Ew?21&y9|v=f-{@9rn2{f#Lbc%j<+E4XpjSgr^Mr=dxdbrw#mX1Q&2W zqTry*{s#rzhiKqn#K08>y!do8+V53csjmpeKgciYTQc>r{TESwY|Q2#QU2!2WGer% z$#42s2zT$c`BmS-qbpOX{CiD))BoA9zUb(K_7@JVOsDeiGx>oZ=v~13Xr_MP!~C_C zm8E3=519PuzuvRmwLejRb7eVI|3Q;K>VMtPKcdg0D|=J<51IVvKl(EpPB!PzzWj01 z|9yV`0^XxD{q2hWpzmQ*9{AY)AMpBLzn;oO`} z7yU^u?tN1K&>ry9dEuaK^oRQI`iuKfLBG7;{%n|Abm?dh_36H*zVt->v*G-HmmhE~ zH21rxeM9epUw;AjKiK|e41eb5UH@TUYvK4j>7BFm;r`N7$@`mcVR~YJDGid_@8Q|= zwEfik4V9EVFIAkq#dw7MXc}E)|6$L2@3&3e7tz5Udp1v@5IxGfeEUdy==S?y{{rl( z_JFZJ`q9{G;t1@;B~ zP0J_b0~cyIc`qV=Y`@9xOj@3@TEL9-!{fiT-;sQyQkJi+6nuF>{dPQv@XIP5$wvBf zXeHjyjPl5D#|zm<&^tG#`BIK&l=qZmjd=T+VYkj&Rz&k_$$Z{{m_1$g0(-~zaoE@{s!8| zelO!M`TM=1{Tts(`8$2|gZn??c!d5%IrcBmKIPfpe++vP^B4L9`PPPzh~MCcm2dDb zA>W2SNVoDEjZe||4kC&^(fHn#KZ5)Tdq#Ulh1K|AAtN9AMIE2 z_t%F(k@BMVM5Fg00mt?)pYmtzbwZpk`~v;cVo}@E*dO4Vh(CcZ=ws_Q{K0-$Grz<9 z*xv?yQh*ilm-tCuEPe@oe|_E4A9T^+m*agDTYrJ^5Ap(gk>D5YeZ0TV-dA-A%1Hkg zv1R^THMp7R)*CplM0`d^n5=jK`26|>0OyziAHdkJH?s9oR37KK{PQ#DPyQVC+%Yff z`vu5Rm^1ve`;EE3?ImpXke149HlUd=<{E&xCI2FgYsDC`1o_Z^)kN2ld zYwNJ~hrRNny057k)sOyye%5|*zuJq6kFIJnGu!_J&m)QS;J?lzasMX$|E)XFzS_%A z0bA4F@0$4Pv@6f?txylH5d+W@`vqS(uj_=({0ZU_@L&36 z<>{3hlkq0x=lS#Vd$b>s_d$Q*B;>2Kg`8&mQTo9>Y+d(7V?5@4M^68geqfLGFS0!L z&%Nd2`KjQ2xF3W2B@wUd{ZtmvebYIl7mLA%;O{8?MWh$?-b?T|P#)()c>az4i4I*I zI2mNl1qTK5H?+@q>S=t9#>dvi7?Qhd=KdU>e;d<*K+buRzBvDOQ1P0Bcg-_RSCS}w zag6@B@R~0QnmY8qxRw`CAANas2AC z2JRPago}q31+;~K1NPmATX;{5xXNh~{!3-{S3Ct=JXZ{sSe`;~0Q^1|92U$r&uIT3 z!0uX+FyMt*`Zv7~@sQo?sjryKEkG;b47mP=`u(nF)`Hs!o zlJvUvEfzNP%7n#%_k$GAl?*?KPZQ@c!Y4x9`dB_uP2lf6KB zw0D^KZF}g?;$h~G+T(dOlW}(gcst8S^@AR*djT7IX}r^c za{Z+K7h89G>1e-s4`ACq`crJ)1(!5A<0t2}-)<3$mm?~fEU-iY2R zU)WFFWBXY;!8BcAr1YZ3Q{}hzljcM6{;d`H7wSvoPhk8|`w@)sihzvv-;k7>Se48M{89Iu5xVV>s<3uBapG=07C zN#%X|wpmvG8_%!w(zCsmq~}@S8Pjv{_>_ZuN!I_QA%7}&ZkNH8@Yx#>&x{$|7|*;^ z1-vVuKWgHox53|)d;b;V?{d9N=VhouvUdv`yO`a;UtbBHI(LNcE#0v-@^d4>JtKHe zW;8gf4j6lB?w`HXHuGPa&pIMnU19vPJ41i$K$QPm)Q@~X`H%Di@6n!Avh~mIKc9{7 zJN*Xrvvox2L0kGm{-`|bkbhAC*j>{l)AFaxc?!lrM&I(u`!2)c!%U0$mzO>%|2F=G z+Vk`wIFjVwOIO*L^a1?N8(YTwmv`fQPnL=JfL_AC5J+CD_zCs_?>(K8tPa3m=^p+@ z-cero7Xc2m4=vKqlizj9YK(uO$3C=?Zu(36uw?p6e5fC=2f;ll{Qo!RkMK|XlS%x0 z?ZM)n>>d<%{#9#FcE-Z;rnVC)CS>s@!Fq|qUyWBk1@S-yFnE06jy9^J+A zl39)SV|TH9WM5GKu_J)J`j2ru*@Ztd{uI_&UTvs+bFB>+RJY?{@hHpN`r$8(9c6i2 zf06Hpp{_1|it2li`MvrcWPa5LeC&JBUHoL}vl{z9xc?vVY5{poy70gCRws{0Z-uLh z2Ub}gFzoSdUOMP;tFBt53vI^p)jQaiC_m^Sf5g&*`Q`5@zuI4Yr}DBq+Nb})@=^YU z@YZ)IFVjJP;D4uS-{glsvbxAL$_L_E`eU@``t9p40xp-90P{E4ixJwVGQV5>Y=q0J z%Y;>)?Jpl>d-_e|>#~-kBN+B+S>;*8*e8Gk?b9;xiS@In`}&t@4^)4zeLBUuWlzlb zt+pfmgubf%2xk0uePBE z|An26<-^Gr>4)>6Z6@3CtPvXd3<6l0SJ#3D=9iJUW?<3Z^uM1xLtoS9UrU&84uVT< z)vt6JbJrf`FLMB30HL6eKisFE=X=+4{LSdgw4>L{I{%{cux7r}+>dpUd2Rn+IIrax zQy=Ct7dGZt75a}4>_ID>o8}L!GkEz$o&Q!_n*TKQwV4*zr>trZ<5!};uToy~UjIye zD!}?)E%e+kUhPcr}raxv{sK|bk!sXU9^d;{py<6m)oq-*Ud@g3k_8UI-I?M8j9 zANK0>LrHl&^)J~N z0Up1Qnc@8PR-?=HgKXvkM)LQdge|Z9SN;5>Gr^N^mu^M|=tt%PM*H`s@?W$0ziHc} z#0AoIl1FZ80F~4<(4`V* z^LNGT8<3~x&)*%dmk3^q=jR0%Gpdj48IU*8_gU0M{X}~UA8*g9ebx{7$D;RSiZ9yx z?Cu#M`=a%+g^gME+}Jnd&vcHM;o8dE=R4Uo+M8^BMDJrXF0|XG{^ z^J&ckhhrG_WA0Y^1G2gB??2xut#RlpPMQ9-!ueZo1B^*#^$+t~x89DgO~RmeE4=TH zx8tkI%b&jgj&}f7e!&lDK27;A-vs%dORNX|`UU9k11LZ>#(n&6`S{!suIJ2gJ?CZe zb8)Wh$ui&bNWHVkg!nZBn!Zh)39sFBfBsvCu5%hmslg+=4KZ)MUn(voSA^yB=@6jk7 z`UHP{@j>P_@&Nzn;rmsV{Zanqy>7k@Fxo%F`lI}uPb9e)`IFL{x4CrHfBYQ|M*2c{ z;y(4o*53&C?|+zOZTpa?RgPtn55+rgJ4o2#gZSt8+X;(4sJ|7S)cld!Q2VXhV)`&X zT0WG7_rJq~QGRjnL#QwA|1Gz;{-FMaaPa}9IeN5KNpJQ6_@Y0{2MJsH0^a|2!cl)( z;Vnxi0IN;)Z|OGDU-+Va%!eLwu+kqs>e?54^c{YBD}4MI`*V_2ARY7DtK<*cH2v9o zknmo@sJ|5+eLG>*q5Kc;V}I0!>fcvJ@%|(Dxo;gwTTEB`CvK;_S^A;=R)ux%BYoB1lZTle)AP}H5{~Kl z#Dl~?qGv07*X`tAjQ?YY2@8Mq_vkwb3xC!B@Ix#g;g9~Uvo97u*c(h2z#lk9djotp zpGI?F##@(4S)dW@^3)dG#^=RPkIZ zwhy2`)xiSh$p2v40t-@Ez=_7VJBa{N03{%tG*?5>&lC(g$%w}`*!4}OFG z%cPz7BY08oLtrSBJU~B|U4BcCHj)fIRutce_7VPl=&|`&k{;K7hvf}D((n5e&oxu{ zKVDAbf0f0p|GW@B@(B9Z)lUZh$CLQCgg=IIYhRaS4?#1FUvr7|$M_q0eB9yRTypZ! zBM%0D^=}aVkEiheZ8rXz<)QcliwA8tJ|yMg_;KLYWe$#)-;MHc<%uLcuD;C9UaveX zmD2cMWpO7DCr+f~A*By#c`)N6XcoysN*|0o#QM-&9wraN^x?|8Q~3WD8-K0x@I*OH zkEA@DJeiV*CzAS+whv2b`>@3NWBoAp;R&Z7i%Y}ogZei>Kd!zfNslXEkLfYoJ}ed8 zcxmn9RTg*hu>R5-I&C*GBkhm?M#<>5O&UR--$k{+91 zi|H|39v&{I@xRLAP97e6EF}*QC-ot1A9}|N)*tJGu@4VBeHcDosDA_W;oAFC_O5S{!4e#9-eaezf19m z{EKbI%TsL2!(Z)3F#M-$A4uVUnFS*J-!;U4Y6jZxP(=~=PsHEJzqx<^5wjlx>B5)W zBf4v`f6z+%2agb!7~jRaLBHS;hwr1J4}a_R7ma`L2-70`;2){|2nN1aKbXY#%KyLu z5x$QO#n_#Z`m-5CGYoy1j(sPY$&9wmLY z!yo%wPN8hP9}xJb`F-_6Dg3{J3LXAOhvM(^yAeLJCVB_$?eHJM|HU-^i>%MXKgIv1 z?w8&Uf6o68<^Pi@{Qr9&|Kah1&wuV8I?CeYZ+bk$`aa?X`iJK8HR=BemFF*g^}oj- zIFX7Mr2i+JJ{;}w2aG&+5&sx{VEpOpLs}lLoleqYbCU%keb|{i^wIy5gZ2OMH2+Vg z;sf#jq{H{|#|Ozj`L9?#()WJ)|5Os+D_{2UeSE0=`}}W&C+-q`gSO+pvwuea4Zqp{ zzWV=A8vln-UyuHuD51Rc|DlHl;Sc>kF;xH0r11YuAODAj;-A$2lWU^)_V^Fsf3N;EI`O{Vi>^#6&$`hPq<{y%XXMPqs_O8?_{ z;P`R+2b78J#=~?x(4+rPC+V^I&skZd|HpSE4}J9ivBCO(A}#-qQJ-RbThjl>oc^CU zF-ZQY|BtczgY^F+Nqn#T1`9;^o*0U6QvaX0Yuk9x=)d9j4)h=O_2~Z-*RTIi4AuW< zQuzNfAOD@||6^;SchKI>{te-Oul}>X?fE}k|A+Gb*%bc2?&CjL{}byan16i!{Q6wE zf%0yB4eJ|43u}GivAHs0uGU(#!d@um3)zvFxT{&7Ce#HYw&#$SNlH8cOs`Ps*p>2Ih`wYP5{+up|- zRbR8Ym)|Y@TH)#CqkzXBu@;+g7iRZjzs@oPTJ{%gJq z=?mfUr<8`@*gn=1_OYyR+$O#g?LB+v;$5`Q`SB}%Gh^%_V9t+U{WVq|*}LKXo$8~E zHv7hR$NSMYj&FMOTjQ0d-;!su9!GqK>$hm%4`0xW_-=l065nh8t&i_c^&9$(^$DZj z+`m0HSEhhcpRu0?=NXR*m#f%sq5YYepu3ChL0`eIJk}S)&w2wJg--&WGi$Yk&-|#$ zEB)!SS>BJdx}oaKehc^us9*O}1W%uZ|Fs6DKARG*vUdEhSA!?ix1 z>zqOceC+;=T*qin1ZTqIMpi97asF}+<=uO5neg3lx_xi$8tohLLwlKyM!&CUyv6*+ z=}$Z{^F%Q?fc?}Z?5DQfQN$zMp zKYwms+eOU&Zk}g+uh4h^iA;N3ta#C$h_9h zgEsVU1@M`7X>DEbI@UKod^(1?-ud)N4^Hl{g1%M5`M11}-LdC~Go5GHzM&V=^H_gT zdz6Q#`JTdj6X|QrM1G(C#4~fxIC_p^eq}U%j{^8$f51a5@U+dp5I(zZ`i~z#Z=^rU z^fOGy`W)B0p5=GyGwos6e4ObY=5NSPd+L{82p@ck>H2&P>v6EBD$gHa53t?^Fq*$w zL4E1@t9iwzVw&QY*0ZcXp5LEWJg+u^PrvoQw0%?ik^V#9U;0=kVc&vZVdrGuMl<1j z%AXr$B0ffbx&GzoA^Xz7PI{$UJeS47Ii||AIn#T7M z9Rj99erV6Dzsv#=zG?fG#CLV$L3Yiaj{v_nmPmRdZ{+{RGP`SFoUeZB+=ENUg7|y{ z^^x){eT2M%-_nXVh9YlN-+pJRJh^n>De=;sr%0IU!6hCa30OeQS(YPP9Q^J96pa4wUOua`XfUXMQA z%lbTe81%tkGavk{($R$V#{l~C!9D&04NN=6w{(G4jgyOMmurzwyp!JX#3nbzf36ACT!#dhL6<;CJ=H z``#D)O*y+_VLBGffqJf%})gF-v&f{va_9L zlNT=N(gciWtxjwHoxk``*K{a`e5U=^caGsVbG&OR{+8BZKNR+>Jwy5m z#(1$1zPI^a!T5*%BmaY5dZrbA@EOY52bo9tpPYY^-}yoQR`~u0nf`vlmkEDBmVamq^vJokv< zhw_8J^NXbKJmpLK;pP^}pE<&4kNe*Yz1!k9-ou{%rLQjD9?*YA{{YVkuEQU;{%r%~ zi2FA;C)*a7^2z%#DPN}^VgF>W!Ef4U`DboCk~{5>N6qwjWbiZeAb(U|{K0qxd(r45 z`P2Rq`)Bw=`!aaES+e~<0{X0>E)Ab+@pv=0w1nE`WdDhe$Vr?I!El+K?tzRXiT*OrQawf}Km{Sl6mkGWH%FJvaNuX8Bh6-`XK#v|p2eo;T# z%q#g>kvuD}C(ozOC+T(iOUxh9Yc3w&gOwNbS0_?8o30CoAab_0H&9F_; zd*)8+YRr$>yP0;UlaIwkmml)J5YAL_zPyVp*51wThHx2p8-A&O5x@GZmsGz$$-hgU zJ%T>Z%9ap6)X(`}_nsQ;A<|1OUHB|&1GRoLu(tC?Fwg(!JLTEjr&1A2d?mlEZs2_? zde2YevFa}`Qq=XM;NJUGB(GL};V59Ag0 zp7)K2-oy|3+6ZT6*gt8JrQa37$ZzJ4XN>&dN8wL$`S+_-()W#2C?B!BlyzRv$QSKN zslxc1?jre>jJJ&bO7S)|YD^WACu%PIYsogIQd6~ugme?|II zmi*H{p3!}Fno}_Rmj1-}SMFxotkakBOa-v=Z-YPe$@#;5^r7*er||!WED+&ePT8|0 z{;&rJ)ppRPeq#P$=1>wYANFA2SJ8P@_SyJPGdh1N9-%zWciv83stoiW`E`GV@+*Dj z9i*?9|DA-R{0rfI_bD&w1A62-h8xlR&_a0s{VL0J*yn}tfd^EUFzn-aIIp9K=6+$` zzlGtX0q30Oy%6NTa315^X5PR}yl0xa->cdwnev<;0snCRt8@dZK6~chjnZCHK6%sv zGB5pE-Iz(8U&zMuOFF+WQ{wrB8Fzl+p_$})n|o&5`5AM*V8)%#5qxCEowpHue8!#6 z5xhQ=ZKFHxe8Rmm$@^?h%((ME%71dkoxc%$bjF?U5xg|x&W8&=HRI0X2wt2?o)>>) z#+~m``tnS+;rD0nj5|NB^v7mEA+NuW&$#=?Ug3ONIo?11dp!Sv>zCdK`5^t^|2}`d ztoO}?Z?ho#9!R9Y56BDRf%_j~{gP*{KUD6&$H6Z`9-H?)2)N1L>xllII8R1r+7SdPLLt?~?b{eJ7Ewm9c~t(i_E-7$9^>?| zelzf+k9#o2|Gg@Y-;6zP0_?6;s81UIn-$VZ_^NzmFX7mpwcf?Fy~={$52f z_%{n-`|&ouM)M(@zrISC^~*nOA8QN7f5zch z|8L3k*T??{Q~3WhI~?I(Ny&2(|6com`%U(sxLYsB{U=h;=)B+F)O{%XQum?EJ|tX8 zAFa1xJw#1{-Wrcu+&_g6(l68g&phbzYd)j-pi4LQ;U3C{wGX&&q;(I+584F!XYenN zFkL*+_|-hZ^d{3)f8}_x{zaW9jK{Cp^<&8D)xXa1#jF1$)4lpnGCisv_UT@>uQt^F z;=OEt5q})t7Q$KDuP#9Y&&;5#gHiqz>-Wl^V*M(w{x=V)Z=@IST|m5wG*`Y6mT&XY zIbI)RU)4Y3f36aieuXz$1Y<;8F8e=D4QJL|LbqW!p4 zdE@kVvb@qE@4){KQ@<&X^M^+`UYqflw9ep4q*C`5W{L_o0-7d-&bz zXCvHqWFO(6E&XeS`|iXyvmZeEweK#rr#wbK_o+O7Gx}KpIM80{yq~9^l0WT7Q2k}a zZ^C(-@my_3`U!ni`wHC z-N0DF_3zbti#?xi+JqWk^R^LMSze3|#3XwFyqQPg~8kzIae z_XvXvs;>G^exDD5(|;1r$6^1(BuN)+a(~86()Sg@R^RD=b|e0PAH}d#pJX~eXbdTELpj{fAb%)5zrTJ4of zC~sUmq@#Qm(K3F{U+KvoZTZWsjaejj*QO=U96x5KX`jR+@TV0{=LpC4Xl{vVIVb?&3-ks(FJ4U2v+-jr9O>(H!v9LrkN1-Re=2~r z-<0=8B=3-ig>Y)O>kr~9tmjM_`D;u5ao<_V%&!|5_rDd1uVh^KFO^9z$pqj&_hDB= zU$!a#wIq5LMIX-J_1uS@p1;*nMLd67(tM}dL;ut34?Xj@px>1rOVaP^i|C7^-{ASm zg#7^jFh8aDT+Tjf-*e~`V|_O1dcWxGqp%l%3%D=J+6TR#f%^2`fb5Y?#|Vl~SN4SZ zh}kmpvFXxZ>NjAN*ZYRDM@r8Zo&JLUg-%xYQK;k|K(_} z1<(zzje!LG)@=2Rw)*FmHaPnG^ybid3)4ca7d1iaXCAOtUT-5%c`=M5#e=WX; z6R$TwUb~-7%Ikr@iwd2*rth;e(t|3*kIDt0dY0MkdMe?M0sbt0wCkx|fKmQxm`%w8 zW)Cj`1Iw=jf50!upTae**W&%jPybMmA-%JI!@QT6`D6(V;zRq7@dfEOl7Er?23#AD z;8#a_?gLA-2mU;NzSa=`=fVFk-3Ykcko_mD`OT?@<}(Suas%a2JR4JdLQ1W$xfhsy$6ZCzVcpnn;sdxA<}^NJe-iVf zmzh2h$RBX&-utgAKWSnerh|TbFR+HM@q2-JP3hk>`SXxX1CIiKf4s{9 z9*@VvCBhT2y`T;MwNtPCFg*BZ zeYh4*RoI_N%Ww4GlNZ$A;b<7Nqxqv+I5|ansy^sH=q>+K^#RVGn~LfEH2wLk8MpJiFe z0QrsgV-$Om->8rCTN*zs%>5duZ!I_t`=WGOWRD5Mo@;-y_r6cs|L6WH7oVX0 zg#N2P-hGaMDSrpZK-xQ{Pny2F_NQWfMLPAZ8R^d}d>>~z#*g-i`i9yf{USUS>EA0k z&X*c|*(T=ai|6WQ?uLb$H z-rs}yjF#jfI0Ak=iTxrRPyKi+yS$7a;`zO0=?8zKeM-~22z{5o0Gc449!cEKDf(t& z`hJ7)X)7;ZkMaV3Bfpg&lqdf&pKkpR>)+J@cGqM?wVpAp{z$%5J}Y@cX_d$PT1)zC z;f1hn_g_cpvpL!l;fM0@PqV^}{kcqdKJQ?p!ylJ_F8jmwHb^hXEBOcf(*7dj7xh1q zAMhvmnTS6oetGE!P}YsVNq;*XuadqT-=g?(A)MHa@uth4*gpNMs{$auqVL3nqc8Lw z^qf$6<~hUtTzpQ-r)N&_n&^rAtuQ;m{>Sl0ew=9&l2@hczDVV__@83k@)uU153PXX zVPwBZ54G>nqx!Q+dR+Px3rJpNFEC$d%7Y(idNgodO8ptyOQGY>f8^5o7UKtc0zc=EV80dh?`jI4?kCwmgimhB{6{Wt z_(OeMgFcQET#M&F@;Ub1_>00%`Gt?@!?ySV{;&u1Kb2ke$NumF^hN2o&mO604*%`^ zR9+9ZsSeun&P?e8FMe`un(_|)fxVNzCi#8Y#3Q0b+r&G?FlWXO+8C5aJZ;7+2j?|_ zM&kkcD}9aqp>f$OPrejS3ub#Aie4AEp*_S?jn7d3yT?@?{xt2C^3q;$f3-=!-_(B- z#;a^r>BJxFC$NutFHq@%^VYr~9r(_6#^wJ`TK{*pGm-L_$H(b!`TnbmcTm0-PDo#@ zzl`{1e4M0+{o@0v_+>)lPgEb@`}6(5YB)YY)a1{ie)@;be*?WU;lY6MMKqq|BYIRD ziZ3!@CE-sd{9Tow3=VkZGhrbfpCHez4cXfj`Mbvc&5)k5S>(?JkpC=xpgbVn7yL26 zRm{iO`1g|WM+4g5w133@(7{&!(O$1VIuX+Y>CS)T{3Kw`Zzkz68{=#9*CPKC^O-Eq z8)JR{lP{>7c$x7W<~!LRH{V%{2^HDeZ(2%*L}JRkjII5ego$X7s6T< z{OPL5@2=C|s4WS=zc0|=r~~Y-8UJAg`c@aeX;VzRFi{i#9Xz?jv>Js<_UAUupDRD` zP5N7C5B4UO4>P}c_UDuKru`f%m%YJ!=xqb+%}q)EKzJ*=L_VoWI;DefABY&q|6uyUqOXFC^*H_@>C0#jlH?k#QUgE_(byunBO_bczv1i zGs;t+IAJV(GWAVRpQCs@f39Za&)Os4FHu+j)Lwm=;xb|97ozscq@U6!CTI^MdbBob z6z7#D{?Q*>Fz}ZNGJm5pS^JBB)Ww$Uw(tW#mZ_g=5AkQCGd20bzi&q4A@Hr$Sz%;< z6a51|xpVuCeLC2%{&4x=`cGAZnmu1y3+vKP+ke>miJEH<`hoFlvU~J*j|OM3o`m}H zSpSxNCq1D5pnsk8SNq~u{b2njy!p!d(O=TH7TGJ5uZC0cc!2ZE`E%3e?$|o&YrYNg zanQi@FOWZBFaLN{^C7agY#;jB+R*Z+rRO^6DcH~x{cnYh+ipWu`rv$St5cZ%gWbRN zWz9KoJm@S;f6u}f{u_xP^KTSby{Ye&7a@OBBWLkLB!A5R)my*vUoNmh)l`k!;-dC}Y#Ue@&&!RKLbAy1rth2}VV zU+mz&%KImtyn*+b|&ahyY@LB)!_25J+Dy({#}CBexSaQ;4>(| z`ESe@RWIN+^PTHnIJ!e59F!ZsThCl51~KsN7x?m z-69P8Fpl?!WKVeh1pdo-rlR#%?WYDkUN~>etNQbc)!>Da-7diXVg4KMZxjMNSZ?O) zZw#u%@PLwV*M5Qk1rNyGZhic_McgZdTl3f{j(`b72;^w{sy1N2gU)sOoGYPS8Y!&d$>1yl_BSeX7I`ycs} ziTOzQ+qKAk?KvR-67oz_&=r3`zoiSXADJ#|Kp$@;fAm0Hv_3Z;?w5Vqs=g@tSEKs) zigEMCpjMPU=tlM!@+W-6KhPttPyS|*sqHsyQ6G_BguJ5vT|m0uf%AI}0QgDq|LTUS z({_966UM_W*)on7kcYH?3j5SR*)`U{{2Xtu3P63|VEkd{YdMIW;e1JjcIU$wa%8FhTPih+V|g^TVMLcy?00Uv=JU+&G@uMKfV|E zt|JfsdX&!nuCM+;@y^JeYQAoS`Herr`auoo|0h*{?%b`xtxP`HQ2buRewN?(#l0Bs z!Ef{*_J7)px7dFHdzUF9I{2mEzCEhHwK0L=zPr|-k>~i8Egbq+g%` zhiasd(osHtZq?vdZ)iNnd6UEV)@2>UuN59DFh6@?>N`Bawhl+|%poLqzwFxU1gjjc z&3qKc>tL1RHM7&6v^uM+9FGN~eU6u>1Q>l`{Ghh2e$oGIFg=1Xf3f+?NqN2YF=mM5 z_3%J{xp>a%rcvbqtJj5q#7U-`Cf5AbsfdcYj zY&x?x`L74x6~zO}8{yXn-4$0)Hay-;6`wX}jhBKtIy{OcnYe z{j&aQ2AL&*);<)&!Vv$)n7(Ly#e0Z~cQpR?@oyTPa@`-_G2UY6qkd~V&#rDPZE<{# z>ubqDv*UR-hx_L=)*Wof|5@EwOpO0U_@5x(8miQIDf_383ic54$o6OWBgrm z<2mS)DS`me_)Qr80{sWs5A5%3Wy>v&-=rz)%VYjcp;376yX4*o-wuKH0P=M@UZUZ6dVC#^DJ@rdc2V1nZ<-9fz%J;U=qiSc+M zIsWdQaN{rd!|`A*%SQGe<8eD0FTQ2^kNObb+WFPbBd?bp#kX}g|CE#m#1Gu=vTb}@ zy|Dicw*UKj?7uvA;&&PNe#hcn&Fex&tx|C?@b9tzvqR$BnN)mROU1XfRD4@Y#kaLod|OM!x3yvM z?Y^}A-)HQ8 ze>;wEyW7OKsxA@V$`%FfzVR*Wua3fOZGKAe74~BTU4GiKry0y|IeQEFq5ZCU_8ak6 zWUq77XV&NJIqYGv!~V@YK7~0pc9G~YA z94MVVHul(zN1__b&v3fi+F$g4`}so9o9k6Q_Ov`?zOXWIzHpd5<$4?CIkNX@e;WQ_ zS^j{VFI*slJb$_t&-a4&?qxs)VlezJ6{`7+Nr@PzOQx*5@>B7MI!fNN> zLHW;Ceqm1+s1LC{4SMWp!?UNbpQb$RG3Jj5J9`TL!Jm%pE$}UNCQ-e$ue|SQ36?VQ zmt{`_*;Cn1=qv1X!v3~GvwZIS*RU{210$P+`lED}mpz`8uS=noy%m2v`?~FX#bEoo z{d`4b$b7|MfAvlK8m-Sn{_0;h`>O4ZzI~nk%eAk!rtRykf4TP6(q~)yYUbNL`)cXu z?5p}8+gHtIdiHg7h<#OY&%Uk>oUf>MZoM^SUsp9>>ipGS``S+0S5rQ=ueT1iuhXdh z4YjY+gYE0I?5mltr~gX+c=i?Z0jIrqpYs_=Ppo%0ymanIVO{ZjfTnL9y|G^*F&~hA zU%uCW6)|c3O?-g)3XK(Zz9PLIUh6DtzHYnu;#y}fmp46sb|K-9deln_rP=L?pvd%pNG`{%8Pqki~5J6;cW z^8@e~IA82w^si^WU?=P0=wHp8pYZK(Jz?+O$n|oxH+;Q(Ic^&mT`*hIqXp#>Tm8VM*Enr4;;PV z|8qV@zP78ctodhc`cZ#sHMYkw#k611`_@tW*xz9G>azT0^>0=PnEFPrzCFS61@=q( zp$pT={#W*~KXLuF*&5)ee$Ycle^jUHpPcski~dhfd-wpq){Nt~*2fFvNT51}PcWyp z*o5HeS&m<#8|ugU`5Xs~h(EXw&#dLf^wIfbjh`xixNsQxoA~4WFYRrc-|c!V*S8x4 zZ9J&+|5q{wMtk>RzN>qJ88)?lBz<0t_dz$9%=K&NcWa{oQRseIzj1$J*l0j@aNZbN zqxflYk!g|_)Stc&Ii|sCR~X2mkItc?2l*uwc?8!Uvb`eQ5EvMA@Xy7);Mv~{w$Vn2HZ~-%~yTClUt)b z$ks=+e+>IEnR|^{C~pfJ6YPnBZGDY4ei=hHz?hHEF>&n=@qP-%pG>9@V9F=v2UsBi zi};f%$M-{{JoF=8j}m>2^yt5VY5$D;qJH>GNa~_(;HUEhod5RE6I4uI8bO^WQ2PCn z8t@b6;VMpla32=ObE&kYH|}4u^O0@hhxN0hzlHm;Ob022=s*1hh@``}dI8(b z|I8_*lV0C6{7`!ytot+xV|_Yv0o?gsTc6&y;c<6QJ}wl3;G;Gj{K0w3kp|Q4e8s}Y zar}bi`GNc`d>rIuetrNqF5oWA2ksw7?;k)q ziHQ1eU*R6%qx&*$#QL7N-Hzld*D<$YNWev}*@VCO{Q1c}I1%mkn~#TiT?Hb4%lK=U z8$!D1HNyTGdGg?`MlyZtKniZB;8Q91bP7Hj!!Mk_P3mIw2WJ(-qV{8MHO&6Q7tX_y zv;WkurBV1>!UpsK+*|>Fat0sEAMTIQ0xj*=H{{RiJk8nD=Dr!8Zu>-6 z*?Sl8y3Vsqba{Jg?=2~@wze;lY$e{>7i~$FCHa=vvSV$_j$_A;t)w?nS}-Q`5H3@( ztdrT!$-+Pt$4x+>|I@rbgW~3t`Ce|E_A~>D zFgi{C`sF)y|Aq1i{lWdFvif6t-oNoPW!9HaNx#;062a(u*o@*`Aq{@TzegB{ybqcA zNuSO42;T1lC&HKP_n$}bdw8E_sqfnslc#n4B&EJT(Dw*E{WaR9ZlBoUVNJLxMQb)dPt9Tg7F{SN9qOGoHF<6a31aVW+}m>k+JvLGU13` zed|~j(JQO`$*O+?dTG4C{^7pW#2>`z)x4L3$v@%yjrjeVKLO@3DT`%Dk#7S87>_kNm@Cyf`-2mW008o;2}iO zE%BFs7u>0QCu`|6OgR-gMxQ!h!>@7Zf0^eAh(GWr+E379_7CIqs2^f|6W_$>0ewu$ z&yKlCu_}r;?lfbQ-jrX)OZ(U#>=Wdr)!t`rp}C9nb4P!U@fGz``9-$(=O$cuTYql5 zg@@=bw)W?!kgP9wOMi~@58;XaT*ZY4`g5RgR9@`Qjk@rL{@jcUukXigRHuGlf3EJr zz5TfZ7A`UVGFM##dc1H->VyhNqFp&idD_A0OFv+Lp?^CRyHUQbcC{gX-QmW^koPS_ z-^zRXnMV5*%~x(6<16Y8s-B(v~9N68_Pjmi@c<;Dl)p{+0bb8yHVT^>=Nc zJyLy?ry3damYL;W?EN^%SM`z1Ugr1Cg!#Q|nT~*8vag#n9RYs?mogmzKg7?W3~uy0 z^c>A}1pH8WInxpFOYlghBjAVN$xKJxwii5==?M5QcvD6X8iew*JJS*HSLO9gN5HQu z%%`}|lfBBLPsQug1g9jjybtW(y>A*tg0229ti&IzzbN`+wao;@Kjz;at`Qvrcfp>H zl{owu|AhQDWq(-tqK5^OA7dkvK{@Ep_gSV`rv4Cb`TO^%?F#%!{2U(HgkOX97=Ii4 zxAl=PwN}~g`a&4x1OD_~>dW?D^hZbcv#lK;_h%=#J}dE0$~QW; zov^`&`C0d^CoKA)|FVCeJPlZ5X#Da(L?3={JG?CpkM=n*+Sf+vXdlgg^X70q=zqYk z?NV7tkMacR%{iF)4R0rG>4W)=^8J)>K4pLN5a*{cHNT+&(qH(Zf9!W`3t_E)_fLl7 ztNvu4Q;zu_+0FS-qzr$CCdeO-Y34Jso$v@@^k4QT*ArGB=&$VWSN>9sq5e1Jj<7E2 z4}F9G+$8zrpGu6k4i?E@%MZY%O<0T=f2scN*~)Tw&qKY0Eq@`;N2iE?K+m#&Z*Lv2#SiqKDiV(9ad<1?h#vdvY#-nc zeD3C40{p6vOz!0al)Gtf=ue(<{XODE_dYtx@qXeR*P)!Qf16oI#p1~mB1YifmcF0O z_qsy+0Qw`JeS63sYY#4CzJWd9`wW!R|oZy#`Las=&X{1cRi+5aa_kNRFt_GaZ_sQoCbd-X6r zULY9C!}N4Q9uoSHln3J!EL19*!y;a_JGb z4+jnaw%(_m9-1#F@TUX)mgQlnJxPzaJRF%y$U{OulJfB1-(Q^n zf8+Eh%DLaHec0cT#D9V04DG{FzSrB-pNzlQAJ>PZJhb`?_8;kku@4&aCjEu#E};+S zUrFGBfqDT_)np~ zrh~uUD>~SY_Tu-{)Kd6k|K}juM)7fM|JCrj`Iia&??B%n{!`21FM3*j7yWuqoy~8I z|1$h=TraTwlKlTd0{MlD|EoAXirT;m z=<(X*VUh274@h1(heh>&UsC?}9YECxU!(sALVWk_TT1@Pf3|n=ZPEX~j^jI_4Y~l| zeap&!T>q!nioRYw$JuP=*#T>lUBh~78Ge;NL_>i^RGUta&0<^Qz={<!DZ=>L&WANKEG&i}K$s}CCA)&DQX=~0|u zgMc3UUz0p6qW?#i*8jVc`hRzP{bTh1Xo&CK(f-j5;+=5)b0h!%w{d(Y#$9~xUKU@` zFZ6#$){4Gf{YLt4`28C6AN{rH|B;*5|0B!l|9?y1ug%1O->+5wkM@Y(H^zS%{nhJDrVs27VU`bd)no91 zQfRL+f4tw2pGLX%Pyq9MBkb?e)0oe_2UNyBR6bO5`!DwjKz#N19V?Xp>;yOh802uGJy-8(Z`P3-eiXJzxcfvog z=ZN=(FJX+Y^WU$gV*b9)35E83`S?!#S$-~J-}kAUT{`rQ);BHsy^pv={;Vu{-WS^U z<@KBVa{XC|FX%^nPrMq(cSgebt?D=Q7v~d3zxlpuCe!hH3tzdN?{!QGmj&IQL%!XV zci~n}u&MiW8JsVOpKFQ;w2mQPLB`9lm@x8%vc1Y5n$`DcJLc3~UFXY)7f@bO{fA}| zAC3#wcxwRLe5=J^Je_Jmnus zz;{P5<;mX{!Rr4=1Y^EDzqytpg1{g1Nj1cs7sM~@f1G&y-om{(507;Ht9B2Im{xl_ zIoZMHvWK|e_SjK#mW`_wjF0iYPDTE~-jB-QK9B6Z=*jnQ?h|=}^ZC?c$D;PopSH#f zdxro*-~gxmTK|4{GL7^XTS7D zmOse9p+4=c+kU{`{U(;{2l+W@Z`GcED53pa4PdapHIDvjiTF0F^{bes^-uY&>|gd! zaJEMM(3mau&zuh??VrXE>>=#I?AKFq`&Z@UWDi!h-k(~@Li`x{<^EPk58xAfPuA>j z?GEuJz2?focM1Ea^JEua(r@=`uz%XF4)BA$PvU#x8*zMRD#RziHyPi=@!c`En^Sus z(4T?1A(Gz68~Hys%;_2!_rJdH)b1f{7l-c~Qy(eMfxLp>(wFb%-#$H#`xth7#y}?_ zW{qqOzq$GIvdR2;uypt_{9rzUdH`RUg8r7HcpdYT{r_ehf8%_Ge=3>pj_u_hNKeX_ z+du3V?gQ3{u*s)4g?zFlg1{eM$mma*@>vV{SC)eEZ}h)8(4(8bQ=hE-TqA7tb3Mnq ztUqY|5BW!tZ_uZCW(Xz>{J4K`Z2-R;`AXf4K9Th&N!1J@}n}^w=@)hpa!q{Nb;U$zM+!e~tHF z*?g*8#D9t3TnVP8exz16Fy7NCJ?_>2Ga&Yl{KTb_?px9c!Jm~IM=DtU!}rv2CN^x?b@kM)RPua5CH0?xjL^tJIW-WR^Fbe~}S2lGe$-A;L`?BD+u zPWXP-fqxnBUzdFyf9DVCm;K|rS$>=_sQnCKln?k1l&nWK`ib~r{#7U6&Z9?< zhV%kGvETZ-gKWzmwcmgLegmmJ=y^1xr|KVi;80Mm`ghOV9l)3m;_>7A0$Alo?!)@r z{D5AJcTRlOnNK5wV*C9O`sepd^QsMbc$wcH(f`};kI3JKmkGZIvhiF!sL%Kb_DSP8 z@>pNFGL$#!-{n3wkUX~7FMhA0_IXs%{kJ0!xaKGHH}G@7KVtU_Adr*?+)rZ}Dv2M- z?^TNap_-vro%F?e^I*-;JAku?oN~xR=AcuK{iWQOtvdh>pqp*Q*i z{qX%p_LqONcBkIM!~6he1g}B79K^pVw6*>L{5wg1q;T8yN2R1cl5E=X$RD*Af8dW`9~aVb{xmmm0K*^Jm!G4B$|N!)Q>vqYdm`%p}LMd=QDA7U5L@kxvwq!P**>gKlH=I z(@pdK)Tg?WA-!aLAzT$}if`@6ay{TUAMgy!3NpMLT+-ltFU zqo(hVB7S7nQFo*J^fi6|EPcKKKRP-8fFF?0qXz8ekbKM#X|fTd8NG(y@?<6k>B4)zzqFz zvHca$Gvzz??IGWc2i2ZkiXJ6^%f^GQzDi!4?@?Of!8-fae8&|J#pHwdwYZB*Hf%d{uu@ zeON^PJL3474{VM6FZcZf;-T#>f0N%+fdAW^a?o4W#ONdD2YD{`WsPE&RUFDs} z`^PMr;(iwTqkf!Ug+Ew*LOi!B4QO`j-*vJ*_RF+@)%!$vKbQVz#;O0r>3xR4{Adi3 zGuq2PAir#<;tABxJN4uHQ+)6HaHivf7%<%LzdO_M9t&%~|4^pm{Vt62fpac=Z>Hnt zUHHCC$A?|`V5Z}|3m?gJJmfah2I02j)z?Mb(xMIvGA2u*st3e+&|BeAF0Q71>d{cd>uP?hUX)o zKlf9-6xx%Y;4k!H&tZaI9rD5RjM5$xj}v|x@>jm=5K67QA$}~~bpWuHN0!&Q@UX)W`Q1ylT*%k^V` zgZhZab`1em9krjS9anw)NA~IdnGyWTI)u3&qP0=z4>s-J#4_Tq`kQuf{iDAbc!ukz z0ER!6kjRz-&CI+3<)R1hffPny*p0dS>hVfH+f!< zy83~BAzp5SyiF7SVi8DjzkC;`YWDlEpVx-<|NfwSc9r&@HCOIGPuvdJInOvbhWI9IdSkJpnP`$Kw^mZgWr5AX*)H2(kwJ&J2q#^`Zg z=UV|ilKX9OdbHY)(f*EpOfa+`oBBH#uM?L2*xcVywD1t^%~*d2yJUGu{^Kz5lfA%x z+TEwqULDgD{pGKQ4<8{&dcxkpf7$y!fVDp|bSNx0_Tz5oLtsDnz2M#SFM+>+zq9B2 zLHm(=!}jPO{_OzUlLzSk7WkV3Y%hOe`oC`%U~8Y)|9!^+2mQm|9b|jqr0+>b4zfLc z66cTpkFve(AMJ;ZvVG7$zR#{S^5lb)7(fe z?FW`hsM};Q{Ri$V3^?VO&#=BnwDZUJW<&a3F_;g^w{mQiWB%~>eew1~MV8z8*ngbf zp}KZF*mHf~s5YAKt}Ut?mG`o}%3;3|FKjUV)|8&>R`VX8h3V*Y{qrY~}7sVgr-y{B%)=i^((!l!T9?~~}LErttkL4wue`KJhDfZ}=(i zcG4op_ll7ZDJhQ!4!82}^8X(3?>^{*`7!d@*QiO^3@$=i}_ln=(SMCWL?^6k`0bW@%zLYS}lhQnn zXnw-@N5ucBp&_)z{wa(QEG&CF~td*`Q;l!wUs0X@569@4RaM_ zmhVm5^PUBC9n>#0HkWZe;|2Lfcg$_NPV#8~SNd10rGx%}5Au`39XF@+{wDg*of&xO zbU2(J;w{M2u==|EMZTZS`Jj2z(|iDD8zY=8$*=r|1S+Uva?j8B;4*830Wug|YtCvS#Ld#}F%06)e4 zYvNzFF(gvrPigWa?~A|T`6pfSJTqjo~Ka0HmlsqV_#5CB|(39FO0)C z%dgt+{~_OG1^#5uOC0%wye0K1JRus zUami`_l_{%)Y)O<@6_Jduh4(OpMhVd!v*k*_0J7^Y%hOq?cHS#Xy=RbN$Stz-V3Jw zK$@Q~<9v#pvVJ?(cZ=13$<#0BRNv?a<#VMyFQh*P{>4;H-%A^RxX~--bR3BO_sPBv zq(-R!k$eKCyitZYehgp8C-hVD66j|!$L^cs>JRc2%QtB0IrAqGJ^LEN$~Qb@-yfoV zD#{sve;BW?F{<*il`qJ<$zK}2Zy|k(L$Cs0U*LeNCm}^eUg@{*AT&l$Ucg-1mV!B0VvGw3qz} z+LzDC{)hIQ`d>#?@elm!20zi?{PpLJe)B%WiIu28dZGV(V|4Tk865B%_Ko&S_6_49 z|Lo}FfQMgEyp*mq%Cwi)%Qjy~?$nT3Yvxf2@%n(jiSsk^&;I@4Vam4pr@YUx`{tBc zk8!;)G(`R2n4~xCHyxA{?`+=0au6jbAL4pWHeB^LCCbY~>|5oC4`T9<`h`Z#yl+eS z2b?$SX)`~Dgx@@BUFqtFJeYWc@dNfpupT$%O;esn{v`0j@DuzXz16<1 za*Vfmv*RCyf06aAJg}VX4E>`&Hpc$+1Nn-LkNNlcqnqiE6)yp%zZGvUL*D?SzUV*u z0Q6h+$F6gIyE)P1YV=>^FYsf3qM!I{;veCo^0M-q z2p`ZRx&DdKpY_EL+!x||;kG_S9W;?Y>qb5qGEDk~`6ln{=>CCIAN`RW&GI2T-$nYL zxlw&P{)AJWJI&GOuWP*s{o{D<{OtY@>VQg`pBm#oX8t$hzZd=>@;B^X%N^dQnD6p> z0f#^TKY&w@f=(U4i1rrrsyvdq&db}%R}cE99$o2qyi9BTTP%Mt%JU5b-husqy*qQd zEtTd5E7vm@`F+wYsq}YQ82g`nr&j^M&mjH{5zY$KhKS%>4P3?levst`)E!8yA1jZp zT1D1oX^*l0UwQOa(}3_N$Ek0t=ssm%UOZ0t)>{a_Z5ICNY41MRBlBbAq2k}NisiSe zKi=1u^TMJMgCPDWG`#fTAAad0dM_OKCh;#c(rthIH-Gfipu95Iru41>{Wu@m54|Uf z_7%jt|K_aNQ%KUigTf7sV*JkVE{<63Bx4%0p z{RY3V-uHg%+CyHuv0sR{^WLAo;X`Zf`{uY`)amt2eV4Is82`!BUYg-jdIQ#rS5}~X zcl-agyRgyPKeX>?-?sX2Tkt-5%Fh}7vixWJd@gEV@!Pd{==Ml|(?7p23;JigaY70j z=wG|JpKSZ9_&K%Dvpwe5*QhIh{wltQKzjLIDi7$H^0zVbp^-<~tLxh!p|F35k5Hff zzRA8x&(E58=R^R1ek0;b<7#DODeu_-kiXFQJP%uID%klY->YbA0D1nf1IS0UQCLff zNn8FT<)g2$M)-8u_Z`lho-QaMw)Xp1w7id8Y4ogVLLdYAI2*_##{_<<$GQ=?;Rm6* z=<|;Jb&e1E==+;d@O=NDFUX<+?bt{eIF1rLFLkXNh+rwc4M@1NlOwGfjZ;J2Fd5Af^r`})HE#P8Lb z|DEIq_zU{>5WfQHi}{}!?uqF4EZ&F5czqi0Ny*=t;dOf7Ej(`-?k%LrGSVCN=ge?l z0UG7N>kDbhXHdSYzmVpHLU=6JhCdJ& z?=z&|#*HDq^3T_&H=^kJ{5i^Rx`O(gZorQnbJgp0!fa3a;C^?Ju+^7TV<4h0=pXAJ z=N*0iz(6>j<&PQfUAmvxhyBm69QSq39Nt(+Z^r<{7xVA)%hj;lwjbd5^Y07lj$xASchw(~u6xKv2*#2+j@(Z4&scjm!LA-yLmKl9*VA$`Dw2MXy!4*c*? z!Syd^9v&&APuOzIKh?l;fV87N(?7LW3+W%U<>X)cXd(S0E<9F9&skXb4-bda`4aa3+q4fcWX9F@ecgi znTN}T(4T`Ig{`?9ugiw>c^LXKWBVgLABMiX#p!=*d;9G{ef8hbaa#aGKF+j5pB{4B zw?m(1-S(ZG#i0HrV_(2g$QSgT?fal_@Tq}3o#`7cq~Gbl!`ln#_qgz;Li)T5-%&`v z--S09(jRo;orUzzJMgZ_Li&OWj~CJ(cHupR^hFomQb_-@3-2wYpR+LNS()2$o$ISW zKMK*r=N8~5v``6Kc_5u2V`9|YoeyIkuDUWjNpU)hIywBVEl+Tln{IdU(xt!#i^Hcwj z|4VND_I9dUIKPt}9ie=){)3S37v1`uom^|HKIRk6ANEl7A^)F_>c{4f@(TG=M0;xw z3#n{2rXQ(Xt{U{O{-7V1qy7r1_V&@BocN_2ed2uZzLM610lp7HpFZQX59uv?9j7nG zll;^%zd(Kp*=#WwkMnsL_WO^V{tCIA_B#Up7uwq=-1-kfKR@f%@92>JvOedF_oKJE z^&f`+S%~WQ;eD4-{)jK^<@Q*8_=~GiecD^D_d|Y`+S~64V9g)?;}y4lM+f&;LVlJy zJ9h@K>cjth!Kn}W$)4NyjK$BU!%x^xonHm?Z-;-nX4}6^d3Nw&|Lw4^Uvm0~eH{lF z&Ik5$PXMbv{M)N;{f>?;K{@HOwX<_?0INRy-PfJ^A^*>Y{@dVV?J51w$83GtbNZ|2 z9hm--4mF5}`rt2lV>X20A9F4Y|9FcF!#?L-82*y6anPRjy4QtaulrpX_PXf8u-6qA zhP~zvNzfndHIpxdFzoe&3&UP-cVXD;oh}S}y~o0^FL>{14b4xm{whp6_Vem-*jvXR z!`{+}zb>hVaI#b5V%%L9Xuw z+x<<9zwJ8l<9QwEm2Y%)h4=$Td7b6n>&$-hfv1A~zIpBEYk%%(KsI^>6lz zL7$B0{TMsM5Afyw%VjDw_Y1ya&qo3n{OD^;YW;re4fi9)J#9cS9?^cpmhqMNH8>yU zeguxOP5&EZqW<`?Y8 zg!=`j?~L{fO33fw@9@^T{S~aof!~fI>aVf;OR@f-A8c>-TTJ|%++S(gfAP)!%C;c> z497S7C$aq&;KTh3m;)0Jg1%=CBOYFZKhU3EM11g|vme8F;X%X?D2~bz&$ENDzO(ZeBAH!f7scNVgHAn{TRZ#5Wmua1@qa3 zc#{Ej2qT`P0ERH)#qBPPc#r{NP~M05t?t5z_ZYB+<%rh~xG>_eLoSSX>ZpZ*UuCYQ z=for**zdx9i5khR{Wj2__$%HHX_HX3>!~KaX zPb>a!qInqqKj5w(k8`~c&4==bc&3;2gLnb)Ot}7oz7!sC;vdM9_TS!u2BeSWXSn`D ze~Ye{pljiJ3Goftt?|?!>E=3ieMPgg!KEed;gwOTWu$kM*4!-=!LW=)kSLJM$p)=P_Gf^j~B@ zuW8HK|AWw{ce*h2>70ehAH;uDPvJ}XDLC;Y>3JCX^&Yo=BEH0WlIk4N>oD~1{Z4)0 zFMRkuEa`O^`g`7%bAE@RpC5E#=;zNn@Gh)(F1Rq(J0EsotamQDFxET2?7~>@JmNB#`- z#`-t5UP1gUdA9lu{oJ(%!v*Kvi|x0B`bGX>y%OpV^#kjbBHIV{0_*c$7Y2Wf{+Rv9 zMeRY}!4K=Ba6QHG!uH0##oA+h?H_RhlwZyV_AS&$$`|GTGRgw`g!Pg9O)y{By9$a! z`QmxPXKa1Sue(3T`M~~#>ofHad-YkTemGzFZ_Fn)U)0zBLfyd^_Ak^A_DB2nM^1mR zZ?3*_eHyOER3G+h!L9G;59f>ZYD|9~hW)zg)DP#2^NL00tNo)U<{QWp>|MB?)A+Do zuQ>f-za!i~3hdVx+;V3>3FR&OC$wMJ-1>?2AofFI`%AP}Uvlb)_#plPKD0mEQ5^9X z_W4DpKI~z*zr^|Syy8{2+}UqZIqcon-EwDrsdCuAU_V9n&)I)sIqhArzru3N*X-9= z`$hltY1_Z-7wnn4|3drc?!VB!x%)4NVc*>S7uq*>|792Ko4fzA3--<3f7u25=I+1j zf_-!MUufUl{g*!2H+TP~5BAO7f9ZpLbN65RVBeP7e~H$%>KuLS)|HrjIapV0D^C0FD`yb7v_CMTw1E61}QMmOtf1=IPdy9Z$>s6LxeG2y) z#t)XL1bpN!N5CzG||Cc^|l{`xe+i_4w)qDcFFkVkw!R%N`TpOeh* zV)pY?ALsMsx%DV+PH9u|>PD1j@W3{I>WY8L{`$3y_p~Ph`WO9W4~!q`nfJ#{|B&`+q2Jl}GTO3K6X5DQ{qqVDL8s{;gtjhu;iG)E~Zo%AIQSB(LnF zME(l(CTj%z)$hdWMZ-_k=O4k(@>~XBb4rhN<9iU~S7{?{MK9C`KdOW!RD!)U%ft@@ zixsNB1pU$u{qz8)L%+)x&|yeF^iA*v^oz+K#@m7WaI7B0gO#~7;d-z>X~X?B{jdV+ zmwhkK_(nf~Q+~U_jpG5X%;gg8jkIb2wO_ZI_DDZ~`F_0U$@kb{&nu6hySGL5Eyi!u zAMjVN!vMI?jUH_KTob>u{Z;sjhFSj3p8Q+wKPUG~IbPyD_!YE=&in8y67RpS&<0NQ zUi^ydGl}{q67XySKA(UuB;e-~@O%QkoPZY+@U;krz3-r!Rk-t z5%BlB0{UWq^ifFOgDAHAi_shUdFC|i?@^RXzm)G<*W(1s-oxHbxaF|V4A8^+up(`4hqGBl{0KlX?`ZuOGsAfxJFa zy6!z}=^=bKME(tN@|n~9k$)3>TV!tp-yYeU67yF>ntuTO=kSm6`UpNxMgRH%{9ZpT z`c37Y)_(uMBe-AB`S1th7atAk*VX=+MtX{(jx~Vp6BZv0>ZANB`kzY?lPUZI%zPUw zX}S%J@y`2gX#!J!X7VMyaLVMb)BDsXoA4*;ET?Mx3G?f;Wo650?>HYnn+^R9`r~`i zoR6U&?HzJ-0F(~P9~8aSfMw4FXO$ky`V062bDk2|muDJTy>Fe-`_|*^Zvf$pw-Nu0 zKPwJ!zp_YJ{S6Gz->E;$kN0^W0vz-g`+gJt7x!~Byf3Z$xt|&bKdb3nD9?;n#?s;Y z;ui^L)44Sl zz2mCP0r{)^<| zn-cF`@7SomYl1bs8 z%@MZz0zW2t32RKuAKx4Gu)hGGvR_%pzAgVyK0Z$R1o&XQ?GC?DKGs8dh{oHb`#a8f z>scO*SMe)~Z!?U~H2xOl3lYAUfAtaATlm`@c0Cr4k9nWHYUb93PC=gme=-)|q#A=> zk)5#|{V`r%_!<0e;=Pu91I*VD+6Tm^MSn+k$Zzz|_09sD+x5->zOMs)n)=hHFrQQ2 zju`*v1_|oTZ@w1*eW{T)qNn25+7S7BogD}sRK8LE&B8-reT+~1XIQ3qgy+#!(Qk(n z-xg^c7NbXi{|DG!>jm6jA6zot&7G=7^ng4U{mq3WJub7mkRDs_#C)6j6VCTQkIf-H zK+p2rkmwghrRo~L1uEDsz;d;r?W3xk#2`a=A z^tk+fc3|j{TraiC!{+?B#;Z%-TIJ!6I}-8`;ZJ*T6Y>zp-^fFR|KO7HKz&f%#qb5a zs1FkqE|yz)xct*Z$lzb`2PIEc(huKHw9+Ff54G+jJ>v4Pc{m{tk$t>Ld7!Q&_hzy4B*gX{(TWWTJcZXhv7mJ{{=P=^=P4>5ab+^l^V?oQ&rz~-SmjE#LK<$?Mj*;x!<(2MqAW*4T*aw`wd zJ-{ERVpB8+_6(1^=Bt9q)_ET>Q@Q1wD_n^$dcm6$qExsv#c$xUf z;Wzk)^-;gpOI&|oyqNv_0_c0n8x_Afe}linZ{lA|;$OpBq#5B~6~9N@(O&V;NG+t- zBKQyZRhwT2^-)g!uHS{<6ZF_XdIa|W-6#+7A6XWEm)}@_-7b1N_|LOD%Adi18UDB8 z&;A_z6a25X;9uu(lK05oZw>ejdDnc2zm@m;Ui|Lz|6OcvuME-C&eGlW|MfANsg}z<ya#4LBP0IT?*WO8fkB9hfVmx&N`)2fgoMRE68|eE)-IiN6@gG|j z|D?VrhJN zc-#GBzz3_`?h0V+$97R1B(thtn+V%qdK&ZDanQ&!Dw+N!LVpH0cWR5Ly-4D~c*VbK zkn0QDAk=Rw`}M(L{2KK?T%|q-<0Jp{+Ij$A;`(Ij4#p~M!||{m+I1IxWuIpJ!L82t ze2;ocWwyLLH-_mnr(_>+UWa&E`==~6{&;k2gdh8#9_QY^;v zmG2v8Jf}WXKDd_dBESdh6O)gMf4ao}_ir1=uj)hX2fOwGj>fC)AU}C!koaN0c)!X3 z8vMt`NK5e?`g)`N-66-Giyu~=>EFG>=)jS0cz^r^_Izwvd+zd=_H3Tbsn2G;HllL= z$;5A>zgeFywqB_w)~AEQKU$wwwg2tnTW8-ke&Kpt@ig&q?3cU0eJz1+{&BXyS$&4S z;yfYJXPhs--ojUupVs6;j^Lwf$z8BMZcUwc$L4W{( z!hG5qM%p9TYBS3rZ+MSK=jD2z+UC1kkih~zyf4&{b~*1!52c1O?t9Xxd=T^Lz(4fI z_qx@b_7Lawm3K@;-``=sKkuh+rTz!sYi3ThnX?|!1M<_>FxnQ(xAKlHQG4NItXELp z*5KwWeuxj&Kbcc$5A-nik)Gvx``)%T!m@|sfbY3W<%0Qs^r3wb%=5v+cRMi7`^|L% zb#aOF&#t0vF!M(|HOJ>1@tz0u5BTvt-YhEniCgS|Mw z3KUuJ3-6Jw^c2fdp0qx^@1S&n<)AO>*IEA_1LOVZLGM2PPWwy!^Rv?|Kg7SGKHk%r z3fp7;1OCzdEZ2{TKX<7;{{VU+zdOKSzhxZ#wd^nLs-dc6QtQp?eU$HAv|oaEE)kC$ z*M1AP4`q)K9|!v__XYL~_UbuK$gx*5{|g&PfAN0w&O|)2l7;x8yl#X)a_CW7^!@0g zA-<&7T$_V0?NxS=@*m`$)cM9)Ew^3Yy|30ff zgViejVEmKxN&M#D=&yNSvBcl0PgZ`e5w`Zd_5J9bLq}Ll`jelykE-^BC0~O8-TRA! zBB12O$QRc;O)}BwPqxIeYI^{;4O0G8e-Zg&yok23^}HT1B0W(*(618d4g7e%?b0{p zw=JPhq{pDi#p=-GGP)2wjQ`(RCYZuM;hO~**bk#moPVTGgFB^9tS|hlWtQzEf`SLL zpogiyIKDfDFWaM>`g84m{GPzK?BJXKmngUL)Owzs)F*cT*nYYb>670k`4E3GUjET7 zTlgMn;J+$!gXXGbpsE~4Q9jl zqj7(y(#V25P1qas2YD(t2HW_4^dOxo+XLqN(W0mBPY)Veu^j$}_sLY|VF37>qQCP9 z>22dvyvMRNYdx&w74>D`Y&qVKzT*gwyW~}I9|ZS;Bj@99JIZq1FM>Rk{q1Tm zuZ(i67qUB0t{=<4`1{cl6E6J_@7`%67WI#O!guJd4Ld-4&~w72=YT)D!$vf={${)W zL4C|;z#rRYBOF^kzI9xa!GAz6+UMEW`_X9>yYELsQdA%Q1pXKKEiruT{b;7QUlH0n z=xIHuuXw5I%`#r3JYqi7x65y51=%zBKYV*YkmaOL!hYotzhFYf{(ztGPaOXf`WyH; z;J39IeTRTbU)prvnKa^f$@~xCZ=0c4o%F!^aHP%9TQKA!LxICj0H;UXa^xRw+l*2L zb-G`cZXU|J5i|$X zM*UlaKe*4S`{u@@r5&2*F^_{WD zkPpZor(f6mA;7N!{U!ZY*!y94PddZ<@3SY(_hpD@G?kz~++R-%e{Ra)dmh0}bU+y2 z|Kw9`qOIy<{=t3QKwb`@F>2xm@?_=bIp;lU+@G(cQ0nHhnIQsJK6lKe$JG`NMo1dg}c^$&-DrWd-y3%y2#yAJDIj`F2FVEBbzbUvttw z>ia&IW_6_~7lszRq(EmOE4wU~UJ23f#dLF&i z^L`i|q@e%c$Bwy`Q9e?vKVtXsQO^C1I&BN*4;cKqRrBTh$ z7q6szfnNAN012dFADLf>^LYyPY_;w0^Q3q2R-woIvwGjo^NNfR?06~P>Tali=Du2R z{~GftQUD}Bkazf}TM3)|@#7kAp7gf#&--n+0&E8H3iI)JK{@ep?~9{9$cGRVf9!t1 zyd)0v!2B_O8@C^3ry)P07uKs1Ktr$K{e;E#FwB>4y5&Sf%%ejXqF5&FjIce}(neNuE?6^4{&Q-jkO+_u_gL ze)zpfiTvpIh)>jie?Q5i{=wfTPWSh-dQ`uyO`kj3eEE5-RnSvtf0FbW@J&8L_3`3y z`0w_1$vgjm`3?9T9T0i*W8lt?ILyy2ZTZuv-)+B7!=F^YQ0NZJ*PU0M&&C8 zkZ-sU!KlA}eP0~jus#m2Hw3^R)!%Km#mjHMJv`4*d37W65$FfuGCN&nRCdlF~aAL926-cz8#vGaT4v>~_r zV`(M6&x83zd=l7uyT7CDP5B?2Z(ikCZ({y!QZLFY^bh)!cKrj(H9cEiXtb$Z{^ECx zd^9x$Loe*lay`*B@;(m#&>{c3CRpDF^bg)Y0lm+IX8}GO-}nc79|(Ge`W5&C;J*;~ zJIG^LZv6r5xiNo~zl$Z<-`)-xSi-NQXpcL*B8Cg$Vuv=6313OI_;d0%wAav|e50eI zj^>8H+HcPb{rRt8zQ^0K|K4rjuXFx6!215yn-@NWSDSLhkA!;-{3`s})7-D`Gw|Q7 zOzC@@(Qg#2X*? zQjF(Kys?twuQ%fpAB+!~kVUZL7p^${UmExN-skksd}|-hMETdz{>i^^`oFr;E4#-K0w}|e8y>iMf2NW<_CISLj3Y4|&=lA}uIKBR`rN7%v ze~<^_8{@C&AK`21=lYu@e^VFZ`~<%@n*I&HWBeh1pH0m7Qi7hX{3)9LjJz+&AIvue zA5DIT^latNfa%YyHG`n)JzM!xGX04^-je(Qy(y1jd`Edq@F(@b7J8OV|KOMS z(cTWr68gI(`N#Qx*r6}RkMVDD{fY6P`WmBWfuup6q^NOn*3^rSt{% z>q(dXtncarzV}Sh^Bx3~6Mq-^L(Z4@%uYj|xSoLhuRH6Bn7w}`4f~!k_Fn66!nqE; zbriy@Iy?rnjEb+M7q$0cyaHO%{)e#m*`at^_8;*${ejD0=#%vav?otH{y_TW_yc1f zP~ZB4&_861{9t|aDd@+=g#G_mK4#CLpUUlE?RzfuqGR7N-xz;sZ$IiOpM>g@Kdt&^ z0=Ri=50m!h1;<{?ekJVv$6M^zDua);FRr{$-dz7-^(AKiUHO6iPn~nVZ$^F4uPdg{ z?@QR*vx)h_KXJLK_~#PvclCqvc{b5L;h$2^JM^VJcq)!>EFMYHpZI<>HlJMOQi6Ui zKRBPI=)V}fT>2;Vlltb;6Xjt%Y~z2$`_6hPreDkHi{|6%!*TM*>I39CrVpXK+xW=X z_edWgFNiNw=MwV&eusY;ukWlQ|IpVK{>9}hm%6w#|3Z3jJwpB^<;j%?%Kyh4{#{x` zo}Nv}lgoe6t34j?EX9BFFTr2!mxb%&sc8R&^Z(qq+0TKz2k|x56Ybod(t1McH5EGR z8JrLBhw(n}OYU!hKguWI@%`q{9bZv-XWHyH(m%jn^_@+p-FP$KXm6)DnRwaoNBaGB zyWf@2pV)ek_8y(pH6iZDjpKgAWRxH1q}lJD7YbN^;5;#R3b~>P(p}tJ;cdf^c>pXGd zUjTIWw=ch$<@4PC!uPOCpO+^0s}G$9?eL@iDQ|PPM){AE{DD2MK61+~-uKw|*uW3$ zC*H#4l8NuTyySb;JLbBV+|Nw;1BTybKQUMFZ`XRR-JWlxkY7RzE>n*6p2?4#3(Jdc zd))6qei4#`_j_=NUVQ}noZvyX-CsX*dTk<~$A)}Z|0450AU_p(%l69efqYjKXnS9X z>v>QbKadB|C*|K}avxcKKz=ufw?=-wzH@8j53=0lll@q;hU=jqe_`cZzEl34_@KOU zu4_%`KhS^vT%o{xU?v_IhyCg5}}#-M^Jt?ALCEuta;B({6oI^@;keU&bYR;5kCw(xu(aXd{e1mzk>JWLVlmc84QYo zc)tAPhHlPB?eV>DUn3XM8}zF*ItD`e0_J;fq;D7b!E)pa2Wa-o0T-|z8uADBw%~WI z;RJ(xsC|uWPWFb2K+G@Y_sbM$K7b2;c7W}39^U^V zzkx6FkB9mNf0#MdY52u*o$o6A8Rwkvy+AI7{W$HXvOlyh&uKcg+~~sq>xSj)@muo~ zI%3dx*_b?(=T@U@TaNh^{oMNXZ12@|UL5ehpYnwAvVZ$(_NDm%uJ{9yy?}kf`5Lx& zVSj`7aUm=V-=Kvv=Pk+ouYtL$sZS!?ryIAk<&KzP2^8Ye2+P6`HT9%Pv=Ia1HwccQ(SV>&zQuTj73ceJsFMg@%f43alCCw|D6 zS7o_uJj#oHUgravuiAIYK1Ke#y@Trq*(~5oe_jV{_{IDmHhLhx(4O~&@{izm@z0!J zUweS{<=;`i-5{j$*8B#se0RW?^u5OBlvl+s_I`(q=K&1vi;aUGhE$@L;+rn`=${Y5#1%n=tx3ZsZCvQ|s^Q~^+_c8$-yU!v0e(m=;7Q*>Y zNgwBra{>WB(}otDKj{H|t+QD19_7ou&q00sHs0s3@^LvB5Ap$iYrUX9olM^6;C;E4 z`y6KfmkmTebDu-!4C`C@o>3v^6XELx z@e%Z2^KhZFNSY+NqZN|mx}RCyaN?te}G%_SrQxk z&;g?y@~nKRvT=ZMUn9y7iTe>T{||nkeu22g>KE|`o%gKZendvHQOEi<=x@T7zr4cB z;e5OspyJ!0yl%@eUe3=e-cvco%OSri12~p{7xfE; zus-OS%!kT+r?O=jlJ+QgPdiu-mHl-a#2=QUeTusKHvF^l$N5U%$RFeUVd-o5|?^)D-xYoP+KJc~X_r&`7 z5T?WR@(cdEZ zK8xy$S&&OV#dt#YUHWo0k?&LYZ=HOf7!UE0&I?3S-LGxSaQ!8nxy15phQ}S!Y0?Y# z85GW2dd2g5(w`PfeW)MxH&EhwPyMO?Qi;Ar{h|L9?ms>RIG}&*`&Q6Dp5K$-cl9Ll zd*XZ7?PxFg;r4|rcan4uM*EuH52*1^qIXsI@v8<#`Sy{m_+91VZ*_#z4a#wUet_eP$&inte@D+I z!p7dhzHKY2E`>nlJ&F96wRV{+)<^$Ee|&uitA3Rq$l?d(fSC_;7|^Pb0FU(zqDb^X|G;N(8{lC6%ugE8hyG!_Jq{19cVNtKLh0t5`Hb*Bcp#tn z-mR1Lwf$rKafy${*Zceaw3_tSc$k0D-_jn!@@G4? zy7a;Kzw4cH;5#)ug4W`Z=ryGGVk85a&lZW_77ii$Y*oHg^`ZJZMmax?A$YWx{B`J; zH^!;1c$e$LaQ#@qdcn_D??ipYKx%*22J%llmb{H^V1E%k?$CR~mVanJxQ_G)#^ZZy zIrRs7s`>6xzEAO=_6GUlGbj)21L)tu{w@8{-?mMpM?i1%&-{*tf12NLFZmhKXF~Z^ zBl>LGz;cH^o7rDLpCG?y?FRWhWBKW1AMriVkE4Sw`~yDRpULmX?2^)0rA)ToP4L29^N!(tM$%JoF*9?HW+l;0BHGr?c}cg=^*{2`j(682%@ zr!ZYd9xm$$;pXjwzL&_OkJ4iKJ@1I}nd1Hi@ZY8SB$2TP0Gm_he1q$ep=7+Ui}65Y z4{H644Wj%DLqm)m+<0LIu;}mXkM45zM>Rh2MZ8A)F!3~gck$oF_QD_W;E?HC<%{i) zR(U{Z?r$Jojrm8j|GhapKN7x!09||s^*(|VA8m%dxcJ`AvM9gd@Zinh>*hDq_zu3s z^XSmQcVQ>s5Z~qUdsaP%-&jxVx=rNb`pVkFQ2)Q+@SE!qgMWhGBT4*6&|fp+_n_f- zJKD?skBpE$H{v(GSHOd)h)+2l<|F(6Ui?mc0SD(nI{&rtzycQ-A^ywd_l)x!`QJA( zo_FJ;dBM#fzvnXi-=4%jk?(yl!T;*^B>weaJjgrsUGqucdwU@NJpXzh8o2zwgB=)o zU(DWx{09G+e}U^2L*K>ndv4n*-mnh#7oqQ?YEKyYfqd`ce~tXn_q>~G#3zdXYolCm zx%_7tpOm!xr#&(C!B4IaB7NuiXVv7YB7W3woQG)q04DxFjWQR18AyYF#a}MJXPp0w z===E6`o1;E?{TgL9el;_@etol%6)Jnc_+T(XfJ#$zDa%0zdw%eH7(`?d^hR7LzVJ@ z`!22gPwIQ^HtyfJ@}AK5n&{2>FRJgON&K0wwME}+p}vofCgnZi_c-OT7Ss1d_?`a% z=Hl@Cnu1A#|MK}g(9rL%FAEWPEme%*JNqygvkpF(_ zdz9~TRQSt2+(6&m^-s*cTl=5?S#;>)uLj>5{}<8siKX>@b5h=wPcX@E<-n4E+bsXT zl)g`p+Qi54XRdwsJ{ZT>Bs>c6T`s?8Qs1}SCUQCQp3ry0?;Gm-SQ7s+^w*;ATS9#w z8(T)-w=Adc-ZKgOMKFVZ#a}M}UsB&|8`a#we;(aC`d(X_{}W04Cn(EF{u_VD{pIRJ z68}1fqkXadUAjR2-@x8`A3~WU@5VtG{FC|~JO4m`-+}y|+)pzr$2e)(n!?Xv0aUO9nVrvua#%U^9w(Zz8(24%0UJ8 zZTa<@%TL<#d2}cJGV8UGIDH32-)Mbm-m?=vI{K`9*EgHrGq|thzCRJ-3wjaX z%fEmD9DFAjAm1QfZ`J2yeoveiz8=kaetAXtJ%=>+1#>@x^q9Ss{lnhCzqID_95J%I zril9%%IB%|xAJ*j8OQwsbypAW7vTPiSuZS+-_!j*{2wE~=e3;02m9NphBVR1?>U@8 z0-=fPEB;lxH_iJwsC*FhJMa(mPv-YbJvI^CugmfK5#-xZzLW`jUX#r4xnpjt$SZm< z9`U!B_k+n#z&qx+T!s87zCwTR*rt3yIPbUlO|3Mt0_w-|e_kSglKDT6D#4KK5ALHD z{r!pjpLb8CIUwzm&j0Rl^MT@ifUavysfzl~M)?v;w}XC%S!C#k`NZ;lVt?zz9S z9eTo_9m=A?J#2;gt@%EW+#A{l=o8;pJHooOw-0H(2r$?$8Hasy_DjH@AU~*%ymTI! zResUC*$2vTUN#-}FZkF&&PP9hVNWMD9{)gl>Q^Ueuf-JUckKwsSn*xi*0D{Df^7jW`;7+K!PP z5x#>*Sbi+T_vZ3_9&^?oNqo;giw+%pXEnI&HSkT|x76hWG=Tkqz9L^Bcc+Xzl7DkG zPA`NjK|WB95B_}Lsbhl~FP`sH%RSmF%9CG}ejG(7Cf}#cuet{CN#3{DePcJj8on=! z=T|$ywswBJzi;A0+RG{MchYPA8x%YE7AveTd>6^@IT+Xz=|}5*-NCB1=Xi)`?$29# z5T^XM4U(ME{qR90;1!84QJ;3UiS=~(;Tn&0!tur!?fr@Wr>2Ft8YSn)<1z~pPt{#gBK$>+Iko12d^md_L8 z$MSuG|HwzVEsfq5&F_i&JCF}F%pZ#UZ9%@z!8#fN|5(0He1C-RowB@Z5q!`6ZOHd| zShV#pAngAl`95XetiMYk-{)bbKzK2Q83=leWy z5o0^@xS-41l1J>X!(5^`_}(IE&;B{zr{^tzKGIL<&p$@KPwyk>Ui^8x?gL%W2X^ES zJR(1DsS5IFCZUR%H)IfY<@@PXB2-(5A+w$_c^Zbi!Q|TefH3m{o~~O z{`FeGHva2=bmcAH_e0$IRWkPX?e_|1 z{f_$hp5Qjh+br{eLSAC|KEGtX7o83IL%fdslK5cT%I}qpX?@?SV9$&n%fE^Kkk8d*k*0$IJI=5C#@6 zcHw*8wQCDPNHF5Hb?YRa{2Sv@e_apmqnRHAuQLP)%KQ4_<;i@Z)hJ&mUzIaK17H#Oms>a+Gk@EE zb4uS+ZN&U~doUN{Z(x71K2|=O*#h3bz<8<0!gwhc^mm?n$+kbtNA_6x;ZQ%!zvbi$ zy^x9Ohvi|uP<@|B&tVh=TIPdCVWzD_VtcyKw*^+|jGO)e!FNjq=U0{jI&q zHy4(#>eYpS5bo;ritc#%UTs)}<=wrCNJF^Ls|z_Hyt-E#W+A+$R|h;Hytdcl0z8Ca zp7&Vziih|H#5o9qkL_cAL@6S`X;|(;iGMOA0f(j>a@Rv z@jht3FSqeF^Jg)9%Gmts=UFJ>hk!Uye{ z?={3AfINUzmGcok-qQG z#l9C}{>Q}px=nwJ@mKVZ;Y<3#yczi<{S*96UCbrrtzh~Gzabwn{*a!}I`bueUrf-m zl|QRZe>cG&;{Takl)nq(KiSHkHKsqCfAJ>xL;RQE&sx*pBK)B|y8HpYq$kaFD31yL zq(0a}&vmB%Am3?PpYIxb0s6Z7$?@Lj&{z3_O+F~|J#K=3N&UG2f8=oj{Z8;F<{!xK zrS&IA{fW`juby>X>aL&xSt|@!T2rm z;QAkwr(R6>4_6+HJ+=PG+EZ8FDX%X$_Fncc8`(efpR`vof5iDE<<0d!myEtrUP66! z#^`Xj!` zkE!`FJ|(_S#qE789wWZcPt|9Cv=<+B`osAG^V=?|pP+x(Ui5d`bN(N9#<%+H)<=A= z{8pl8QlF831M$B0PiCEbsS6C)za9FyoPLSluKtWW`U814`RA?v&>y+_BY(p9%<4~& zU)71ns4r(*<(2%GeFi3@i)k~=;|-|@9Hb$S@ zkM&k;J%jfnG=7iW|9#>#j&k_Jc>GzcMX_F_^`GK;2=r@>$1|C5{*Y(z&olNC{8s)| z$NpjcgnYO$eh`1HCvE;g@{hxdf2g0-N3Opj{ILE6{!#wbjkq5(Y4QuMDeC?n&mZR5 zA@Tofo{u~ES8?G$zJzU&PaXHs;Ioags+)pZ2Jcp1^ohl4tZ6dk=4LmDlGF4)U&M;E!+~ z26bwFLO2p1Ka+{!gZB=JOIscPx!Tnq=2L3|)_85q|7hledC-A2eZ<&=n2LC76|LlxePh=Y=Uo-xM_reiBV84gu*Z<7E{}Q~< z!t)8>1N%|a12?oEsNaY84QY?sI6uT+`E!naVfjT1Tlq8ZUm`*6s|G*H14Row(0N1b z{Q4nevE=(=`Z49nd`|(rOujPcJI-ILtWSN%_%q1Ad15Ci{u}Ba^r-@P{5t6c`LCRX zxkXidp96Yx|IgEqW<2n-%5rZ3{6ziKIpp>w!|nQl^)IvB&L8K67{2+q_kyWEkmh}- z=9D^R|FEAI7OVe~sb9`zS>Na*=AToVP;$in+Eyj1QZD{$MY6AfE@TO21IQ0(s;g zbpHwHSa0Q7vB`fywwO5Pz)LH#Q0OTP9VXK#wP02dm2 zqWYK*?8Dw~pnus1)!)4*tPlK9zFXx7An)YY*;;hIMf!tZvlt3EN*-eTLVtkap2)v1 zYrPQY&+Hpaf8^gpTht!%goJt5AFsY>hLGS#)NQH`Z_L*>i>rwed;b-@Tjhg6t9c&o}n&c^vTZS9BhUe9KkrUN)~+?fu{! z;t_pbo=2q;zo*Gro66l&|~-R(4PW- z*k3XTlZ1YNUo0m(gZ!Uyz7-sg(ZU;Rtp9(U_g)Ik&3vu?jSqyDI0ms;QFWB*O3KKdtm&FUdLU-7#c z>!0!%^dGBl=R4t)=T39<`Rnpm(7&XA=l9LxC!MV3r^aFbF@J;ebNZJH6I1}>zuBM8 zBe*{{-{tiJ4uAd$!28bc-}B4|PX5>VKi>Z3-+fc<>%(gg9QzkfeC^rJPycoL)bP9C z{*~9Q{7U&NpZ{Fvf7vLw=a>HUbNe5B{Y!-BPQUrZA9?Wi-}U|Pz1H@}FMs@B?(O-+ zzbE|e{_mZx{^6OQB>ac}b<>Y_{^du$=TB~b)3HB2cIQtm?0m-u2#7|)w_P~yEg-s{iRf-*t>|uJ`hLX1d?<+aLYSxBmK%=l|{b_3!cij_@!1`J4A{d8X}agunb- z-~Wv}esAP6W8=F&zV|~vJ^U+sF8>(egRlNte*DvKTSxd^d!E|&wYNVqvf@8}2RKlwkW_r8a4{lMnsIt$#%LLw$eUzUFtgzx$j2w}1HG{MaYod34{- zX9$0O-``xga`4da5N`bafB3-V6@PND=TCm--eX_=*ayDysUPkp?C<;F@a#|g!1IJ( z{ZE~r{qlo-EB|6!`u93^U-`fO;O__jnD7_x`2LUl_!n0F1>wKm*H`=1;V+JU==Uop zf8&LZ&;6&1{~vXC`Bhc)Kl+~Tln|t)JEgn3ySqU`N@@1`CvbIk1@wu`p7)g@lb`0bKPY_;~aqa*2pCg+?%P?OT+iau9$stn2oE z7mkVnv&DE*KF8jos*>vsQKnD&L|Q3=47^n!!_y_*(*jH%CTX0>s{P@Y)AS93!IxkG zTDKZtD{c(50@8VFU@=dDAHqG)@9a~iJ24Jm7<86?R{^uUs(#1LGmrq>-N|=>naLQm z9ftNN#bDl#GNXwbIM3xf=P9D$9Izd3{3XeCp(@o%d2ZnWDa*kQHx01$Kcp~6tK>{z zm_jz(@NzzrtkwY^T9dB8~QS|Yx0RWHU681Y{sCAzI04Y>e! zlvV9r%$c+RGhJrTEND$dz-H4_iVbKp#U<$#0rQmdNdL|e{|x-3-1Em3HedOCNQJUH zZ?8oZ(@IJL{Qd12WibB$6BKQe3=H5<0oU1>sXO9*{MPI7Y~v;ZX>K9=rV-f4Eheq{ zivI_2ORoI6u+R)W@v`?;7p~@t@u;FEaMnZaB>FbK9B^@{p5cvjo6U@zEpw5XaJ#Bf z!CT<69ND4k?V3v9ksnP>u;V2Z)vU{!@5!0>9B!RMfa9IS&i4BI8h~Z(ZWX3ZO*<%M zm=tZ3HsRCRbpMpBI7BD1N?1|oYVE?RtNB= z&@+@|E6#a_kiOWw&x$6nne-vREq`B$1e4c|0#`}qxV^on_?eh>rttK3P;tBlRtVU4 z^4MFqoNyVqjhf`g3r}QR@w`N`&96r(-=)q1fs5&hUMIE~$O=Kk|y zT8|r;QEVfpdFK?@LM*Dit4r_|%09jy@LQt&&1jjq55RgUf!d4yL`^E@f$3Vp9+%^A zw;I4Lx$n8~Gs5P9Hx0YLyypt+abAdgB~Y<$XV8L+2`sZs#JLi z`Enjfp$K*M+awooOvBPnmVm+l@C{z_YE-4?zfT?4*XQG#*zj}$cEEB8-)L`xwReHj zu_-X}3uwuK3zn8T&qnDvfFCjWK0NPJisO}!Kp6NafX$`Pk@CFOP!%c{pYs54<7*h<)6=pr&Mz3 z5S-ucR=h8f?Le9-FqTiM9-QD#A+VoiMplf*T{q^hWTJbQ_@paRy+>dNBT1CY3w&bW z<#Wu-h!gsq2#$rsd$`7KWdhD*VD}yGhip30Y2d?6jH9qm7zk2$94dhf&N+yhY2?6m z^rD)Ek0o%x5BTheM-OWSL=WPxAJuy~^q;w;0c-nE{|wWylL2OrLXzTDRl3D?dGWn| z!acB;z3RWtPyY0FCugDy*gU2x7N2>FQp9nR>}r@$T;o8L0Qf%5(_)P~7#_H)hf^u0 zLxgE3{*LJJ>c|I|o|FlAtI$$XWO?@`uq0kIf`ARa%Fwf=@5_SI1U1*wy}%!TREaxY zFIWL<{o~koUjE&_3iI{mg@&N~WGF5xuydNvOG0IuRA3ju6-#zhRdrHyzPCY~>&&UX zp_jnQzf5`7#E4aZ7t7sQxRdB__a|nCTg4>Z=~h%)fHTp?^4{e9)BU@UOMG9P>lKu!JG*O32b`?1Om8PfjzjZgg!+!yX zt=#2C9{310SIzhgooc~ z<0DT4TO}|p&E7;aH*7sH)9 z4`+eQH0JAqQPQ*M@0EbdYi!0P#9W(!ca{dKG@on_PkMSCtgd1LkG_$G0`u0`$EhLH zlmd%*6_8J|Wi=qeq^8fJCMUaK-8}+J<9=%Mu6`B)JU{V!&Jg>LW}mkRF|sXB25Lj! zByjtyHbEvj8&u#iwJ2d0j}17R>Enz}>PL=p#lBa-=%3VWS1Hp@fw7*-`4{6;RrQy| zjfQIUS6+L(e*|u{DzrpHY|jP0qpejlczwc3nO@!1X`wvRO^}ced@&$hdm~WZ46MvW zLGh=Zu!N2GlLsk7+IRRLKBT~cr5}UBM&u%Zk5p9}F_#@Nwz@veGx-HgNoU;u1|||8 zB^TJl8v*9a`DQ^(BIdl6G&HST#37Kg6*~ruKX1g{+H~3iT#=EM&j0EAeHxx&Wmmsy zzyZ6|Ij{#JfsQ+W$VcGG@fXu;W9MI|I5y#@*at^F;LK)#(>UbEugL3v0+(2{ZPT*Y zRC9(HYak8jT<}B_VF63H6>kcnFy;Xtcul0aK6&4?O?)kM8~fhz58q=EnC4Pw3Q4a0 z9+>1KPPsTeUe?HI6)d!v|!THBI%g0_IYx_{^tq}gTcp zLYRW*(oURN5=ydyn3!*^DuG`){4jXOYZwJgSG>1mU0J2+TfNe%a!sMgbTDoUJZ1E@ z=jpeb7%)D6P5^(1P$`+9gr6s~&%3>Tb~NDrj8Ro#mf%$2qBYH&?c%`&2^Y*gaa+7( zK~_~&;EnJin@}lLEno$5{ZmCc`oCtMzgXq9z*^7peD476Q63tjtT-qG4j?sZ`oHK{ z|Nni}|M$7i|EvMaHO=C<%j1WWcLU zs74~nc7=P6bS_RGew_35!tet>kYK!1wzBU8CY#u1rfH3?#^$%ikLVzH&eX0Y27LXJ zy*i#)9Ur(uhg>ntK`cD`!@5nSf`#uBxy}x-Pl4<1Z$rmuV9!K>uE6V=kxtRMl|gEn zb43I;7~o&k6TG#PA83HFRAb)Q)2L}rIz6)=A?jIJp~SERme*+*-$W6Q1%58sA!GdG z7*4C2YDDj`-PLPS%@Wv)e*y1oQlkY}^DRoWE$v~H+npmfOQXA%UyQvFu+Qw>@Ea!` zec<4))c*o}^hplCpb5`(58V5+@f-tFe1WIRur~+=_L?@CU&X!;+%WURwG)HU8jEyS z0ba`1$`GYaln1UN;CvMZ!|0=E_NitP_0F3<{aG+D*7ex_BqIkBu)KeiX^A32V5S;V zS1xu;QAdWK7Vy2=ZXLhN9tE(1u19F|xq{<|0QQ-Nybkvig$zPqPFQrRxv<|@z%(`e zr~mnXpu;n)pFvD$#-hpVTc*I$u!x3zHLZlexyC^eTx{+u-Gi!hp`8J99^=PH!0BpM zAME7*vH(+_RV!=w*wA(oxe6#_t{DmTd6NMDa{DVjN$`*lEXd1S&G=(`l+i#UZXhqE zb_D^47AcY5KT#MSV`Yf=xHD)U%|E2#%5z;3->`USiG3 za1ujY&fVqvW5&8eYhd!b*{JZ11TA1w#GcfiM5(z$F{^fSJ+g%GO z#E|S&*W*=Pb3%^+U{M1?Iy%vCE#MF8<`Iv<)CsS-DeMSoKbFB#es=<{S3bu#(*A4$ zoQz-C(2b7%pqK!gB&}~`01t%oNs|9x=_%g0^IWW>BsLJf1OtQh$@_CM1`qW+h@RILt(1tG+g+=_X3Bw zB|E-vSurdPzBi&eM3(&22Bt0aoKZTtkpuQ0D7j{6RXpDpSM>}a=x>lid$0p$NebZK z8cjR|7G~No|Ag~u23skbMproaTSK)F1 zULp4=K9b6w53;HH?dV%IyCVF46!;mzNo#)mn=)XATV9P@fr!p&LX@YZZiQjqR>vLS z8S$=wbIOR1z-AY(O&Wx_6PpQ9248$b;bjXzJoosNUqmWp;JXA zWv23k)JpTS5MT-+jxFBZ-#tl9yM-zl47@h|t2w~1n{X+fze{_8ucyB} znPC2^zbyS>@VKgIWWo_h2RyT7Qx)~fGYmNF&(o14dEo*9VW8z*Y?pQE1G@_Flk{7R z-;spPz?Io(?H!vRqL4d>{T=VV)ovHTUjn;DVgAH9r{xA_ET+GDt~6A8{+{AQbs|)a zVqoJ0IIORI?Q6D ztjCWSR`OCol0z;8z<1%z(`_LoEx>$g1Z-O6&R5J`+)ZZNN1MW8Waz+O0_@BFe4L~M z?q9B;5sN#~Yj5hAIi>h#E!(Hj2%J~DLuFcJEd$Jgscu0XbpRtYxBiww`twaY)_@)G zv-g7)1)WsKz}Ta+<&@v2dhhyQS{ zwj}yi;)Q=W@MDnBj}d7$MqneMR%(_>sgh!nc{>VT3PHx(R90XLy!rxVt9uvVa)nX> z;nVk{fzMS(n65s*gn#o~9a!FM!T~lC?F=|{uQ8E-&U%K@FpGa}`Yq--tG)to3vaA< zw&;W)aPe5XLyd4%N2L}+iyWMZyWCmV6R;U8;mzfB3l8u-apClxro1Ny4Qj`u%D38U zH3?4OG@VLp&5djtV5F^W^K`DyPfgZ4pK9lu9%qu6Wr2B;g`ZW}d7J`sThrhx*{$Ls zb)67VVh2=3Bz-0XR$=G&cQPZI2ma@DB)ismuEPJyQJ!U?W%b)q-~{j=f>P$U9e%#R zbCYcsf$Mfg&%S9>2=Yo9gdS(90lQKizT@`6KL%E=QEu{9sw~uFSKK*rk!r;L%-Ri1 z!ANnY2J?>(c$pa&L`a zZ0oARc2qks0+Rakc^}kuV2nurAiW+%shURCAd@E+^KVsqbHHzc9Sz(^NY{a*sD0{7 zlWI5IXqNNdiM%gq*|A0hzPyUQ%N$L11y)JeT*bL#mxNQU;?;b98?0sgune5~@;c{* z8BE%LE%(CMsUF^07L{gs^W*hUFE4u!u(}$#T)<=8J77t ze&1ygLz==h%~S^FMO&3O zHR+S*F1f(YCa#)lSk>t-wbYcsJo?AXMCMHXBvvZzK-f$23nQ-2!SQLrQaX};rQ z$upL<{0dC%p(^iL@y|n00tt$W~G<5h?vV!{r>|N3znsF`p@D^o|SC8eO>$AD; zJn)|OIG0WL-&0^E%61rQhYCga7UrNU{Oh~P^3)DshC(ejzPE#3z#oU6YM#C4$z?lh zEX%iJZa1l5m;!#YLB8xD5N zXXMUHg9kQXq`BnZnt%iDR;tRu$s6%g{(WQmMM^>KUZ!pi_;OD(t(Be|2bdC%nT3+j zTjakts|1rwvRKpjJ{&m6sx_!-4beonZ>zq+&eq>|qhi-T-D2aKwPP&%CvTWab%l zitDcvJtY&CV&JgNzk2hh-VMN=o{PE>L8XdoqpVG3+4CM=pDyQtzw?T{dqeXs0vLtz zZWZmSQRK(p!0%j<=T|4=%#y(=Zutpu=+>}><5<2Wyz#ZAM3Nkin+bFWdEfYVWwdJhlr zt!`oVkllTZ(tATFT7dHf13bTbdD;QHa|M%(z@lq-pC!(sem6q;sXpfiT>3e|k?=ZN z8n`{~xTiKW2_NRcM_Vix`TdA&k|Z#!3%=_*+z$j`1=X=aq_mlqAc71hM|zpfRl))Z zV20aHq}3&xF@4)zZL>+r@@u|=BGRY%&ZX>yXovejx~dc ziyZUYZ?l_Q4%nBoD(BM_k{vLzX(C2-%)0DcQCC@m@~rr_VP!0^=5q9?i;7z%u!s7| z@cHmgXMMPyz(ts3g~Q=A2JmyCXyyW>Jw4z>RZ|oDq+{efKkQ0jCFHVu-D^5vXY8&f zy+Do?;P5)v+u@KjJLF!lIhB= z6kEv33O{_C%QE4}b31eZZlX#g70_2`1XfxhG|J`2-rFhXZNp`pfM;LYMgT@(m&*~( zo3;W@_;Mm%{ZtRzZ(=d-A%XJVVp5SjR)3rGBqJ#e*o}AwJXDVi-sle{EmC@e9LF5GG9CN!0veqjW-c&zy)(j^_$$U z{eX4C#QotVqKCKw47^H-?cU2r6>9sCWLXWsyG1a<39iaSdno|-sTG;qoZy=BD%KI27JpeAug0OlXe zeu}nFLV@AF@8WOpo%kHO$O_D`NA{_icGUy8a*>|mAE#FyPu{N#n3X>ksc5|tz{~es zx~mb0*T81qOq>1&B*$wK|Iw86$6oVKFO~xyr&GAx3+s#lrfY7{`zP=Hc>O%PSbzR) z3X3TE1Mtmjyi2aacmHBfhObQx(^3EO56lMeSLR&mHrJR7;GWTxLnjxu-=2Jy zTxP}vwr`Rb-vOKHep%pE=nDb%XujDnB270TbMb$e9y_0ixk!is9&nPKecLf<3!EF& ztM-cOb@cbyZo-m&lSO*{0d-&=*P3Va7Suw(Mvlh6KLt2gQI$!VXcU}AM9;!*0;8Xi z+(x1&^aFSGmD2QmMYv2QS|72dpDZ~NL3sqeG+8`K`1-j9*z@UhEg*6at7`C$DuLpa zA&!i9JMf;Dn~iyN-8HbIF4J9Y<=nsKjmSo`YXRr#1RhOb$zP}kSj4Vnz!{FPLW2Uw6h(t}P^a$Y4C1cbhsxtbiX`Hl7wmIt+owzY*q;9Ca#@a$U8eBU6)qscEPI z#wl+~t%{VQ1s>a?7M`y7fkQlyh{7ZKxz5Xo&I#DMiec?}$DJf_h+9FD6a66X4Q9!| zV_PDrg*Pq-z*J_^q(|`;RKOB$XA#qunBUl9X}q|9Fv@<>lL-Rm|I{NOKvRSZjJIX+ znByU@uict`b%e7iuJ&vS8`w?2w>%5|0T-CL*xJ*;VLjlDe0|9qjT)i7C0hjGM|Rm` zs)N8j;K>3R&v_XZN1=ZLi)8046LYJ?g}^pnu3GfmS!aL^hvzAk(F%pdQ|pKQ;$1xy&j6Sw)6NYy+729rvMqW#&ca#rBZ`Vl8)%I0w3b;bG}$JOib z^7PYtBJHSTfAw$Mz_Iw_^9bdIWx(<>15Gz(NkWvGih7~Ddj06eHvGUR*c$k8wB1X< zxW=iS_C*8=Zyn^utlb7EjZ*sKfpN0o4QLj_v4P{MZ2zJNGb=xuMLb)^c`6Y>C2I!$ zb+glRQ2Qlu{+fq9$s?Hn@)G z{oCo?J%l3yEJ+&`sQxcs7x?He4L^Ivc~bkUeN72$r#{-?&(6S!NcidstAPu^g`{%M zrTov3J2yE8vL2F?&HD!Nfw3PtlG$*VI)P!TAI>J>WuxJOPX``G6ucTuzfl8|oj5te z641T{?%4Z#0jqmhpRHSW#BUjn`Hj(Z060rWqvRirFCOqC+2=Oe!Y+q*&na)LpWd{Y z>6BUnV|*?_OeyY)0mf@1DaNHy&=b>+$04hMHGfNZ2n$@jVNeSE+H%DI=@sMn z+8nP4EbY+uXPIbAz_6`IoTS(wN`M)ZK1G9Mf2;#_B9dk z?vkviRh<6{oxc~cm+McggdJYxTWv`!nFC!qx0DO*TBK z<1mR1vYh~8edcvwW%UW6#XR(NV4@ktQ=Z3z&nZ5 zC;2CawXhsmmdR<>b8Q1N(Q|cIU^3v3XPHMm@CKR2_n2SvyTEp1vx51RY%(}uG)tJz z!Yo!zWpsgwN||#roQgSs8_x=!wu51|JzS`DyST^V+&C~tfE7enCWy?*bAVr1F%ZRU zN_yM8YNqJVpYyHu7|;c_jzakui~S%1Y!|<5wgxq4qJT`$4>*>JU`NEd zc?tL-QE2~HW0`>EMUQPz;&0mEYC$?+&!W{J0=2gUMtFb;#9pd9dEL1I_si0(P6oACc2a#y6r&x+ zUvQUc2d?t@{)FjQfd$NYqcAifa*6Y%TJ#+L?NpRMs@e_kHy*=fcH~SsVAD=%>9-8j z^t2MTFV-L7Rzpyi%z+zQ6WOu$5M+QgUnY|s63=31#|krC{xht*J#XCtMz)NrHl7Ki z0v`VB=StDJVb%U96BBc&!}?ke{TjHhY za8$>10FzRY3@|}aXYyd!$uo2Q4sOMg0{YPIfLP$_M!67Q8wqA$C7X!Ja{-(Kn+~QhqQrGz+Yb)GAz=}NCV^Zl30lrb?u`HNc{Q;15*>sp+gE>Bh`FMIf3p3%#7d2 zC!KrL@`sFv<;<1UKi1bv6c|fi#FWz^S`0W5*`5CMnrYz;8*zoj3%V0e@6JtN{Xh>5 z;SP00;LS-cq1Q|P>|YxgezQoLe*aS>j17#uD6%m_aW@KFCQA35Ht)azj&{M$gg^4RTR zAGd1D(Dm5*aHDe-fnRHqj3@s=^>DPZlmP>E6{}y)2PQ z;69ZJ!z{t`ugSK`& zbQKReog7NHyjHm*ion7z2@`xp=6r!$VvN6ajIKpjHRJ5pnUiXw#8q1Zm+2Kg@Tpo_ z0`Gf}xR zI{2@@hnp=mh^B-5eA;_ZOkK!jb#+L3o0Q!{R!YXx0uG0LW}OD#5F1Y8K^rT=W~pUJ zd&q&i`Q2NJ(rGuPqfBS7>azA3EI+x08^g?JrT7#YIH#-L)4dHbB9BgK0-eUPBhK96 zH5}V$(<7|ZuhqicLpEB|YRVm#H6F9XiOwSjhXgA_6F1oM3ou&5-rXO^jffJNIyk9K zCuQvpD~w6&$qgHsd-2r0j|#q;51D*tQwAsZ@qo_~4yLu#w~~)%)3tAYR*J#lg?5S& zU1F$%2Wpw-fkuA_@%54)jxJqHGQ(*p_EqHbW=2w;Z%&Gm&JK!%4@}kkTtDAp=&8z1 zHH0$TXE(1pEQh6i8uh{3-r4?TtwGQDwKB{8`xhHV`MJME9c~@RFWgD)pS@sGw`VY6 zwLmVkUO(7MxM!%rI2jxLi$ofwMj;`GUtyG=dn0yH`vqcD z0GIN+*xbT4Z5|=Moqp8F!J1V{o`ZK*4DtWDVfiW-%xHQ~w4kK=)|?=DnNHnBGuwr} zJDDr|7i@a56612NNPvxdAP0>{vw=#*r++_GZ_Z14NmL8E{rF+j7cUgq z)t-Ou&b}O3~q zJIfJanS-Bw@1PBCKWgnj8?=yVyOZ6Sv zAZq#}9<;$Zt!;j2gK0?2L(m3^QFQR24SqGOa)UM)oe;SKZP0ojW*ypKU5z>yv_T)9 zU=e78Q=we#&<0~sJ}^NWOpXu^hBo*?wwo2&AgRX(IB0|8jaZ$~2Aw~vv_Ts*HvPd1 zZP5JH%LizK9Nu@@&;}oq_Vu9+MxdU%KpWJk9Ug)2EQkxkV6}!PnP=&ZIJ328y2*|+*<}aXoDY%vyGt*nim8MKpU)6+mwJdSgx*A z3~f-QqVWLQpocvdEwn+!nqN`S2B{|JBcTn}Ubsv{8ytK(ABQ%WSmm4mZE(zGtQguL z;gW?lw86e92RmqkaQBg@&<441&Xl1IevMxjgf=+F#j^ly5M{hvAKIYkUmg@_gKvmJ z4WSLBrc&1^4a?oKpPyPv^;?} z*ni5f3vE#4PqY%W!Qp?qO3()NIM(%`4Kk&~|L)qxZm#np>-C%W>Rd`Pw`E6v`8o^H zceBsNHNMioH7}KFPewi$#?-NHnLGX=G^kouk|?fB2z#(C^p*GsA49rwH_zHo!#q2BUUxVmseWbrsz3X?++j{wsI2Ca>2NNJ8;<7B zzEWoR>dSAeXw(9aP7LaZ8z}Svf_?hJrX9at-}G;Id^hc2r3i$hKj9I2%*I?ltE&mW z(5$T^8FQ`qp)8_K8=PoCQzF95rw{vQeY!VfvittaFbQBD{=+ulTPr-4i>G zTzBx_Kg%}T;O!K2iSbqrYHtczM{t|Px(YH;cG8`%MzWg1WE`9?6cy4HZH>hx#Z}gq z(?Avs8L1xprG<8;(-f1fV$DW@Z?>#;B_p$(#DHWy`ejXZo9d-w`|#w~H^Tc22& zF!=w|)0CH4C|JTu<^9F?U1~=Ad9DAa>x_(g=N0Fc>>~o$p8O6Wnnq9W88Lpneq7$A zb{Ah*ReC)szxwJA37U5}Z{B7N`Sc|u3&SiMFcB?cy||9g{cbbift*%n7cx{3M?-CG z)cHH0q<8Pvq9lsHrKgq-!^+N{ZaHl>E@4B+8n*g-gz2_bp}kj`FSF72nElPh4W|vS zoOVMszqK(eYVE`M)iHP%YCW969lRVz+?9t(&qOvf;aGBQjcD+D>F;c8U`)E1zD8b& z^RO$)ak~Fqha|v?=ah`n;O?wyXy4whe7sDsY4zKdzJnNvdk;;V>gMGm-83Mom3Q&>u0 zxwP*}BrX(Vcu=q8-dmp6+8kJDYPBirKegrL1+=t{SrmSAzl`%g%;bJN)(Vr%;y7Gdjd8Z1|SusB;I@9q!lJ88+Ixn-Qp7rH!l-FbC z)MZG7eNVOzcN3FUE8OpSxmB(L1ksN*4nJ;AnOF<2Yy>G+7IZF7N(5Ns3eK@DmzPcP z6fjcgYmYm2NBU7r??j7AeEGGDI!B^-I9NTC-Qr$hTLin*f5>Pd&Fjg0hbGY$)b$3Z zL^jCnfQp&5$E6t<&}jE zXVS+LZKWoPIJ_%erkL<1^vo0d7XfXMoFNhc+Fy@QhBi1kW0MJO@IqgZ1lpiSyhH)CLB%u4 zH_!$LnBs_`4SJiq3P2m|SuVzeHW-GhfB|igknu_%+MtlCy>1RD(wXoIQS54_L@ z`ORz{p$%sBDojEfG@*3sfi^h2fjhC zP=z))*s$~k+92HaTtBqIWArK$XoDLWo&C!KwN27HETFsY$%h22B}@@SzRr3pY(d8~iQeo&;@>4L;Bu+TafVFCS=w zRw-fd&<0ok(sV-`46?eHfi{>e#e5EJFum(tHnc%~8Oc^?g9Jy`y3ht2y}T!&4GtJ} z&qEvBf^8jvHi*AncMNS%>zPxm0pS)J5>=%d3v1mFzIn<}_XX~VO(OtqW^P7#;H{2TEp#43qckd+e z{dgRr=s4R)W&Pmvy=mm&pDs;{tmXh_^PmR995x+>&Bi9m*YzVrnph|F%#B+Uwou<) zYozJPGbbX$d$d6N;0K1%qL{RQ-zyY`3_VD&|JM6-pdInR)7>59%8b=we$K!C(jyzy zWK5*;^Y+BVDLNWKr(s#AyExrvcpBCCx329gi^VStuQ_op$ysSn3Svb?su5r#^O+(& z52~6m2C^hEUsdbT2%h@Q*d>{fDOs~2ud=?k9TEwXLPAvK-NLi|dKJ+}g_$aMq>}Ju zjQl_2AxHA7s8t8J3mRYR6J({&2gi?^tUj7%@|vh4Ns~6Bx4+}B+q7lbt6SP3dX0h> z{OLo%_bv=1ojoDOI{9@OYp7oBU1al-kV2WtY)y- zeDL;l*~AnO9v;%ECT{NCHnjOO0&uE>f(`{eG|$luW35k1+8Zc~m1(9qYbCdo`rZhZ z$SB)%vG43+)>E@mY&|mP3a6ano9X)~zCfc=>|=ke*HeTAkCv;BKc5h(CS12tP_rHV z2n?JFe$D$=7I8B5Aj8}f`3jDufszEhwz6{x66u#=c-d^@^zPCQ*ZEJ%~5qYVI^MN z>Ew*MS9)Vt$ds0ue*8k_B_N5@#MC9o-l?6R{Y|w8H5XR+O{+5oJJxT)=z&lzXuuq=hs=?P5lUXU7xpGGjl&AbE%J! zI_INB5PP&JD7F;6yhDEf42@TTk3^c}?vYQq@;5=-c|>TMON(X~MjI){?`)ic=>a`E zuLYkYqRCo*6)~Q<%n&^DR5KZkR6QUwGm< z(79jADf+AilhDPotjCGF?#~SxFP`dhvq}63rh449uy%dw2+=?t2^^>t^)C9(i01C z@f$PkE3l%|WVUKddB;8&q}0t_c~&`15ujT-*g7g3h25ef9i7y5QaWrpejkAAK%gT; zH%i-LKdB@x&Fky&X=0#GxONQ)Um)(G<)_>89lF0$#0&|bgf{rMHuV*>K?$1hLui9% zL?&*~2DQ2h51|dx`sd(58(hdOMu0XbgqlnTZO}B*TMyb`u*}^Uv_XCN-3e%eKJ5M) z&<1(C;)tLP+M3M2gf`e!m$?UR(6*P?6WSmF8D$Z)!F^neYG{Kk8XNJ@2FL9*G=f6xXyyfD0>4Wcr2eup-wjAFtFZBUingRE}b^w0*g)Czr|4Z3K@l|mcr4M4f2(RCqWx5u-O}eHmJLJk_~Mzuuu6tv_ah^7)5A#Jz53ZWmh=PesZaNxmn1)>On9r=N_kSjb5eel zZm(FKp5rb1KNHpQ+GPcg&r_scPH1^@Z}>_R#2^-LHl*2e;h+v){+0lPhI8>(X}jz!*j_|KaW?6Ryc$a0PjoG9mcpWMZxe?_v;1?YE8&P_ASbk}?dmDZLr zw`h;wzpm%{@=U^~KW0Q^oLbju8081A+g_`K1Tkl~8^&6WwDtKTGLgbZ66p_cEohW` zn|PyRSw)_IR3GeJYBZ#_)Ji_q#0_*P)IGbr<-W@Kt$;zpGjI~tH+@@c5x7IL+5aY) zfjoZk{U0;a4)MN*ls%GJbqdq;BCDTG)?!q8;fA@KF%IIZChDvNdtcbjBKxyAIsLx| zx|%pHHJ^HPJ>&9In+-Zq! znZiJs&m~iji^Sdwg==glF%e!J?&VFhll)hnL@yYzj?+%%iGzY3zBYz0rTSE&#zV*v!DvlgzI?=ED7PQ^iLS^}C@)WH{YduZf_T2Ofz(vl0{^|d(}&Om zdbHV?KjTh6NIR1A=TzSp2@bTloNpHXmKYEPA z87hxi+Pv-2o$+>VqbCDZcaUl7q4Bsr4w=tt)@lwn?7%Vpi=LlUnJl{*LfTy>6SRuX zM+{-{sv}#mE=f0^xf@5K``sHfh{XczEh1u9O`|Z!gZgdtC*E}C5iz%_ZsIyJqpOn_GC za2|MfdrA|1{5P{Q?>BeLWoX(AM@v|Im5xa6@p}tGY7E2l3S!z19>i?P&IkiKKMIm$ zU@C;S+}TpP&136-cB97eVO*~yJf-05N6w(>?YZciK#w(=(;e6S{LeWY3EmJfVVu(U zH*)2jsVK?6;0+tkUs-#hCFbfThD_ETRNpXWpZ&n$ac|)gKoIEd93C36yRX3*Nk^!^ zf{iFBzMhJ(@@9X2F>?~|@m*CQXJ*=9Bw=r%|0kOOhZbTPH;!E%6vrd@U~9C{I{{<( zf`jhX?0iFV5#s(ZY%68WNp|^2%hyDAhxRmZ z@haI)ya_@!FiPxbv_lCE8d@amQqMh;TlNo-B+Hj*>=@m6dtQaj3t_-SPFEKs@tTum zzv-xT2xi^+?W(wRBzq9L-1MK(EG1jWd6rtcq>lz_4M==+S)f zyF*&U>?Sk1iL74A+@AP`^oMW7=6touE(&#m(Ta*?DhTo+wIFjqR!3}bX;$GQRgwAAj@Ahf}> z>zp}ggY6N1E6@g4W*FO{4buP8kAgNhztN2dZScC!%?jEeBh4usv_WHgJY;Bt>lcF? z&;}87JNlsw7ILR+KpWKTcxD1^u-0WG8rtA(D@6vhK>~-KUTA~QiJ5qz4ch$Z_J%f? zZ-L7TZ7{1(xdhta$0+eaXoIGE$FtA|segZ5fi`&FX%Po)@Wt}tDYU`UDdGZXgUOra zs?Y|z))D@<2G0a!UO*fCl5d9zZBT2!Xc*d{z-Pw_XoFbhyb{m`>s~~jLmTvatMvlf zAQ=I2D6~QU3QaF)gKJZS@1PB;48M|qHi*voq7vF5?!O8_XoJamE0NF!@dsHSpbbvv zQ&d75#EBy)gErV{>}vsSPzo`84BBAr=)-$xgP|*{-OvVO$9GPl4RWHzMnD@hEehO+ zHn?w>c@J%{OU2j^+Mt6GHZrt9u6q&;XoK%26Dgq$7Q);LLmQNu!l8vW=(gY~32ksg z6!r+(V0(z^9JIm6zh#!t2C3}qSD_7N{Xb;gRaX$&7KUNEK^i0lk&^C41W7@<1?f}? zk&;G`1_`B8xY)Da4~)!My)Tl$L*`C;vlkDiPcfDE*CUG-TMb0 zah*?2CIz?do#X5MKr{CbM!ffC8{>V5yp${-esQ9f!jX#m>^PrzZ2b|tugO**{M#p7 zD(kT{vFeEKHbkd~yM=|N9TE~=S1%%-D&Um;yd~>-oP~G(LgBz;=jqe?JS=W+ zhTkA0R@0^9u_Qc+Y253`8ou2cY%9x{OC-6`5>9B{y7D0YDpuI)^V*W>8A@v@(_Hr| z|BRVObVvaSA4w(J)+4qe-84B23U;M~S6NeT#E75myf4`v;!%h*-VRtHh;@}t%#@sO zs~jwg?z19#)wP;B$qDdd65olTV}Ep!=iU&MHF#<%75PUwpUyw;UWA-OS-JCT8|wRS zH)%OD-jGh!9$@qMJ=(?b?Wf@Ho~S17#hwb}rAO;!@Mx6vC?VgX&UnMJZppBnG3H*S z{`mIUl|o6e(MQ`pJ``R>ZfE6#H-Yw{X!=@&_Qyx6Sf_M92RCb3S2&5Ug;473kj&a! zCtTKT)cgbYGwD1{j&)Lhb_TK3;@+%G5kGkyO|ww{^d2dG8q;x#vP^VnFlt!+@k^ZV zqhya{C7eYF$l?2re);e8pBN}Yfai1q1aJ$lZsnqTVynsBE8#IJ_~WciZhd#?no`+ z!E_ku)|uYI4mV05qCf3u-s5GP4iMiyQKDX&utV1N&eB)YvrZFG;+uaEI3}4RRHB*q zw3e9DcROjM*iwqX_+smlFLI3@DNH9XUu(WR9^VjgdNapRc!|hg`x!)_qrnREnBOQ$(f z4bga>7lp4^1>?=$ck?P)6g`1;r@(*rgwWe#1bwV+w8nP!-JgHAVY;TZOIfHkq#@qZ ziqIU!JCx-%nWmnkQ?p@p-*FZ}#TV*0yAyb>LXJ(^p4mX$aBi-9R#S~<+~kA8!>*-U zR;v4q>3m8i?a*^AWhtf>lOp{YUv68kfL$E(6R9?n;NX(l`hHT+Oj~^&DauE-ssrjj zUp}?=RIG98my1slf5l3*{7W5uJBT^y*Y^*6oa`LOFD7vGGZYnXs~E?wgnob!E;%H21}=oe?o)e0c*_AAp6+l1~j;w zZxs#=%C_lPL4&ks$Z62vqosdd(4gu(W+gO8Gg}u84gT3p7KaAkZY}s`3M<{>>eauwLp+OIWISOd7V~fQT8mx~rG=~Ot z@0OCGLFXvhG-#0AcfSo9oMnnffCiO9ieEv4Ts{BvpurzsKF&ddYknWLp+Q1SIb3M) z-7oEUXwVvICkGmwkow^W4UUg7nL~pdBk^Odsea z@L5x=6*PE@o%IkJwEKOQ01Y;B^>IRjT%GlU&|nv#*hgqkE4!2h8bn*FmVpKlzJ_E$ zgX@+@k8Z@Y;81NJt+}Or?3k`~8kX=B7zK`G-$r5?hXwOv)FV(gSu1BdeESRkNOTYxWnHf01cv;XfZ&8Z+L{~ zph4W_ynzM>voKMiLD|@_Luk;N$-TBUvR2lm zzk}uAPEPMKLQ-xSH}PwcQ`FO;tTsiqCvj}5C5Ctgt3vgoMBXH-?~#9?{!JWH5$o>q zGw4zDDp5fH7r0OA5 zt}RjfVs7v#)1yb1hvyP4zRtzzIH=~Iw^Ey?GF&7>8_Ebt@qeo0MxjR$m0mvZyM zm-FEOJ)*`*V5;Q)`<%o^D;x*+ufJXHzS~*xRnOl{$DJv5J5IbO;;`H^n$_8V7cA>! zMeX(ci&xsBl&g%zY(l?UM|0eSDf4e689n);briaRzX9%n#Ho+V@TnpMMf`)rjmiXi zgt5a#&SniXWgJ|$mJiIM=XG()o*c(CHa2RA-S4`Qf0Oh>&Y{>Thbnw`%l#%ldKW=m zTJ)8~_p@-dO7UdkezyDX6mT!i59&Lv{@X>&iV{Npn2^kY^a1ZV!#~BGdIZTBs(%=k zE!(6M_fxxnolxS5$)O|=bL*3RV2o)G+!!g7eO2K5Arhb&p6vo1o(%+I)0+1qrt%5fvXnS(L_@SJWk5+TxATtVuGt z;;zf4l)QE#J^5z1bpmODcw@ zlW{IHeMSC)YZuG3GTX2T(_EUYpVL)@CBpri=f~?n&HcoRE(LP8!B&k{cg z5?^loTHg%bc_ypjpJgu)h_#oH*zKbgMMaq0P)4UB{?Lf(b9hqgE3CJ6HAp&9kdv*X zPbweKsK@19Bg+pNhVFG8sZtZBDpi@5+DI2llv2OIR~BAUMkE8hnGOiUJJ|WoBoFUM+h6Z&b z{(3=!2$pvE(BNxiH-2a^4pUYL8caq$7l8(Yir#xegKj6SrO+TJ&59;8xH7gJ4-GCY zuc1JLt_1vE&|o~mePU?v_Zw#>XppMIi4YpBDJnpK25*@rMxa3)>5DvQaI;*32pU{@ zEV=~^%9nLtLW8f2k?Ej8=Fd1((BPRti4ipDW>Q814RV<5e1--+*h#LTK@w4XB53e? z#Yj0cXi6e+3=J}bMY2PKw}TMM4?SplNvEYiQ8Y zW3&Vs)R`wCga&U|sMDZ9+MpIRXs|90MH?D4?rrCX2H(r>20(+?L$9AggXbO99nhfc znfoL($k(!a0u9>mdE`KYmLYG%p~1F6O<`zIya+P_8dQtSB7g?Fbd(UG!GhdZV$fi) z*|;J!s2XAz3JpeHRun*kruV}Yp}~lxXl-b)#f9Po8r0HBIe-RroxMw-!7vJ&3TTkU znLQdB4Cv@lfd)0ja1o(F$%^ib|1(I`Z3zvI?rO3?gZ_2iJJ4WIKNAl$c%h?a1r6f( z=7mCof`x)c(4ghY_!=~rGK@V44OUUd-kI(^d69Lo73MEn9!tdkx!fR;ZF-uY{W6nZ z?%7@gl{LHRK;EUcvTu5_(3O)lQl#nB%f;suyZbfnox}p>k!HPKL4GaMZKN+J95|%jxqji{Qkv+p0r0*(>4e5$v$Amp{x4#IwFEqc)YWU|bo;kiE2M+njCw)VKHG zNb-Kf^Y0pKJiQTvCXSS`7mCQ{TZ}eHS#tM^ch_i=Y~G|{n=iksr15C2ySN6xUIPjA4tEc55pa|C-HfVT#w~$jIN{vIpOj z$BDr%er|MleFve)V7rwE?SUcQrf~;}Z>huhLe)zoE#pw@_Ntoa56DUze&IMoVFZ8a zyTWH{bNcFRN=%OS@T14im)E8nOGj%@HRa#SB9->I5l|N%{SmKkcfcb0@3iw%kh10u z=Nc8i#_istBVC(r`Ucv7K4Bd;+|JCL+;yzB-M0yNt2wrv;hR_~QN0~aEw2^b56pDY zio_=AUR5r+zNR7?qKrinjI1B`7?8Q2=0-W3(B&L8aAzH6bFaEG$i4O$H-r#}7TXl3 zVr99k^~;2MA;%(W(A>oPFKK=QM5Z@1|9rzXj7x=Dud?sTML3pUgwn9a9M?bjx%I$! z^ABp5Vz{@O$I4XM8>Wk$VdJutZxodY@iu{zUko?4-S_bO_v~_ShH>&`9Vdc+YfjP? zYX4MMcj2R)b#F1cYgy_Mbl~1TKU{dObR+XahR6^xV~TY8`!RywjlNurVpGufx9MKw zZG9CVHU(R82ux=p8oBP$wC>sQ`u$!8Uy-?S0)8RgqWTr3U0Ub$@q=Dd zFRLH_{kz|zBXoRUbuoM6SD_x+F6a^!6C&~7?T3o{IpusiS`sV8izDXDPIA-(ZJOy% zKRCS++TwS)-e7O~)l{5GU5wl5EncIL&&la%SPYwnrFC~(Y3!*_$6nyxJS&+9sh#-v zda!mzjixOxCe(cto93GU%I9>v5BV$csHWnJoP%y3a|$LTlJuqaiP6-Wxy?@lZCxY% zWG<>#EhhOjj^%g7(R3Nz-2>`cjmQ(aB0T8DJ}uZ_FpZMFrN4QxdvIfk?USMBcH@~A z#hXdU_BWhF{rK*Ek>2~qJHr-ca_%M#c@?E24_8{k48Bbz=<;DK)P`Y4hrVem|HMuB z$~|!*dN_r6;#KTyDA5Z!;=UQu75lIDc<=m-q~~H?>NLFuT-yFAUa3Z|Buir5i}U9> z)MZrs9gY@OjP3b}qOyG?mdHG7a9zB%xVA)YSI~rK!fwd!35ACK{y*4 zG)Tv6=l~5?rStSagV+n4-q0YUi@+W28uTOi#Q_Zx91t5pgJqQE3DBT#kN5;M7$Z^p6&l3TVOoF&n+9(? zpuzQT-qX;a-?l~~G>CbFdk78U99ODBgVh`5P0-+6oCH5K=-u_V9~w+6SFeT!cWX62 zK!a&rO}xZezXt0qg_yiiHXIoi>2CM2(+@ZleN}E<_@awH!5;Pb}wkHh@7I1sL zg9crwW+$ORgkw(wXs{Xih!q-ak>MGH1_g=^uA#wd4gGd#@UbtOE;Ptc++_$2q6@7E zK!Z$yG;Gk|pzK5vgRUJKHPGNsy<{HuhP04rD+8dSQr>x2d;`FHN1L4M>L251lmw;2-}>{UuZfCfwOxt>FVOOpNy z&|qI^^gcAm@Nv2j8uYX?xP}JF9@51^gS_t=uc1MiPRs*nkn#ly1vJ=6sha~0-X|OA zga!*zUE+-_o^yJOM)j#|cLRpgd zpLvkVS`1cOkbAlNO_*9Fh?UYiE;T=tcVv`2Mb3#+sOV&($Jx>GxWbG4Ln$t_=qS@K z`=&Lnem)z6yg-)o+rf-c4T%F4q27P%nF1&%y9}n`Nk3!Ff0IV9P0Z$dd0kx(QPYA+B5if=n^m!g{tHn zT9rbn&iw})Gp{97=Uw(jAzFXZL0!G&(xZ2yaetq#Vp%?6<4HI*@Z3N5<--n z`pYU@jnr2Inq`f|v(jU&R!AOr&mGYp)|%$w&R^=sy^uT>I=$vk45|3^tt$tWK}SKo zvQA~Bvm)xp{W@{63wnW^j}vA@cG@FxbA=px{s~x;w#bMVb7vv1E#)0Xo|c_(y}lEC zbkXCydGr|VlI6BLB^X)d3t7mU&AGQO1tTsly44(;6F)3nuw-4R8ef_&XQ1|&X8+kA zUsA-EDmsx7s>H^o`_|rYp<0E--D#XHC9w_ZVQb{k?+^h(qx z#-b}~rc^(VQKcvG(v0B;ht91%(m0#>XbARc2*nK`mknz*b^3g+|FDJN8 zacEISp(xb#SIih__9goXi~Gf?*VL-(mD%UADd_zgiMGDilcWZ^>}r!WpD@yI)Cpph zttg01(M3lmQAA^SB+U=CA@FSq(U?54WvLv?vsIt?Bc0w9W%+h>>3v1T z{oW$tpxn2{vl79)y=<1-I0Q|x7MQWE_=hEm1*_>?cA563D5qUmM|8! z?*vY>oJa(c;H6W$mS*B)EVoZChdS52mDU#y&qR*qohyAAWJ*>fsQAR6;F>=Cg|A`H zzGuScZLbr=_lq8f*+bV0VV!soTkG2KPbrzP=ev-6ECPPQhT5lH7Vk2Vj`KeqI$pk7 z2w2o$_ZLNe=#7x1>9K-YNFDHJtGP)tr*0WZ>MB6ukhsxSLWO{@kZF_|>40$F2>EVr zI6Svsp(ATDIaQ$+XDxV~&ozr9rS;<{R!oPb=&lf3xi#W%sf!PWXRC8qkiOQ?>I_kR zw5isdHo-?*8+HvzYGxEf{l0IVIAyE#BtP;CiDXBQ*HOZKMnuOt^op4-M8L(MCgq zTPM-O(4fA4Xe~5o{8oVw8ay_B9SaT81Y>$ZgIw5~d(dF1iR>ygh&ab44Gjub2a-U8 z7TAY6&|o>Glp{1KYW|)W8YEDB%LWaG-j(e@gG2+`+|Zy3M^831xUxMV01YFYZ8t zIB5Z)(4dIOcQ0tLU?J=^G$^_~*A5M8eXHJw2Fd$mN}$31niv6S(7=e36B>-T(ISEd zB|3%upuxuyWl7NB>Le!&JnY=i;H`?JD>V3NNb5H= zxbym305ljwSC<71md7SKL4z+MUywk9@rN^_(4bF(rwlZxdCA8Q4I{H~7g$9vSY1E;?z%-UoXz*&|;2IkA)4 z23JB#9z%oij?7We;H-?oXK2u7;@k%sJV=x|ga$ox;v=9ze@lN4XmBE_$QBx0w>G|m z2KW0@y`jOrxlm1LaAOy10vdEC6hnXpMOD6)Lxbb;0Y9KYQCgWT!;7S%sH)a3^lY;I zjOrgPQzVAJnt~;MyxJvo&M_l>A129Pe$|aE+aB40({sr;(W*=w~zF%#=kwe4(&2O>O<|EVd z$>bsub?@JFNiTT{VGEao@Yj_`&uN|CGB0PaJq#FGJ6(Fuu}5->UHe5Tk?Bu+$gMr9 zs!JucKx?>3_1lMw%d;e9EjH=L-s$>ZtDK~dYlq9H9 zZ`028uTAR(U?j7k@9z*r_6=-{lh$~a`aX@F{2o!JFdOL`YY^nl-1da>a~AWEA5!^a z28?vuiH!p1PZXtOBsH2f?$<>l3QOCCSq69k1(kvi%Jl1`zP{Qg(z{2k$#VG4#VyrU z)b*DQ>vG&?2cy~IR0@9{gF%;U;KQf0bgf|@lqtE09`oHU$}h!iCa95SX^wOZ^tG+y z6tyiyFcB@-ON&N`1(RI*zP-~QjSwKk$k0W#{fbce-Iklf=Owef{PMZfCP0^}czJ{rq#`(!fy@KwH7fr5%#!UacduGLmim*{=rH%qk@HLg@&s=4`)qFZg zO#M>f;>}ce9MERariPHy6dUyNo0gLsUUR4So|VK8?p&+9pU+>v^Zl+T#Sj*!7cBB+ zIn^_h{m>?reIJSWyRK!Xd+j;r{m-9Frwe*|tyJ5U@kb@MxF4Clr>-W)DX~wM^HIWQitawqvL0yCsB& z22JGzroki|g|WA&vPeDle0KOvU;LNl2;O@HjH_-Ykq$ff_%rz%rIR%(_iE(C^l3k< z3XG`g)sMfJ7P||0gv+hans8smONg*vC{%Mc)9$Ll$Laj)Yf`9GWZyl9%byEdB+Ug` zID^c&`@bt=|1Ot3S|bnm#!x7`!fv!85oj__h{vcY@haoBQuM=u-QgO!q+0C6rbz#~ zipgaPI*q}JH$H!9yY}S7r*qheS8CBdrm)9|PHM<-m*tLq^^6M`Xpnff^1xEczh&or zblvjwI+{q&cI}r~+UD2w$Oy6>TXRyyFG=sQt;z){#vXSy2sA zMNJ;s7A3?_gpYgYGcCdFNkqK5lg6&nP8PV`!-yr0tU4EDLuy@^H))iJ!Z(e?QN}M;%U~ z;x#O^Sl}S_SMsH6Bd_8fRp_(J6vY?mYKuI~|7`n??4KXd;X{KdkzLf#prsHqBQ&Uq zx4j1qGF>ryK!X_#YhlnJ!|1LTG&p+cE&>hCi4VMo29H#KBSM2eGx?XG!H^4~|1+51 z=v@X4@~%JCga+A&WVxZinWpSpXb|yD#~C!ZK_Q9(4LW+>c|n8H6sI4d!QOJtC(s~L zy7CWb&>X4B7a9znOjLvhRT9N$p+U#{3VhJupZCJ=p}`_~)k$cOZu)Qr8dQ5<90CpM zRBSFogB9YRJD@@NI|OWKFea^q4;sXLp5+D&#=pB(g$6%x_56hf8xt$Uputu0P$p4FCB8qS-b!90O&OlWZK!qos8e97Cw4h_zfYu$qe-v)~FLxb~enJ=J0 zX2R15XmBC8BpMnF(_MH04RYT)IzfX?OHr24VCy(J6Eqmbkv0}bAP_@@UN z{8_WN2@Ps|vvq?8-!UApL4$GI#b(gpV+M9}Xt46M&KVlSCAz_a28Y+phM_^#@mw-! za6>|h4;oZu@VkQs``Z0;p}`pi_grXDi#UZ78qB$0SPBi+Gg>%9gRdJ#{z8L1UG*QK z!TWa@{m`I|*fJF~D1bJt1`W2!Z5l#@PW0oW(BP=U;2AV1)q@@Z4T}G0xPk^Vs5W znLioOmOb#$+IO?CQIhG-B2bD|@pJG}P|DjLC5D8Jpo^5#;=8}Hr~MQ%A`_VC#gbx% zHN*^BT7t5Xj+T2d@}x;)nQjb4C+-AYAs7Rx1Iy3&CB@@kT52*Ge!fprMJBNl{zldg zvmF1QgLSP_fYGJss@f77xvE~6Xq*URqH_Kv!7EN`Y$4jW6ff3CG{ zU0m>^Ft5dZI#GBL!8-ctC0=UDEM>vxbCg#k`TPNFty0~8M0QG4dRf=~PJ08`CMNM1)}#uLLeh8@@}oi>*YOW*oGx z^wltDJ4p)nVNuq;?7v_B7xkU}5j)~T8sC^U>NffwoN=Bew6vff1t`wg-mQ^(S`r?M zQ9-TxlGK7&fa*>sL7|3aUb`y~v>c&>n&PX@X9eRPCNm+HC-6ZvtB+T~(?FT$_`bsIIhtv>D;6vQGWK;P2x}UThA-8MbrDU` zhXdZ@HZq76)I_pu`L-e$*5SM-B@3tw#cMIieaUs2bC-AC`J<5`JHpL;w*T{rHtm{} zb3{0w#W2mo zsljqBnK?Kp$FK|i^z7cV5oKb`{hH)a@qEm)`U5TT3i()6`V8Uy&QY-|8?vKO&_NqRe6lj^=x7EGj``t{OY zog5Cm}`YHqzY49LL$1o<#NGDOD1Z_b)q*i7HR(;@j+^<# z!@ag$y-9*EKhYmNM8&drAGhpDXO4vEy=}#Ng~$Tb9I)=Sq7+ zIy?W!PP8^9q_&<{NKeR5lQH;{Ov*a>ssb1Cz;U%hij+;kpB-whYYP&EI*O;BlWmL^ zq11NWw)a0P*j|qYa+InWHr4k$UW(l|I1)7Y%k}gvG>FupVhIgCzxZVY4ZetB z`~?lBQ~%k92K8hwnV~_0v`A8D@V!r|GBjxGWo!iv2HcWfL4yJqOhM4#A5I%)XpqHL z#0DBn@+tI&206CkJ)pt;td#H2Af}DLG&CqWnGgpJ(hx=rLxWbmrZ1qu4@wyv&|nZT z5ic}IlUJ||4JJg(8$p9Z6hwB=;B)lpD`+qbflLz`#CSTl1r4G!I4eSfN9M_|puq;Q zBNS+ml;fE^G>9nvz6Bb5EpKlG4Mq{gP(@8vOA9=^r#WKI8fv8r&ORT7w3Y zGSWn#!NG73K4?(=;!`s;sIrfK3k~Wa(o#W#y=e%~p+TPS2ba*`Z2GwhH27R+=LQ;l zrt#bk8bry^`vwi_#Ix_GWc9g}+|9PNjqApTEG$-ZiwJgw zR#po7i*NI=z97124~D))wUl?{c<3s+oZ-t>i+5}bauaXKsJ#t$GvZOkZ7Fdk zWWN!AY)*c+jk~p!@MrEBDT08cWaORrwK?T;I-66?Z?mN9xAUtPns4xfRPh{yQ<_IkZ-ZweShyPb(=8E^H9x5_xYpoR zEryHu+;I{$K3@mB}w^v1dw*o%h|SySEYKZp9NOq#LKFIb@7eqoupg*JvjRuW@x3 zhz!}|>k7Gj%SPf~rbjL%{ZnX~te5zXD{aM!o4*Iq2(6? z_K?4_biFUEP};0A!tTTw=nEOfb_xsImxrR#Sgxb4mHf%Owg0Mnh_M9|wqnnhRQ{v= z$`E%(8|?notTgps{(=YR3<2HZwT0?x=Q(P!(|K?qaY42r&8qM{5tJmszTZ>k6dGO6SO1Zx2Jib<3#82?`y^8 z3jGFardyQ_abkT46WM64yQcPCb#tt&+eDJvfBg@MFV`+9wPE-^(Yz{uc~GztihkKQ zUSPO0Bz~(CK$dy8OptRzaw&}C1^iSW^o=1xgp1 zl5i02pqHW|+V^hxxLvHY@h?>#hWotl;|bE;3v@y`%KIH25JdXsi#3iDKZ-97pN_SW z4HjOF*p=woeJFwOs#LGu_4qec*;0ay(W=hjBwtIfvv>19GV=3Bsiaagi|gp^(FLqk zC&v#;i>3{ov?Q&1r0=77tT+5^jlihq)Lco=>b+KOw_;KvYqBZ&k?5I&UG4C1#dJo6 z))RlwpfeRyZ0+NFHzf>F%hH-!?!UWw^f&};r-2xCIOq3OGB`tD*< z3)CpqLlydpS7>e}Biig)areDdT6Xa2-VnR>@ZED)t&k^TH#YPMvR}XZ{c(Bw@aqv( z%F8or=U{ET+g})}F8ouAU#2vkkK`d{`u~z{QA9U7by5|fK;zC_tSmlwl?x5NHKs_024_NSgrGsRsh29ypif8ccW96xzwQS#C@4Oa z2Mrp}$MZsiZ@;S>L4&lrt@F@eNXSkjG}!oksty{=s(fAz4T>+4h(Lpsi$ey`V9NZQ zKQ!3$+G`OS3^n@U0S#7rv2Z|xW(7*7(BSPHwiz^-b!R#Y4GyOw4?=?~^2Z_2U}VhU zFf@2i6u}r8^hXHafd<(%%KM?gV&`wM&|vGMu5f5DzbI4(8WgBLHG&2c-TQZ-L1&Re zDroRwj-nSd=n+Ga3Jq@ApdvtnGQV2Ap}`wWyeMd}xrKlW8eCy$j)w-{ot@@DgN7fl zB%nbND*-%c@WIj%BQ)5SJGTxEJ}KRN2o1Vc*GNKxR42+7(BN&+F*h`*D9)n|4IZH@ zr$d7XhUos#;MMU9V`$KK1hE<#R0>n&f(D~hW^ACr6H62#XfTcUb1pQ#949o`)18n24Tc~u z;X#AylLf-i;K2PgCTLK1$8!i8{7Q7`3=Q(DaFsxVx0{8V(BSs=C>Ldd3Jn@*wn#&R?|;zpzGN-dar--iJUc$sF85c( zbcr>Z)J0T#h{$)Qq40`NtU{4fqpo>S^!f+>{?C!t7Tc7#+O6MfdJR7Df4yBF7dQ#h zacqc$B9^#3`SrM=dUGD#N3bP(@9W~z%2JC73@O!>kiagP{Zi9+CHI|$RlSA`Pg%QK z=FB$JiW700+*O=Z)PH2KS2ITi9KLyqafK(g9;`Q@bFX^d`as*~l&Efx-^1jo=k^qv z#W(8#qON7j4in)5Y^iOrcjhaHfv+;}-!;}Y5v?2A(CbMI{-A0t9Z7p!7Aa}-OaGai zM(dBXFirdGqr}mZS3SXP!}VRvsN#YQy(Cm~aY|urgbySJR94&DS@l-~J6jfa2$C;O z8-pWa7JEW$v7U`gJ3rAjms8cN%njxdoE-G$u#rjq%GI{x!Vby1!X%DY4rmX(NCW%c5AYzt;`8j+#( zheR7vZ#@i0G4Kg!nXyjdZii@`tp@`16lr+m;s*YF6yI#KG07G!TSr!06?gVob7MeBB)H(k0d-`H?OaOGVg$P@*zz&S9!mj5%kjd(*Z&IYpQ_d+=@M z`~IlIdP0RuX;HvKim5`}sc?f0`ubXm4+off;kzRk0FxxGW@v8_hHs*zazhNXxj7N?|LGQ)8zB+`$Kif&D*lP z3W@E^5ll`5<Y67sv&6C{4HHtLzZuQSHKoClHgvH$V~fm~ z%K!GoNbQ78x;s@YhkfHWuWaLh8qos!$g}b@)zPA#oR)!m%Cl!SHxIS-_^9puwHmq+ z4PV_0>`c|e9(>I35fgoz-~5@!Eb&4fH%suJepd1@(X4nyWV`lpmN74m^K4=2oauXo zCE``bWzNn20t{`3tu^Na_!0D<>ubF&&3mAZRqk;iQ!l_|ON(iPZZ5bzY5$Vt^K^1J zm4~I-)RsS0DfMGVtOtDI>FM}5rslUiwvE1@_CEB#e9MAA?_jqQX2$WRJ_4=Z>c!QP ze7RwbpBWydap7VY_KYOHmCdd=-zCFT3#t}U=-c8tmLxt|f0Z!O{cdXJ2N{0bSE{}% z_q0iWWJauO2;CdvP$%(dcFNrmqrbd7d(rUCYHs%(Znf<-Wry7x+z&WsEw$6pp$^B3+3vm#b$%LdoP zZj;tLc2Z%l2H!h6b5luD^r^xjkxWp+S)u8-8do ze*V`0G)PaXjsy+XWZu7o28R(I6+(j_1;;d?L7~1EkDx(R?4Pwe(2tb4OG@BF9U{*#2lRPw-iQLQx4IbWhe}M)`_c`mJLEWwPWN2`3@#hXS zXu$mSF*I1|*@XZNeh-t%g$Csnruv}4^$vVjEaHc z&>(K+uU=@droB2J8jKb8mx2a2tu0KTL7F!k|DZv^Ud(xDu$54r0~%yjd%_M4R#r+X zK!bM9>ffQkjNH5_XmE}A2p<|OX}INw1{H<>e1isG_F3>lgD0VX^q|4(zfH5yV7|nL zBsBQ!g8K>@#Ct}84h;q$MW{f7!iX4*(4gD2KRGn0bi4c!8f3YoK7|H7y$A)M!E-iZ zA!u-)&!!g|{JL%I4h_x|Skp8YP=C~O(36N3Z(_-t;TQZsP;w?lOTE))Mj-v8?j`l! z*2Pv!J+kng`39P!!_#sdm9Hq@Fjpy$@BSp65)Ezj5>R?2zmG2PEYS7DyYcu)+3;}9 zRsgjc13lgHL3LzR0e^-8a_h6l4}jav_7dY z*?pr?WPCS43c^^b)V`70;Z%x*(_bN5eMy-2q5|o)ZiUQVRuh{oUkTZe}5B=2Y@(kCaZl?U*LDW*6WU!}iE_c>RpHFJ2oA?Rtp7$@KSIM3Sx13FW z)l8G!%h`CRg2?6yn!&~|n?FcrX!6aJ{i{+v(us+Z4+%bIA12Z{rCQ0zJ^Vau>#}6J zE>0w|Dns3Swa?tpxOs6Z=lKWa7t6b4+Z_?JGXk%mTA})0gwzUdhlpVJ=SB#aGlJNI zU)FTv{T^2hNiUmDJ>M9#9$51(r6BA)mSz7}+EdGQ6N%W5`*>GhrdymEl_PH^{~kfo z_T$BwAZ4E9d0M(Qtl;9`z23b(F;9l@dMT!7y9v?}kFE(0yAd@Jo}*pdSgMiBW_(&p zqi`?c4T@>~N%5B)$1u*8pF1$LG26WO8MV?>;02#NnqVnLqE2&^vLfc@5?Y05T!l)f z!}j!eD%v`p49>N3pR1qoEtf*)7ek##G8Obp9_x|`cZ5X#y;S2)BQ4HKIki7VBmazj zlexd~BOux;^D0F2IpSgCQ!|UFZS^;W>20dZ+w+#RS^Bm7S(MR){i%~@n?}wXtIyGq zESvbWlByHh*W-9NLchN zFy*mOeYq0d&J~j5>bZXCAr|+GR&9j=m&)vph(^C(=9LY*|40h_FV7Nlf6Kh<{xknH z8&7}*Z+)fqX_(Nto9%hTYk|@aT>+Zwc18q^$w&=qqLOV!1f4D7dS3%@kmPJ=vpx#k zVJ;8woJTsTh_S8$B)r=msL7Er}gQ#C2D>X$A2BR zN$p|{l8x_8zY=0TzR7qh{w&Ry@ZjEttA~?Fq*am9ZGm~k@hwp@iiWQz@p99n=Z^mN z>@L;YND~!@Azle>H&bk4WnTLPjTLuAcJcR$|6+aZneOIy|E@+iL-JqMqT}POVD$WL zbxG^c_WR*5PgD#~uib%~{kb42V@cHc(lNA6)J4gy&i%tDCwc6Isl4p%PLp3HNjmx0 zgARqXB?7l~nQzeFpd%zoNtz8=Es`}}T%C9+dwgP@#KKOsG}wg_<_Zl;Sk9zD zgC7e`Q=q|33*j+numSVf1sZ&_L(>Tj-UTR8LW5t_pKC&c1iaPh(4e?keH1ik7f`hb z4cdJuS%3!bWQcB|!A<+;qtM{$orokfNM?;x1r0WqmK8vQYuf^z&|uQ8MJO~VDD;yO z8gvr!sf7mBCoe6a!Fs*+L1<9cvQr8gyjhZAh6a%t5%i%!ALoS_XwcW^aXvH{S?)Rq z4TjSE$%6)0oh1sPK@(xEW@r#=ViFY^tV%!Ag$Bg}vV)<)4w?~hXfV?K)E*jqR4h9B ze+DnpaG*iI|HjCmK_c-JM`+O1t`Y|tL#pcYXfQ8-m8iz+n4Ju}WyLzcl|HH2BQx zuP8M5ItoP_8dMM$NrwjGbhS*N!Qmf5r_i9(r^C z&T$mY?j+AXy1GvUO~*6n*iMIG&cBwJUH7oQU)6Kqq}-OLoa%DAs^XBl`ExaQD^)8| zFU5~D(=5B^V=4TPO+sX}DpvU2RI_9W>+>m240R@FWRB1#4kiK)>3bAP%sOTU5Tsg8 zF&3f~zJH&PqI_+j7;0kiIrvW&w=UfRbW?;V_; zNHDz;V4_#M&H5ElcRDDQ-hp4``Q*DoOp>N6!_g8kV$p;nc8KBqOQeGJ10ipOkOFtA z4!%G7M7Mv{6+|o-LPYs}2HoU?#ZXWBkOJl{WCi5rCmJ(0i1ur!F>Rk}V)vk3KP|he z4148Ueq_{d;-}?~pX~MEXWz4_C91yafY$EH2bh`~ycQ@$U)iNz0AAVoX zxz2r`*-t40xER-u%36k`zHiO6;IjyNU$8I46m7qYPaz@+8~EaHiQ%ztuyjdE)HB?2 z6P^6LkQz5qJo?flKDo1~V`!d*TtNJ`KH4nl7g2X~KkAL`9;dNnQ`GG3wX+MV=RBtIhYn)S*J1~iP5*gW05#VT;dcK>_^j&Pzo;#(3ksY zlZr_rGGTEIblAG8Mi0!KLl`B!>E9{wV^YS?@mVM@v}wN3Q-; zTGITUg40I%F<|9!?q77d4f3s~Q7x8$a01~PU$ftBit}FL&-IpLeybL&>6O(uPQ{gn z&YO{cGIFPRI51JoFm8cl%2=jv-#f2%q~jQZg=J4R;zPH8z)Omlg!YAM8)?y~LvcMY zt@TtJH{c;t_QG-Ar@*(G3bflPaTERtT7KnR2+Lg$>_d5awr&wyEyvYWs%pt)Myo=f zUVjlerXu(=UHYah*UNcFy7!OFFE`AOihrtbMWgmG3e>HArpS=>Q^n;AdUx{4Ji8a3 z#`C<~pl-=l@M?ajk~tr6XEw$x_Ifm!pCc{SzBHKc_knn)L)#GkLnc?LU!9uMJ+mCY zKBnHDb$+RP9G4*UNDqq*htL2MJ)+Xd;9sxMt3l3u0-74VHvvdZqs+e<*N_YlI4ZKO zX=OzD$jPO0`BAkg?AH`+o*5{%DahV^HMN>sWN{AF_0`Qv>dfR-8aqBa@h6+=<1D`V zM7*j%RgB^KGE{9ge#AFeaxKBEUxpwkBj-slt3FpiR7MrAUy9QT_Xii_SQe%_jn8`$ zA&lZ>$UnDv4^Aj2-Kf6O78T!cL?}~lVXsQ|z3gKqNSWu?6Bj>~>?B`neS7$%b1r~b zIf16Z#g0kVv=^;Wk?ckI#8Rw8di!Sh2IF!V`GHl*`%j8T5h##rf42tI z-0Cba28`;2ki8EyA^XcabA{S~5LEGfSln93qgICPz&>n1Nri-Q+u)sPW$;$eQkI)V zjR7?H(`)xHG$@0@N&pRFdStspgI)3Fwa{Q{r;HagNcXNY5gN=xbH;@RDaD3@puswi zfjVd~cjhH8G$;`LWE&cEt%$3I24Cc#L_vckrtag=pafsyEj0L*KdufMe5NZ!4Gki2 zByB^3?3ve}p+P#qrebI?;tAy-G`K6SRtpVQW2v4%g9`f-$P1r2hN;dwxV#8~A)&|ve?16MY2@riS%!LxT%j|6HI!%oATRXmFS*g8~{1@T>j=4XSmHcteBL zn2bo!;PaMMacB_3sr>^qm@=cF<_!!EFzgpVgAq=j@u9(|*>Aa_K`Xbo=g^=#0a+R} z=%1H34-I|@dO-;dR-tO4L4y-~=snP&3Qt`WGu&0=~ru_Mv>5{D|f1eo~KJ*nJ$>{UI!ELxdXNJh|ALWK^x1u&Tt1rs_kFgWqq3+K9A&@f<^$ zd6 z`-4%&T~!!yg8@%#M?B>ut0@v1&hQ=`84)m~GcQs8m3jxG!CN<(PRPc<)v=l5PGOhmgmP^K&mT^7m7Z2_-iV zJu&{ED6)AQLm>3yoa4}RaY^P0NFa3$9`zc|7m;Fz;ICybg{taCL z&(wmx!F_{}CmMAJAB}BJCy>W{%mPtPo~}xt$)u)<)MetGB_VaVEq)y@7apeIIKbYb z=+nHJh`t=6Y<-;Uo`L^S_zd?!jn&;#fiTy2&2r6x;kqG)&A3|D3CT?JwS0tna`s3> zl?ff!p5RGNx)Rr`>&;jHYW=FZMxN{HVO4XBbEBCbrWZfX+FqQg_3Dpq{=}5?piX#D zBBr6a<23`n$gc==+UsM+Xs+X41<8k6D(w--u`Y)XGMC&PAGO;B4`%*589=*`8DYD; z5xJ&l#=~+Nv2{M7UDv5tUivNN$Cm6umu_5+k!T;RiY-XDFc>ndibIy=!qIj8DYnONeI|H}|vOME6A zPsPXJSt{Wll@#myY9Z&ZvT3Km9+~`?>gD-5gXBw6>y&qYZrcVhcGfVC9b?S2mg3lA z{j9#&7Z}-*V~wWa6-*_4_g;%EQOysLT6AxD5o#bqeWh(l@W}s$#&Ju__Be$uW}DR> z@jTv$&TW@~Tn_tS(Snes_Hbaxs!^r=e(W;ga_F4+cc+xmCBMDq8(~Y+PqK#INhU8Q zJ$NUd-D>9J2;Q5jZ)GFQdhXsWw6_#(bbj+uDFAQ!*j_lkThv&8AgY?whz#p*uFf)^ zv~K&bc13Hi>t4y*>R)T=@l<$3yN?+qyx(N9YDC1z6{EB1r^!9lSxUQ}n?;Kr{9@sT0(SRCa&U6|s%Gps!( zX(Y-+pZ`8f%&$FmmF~)aJ%M+WS+rc^$Wp;})^H(#`N^<|SX}O~aOBT}bII7?AI4H8#8lZFOO zb^KeQ!LgJ8VQ5eun;;b$^jryUhX%3myRV?ZeS8}XXi(C*i4GcM_*T3E4I;SoE<=Nt zDjRsvpwQzDZfG#zevBYA$h|Y&BEBGAq#VW+N8E3ZbzP(oOoS0hn1NdQd*V~uDyIQf z-qn<3vJ_f9*NZV4x`5&ouMSe;FvV-W8GYsLNx|$QB;n6rmV0p!v{mi!yPn6&%(l-F zk@4c;k=v61oSi;wC);eSU@teiL_kQr1j z^Ibe531#H!dxeV#!n@Hu1nqr;=0YpY-Hml%wqZ`{lX=?!KGj0<42@7v6C9r-_N zo7t4oo1o3wG}V0EwoB%z#wk^YgS_-=`BN%dzjEa(g#|-qhB7tA!^%X#SufoX41Oj4 z1_9Ks2yd@Bo=2-jCL`kw^ySvpaCacMTl@HW&=q}uDNw*HRA+ciFs566hD z83qsBgYQM!U$F-1Gq0QV(h!uN2a=$9)g{4LbjgFjm>%KGmD%LHw3*od;#MqdO>#+U8s*vsNql(ms*Ie>-$v zJxu+XU4qmuSKO9-`AUrM{VT42x$SM(XV~a14hG$i{mz>6)Uo%)rTXK9JF)&{VRd9w z=TE(<=>Kc4aMGKbxUOfY)h}B}sO6949fXMTyRGKuP4@4yW?^;Xz6$-JKUioI%W*9nmpMvL|}c*WQC0e2m?~r2UTR-RBRJHty9-?Igf~*hNk^lk&SJ=t=Imc#_OW-LE^jP zq52hNjKi3;sPFe~8*Gm}L<(_zT5Y5+25jV~ef+W6k?c5zmF=Fh>U!xKpReQEH!T#I7^WJZtRBsk_G}6)!6E;4toa z>7(5QaYK*bSZ7i3`YH**F?$_Oy=qD_Ni&9;0IOa7CPq_6z1r%=H^WzYO{NuW{itzE zBpH+Z+}aNwEhG1-J=Zf?Hse3@cVN?Rc(h-$s(d604mYMTk%C)n8Jxyt~iOG2HDXbwzKUdvG}Z2O&wr6tKTfMy{@M40Df$M>)O z$Z$8UoHUhRh_7Mr;shs6C;f9%#yVU zt?zA1_rp6;X-hk+Fvm(Qb7-(M48I5(e1P5H2MuEB5>-NjG1}FQ(BQmeaV0cJ=_GFe z4aTv``9Oop`Ia=$;7egUA862FVjck+>?FBo3Jo^yc~V1zqYs}NLW3ju+}Y3|Z~u}6 zG$@&!ZUGGj32Kf(gMWvoHK9S{$f^ox5WlzWD>TTzDv|*Wz82f1fd-{lW>KKQ%Uk@% z(4f7hm>)DKi^u;78Z}@1sFa|42n`PSH@<@g1?a0@K!g3()-llF1eMf#Xpn(j=Lj0Cwdo*(27N@+ zH=w~`&ailBuzo5a5*j?J86t!Ri@3=xph40ZcQt5G$Wv(n8nikZYlH?dUs1$BgUKPR z;?N+=s#q^H_}yL-8yfVNZf%AJh2yP8ph0h{D{Vz!Fiuv-9~yM_-)w~j)uUx^p~2_O zVw%w4-kYNVXz;6`c>*-Z$+gJC$+Gtl5Y<9cyukommj4Kzsf zpgA!@VM#4yv(TU=%tbv%x5pY^rNCr6lbS_i5UrRgde-25wDw+B7)hyk@#ahr(u`r} z_^cBi7VpWo{R13)LNyfTRP2B`%|B>SNR9_N9^XHx$qsJm|M0hyAvNT5QC4r}`21^S zQPYBIYNYeE-}LEar77Je4nh;kBU$EBjg{K+sMC;8O45etl(?#8d6xY?; zDt{B$TNMAPF~qj?C`Q`)V5DneE_rFBRn6yIT8T{hqCNhabn9@S^4=qH`CY`j7CDBr znC%ywlesiti_f9PZDf*)ZtxlxQGS4S>h#eJbdWsUZxGXyp77{HQPba@_uU6=$ z&Pr-M<37`qb{wEWFb_ou#uIqh(vlg{oZ0qh*}}>6k~B*7#(8&_>!b( zKGaDn?IXQK&-^^njM#zZ#hZ6CdK@f4OOiHrTehY>pJHbkO2%Zr?o-P9^J}=0 z6r?mgB-E!awL#+du8AU3J4fMD3GQ1MGuvlqS<75+CHH4An#g*EZ*wA*Cd=_D!Jg-B zX6GzPm0H4DzLA0`<1ETZw>~BbaR<2%*}piQnVImZl~)cIM2fhtw2;yt7B~%WeDysL zW01b5b?9*U%fHA&{ro4-Wb&RW9U6{IOz6@|H9Bn&#|@=iXthbYQ&-BxE7|9N*03L^ zBj#0kw(|0Si=7#vc-4kT@sn>=e*>3LHeZ)kVsXBqF5D!ojhO1rOo3wNyYvzDB3Hrs z+}>VY<^Jej6a9s0z()q{p*U^1X|H*CDO~qv!l^Qp=53}5#l!2|MrFpqwSc{ar7Zn#eZLH2mMeaV zr&L$SD}80Ku?{01*YuN)i=Zs|;L}l&dSZn-^*+HrfXf}Dg_v7{{Hca~AALnMnwy_R zONVX=?{ELusq{%7LJ96Gr+N~BRIb~5dU6jFklJ57Ln3$DZ<(h_iyS6*1N=W-(exf`+Nd6lB*Z8Wr zOG?OJFDR6yZYHZXjJK4#Hv09CDaQnD+Nc>F!kyq7{}Ur;U%l+T?(OnJM{OMi>)oQM zR}15YKB877F`-@As19=^ZC*c3#FRZZ?XNEH$&VCN1nMT3t2YvIlnrthhbf^x#TzoJ zthkcSpo$k^(cZduk{0Vi*y}*cR-lI)gd&bX>;2C00m-^!cO zHvf>jLgV+4=L=f!EJ?Zxef?;-Ek>e}@iWTw!;+z6{H;Oxy2VJ>o zSgLlrR!uUR9o8z|>G|Vgpb=Ui;XUu&&b!YOs2XnJmuZyq`VTjTcecZsBJV@?V`va# zJ-8GaqC2eK(Hm(24Q>+03P6L5 z(E~fsV3Kb(E;Kl2w~Gx8YIXb6_`{^DuNN4kf6BF+XTf=A$?zG+35h9}5k(Og-#@ z24(D3MWDe3q~~JLU_5$ODKt1yUwaD;X1?-8fCi^7XIG#>1FLl;Xt2(vstg(&!zpry z1~=Gl-$R3hmxn9RpbO3>CNwCOfrbVR{y=?p2Mvn6p(=(3k!ttYp+TE@IwffE@qI;C zXfRXIF%KFvUk+q~2C)v-BmU1ImE8z5=p`td4GroyG(B2=`RC$W^xvwput9zF70=TT z)|mL`V=Ks$eHKWG_)VD<=;TX{!F%Le>OTrhTNijrml$O0AG@}jOSMu{M`5X3wI3|+ zqXZ}u59nG95X<3oJB#mQ;oX09_<)MKOGWEdh1uDi*LknIBCj?V-s;}{uPs;qJeo4Y zPd0w-@2a1f%>E#dPtWMPmd-XWdGlg8T|E=CMBZIh-GN)_d6MVpIJ;{c#)%`sakkgh)>^rXJL*7SA$r zE3iBN==#jkzrQZ2A3*$c+)c&K zg!sFk>=V5WBa`QGBx&!ZcuMMzQd3$abQ7ZP!Xs%|@`lD^zp~r$eBm=r&M?=QT3518 z!I;DB3-~mB&^)!N+Bs!w`8!aK21ShJj&iZ~bWE&m=|f4zt;*z}>B(&`xOe$r=cdG^t?#b@LVP*f6myZ@EQ3c`my3^z9_R#|9XY`F1?*kv?g~kDms%fORjkW zl}a$lmvy~mGbxmd`C@v;nvydv%<%NvMN}*K&dq}#&V2JN-~5j0>zi8}Gr#li3y$5h zP3`CVt6%t)F8q~FVE;856<;Ox)3Nc9&+kgpc{EvTA2KDxKM2jLlVx@B<#c{-*K_6c zxM5p?tB3|+tmTbNwj83DnH6=juqWGAkw!UYt#dzafDI1m=;dPfS5|lB#$1*2ia%#a z5)+BMM)~!0Gu0#tlge72zxXolUHvm2PKeik`i=ARro?;3s;;XEb2k*P1m2+AZz`?d z3!2=AO$>SI3-@$QOeMTj<>K8}ux3e17}@r*P7sPKMcUW-+vj_^ZHX-W(1e zoiIlp&n=K(EK|R0@B7A}OLN|RxN|Z><4s^P%DC^QU~g~F#k?JUEz0?Gk$`TwugQ-o z%*3aw|MiwXlRSn|0!M0*@!92Kdx~&$-mi=bKGa*k+~;HsrG_&j>b<=c)2?X^jUu6@ z0}=nG`Q)?2@$&QuG%|G?rOxg18iv-Nr8GSj98P{SyBxFqZE6ljV&O$Umy1l*n_HTr zNj!n=#@38*eqHkZH?7m68j{~rRKBNL-{{6G(J^}*)s8&Ev}cyGybk|{%)mAMuF#vA zEr@?-ivQ#sXO}PAP4cU>|IpzcU9UHuA@|N^Tw!y}$DWwPw(+VYQ=KY`u~-#1GMriw zWas1|wHIvEh$!csYrP%2_hhI8(lCmi+c$iFeIbM(M3$`hCJ=#bv~jlO-e23NUbP{4 zY5}2v`QOQ3ukn;z|C{t&uO+LyS6Q{Tw0AO_`)s}c-aI2(*gZCsA``NYt%1EI2->U7 zD3#qI>A{)RdBlSBZibZ8PUHen1r6eFu~^oq)L*X0p=gQo6et_@#L?U@{&<2YGdy}7 zWx_6Yei2@2=EX#rf%D69M>{21_w1PM|^am7t%{pu2YdJTy3N{YMBI zl$N4OfCdq0MFOBfO$S~RXwduZOKNEFYv&>dG`RVMx)mBsEYrh=1`Aob37|pk+86hs z!PX5*2War!yz>$?*lzUJ02;J!*v1+T~SBn^NBh{Y^*MZo}^1Y1AB)9v@+|W{0EqOh24-X$ju7`?sLvy%-Nbg4=CXV!vv?vE&t?`Hk`(DaOpi>~_B zfIc5a_et{koa$$7Z(b&|$&xheXihP4&7Vc>W?^dSBR0n#za%5PO_!8-88;A7`>UVZ zJz!W2-;J0fN^|NioeLC@liiV4ainb$b6##LBkaDsMzH>hVQ0W~e0jWP@6mf^-z%1B zgN&miCEu}s@SI8}F+AWveS*45g{H6gs@r)@-jx}x+OVmYsn_l{6Iu5n*!kbI?a=R@ zz>g2>3|mb)5^&x8yuTmrV!n7@+SR#G#}Q||N7F5Rk#?0C$%(h^odJu;ax1v3HglA<>;3BUwhqziJ$E~P8ly&JMH$GvQK2SC=O?9+IZM8^f+J0ZuI@NI zeRERRON=$EKNnwEXu2LZ{DQ}@#O1a}xKz@>PlK%pg}e)wsUzf>PlDw6a#*uyMwPnA zvUH%A!M%%|@JANmk!pW9ZyH(CeNANa-%Wm;?(=wYZ_I?{Z4#2~+;{rt1{GTAHQjn zm=S7EDk?^NQfsVY70_^4VC3|NsXVRT_xEO=?eu)(c+uvLwAsfBb{X1V>yo`?!VN47 z1Z{$6>eW0NTe}==C4+rqhT^{?BmeIH;Qe3ucUn!VI}Do zF7t^gt&2lAzIh}1Qm6XI1bhcfu1pCTL;Re99c8EPrv*Ry@U+X8OoWH!b%x9XiZg8| z(fck(G~`TFI}4vInNO7$V7|mikg{ffSENT@=`cx1aoOx~23k}vGAgn-xjqKuIp}~r~dv4I+ zhAUM!G?;Mq(iIwvveY7m21jiZ$)Ld%AGu~|ur>Ie5j055I@1dc^3;XtK!Y6!0#(r9 zvj}QRXb{<$>IpPR{6OXzG$rgf8Z4K~4TT2x%09P1gEoSR1kj*qZLAYC$mK^`1`V?03Ee`2 zY;69<&|tabc{Mcn-Ul}s8qBjds)Gg(qs=ogH6W5`p{q+q3J#} zc$Y()0S(He{;q)rm7=L)pg|YeCyCG?A3hO1G&nprpa%{9kuS4{2IVog1E9f$-yENy z!MJ6nK4{RB-s1r@xJh}T1`QsfwZDZ1-5cG1LW8TNRWG4I&ulAZXs~a1_ZAu?)2ICj z4UQc&%|U||tF|G~APYefJ2bd|pEC*?M9Uf&hX(1V^rN6bIy|3RXfTqaNyY2Bs?I@gkAqp{clB!x|D;Hb@t7XCbt@{*42+D<0BX8CnA*+dYEs& znfQq5;t&d}j8=7K99T26>m7#*g&q6c{7g=bCS^AG8K;nG;*RaV=zKqr?d|mWVWI@W zmYIo#R)Vev1BRzXOcbGcm&EFEa(|WX;h=N zmom#2eE;Iz>%%KjlX=l?&2CvG!@T^{kORj@d^c{&e6`13iSy*ofPV&4)-aJ+@by+3vA9TDAH2ZFP{-p;`>yVX7bW(#_uIF)3Yw{-W2U?= zO3UPj(Yu)pl*Y&7iGD%kb`R25FR%xnOlv!dsm+Wm|C+2_Q9{3LU#OSt_~F&d-8E(Q zvfny>-_x67;pP+49Aa=rh|%KPiNaYM$I+rc55uKJLr5n$H8lOFlSZf}u~_>z!&hhoG&7CLxdO(uWeq@hE-+T9|{ehhMQ^rBHx~ol~u-jgc0}98UOEt4~Ejd zi1ED}>GgNwCh?6w$sBoFWb{v76QWB_rHpb68_VIYzBSY6YKU*8MArKut-8EC zp-x{_lHv9C9+ohhY2d2dw_@jKgjkwMzA4ozeX3N4RJtwdJscZ;&u2LVl`&BnyH}ca z{}isxtnq%_iyoLdnbdXBt{w8^T45TV*u7;tr2IQlN&m}sT$5yk{Nca2ejM3%eea7^ zBPyKcb%bA4vj~(lgb}yJuGs7J{#;}md**KQcvO@kSN&SAV35B3<*(4ip}vX8AzA&! zpIAM)W$dYb<7_;dqYhI-U&r-EIR+PVKBoOp_l>1e3Fr1JFS5S=U5m$&loqOt)zT!^ zR;1R{sl)5UbNj*I&{i6!fU*7;z0Nw3%j7P)p?wpkKBF`0+sV^sG?BCB*g*m9{)&%$ z#IirPpK+Vb$nw@U;!LF79&ku@xbgfOU}Kq>%t{y&n>Q^A$(PL?|9Kfq622cCZSuuQ zmLjCfTt1SC&Afuuh~mR6XNtIjsA>BkVUj6YG2bBTBqyqCF0MoQC}RsPxmqR3ew@F6 zjo$ew#l|V^WNK}tRn+*6GOkMZ-hNr(5@VWdx66S$?FePIzK>mztIJ5*`;HAEe`v6A z5RVQTyuXgP0S)TsJ>rK31-Mh+LW45YFQlQt?nKotXb|yC$^;tZxqrR_4JP!-i9mx7 z*a>r>LGSf9KcT^UOO=$+pua+;0yJ2_L0k8up~y(BNC|(|Bl*%OdP8G?>`v{t6oW z;q+nw8vJ_5I|~iUT8pGwW&da>p571(BOIfnF=&m zM@d&>(NTX$3Usu;xbz4WdW1dP0N2pYjr* z!F!tY-OylB_-Aow(Bp?c5j2>-q2&S%8cYdOK!dS!KjMDsI8XhH<-N$TrZV}^nU>q) z9$G09e@_$HIoE%GpF&1Srr$xW?{1}0k5hY{c^HfMfumu`MQ5$Fgf;^Dilx>kbHU6ca^%@an z!^Rr8Uie)3Dw^2z;~$am_c+QUS-+M(e=3bo;)p&rAR|zf><+9PO8<<9^7+5Vad)H- zdt0^ZCov8Tes7nmVa!Y3e`9Bzf5n}HIwt<#y%Z^3cCK^hDnV#lZiJ#Hu18#)wT26Q zws+#Rkh51HiJEzEx}*aKYk2r+M7(1dde@M9Np!6l=ULV3u~gV1hOx) z*eg;ly>smK_N&-e)euoz#L7R95wCxY>6{+z{n#+RTC3m2a(1HaPI>Fy!D$QXQb>B? zlLsp6R)5}29TDuA?yu>#D@~Xuw@lAC2Q?OccH3f*&65+$(Ee8cxJijUN73xN8zwoi zU}1a~zinr&>qoJO$i0;SXYC>HOd6-T&eZWw223Y^mk(L`19{jmCwDy!O410ulj4oz zKQW?JPuk=fE%f}`?pPu;U??!iIS*B6Fst8c*U%avSbL&8Pw+NklHOy2-9M{Vp1q@s=tBy?YDKv81M1j||2Hapc=I0uo+IeRLcEUiR6 zHDXS(E)`RWw+ERj1v@?#wF2EmWw}L$+*sb~9oCmD!xgSQ8$3sTEo=%agh;Nv*%~sZ zEa%&x$NFXYI&KOvq3+R7L=xmTZ^K3A%z}z{=hya_=eqB({-Vr$%TiH$9_l1tNYwP{ zJ=WoP`ch;CD@IkWyca&z`iZTdUbLA0qmh~qY(>w z5&Kv>KS5%yj+}gA=#OhI_>05A@deYltq5tDQ;yZ`hVYUQrv3NF13KhC4;eGYs$QtF zw(u}D%<=e4rKe-~&fD6ZpCY^^@uTZ;`^`PB9U5$o@dm@53sM78}14i-^!^nX&FE8h)PM6e=sEBA?sbO)fMSQFn2|OeudoE)o;U znnXZh$TK`z_3{?;8f8}FCkoZ)l*<;wvNR)R4#a`ZM$vh}9@VZitXei|{9#2U@d=L! zv(K%1{M!F$b_|T2i;#x~O(aQUTKTXT*C$OWwcBZbyK-E}X4}5~qe+rHy6t@9#^YG+ z_tfT4Q{0ImUMN_na|e|G^Q8?1Wzp*}%Ad$me8ej{KO{&PUJ*Y#bf?@y;yJ~r*ou}X zt=~`PG%gScvegl4zC$0U8uw-fV*g!+p+_as~I%-X@r;&8hrI8 zksBHu3UyF`1_yFj1fao1Z6#)CF#p$`5;Um#9%maGq{}wmga(=V1(%`0Shk0T(BPxE zSD&H5qrKoBXt3+IVk0yt|3Fk18cf`~#DoU%aSRxsL2dV8Cup#AFZm1_6qAl0fCgnh zDmO!e`u6oo&|s;B9WFHJGS+wp4Kg#4l|h4H?x;!7phJRACp4%xAHM|+O73eGLxW6B zTlUZ(7G9YQG>B||;|&e^8k_~XZ%5*$Vxs?S;Ie~&-FA#37_=`ZVQAj+BQ z%K5d}P_vC)|8OGVT{1#v+rtNKMPz~+2l#8&2<%_P_|Lz&tuy^SE#FOVUbB9Ps6l}D z#d>4kRSt=dXqGj5m)iE!`Y>Gtvoyz_WJA9mN$JDAwZtrfWX#2HmA6;*ySBjz`R1!7yl(8hDeTHQFKw;cZx?L0*@^{w|uhL zQr3T`($m&Pz0>DdFxvD9PRX0fdLpr@Puy8ErnPGv%+kSHTiGGiD7Wl@{}|!-<0_>p zA%rwMpFgiSF`S(92N~rCa!i~E^z&nU{W}}13=y`N=Qe|QZhO&$3z7KA{>ify%#j6q zH|YgZ3@CtppgQDvG8bN0S7HH~oBEsB$$>P!E*_t`3jL zl~f;ZAP|N&YlLmQ@FD6ijxfOue$4SE^ulr?c}}X+mV)4Rw4A)b>o{lD>nks_x@>t9 zK{PViFN@J|`8FQLi?nMd`L%nJZ=Le3xL;0(Qcxd^I6_vBDrMcTZYqb5Y=?{Zg( zy`Ahy?~{AXm~Cff_TS}l_^eYRlroGHNI6B{dJog2C5EaFBwam@&y}X6jZft?3Rb>f z8yQTTUDX@&o~Co?wSY|89xwjS1;NG`ttTg42<7~#8@a9}2FX85OzOjEs*?2$pQwn8 z<){-{ie8&y5x1|&-BxNOGyJ_tKKl`B_ck`3_dU9?F+MS~qI@2E_iCnQyS&%j*Txrj zcmkW6;o-624$MY{!af~aGDU^A&tAWpYG7yU9$W6I+$k*|ymhc3?`3=Y#w(NY8QZ(r zC8}!M>HC7BcxG>XOwqKQpXb%!*p3pl9O^F4%j?}k+|Q18S-%I3^!gXuwp{z?2LjM&-Tm!w;kD8Rqtcj;mJ45fjDgvg6 z{U-+E05z`HX1^0Fv@3Xf##EBO1lio~IYuzlcm5bIQ%_pkvJr7xb5lB3h!%|OjzZk% zWuY6ws)$LHyqo0j`I(S#`9=17Gf%Z*aF<3k-cJO3S5miqO2M(N9HR{cmgOR+sfu+) zw7a*hJhjMlr%n}L(1kv3p>ZBol=(!DV<677_PBg!J@{3! z>i^{KWj5ulC>!Aw&YgyHYMT#6a@@sAOZd(-Wfx~k_iDhMQhN@8?*}aJPJbyZ!WWqN ztF>_%X<;9VxS+uh&P#J>P|f1OAvCB#8hHZ^nxzxXL4%0)t8>s`XhBU4G)Vn=k`WqQ zV<3=%2FZV_JckDNN2v*+LAyX%dT5ZmKaKzz{8pN84GsQGNY8)Rr%^vw+#L`BdZh6V|~*f~Oj z-@;o?p+P1cOAKgmidp*<8lq-I zG}!o0eFhq=OlNh12Ag%BJb?yt^Hjy5!Od&c5NNPdi`@_!JjIhwhX(Z?7-B$!fz9EJ z&>)H{{wXw=RAuuB8vI;W83zrTtPZz9gT2-Cn9!hjM0z1K`1nPYEi@Pqv*Qa5Zs{!K zLxXa!uSuc7p1d`BXs}1Z01+De-mppKP0idGf-_U37TLXH#&hHmIreBSi%SPv%>6B+3?Rx8Lb&r32 zW_SIQsd}%-Bem4b@9u$yzweMh&Ng1evmd|3g=j=EKR5oN9`Ilvk4>Li&DLbeI&mbzn)>$F`l`F?#Dn;NcD!|zW+vA>LPz}fDD>9xieq6DsLBm9P)QM$uvea8%gEt{ zmj3-W_9S@G0F{?8`uC4>rbj|A!_nH_?EGO>Dm!r85%<54^7+VYOXu^6)?4m#?B4q{ zW{#tv3Y~fe233*WtVF2{8R^=;7+SyIwEnexeiDAw_a3=_x8R8{!AZW?{n9ziU;)9W z>iDM9u_DetBWW=rRJztMGPn5jTKs6e`N8TPP00H^WGA*s*TVXluN+;7s0Sv@Vxa#7oRq70EyB6?fu#d6~YfCuUz1-KVQVNX$>O7ZNqaQK8 zUcO~2GK*WA)|=CnDK^3FvXH4w-}tASUd=GzpXXO`Q)=A9=gJ{g-)r=R`+sEJRa+2@ zvIStIl}XjRmC4&K-jaIq8Spt(7#^NR-O`r8(=LM7+(Kn@*lG%s0BF3PyXr ze^g*7$LU!#iTFcDsL7snQ^!F#`YC^!a*i``E{@30b#=P%ZK{O#^IMPF^c?S`^`=BU zJ688CT{MED+6_y*pU3O^OIkaT?a6H{GcUdi_9GL)JkIauBI7cB+xNL$|0ma?q~vw! zeUFU{e2!}@W>-{K^`tz>?s3=50MV}G{;zfc*PB#wmzJN|w3HY&H;w{Q^8Ic|(f5J| z^R;Sckrs0*OzHbt31V2C{XYgn>pnw+T_mbE&|ohbV;D3j6H9Ie4LbiV>4OGwXM5j5gPwtp z=Ac2VXKRwsU^J;TCNyX;&e07G{z~co3Jof%+G-$_} zGX@PF)RlaK2K_YLT%f^q?4VE3AQf9=Cp7rfSVb8c-04kng9hISnLdODwJ?Xep~0_Z zQ@^1>F7-rGXi(8GMh+V6sgzTK2J^!PBcMT@%)GzQAQvmY4>UMbOkxEMCYHB5wgZFD z_G!GKL7|E{QfQFAeoP7)?6TXq2MwmG246yh;e-WWpuy61y&Y)K^Rl%V8q9N%oQ4MV zL$YR|LI14^BWTd1rfCxzOuX}Bh6dC7G*Y3#)O-~OXi$KxwGSE$DC0Ya2IETUL!iOA z&*+NKVB?Pm9MIsk$@~m7=>3iH78-QPE{TN(jb>52p+Om9I&x?*JMP8;8eDelm4pV% zbuGG~!D}ze1ZYrC%|Q_wq#nN*ga*ZT{$Y;i0 zcy3to4RQTfi!XaiZtt6>vcK(o`=|BALv)63Wokx2Pkj>Gl`0AdB9Ee4<#~QNS;qE_ ztJF0we9CHc^Q9(x&t4iDZ(UNPozb;^Ny3CTEjQNu2cUQ_YX7I@})1DYkWRS+UC)2$`!fSGN^)tC<+A&{|1b$vl78qpk%xk!feEPNf;jM#`(lg9Mc4ju|61A81n|L+e)#;z2My-l<`tr0+7O);DSPX8yuz7Jp(X7l_Iu%djzOr~P#r*RsA2d&bWhOb%VY zKbEMWyWVDR#ylDz#3gr7%bATUc8$>@=s`NkD^8KLx^JD_zqU4!ZPJKsQk>|=ZgFuBjQ{0%6B}%HF$J_4ZD3b*stuwY^HGMr? zS$yDMIBv(EjU~0^^!S8u^W%N`f5K>Ga@s*p>re%Bjn~bBh?j{y)g{$!%gaAKP~>xo zy7$j-t%-*r{N($*Zl%e)vK}dYB@zY{3-W~TqR)Py+oKKM8yrAZeiMVHGt1>G`%_u# zjERUD?MJUT1_@i~vuv7#4)m~3RVWOf;=c&{MLQgAlCGSy(dHY3mZ)!WWHbe(Ce(UeB!8i=H$cTQ;_pM5_JMnlSeCseTYQm=CHtc76vm3G5J zVt0{FJHIPm6VVxaD{d_{Js%D6OL0VM)7KFmMv1Xsqz?lNo~;uHyP|}w(0pH5v*ll! zvSogT)2vMvudIMVQ!u5FF?yO#OYDk)igJ@lNU6>(N) ztVW?3%Q_=Sc#JPr7!r%l@0Lg{=LwtC&fP-%Bh!Bp1{&VWm#@)@tJMQ%~S@q*6#5O@EFh^byQu8 z2zI1}J@{BTCYj7lP*d=I0%dao88tg;tdEeeB#VT=>N}g)IW&kkIKBi822`;UK!Zv9 zQ%=wzg8$@mXb?SCKOP#K>@UrN1`U6y&_jc-{x*0+gI^iNyP!ekl$>5@5U*_o0UAUK zHAjI4r)hPOpuwoG2_(>96F$ofGBRG^&vDUwyq`u4fZg%Hba9H`$5RiplWjLCuoqW zRZkWgB-0#3f(BWPKEH$pH#M^-p}{ZjY-ON9k5>OsXpr`eQx!D$F8FOQG#JrS=L8KV zIuCk5gCh<3)X<=5OGG3z*nrBw4GjkQJz|3fKL%U=g9eEl!?>Zrl{)J8&|nlsyC5{! zSRSMZ4L&wA>VXC|Wh!`~LEjIBl+YmNZGIp$SoUl99yFN!F@p^nv<;7Y1`Ymk)jWd+ zGXj-LpurzIkE)?T)?zmeXz&)jh!Gkr&wYXj4YJBxDM5qsdW+o9pbVO45;T}WsqX;| z9xz6?LxYTm%fZl~zTOXfXmC4l<}oyA-x#qD4MyfvctC@;{)O?-pd${QG&IQlw>$_M zys)Eq0u65bcZdNE{>gP`g9aalDxE=tvKva`(4eO)Dls&;PD5S@4KDtXChT#`bA=6nrj(4gH+loT|G#K`g-8obgEKZgeIMCeVR zL0K8IL}+l>ux<$&j8}{P0u4&id#r^xK69x4EG{zOzn+U78Azy!YI-`#x)I|_+ zBj*s?(SMt8xjHr~@&EYrvhm=iP5Rf-0Y(pJJav5BH$=kh@I4wD&kW?Q5tj^eR;5K3 zH>cd?clzN1eIreesm$&|1R842VYZX~$Z?E;xSqC*AYKmc*s?;3R>vl?=9E|Yx+xq^ zy1IM5+M^}qR`}XQai57k&%UH({h?M_B%;u~c^nk>dW^b2&ZECmogos1NxNor-M-Gk zXNt@vRYOJi{e;;Lx8#u@4k^Et7%P| zJ3nd=bTI0Q28&E92}3bN!r~O`o~Rg|^1SS68>H3q=iqQ5YTh&W{`j8GevV);eq#h@ z;N&4lU*g^0 zx8g`mNt)@Y7gNJ!qHcNHbFZ~6#!RP!uQo3$#pqBLcb1FxTdp~25e?W&I0)3`QBdFaVR&#{N16NB zkIPT-;S$1YAMru6f?i#Qd54F+o+>84)k3{D)Wu_*n2m@j!g?7u$_u8uNV3&WX=%=q zZ`V1R%4}4m$=Q|4`*2WR_+Tuh*U?`EJ6eVRt`9a5FH?FDbKnx+cx_B;i!Id^6-#j;$Zikd)sv!aZ)q;^PNW=nNbe6#aapF@48>=}UrYWx%l_LJbYn%x+C!FzFkG-o6Ls6e*n3{>#rIz>rp{yL zN}Y{7pugGQ6FJqS^{0DZ~G>-n1FMe=$03?lnWMD3~FP(nCQn z)){wD+&39`il+o__c*b;&+7>m7Yc zJA6!kN2@?$^u&BOG(uPCsC*E*zT-vV5jnh}^Gw zWKyM2YLHZ;esuBu!^aO=6JNxlNd7Q&W{Pph?by^StA%Sv+poOO6nGs%ezJgkD8E>p z$#RF_;nm^UgW54Vyn0pTgvs-+$>z;unwdg)`r1?O+HXUgli|TbYE7QsfADQiQ4r}E zxQ({fHrXRau2qz(y!ljM#LA)x4K`Bvw?TuJjwElP!Gi5j2WT)~b_X9C6c&2?6dK%m z-Dw03s>)EZLW9x9yrR%x@4%B>Xwa%G>Mt~y;zvvi4Kk523qyk@&XbSqXpoQNObHr%JXzog4SL2o(?NsJ!lm`0!DgPANoX)+ zjqVB>Y@cYwfCg=NxHzG~H%*;x&|tCg_bg~o^HY-KeR+0%CRM{CufCd*1%!{Ex8H0Bi(BKD7WUJ4B^hYUS|1|x+ft)aoTw&+`E(2}Lq0vg0UHVK3V|KThNLxWO~@m;?;vP|CZM}~NK zN;ON6{$`<@x2A~|mW?^#2HwlTUi#p5^I@~%n<0E>g+EBvy%v*-6;ZmSghonFXbTPd zr7x1-9e#Z;y%mi9t)ZB3>sjxbPV%uX`yY97f@0?4&rhjS92wno9xNvz4JyU4XD`~} z7uPjeg(XX{BxlZZZO6Rq!>UvI+|++PNTKEA;#!^M@wS>&deJ<2iL+l>XQ7C>tYYMz zh0t2am}~0|J@qrnF8W{CV;Ct!DWvbp-3cXMcB4`p;#*1J({Nd|H0y=NVfadQbw=Xx z*mB)+_J-X$=jbFVTD4QvEzX-NpUy`T&syZ(uTQbaOEWnx3il_&mX1@J@@R~3sBehV^eUcr zCS@k_{EcnGo|Rx|+nYrmCiYK4$Cfrxj{xU69b*?BCT67;Qv;i~&O$*6%InSsTe%jL z2Deqd6h_~EDyIVUXavF+D@kRzj^D}ZHutu_Rb|u!X86)!4f~C$;n}MfDahCkyunU= zvl=Qtinou}ttI%khx-4}X4P6^AY~t^TeGa1Ana$G^ zn@EKF^IJvCk0}K*R?*^{U7inES!uZRtjgEc)K285uQUCQ5ra-l?(UGb=D!<^Z2RF^#2 z41c*<*xuva3f~^I6!+`1S?^HECr_Kx(Is z$l}aLTby!aiGFd=e$9K4H$1{10D?m>gtMCH@aASshE7c_|5(oF&l;wBJaLWAZnHP4{IGOFJ!&>&$> zPzW@b6EtNH4Nlk=2SJ1S23wQRAb;`|FEr@tavcs0rf_>8{ExwMpJ-^1OjLy$8WeWO zu7CzBD_tX?!5;!G<RRqWg95L<%Rqz1?R!_y;Ga#t1!&Ow&BhC8Ft}W19~$(CdTb62=A9F2L4yH< zzjdL(FW(yOLxV9dkBy&>;PidK)w-)q#u&4XTnf6hebPcoEE?LF^@^4c`YcYlB zjCftgbtr?Z{UI|>vx7Xt&DhqU1|@>}T3fiAT5#RLgm90d?UXI8@+h(4^wZx3oK$YL zU5gAX$x&_`cim58kLGRqPm8+o+ijRRbPwZ;QEdWglI~WP3FIk%|6Z5qaXw8EyVtjv zwEXS#5F-@%b%uDaJYr2BI@uPwf8ABo>}%plMHT`LtD#F*kL;4D??>v~L7Y=3bi?Zg z7%Lm;nL?fto0VyWNbXrWgD&I=Rl0Z@i)4zr8)ACW@KIJ5|A*9)|1|fXeeDIIoolyaOR(@ zvy;x^ME4OQ4z%+qjoZBYYh{$KYDj8bD=XWM$$rZDAxpF+LF!mNa>Q)0ukUS0$H!q| z3|XH*vFSmx6<@Xuvr_tjfgbMrSyFwyuG&u)N5?%GFc$f}PK=sIswyb7%okNS>=v(P=p<-UR@<^?Y?nHH zo>(Nk@j)=Vd$QOjalkJ@7v;%tq27Gtkg%pwg5Jlu3Qg{hCj&}*@&76(PG;8)MO?k> zBVTWQwRg^)XhHbS&Ux?Q$s;w4ClSBh1Dp7-210opdl%DP!^vGJ5BqKOqnV7Su`n%` zczfSUN*PgW)Q<|tavnHYRXQC#T zm!-M0(?*~{x5U-_z;g={-v(Yi+)?-Q&vpAstta&qaX+e#2V-Y{PrY50&r&8vq$Vo+ zK7aDScaqk_6oZAHU*dQUM`e)na_k{DqV%pq(t?NR*JSz#zB?jy1^r zZYk{sLe#(+6(Zt%FfVS01iMnVfj#EF3hS6#8G~Zq84>>&6k1a!!U$@{eA&SK0E>*WqPZcR`7tp>`@p4?=R$6$ON#K|?w7r_kV%k4g_TsJDyQ z1`VztE_pzMf3dKOp}})Caz1DfbBUAz8dOIXsD=iMeMxYj!M!`9J7{o5OZOi%_|sNM z2O89tpd5n+wVtW{ga!lAicz6KQ7L&gXb_u!xfvS#>3hZk4O+f9+JOeYRoz`dgN||- z_|Tx9ImHWTus~xY0UAsxHVS|S2`-6Oph1f7gb2`}SFbBQG#I|S-3JX~SKAOkgL5^g z`OqM5P>2LHXdRnb3k~{tP7*LVyNiba7{)L3V_a zb7;`@h++yFERgDqfd=1Ph&+M@C64ykp+O0c#zScE!t>q$G-%4MV*(9UKGj%)2IVu| zW1+#{K1}VOf`t_c)5D3F83mEiHNG2#ptUUd!H{K3+<=mw?=P)}S?BO1;5|m%vwl^D;VdE!)Kg zlFWoQ>oe|ujfWfpf)?aIA3b6dBCtPli72Ca`$3>lEk)9sIG$t1fR9dm!yNm?uKLQv ztt_g1WjK-3U(sGS{6BxDDI|(bgHmhUnB63oFRU$;=Gsxd{xMB{!`mtEIpI*uRoN<< zX6{d3X1$(n-!NgFl%O6fzI%VJp~!z9W#PuiF3PBW4?{(@CT{6{6;-?#{yZ^@4%+>X zE_0=Xmu3|elxsE%=z>-Wctl^`k7C$#+-yEf^TjS+g02N5Eq~3RHY#7!?9QiEq7`b)-XDwbn-l&yp zr{Tqzn#f8_ETXeipnTjqIEBDh&%+Xq%`k9zrq|EkJ}3Roj~D}w!1wXZPfs@g#+Npy zM;u6}Y5hMJ_05U@vU0K0$77cVB}Pmvd2Toa$%JXKqYAX zrX^OfLKC;%Ep1RP%BLpOcX+>>1UEi(%5$I&A{onQ#}6^LFc&*pvUwxfBQ{GM3D`RF zBZjuJAR(m_xZTebdCjvT+T}>`O21`^PoYQkQGY=6nU5W>VQzfG)x@*diZAxe?yAk- z4y}J)*Xmup#eVSIfiuQBorE^^T|?97xs)aWnGF)7p2zgK)6#@@sAF#;g7lEcS$o^? zQxYVL5i$w&9r^T&9-+@vLAz#05PU~2Z zca|ED8O7t*KWFxRVN05BgL_C{U+`)Z1-Xm$j_Y#HG>r7CE1Ajq_Sts5M|Zx=ew6`- z{`{ZU&t>CnPtV#hdOFsAkCxzZe?h0B4oPB)qy1Lf=fBt%wpcP|q@MUk=X1WAg;SbalHz9E zMf_Nr-yh;}B&z8fxm11btZ9>@WF(T)cZ0eny0V#w**iEz&9;W0-@kgHMBFq<^Tcix zlf~wA?$fTVwFKH%^~)<7Xt3`mE;}^nlP>!Q8f1OU$PNwmAoxc>gBe&aOrSxgsz^m> zaP5gyAT;>bGU*F6C?v%9KL#fXV=19Q)?v1f(BQ|bb9`u!+vREh{}}8r5rPH{Tz=$0 zgCV0U;?Q7KeytERNWd&33Jr?t-grQRs#RBl(4Zw{eJM0JIP*yW8qD|3^@0XVp+WtRS_S`Okguv28k7;}ID`f*+0Q$m z!RgI~m(XB}1)e7~sI&Xi4;swoZy$yRG3#0=p+ViWiqFvC7}v84Xiz;wn+zIkeP9s; z4R*0vR6~P!seP=_U}taq9yEw+pQNb|4D$R-lqa%O@5%N}+p+SXg!U1TI8$p5s8suPFWrhYt|Jp@CgYJ)n-#~*}`YGGc;Q4B? z1vEI*THON;_8K(~K!Yt$qB5QXgMLe2e?x;;`^VwXph*+VJs|++a^=Ek;8YIQ{e+3OH{N8>94Q3H><3oeW!$eNdAOX+*2WU`4 z>c$=#j1t(^hXzx!a+#pPk!KxA(4giC9W^v4-Po`O4X%50rb2^g`_2~7V0+<53TUu8 zK^qAg{Ia_j4Gr?KWnn^torurlpuvdM0Ul^@@5F=}8Z;->lY$20_0Y5Aafg~vj|bi6j4eeMByyDS>BJ0|& z_Hf;irMHgql!H=@u~?s14f#2+=@4R6C*95Hj}yO|792}-EZ zzcN(iIV}jGYG73CLm>5F^DUHc5heDSVB0<_C8PwoAs87>^xXz@!s` z6L&^1(BT_gy8SnyD|KPIe{k)5YTJXGR2gWo&dcW~C;v*L^l~g_`D)(R`!0Gla{4dB za?x6DI(h+ntzsnonz(dTfyBRdj&>4?ZZ^r2+-aZ18vBWf;wc9)|9|D2hWbH8wJy&d zUc1=N(lYAlQlRNOyt(maDL%P&L5?sDMt{ct?gCp!L9%G_lI6oAEt>1-F@d4rb7JlR z=DvUe$&B8OhJ~=?vr_Yv5yFm~$>_?c1nX)=EZ@+ir&&TSDf?4j)$X?(EbB7_zsREs zbpPB`w@~EhxrWtEZie{%aW7T2_|KhA;g~!?v*8`8!cUHF3x4P4Ofq1-91m_ zu2^D!bP#mh5Fmdu^-1{_;xdgytFPrH7I6{FuR9lk(V`f^-_li75wnF~)2mJL_9Qpf zEpaS)MlyV+e6cIZ@^QWGPr1*GE&O4UTs7EcWNGD+qzGnrvF%#OFFXf!KlFMZaN@nG z_Dq@?6W=r#MK0tK9}pQW@Iuw%8LU@c7E&X3EaqFMMXF{-#$9AOya^UCpe9JTT`>v# zr`PURFxz;KTD@P(L9Qb=ekU9C!YqC9@@B=J_o6gX)aYknE{K?Uq$>3qspiUNvU|d-Y_QKBLf7 zQc*GIL^O*se#7UU8;0<^tnh+wQU}B0d4fn?9vY<9LqtnuBHI>XAGsw@CSAjXmWjHd zLHEAXcxZ6gm1PAQe8O2a1r4sFONT;(y=hel(4c2QXaY3YfFY#`4I+6ycY+3E2#e&P z!HCbOOwizzOKC1N*uz<%1`R&y?k9%^DYnv3ph4fsQ9@|&9%o()H0Xh$M-2@==Tx?b z1|td2FQGx>eEVr=@Hp%IQydM3L3oE*J26{wx9l}fd=zeGrOQcGFPlh zXpmPaf(#lomYP_A2C3cB^`XJA7%W9-(4(^KD>S$oET|0)BDz^oL4$V5R@ktsA-xWai34GQ5)D?o#lAegQV0!(Hoh{12ER2JNkW6ilt)d_V7WG;GBh}uQJ@YD#_`G$LW8qpP2JGov_17X zG{~=Y`4Squa>ogP1{;J+t)RhnLs4I75c$*VWx(+mmyskzL4Youb;zEO(yj4cfV8V6EG&DHs=EMXITK{Z(2o2UURjomTPF&WR z&|vc0l@HKhZBiI3H0XQNO9l;cF=seKgJYGy523-mvDp@Ako;`=1{&0Pc`XJF7CP-V zLW9!6dr8pXVYFr`G`P&>X$B4YzP}EH26KzN%%H)Hhup}*Egm(KexxZSF~bRg6vAa6 z>Cl3lL+F-1y7!{Lc!TxO#9QUl>CN_+Sn5`(4M#ira~eM$v%!Msnkbg_lTsf{--2uL zA4rS#NQ-PjF+TNoF-Ltt;>UCCKc3kcpkuYzACI%G?6^%ezx>S;roKJk!cFp}dtp5= z;yrV_*ARXCse8EzuD7v}hQCLG6?rU?Jw{l>`GabPPY&t^H^{8{lX0kdZsc7j1oG0Y zTTPm^>#bp}Uvb|o2u~KhxU=xaej=YS7`JRJ)yo}4(9_4x>A=X_m*mWhCby1siL-cJ z5d4jIpFP)RHB^!>J%_63RN8^)XRi1(B8&n)|eOx6PS z6?m4i|Fmv#Jo_YYf?gd-B3!yxduA;2F=fP957)p7QG9r#Fi_s9h!ZAMy%2* z#oxvEzfS6=r0J9&mZG}?Tvay*uL?!zUsN%2NXSZlDsL|MQ8}CFa8yf=U5^+U>nz;5 zfE-FnLs+3I{FZd*vN5V^Xv4BCN$z+qQ^XYtU2 zjFmLuN=PCpuVLRxIw!wA_j7Kc@T;8XVJuJa^0#d98heFFU%k=2(KUFk7ErAaZ-@uthnv?uo)*(@X!LEFuK7s z;3`gZyjuH%$(qgv&#C^~EfHQeTKQ0d7Nwp(YueQeGBdU^!ROa+qsh7%J>qlpY_BDF zT4#3Nh8M);mU}QG(_Z<@A};WjQ){}UF@>{R;M#k{68@;h3DYbU;pWHu{i{iZI_`t? z7As{~70>|iLm4WSPW=exFVeQua32$&2n-RtZ6jVFPD07aZvS3!9!=7*ZiGPWhUzJ-Hy$TE)R7^283LTJ`K~y(@JxwV_v}WqX*OE zNCr=CBD0k2+0;Td=h?4oi#(s#za7_Uq!&7yK3sXVnMbZn`+X%TlPvp^Jm2F%2F`ak zk0PQjJ2vUg3iTJ4oBH8`;^Bs;cVIK8S$ z>n9`Dr(IDuuCv=4NO^su$#CqSn}06XMU$H2SG)lYT9phYLW5zZDn`(t!$|TGH2ApW zM+`K$dazXi4Yu}0Z$g83xow8fpqbzd?&|t}2 zf)zA4Q&~d}4VErRUP6PsA_FAQ;IH&28PFhWb4L<1SU8-{1Pu;d%CJF$bEKQf&>*X- z?jkh!vLt8~8hqQajsgw73emiT23I0POrgQx6KZv6&??s|6&h4GtR{p8&2h;OputOa z&Om68MOEM!8hjPv_X`@-+*jZfgXq4DbkJbY3qNyca4g{I4m9Wx zYxMydL^HLxfCj^jw>F?b{h&-NXs`~;A`}{Ys32ku4W2XQSwn*?OyfP!U?7SrFEn^9 zi4Xz}Chik|fd-{0O8-EE_%d&GpuyQR4HIZ^x^X=e8oYeroeT|fCF;C{230<4>p_D; zb5hpOAc0-TDm3_)90>s$Oz7R|hX(f$NhF{_&HZR0Xi#0|;vO`3*R0t94gTPL&IJwb zBUMgAgA#==+@V2cdX7mV4EHmk=ICC3B|AESW>y;+t>zrUt%#DaDlV^cG3;+jXwxLP znhngB9z#eo1Gik9O`nG%tE@*tJ`&cGa`!p?vCGQSeiC1wG@h&Qq{IOQWo=}T(n0I~ z+%UR|f=m1A)lub}u2E4ua+(7b)8pfR`^T24xh2nAH(%|)^di9i{9D72b=!3zW$AZ) zb9kVw&#&OPB~i*d2L>K}5kA%~o~dmjt5wX^?lSK$3_pGtwpNH+q;K3JuctoVChoHu zahs304@mo5QV6_ZydHr*S_OPjGBWp(eN6j;D_v~HnvO!6wB`Tlm^5_4;_IVBe z&hj&JH}rT0i!e~F(+8FR_X78i(-{Z(o>~_EBbJYdyIMIjMFl1^kxhYr+bl*3&iJtp zDzyBJnG@)hnv3RWohdUAWc0f>Sze-R&^?JrVShU&a}`*gUTiAwwb4O0kHL`sF-RRH zkL_=`Y%ryWYZdB+lyDtV_JDR>wEtRrW;lA;LoM1_(P6dEI4@PjA}5eOEAo5uh6vKK z631eTRm%;UZ`m>5T43Z=+N`!8arEC<(y=mvYdWNx|ieTxhS6AYeHfn6PW+U#pJ}; zRbVMhYs!PL>9{_`WIAoyL@4it&KaAWWfNwkO~F6Y5aH?6yv+~?Y)ky}tC>GW`M9q? zyiaghkTCv5a1Z}kiAFJ>*qar@G(@*Qt6n3QTf$|sGj5r2gu%lt3c~Hmno=us+hvZt zTU3Q4CX2V8j_uf6PM#j!gP2Vr77`seBZrfx*9$87=~f~uZ`0NF*1)J2rL?$rliTsj8S_wN%^G6(51Pp*!fhBuP> zA2EK*)u{u!Vg1a;eVWfQ@aju3U((-bew1$?b8UZR1pF0!Ll-t^rFQgM<*{&t{%eEe-^F4N z>(tZJ_jdU1XjcjwYM2>fDh&vHIvKZE>q?o~ly1nbj_}!j34zg5TO# z&&nnyj0n;{grIj7jMPZS*6jRxFuLHv&s^+x_i*?{F8DLFSbBjnu4;%ap=*<|lz(aAZNc$aDXFbV){LUnCvFE3 zTITiJTDr2xr?K^Y+ie94m#waL=q`m7?{FO@J)^m8zTK2P^6ex$cN&|eNc9(`{ljRC zpo2v7HP3riDN3yl57F$B8AA*Kp_?ei=R!QdT!O9i0i$I<+0?u4zQp%3b(C-OQLY#4 zqIkA1=q}d8-X^IzmOaM5%`1RBi4!+8V^df}(;LWAPr*K^Py))&bMXz(fV z@2AjUQ)TEVH2Any(ghl{5PXRa4K~aZKY|9+n;3ndL1GeobZD@9Uq1>OY|6_Ufd<2< zQ!1dr1mW*t(BN-UZ82!DQTWjhXs}k{ix4!pox++74W5t$kVAu{JJ!k2pz@ZK3^a&h z)t?FtPL)RwLW5Z?&!eHitHYOl&>&ty`wcYc{;*F98k`7trrrz;B9XB#K!XP7FB73b z$+5tGXfTe@mjfEyt`)L_21ga-LZQK8+~zrG(0Aly3mT;C-SUD4FTWE#h6dZjbmpMJ z;W9K7XwYW56&D&*P)qQF1_=*qFQLJ-n?JeGU~dRhAvD-pf&K^@PBOjsbDxN$XuvQjo#>tzp#Os9w)imN zAoDWe5wcrl{Va|Z9p_IrjV1!AQEIU-PjXN#6V2&pSAecBF46{Wu^f4+^XNEeeyT~Ma*y7YWh*XT=~OL>CxqF>m> zw}pp07|DYWgO~jxl~i3{&88Rs(~C$h2Ibr%ZJY&-cZ(6ja;7mi51l6R6=PtJ(aSSixSGlk(fy)}X-mZ4ux8u!owt(G3QicNm=-!73Afwzs9|Oliu` zg9ZD9SmrS)AI=7$?LS`UqxfmakmZ1R@xVG~GEbCj{ML^*lvUQiZ8JwSc^IR1dp1`h zYamp%M~c2WF;8!;t8=6kImA6}tdFh1(!EVrfaGuuC0OdtVt=u`IzySOJBhh=(W0eT(SO=+pFB&@%pa0k9 z?WM^OIVOwzX|A7AHK{Y;;}XJ5O`h>^t{|!BFZLd`Ki%>TkM$$bu1(AOm~G^~#QvA5 z-*HIGj8Rcoiz7l2;LYWWDvKbHaKf2D(?u|A?A)?j5;G7)_#;0 z5%qy(&+|Y|uLC7ugX%&5<5YeeZ|vaJgitnY=5n=8?t&;KTGd|J5aFM66J19Pc$rK5 z7_#%^UW--dA=B7u!(Zcg$zyhe60IJ-4w}AXE_J{6sKk-+7;)UdsD1g1P4;)8y>-qM zMCC0ywYs&9_&cTNM=$%n2ks;j2<&7Hi0?_NH8xUYUoP-7TPCdxJ!sEfb;$nF9Xs`$ zWlscKtiv|eIn`V9*e&iB8|7_p{Tj-hh-X~_o^dKqz9@xr|MEEQbk4Iow-eNqmMz5# z^yweykC394^#THJzq{ZXcu4 zMVIJ!gT6wysME&j$dbBKo7VrXEm`?*-qJjO(*4>GS)-&sKKU;`XH`sK^bwJS22+0h z8G#1Pp2)aEgB6+E|6}k8w-!D$_#DgD92(5&^2~$=TP&qK{>Pxc{~0uR(pOFa4Z38s zl|q9`jnwVXprMC?CNxO8jrFKlUv&*dzD22O4Y^ zjC&0YhSK?PLxXnYgqYBvrS&^?Xb`&Js4OSc*7eIq@(fOFrpwy3?1ZdD) z!=eQm^re~?g$CVKzY{})=)Ck#v4BBS+~HTy;IF1uH)wF01alju1G{{j3zwvdsL zk(m%mC>aTv**l{$Dx)$&*?J1uQudaW5m_Zdb~eeD6&cx~5cwXj-o2~GtN(ug{663B z`*gcH*Y$9m9vmwlmK|gLqP1UC^MjSq1|%STsFT0u2(=u#7>2S}KIm&>%Vafh}mz%1?|68suU! zI0p^d*j-zI2KR^dnn8m(95WZ7K@+jt`q1E6i%%KQ;KD^YacGc+))5~XOt&h)fd>5x zcxR!(lcq9vpuuLJwP0vamBZj5GrNT1B$<6gYX|-=-UnjY-=Ct7=s>7&+`H>|U|@;8!EN zY&@YJeV&-yAeU}3g5R-q#LmrbTJ5#eYMM_v0H5wM@XWvZDNbvr7jq11=a>< z)!`lrIP2eNiELj<4t{yT>fn`CDUN%GF;N`i-+6SXUF;6pY2{>cX*5?VMLhj_TZkiJ zUr0~>=&s`NOPYGApGdiCc5c%0%bSNBy=~+A+U7uE2Sa?3Kupf0IN+3Nj zvojxcqa)s0B8s5G->6nji~SAnjV1d$@;BuKO zaUA5eu}{A|ayocKYs}(I(_qlYwz9mf5Wl8x=FHPXgHgdn4q~j>-&Dyz<8M9YyLZ+8 z!g`9i15>WQ`3t51)N2k&&&1`iz$t(;LtpfzcMyv_FPEyM#cyG z%rw^nky>)XEbgf#oO3u=zs>Smet3Wzn8MK5oji7R;&2n0uAp~)^GUw81C2CmOR{Dv z6~^t+ol_!Fe*0=D71SMd7B{?fPcc)TnteBvnKdMIC7mQw#HA(gy8OM->#s$b-5Q#d zPLR;9YBW9TWPS4}EJ}*!##H%X|Ep&i7Z32hF#m#thgJ3%jBDAJok75c1IBwp{J+G= z{t{#QOYC3&0D6qmUyfV;OKc45-@&TCB#0sS_i@Po5=4vgf3kuI_Fpb1?q6bre~FR* zCC2iXnB-q#n7_o3zZm>qf_sIM{7bbke~JCCf_p__`AcOa{}RLeCHB7x?iGdQFO`w} zOAPau*#9cHR}_}NR7UbIG0b0L|Eu6$QCR*`8OguIFn@{t->4u3$b9c!%m!k6_hK0k z+q)P0f!N-?m>lcRAPYKV0XKL_G$sjd@EA0Pfj9WQbNw$tv!91-n&Ug_ zf(h+>-~EAYZ_Tldp6d+S+1~xJVAxx8Y@q7|C$zJ%`(wedx8_(z&$WzpmUn+F7{<_3 zj4`8a919uSMLX!Wx8|slKwB*iQnibA&~0zcfw_w|UjhWPi+1+5{}&|q;{*A#f?=e^jk3jXl?PwfB03I6l(|MSiuQjR{5|~B;P0`Y27ix@p@Y5l z$M$P>`4!$X2)Ey6m;b)$_fL+W!Mz0GwwEB>_7a5KottRt~qegj*JX~j&YHnYYsxR}=(+aR z9OP(+oB|6SlOrr>j0HUx3)*2}!$!v}h$I@5M9(FOb|htR(Xk|gL1TMs4h-7C_z|LG zw1b5P|BofOSFsg6J4M-#-ceH$ilaUg3Wd z{wG1S|NEW=9m6Jx#$dysu|L`{8wK7f4h~fVnV|L@LU!q0gI86P|X};^@F}gQs)Q3E_%+S@@ zM$SlDl5I<$IkW9nnj=xvrJS3+f#oFG#k3*sEW*d`5jox?3BtIeO&vKKHI5|AfIwqhshdwnkVY;!t8+&+oSd3JDJ6GT>5 z1ts4l>>$Sl*U>3u3_%k_rluV+8DewDMKf;nwpN9p2_mf>yNHS-KJv0P9DO*&AZUU} zbkY(MyLbq(jhX%D;S@~}IUzxYoE)A-#snz;d925DQy|73Oo&BUEmC!D>c?#@YZa;5 zK7({RTtF}_BtIVSHNPU5O=l!|wh}?22GGa*Dg;S8iy*6lh~&Fm1UYVx&Up_JM8OI{ zrW_GWMj(P*jk7LWAfft%3&8ODYKsqL)+>8br-W zLW8I|PiPP|x0m3b27e^@r@gCm(dtBIOd5~5E%TC;GYJ6B>1Pn zUkUy)_@jb<8vIc~VDO&`0)xNZd;e>24EgW9_lH3Z1dHSx6-BEa7Vdt0e4Swd5_OUk z9Bf)|2Da!TEMj_5iI_55+GGY9EL?<`S_Vz=Co<75o_z6iP?sycvBsN-tj#)q7fLdWU|x*)a| z5J3~Hn&ra%=P4RZ5J3|}&;&8>G#b$niup%^2$~>*CWwxZp9vyd_ht}Pc@uPuZdhoR z2M|OZ7Ym6GK|AOeO$b2~M3M=y5n)EOgO1UJ5HvwVk^&d86;=H8cpr%#%SMQdIfVau zyyr#N39{r!)ht>n@+#z?g!DcjXo3g^{of8~J<$`P=gUV=N+pG$3H}&k&|{685QOU- zf~fkUCq|D!G|&XmvAQ;b#G{{)|0I}#zRd?sFcU$9#nBix+GNm1jGhNQ-qr=}*P(51 zzM?^oMUNj_`_Gsh-SeUieg7&EbU%+a7PRT14SmMMpmQ?Ph&D;I<)aOqxe# zx;IAK4BGZ`K?oz0>{~N=v=1Mg*|$bjZBhU2WUk(qj==K@30Ze78OUNV*@^wy3T63Ze@#8Kl_pXs(da?C`L7;zc5JE4=i_*m&t;ivP*Y(u9>qsc$6Uowz(Rx#8T z!Nd>RV8VyGcabkE?@rLk2qzG%luL&V#ecY`)xN{Im_o|Nt>G7Y~O*cy*&GU(^+Tyi% zk9)l9%?K%LyF;7_uZ3Ik$L7lBc#*m%lAHoK<#!H6IPci7zb4`?B+Xc~^R%u!=(HB+ zwyH+$e7E(XCIfH&?y05-oaOIFo_wTGVDI>>hS}%Fz7nnd=)jni#lDuLCAV1R98Qfo z#_d{Pt20$R=d&WCxDmn0eL9^N={H_+Fgju8NHmXmVIyX@=(0azo{THft#2cD-x?Zt ztZlD85H)lkU|cb9+TFowCw@}gWWDnwJNL<1`*&}zUs%}1aeHQDspy9;B3q1nhR&zV zzH$0aFjG@m<5~Q@+4FH_hnAGgZV1IL*>;JV4oAbTgt@F*#EV@&Yzvm}%nOT&y94~+ zcl&G-cbkI9XBB$T*R-n6L<%Ks-@Vd&hDOziWfAx8#?nDgC+CQx8+TLGoMt8KC6_06 zmIcXLm*WURm!*wOmgl%kFo!VMV{D|YV;{cfjMb3OjbR&e+4s327Xb{tLVFnuf@FhGB8hosjJp&CAQ$A9H28UYO+MvPHd?O0bU}~yH z4K#?o!}S~*Tw9;7f(D>_Ps>4r2pNwLG>EWq6GDTCg>Wr2i12QI zf(DVa_!?*sQ6Qg#1`F(;`$2;ii<#WeAg;{rC^X21(9%GILuInw&|p9Y86hs54bSgHxWC#L(aib!h||Y{gO#skGoeAZyCrv^!TE2RxzJ$$*O-22Fl~$MDKzLrMEMpPteTU! z01aYzQolfh$SZnfXb=gg`VI{u8~z2*AVMVb&}8^(%9+;4ZiJXse=aZc|941 z2L1XQs-eLc^|1TUphwVG4QP<0zpMZnbP2APf(Fy*`C_0!YTQS5&>+FV{Tk39H7-*m zG)O@3P#7BYK)BYSK@w!)CNwyKwQLLxN}%5b0S(^6!IVRTYXsy2(4YYs(hm(fFdD|Vw1EZ@1-$}j5P5=#No^^%Fv)EPT*ABZZkFiYiB>Wm8`Fi9nopYIAELis z@c1xrYu88qMFXREX`6jll$&I>^39p|ai?XwWWq?=YMNu~R$7GkG`74oSr3Q$TtB(k zfzxy%(kHn*#v}Algd#St$#L5;jnhP)22Y*X-p&$n-Akz@XJ~4^e&DV3tB@pG+F6M# z7JmhkPBrS$;(a^^*XhJ8%xO)#lMm5OA`OX8@g`~)TJN#zJzpEvOjdc|Q8km=GM5|f za`^IrSQh16qbl47VTkweM+6tIP3qxEZfh5JeWWfyrRpMu#)uY;si5Mj_DhZ4Mhs&@ z0Xb`jpbh^fq209`Qo{YToEYJe1H77|W5?~5=K2Th2yLJ7Y9opL*3{k&m0#=arfKV< z#I~-ToI_%|Z0HChiFy2*J-J>wTpn!4eS!3Z#A1;%wTDqktSCqtzKe}M(uU9`5tFhA zn-6ljY+Upzj3*Q?@<6}TT8bqpBf_Lsl^~0&fuXmpe2yU0T>CNc&zBR!-`^%w#1OvM zW2&c($}oQ0eItV=l$`qk7BUs=T4?c-Ya zb6JhL(2ugFgb4C*#~&fI*qpWG_D?8I-IUoMjUWk96jN zWWyf&aPP^=5ZgIry?X>+6X;SQNCuaj0@sMyUq-uh3zzH@x-!5#^&>pQNa)e7=VzfQ zPslWbejOX}{^vC<=S?wkPul?WK71aH#j|`MZDna^y3JCvv4h@+527&(Nh(}*$^3E& zNo}XQ=zX{XjY(pFuX&6n6g@iZkf5 zrL5F%q;KhL<>IxFz)Iqdw??U9AiH4GBStWe!}+MPTcS_R{F_qURXWz17_-}q(d2Ss zb~7%CCK6Nl3bH=(Uthh(Dyeq1Vj=cEu^RUwdf%)1%G=7Z3y1VA@4YJ~E^G4L*DhPh zfjh}9QO+D^%{A0CD|eiFhTuc>wYy!OCI_hehQ)Y_=*4N@d`TYQ3+nnxdZ3{HJq9aH zaeJh8AzVzV%dryI<=}yHy2lREH&N7uJhf7BAt83a++;|U8_v2p#)e*nmB_l4>XK8sFV9|jeMBs%i}T=_?^%n}WI^vPk*AfXml#;& zmb7M4!iw8N?xZtaObF(4y`z-CXlt*+J|#)IKtC#Bd*{KCn%e@8?l*r{$n$rN9bYpk z5c#YqKUA+vB^wV7&L-NkLxT>t37ero4#8)Sput8)r!HvFDu-GT8pQG*E`|pA-}UZ5 zgNx&bIiSIK{?)J0pzu=pMQE_QtmYXsc<@7tJ2ZI6N_`9(q`Yr>2O6wp@79I}nKgP2 zK!ZhXgALH&^(K5vXmBE~V+}dOig|` z2MsFwp5=!IBd&57LW8dJ>L;PW+mHJwpuxM793P=U)*{MUXs}A8j2{{-{J?Vn8ob4v zkOB>cgdClL2CWa{2SI~A?Ci_XAh`_36==|X>Qo9eXtzwd4GoffV9taFx8enELW5%_ zY@X1d%c%xlXt1%+?g=#L)7gF+8r&`Wq5=&@`aFLD4W3$^5r+mZ+&rBR4XQk9?}Y}9 zpLJY?1`VS(OQFFx4K8cY;63-MB52S@sU`#()Czlx1r6@|q8A4Zo?~443JvR6cP!c3+N*iUTwVDrMkV{$ZZ7Yb zP-MD}fjR zaO83zZOz3~hIgJJE9$&A4t&;D8Dz|l7_B++>Ol6I$Lp}#qc4Vo;+ABI@>e_q{XFpk zY{bGz7Ar%}d)J%N<-0L7?dO@;)EG=KAvt~fkAynCT?U&I{GnEpw|J=FsAzJj85IVPw1^3VEzwkYGsc{DT z2}^qG!xbE>kJEtzR$TWLg_jF#es>dDs(~cNhzmeF84hX znYMem_fNdL*2kn#ki;%EoSkQfZ%EObFYLi5I-Z*TKK#JybPKgxa>g||wpB0h%XCYJ zo!?m{Vas(;3qev3*abb zFP$^5lofs5wbS$5tlCg~71_)pyLp=KsQZ}*YdqTn@>Z$%jd~+#t#o-e@jWBc)AK}c z*^q^*L?aLTP7RbY)P}5TM;*tQin=`*RNopRyFyo`tQlv9lSdj(de$&dLFda%CsX&W zSK7GO^@EEJuNM%krVQ;^O;7nh!{L)X8*F`^%Y|gLvq`$&GfW_;&hz659)`_y=Z3WB z1E`EK?@zPTdnTxOm>?)@uE_WoecV}E1i!^iApX4kYjPSQNx_ztVX}3*# zjr@tF27_U%I|4VaH;D*KI?NrWc2_=d00;jPi`>W^zt?YUxFyJrd;4O=U#H>fB-G!H z&zL`Bm|%QvjLdU!Z8urwXwW${>LN6_BcE6a4UQo_{Lo-(@~Rv(_~foDEi~AVzi0>z%Im6{LW2w% zb#u_*WqQ^$Xi!+fzaAQNeuDHugF8E3fzaS$2VMp=h!Bh#L4#ga4jj-RyW-3H&|s*Y zmkBgjJ9S(g8VnUU-UAIbpI9P-22)R!xB4-HD4 zy0HTd-c01Hga*@>bqb-u7YA*$ph5Z07JF#W+U3HyeTy3 zn=RcxduXuCJ#!lxoFH?K{LW6AO_j;khpdk+yXt0Omi!3yF^XQ9*&>+)_hZQuq7~Jv{8sys$GKL0w&ge2j zgV#u^S)suNUB^4npaqFx05qtY{jC5REI&=a4h^n1t=K|?G0WEwXz(Uwxf3*q<>lB4 z4Mx}GyF-I&HfIZY-kgL6afBXJLWA7?$3mb%|Jel$G&r2wkOU3l1nz`a2A+J} zzEBmDcJ2sQ$15wwqALW_uZ?PNN%{$9N;Q2nFOciY`p{n+Y-xT;*56dzu{S%y&E_o;K+Kph05uz zR2T_^mv%Cv_ha=FIz354)_2#t1Xj)^=w&^=t9wwiEZl{y<|~g5EBmx$qbHkV-=IZx zd1jO1*Xw7$(!SuxdDPyP&-nIwUt|YPK`S!*?s@5GKxG}zRX4kE`aY}YbnylHHs`%@ z>LOCZFEbyGc6Ugzopf>-)_gtpbGi*d^)Li(6e3LwjkEKH`hh zhl0=%vyJ!*R(%~?9wnNpb0UpyFJDwH2l!)OQ)1M!Q*n)E#J6vCNF(aFkRd8}l{{Tk zLGW8wiA%vNJ#Q>KJmnIkFZ~iLu4fllM-Vps(aUu0PlM@NY*HCh&g&knbeh|DjKJl3 z+{g6C)K0>Ec;$7jbquVuxSh#!Ej^j01NP#*n)k+EWbf-7qY1`Z$I^J#b#yo^_*31j z-jwd`c9RHKb-qVkukG`fdh~~>VFKyVoBnxc! zDEE3HxVxD#qC#Ns{B{wyp5h_X$4!M@14E^9Ir;B7o-Mp5*T4UrYFOELOhcVl;*O;6 z?fMBl(cuXJQN7@XW%sQLMx*DG(e5=v=~Bpe*STsDd4z<9h)(_#l6mEcs>v3&i5`Dn z_*DU$tD)x-Gy8%Y>Q>*_J{9_WG49#U=8~9VXW|_p{-gYef#g-2yW0HB%BxNeSYB+Y z&;1>*W{Isjo)+=C9+Z`xaj;`kHP$JvIHF)cS$)W7)&;DFaj&TO^Kr*e0t!E5|}onpscSbp4(1(YyTEa%CxlB6NJ^#yNYF3|Ld#67xrxH3vv!ZVu}_hG@Y*jG;ukKzX1J=w9~V$GG_FCkM} zWa6Z@A3IAYJ|Vw;+CTkBzTMF>w#2yW-A+gFpFSEWyhU@9j^X3zQZ2WM$`O(%?ZT9D z1A7ccZuukA$D`Vx59)l>6i}aZNQqG@GR>y4-ie&pA}7YXvBm7Ab#+vTEd&389VLym zOqm}vxZRU{1sd$<)o6hR@%bejp}|j@I(5(>9d|V$Gtdim9S=M#Xz+Mi2Ol&jVM8TL3#3Luc5(x8V{+VK~@vhL})M$3por8ej1>Rga&7~t(>93mbU&xXwcs28wMIw ziae144W13==7k2mY7#@CL09G@R?uKfFzEs`co|Rn3pALqKi~m0h_6wt1`RS#rXGO? zmkNApp}}`!8qGzJZZU(<4c26_4P?m>ezxpb1y zpze!nB+#I3ZBi*TXnB7$3L5k=dhi(<Nb|p zJfT7CAiid3uz5+%4I1qHh|L5I;!iK=LW5*cU+JMi1`^6ZXt4Z9`#Wfm#C`J>G|0NS zzyJ+?(mJ9G4a)AMT0n#Oq{i{kpyJeT`vC6Q@Fc|P$Zx3Z^MbgO6M(bE=n!DMR(Y))}rO+L;Sx}B>us9xOGis|B|XTJ7~ zQnamXuFPy)Hf3E*Wcb~cQNNfd{cTD`75S1o&x+e0mND59Xsd3G^;M<5daBZt<#n^~ zm={7P?jxGs=uBVQ_(G)V<~m&UkcSIUEx zLx#O36++2)h?R*>$FrxFmZf+P1`H9d?JrU<7}KPFpoVvSN<9nx9;Vbimd}hOofLEy_2KyS0S%|vslK@6w^3uSa3e5oefu?ne|}| z*R#qxN*WE4{yJO7LeUxS+RyKY`dMrfPt@^$yT)#An_g0t=D9>YR&9TE|1)yWf>gVj zqsS}UL#9lp*B*+8Q#@_gTO5i#BvVIvYk@+IN3M)I*+7x2FF$p3lX6KLck&eJW9gHo zE#1^T`A$)U8QlaQ!_#iWy5u%Re4`8^SZ;|pe1l^RlTNiAN_e4gOr%lGoU=jB{bAix z=|hW{VP9`;8{T~`oRx1*NuJ=7sr_8gJsY;YLgRd&_+w9KM51Eg{70QU&w?kV-EL=Z zTT2NG-ks6I&b!q^BK?T(kOB|ueR+b23h@sHmKApA)dY*3@J1svp+a_b?XKJ^F(H4Yn=YPd*&ozgmoKJ;rpt%-GZeuo_*oi zmUQK3o%;^5&`q0MZ10+CDBgcLHt%!q2Dzi73( z8TYis2Jh6(DNgQCO77Ft*P>3vJ7@7#HhB_QMFmGWQZR*TF*8^wCgRC|(>yvo+1Md* z&ptNjqxT)*H>CT&Q$#&hY^UDT-+kEj{Klh9LQ4E&_1cQmH9ZC#dN;z7&zw1ADQ8}+ zTz=QpQcRuF!TvN|#mkbZ&w>XQC@y*T4`kv~%cS199I$w}f(D;WRz%TT|E$~%i{oFK z+4ZN39TE*ymsi3vs#b5{zr2c>30BeJmDei!YIyM(=SJ3w_<jS2|t76 zv**dNDSbB%a@g?`)zE~zU3}o%@}01(Go}bjzt8PyqOs6P=MsG*yuO}PY9TSwy1oLL zFlcb(TlIBlu+p-#6B=|?+uDT&hw8IQph4U4jSy(iI43L>8Z0Ga&VUAMk~0FK!A;Fp zCuk7oBbGZfcqK%88yfs{`WY59SQB#j5j5z?iA?|v8d-<#K!c4Z5*DGs)K6>I9X=t$K z%g3Y8;C&q$J!tTKX*L5i*ghzn0}ZYQOPD}|pJX}Lp+R57?JG1`KEt#R8ssSx*$)k> z8neBD2B`?r=%B#}RfDV0V87uoFErTQLSqOG-Vl5g0}TpcofwA(@96PKK!e-tY(dbV zuz}4>Xwb$ic^n#~Ptvx52Ia~NN}$2RG8axmgW7BtiJ-yWysQLhFu%WOA2i6NN?QsI zK7C)o2MspLvEe|2hMXkz(4cd56B#t$KrRcmPQP(yw)G-&F9WJ7}{Tm}x% zV8B_ME@+UkK)wYU9E=pth6e4u&B~y`!w+WTpuz0PS$1g9sMLH68eEE^AA<&MPCvK` z4cck2J%I-6c@u-6!HRL`L1^&Qe7X@d$m2l!5gNSW=SBeyHeD5d0}WDFr)xrk1!s)Q zp+WTl;|XXmy9sLm8vORf)C?MY&wb+*G>BKu+y)JjZZdmAgH^}zXaWS{Dbs!9^v@2< ze`~jURP*N5OCAf0^}N3J?&|^R=h$OhEDkb#S5{l<#p-B|2~j#j!iOZ z&nqXJNPn6jJ$?+YoKzb7BHJ_mJkr}AdYyK^L>*&zCq6MB`|hR;b=l{2t_K(!!8~Q( zQ=+#^(i_6!1kcjlZzn3zFG1=qGdRhHpPZW$d&JaHqP;bA^ok=2c+Uf<3z zTr7HVyNWk`_+q$JGCj(?Jhz9N>rFo0f5E%8P3S_+#@(~_&V@xbp4mJ*UP%5{non)u z;YLCk9EKbVlV;Z;mL#ca+U+oJpY?;&;fQgfKnQW+@V5^>cUSc>gr8Me-7-GTwy;W= z^2D#S#@>!T$BqYF<2f8 zZsWH_zJDdXhpn1B`TSWSQ^{pB>iYAMDq4Yz{yz09K^YxQA08eMBuc5QNeJZD*nKA= z*+2PC(Bd;K!E=SDy@i_OMp!!`_j+p_w!acF=i`Sd?OwTI-o}%{QkJRT+uwe4n6Cbr zA6bH5k4VxZA-yiuLxR(|l}V-j1gBDLn9fz03sP#CJ|Ic-Yl<9`qs&t>Hc66-5WKq) z*KF)&n3AoW$ro|#u9irV1kR`EWMyv|*FL?j_jzGQjuBkJMPG!tkbS3kL9aL&D(g6aooQ}gY0l^WGrt#bpIh1-2Hfpy02yEsO2u42OdUR;?<)JS} zaC{8aHS}eozK7Sv!|NEB7QD{#uz7-$Z_+JEWWIE!^6MLt$}K&0C#9$fz1J}v)pRDd zt(;Ac%qQEpjQrI-?j1S1yo~=~b?SNbFk$B^HesXDoVLFT$<35FYc(nR-rxr+DmQiR z&E2XN@O%~?92~iI0_)^$igOw-tw^@4JF2@D%1?6+tCdGYMltBx3WQGI-FGxQ8gEYN z{+aR~nWRIXO_IMbR%CG)N{wc;Wo?)|<>Oj)c)1Z&)x|2n`Yl`PwlpCNKJ&u_MK+wd ziHVR@OsIeR``#Lv`v?4o>bAVOcUXoVFXwt6powA7JwG)gz;N*cMs%TqNRZn90wdh1xaJ3}C5^FI5&krgt zWzh1`-o?9Vlcu@h%*I!=)I0w`vpz!Ko)yPW`qoqq8?HY^gw*q526Q+1PFNa5Qq&l}QnCz=H+dlc? zkcBDL6pjRKeh|j;{e`;(H}q>%CoZo&Eq(ReHkwAHZ;2?yl7>$765la*A%@b2BQf!A zrfeEgA!TzJloPCrXP6j-tp;ZmKZ_#nopFXnXFufiQk$>q`tXI)J)KKEdca;caUL3^ zxrvNHgPghV`Jus>#hq4Ykh5386dKgk5etI`nd34Fp+S8!qEKis^BzwuH26?#mmV7Y zKHlI14T|nJPlpEY6|4C}gKH7(1km7QWX)-4@a;THQ2r z(BK;uL}gZ`(~R zL4#`Y!LH0WpW zwGkQ=hz_EG25)syutI|dK^i;IVEqaAO=z(El=>@ZkmIs>G&I;HC#44sdeWvWK!f_$ zkFcP@mt6}dp+P4T-D+s?M7yIYG$_Kxxl@%DR+-!)Gk1H7;k3l8OnTi$;=XVU$iciAY4NZm;3wZmDa)y(vn z4tiI&N<0yn!iTP(AFA10Hn?FG{-ZKA5(%P&z;$*fDczEXFQ9O55LxS$CmrKY_1tpbL zC2RV0YHKWyCVh>FZ)m?Mcm`)Y--h+jo6#Uo=Ss@H7ZSz%#>~W1A;JeQ-^NmU(!O?d z&e?C?lsM*M#D1^$5{rs5Uk%oTa1P-1y!O{r#>q=;^eAyOHc~ws|ANxSaPCZy|K^wR z%{csOwQkq;#nR<&L5?B_UAQT(@N5`z&R$HumVHi92LR~oFX4Ix(P z%F82s(&kc5!&FpnenmI?+gJn}KL3>6l|^f#X^-P4bzJHF?Yrf1#aUurG_;iwRYx!~ z#5spwdhr~8h1>bDg~wSzG6shckF)Zw1fOp{AL;VQC7i)}Abiw$(RyaxS?luKRPCCw zt;iq>y(S~p$Vzc7%!#&X`T?yKoC#8_CNIO&%o3-Zm}qgFE*)sAc~Ly_St6d|mRnyi zE-AmM!{mpcrPmdO3+>}uAG8%hxQ*KtdWJukHFO5lybHhCm|NaMexjB$v{3+4DS<0m zadZ*mO16Kap!yu!-G{hX{teOf;hF)eTJP)h-SAohC&?d*OnsJ#=y~KraB;P^;NJ3J zb_u8Ag~YT0A0*&;Oqk|WMDKy3OxaMevDb?^uJ{3leQG!rx%3L#ZmEW(+Tm5LuQs{a z1y3*wUk`o6tbFjBRY;S%wC=I4tK`%i$HaRq9)AhDQYFnKa)m%ZeQdtdES7z4JAe5> z0mHOEt&q6Y=#lHr!%t#0qMRdY}JEusv#k9r>|H|e1DnjL?sqPYDc_7q+j{vQdG75rZdC* zgXee=FR=Wyzb#%0PiKC0qo`a#srU@B$s>Hfl(=_s8t0Xt>*o1(lnyeHs1-Y8-u}#< zYrV3AQ;PTr?OYDOR$=0eZ(21zN2S3eDlal7hmS0ty}s!eH?Z5eCMc!cP^VhQym4Oj zLCyO!G9nL3xyYmWHkL~YMzOrVGO8Q0wG|Hf2NWI=3%D9hw!iMu&6lL~jl%-ih>eW9 zy?2kW)914#-@7Hr537zb^vYPueVi$?l=m7qFMR)5yRxK2^|f!@*-ND6r)1|xH2lAD zeTpxmWSkc1lX}$KG-7tMms`FqYdc|8-qn8avk&!M;ppz#%S3~dk!pRis(8tl-AZzl zst26oBSdUs9;kJ_rEDOulyyxU$1}JjrSjsEsd=9OduTc!0I4n+OfwvI5LvO|MQ+=wDH_?>~A4jNRT#P)#(u`clhL4$L?x>upW%Ciy6&>)dAb z8nhFtdjSo4X}+0)26t91hoHgPk~cxnAnAHvHZ-VA_@oK4Z&|pvY<6>yAA$$SgECe)&8OG^p7< zbru@@E9sb{pv~L_9yC}Q#FPLH7RacJLW8Q$a~?y32dTc}K!f8# z2b!V5=u?%}(4bY$O(AITSx>|cG*}Q*mJ1D1ld2m)gJ(Jz)1bk;3PuWO@TIEE3usXB zWm`8i7*C`43>swn`Zxj_6v@#Lg$AYEu?eBUyVTwC&>$;G;(ln*{~k^@G+2_dUJDJr zd=?r74L;&InhOnDk}~Z;gF|NL`=G)2-0auTptXX-V`#AAfT;*Hcu8!o5gPQnbFUa0 zR2Cg2h6Xu}Q@5bOh{6&sXt0M(H4_@Vypr)A8sx)HItLBvdMrsmgRgu9BA`K>Nr9Wt z;A}v{7&K@kPSy(zYJ{^y?261+Tu^ zUp!evk)qMFbk|Gn#iXFmJ~u{#4u5v9E}v?~;azd(!jX_G@gD9aks=Hh%a&jCaSwGl zZ$0dHTL^jDu=w2Z(nkF~&nM{t#bsynv57wU^*ax;1s}r_Gs{i-HtEAx)5vK-9GkH z@2)Do-zXe6nRrlMDRSQ><~^@7ar&k@_UQw!E)}b;XM6HFInD(&^_VZS4`A1vDL<0-C`K2q`!p^fE zVr{pb&b)trs8!Fgm3&f6fxqCweKJ$B(JU)J=eBPaHG^*&#zJpp-2U>;>&l0H`2m=7 zhrY#n_b8+nIy2Xa5LKEVexA{$tz+0{@lcfBQC3& zO+DjD%=3BRcunND!V>YyPu#Z_w!TKKi_t{Ic2yuJ`?X;`oDM%zhFVw%Ey zG&5ej?6FMO^04RA*4Jz;4<<=>Ov*eo4**!9g<(QS%5p!_qHOiIQ* zwLO_9MT6YC70yi=xHb5A1{ggnBp;Kk*@uOpaqD;d>#W#LM>!?s4L*HdZlNWf-(-6y`|2X6 zOl@F#0tvlTog;Ush4Z?KU{99)XEH8(`vIe+>$)@tIW3Ta{TW?t*B!5GZhzi)W8q5H zWy=pf3QY%Vy>nE)x(EfAu(?JDHQwn=Z&w>0KXgdDPS0XW!`Ilj(9!J}r{9;nG4K67 z)*Seo1`0~Kb9lGe?i5eTc1l;&s1{!NV5W1GGT^l25QAjcN-35OE!PE8nXBU)S16b< zdUdu(y1$NT#5$W4S=t0yM5nC3VOBaTN^~aE@La#7PTq;pWJ^t<6zx8u3!2mR@7+`> z__FWy&btL{lezL&;m67{n9}>Lt4m8@r#aGaerW5`9^jq5+H&!0txuTYY5#M*pPBR0 zOFV+RbH1qsS3Kg7kfMICA7V3Fy-}ocnXjzQvC%<~2-oXl;rOKTGa3ic?m!R6tE`)I zCU=RVmf0y!#-3HVB@CA8=@AxG|3tM@0Nw=swLN9ul@#OP#W%mqurzqFkV^7EoT4DkK5?rch&spdxLzXv5Vv> z=h7<2jR;na?WCU$>K$D=^|4twt)dza|GZ9OepIz}+WF6q4Fp)6=g)OfL4yiQOk~jD zWBXoGXi&z>?=>_i!s>Dd8l+Ra$U&{%L4XuijV|8nmpk34jK1(~l5AgUMl0Q_vtq1HUUY z7%Wqq4-IN?46Qz6K3OAI4LJ277C(oS?z^CwTjz!HwcMQfN>?#KRsM>={{=h6ddNH~pYN655>e z&|u?1-W6z&TlR({G?<<1ObHFn+>ZMM4d$)s2SI~hZVVMcgYs8IuR??AyU}H3X zDKvP&fABCgC{f;I0}Z~>qPqtT@`hGjfCh;dS}@Syn`f32(BSK{4cpLQn5GCNG^iO# zlLrk7nq9Mp2CE;62||NzCx&dG!KV9H=b*vJc-=^7uymC+3>qYsSvd?1l6+_4f(BiB z&DWs8s?x>~Xpj--{Vp_^y2xJ$4HhQeuZIRr1j24WgYhjj+0ft^YuYnt(C|iE0yOye zyhtQ8czU(-88mo|%aair)PG|C0UE5)Fe8Hou~~4v*c@Ap$V82g@?;}h3_}x%A(uK^ zj2}iGZhAeQ>VQ}HNt9x(-z%8k<<%LcmF}2l`3GO$?w9&Xpndkc6oKEld5_%Tq44+L zniF3>EVi8KXuoDkFPqocRrqFuVfwOYamKk)+4vT!(K-Be9TmAet#kUZhgwe&?4O!! z)0|5;)gdw4ynf;i?s>-kTT8{?Uhqd%ol1{+uGJY&@8=XDogu3fpOK?Iy>EtZN#Lsf zL6@^3ZW)f{Dvzj}63;1nTwNAU+b&QkrQg4NHN}DTlem3%25r=BvC`b@#kx*oAK#=6 zJ|XZaEM*mHNhV-AD10`ooWtTRvv~Trz?C{3-ZHaiHW}HnC7IbGD_b_%viI|UeLdgd z_v*gxbB?3!3}rKl?$-Im>7wlF^}zm939RVQBkn&p4~WrOIY?XR`K4&Mi}%J!36e7|V| zCweW=!q>z@6CbkcGiTXvrr3Ar*A$ks_}*dZWi(ovoc~p6!dARTRc8_DWmz&$`Sw2c zucDt48h2T}` zKZ4h{Zmk)XrwiZN&@${kP=rxB8K9WgZF5F+V7T} zW%-d$;L0k(booqb!PM+icA`I$%gyWXz;X=Lz@f*37a4P-*SWtRWy-bSF$S3loSuyy zDIMqd^%f^<*Tu)AC3dJw82eUtNwW!=#S(sd-SoMt!K_8g;-EfYt!7&BC?O0@zVHEy zf`)VAyUWH?wD5?m#uP#YAp&JCM}dpg*QvY}4q0D19eB;&VpA2`ncFMS+~^WJ-hCgX z*KJ2j?!PR3_pF)kN9gf#t&*fTQq!ZjU4)f~R@fMSoc`V$4AfVYSicedMqW%Jha5b- zbK&@~VL0s_oxqu1%Chiuqov!G1RZvbF5YD6c$w>qi(%AFL>#2-3D$GD4PDWw?_ZBA zm3JqMU2=C`C)jO%2$Vb{?V$}_H++CPZ;4Q=)_G7LSIuLf>eGl{_tK^^n(a|>>=SwR ziWjmOZpYSFIL9*B; zlka7DBIW~~?MpX{*z<}WHnV(Ya$*^_%5(I7Epf>EDwlN|qf3u9fspyXAD+TBQQtqk z*X(mdS$%I*m?D3%_A2MzK(?97D* zXTAh1LxYp|Mv|dHN$ue)Xpp*eo&p+Va$#kL2Bm$&y`e#!hx>WZAiG8CAT)?`$r=m| zPENR^LxYA>?+&0rT$N03XfP_qY5*E^99WBo20u<ZV02$psuW}Ff^D+D(%PiWM{{itE`64VGs=_JRiE8P`IgL2UoW)zF~QEMg=y zNFTV}3=KXGZIp%vi>-#Np}`h&!&qoA)Jo0}8eHPxK7j@+tT2Y5!J<2oCTNfuo4pts zBwCphga)OPY*wMc-FHXeiqdppZ}ph09xp>k+&{xi!vXwaf+q#GJ!9_?L%2Hz|Eii8G#)Bekc z2EXwon?r-oFI69ju{FxI73Z%9~#s;5x9W{)l(ejpuy_GU+d7|*K3X; zXmDU!AsreVz)$!G4LW5YeS`+xjksjpbKTDKKQpOqF79R?OQQuo32g}A+V&GH{y4kX zC1&8p@NuapkLA{lVkIK-Zvt6FQny*82rJ)x!qA>a!bbXsLnU6CJg5d<6V8?hJe|3! zV@C5ag^vra?e*H?)$buKGf z-J$xJq9x5#$9MF7X4wfU228yx+H2|ujIX$VgH$R|CX#1ACUY^eRH{HG>Hi!G-vv!5GJ7uFZ!R8p*9 zIWjbdphxZ({#`r>`-I%JEd3-~q1N(wPbcnOhe*nMFK@R%{9iMVlT;_^5q>KD9z%1b zMefl2dFnXmyDryT;)Kq3K~xqMv*P7|AG*{SrL03K`O{f|ge+6dVn4iLlB8%u08^xa z_s~#Fz&q{7`7+18&PcgVu2i$7+D{v!hR>XakKQ1b>@Dt-1aW#=^S-c5ZK**(`Q1Mm zjr8e0*K(iuoIlt<+y&M5Ok7RObpBX4RC5JNqXZY%{;=hI#W9*BtiF7< zccQc=j@_~?^Qvos#c8(@XCoN#pii;ZG^Ki%aU}Zjzdk-D=3kh*w`uY2#S4sUVVUG_ zMG-Y#1*UVy#bUH2@YaT(h2E9tPs%I)a&eXWwCVE8)k&>5;Jt8QBh{2{ScJA`%>DGz zn*#&HLcUi2M`B+V)Uj{J(7ySrnos2V=x^HNC+H6Sj4Y%cq__^IIj}Kt7Q%QC8SegO zY`NEj=d0KmrpG!fK~Jutv~1UBgVmK{-bFM@{^HjAOr2EkSlS{5mp>!j@3N3i*4oTR zW&DMjVq3#)@7Wn`W>vIFK|V_H*2PM&&QYVj(L{e>!1xP#akcm0O@@GWzsMwIc3_+k zVtvj+&g;Kq(k^CN$QM|9I}}lp+p9Z;9=;Ioe~%wGd_a`w?eR;I;h_kB z`=TD^X^5kh5|wZm>dNP*-?~{Ef2DOx|9v%06=p1ilT6XTBlvQDkMa%0J7(qfdGAnk zhZ}eQuk+dW*pBP{dU|+%BA~10JYzE_9ZeKyHVD5!&AsuUWMUyyY?S#c^+t>~`$2WCC)>rYIQX6T!L;tKmeKl46O8gyp7l5u@@8{rV^ zB`g%->rUNY(`L}tc`lJB(Wm{DWH~3%W4ymF$FGs=luaD09t9K~_!epF39?-bB z&Nt6leJWz0%86L`BmAnf=W${90W^3OV-Nui`Z=lCL4(c@^`1h567%+#&>*`zUnVq& zfrfz&4O;EAvO|LpFkbXRga4k(zl8?l$lME{LA>o1258V_jj9J4ui(g$Dgp9yCLP zv8R7ipur&gO?GIIecLGx8kA_T!-fVgTMLMxK|M~(EokrtALTnV_;lAn1scpk54VH{ zO_p?;p}{gm@@!~OZep$-8hn0?zyS@?j9g$rgIEevx6ojg{n9ct*fq|T4Gr!EQ;tD{ zrhbFpp}`F!26kwW!bi9h8oXsrc83Pvi!tm%gDB)bVXd>roC3 z+F+6pK!c(5`$N#6R&4Y!G?=3zQ3(yME+j%z7!kO|T8k$db1#1!7$Uoql zFMRo%hG?sKRMJh)8AZ15H=o`8c5XV7C^F4Fxy%s9Rb%JY3GK0UCaTlZS6RfPXxlf+ zMPhoCdUMf{`I_BT18&zz(s}vzM#!|@rGCvH10Nbcb{@mscsSXgzc3h>U(|tC&go)t zW!<@mShgPRf;v;;6{YdLa%I^}95|64e)Wj1FH+?ziz z52JDETHDp{H^q8`9%ZyAh?Vf@*rzvFLGOt za#pGgbKNL$|I%121>_)4?Ck{S?A;L-oJxMtmJvG6NVB7B{bS!}OQPyFX~^$Ok&Lc5 z;eCF2Cr^MNzJq+%Liy1j{auo<;nzDL|v0D7g zR%U01#<-eg7JG!~$kJ9Di^o!+Y(%+Z4{UXiAR{i4rNerxp;*MoW!x(?7~z zaA!p){}(VJuA81BsCsMr#m?*>OK!VX`}-}*zs+TSf90k%$#NfMH(Q;K&6=Mrp92apu!tkBG)|)5gF;XeFgft zf}8F~sF5{!ujKx+Jm;zXK4z$Ie%k9_xm#QqYh17vNx*-eNj9ctd^Fz9kd7Bf+kNxj z1ZRI9mCHBI#JAXI0n$}G`=NQP)-{sCL|IR;1lIUJeBj15$gFjfRaVmXjP?H$cPj8q z*>FULh_3#4v+zj&@=P-eRW!Tsn=nOh-@l!kRGX=w06YaNW!(0n2(@gpAcKUA@5k?? z-zOGw2YGp2buC!2<|=BusH{Spp!{B9F6Q=Tw$W#m7>`eoUzU(pR~gfjT<_i+t~W}E zdxxVlei?50hDzIS_&uM-%j1*o-s+FFa{!_ zkRh~(TKHt&BF#&v<7D7@Gw3qR3#Jrdrp~S@^@<*CJ^Am3NurRs=yArt;p7xVksGch zkbhaug`8985`PyaqyDR3u!wqQvkkJ^6ZH z?YypGqU1bZ%-JK;gs3;|SOV#Io- z>?P2i;=a;^GGQDQhP7hxc~CaBM^{jLw;wru%fgP4U`J?sb?$v%ymCa90M)R&i=HVo z_+jx$Gc?$rI^F^ehP)ncg9a<8vp+$DV>Kd((BRd>t5ax@qJm%y8a$t?X@Lea1j&V< zLDRT5X3*fj4lX@tP)i{G1RAv8&Ax#Kb=*!-p+UaCmdVgyh&%r@G{|j%^a2`OEXz!S z2HU=*n?r+VFARpE!5S{lN6=ug>$)H`=rzh70uAmC8Tdkj;c+cF&>*J-M;A1xZ2z7e z8my1$^o0hy)bOjJ!B6)DzCnZ37w?py!N2y0%+TOzR6IH~SeT$V_k+HM zK!c3maMqx~q{+yBXz;>$hz1&bIj$}W4Tf%gmxcz}^}@BF!BV{fMQHFb@jwDJ$U7u{ z1Px-41-^g=@0?s}puyK$Iylha*)dvl_mg~eqgH7`ZzR+M?SHd1NSeRib z4-GE;wkL-MeLqjBK!ZkyCd|;FoP7*BH0bA883+xI5urOkgZlS!xS&BMi%;#)pw7eC zTWByKxO4#;{5@ei3l094ecOQsm&=nGph0TO&24CqMh?#k8q5^JWQ7Ksn?w4b!McFo zcF^DeIS(>471(4Y?`hZ;2a2dhOM8Z;lCYK8{KUVZh01|1?q zqo6^BcEdAhP`LYw2^y3;#X*Gzky>k0ph0m3Gg4@$q>f7?1YfzbL?>hvcUE;N##W6qyH@1^_|GG<|ek%w5K z=EwSucVAMo?fBY0z(4Krz;s5hhP?Em-Oi5q@lQOg=fCH_d4BKTaNa$}%9(UEJ9+Ev zJ1Mz~dnBCxR5|XZW#NC~yZSV*Gh#mn&gJM`oiHsEk9>JNH75Oe;cV#uvAD`o6V( zNYK3|8GW+C1*M%o!5RPXGtvHxX1=@m$=WXrIwJ)5NAdE=2~P$kCJ=i8{#>D5~% zV`Wcop;3X40^10_Tp~8h$P#$iw{*IkPuCi0=k&)E`SChEiRB(|EGj5}ji@o($-PiGoR=bjy@P_oB`3^XWfQbif-GeJ^#9jcnd)$23kgFgKgM8DSR z9+j-MJUZQ^qU8CCQz@e_GsORIvmv56VWDiCiyC(tEx&et>_;bZ)u(~)hpq_~CSj4< z1V4zsdzaLW1`it%F8REkY8oHF2$4=#Zohmo(NQ_UmhxX^DsP&GW5KQc?J37@v@7ckYk8jD%DflDKVE4r$T-pY$sJ8S+FGrqqj&0;a@ zb^aEP+iMRRzMb6DZ>+-3SX6- zmau55-3T}H4f}q(-P6L~aW8ge6*5X<`N+)k&*Xj>IcWo3whr#O?%`9H($+6+nU1L3 zT;zgy8%yzvlp?>Fv?Sv;I@}_86g&{A=d^2Uq={7DmVSt7sLpC!pY$iUpFNMOHrZ>n zo{!X6WPiZFx)?-?N0&QbYg& zG}s+0W(N%xrLvAggVW^(hR`5xN8d0s*h`k`3=MW1MwLT@s`Bx_p+Rk7%3EmAJLsVS zH29TV>pnCXohms74I++^o{Y-QHH z2MtbKJYa_gFAm!bp}|8cv1DlQB;bK2G$^cdqyP<0D1Wbq1~tAhAwh%OWTm>$U>LdY zDKtnmkE9L_e%6#uh6dUH%v?c(QE8Qbpg~oBdOT?GA$iYJXz(B#hYT8g*NiCy4GN1M zbwYzX{almKAkPy4HfV5nMoAYM+{!Xvfd*r{_iLa*dDLSdlk8C!B(4dVBYXdY`anD8)8gz2` zr3nr8{45lO2Az{%e}e|G+ZjGUgB^QxH zWm7?eT@DM?(BPvM#wloUvO_is8cZ;s355pVDBJKsgD5r1(a>NmW9|tws7Uj?5*qa6 zenJin7E`PqK!ce#?v2nOauw0hZm^b{n-Oc@oCuAI{CA;i{rt1&7=xX>X6?$T=gv!Y z3I`Gu;nBv#!unG}n@m{7evXQAu8x$b*Kz-%kEdEitI|BNFsrW9t9WkgoOBv(Oxar( z$BSJsXkKP`W3Auc`=K@)*+JmlI4(ACC8G7Zw&+4DB0KI22JKZR4%%OviZzbgHGwVL zz$0}_at|_o-*Wc3B$?7Ot)Y-PQ}5P_i`Rp$hF`Cxeq%7k(2nHSAx8YoBa@5`{e`%7 zNh&NC{WF5nok#rPQ7|C}%GH3@u2Agv1MN@s?fnPM7nu5NiIl}ATH18ifgFtTRX!oQ zwbos`0<&V5MGjmdmk9Qo?Roja_k314g^VtksV$dKiH5)4- z(f4o1X9&6M(_Us!go=d}$s!R}as5#P`ka`?=UE*`~4= z@27-GYT6nebNl9641%*nm2VV(3ws77KmQy?*%S25eG!C`;PdhP+RW^q_!6EYs-QiV z+pK$@wOH7bYfs*oS$ZM16*8HpqKT7NJRXj667;^hiEbZm(>9?lEZAc|UNNdzpZ9?Cb!K0~)-FALEj`K>3m zggj|IPAnp<(dRdM+DI;~F((|D$1_}`w-y9qs3Uwpqx>9f^IqVR&j}p-8otI`LlT{h zMREV4$g=5h;*qpx3XD$;dHpa}Zs^pKKbD|BA`a;b-o;n7Mf71%W8L4WNGy0?>D^EL z;dd%0i_Gskx|{q*cnDDqCQ-+pc?vNmANi;B7RLy6c+N(!hZ86ZOF7gebeAv7B#y4Q zLdApREctcwDXd0aDwOa%)ZS1138A4sVTg~L4!w{4Ga>Me2WeFr3*PtvlN*~lmaAX| z_E*i#{zSjCmz8J6dRDu&+52g7XsL=1X*2iOdh%Z^iG|(V3`I8*%iGroS2E)S6t4?( zyg6t^Hcrd_P|2cO*`v@<{Ko8g($E6se>MKDj3~kPktOU4*8P-uEPBWhD_%rgd!0~J z^@=JfoJx@*y*suq=gqqZ4Qkw6y@UqWzTC%$23f5HS)sw>k)cv(u%i0a2sCJjX3_}_ z8c+<8K!ZA*enHTn{8ZI8G`LsWN&yX8Z`o2ngIPVQkNt;d~*s7 z@|BR6LW4DZbD7X!aCKfCG}z2y76%Pd(D=NE1}Ru@n4!UggwN{GU}@209yCZM(UA!a z{zc$og$5(olnJ3h4YC0?XmH`)eR^oHgk>Ta8r1%x-2x5Pk@LNP2HT#IDMN!y=62tq z!749BT4<2tkbMst{7e@Y1r6?^)z?CUaSG~2(4bMTQ5-bbGs;yB4bngPhXoBL=si+^ z1`qYAW}v~O?7jEUpzS&R88le17>W)JnwPyXhXz@hBu1gZ%8fQ7Xb{8RXaO2T<1n~} z1|tv! zLW4-ZQ?Z~y*EsL*&|rPg2Ulot`g5rzG{~D2-2@G8=HY}ugWcjtjnJT}YL^`}XgHvj zK&$x{EnV9<1J|tn2Jn{# zUHdjTQt?1ii39)h?+tOj!r1ioD*|@wVZ`)p(L_bsKzA~mf07aS9!1)u`5Z)2gxX?8 z|19o>g}mQ=&F~7v+ob%{$-OP&zFPd(j&6S#vit4`;~zJ8`m;5K_&MGf;FV2PI2hf{ zXAr)c)|kmeKR{5c7N>g06C)+@;5SQee^Q5z@rU5zT$y2}{=aE!JGamo5yf0U~FvS+#!0CU!Y229jf%wBanhVkR)CbjzQA|lnZ|B@y@J&A$(zk62 z4-q`c8IPc+%NlUKWLVczW>K54#$INku=><}7p{|KWNqv5F-H1f*NAGD2Xpbk>@5ez zMsSV1UR)HVSyws5m#Eo#md5L^IZqPVe18_}f5^~Ij+|<{eM@;8pfSXwD1_ZQj$LYG zy;&W2m!`Uu7e{T&RsORkm*!+^OWH#~aA@ZsN%+yk<| zwohI-Xg7WwdS$f{DEd75FY&E6s_TuRB94F~mDJCJ6dE4=i?lPb@R07_dMfD#=B;^Z zDd%~+J+@B+W2d8>W^UShd7h-(^C~MptyM%`w_8zBTK>tXPdLd`e*KjRyN+)U`;lAX zxfXU22kF@AUgEjq>rJci2Cg&(@A1s=SR?7Sdn!}UdhpqpC93H=St3bGrgTH6SEV0% zR)s#7-iO+j}-nrkTZlLM@?Hj8Ymr9{=sQ-UyB(#a! z_lJG>lIku`ig3ckQ_&K2B?3daol~UT_k9gjf=66Vh_kQnQ7c$&^6ydbu48EOi04ap zIS3r#Z4ew_GrjtWYP@)neK|Z<_72ZVf-m$7&N$+9{A$b8OQ)ZNzZrW<-?;yA+2>;6 zjShQ>wzQL5fsaq_MWF2MhnUA{Oqp`VZRa}q_M?rmFg=Fx9IR#ACv-BxV$Bt1Ho2ghS03UoU? zR)hgNvGH0JFPh78sff`+RS#C zy2W4;LxYt!{fN-u6KXseXwW2;7Z(~l+jgvh2K6}?FQ7q|xg{oO&=Gsw2^wrN+?9X^ z>lu_{ph1nAc7ABEYxK7>G-&7PjRy^e&oXO5gXn5QhtS|)>9!s;h|jM)0S#t^FzZ8u z*(8KtpuwHilqF~oMR4#88pP;QpoIo&**f!~!4dIT3uv(R=12@0)Dru*1P$u&#!y3p z-#UFZpuzfs{3K}bzx?0@G&sc&j{yyO(~FcqgLKs?ve2No<_|Pzu`bA-*KsQr&|vC;NE#2ANe?457iaOOb!jAZA~k8Z?Mh*{}}{ zc3(Ych6WWU8MmN8m-2mTXmE)tb`=_=H>41S22;!^q@Y1HlgoS1AhnIu9yAy?BHsiJ z@+oYXyd}b624R$O%^oIsRpYmHl zgYSbcN1;IzK!cYEWiHU*Of{t)G?;QMJq!)HZdGAH zgO7y8eWAg-6!HjYQ0Mb%Cp4H-NTmV|=B0CxK!c>CX6?|R-|@##Xz=i6JqsFKp5U#4 z2D5IHZlOUl9NI8wP}k+c0vZf;ZHj~jAF%T6LW6HLb#?z>7-yfOMy@RErBz!x@yadV znC%k@Jr&(61#@j@#$-q#r(oVaXD^L2DF|JN7to6to5|h`hF*0|FjU&W%FnmdA22? zXrMbZ{5?uJ5~mq?rN59vk!)^G@rOtu0GZzApc@sx$oZjo$r)GFqm{W=cCWcZ+0gzF z&EGLaabPy3$a~n5W04Aebrf4qbcUm1+)sVEheZEhu1hz~WvPUoJA82X`(59#p=dQPe zK0U@Kc_;9^k0rS+@&c*u9Rayl`aZ8F|H4l`bTviM?h5&;(Wfj~CC^@0Q+*_jKV&E; zar`tNO=oQ#w3=bRxK6}y^6fE4{P>TS7VMu`#=Q9-i{~V_vyTGwkRR$l9DiteEu8N6 zD1p`@{)^o0-#nIaYFF*NzhAiDGb>bt^GHRFi&_2{6=q8&cy&#debpi)HPLNecjDr{ z>n7c$Va%xQ7%wkylbdNx$n93hp0gy87f>2FEAQYSQ)d4-rPp;;ckf4kEbTwt=X^Gy zRsE+Q>-1jv=Y7U=OQSr+q>i{86c3SmGa#oTPaDf7gFy0~hC&Z*#iaSuQkk_mnO&=> zUCN~WecPGoyFQiCbA1BUtDFCpKAs=+E}>B63%hUpi|5lD$1IcXqDd{*IQ;c6azc_^ z+&k#41AVXTJ3tvQ;oopQ?jp!v3uq?SM;E=giOYC$XJVE3b~_n12wR*gk3&zzoT z+`Hi@F&kv5u8r}sWf=uc&Lc##SzH+n%v^){oY8#8I|HdWwnvQ7(c9< z9p^w2{_l2Lr?_3iB+gdKytN*^j3a+!gL|@=p5b!T?{|z-%gOR{a8%0G@vf&ff+O#%u9cNcR~X+puspFLjzJPU-Aihq>bqM|s$tbN8C^xD zYYyJfBH;Y50V_>6$UUXM>sVs8vi>SPy>6~K^M(4-{?nPn!O08KN4H8?~gGx{7LKXaMijl4pbo#e% zr98zAu1DKW?wlEN=Hk_HaxsdM@Cd(%i~Y(p@LH12s&c_l{CJOQ`yI9wi_#?1JHg-> z{5f*z8utF>*f8!8U3X>t)7-#lnA ziRDw4GX)KbyL;k5g9xrSuc1MC5$7prFjz2p5*lI!DY{@F=#L^46g*A6LL)TDTh{6a4c@o%se}fvD>aFrLCo|^GiZ>HkEjhAyf3fi3Jp@AomNAG zv5g-Bph4F#d|YUd??~1X8svyai-iWY1g3#dR-;p+G@R?#$1vH3cf6)gG z=JW>4!Bm zxD{rw0S$gCv1f+{k96Hopuzi!Tm8_W8FiiwG&o%QW*r(Nsg00;234XYvZ29{-V8Tr zP;)CK5gH7yU-pIu-}?w#K!bk{Gs2+3maBzDXm9}2FCQ8dNvbn|1_Ld+kD)O-?A?wpkGabPw-;!Az^sa_)38P$TU*XcSlk`o^2f-``b_O=`BEHrcWIEcd4o}O;Mx7(%Zk+& z2Uv0yy{)*N8x-W0ovmow!=LI`aj^+Hg1e5?i^gextq(;_^JP< z8x$HlR`0G1WaP2l<$%kW!SVzTIJqw}FS{v;@rnH?Mld<{Jr6(l?*t{6)*%BpdCBA;eziV~p z?r+@ONz1hG=e@=*?$F6Kfdz-?Q^V~SOwFRIAFJ{r!<$Nz(*i#XFYLYSW6$PO=zJVN zo!R6vc$Q%4D^4z*Nvc#j`lrh1jkCh5rXTJIOpS}ArsvfQfyQSC&myn?S#-H$ggv;CRtDV>J_{we_i6Oq#|_EqxOnTP|QGuyE>FDz$N9VxDthhi)2D7 zP4CNe8YyvI87?b#YT)WrRZ;p&qV+KE?zR|ZzJnznj{JUPm)MsM`8&_{2|K-c+bX;b zwrR9+?tWi+=v2s_(0@bt^Fc*4 zlSYL~Co*^Miqy+eu2sx1j(x4+MG1lfwEQqOmaB_H8{(qR|Hk9PRH{=1=)bO3|8!b+ z|5_2iMWL>+vlG63OMh}=!$TLR`f>im$E-69$@Flrv07t93hOV6&T3K?xl*tCj=bvY z*q*psQdXi#4@7*9O93N+PI`LjtRFMIrq%gRboFEjr&C8hn~RZFM86WVpGFQan`&jC4~5PNnNTtiO=Ml=4_klYc{V!q%R*MN&Aj0qsg2$Zu+0y;i>-h zh-LTN|8Gmu18=yjfY1sWRR8cd78=w*V&8`b?>?ROLxVp?7m1-k2~|5kXpnCp85 z=L@&9&>&?K!xS|5R_UPuGsx40(ocQ{8f?WZtAGZ%ernr5 zgF6JtR?y&p`BP75aNW!R7aBB<*<6DL^`bv$L4$8npPfO2H7G&k(BMxcZbN8LH@ia^ z8YHKTe+CWy%hAPv2DRnaTcE*pqBk?ppzMN95Hxs5r~DKeOzhPof(FMPu`5A?|4pQt zK!eRPL+j9B+uWTJG$`<+aT^-^lz^hh=K-l80sgX!B2vk($L`MXQ?4*@LhAS z5;Rz1W$FqIwwq4VK!Z2gmZs3)#=%|`G??j8B@YcIY~7SWgZ-<;ve2OG_x5XOa6e8v z1sd!r`92H{uAk|dK!bB+Gc(ZO<_ldnXz$vqWYph4ZEhx^bV3;u~AG}y(V zE&~l-Z3ON^gX=Aco6w*^@x#~9Ag;+(H#BJJu($*b5|D?6K!YEiU(Z2tvz9!I*TQ~i>MJ}ZgE-7Uq?Z1&cCP1InV;sd zyt((_%4dV={z4<^jtYUGGtu6ncW&pqr}r%=iGuLDDeAI!1A->(C2F_zJ(to^g$iRx zMp%A&dA5JXd1h+9j>M9+Cg*S@`f|#pXb)nviOs%PkY)2KhV)m{qvZfKxROU;eRmL`dTgVci5{uCS#nc>I}0e z3lhrX<4gvR0Xw}_k?-=V{mt7PVQ1_GxtlyZN;Wm)ip`p`yMlXSu1S$9e1)Voh`Zd4tEr&8D4PSm7+h%L0{FBRQV4dnbDZVf} z8kOiV`vGH($1wwG<*-o)t0I|YC5G4jQMpeTgHKE&+jnz~;9r;;Rg2@kUM1PLC>42i zJ#tLGG8Qidn}y>a@D#MjROD?S2FS9pJddH+3k>4&v(;rNy>BVXIayO1-s_R7^T}7{ zCepaYJEMKrQ@sDO*Pf{@b}ybZIW^LqfOGl{LZicHt5K3dvy3152aX~yKZ_KcqemzclgJ@Wl5R=VI+7Ts~!MnV|*^1bi5Xj^KN;M#7R zYb)pYwtF@||G=q0b_L@gO(U7!b6%I= z-!OeO*^iesq24Z3?cnwM;TvPMq#-Qs74}pGqE{z$xBg_Frq~7{t^J}#+3eCHCJJ{J zO#@lYG$GQ@5xr(PUJK=$H!4b{IngtZT>Zf97*|U&5g$PjD0II>=b?Q%ANY(rw^pS^ zxE#B|g6~U#*gGMiKJWGK=oM@zaWp+dztnC|Hv)QkcJvc zJD^CrT}mm2+;N*LG%i1-JDVs{8p&fJ5*M|~B-JHXC=0G>a{cP`1l_&e{2QicErOnP zNp>CO;J`PW6vQ+!Y^kYHVQzdTWdVP_RIc(1*EZ4koTDC*wk+WkZt?ipAmeOZ$}h&> z<~+-0!n!s-hDzWY%-ggt*t-v#dG(jzk}ZzAx({@2S>dS*cHa|wtHM~;={@m7;n?Gp zgEZ1|mq^igO}Jfi?uMm;!h^Z_v(g@Eg-drefsZWRhG6A0ceNLcH5SH+1gG{sEnbz0 ziO(^mFX@#JGY|fz&Aiu((=orV<>q_c#WN_3YOzTnlo0fVXf8ga{!_~R3kK=FTTYi# z-t*Jhz9(N|ObD5AW8S6QR{vUYbU7!s>wHGWWH9Qymv5jjhp>n0$)A6_=}>1c*{<>h&T5~o3Y6Zq=$QhI|ql=4_>)<13fgg23&KBgflVkiyjZs@l1 zU4B1xaOf24TTPB|Q)`+7rz`X5Ndp}`HJgkxy% z4cfX2G+15VkpvCeBWQ*}gYTwrmY_i~GXZ~SFlNP$7aHVmJKBK;A1rP=L4#ciZqm@; z(c5}{XfQJ2)iY?Y;M=M*G`K51#R3gho5vbMgGQyHC(z(d@$Mcpc$ZKT2@P@tws}K? z4X4&I(BRBLksUPX^XNf7G)Oqut_lr~q!olhgM}g|gV3OVB=Q z4SKnvo3dX*yjh#`aj zY4(#yea%626M~&e{_(tP{VH>V`S3VwUO2f1(I5wua zE`q9$q7%W4G1EY#RlaVERg$#)#cBUvXx<{PTH%Efo(m8w4dDz9jEqrCoBTnDuU;B6S zQR`P>&LM)GN>>C~s|&s-CU)B}pI#I0_H&{*WN-taN{Sqi^-q`N|+flZuHnPrm{|Ey{n%U;x4d>&T+1uXg(E|mt0z5AJ|*q6O3kr`iQD&oznNM2n>@yHNn|2?4I<|W{G zzpu7)I+g74ENx#8onBpwn{4r^OmMqWE_Uh2mwT}vj~&JQZ6DJK@^{A$J|MbG_Y`3> zoGenLn;c~0Gu6I|v@h)PMn2Ba61PmY@AS0pT@j(XMX>!ik<7&Ky7!{^10#n*f$u7T zU($}Zx61>>yPE004j9pO;jhgsR`s@RkL6qg(KdqELTaV$D}T~h$_H*bWx8DNq1Gph z6^`kZ%4PqhjKH$&wc{Vs$Ye7@(W+q(2`A>i9A zSVQo+*l9OPdNK0i#nAVESbYQ?3z*{sA1Z49@(6avhc(cOpQ)i0Z^)b)PU~z%JEDYi z?rLKB7ZP#Ob!tihC8LNzS@=PiPg+dh7S4j^JB%OoN#yW?Ghm;=p$JvQ}mg*~JQMpZzf5%3OxKLI2o}+SHuben< zuFY#({u*76zqs$W)wbe^y!?4F!!qObXwMO!XsO-bQyq3)(P$-{F1*090rW_5+OwKG zLKT|^z7!%k<1D_8lkyOe-*IMjE|Z_gLd5<@)?Kv)p>cT zi$~1eqBHac?PWGoC6MOL$1BJLVj_yilf)KL;hf<|nfJSV#bVBBvQ=Fe5bX(c`<^n! zKA+xkuqVY@=ET34AHqk=S}t_|CqnkUS@f_!wP(MVEgbNM&%P+we=7aw_kg$(Bc%IU zI|rwUmyEOTle!cV#dB`%tT_W$sy>e*$rI9U(FfyZI<)#j4DNza^eRVRl;oFDmGyg( ziZ3-^mZB1WVn8;v#<6`n!}hl+I^@iOv8yiqkSnX7_TxjcYDsAD;u-2sXz*YaMG+c& zhl?K!4Klj0Gyac3#O?dg;QMdXbkLym8%|_sFbH|M7#dWP5HW@ZJG{Bjp~2>%860RZ zoq-n#8r-^hHw+D)3pSBLgQ9jSZ=gYJq{a+r@XHFV5HzS;#*YpS&ezMNLW5M@Lrc)0 zVOn7$G&pbX9s~`R-I^XigPK1twxGe+(#(C(;KL3KQfLq@KSu-_*!!K@BvB_&3WI8ca`kRsapwh@&JxgY6!_yP(0hw|n!@Aa6cxmL)# zG*~rVYzPf{QAS`vgPFSruc5&$8mSs+a9=v42^yrs$J&DiAJdxUL4z3c`Ww(-Io|N_ z{}>cLT7w3ubvY=ZL1eZc4$xq(yb236=zJ8l2MrDm73e{OuRed&g9g?3qxqmg-EtQh zXwVad>JA!2Q!_Gx1{>5R)S$t(HcV`2&>el50~(Cz_fv-k>v&WTph09mtSV?w6g@!_ z8uW;JiUkcO+M`NCgTZ+vOwgeHR!9gm=qhv82o0{<(6B>;WghRXp+TO%fsxSQ(ra=} zXmB0vEekX#vhrje8mthl8G;6>9ysVjgFDOKmC)d{^K_XxFvx9CzW@yensVkrgVQp` zB+y{C_q+!*xOCNB0S&(Ybf66lcG@S-LxWwR_d=n;GPk&Y(4ez*tSvOiVM?wE4OTtv z6@>=hQBe^?gC<+Lx6oh@>&6r`n0O>D(^SeCLQ1p8WKqpuh{UleoUm-xP#^; zd6CC|Bwsy@#iUek)CZO`#N={66vtn`xjWD;KrG;2 z()ZX!Lhs7cq?!9YVvg=llv+|bQlrr!-xy}=GogG^YyJ9r=e;h?-icj6` z&s|%p;H6^rsB2=mV5j{iZ=q)_J+`nSNkfPnQFf+6QAkr5QB~#PBc6{3*ix<7G;y7^ z|9pyFzH(c?dg++Jmb9&+zr<>g!|c?YXJr?Nc=ld*orc8r{g@Cnx`k=SH#H>xtq2#A z?+@3dPI*1L$A^}Rgh@O?*71(QCy*G7%Jq+KUqpY-4)a-)Ll2&>J4Zhz+-}m;$sfof z>XEaf64prh+l^6rp7pl=Yd~rk+er3XO2!A3T5cHv)EL>(3{+G7-*!Lo$p#(p{@N{{ z=1MNHGRVA_D;ChJh9RYA+z>u(<^8m0!1B9G&k66pK?Zds+{S}9ILE~0n_c`kk;O0H ze-2D6^}W)G-+g>e8csY*`_Pu&%>ch&&pU|eb|WcUw*L@g6@>}6<%&R)REPa!wcy+h zXI!CrFE5F#KSUg1yDLByw>J|{$jC_f=v}o{?g>?ehaEjP^~)KWrYm>3*UA&t#2RXx zD&*67XJ#p%@lb!xSNYn`w^wf8#Y(A3coNwOIjicR$f{QED@bp9`m>YeTo_1{4*9T0 zA7M>Hv*FURxDI2{#E%G#32yf+oB8@-S&+>!?zOM`cADf?)CMFdm}2l(gr?6Z%{l$EDRr;$RGoc)# zCzBb!d8G#;Zmy=0jk+AYQbeOay`2F79H%{PsxLHn zDJSzD8axRj@PG#S?%h9t2Gu@q{DB5lRV0F;LFR{6d(dE-3Go3m7#^ab0S$gQpx}W9 zX#%8#putAg(MV{}nWt;$e+;&2K8FU4=>i6zL6N8CKcPWPzK&>UFk7zy5gIJ+c;gBU zwk*!xhX&Q^3?raHk!Z39(BM0h*uT)Aq$BGvG&rI9O&%K5_LWeA24AT-w?KpT=L`DK z;2hFnEi|Yjl7avY(qA+iLW9-FOiIvT+{Us3G-$fHTni1luJuttgGo=$UqFMM3rmX7 zAniqG95m=T;4TCWGUM!BK!Z`c>kiPMLWIgYXfT*;loc9O=GRDp1}$bLgrGqoC21B~ zV32RPjtv@Ac(Pjw4bE3S7K8>LMy9PngYrE8XrMv5uXP>_4y2pW7T%)Ji{jz7`= z01Y-br^!QuTrpZI&|uLFBLXz2H}Sw78pO7gNq`1(x_PLfL5h~zpU~hnhA|~HXxjhs z4>V|cU0wzan!g_@g$5t`^AJOW@wjW^(BLDXL?LL9$kOc@G|0b@KMxJQ@X54;1`+e( zt)M|}$>~dIFf5~{85&G|D4YTfF6!h;L4&y1&rhL2Gg7uCXfXWCmo8}V&*)!jXz=>d zA|4uCMXuq72Gd8s{e=cKhbS4L!OVOmeQ40uPapsq6eZ}Gfd>0#^>3j;b8QQ8Xz(yv zNF5sV+3{A8WbjB7C#(v%@#+YCB)?&F|D;r<*fzLb`KM(Q?awG%?tsr?m)@RAp<>Lt zZLAL@R-U3zwY-0KuDhhInriptWnP!HSlQK`%#-gPb^_Isas+)SB@2-*G@Gim1+z+i zh5|YSQ+%~}Z7xp`PHma<6}zJN_-s!0yq(x?9{RcP}`2 zy+O5lw-Ae0|BU0~pVFeC{H;35gH0L-MMN`Eo)|gvgf`TszdU&9*QvKC9HQ&C^6t+H z=u+QbbB1ZgO8&UAqV9?O_-U<0Fk_Fz_wO1rWt_x>_D>1UKLlSe!wjkJZ@#rYlJS)< zq^Khj^US zezLa@==>?CQ7>idI{FH~3JkDExEnEhsjQme2~CmO79&MxIn*|Y4LyoK-lbbC&)0TE z9#BCD!J)!wY?kRAdSo&A<$(~2@>}=LZYi6l{F|I9qM}q?OjVScC;1$F_|#9!fA^z* z_`73oW+=UE_;hXi(TrVyZ8`4s1*i3i{mUscIXjP+X8Hjy#@*Y=(_V*tqVR1>Cn{fm zB)afqf=bopesypG=ldp}Kz5iS9o8LQ%&Rz<-3Aveb4xsZHI2D?TALjU3Wd^Ke?b-WFyn8#u9ciyN2 z+@J1B9Q_CCKWq1-eowi@QH#8!FU^TgFEe&hDB>ilAWsZ^lJ1e~bzL$!_+rWwX?`He zT%3Vgp^TLrHTD!byeSlQeCC40=3FtFJ#EnRysh2eJHnDzZYYXa^s8Qg z_xRS&oBFhK0nAa4K+@>aFq7~=94f1+y%}P~ddm6nxPT7@bx*e0-S!?K#u*}BCs;p< zkG&qTdTWOG^&M)5=kV96>>%4jzc(d1Ws7+Te}_>^stjQ86O?1VQOLj8bwT}0JN)|l z{YmO;iol?~wE|zoQl1K&R+gqw`rkobC&k{}n~K%fB)VIpHq)>3wUt#Oo=(M@Nud|t z>yuLqES*OhM+xCbw^;qJL-D!7=bbC^hR2VGyp}Q>U6&fjvM2AUa6ULRi>z(Mr{Uyi zm{^Ca|0p&LSKbJ_-=`?1u`%;bCS7KYu(X7v{|S|e!3lFspLq+2AVf%9KHx_qH)X_k{>YWqmR?&zHM}F}_Kh_SPqL=(JB$3QXN5NrWF(XrO*&D@&{z z`f7HR_5tl5G>8~-(*q5*Q~hv-2G?wyG@!vrwM9;7(77xk3mVjz`Hcn*cHm%tg9gv< zfBOav-s};yLW2Y8^Nev{c(bg9b101I3}i0C5#-Xpm=4A0HYN;6L_)2A{6E1ww<_ z#Pf~NAW^ftGBh}9-d_z3qB$__LW5Wt++U%=XG~Es&>-WgsSPy9s=O}*4f4;#U_pb@ z<)0j&!R;5{T%p0Tk?m1vP&Or<3>qYSF`x+zb}G-ZL4%u#dzaAQ`n?GoXfV|8#W!fs zFOw)A8vLg4(E=L8Twa@k2GKu6PC$bU8wV}Wpp-${0W`?iy*>^NDv59PL4#6`a4ZbKR5r+n2kG*1`LCnCBIA}0`k}(+?^kEx)1r5@C%PWTl z8y^NCLW7=ZgYTfhY!t&;Xz-~P0vR;;{f00H8e9}68ixjBDSC0C!LvX{A!x8tz$hCU zB#^%mf(8ku)3cz#0sA0yXmB&7ZU7oAFgLM*2FY(1B%#5mBSc(i@HvOXMC;pI9JG&^ z^51eiPM@1*P}XY`@tsC*eyRvZj@=`gXiPAkX?(&6Om-l*$Bt=@(~4R_ zto$dH)La=`kT|_}5225FcyRI(;9JI_W9ht;{2v z8~-n*%G|)Yr7?bk_N=256G@S1P3ea8-0qoox^soZawO#tAxQ`kVxRJ}X>LJN#b63- z#s(?&x8&I&E2O#4m;7(kOR5$(25^=cq%}FtMuKjar0bkDyk3)6WT(|(W_(j|CwbY95^0mP^$tMB4 z^t-X_66_#?SLYwGCxrdZ@H-`cCaFPGH<=5i&P zZ&(&{*X-5vd~$MRqe{5vz0OE+1~QnO@7%sH*3(N25e*qMxZ2M|dTc)u_fKZky>2eA zH7F?|54Cxh!HGjL_|v*N>b2PZFFCXMgP&zW5ew}xIn(1zUIWj$l8k>|Ok0bIdZ(;0 zJL^vIU#{Yr8iYO-B-#I6;a7xQX;pNdd*mON_9s;DC-xZ`d(IsELin@J^JWnl34Z^_Ti z*&;c$wa(hlG&;rE@)!Ciqepn>kiRcn%Bcqkp)k-Jd`7^@Mj2zV*hk0MXSCb(etwW_ zR~%m6(~`Wnhu+3mAy4$IBkv;%g&&qysKn^B&)lp|U)XC`Uxht+uTLy<)jBSZZ>xCi)+Cne(MGw=Y@-WmLTU5?lX7btHxBi)oic3AxcKiNGm0`N>+;%)QSd zW9~mLh|ld9@VLs(3_ge)Vt(wzjT9jKewW$oYO{jH8V?V0sQe#qNm=ut>hqS-WOdcb!YyEyb8 zMIJu8XM6yXM_d@D>{-?{r`JR4+HVBT2@A^|s)g9xwWPFDYNQAwc^yL^mURnghG*m- z4@T~$W)GqMbPBF`DvZi_nKACuIT$4M-g!>gEq*=8Z$Zu)ndyF(QUHo|GFMsNH%y_# zws2{;K6hf@v&{%+`hb*|Z2Rt)XV*o|?qcO=Q!Bkz(SQHcdp&JXI)Mf^BHfpu!OyqP zji5mVrw}q|aQ(H?C^Y!PxhNYNJ50_%gSAOwLC~P4zw-$+D4zUy3>s7r(n^E|#pZ10p+PS3k58e&d_JsJXz)%l zxBwdTMiNnl2Hk4fC80rs5VaX-kbwsm0UB%|t(t`f=h+e2ph2DBqXB5}wa~Y7Xb}Au z`vx=^RryH-8qC&JqJ{?RYa1k>LC*gs=Agm+#fCg+Fzka=CNy~Jo-7Ov=38x(LW5q9 zJ0zjOdV?%hXz-qKDH1fu{rBTOG+3~mWeN>e)(d4pgR>Mflh7c|&Jzr1uu9{dAv752 zH`WIYV&yo#g9ZmS$Sk43K=NBgXfVJ$`wALFPWdzg4KfyQ7eIq%o_r6X!KZYAjL_gk ze!?|0NH`pV3JtajA4x-l)3+Zgph3k;mw0HLsfN4IU!VWkQ4Mrfr+hV7o;205te%=vo6B3=ZRug$6zPj**~2sha=?Xt4ZoWFj>9 zQv*!~8qA8Joqz_Dr0#s7K?Sc=acIzInkEz)ELQWZfd)&n)~TSuQgv2wXmF*Bu^$@b zH)~3V2K`HwA47w4UJ>-rpv|mHAvDPL4rkJ{Z3D5qZ)!E`>dTQ4>MN|`g}&oo6?n0k zer=J@7RJJS50YP9P&U^1wsf98`rtqy*s+Sr{53dZkK~G})nAA=w114p_ z9}QVm=kdt-pjhMOU`Zxs#Kl*uJSoK@7TKOyG}QNI-)k^)S77v}Kb=%P=^eEQT-*Mm zBF@b9{5NN<@`}^$i@1HpNSi7t88?UH8h)%a3y__g_Qh#NT@9FU0fPxd;uB3dS>-G}iZG{@!>} z(Yy6`w46V+aoBz$T$E>%uBTkt#7f7@{5&|OUCbNvn5@$2>{m{BYYw4Z9P8khC%i#( zefwtB(=vaA2tp&7-xT-{T7Fep=*nzZL;Jm*$QIjs_jFGR%dQXg2ItcYJ$j=3%G!~6 z%Z9n;d@jVW6(xc(#H*l*7!f_6m7yl}&H$Qw3Yb;VfeS_(w_b$LUJ<>bUV3JvL`PUG zc`PV3LR2nH--StZI~dJd7x^TSpCzP01Ro1K!n%ljt!tu_#9X>4j1MEsN&eW=V{<4& z^$CB;0ouiYKI)K6^D<)Mq2;JTXLg!D*-%f-=S!WcrSxWsZO8KHt9}`SsSMZmCd!Q% z8tGCYA}l!DUH|a$cWGVQ5T90et`7RkZIalrzBqS|MUc^}H0BAQAtuAU_}FWr;jHs1 z*@Y`mQR@$~HiDZ&BXwBm=U>i}FFmIjq87cCvlYhRhc90}S-Y4Ul<(yY%h zgt(pZ-T1PfQ@=oMeK2(A@qphI>HR>DzhgvS>dW$iWqPJ(4f&ybqPvmiORYNs`IyK~ zxAG%XSy;Sb3Ib$jaE@OoUt!*Xs3Qr zB{TkcRM59nu^G~W1 zK6x_zVQXLcz4VayUj*A#)Pc?};-=oprYu)>*{k(P-TOP8n$tQi`f?5XBX-AP6g?FM z+c;WxqZQQBF-6i3bkNl0&U?Z;2;N_Dc$Q%9VsV8`qFvLSmYNnO*`TxB{mcA@k$c#* zrn{Il#npYe>V_q?&l98c>eK|OZ--qH8uWGB+<*qpu@!K@85$l}b22MubEdv`*Ebi^7a&>*fHvokdKkDXu~8pJG$ z{sj#dm==>lgN5Zc{m>vQ>#YbhsNc+~3k|YG4y8kbb^pS2puqqx7Z+%-R}9Y)8nj%w zW`YK*wgmN|K_8dZL1@r@Z|4dcR7B5jga)k&+S#B%f9265Xpk#~i31v(qvB452H&+x zAwz>y4wbUdphECDDKsdkbL9pN7U){?L4%uLlU_oDg=qiUp~0Q~&>Lv5wv_G~8r&I> z5P}9P4!p6T!6gyI5@?VxHG~=(lrzv(fCjxgm_49D>aR@~(BKyG{d#E7oL6xW8boJX z@r4F8^mG3~gY|!}5TL5&AXL0^vG2hiZ;+!`)4SpJ6}0~)l7)})69H$u+xp+Txq zF&k)*Hqbd98q_%r#)1YlXC9wGgEoi#E6`w#n1w7fxFS|$2o27Zt{*~!i>o=i(4fGO zDkn6kKJjA(8Z^xr?}G-L*uOABgC$NAKG2}+^T-@%@bbrNGiWf3b3Fzc>>g}Cg$73y zEIpvXyYDhB&|ua-HaTeUjE~A28f0?Yh=2y=(0=eigBqb(T+raB7h43-AafIrFEm*G zmj4$tSXShtm-PFiQ4zKjPUZpM-~Q%v?cEIZlfV^~>iaGqORsKQB-MvRJwa$Si(|!pZk{H z##A(i*FG)SF{0YrVC3h5;n#%`p-Am&gbYH1!WnV4g7~e&GiK6Z)E?t6#)$^nMp>z{ z4OCC8A|mjNB2P6CN_kEmM$fz??E1nRk0xtlRUsW`&22T$Rl-nIWu)0QA%T1n6SUkk zd?3si)ND_4@!~IHnr^o`500YNar+-D5{eh(zN)Vd39h-Mn~2|X@h;@rQvz0pFn{*VlVz7<414T>ghAj+ayw{e53PM=BpG7#v&ngw;Y8g zV&k}Gv(#2O+LL2WOrcL^tE@GB# zjL0Ca7E!XZXFx z>3PQP1ZWPpgSc64FRDJ}7WXN9Hr7w|;_V9d_GxX!;PF;Lv~fYT{-NfhYHflfB55X! zG2uQxO}F>C@PXstD?$^KY{{^Z5<>O}@o#d^UDlrbD1X-eCllRHUEwVK zMLG`J)CrpLGRqmmF!LSr>woxk>mh_?r)q^QIhoIK?TSv0tlIk-9X&8m^EXvCEL8&% z2m4G^qC19AnQ<6XvWt<&EO|Ht17Lf-V;6t~%B-&tSmKlM+c z*Bp?sXu|PD|>~gGy_5IN6 zzvmvy*9FSo&M$4h+F3nUQy%Xb?r+0*&)WTjXb4k+nZC$Y%SfrP$mJrfT~dGMep2z3 zTWeNra(RrSzDe!ZX-x4+?O#kxMUQ_!6`qq6-G0j@m57mhQN1^cv;5L3V%*gVpFDyQ z9i#AIU<%vyYl110+*|3RUv9D8#&GE48y~h;%!? zDJ$h zyZ2Z%W}XGxuE)))OSSJ&X`NqOcDK>&R1ec!b9&>&@e95ytV|K&~x8niyeVTJ}dQ)hSA<0LW9_G{JYQ~X88kG zXwXzR{Sh>Xlr*ak4RUE}k3oYkxg_zR!CfSpL}>768OInJ>}MS+ga#S1s=T1V#F9=6 zXi%-pz787XrnyUj1_g|F3ZTI@!tWoT!9wQwS!ht`-WWPG`05`j1vH5KD1i?eG&PU5 zh6Z0`91ZsYgT>pKgwWs*dGQ-)5JM+C9~#_y{v`<-BzR2g1Pv~~;!J@CqXxFCpuu&@ z+iYm?^J>r>G&nuDEes8QR$48B21$Mo9z%mjqqn@!U;wrl6*NduN5TUQ_9c->K!XcU zf~KIsDFGVPGg0D(2Hz-#|AGd4I=XbAL3+FIC(z&&=BsmPFi~AF5gNSN zBe8%6Sx|8Cput>+dSqxYPk4Y48r( zKU6@2Kcdu=p+VL;-+XA$y{wlX8kFUJ{{tGl$%?6j1~*!|#-Kqg2BacrkSawr2^zfp zS%U!$_DTftK!X;H|tp6z3yQ_PF#@e1F?k-PuPU+ssa8b;aooCJTu zYXS5^nt&25g(hXEx7kkBuhIi8xBQx@70w=Nd>~|UI7kWY{^f!F!d2)LLv}eUDL1b? zezF3i&eJQe`3EcF{rV510zb{aH z|92PKsNzDkCUj6Oi^4@RG&PCqZ({#(8{RK0j2b#qQ5q)vGKu=H$Gy|SRzxwDmO^wU zyi?OX=frb;FLX6ZrhlV`HSTHPCWaek%REAo`WbS2SMI>y96H1n)q)T}_T`bxisPY> z(coNU?J#Gj^iM&Q{kOBR;hhS2)$>%MB^tobP&cbG(vZeHu8s z5~pYTC_mK2s>WD-VUzz8*M zWhGzAyp`ws4Q%mYoXSZFW0k3`c-jYF;@jV%uz49LYJb5(einF?laypaFS)Dp#O2R2 z85{P+r0Ic4e<5+3Rw1umrbR<3+lmZ2RrUIPk9j-~*?nZc$D0<1{fbx5W#nU^MdcR6=5m_~&gK^TU>AVc=E{Gl%XXQ{!~ zmRz0k*u~Pi%rOz^O{)D8u`n$Z$%y%LyCRNI(?sW(PVFB@Aq1P+u3m&K)Lvuk;#lLj z1mxl(!kT&cAw%2-%qFD?mcOrxxB6b2kAElW9i{)Cxtja5ZjHG&-Tu7(&O3yx#m(Jg zspCFrC?iQH2?K}riiK%n`hl7xvWLR^=ll1&UOW6Z0FXD-f<5t<$wc|v8K)|1z-5Y) z!u|b$_6|#cFR9iB88F(TxR)B=p_=uL_int-A5Ca~12;u%KC26#%+)vC;9DI3sK`F2s%9>*u-?*T6D*0%X`AYS>48iUbWBci5>HP(YcUepY>h;Iys&; z5hlfs;ZNP;#-yR3cFz zy~*!*DL(hCnPh{UmaD*pwYUUCV$SgPe*aa3gTnC~oS0kL(+SlQ`y$&oi?6371shJ< zD85&U`AH7J%-5DQRGeQ0ZtqImKlG8V4>LR%5&1DW-+}*P%|V)Jlk+pXw!XA&-&tbz zg8)C3j6n|Aru)C3+E z1)f%n7FT>vf@fuVJ<<71EB!4JUs!1#QrxS}?}|CDxxVYi-kTi2tYwv!Y{ovTcJn7W z=*4%Wj+-E(e(Q(wz&>DLa(K3*{&6dQqyMUjN%%_iT(eYzMKKaI*ql@I5*lPz6PASr zljbG7p+O3(5h`eK-HFBr8l3-t)Cvuf8The6gV(ZhM9|>iL8c@$xXMDn4GmI?X7NFT zRI?-{(4eNc>LN54>8*Yr8Z;#3DTW4x$BS5@!DWYzC1{ZKq3s4VNVF+C3k_-so()5T zq!t){(BMX%G&eM8Gts&X4Gwh{*FuBQY7-04AT2AB7&Q24&wL#k9I6~Hg$AoiE1jXi za1~~6Xz<#hr3D&1Q{O>@2E%dUUOLRphKJ>9yIt)6HyWx zlo}Kqf(FNzBYL1gmR~o#(4h6T%LO#Jqqmv>4OZ(}Y(j%F<9y`MpbOXUMrbgRDN7$3 zG+3!lga(UJ!!)76l2u10Xi#W(zXBRum3`w54Z6N3ErkXb(A<7OgN$GLRiHtFx1ZiX zgKpFe%FtllY19NXXyT+E3=N(}%1c3mBp&nx(4dwnax*mOgr6D&4Km>dP(g!!6YLq# z;IU)*Av8!le&h`eChO8?LW5+|qDj!8mlnlqXt3vi+5;M-q(}M-4X(5EO+$m2s!e~P z!J$qwJ81BpLtY6qm?kP}1Pzw{mcWMwk$kcUph3wJvhUE~+4=WiXizd5QyLna8z#zx z1`kC9)1kpI*}52LaKZ1F0yOw?yw1C?S>1;VyKCeRd!}BpHNM5^)v~&YqOQbx63Zdp zq)dt1H=9-011ohu4D}tgw?S*)(_*Pq$tQ-*QBwPT`J4{|$x(dq50JMmelEtx*9*xa zU6OsYlL^bzY-LBZEe}cW;6zvv8$2yjU+fnyPZHJ(G)3$2>HDuGz2;|DCpX?qM~E5F z!I-^M@g?Bu-<96NHK*W4MHga<#mO7J2?j^+{y|$&`fSTc1?v_Ln$Y-G5A%Ao)9Jrl z$g~RtdZ-V_C4S+b$!qJDM0B?>DP463=@83fXEuA;AXzZIi$hMuR~?WxX_nX^-CyG= z^|^lc#2g*1H?J+PGv>NY9zD@b11Q zOIhnR`p*6xXz{}$^j~tyTih8IcgwV2{OwF;P=qaP7jmOhig1ha+w+D7ZTh2oJN5qHPG|dYUa-g7_Ja$F zK=M~b2frC_$iZoYo}8A-FxDOx-LAH#{P2y5^B3)^cMZ4z&>0UW$5f%$f%iUHng z>`@F(n;x}>CR=mTVw08fp!9QY`2dpa`0qbN-xc?pGtM6gPHhfW^A#B`WTO84$W)>% zEPt%w_@!}Wqk;0D443YYC;k8O73Xt9_YpUB%IB9Ef~e!(^>3N!kO$2rI*%hO=B4t9 zwVtBj;v<`1J{FQ)x!{|3xW8wXAb*ryZqIilgoMG()hV>PP!hT1Ou=9;sdP21{Epo# zE9yw>yqaB|e0p|VW6qi2j!EY=%Kc?u?w{4a!iBJ2Uy8rfl!(Q7@MzcEzCe)Wv+2g+ z&BHG9_BE7l;(N+79C(_xB`a1Pe~?1RaH_WpE*ioevv4~|%cD$QEY9XiHHlV!RK<9u z+hH7WovBvfMq%Fe{js_&vrN3)0Al8vPFf-cM`}nZq3|r8>J(ercVcAEt>yW}q<_(f zU*^A>2K5y?zwr2X<~^d7F)>^htd!pE%G0^tM_pr>9alxC;3S)eq8xz9S;K0XNq5tT zE=95I5tS@ihvb=XBi=uOcVUo_A<1dCOJvS$U~oSBuR83lQlzW3afU)P4^o2S;iI&> z%gXvObQ*U)(VD#2`{yrmo{lVcDG|(wBPy*W5)^EtXZ`T^9O0rX7xw<$|8Bm4Kvi0w zI58d{-@^1}ESNT^DIoWCkjOKA=T=LX%@_0U30gF!5VG?}+5>&GgnMmwWmHxWq9%)2 zh!=5dpP@6LD-ok4yd6Gm?j$UR{;)Ff7PMYcT(55s5@j& z82Jhg{@Fie6^O1&^*j^)H9*^ne2Ne+td_yrXeUb@7OaX{bCehUC57giqp9!ZvY6tQ zv3<_O1!hC?Ccm|~5?;_#?i*UI-IlI7b!N8fY?TFMiBb#I&(5B#;dv#SDss!nW5c@R zp_YwW+h%ieb2X9aqK0=?*3;S6)tCMP*iK85$UQ{N5nQP+Ld}0Od;DqnP^bCJBg=_H zRJ{#*$!sEHX~MFr-L)YW0U9*o8q$FVSs#WdB?c8caJUc>)b?t=m#V zgOUHLUS88nz(IC29G`UHPdfClFl<~E_h?dowMXprKCKM6GW=Up@^ zG-$!?APWtSmRt}*gJr!+lF*=uh~7Cg*il6D0~+j=yYhktT^~maLxZMG8ZppdrF=dU zH0Y7vdIAmJui`6)2CuOv7@PW7#e&rE{_fk9$c3cK!Yq3ZD`Qo*`g#D zG>9-*VG9kCO}?{*1`&3D&PS$C~%R80u3sZbbN*e_tFap zpuv*6>P=`+EPjR%8Wcq9 zp~1ewXFkv%&xP>^Xz-+rE)p7S?_3y%28nhwOQ6B8vGz02pvXq)duY(*^)wDNNF=x; z1r0hHq~Sw@SSbwJ(4cz}t0XkIVlkTq4OWg|XhVbF`@V%igIB)!`Ou(1W=I<}h$cXF z1Pv+%7*0Zi#OeYw(4f2|`3^Mr=2FZM8hn-46bB7DNB=j31PoF#gziCuVNxxj(BRS@ z12Qzop!mlG8ay{yehm#$PcvmhgZKT+N1;Ik$yamG;DZv2|3a$&Z&2Oyz6CURSgvFM z4LXFmO+tgC{*2$D!8e{x!q8xkjw3ZRDEg182pZI6EGmQsi>t(6LW5gBzZ*h>In`r7 zp+WbOg*)cX!{iX@!QKSi?Brcy;hFZ*G>eY7Q6^9M>F=*yt?C33X^digZ|yWEC7r|P zUEA7%jXt8x?{Nj?IB3a;;}7c9Q?E!1Ze#1sPTIHmo}Y$thUy1w&S;Pj-1 zXp@TL>kby6xjspJQiLCzXHSi8?;QTKC%fLaCS16|DN+mtD_Np{X<7u!pzT|Dpe=tIi$@uKw%uB)>E%yeG*v&$F~_#2-dPtM8Ru$! z>NelgKTp}FPA9XyfvU2eL9Rj`>1RsI^d?-|waGu1b>y%uSqRD@4JnzP6nga^_y(tE^pBdpC@X)Q{&hq;PNBiWhT$wT{^55U>XpA#?S0p z<#<7GVc3Ee+`7H4i`&;6zKuetLKoAKNL_AwJc46i z<%EeQ=Mlea@=w8($x-lKSJ_{_6pX*=Dxk*JnN^Ls+TPTMV(hzBc-7Ul%lNx>uHJPgPR}8$eL;#cDFajvnvG& zhvRaZ7CyS3l_lOIdcNW=W||U_ekI;^nQp_e^LBlM#-mOAIbvnVi|tn$+?zXImWlLS z4#A2Cto>Rny(ZV|#2jYh`aMPVXD-L>q0FzaQd7=#OIckq``pe+zh5(HM-0x?@LT&W zvD2Vv3>z#*zox#vGG|gH7+50trg}p`c!?F&F&$o0{I9D2-dy+o zY;vz&BEHN~L(WVzxYV+a343`H;$~FdCr5?Zqc$_8c$|2ad2e1TVJu5u?J}@6rgeH) zGLj~)xsy$XcL+7CjdV+vEifY3g0Q!8S?SMGHy1|$>2K28-wjhA=Yy{c=%mFQt;7sv zN}DKh)^CFGEjwvn@<@J4WZgIKRUk*uu&oVTe>B~3dGy1KM`e`cXx@{9+~oz@dlsYA zNqwbsUDE$X8uTS9>YvTXnfqt7X8-C<)swU`s=Ln1OI>qMu9?|8vPx{b;w|N@l~Os$2V>7D2TVeByl3(SX?Dndd>sLL6ob*&3T!!zwzKQ4`4(uFI^Rd!0#Yq}X4#jSHs=K$ zQI*)&MaO!lrx#-`ViW13#vUd7y*c{R<0Iea)>-t*siIUztHYJ*o9?_KqKvvxS9`3t z|C}#_x^F-vN25?9$^=gE!DI#>0}O9|W5bz_>v#QvM13E6_*&1fH+FgOAN zf2J_&HtDXMsS&s#*(#qr(4}WVViZ)=O-WI8saK9stTR6x4eOo?&!E8u5%GLz@C%_0Iy5+GYbOj1av|Wng9c6X zH}j!EglCT_p+Qa@VLxb)t5h%_8XOfQ?Scj$wMu`41`#5~kDx)6_dgJzK>~w)H)wEF zo4gJhe8eVp3=Mud=@f^*1@^<{MuG`KOSc>xVxq_Ac}gN6p_jL@KUrFl0r zNN%(!0SztkElMyD8VqG6=Ys}^Z4;58L60@mdT4ObOQ{hW ztnA)#f(8>_9cM#>x?6f&(4f4gOd&Mr!w~HV4gPd~JOd5NCdj%%gHjO~RM22>^0#zo z@Y|293TP0`^riqBH2gU@4-IC%erE#>lDQnRLxUz5$Vkwj{xAItXL0hv6H96_0WP++ zli)~}J{lxbIrVUxkTl`F;YUF>_E<;E1x5?*&y^>uW<2XHch@8CMM=KL_|ssJRnKVn zrUaGHA;rqgr`-oh;UQmaDw$(iNqorb{Xc`nCL6i`WarW!{+2de8A|i{5dC7D<`t=} z;tPRaDLkS^OD@XK1-{E}34LimWl=D?uF0(CWEY>NugVEs@LCt26G}RMqdusic2B-y z<`t)_u&EcRiVUj7v;GFxb&u1`_5y=BM>Z@{Yhy93$yw{%^_A*yH$KC%{GID3jWSzF zL8~@~x+(?gza?BHI&|NXgpeKXA>`L^K` zU4f;apZzkM#S@|2rYAgva|DEo;nnvq7vek#-3Ik|KfPHVrWd&jqUfYZZ|(cbpJ3*| zYxj&J5&@U-6%p}c`2wAwrQtwTGer`HP3eZ#Vx0gS+jg5*KSIBM{qY2Mi;_F5kG~m1 zj3&b%xA$L$M`j0O?ct}M6v58!t>%Oo_P$)XkeEk)3!N#LWSjDRU$gcIdPBOIxk@iA ztUrg7h#EhLG^$It?nJSk3-|gXk#k{;p|!^PFX;RUO?D?m66t!T!mn}N>)B+}yXiXV zV2Vs)V)Ty^{m(xXo)#UBwnL#MLKN2X;=VkL68n~P1`u`S@`sLsA7PmGr2ur=!X?;t}@H^BzOgV8&4Bgb$u3mu-#cL5O~N zO=w`lxP#C1J8cQ-#aCET+n-~L*09nhWBn*qF^E6laFmx71Wmo_!$nNJ>?BCkH;F2& z$wA_dPI}0~W;FHr>$YZ(eT*66fX(-3bjN1w&0K!NW8`x(-Pp3R;Ys{&vnK~WQGYk< zr=~5)MYec`ExW*@Xd=<9bgcJsA1@{y=l`2=pwBjj1|`WfLZLxDrG6D? z@KNKK7&Q2n@AGSDFl0Bb5E@L)9hHLyQ`0%(ph3^wZW(A0>7mUjG`Q=~oCOVjPYHPo z4NetkH$#Iw%dwxKK|`&1T4*rJkDMDCyujRvh6aCT^U^|tzp;CYph2C#!Zy(0j=j+U zG}!aK{SF!&L;kNI0Sx+F3_C)DQZ@Hip}~05YiwxnMI~7&H0Z_nZ4DaS3Du&42CKvN zx}d>S*3x&-ApX~kNN7+gHna#D%&wsofd(03YXhJ`mT`M^XpsM+vKbo0(~MJx2F39w zqoF}}1hai;P~HmH3L3iF3{+d_%0}b|Zyp;GKgNncWpusV=W@>0KB9{IyG^i~b zhY1a8cv;awgWb2Ql+a*`>DM%9uT4 z_nwJyO#0pazvuUTo`3K2%zW;A&U@bTp7*?Gx#!-Qkz?>Dx61}O29JF?)LxFkW?Lf` z$T7IC@6bnb493PB{Zx*@xFwylCs-)fAQCC4ED^rvZZ3^wfY z!)7@KeR_oTmt(NhH%E%dG1zQI$!2m4UhrDmRgS^0yDpEGWAOHbo=$QMK6>!-fEV$x z9E17|UsaT2uz2I

hm&c;IZs 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 b-}V3XbM^Pj@WFNe#BZtl_gXhtUsL}VL%$O& diff --git a/submodules/Propagation/gaussianpro.egg-info/SOURCES.txt b/submodules/Propagation/gaussianpro.egg-info/SOURCES.txt deleted file mode 100644 index 5b846518..00000000 --- a/submodules/Propagation/gaussianpro.egg-info/SOURCES.txt +++ /dev/null @@ -1,8 +0,0 @@ -PatchMatch.cpp -Propagation.cu -pro.cpp -setup.py -gaussianpro.egg-info/PKG-INFO -gaussianpro.egg-info/SOURCES.txt -gaussianpro.egg-info/dependency_links.txt -gaussianpro.egg-info/top_level.txt \ No newline at end of file diff --git a/submodules/Propagation/gaussianpro.egg-info/dependency_links.txt b/submodules/Propagation/gaussianpro.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891..00000000 --- a/submodules/Propagation/gaussianpro.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/submodules/Propagation/gaussianpro.egg-info/top_level.txt b/submodules/Propagation/gaussianpro.egg-info/top_level.txt deleted file mode 100644 index 0c90696b..00000000 --- a/submodules/Propagation/gaussianpro.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -gaussianpro From 9ed89df616c515de1a51b53960a1c3f4cd42e3a7 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 23 Sep 2024 01:43:19 +0800 Subject: [PATCH 20/71] feat: Add pixelgs densification --- arguments/__init__.py | 2 ++ gaussian_renderer/__init__.py | 8 ++++---- scene/gaussian_model.py | 10 +++++++--- train.py | 6 +++--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index f92e53ce..a106ee98 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -106,6 +106,8 @@ def __init__(self, parser): self.propagation_after = 15000 self.patch_size = 11 + self.pixel_dense_from_iter = 30000 + self.contribution_prune_from_iter = 500 self.contribution_prune_interval = 300 self.contribution_prune_ratio = 0.1 diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 759fb147..90d88b17 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -107,18 +107,18 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, ) if record_transmittance: - transmittance_sum, num_covered_pixels, radii = output - transmittance = transmittance_sum / (num_covered_pixels + 1e-6) - return transmittance + rendered_image, radii, allmap, transmittance_avg, num_covered_pixels = output else: rendered_image, radii, allmap = output - + transmittance_avg = num_covered_pixels = None # Those Gaussians that were frustum culled or had a radius of 0 were not visible. # They will be excluded from value updates used in the splitting criteria. rets = {"render": rendered_image, "viewspace_points": means2D, "visibility_filter" : radii > 0, "radii": radii, + "pixels_num":num_covered_pixels, + "transmittance_avg": transmittance_avg } diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 3509775c..d1905e83 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -433,9 +433,13 @@ def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size): torch.cuda.empty_cache() - def add_densification_stats(self, viewspace_point_tensor, update_filter): - self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) - self.denom[update_filter] += 1 + def add_densification_stats(self, viewspace_point_tensor, update_filter, pixels): + if pixels is not None: + self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) * pixels[update_filter].unsqueeze(-1) + self.denom[update_filter] += pixels[update_filter].unsqueeze(-1) + else: + self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) + self.denom[update_filter] += 1 def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, propagated_normal, filter_mask): diff --git a/train.py b/train.py index 0dd3c4c0..b35fb500 100644 --- a/train.py +++ b/train.py @@ -33,7 +33,7 @@ def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): top_list = [None, ] * K for i, cam in enumerate(cameras): - trans = render(cam, gaussians, pipe, bg, record_transmittance=True) + trans = render(cam, gaussians, pipe, bg, record_transmittance=True)["transmittance_avg"] if top_list[0] is not None: m = trans > top_list[0] if m.any(): @@ -164,7 +164,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi intervals = [-2, -1, 1, 2] src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] depth_loss = process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) - render_pkg = render(viewpoint_cam, gaussians, pipe, background) + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration > opt.pixel_dense_from_iter) & (iteration < opt.densify_until_iter)) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] gt_image = viewpoint_cam.original_image.cuda() @@ -242,7 +242,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Densification if iteration < opt.densify_until_iter: gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], radii[visibility_filter]) - gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter) + gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, render_pkg["pixels_num"]) if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: size_threshold = 20 if iteration > opt.opacity_reset_interval else None From e9f0577ab463ca56ccf8dd8c25f51efd82853dc3 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 23 Sep 2024 03:36:28 +0800 Subject: [PATCH 21/71] feat: Add big points splitting --- scene/gaussian_model.py | 48 +++++++++++++++++++++++++++++++++++++---- train.py | 7 +++--- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index d1905e83..d97ccd8b 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -364,6 +364,7 @@ def densification_postfix(self, new_xyz, new_features_dc, new_features_rest, new "scaling" : new_scaling, "rotation" : new_rotation} + self.max_radii2D = torch.cat([self.max_radii2D, torch.zeros((new_xyz.shape[0]), device="cuda")], dim=0) optimizable_tensors = self.cat_tensors_to_optimizer(d) self._xyz = optimizable_tensors["xyz"] self._features_dc = optimizable_tensors["f_dc"] @@ -374,7 +375,6 @@ def densification_postfix(self, new_xyz, new_features_dc, new_features_rest, new self.xyz_gradient_accum = torch.zeros((self.get_xyz.shape[0], 1), device="cuda") self.denom = torch.zeros((self.get_xyz.shape[0], 1), device="cuda") - self.max_radii2D = torch.zeros((self.get_xyz.shape[0]), device="cuda") def densify_and_split(self, grads, grad_threshold, scene_extent, N=2): n_init_points = self.get_xyz.shape[0] @@ -426,13 +426,53 @@ def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size): prune_mask = (self.get_opacity < min_opacity).squeeze() if max_screen_size: - big_points_vs = self.max_radii2D > max_screen_size big_points_ws = self.get_scaling.max(dim=1).values > 0.1 * extent - prune_mask = torch.logical_or(torch.logical_or(prune_mask, big_points_vs), big_points_ws) + prune_mask = torch.logical_or(prune_mask, big_points_ws) + self.prune_points(prune_mask) - + if max_screen_size: + self.split_big_points(max_screen_size) torch.cuda.empty_cache() + + def split_big_points(self, max_screen_size): + big_points_mask = self.max_radii2D > max_screen_size + big_point_indices = torch.where(big_points_mask)[0] + + if big_point_indices.numel() == 0: + return # No points to split + # Calculate split numbers based on max_radii2D + split_numbers = torch.ceil(self.max_radii2D[big_points_mask] / max_screen_size).long() + total_new_points = split_numbers.sum().item() + print(f"Generting {total_new_points} new points") + + # Create prune filter + prune_filter = torch.zeros(self.get_xyz.shape[0] + total_new_points, device="cuda", dtype=bool) + prune_filter[:self.get_xyz.shape[0]] = big_points_mask + + index_list = torch.arange(split_numbers.size(0), device="cuda").repeat_interleave(split_numbers) + + stds = self.get_scaling[big_point_indices[index_list]] + stds = torch.cat([stds, torch.zeros_like(stds[:, :1])], dim=-1) + means = torch.zeros_like(stds) + samples = torch.normal(mean=means, std=stds) + + rots = build_rotation(self._rotation[big_point_indices[index_list]]) + + new_xyz = torch.bmm(rots, samples.unsqueeze(-1)).squeeze(-1) + self.get_xyz[big_point_indices[index_list]] + new_scaling = self.scaling_inverse_activation(self.get_scaling[big_point_indices[index_list]] / (0.8 * split_numbers[index_list].unsqueeze(1))) + new_rotation = self._rotation[big_point_indices[index_list]] + new_features_dc = self._features_dc[big_point_indices[index_list]] + new_features_rest = self._features_rest[big_point_indices[index_list]] + new_opacity = self._opacity[big_point_indices[index_list]] + + self.densification_postfix(new_xyz, new_features_dc, new_features_rest, new_opacity, new_scaling, new_rotation) + + self.prune_points(prune_filter) + + # Reset max_radii2D for the new points + self.max_radii2D = torch.zeros((self.get_xyz.shape[0]), device="cuda") + def add_densification_stats(self, viewspace_point_tensor, update_filter, pixels): if pixels is not None: self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) * pixels[update_filter].unsqueeze(-1) diff --git a/train.py b/train.py index b35fb500..73e42182 100644 --- a/train.py +++ b/train.py @@ -164,7 +164,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi intervals = [-2, -1, 1, 2] src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] depth_loss = process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) - render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration > opt.pixel_dense_from_iter) & (iteration < opt.densify_until_iter)) + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] gt_image = viewpoint_cam.original_image.cuda() @@ -241,8 +241,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Densification if iteration < opt.densify_until_iter: - gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], radii[visibility_filter]) - gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, render_pkg["pixels_num"]) + gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], + radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.1)) + gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, None) if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: size_threshold = 20 if iteration > opt.opacity_reset_interval else None From dd521f11610233eb33e697b23ed59e28a983a544 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 23 Sep 2024 17:44:23 +0800 Subject: [PATCH 22/71] feat: Improve Gaussian model pruning and splitting logic - Add split interval and max screen size parameters in OptimizationParams - Refactor densify_and_prune method to use prune_big_points flag - Adjust training logic to include point splitting based on iteration --- arguments/__init__.py | 3 +++ scene/gaussian_model.py | 6 ++---- train.py | 9 ++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index a106ee98..666ac18b 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -93,6 +93,9 @@ def __init__(self, parser): self.lambda_normal_gradient = 0.1 self.opacity_cull = 0.05 + self.split_interval = 500 + self.max_screen_size = 20 + self.densification_interval = 100 self.opacity_reset_interval = 3000 self.densify_from_iter = 500 diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index d97ccd8b..16486999 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -417,7 +417,7 @@ def densify_and_clone(self, grads, grad_threshold, scene_extent): self.densification_postfix(new_xyz, new_features_dc, new_features_rest, new_opacities, new_scaling, new_rotation) - def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size): + def densify_and_prune(self, max_grad, min_opacity, extent, prune_big_points=False): grads = self.xyz_gradient_accum / self.denom grads[grads.isnan()] = 0.0 @@ -425,13 +425,11 @@ def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size): self.densify_and_split(grads, max_grad, extent) prune_mask = (self.get_opacity < min_opacity).squeeze() - if max_screen_size: + if prune_big_points: big_points_ws = self.get_scaling.max(dim=1).values > 0.1 * extent prune_mask = torch.logical_or(prune_mask, big_points_ws) self.prune_points(prune_mask) - if max_screen_size: - self.split_big_points(max_screen_size) torch.cuda.empty_cache() def split_big_points(self, max_screen_size): diff --git a/train.py b/train.py index 73e42182..9981e14f 100644 --- a/train.py +++ b/train.py @@ -242,13 +242,16 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Densification if iteration < opt.densify_until_iter: gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], - radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.1)) + radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.01)) gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, None) if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: - size_threshold = 20 if iteration > opt.opacity_reset_interval else None - gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, size_threshold) + prune_big_points = True if iteration > opt.opacity_reset_interval else False + gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, prune_big_points) + if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: + gaussians.split_big_points(opt.max_screen_size) + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: print("Skipped Pruning for", iteration) From 464bdceb706fe9c7cdc396d8f146d1b3fae1277e Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Tue, 24 Sep 2024 00:30:43 +0800 Subject: [PATCH 23/71] fix: Replace distortion loss with modified normal consistency loss --- arguments/__init__.py | 2 +- train.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index 666ac18b..e6f06e6d 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -87,7 +87,7 @@ def __init__(self, parser): self.appearance_network_lr = 0.001 self.percent_dense = 0.01 self.lambda_dssim = 0.2 - self.lambda_dist = 10. + self.lambda_dist = 0. self.lambda_normal = 0.05 self.lambda_normal_prior = 0.25 self.lambda_normal_gradient = 0.1 diff --git a/train.py b/train.py index 9981e14f..d88bbe4e 100644 --- a/train.py +++ b/train.py @@ -181,7 +181,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi dist_loss = lambda_dist * (rend_dist).mean() rend_normal = render_pkg['rend_normal'] - surf_normal = render_pkg['surf_normal'] + surf_normal_median = render_pkg['surf_normal'] surf_normal_expected = render_pkg['surf_normal_expected'] rend_alpha = render_pkg['rend_alpha'] @@ -196,9 +196,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_loss = lambda_normal_prior * normal_prior_error if lambda_normal_gradient > 0.0: - normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal, prior_normal) + normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) else: - normal_error = (1 - (rend_normal * surf_normal).sum(dim=0))[None] + normal_error = 0.6 * (1 - (rend_normal * surf_normal_median).sum(dim=0))[None] + \ + 0.4 * (1 - (rend_normal * surf_normal_expected).sum(dim=0))[None] normal_loss = lambda_normal * normal_error.mean() # loss From 484303a60bd98894123c2db0ce3e3dedbbb09555 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 26 Sep 2024 03:32:58 +0800 Subject: [PATCH 24/71] feat: Add progressive training --- train_progressive.py | 422 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 422 insertions(+) create mode 100644 train_progressive.py diff --git a/train_progressive.py b/train_progressive.py new file mode 100644 index 00000000..5c322981 --- /dev/null +++ b/train_progressive.py @@ -0,0 +1,422 @@ +# +# Copyright (C) 2023, Inria +# GRAPHDECO research group, https://team.inria.fr/graphdeco +# All rights reserved. +# +# This software is free for non-commercial, research and evaluation use +# under the terms of the LICENSE.md file. +# +# For inquiries contact george.drettakis@inria.fr +# + +import os +import torch +from random import randint +from utils.loss_utils import l1_loss_appearance, ssim +from gaussian_renderer import render, network_gui +import sys +import torch.nn.functional as F +from scene import Scene, GaussianModel, AppearanceModel +from utils.general_utils import safe_state +from utils.patchmatch import process_propagation +import uuid +from tqdm import tqdm +from utils.image_utils import psnr, render_net_image +from argparse import ArgumentParser, Namespace +from arguments import ModelParams, PipelineParams, OptimizationParams +try: + from torch.utils.tensorboard import SummaryWriter + TENSORBOARD_FOUND = True +except ImportError: + TENSORBOARD_FOUND = False + +def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): + top_list = [None, ] * K + for i, cam in enumerate(cameras): + trans = render(cam, gaussians, pipe, bg, record_transmittance=True)["transmittance_avg"] + if top_list[0] is not None: + m = trans > top_list[0] + if m.any(): + for i in range(K - 1): + top_list[K - 1 - i][m] = top_list[K - 2 - i][m] + top_list[0][m] = trans[m] + else: + top_list = [trans.clone() for _ in range(K)] + + contribution = torch.stack(top_list, dim=-1).mean(-1) + tile = torch.quantile(contribution, prune_ratio) + prune_mask = contribution < tile + gaussians.prune_points(prune_mask) + torch.cuda.empty_cache() + +def ranking_loss(error, penalize_ratio=0.7, extra_weights=None , type='mean'): + error, indices = torch.sort(error) + # only sum relatively small errors + s_error = torch.index_select(error, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + if extra_weights is not None: + weights = torch.index_select(extra_weights, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + s_error = s_error * weights + + if type == 'mean': + return torch.mean(s_error) + elif type == 'sum': + return torch.sum(s_error) + +def normal_gradient_loss(rend_normal, gt_normal): + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + + return loss_x + loss_y + +def edge_aware_normal_gradient_loss(gt_image, rend_normal, gt_normal, prior_normal_mask, edge_threshold=1): + # Define Sobel filters + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + + # Compute gradients of rendered and ground truth normals + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + # Compute gradients of gt_image for edge detection + dI_dx = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_x, padding=1) for i in range(gt_image.shape[0])]) + dI_dx = torch.mean(torch.abs(dI_dx), 1, keepdim=True) + dI_dy = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_y, padding=1) for i in range(gt_image.shape[0])]) + dI_dy = torch.mean(torch.abs(dI_dy), 1, keepdim=True) + + # Compute edge strength + edge_strength = dI_dx + dI_dy + + # Create non-edge mask + non_edge_mask = (edge_strength < edge_threshold).float() + + # Compute loss for gradients + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + loss = loss_x + loss_y + + # Apply non-edge mask and prior_normal_mask + masked_loss = loss * non_edge_mask * prior_normal_mask + + # Normalize by the number of non-edge pixels + num_non_edge_pixels = torch.sum(non_edge_mask * prior_normal_mask) + 1e-6 + normalized_loss = torch.sum(masked_loss) / num_non_edge_pixels + + return normalized_loss + +def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint): + first_iter = 0 + tb_writer = prepare_output_and_logger(dataset) + gaussians = GaussianModel(dataset.sh_degree) + scene = Scene(dataset, gaussians, resolution_scales=[4, 2, 1]) + gaussians.training_setup(opt) + if checkpoint: + (model_params, first_iter) = torch.load(checkpoint) + gaussians.restore(model_params, opt) + + bg_color = [1, 1, 1] if dataset.white_background else [0, 0, 0] + background = torch.tensor(bg_color, dtype=torch.float32, device="cuda") + + iter_start = torch.cuda.Event(enable_timing = True) + iter_end = torch.cuda.Event(enable_timing = True) + + viewpoint_stack = None + ema_loss_for_log = 0.0 + ema_dist_for_log = 0.0 + ema_normal_for_log = 0.0 + + progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") + first_iter += 1 + all_cameras = scene.getTrainCameras() + if dataset.use_decoupled_appearance: + appearances = AppearanceModel(len(all_cameras)) + appearances.training_setup(opt) + else: + appearances = None + + for iteration in range(first_iter, opt.iterations + 1): + + iter_start.record() + + gaussians.update_learning_rate(iteration) + + # Every 1000 its we increase the levels of SH up to a maximum degree + if iteration % 1000 == 0: + gaussians.oneupSHdegree() + + if iteration - 1 == 0: + scale = 4 + viewpoint_stack = scene.getTrainCameras(scale=scale) + elif iteration - 1 == 5000: + scale = 2 + viewpoint_stack = scene.getTrainCameras(scale=scale) + elif iteration - 1 >= 10000: + scale = 1 + viewpoint_stack = scene.getTrainCameras(scale=scale) + + viewpoint_idx = randint(0, len(viewpoint_stack)-1) + viewpoint_cam = viewpoint_stack[viewpoint_idx] + + # Set intervals for patch match + # intervals = [-2, -1, 1, 2] + # src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] + # depth_loss = process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) + image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] + + gt_image = viewpoint_cam.original_image.cuda() + Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance + loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + + # regularization + lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 + lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 + lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 + lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 + + rend_dist = render_pkg["rend_dist"] + dist_loss = lambda_dist * (rend_dist).mean() + + rend_normal = render_pkg['rend_normal'] + surf_normal_median = render_pkg['surf_normal'] + surf_normal_expected = render_pkg['surf_normal_expected'] + rend_alpha = render_pkg['rend_alpha'] + + normal_error = 0.6 * (1 - (rend_normal * surf_normal_median).sum(dim=0))[None] + \ + 0.4 * (1 - (rend_normal * surf_normal_expected).sum(dim=0))[None] + normal_loss = lambda_normal * normal_error.mean() + if dataset.w_normal_prior: + prior_normal = viewpoint_cam.normal * (rend_alpha).detach() + prior_normal_mask = viewpoint_cam.normal_mask[0] + + normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], + penalize_ratio=1.0, type='mean') + + normal_loss += lambda_normal_prior * normal_prior_error + if lambda_normal_gradient > 0.0: + normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) + + # loss + total_loss = loss + dist_loss + normal_loss + + total_loss.backward() + + iter_end.record() + + with torch.no_grad(): + # Progress bar + ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log + ema_dist_for_log = 0.4 * dist_loss.item() + 0.6 * ema_dist_for_log + ema_normal_for_log = 0.4 * normal_loss.item() + 0.6 * ema_normal_for_log + + + if iteration % 10 == 0: + loss_dict = { + "Loss": f"{ema_loss_for_log:.{5}f}", + "distort": f"{ema_dist_for_log:.{5}f}", + "normal": f"{ema_normal_for_log:.{5}f}", + "Points": f"{len(gaussians.get_xyz)}" + } + progress_bar.set_postfix(loss_dict) + + progress_bar.update(10) + if iteration == opt.iterations: + progress_bar.close() + + # Log and save + if tb_writer is not None: + tb_writer.add_scalar('train_loss_patches/dist_loss', ema_dist_for_log, iteration) + tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) + + # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + if (iteration in saving_iterations): + print("\n[ITER {}] Saving Gaussians".format(iteration)) + scene.save(iteration) + + + # Densification + if iteration < opt.densify_until_iter: + gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], + radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.01)) + gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, None) + + if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: + prune_big_points = True if iteration > opt.opacity_reset_interval else False + gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, prune_big_points) + + if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: + gaussians.split_big_points(opt.max_screen_size) + + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: + if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: + print("Skipped Pruning for", iteration) + continue + prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, + K=1, prune_ratio=opt.contribution_prune_ratio) + print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') + + if iteration % opt.opacity_reset_interval == 0 or (dataset.white_background and iteration == opt.densify_from_iter): + gaussians.reset_opacity() + + # Optimizer step + if iteration < opt.iterations: + # visible = radii > 0 + # gaussians.optimizer.step(visible, radii.shape[0]) + gaussians.optimizer.step() + gaussians.optimizer.zero_grad(set_to_none = True) + if appearances is not None: + appearances.optimizer.step() + appearances.optimizer.zero_grad(set_to_none = True) + + if (iteration in checkpoint_iterations): + print("\n[ITER {}] Saving Checkpoint".format(iteration)) + torch.save((gaussians.capture(), iteration), scene.model_path + "/chkpnt" + str(iteration) + ".pth") + + with torch.no_grad(): + if network_gui.conn == None: + network_gui.try_connect(dataset.render_items) + while network_gui.conn != None: + try: + net_image_bytes = None + custom_cam, do_training, keep_alive, scaling_modifer, render_mode = network_gui.receive() + if custom_cam != None: + render_pkg = render(custom_cam, gaussians, pipe, background, scaling_modifer) + net_image = render_net_image(render_pkg, dataset.render_items, render_mode, custom_cam) + net_image_bytes = memoryview((torch.clamp(net_image, min=0, max=1.0) * 255).byte().permute(1, 2, 0).contiguous().cpu().numpy()) + metrics_dict = { + "#": gaussians.get_opacity.shape[0], + "loss": ema_loss_for_log + # Add more metrics as needed + } + # Send the data + network_gui.send(net_image_bytes, dataset.source_path, metrics_dict) + if do_training and ((iteration < int(opt.iterations)) or not keep_alive): + break + except Exception as e: + # raise e + network_gui.conn = None + +def prepare_output_and_logger(args): + if not args.model_path: + if os.getenv('OAR_JOB_ID'): + unique_str=os.getenv('OAR_JOB_ID') + else: + unique_str = str(uuid.uuid4()) + args.model_path = os.path.join("./output/", unique_str[0:10]) + + # Set up output folder + print("Output folder: {}".format(args.model_path)) + os.makedirs(args.model_path, exist_ok = True) + with open(os.path.join(args.model_path, "cfg_args"), 'w') as cfg_log_f: + cfg_log_f.write(str(Namespace(**vars(args)))) + + # Create Tensorboard writer + tb_writer = None + if TENSORBOARD_FOUND: + tb_writer = SummaryWriter(args.model_path) + else: + print("Tensorboard not available: not logging progress") + return tb_writer + +@torch.no_grad() +def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_iterations, scene : Scene, renderFunc, renderArgs): + if tb_writer: + tb_writer.add_scalar('train_loss_patches/reg_loss', Ll1.item(), iteration) + tb_writer.add_scalar('train_loss_patches/total_loss', loss.item(), iteration) + tb_writer.add_scalar('iter_time', elapsed, iteration) + tb_writer.add_scalar('total_points', scene.gaussians.get_xyz.shape[0], iteration) + + # Report test and samples of training set + if iteration in testing_iterations: + torch.cuda.empty_cache() + validation_configs = ({'name': 'test', 'cameras' : scene.getTestCameras()}, + {'name': 'train', 'cameras' : [scene.getTrainCameras()[idx % len(scene.getTrainCameras())] for idx in range(5, 30, 5)]}) + + for config in validation_configs: + if config['cameras'] and len(config['cameras']) > 0: + l1_test = 0.0 + psnr_test = 0.0 + for idx, viewpoint in enumerate(config['cameras']): + render_pkg = renderFunc(viewpoint, scene.gaussians, *renderArgs) + image = torch.clamp(render_pkg["render"], 0.0, 1.0) + gt_image = torch.clamp(viewpoint.original_image.to("cuda"), 0.0, 1.0) + if tb_writer and (idx < 5): + from utils.general_utils import colormap + depth = render_pkg["surf_depth"] + norm = depth.max() + depth = depth / norm + depth = colormap(depth.cpu().numpy()[0], cmap='turbo') + tb_writer.add_images(config['name'] + "_view_{}/depth".format(viewpoint.image_name), depth[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/render".format(viewpoint.image_name), image[None], global_step=iteration) + + try: + rend_alpha = render_pkg['rend_alpha'] + rend_normal = render_pkg["rend_normal"] * 0.5 + 0.5 + surf_normal = render_pkg["surf_normal"] * 0.5 + 0.5 + tb_writer.add_images(config['name'] + "_view_{}/rend_normal".format(viewpoint.image_name), rend_normal[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/surf_normal".format(viewpoint.image_name), surf_normal[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/rend_alpha".format(viewpoint.image_name), rend_alpha[None], global_step=iteration) + + rend_dist = render_pkg["rend_dist"] + rend_dist = colormap(rend_dist.cpu().numpy()[0]) + tb_writer.add_images(config['name'] + "_view_{}/rend_dist".format(viewpoint.image_name), rend_dist[None], global_step=iteration) + except: + pass + + if iteration == testing_iterations[0]: + tb_writer.add_images(config['name'] + "_view_{}/ground_truth".format(viewpoint.image_name), gt_image[None], global_step=iteration) + + l1_test += l1_loss(image, gt_image).mean().double() + psnr_test += psnr(image, gt_image).mean().double() + + psnr_test /= len(config['cameras']) + l1_test /= len(config['cameras']) + print("\n[ITER {}] Evaluating {}: L1 {} PSNR {}".format(iteration, config['name'], l1_test, psnr_test)) + if tb_writer: + tb_writer.add_scalar(config['name'] + '/loss_viewpoint - l1_loss', l1_test, iteration) + tb_writer.add_scalar(config['name'] + '/loss_viewpoint - psnr', psnr_test, iteration) + + torch.cuda.empty_cache() + +if __name__ == "__main__": + # Set up command line argument parser + parser = ArgumentParser(description="Training script parameters") + lp = ModelParams(parser) + op = OptimizationParams(parser) + pp = PipelineParams(parser) + parser.add_argument('--ip', type=str, default="127.0.0.1") + parser.add_argument('--port', type=int, default=6009) + parser.add_argument('--detect_anomaly', action='store_true', default=False) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--quiet", action="store_true") + parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) + parser.add_argument("--start_checkpoint", type=str, default = None) + args = parser.parse_args(sys.argv[1:]) + args.save_iterations.append(args.iterations) + + print("Optimizing " + args.model_path) + + # Initialize system state (RNG) + safe_state(args.quiet) + + # Start GUI server, configure and run training + network_gui.init(args.ip, args.port) + torch.autograd.set_detect_anomaly(args.detect_anomaly) + training(lp.extract(args), op.extract(args), pp.extract(args), args.test_iterations, args.save_iterations, args.checkpoint_iterations, args.start_checkpoint) + + # All done + print("\nTraining complete.") \ No newline at end of file From 106ec91f2322ae9ec7850be1a7d007fab533e400 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 26 Sep 2024 03:33:15 +0800 Subject: [PATCH 25/71] fix: update config --- arguments/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index e6f06e6d..d3a70a17 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -90,7 +90,7 @@ def __init__(self, parser): self.lambda_dist = 0. self.lambda_normal = 0.05 self.lambda_normal_prior = 0.25 - self.lambda_normal_gradient = 0.1 + self.lambda_normal_gradient = 0 self.opacity_cull = 0.05 self.split_interval = 500 From 455204d70f7a596d01ed32c3cbf09d2414c458bc Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 27 Sep 2024 21:18:04 +0800 Subject: [PATCH 26/71] feat: Remove opencv dependency --- submodules/Propagation/PatchMatch.cpp | 112 ++++++++++---------------- submodules/Propagation/PatchMatch.h | 16 ++-- submodules/Propagation/Propagation.cu | 19 +---- submodules/Propagation/main.h | 7 -- submodules/Propagation/setup.py | 6 +- 5 files changed, 53 insertions(+), 107 deletions(-) diff --git a/submodules/Propagation/PatchMatch.cpp b/submodules/Propagation/PatchMatch.cpp index 30be650e..f72cbe76 100644 --- a/submodules/Propagation/PatchMatch.cpp +++ b/submodules/Propagation/PatchMatch.cpp @@ -1,5 +1,6 @@ #include "PatchMatch.h" #include +#include #include @@ -148,21 +149,20 @@ Camera ReadCamera(torch::Tensor intrinsic, torch::Tensor pose, torch::Tensor dep return camera; } -void RescaleImageAndCamera(cv::Mat_ &src, cv::Mat_ &dst, cv::Mat_ &depth, Camera &camera) +void RescaleImageAndCamera(torch::Tensor &src, torch::Tensor &dst, torch::Tensor &depth, Camera &camera) { - const int cols = depth.cols; - const int rows = depth.rows; + const int cols = depth.size(1); + const int rows = depth.size(0); - if (cols == src.cols && rows == src.rows) { + if (cols == src.size(1) && rows == src.size(0)) { dst = src.clone(); return; } - const float scale_x = cols / static_cast(src.cols); - const float scale_y = rows / static_cast(src.rows); - - cv::resize(src, dst, cv::Size(cols,rows), 0, 0, cv::INTER_LINEAR); - + const float scale_x = cols / static_cast(src.size(1)); + const float scale_y = rows / static_cast(src.size(0)); + dst = torch::nn::functional::interpolate(src.unsqueeze(0), torch::nn::functional::InterpolateFuncOptions().size(std::vector({rows, cols})).mode(torch::kBilinear)).squeeze(0); + camera.K[0] *= scale_x; camera.K[2] *= scale_x; camera.K[4] *= scale_y; @@ -209,9 +209,9 @@ void ProjectonCamera(const float3 PointX, const Camera camera, float2 &point, fl point.y = (camera.K[3] * tmp.x + camera.K[4] * tmp.y + camera.K[5] * tmp.z) / depth; } -float GetAngle( const cv::Vec3f &v1, const cv::Vec3f &v2 ) +float GetAngle(const torch::Tensor &v1, const torch::Tensor &v2) { - float dot_product = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; + float dot_product = v1[0].item() * v2[0].item() + v1[1].item() * v2[1].item() + v1[2].item() * v2[2].item(); float angle = acosf(dot_product); //if angle is not a number the dot product was 1 and thus the two vectors should be identical --> return 0 if ( angle != angle ) @@ -285,19 +285,6 @@ static float GetDisparity(const Camera &camera, const int2 &p, const float &dept return std::sqrt(point3D[0] * point3D[0] + point3D[1] * point3D[1] + point3D[2] * point3D[2]); } -cv::Mat tensorToMat(const torch::Tensor& tensor) { - torch::Tensor tensor_contiguous = tensor.contiguous(); - torch::Tensor tensor_cpu_float = tensor_contiguous.to(torch::kCPU).to(torch::kFloat32); - - int height = tensor_cpu_float.size(0); - int width = tensor_cpu_float.size(1); - int channels = tensor_cpu_float.size(2); - - cv::Mat mat(cv::Size(width, height), CV_32FC(channels), tensor_cpu_float.data_ptr()); - - return mat.clone(); -} - void PatchMatch::SetGeomConsistencyParams() { params.geom_consistency = true; @@ -310,72 +297,65 @@ void PatchMatch::InuputInitialization(torch::Tensor images_cuda, torch::Tensor i images.clear(); cameras.clear(); - cv::Mat image_color = tensorToMat(images_cuda[0]); - cv::Mat image_float; - cv::cvtColor(image_color, image_float, cv::COLOR_RGB2GRAY); - - image_float.convertTo(image_float, CV_32FC1); + torch::Tensor image_color = images_cuda[0]; + torch::Tensor image_float = torch::mean(image_color, /*dim=*/2, /*keepdim=*/true).squeeze(); + image_float = image_float.to(torch::kFloat32); images.push_back(image_float); Camera camera = ReadCamera(intrinsics_cuda[0], poses_cuda[0], depth_intervals[0]); - camera.height = image_float.rows; - camera.width = image_float.cols; + camera.height = image_float.size(0); + camera.width = image_float.size(1); cameras.push_back(camera); - cv::Mat ref_depth = tensorToMat(depth_cuda); + torch::Tensor ref_depth = depth_cuda; depths.push_back(ref_depth); - cv::Mat ref_normal = tensorToMat(normal_cuda); + torch::Tensor ref_normal = normal_cuda; normals.push_back(ref_normal); int num_src_images = images_cuda.size(0); for (int i = 1; i < num_src_images; ++i) { - cv::Mat src_image_color = tensorToMat(images_cuda[i]); - cv::Mat src_image_float; - cv::cvtColor(src_image_color, src_image_float, cv::COLOR_RGB2GRAY); - - src_image_float.convertTo(src_image_float, CV_32FC1); + torch::Tensor src_image_color = images_cuda[i]; + torch::Tensor src_image_float = torch::mean(src_image_color, /*dim=*/2, /*keepdim=*/true).squeeze(); + src_image_float = src_image_float.to(torch::kFloat32); images.push_back(src_image_float); Camera camera = ReadCamera(intrinsics_cuda[i], poses_cuda[i], depth_intervals[i]); - camera.height = image_float.rows; - camera.width = image_float.cols; + camera.height = src_image_float.size(0); + camera.width = src_image_float.size(1); cameras.push_back(camera); } // Scale cameras and images for (size_t i = 0; i < images.size(); ++i) { - if (images[i].cols <= params.max_image_size && images[i].rows <= params.max_image_size) { + if (images[i].size(1) <= params.max_image_size && images[i].size(0) <= params.max_image_size) { continue; } - const float factor_x = static_cast(params.max_image_size) / images[i].cols; - const float factor_y = static_cast(params.max_image_size) / images[i].rows; + const float factor_x = static_cast(params.max_image_size) / images[i].size(1); + const float factor_y = static_cast(params.max_image_size) / images[i].size(0); const float factor = std::min(factor_x, factor_y); - const int new_cols = std::round(images[i].cols * factor); - const int new_rows = std::round(images[i].rows * factor); + const int new_cols = std::round(images[i].size(1) * factor); + const int new_rows = std::round(images[i].size(0) * factor); - const float scale_x = new_cols / static_cast(images[i].cols); - const float scale_y = new_rows / static_cast(images[i].rows); + const float scale_x = new_cols / static_cast(images[i].size(1)); + const float scale_y = new_rows / static_cast(images[i].size(0)); - cv::Mat_ scaled_image_float; - cv::resize(images[i], scaled_image_float, cv::Size(new_cols,new_rows), 0, 0, cv::INTER_LINEAR); + torch::Tensor scaled_image_float = torch::nn::functional::interpolate(images[i].unsqueeze(0), torch::nn::functional::InterpolateFuncOptions().size(std::vector({new_rows, new_cols})).mode(torch::kBilinear)).squeeze(0); images[i] = scaled_image_float.clone(); cameras[i].K[0] *= scale_x; cameras[i].K[2] *= scale_x; cameras[i].K[4] *= scale_y; cameras[i].K[5] *= scale_y; - cameras[i].height = scaled_image_float.rows; - cameras[i].width = scaled_image_float.cols; + cameras[i].height = scaled_image_float.size(0); + cameras[i].width = scaled_image_float.size(1); } params.depth_min = cameras[0].depth_min * 0.6f; params.depth_max = cameras[0].depth_max * 1.2f; - // std::cout << "depth range: " << params.depth_min << " " << params.depth_max << std::endl; params.num_images = (int)images.size(); - // std::cout << "num images: " << params.num_images << std::endl; params.disparity_min = cameras[0].K[0] * params.baseline / params.depth_max; params.disparity_max = cameras[0].K[0] * params.baseline / params.depth_min; @@ -386,13 +366,13 @@ void PatchMatch::CudaSpaceInitialization() num_images = (int)images.size(); for (int i = 0; i < num_images; ++i) { - int rows = images[i].rows; - int cols = images[i].cols; + int rows = images[i].size(0); + int cols = images[i].size(1); cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat); cudaMallocArray(&cuArray[i], &channelDesc, cols, rows); - cudaMemcpy2DToArray (cuArray[i], 0, 0, images[i].ptr(), images[i].step[0], cols*sizeof(float), rows, cudaMemcpyHostToDevice); + cudaMemcpy2DToArray(cuArray[i], 0, 0, images[i].data_ptr(), images[i].stride(0) * sizeof(float), cols * sizeof(float), rows, cudaMemcpyHostToDevice); struct cudaResourceDesc resDesc; memset(&resDesc, 0, sizeof(cudaResourceDesc)); @@ -404,16 +384,9 @@ void PatchMatch::CudaSpaceInitialization() texDesc.addressMode[0] = cudaAddressModeWrap; texDesc.addressMode[1] = cudaAddressModeWrap; texDesc.filterMode = cudaFilterModeLinear; - texDesc.readMode = cudaReadModeElementType; + texDesc.readMode = cudaReadModeElementType; texDesc.normalizedCoords = 0; - // cudaError_t error = cudaGetLastError(); - // printf("CUDA notification0: %s\n", "test"); - // if (error != cudaSuccess) { - // printf("CUDA error step 0: %s\n", cudaGetErrorString(error)); - // // 错误处理代码 - // } - cudaCreateTextureObject(&(texture_objects_host.images[i]), &resDesc, &texDesc, NULL); } @@ -428,9 +401,9 @@ void PatchMatch::CudaSpaceInitialization() for (int row = 0; row < cameras[0].height; ++row) { for (int col = 0; col < cameras[0].width; ++col) { int center = row * cameras[0].width + col; - cv::Vec3f normal = normals[0].at(row, col); - float depth = depths[0].at(row, col); - float4 plane_hypothesis = {normal[0], normal[1], normal[2], depth}; + torch::Tensor normal = normals[0][row][col]; + float depth = depths[0][row][col].item(); + float4 plane_hypothesis = {normal[0].item(), normal[1].item(), normal[2].item(), depth}; plane_hypotheses_host[center] = plane_hypothesis; } } @@ -444,8 +417,7 @@ void PatchMatch::CudaSpaceInitialization() cudaMalloc((void**)&selected_views_cuda, sizeof(unsigned int) * (cameras[0].height * cameras[0].width)); cudaMalloc((void**)&depths_cuda, sizeof(float) * (cameras[0].height * cameras[0].width)); - cudaMemcpy(depths_cuda, depths[0].ptr(), sizeof(float) * cameras[0].height * cameras[0].width, cudaMemcpyHostToDevice); - + cudaMemcpy(depths_cuda, depths[0].data_ptr(), sizeof(float) * cameras[0].height * cameras[0].width, cudaMemcpyHostToDevice); } int PatchMatch::GetReferenceImageWidth() @@ -458,7 +430,7 @@ int PatchMatch::GetReferenceImageHeight() return cameras[0].height; } -cv::Mat PatchMatch::GetReferenceImage() +torch::Tensor PatchMatch::GetReferenceImage() { return images[0]; } diff --git a/submodules/Propagation/PatchMatch.h b/submodules/Propagation/PatchMatch.h index f222816b..f10fb363 100644 --- a/submodules/Propagation/PatchMatch.h +++ b/submodules/Propagation/PatchMatch.h @@ -4,12 +4,12 @@ #include "main.h" #include -Camera ReadCamera(const std::string &cam_path); -void RescaleImageAndCamera(cv::Mat_ &src, cv::Mat_ &dst, cv::Mat_ &depth, Camera &camera); +Camera ReadCamera(torch::Tensor intrinsic, torch::Tensor pose, torch::Tensor depth_interval); +void RescaleImageAndCamera(torch::Tensor &src, torch::Tensor &dst, torch::Tensor &depth, Camera &camera); float3 Get3DPointonWorld(const int x, const int y, const float depth, const Camera camera); void ProjectonCamera(const float3 PointX, const Camera camera, float2 &point, float &depth); -float GetAngle(const cv::Vec3f &v1, const cv::Vec3f &v2); -void StoreColorPlyFileBinaryPointCloud (const std::string &plyFilePath, const std::vector &pc); +float GetAngle(const torch::Tensor &v1, const torch::Tensor &v2); +void StoreColorPlyFileBinaryPointCloud(const std::string &plyFilePath, const std::vector &pc); #define CUDA_SAFE_CALL(error) CudaSafeCall(error, __FILE__, __LINE__) #define CUDA_CHECK_ERROR() CudaCheckError(__FILE__, __LINE__) @@ -52,16 +52,16 @@ class PatchMatch { int GetPatchSize(); int GetReferenceImageWidth(); int GetReferenceImageHeight(); - cv::Mat GetReferenceImage(); + torch::Tensor GetReferenceImage(); float4 GetPlaneHypothesis(const int index); float GetCost(const int index); float4* GetPlaneHypotheses(); private: int num_images; - std::vector images; - std::vector depths; - std::vector normals; + std::vector images; + std::vector depths; + std::vector normals; std::vector cameras; cudaTextureObjects texture_objects_host; cudaTextureObjects texture_depths_host; diff --git a/submodules/Propagation/Propagation.cu b/submodules/Propagation/Propagation.cu index db932ac5..f8573ad4 100644 --- a/submodules/Propagation/Propagation.cu +++ b/submodules/Propagation/Propagation.cu @@ -1133,23 +1133,6 @@ void PatchMatch::RunPatchMatch() CUDA_SAFE_CALL(cudaDeviceSynchronize()); } -torch::Tensor matToTensor(cv::Mat& mat) { - cv::Mat mat_float; - if (mat.channels() == 3) { - mat.convertTo(mat_float, CV_32FC3); - } else if (mat.channels() == 1) { - mat.convertTo(mat_float, CV_32FC1); - } - - torch::Tensor tensor = torch::from_blob(mat_float.data, - {mat_float.rows, mat_float.cols, mat_float.channels()}, - torch::kFloat32).clone(); - - tensor = tensor.permute({2, 0, 1}); - - return tensor; -} - torch::Tensor propagate_cuda(torch::Tensor images, torch::Tensor intrinsics, torch::Tensor poses, torch::Tensor depth, torch::Tensor normal, torch::Tensor depth_intervals, int patch_size) { @@ -1158,6 +1141,8 @@ torch::Tensor propagate_cuda(torch::Tensor images, torch::Tensor intrinsics, tor PatchMatch pm; pm.SetPatchSize(patch_size); + images = images.to(torch::kFloat); + pm.InuputInitialization(images, intrinsics, poses, depth, normal, depth_intervals); pm.CudaSpaceInitialization(); diff --git a/submodules/Propagation/main.h b/submodules/Propagation/main.h index 13254fe9..c1b230bd 100644 --- a/submodules/Propagation/main.h +++ b/submodules/Propagation/main.h @@ -1,13 +1,6 @@ #ifndef _MAIN_H_ #define _MAIN_H_ -#include "opencv2/calib3d/calib3d.hpp" -#include "opencv2/imgproc/imgproc.hpp" -#include "opencv2/core/core.hpp" -#include -#include "opencv2/imgcodecs.hpp" -#include "opencv2/highgui/highgui.hpp" - // Includes CUDA #include #include diff --git a/submodules/Propagation/setup.py b/submodules/Propagation/setup.py index 500dceb7..d89ef64d 100644 --- a/submodules/Propagation/setup.py +++ b/submodules/Propagation/setup.py @@ -8,10 +8,6 @@ name='gaussianpro', ext_modules=[ CUDAExtension('gaussianpro', - include_dirs=['/data/chenyt/Code/opencv346/include', '/usr/local/cuda-11.8/include', '.'], - library_dirs=['/data/chenyt/Code/opencv346/lib/', '/data/chenyt/.conda/2dgs/lib'], - runtime_library_dirs=['/data/chenyt/Code/opencv346/lib/'], - libraries=['opencv_core', 'opencv_imgproc', 'opencv_highgui', 'opencv_imgcodecs'], sources=[ 'PatchMatch.cpp', 'Propagation.cu', @@ -25,4 +21,4 @@ ), ], cmdclass={ 'build_ext' : BuildExtension } -) +) \ No newline at end of file From e65c3f23a7cbb6e7eb599e23905337e21ff64a33 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 27 Sep 2024 21:19:09 +0800 Subject: [PATCH 27/71] fix: Add depth, depth_mask for depth loss --- scene/cameras.py | 10 ++++++---- train.py | 37 +++++++++++++++++++++++++++---------- utils/graphics_utils.py | 8 +++++++- utils/patchmatch.py | 27 +++++++++------------------ 4 files changed, 49 insertions(+), 33 deletions(-) diff --git a/scene/cameras.py b/scene/cameras.py index 203130c7..5110e2a4 100644 --- a/scene/cameras.py +++ b/scene/cameras.py @@ -28,6 +28,8 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.FoVx = FoVx self.FoVy = FoVy self.image_name = image_name + self.depth_prior = None + self.depth_mask = None try: self.data_device = torch.device(data_device) @@ -38,12 +40,12 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.original_image = image.clamp(0.0, 1.0).to(self.data_device) if normal is not None: - self.normal = normal.to(self.data_device) - normal_norm = torch.norm(self.normal, dim=0, keepdim=True) + self.normal_prior = normal.to(self.data_device) + normal_norm = torch.norm(self.normal_prior, dim=0, keepdim=True) self.normal_mask = ~((normal_norm > 1.1) | (normal_norm < 0.9)) - self.normal = self.normal / normal_norm + self.normal_prior = self.normal_prior / normal_norm else: - self.normal = None + self.normal_prior = None self.normal_mask = None self.image_width = self.original_image.shape[2] self.image_height = self.original_image.shape[1] diff --git a/train.py b/train.py index 939da299..e0d7b878 100644 --- a/train.py +++ b/train.py @@ -163,7 +163,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Set intervals for patch match intervals = [-2, -1, 1, 2] src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] - depth_loss = process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) + process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] @@ -173,23 +173,40 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 + # lambda_depth = opt.lambda_depth if iteration > 3000 else 0.0 + lambda_depth = 1 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 + depth_loss = torch.tensor(0) + normal_loss = torch.tensor(0) + normal_prior_loss = torch.tensor(0) + rend_dist = render_pkg["rend_dist"] + rend_depth = render_pkg["rend_depth"] + surf_depth = render_pkg["surf_depth"] dist_loss = lambda_dist * (rend_dist).mean() - + print(viewpoint_cam.depth_prior) + if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: + depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ + 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() + depth_mask = viewpoint_cam.depth_mask + valid_depth_sum = depth_mask.sum() + 1e-5 + depth_loss += lambda_depth * depth_error[viewpoint_cam.depth_mask].sum() / valid_depth_sum + print(depth_loss) rend_normal = render_pkg['rend_normal'] surf_normal_median = render_pkg['surf_normal'] surf_normal_expected = render_pkg['surf_normal_expected'] rend_alpha = render_pkg['rend_alpha'] - normal_error = 0.6 * (1 - (rend_normal * surf_normal_median).sum(dim=0))[None] + \ - 0.4 * (1 - (rend_normal * surf_normal_expected).sum(dim=0))[None] - normal_loss = lambda_normal * normal_error.mean() - if dataset.w_normal_prior: - prior_normal = viewpoint_cam.normal * (rend_alpha).detach() + if lambda_normal > 0.0: + normal_error = 0.6 * (1 - (rend_normal * surf_normal_median).sum(dim=0))[None] + \ + 0.4 * (1 - (rend_normal * surf_normal_expected).sum(dim=0))[None] + normal_loss += lambda_normal * normal_error.mean() + + if lambda_normal_prior > 0 and dataset.w_normal_prior: + prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() prior_normal_mask = viewpoint_cam.normal_mask[0] normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ @@ -197,12 +214,12 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') - normal_loss += lambda_normal_prior * normal_prior_error + normal_prior_loss = lambda_normal_prior * normal_prior_error if lambda_normal_gradient > 0.0: - normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) + normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) # loss - total_loss = loss + dist_loss + normal_loss + total_loss = loss + dist_loss + depth_loss + normal_loss + normal_prior_loss total_loss.backward() diff --git a/utils/graphics_utils.py b/utils/graphics_utils.py index 211f294f..c7f45777 100644 --- a/utils/graphics_utils.py +++ b/utils/graphics_utils.py @@ -13,7 +13,13 @@ import math import numpy as np from typing import NamedTuple -from gaussianpro import propagate +try: + from gaussianpro import propagate + propagation_installed = True +except: + propagation_installed = False + print("gaussianpro not installed") + class BasicPointCloud(NamedTuple): points : np.array diff --git a/utils/patchmatch.py b/utils/patchmatch.py index 51cd1eeb..9d17abc5 100644 --- a/utils/patchmatch.py +++ b/utils/patchmatch.py @@ -1,15 +1,17 @@ import torch from gaussian_renderer import render -from utils.graphics_utils import patchmatch_propagation, check_geometric_consistency +from utils.graphics_utils import patchmatch_propagation, check_geometric_consistency, propagation_installed def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs): + if not propagation_installed: + return + with torch.no_grad(): - loss_depth = torch.tensor(0.).cuda() if iteration > opt.propagation_begin and iteration < opt.propagation_after and (iteration % opt.propagation_interval == 0): render_pkg = render(viewpoint_cam, gaussians, pipe, background) projected_depth = render_pkg["rend_depth"] / render_pkg['rend_alpha'] - rendered_normal = render_pkg["rend_normal"] / render_pkg['rend_alpha'] if viewpoint_cam.normal is None else viewpoint_cam.normal + rendered_normal = render_pkg["rend_normal"] / render_pkg['rend_alpha'] if viewpoint_cam.normal_prior is None else viewpoint_cam.normal_prior R_w2c = torch.tensor(viewpoint_cam.R.T).cuda().to(torch.float32) rendered_normal_cam = (R_w2c @ rendered_normal.view(3, -1)).view(3, viewpoint_cam.image_height, viewpoint_cam.image_width) @@ -56,21 +58,10 @@ def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, backgro propagated_mask = propagated_mask.squeeze(0) depth_mask = valid_mask & cost_mask projected_depth = projected_depth.squeeze(0) - - # Res Vis - # rendered_normal_vis = (rendered_normal_cam + 1.0) / 2.0 - # normal_vis = (propagated_normal + 1.0) / 2.0 - # normal_vis[:, ~depth_mask] = 0 - # if not os.path.exists("cache/propagated_res"): - # os.makedirs("cache/propagated_res") - # torchvision.utils.save_image(normal_vis.cpu(), os.path.join("cache/propagated_res", f'{iteration}_normal_res.png')) - # torchvision.utils.save_image(rendered_normal_vis.cpu(), os.path.join("cache/propagated_res", f'{iteration}_normal_init.png')) - - valid_depth_sum = depth_mask.sum() + 1e-5 - loss_depth += torch.abs((projected_depth[valid_mask] - propagated_depth[valid_mask])).sum() / valid_depth_sum + + viewpoint_cam.depth_prior = projected_depth + viewpoint_cam.depth_mask = depth_mask if propagated_mask.sum() > 100: gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, rendered_normal.permute(1, 2, 0), propagated_mask) - # gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, propagated_normal, propagated_mask) - - return loss_depth \ No newline at end of file + # gaussians.densify_from_depth_propagation(viewpoint_cam, propagated_depth, propagated_normal, propagated_mask) \ No newline at end of file From 33a137c9351ee7821976b5cf0895505b3187afbf Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 27 Sep 2024 21:39:47 +0800 Subject: [PATCH 28/71] fix: Update diff-surfel-rasterization --- submodules/diff-surfel-rasterization | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/diff-surfel-rasterization b/submodules/diff-surfel-rasterization index b611171a..9af58adc 160000 --- a/submodules/diff-surfel-rasterization +++ b/submodules/diff-surfel-rasterization @@ -1 +1 @@ -Subproject commit b611171a903099eb137e0291726dc4e032cc741f +Subproject commit 9af58adc45c354153df4ffeb65680b826a271cea From 2419d68c6165795e0088b958774c71b85228ca3a Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sat, 28 Sep 2024 01:54:58 +0800 Subject: [PATCH 29/71] fix: Update normal initialization --- utils/graphics_utils.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/utils/graphics_utils.py b/utils/graphics_utils.py index c7f45777..67059652 100644 --- a/utils/graphics_utils.py +++ b/utils/graphics_utils.py @@ -158,21 +158,8 @@ def patchmatch_propagation(viewpoint_cam, rendered_depth, rendered_normal, viewp depth = rendered_depth.unsqueeze(-1) depth = depth.squeeze(0) - normal = torch.zeros_like(depth) - # _normal = (rendered_normal.permute(1,2,0) @ (viewpoint_cam.world_view_transform[:3,:3])).permute(2,0,1) - # _normal = viewpoint_cam.normal - # _normal = (_normal + 1) / 2 - # _normal = _normal.permute([1, 2, 0]) - # normal = _normal * 255 - # normal = normal.to(depth.device) - - #Vis input data - # if not os.path.exists("cache/ref_input"): - # os.makedirs("cache/ref_input") - # depth_vis = rendered_depth.squeeze(0).detach().cpu().numpy() - # normal_vis = normal.permute([2, 0, 1]).cpu()/255 - # torchvision.utils.save_image(normal_vis, os.path.join("cache/ref_input", 'normal_ref.png')) - # imageio.imwrite(os.path.join("cache/ref_input", 'depth_ref.png'), vis_depth(depth_vis)[0]) + normal = rendered_normal.permute([1, 2, 0]) + for idx, src_idx in enumerate(src_idxs): src_viewpoint = viewpoint_stack[src_idx] From 949e8c76d26833dff4a3ed9c14760357531d0353 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sat, 28 Sep 2024 01:55:30 +0800 Subject: [PATCH 30/71] fix: Improve initialization speed by fusion operation --- submodules/Propagation/PatchMatch.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/submodules/Propagation/PatchMatch.cpp b/submodules/Propagation/PatchMatch.cpp index f72cbe76..0f6714cf 100644 --- a/submodules/Propagation/PatchMatch.cpp +++ b/submodules/Propagation/PatchMatch.cpp @@ -396,17 +396,13 @@ void PatchMatch::CudaSpaceInitialization() cudaMalloc((void**)&cameras_cuda, sizeof(Camera) * (num_images)); cudaMemcpy(cameras_cuda, &cameras[0], sizeof(Camera) * (num_images), cudaMemcpyHostToDevice); - int total_pixels = cameras[0].height * cameras[0].width; - plane_hypotheses_host = new float4[total_pixels]; - for (int row = 0; row < cameras[0].height; ++row) { - for (int col = 0; col < cameras[0].width; ++col) { - int center = row * cameras[0].width + col; - torch::Tensor normal = normals[0][row][col]; - float depth = depths[0][row][col].item(); - float4 plane_hypothesis = {normal[0].item(), normal[1].item(), normal[2].item(), depth}; - plane_hypotheses_host[center] = plane_hypothesis; - } - } + int total_pixels = cameras[0].height * cameras[0].width; + // Concatenate normals and depths into a single tensor + torch::Tensor plane_hypotheses_tensor = torch::cat({ + normals[0].view({total_pixels, 3}), + depths[0].view({total_pixels, 1}) + }, 1); + plane_hypotheses_host = plane_hypotheses_tensor.data_ptr(); cudaMalloc((void**)&plane_hypotheses_cuda, sizeof(float4) * total_pixels); cudaMemcpy(plane_hypotheses_cuda, plane_hypotheses_host, sizeof(float4) * total_pixels, cudaMemcpyHostToDevice); From 5243b9f4d83d005bd114f9cddca83821e857ba2a Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sat, 28 Sep 2024 03:46:11 +0800 Subject: [PATCH 31/71] feat: Enhance depth handling and bug fixes - Add lambda_depth parameter and adjust depth-related logic - Fix memory management in PatchMatch initialization - Improve consistency for tensor operations in training --- arguments/__init__.py | 1 + submodules/Propagation/PatchMatch.cpp | 6 +++++- train.py | 15 +++++++-------- utils/graphics_utils.py | 9 --------- utils/patchmatch.py | 4 ++-- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index d3a70a17..b00fb4bd 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -88,6 +88,7 @@ def __init__(self, parser): self.percent_dense = 0.01 self.lambda_dssim = 0.2 self.lambda_dist = 0. + self.lambda_depth = 0.1 self.lambda_normal = 0.05 self.lambda_normal_prior = 0.25 self.lambda_normal_gradient = 0 diff --git a/submodules/Propagation/PatchMatch.cpp b/submodules/Propagation/PatchMatch.cpp index 0f6714cf..e9e2f582 100644 --- a/submodules/Propagation/PatchMatch.cpp +++ b/submodules/Propagation/PatchMatch.cpp @@ -402,7 +402,11 @@ void PatchMatch::CudaSpaceInitialization() normals[0].view({total_pixels, 3}), depths[0].view({total_pixels, 1}) }, 1); - plane_hypotheses_host = plane_hypotheses_tensor.data_ptr(); + + // TODO: Fix initialization bug + // auto plane_hypotheses_float4 = plane_hypotheses_tensor.to(torch::kFloat32).view({-1, 4}); + // plane_hypotheses_host = reinterpret_cast(plane_hypotheses_float4.data_ptr()); + plane_hypotheses_host = new float4[total_pixels]; cudaMalloc((void**)&plane_hypotheses_cuda, sizeof(float4) * total_pixels); cudaMemcpy(plane_hypotheses_cuda, plane_hypotheses_host, sizeof(float4) * total_pixels, cudaMemcpyHostToDevice); diff --git a/train.py b/train.py index e0d7b878..3805c23b 100644 --- a/train.py +++ b/train.py @@ -173,27 +173,26 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 - # lambda_depth = opt.lambda_depth if iteration > 3000 else 0.0 - lambda_depth = 1 + lambda_depth = opt.lambda_depth if iteration > 3000 else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 - depth_loss = torch.tensor(0) - normal_loss = torch.tensor(0) - normal_prior_loss = torch.tensor(0) + depth_loss = torch.tensor(0.).to("cuda") + normal_loss = torch.tensor(0.).to("cuda") + normal_prior_loss = torch.tensor(0.).to("cuda") rend_dist = render_pkg["rend_dist"] rend_depth = render_pkg["rend_depth"] surf_depth = render_pkg["surf_depth"] dist_loss = lambda_dist * (rend_dist).mean() - print(viewpoint_cam.depth_prior) + if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() - depth_mask = viewpoint_cam.depth_mask + depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) valid_depth_sum = depth_mask.sum() + 1e-5 - depth_loss += lambda_depth * depth_error[viewpoint_cam.depth_mask].sum() / valid_depth_sum + depth_loss += lambda_depth * (depth_error[depth_mask].sum() / valid_depth_sum) print(depth_loss) rend_normal = render_pkg['rend_normal'] surf_normal_median = render_pkg['surf_normal'] diff --git a/utils/graphics_utils.py b/utils/graphics_utils.py index 67059652..78a65568 100644 --- a/utils/graphics_utils.py +++ b/utils/graphics_utils.py @@ -168,15 +168,6 @@ def patchmatch_propagation(viewpoint_cam, rendered_depth, rendered_normal, viewp poses.append(src_viewpoint.world_view_transform.transpose(0, 1)) depth_intervals.append(depth_interval) - # ### vis rgb depth - # for i in range(len(images)): - # cv2.imwrite(str(i) + "rgb.jpg", images[i].cpu().numpy()) - # print(intrinsics) - # print(poses) - # print(depth_intervals) - # cv2.imwrite("depth.jpg", depth.cpu().numpy()) - # exit() - images = torch.stack(images) intrinsics = torch.stack(intrinsics) poses = torch.stack(poses) diff --git a/utils/patchmatch.py b/utils/patchmatch.py index 9d17abc5..dd1a65a5 100644 --- a/utils/patchmatch.py +++ b/utils/patchmatch.py @@ -38,7 +38,7 @@ def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, backgro src_K = src_viewpoint.K src_render_pkg = render(src_viewpoint, gaussians, pipe, background) src_projected_depth = src_render_pkg["rend_depth"] / src_render_pkg['rend_alpha'] - src_rendered_normal = src_render_pkg["rend_normal"] / src_render_pkg['rend_alpha'] if src_viewpoint.normal is None else src_viewpoint.normal + src_rendered_normal = src_render_pkg["rend_normal"] / src_render_pkg['rend_alpha'] if src_viewpoint.normal_prior is None else src_viewpoint.normal_prior R_w2c = torch.tensor(src_viewpoint.R.T).cuda().to(torch.float32) src_rendered_normal_cam = (R_w2c @ src_rendered_normal.view(3, -1)).view(3, src_viewpoint.image_height, src_viewpoint.image_width) @@ -56,7 +56,7 @@ def process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, backgro propagated_mask = valid_mask & error_mask & cost_mask propagated_mask = propagated_mask.squeeze(0) - depth_mask = valid_mask & cost_mask + depth_mask = (valid_mask & cost_mask).squeeze(0) projected_depth = projected_depth.squeeze(0) viewpoint_cam.depth_prior = projected_depth From 08186089c94a13666c705cb8f7df0368a9c02a0f Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 29 Sep 2024 21:26:26 +0800 Subject: [PATCH 32/71] fix: Update diff-surfel-rasterization --- submodules/diff-surfel-rasterization | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/diff-surfel-rasterization b/submodules/diff-surfel-rasterization index 9af58adc..910e7627 160000 --- a/submodules/diff-surfel-rasterization +++ b/submodules/diff-surfel-rasterization @@ -1 +1 @@ -Subproject commit 9af58adc45c354153df4ffeb65680b826a271cea +Subproject commit 910e762782dd417c9a68f8a17504b95c6fc4e048 From a4e9312943b63ffd8d0d3b4721831ebe249834d4 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 29 Sep 2024 21:28:04 +0800 Subject: [PATCH 33/71] feat: Add normal guided 2dgs init --- scene/dataset_readers.py | 23 +++++++++++++++++++---- scene/gaussian_model.py | 5 +++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index 6460bbe0..c3b3e69d 100644 --- a/scene/dataset_readers.py +++ b/scene/dataset_readers.py @@ -18,6 +18,7 @@ from utils.graphics_utils import getWorld2View2, focal2fov, fov2focal import numpy as np import json +import open3d as o3d from pathlib import Path from plyfile import PlyData, PlyElement from utils.sh_utils import SH2RGB @@ -118,6 +119,22 @@ def fetchPly(path): positions = np.vstack([vertices['x'], vertices['y'], vertices['z']]).T colors = np.vstack([vertices['red'], vertices['green'], vertices['blue']]).T / 255.0 normals = np.vstack([vertices['nx'], vertices['ny'], vertices['nz']]).T + + # Detect if normals are invalid + if np.all(normals == 0): + normals = None + + if normals is None: + print("Normals not provided or invalid. Estimating normals...") + # Create point cloud using Open3D + pcd = o3d.geometry.PointCloud() + pcd.points = o3d.utility.Vector3dVector(positions) + + # Estimate normals using Open3D + pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) + + # Convert normals back to numpy array + normals = np.asarray(pcd.normals) return BasicPointCloud(points=positions, colors=colors, normals=normals) def storePly(path, xyz, rgb): @@ -172,10 +189,8 @@ def readColmapSceneInfo(path, images, eval, llffhold=8): except: xyz, rgb, _ = read_points3D_text(txt_path) storePly(ply_path, xyz, rgb) - try: - pcd = fetchPly(ply_path) - except: - pcd = None + + pcd = fetchPly(ply_path) scene_info = SceneInfo(point_cloud=pcd, train_cameras=train_cam_infos, diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 16486999..6d979013 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -164,7 +164,9 @@ def create_from_pcd(self, pcd : BasicPointCloud, spatial_lr_scale : float): dist2 = torch.clamp_min(distCUDA2(torch.from_numpy(np.asarray(pcd.points)).float().cuda()), 0.0000001) scales = torch.log(torch.sqrt(dist2))[...,None].repeat(1, 2) - rots = torch.rand((fused_point_cloud.shape[0], 4), device="cuda") + + # calculate normal + rots = normal2rotation(torch.from_numpy(np.asarray(pcd.normals)).float().cuda()) opacities = self.inverse_opacity_activation(0.1 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) @@ -525,7 +527,6 @@ def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, propag features[:, :3, 0 ] = fused_color features[:, 3:, 1:] = 0.0 - original_point_cloud = self.get_xyz scales = torch.log(world_scale)[..., None].repeat(1, 2) rots = normal2rotation(world_normal).to(scales.device) opacities = inverse_sigmoid(0.5 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) From 90e36874a276764e0482ab52fd43ce4b42998fbc Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 30 Sep 2024 15:19:34 +0800 Subject: [PATCH 34/71] fix: Update normal-guided init --- scene/dataset_readers.py | 13 ------------- scene/gaussian_model.py | 5 ++++- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index c3b3e69d..32e457a8 100644 --- a/scene/dataset_readers.py +++ b/scene/dataset_readers.py @@ -120,21 +120,8 @@ def fetchPly(path): colors = np.vstack([vertices['red'], vertices['green'], vertices['blue']]).T / 255.0 normals = np.vstack([vertices['nx'], vertices['ny'], vertices['nz']]).T - # Detect if normals are invalid if np.all(normals == 0): normals = None - - if normals is None: - print("Normals not provided or invalid. Estimating normals...") - # Create point cloud using Open3D - pcd = o3d.geometry.PointCloud() - pcd.points = o3d.utility.Vector3dVector(positions) - - # Estimate normals using Open3D - pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) - - # Convert normals back to numpy array - normals = np.asarray(pcd.normals) return BasicPointCloud(points=positions, colors=colors, normals=normals) def storePly(path, xyz, rgb): diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 6d979013..09d81998 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -166,7 +166,10 @@ def create_from_pcd(self, pcd : BasicPointCloud, spatial_lr_scale : float): scales = torch.log(torch.sqrt(dist2))[...,None].repeat(1, 2) # calculate normal - rots = normal2rotation(torch.from_numpy(np.asarray(pcd.normals)).float().cuda()) + if pcd.normals is None: + rots = torch.rand((fused_point_cloud.shape[0], 4), device="cuda") + else: + rots = normal2rotation(torch.from_numpy(np.asarray(pcd.normals)).float().cuda()) opacities = self.inverse_opacity_activation(0.1 * torch.ones((fused_point_cloud.shape[0], 1), dtype=torch.float, device="cuda")) From 7fcf6008952e7af612f9909ee471ce1351d419fd Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Sun, 13 Oct 2024 17:39:25 +0800 Subject: [PATCH 35/71] fix: Update train_progressive --- arguments/__init__.py | 2 +- train.py | 33 +++++++++++++------------- train_progressive.py | 55 ++++++++++++++++++++++++++----------------- 3 files changed, 52 insertions(+), 38 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index b00fb4bd..43405deb 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -50,7 +50,7 @@ def __init__(self, parser, sentinel=False): self._source_path = "" self._model_path = "" self._images = "images" - self._resolution = 2 + self._resolution = 1 self._white_background = False self.data_device = "cuda" self.eval = False diff --git a/train.py b/train.py index 3805c23b..3ae004eb 100644 --- a/train.py +++ b/train.py @@ -12,7 +12,7 @@ import os import torch from random import randint -from utils.loss_utils import l1_loss_appearance, ssim +from utils.loss_utils import l1_loss_appearance, ssim, l1_loss from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F @@ -133,7 +133,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi viewpoint_stack = None ema_loss_for_log = 0.0 - ema_dist_for_log = 0.0 + ema_depth_for_log = 0.0 ema_normal_for_log = 0.0 progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") @@ -173,7 +173,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 - lambda_depth = opt.lambda_depth if iteration > 3000 else 0.0 + lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 @@ -192,24 +192,25 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) valid_depth_sum = depth_mask.sum() + 1e-5 - depth_loss += lambda_depth * (depth_error[depth_mask].sum() / valid_depth_sum) - print(depth_loss) + depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) + rend_normal = render_pkg['rend_normal'] surf_normal_median = render_pkg['surf_normal'] surf_normal_expected = render_pkg['surf_normal_expected'] rend_alpha = render_pkg['rend_alpha'] if lambda_normal > 0.0: - normal_error = 0.6 * (1 - (rend_normal * surf_normal_median).sum(dim=0))[None] + \ - 0.4 * (1 - (rend_normal * surf_normal_expected).sum(dim=0))[None] - normal_loss += lambda_normal * normal_error.mean() + normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') + normal_loss += lambda_normal * normal_error if lambda_normal_prior > 0 and dataset.w_normal_prior: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() prior_normal_mask = viewpoint_cam.normal_mask[0] - normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') @@ -227,14 +228,14 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi with torch.no_grad(): # Progress bar ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log - ema_dist_for_log = 0.4 * dist_loss.item() + 0.6 * ema_dist_for_log + ema_depth_for_log = 0.4 * depth_loss.item() + 0.6 * ema_depth_for_log ema_normal_for_log = 0.4 * normal_loss.item() + 0.6 * ema_normal_for_log if iteration % 10 == 0: loss_dict = { "Loss": f"{ema_loss_for_log:.{5}f}", - "distort": f"{ema_dist_for_log:.{5}f}", + "depth": f"{ema_depth_for_log:.{5}f}", "normal": f"{ema_normal_for_log:.{5}f}", "Points": f"{len(gaussians.get_xyz)}" } @@ -246,10 +247,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Log and save if tb_writer is not None: - tb_writer.add_scalar('train_loss_patches/dist_loss', ema_dist_for_log, iteration) + tb_writer.add_scalar('train_loss_patches/dist_loss', ema_depth_for_log, iteration) tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) - # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) if (iteration in saving_iterations): print("\n[ITER {}] Saving Gaussians".format(iteration)) scene.save(iteration) @@ -408,8 +409,8 @@ def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_i parser.add_argument('--ip', type=str, default="127.0.0.1") parser.add_argument('--port', type=int, default=6009) parser.add_argument('--detect_anomaly', action='store_true', default=False) - parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) - parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) parser.add_argument("--start_checkpoint", type=str, default = None) diff --git a/train_progressive.py b/train_progressive.py index 5c322981..a3c9b45c 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -12,7 +12,7 @@ import os import torch from random import randint -from utils.loss_utils import l1_loss_appearance, ssim +from utils.loss_utils import l1_loss_appearance, ssim, l1_loss from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F @@ -133,7 +133,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi viewpoint_stack = None ema_loss_for_log = 0.0 - ema_dist_for_log = 0.0 + ema_depth_for_log = 0.0 ema_normal_for_log = 0.0 progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") @@ -181,36 +181,49 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 - lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 + lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 - rend_dist = render_pkg["rend_dist"] - dist_loss = lambda_dist * (rend_dist).mean() + depth_loss = torch.tensor(0.).to("cuda") + normal_loss = torch.tensor(0.).to("cuda") + normal_prior_loss = torch.tensor(0.).to("cuda") + + rend_depth = render_pkg["rend_depth"] + surf_depth = render_pkg["surf_depth"] + if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: + depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ + 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() + depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) + valid_depth_sum = depth_mask.sum() + 1e-5 + depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) rend_normal = render_pkg['rend_normal'] surf_normal_median = render_pkg['surf_normal'] surf_normal_expected = render_pkg['surf_normal_expected'] rend_alpha = render_pkg['rend_alpha'] - normal_error = 0.6 * (1 - (rend_normal * surf_normal_median).sum(dim=0))[None] + \ - 0.4 * (1 - (rend_normal * surf_normal_expected).sum(dim=0))[None] - normal_loss = lambda_normal * normal_error.mean() - if dataset.w_normal_prior: - prior_normal = viewpoint_cam.normal * (rend_alpha).detach() + if lambda_normal > 0.0: + normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') + normal_loss += lambda_normal * normal_error + + if lambda_normal_prior > 0 and dataset.w_normal_prior: + prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() prior_normal_mask = viewpoint_cam.normal_mask[0] - normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') - normal_loss += lambda_normal_prior * normal_prior_error + normal_prior_loss = lambda_normal_prior * normal_prior_error if lambda_normal_gradient > 0.0: - normal_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) + normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) # loss - total_loss = loss + dist_loss + normal_loss + total_loss = loss + depth_loss + normal_loss + normal_prior_loss total_loss.backward() @@ -219,14 +232,14 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi with torch.no_grad(): # Progress bar ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log - ema_dist_for_log = 0.4 * dist_loss.item() + 0.6 * ema_dist_for_log + ema_depth_for_log = 0.4 * depth_loss.item() + 0.6 * ema_depth_for_log ema_normal_for_log = 0.4 * normal_loss.item() + 0.6 * ema_normal_for_log if iteration % 10 == 0: loss_dict = { "Loss": f"{ema_loss_for_log:.{5}f}", - "distort": f"{ema_dist_for_log:.{5}f}", + "depth": f"{ema_depth_for_log:.{5}f}", "normal": f"{ema_normal_for_log:.{5}f}", "Points": f"{len(gaussians.get_xyz)}" } @@ -238,10 +251,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Log and save if tb_writer is not None: - tb_writer.add_scalar('train_loss_patches/dist_loss', ema_dist_for_log, iteration) + tb_writer.add_scalar('train_loss_patches/depth_loss', ema_depth_for_log, iteration) tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) - # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) if (iteration in saving_iterations): print("\n[ITER {}] Saving Gaussians".format(iteration)) scene.save(iteration) @@ -400,8 +413,8 @@ def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_i parser.add_argument('--ip', type=str, default="127.0.0.1") parser.add_argument('--port', type=int, default=6009) parser.add_argument('--detect_anomaly', action='store_true', default=False) - parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) - parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) parser.add_argument("--start_checkpoint", type=str, default = None) From 8b3f0b747656cc3c9aacb7f5766515d9f59bb9e6 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 04:15:57 +0800 Subject: [PATCH 36/71] fix: Update fetchPly to load point cloud without normals --- scene/dataset_readers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index 32e457a8..1e7ae760 100644 --- a/scene/dataset_readers.py +++ b/scene/dataset_readers.py @@ -118,8 +118,10 @@ def fetchPly(path): vertices = plydata['vertex'] positions = np.vstack([vertices['x'], vertices['y'], vertices['z']]).T colors = np.vstack([vertices['red'], vertices['green'], vertices['blue']]).T / 255.0 - normals = np.vstack([vertices['nx'], vertices['ny'], vertices['nz']]).T - + try: + normals = np.vstack([vertices['nx'], vertices['ny'], vertices['nz']]).T + except: + normals = np.zeros_like(positions) if np.all(normals == 0): normals = None return BasicPointCloud(points=positions, colors=colors, normals=normals) From 465ba80c1911bc746013a4d5323cad944ce8d137 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 05:38:26 +0800 Subject: [PATCH 37/71] feat: Add background gaussian --- gaussian_renderer/__init__.py | 72 ++++++++++++----------------------- scene/__init__.py | 7 +++- scene/gaussian_model.py | 54 ++++++++++++++++++++++++-- train.py | 22 +++++++---- 4 files changed, 94 insertions(+), 61 deletions(-) diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 90d88b17..96738923 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -16,15 +16,29 @@ from utils.sh_utils import eval_sh from utils.point_utils import depth_to_normal -def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, scaling_modifier = 1.0, override_color = None, record_transmittance=False): +def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, scaling_modifier = 1.0, + override_color = None, record_transmittance=False, bg_gaussians=None): """ Render the scene. Background tensor (bg_color) must be on GPU! """ - + if bg_gaussians is None: + means3D = pc.get_xyz + opacity = pc.get_opacity + scales = pc.get_scaling + rotations = pc.get_rotation + shs = pc.get_features + else: + means3D = torch.cat([pc.get_xyz, bg_gaussians.get_xyz]) + opacity = torch.cat([pc.get_opacity, bg_gaussians.get_opacity]) + scales = torch.cat([pc.get_scaling, bg_gaussians.get_scaling]) + rotations = torch.cat([pc.get_rotation, bg_gaussians.get_rotation]) + shs = torch.cat([pc.get_features, bg_gaussians.get_features]) + num_fg_points = pc.get_xyz.shape[0] + # Create zero tensor. We will use it to make pytorch return gradients of the 2D (screen-space) means - screenspace_points = torch.zeros((pc.get_xyz.shape[0], 4), dtype=pc.get_xyz.dtype, requires_grad=True, device="cuda") + 0 + screenspace_points = torch.zeros((means3D.shape[0], 4), dtype=pc.get_xyz.dtype, requires_grad=True, device="cuda") + 0 try: screenspace_points.retain_grad() except: @@ -53,64 +67,26 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, rasterizer = GaussianRasterizer(raster_settings=raster_settings) - means3D = pc.get_xyz means2D = screenspace_points - opacity = pc.get_opacity - - # If precomputed 3d covariance is provided, use it. If not, then it will be computed from - # scaling / rotation by the rasterizer. - scales = None - rotations = None - cov3D_precomp = None - if pipe.compute_cov3D_python: - # currently don't support normal consistency loss if use precomputed covariance - splat2world = pc.get_covariance(scaling_modifier) - W, H = viewpoint_camera.image_width, viewpoint_camera.image_height - near, far = viewpoint_camera.znear, viewpoint_camera.zfar - ndc2pix = torch.tensor([ - [W / 2, 0, 0, (W-1) / 2], - [0, H / 2, 0, (H-1) / 2], - [0, 0, far-near, near], - [0, 0, 0, 1]]).float().cuda().T - world2pix = viewpoint_camera.full_proj_transform @ ndc2pix - cov3D_precomp = (splat2world[:, [0,1,3]] @ world2pix[:,[0,1,3]]).permute(0,2,1).reshape(-1, 9) # column major - else: - scales = pc.get_scaling - rotations = pc.get_rotation - - # If precomputed colors are provided, use them. Otherwise, if it is desired to precompute colors - # from SHs in Python, do it. If not, then SH -> RGB conversion will be done by rasterizer. - pipe.convert_SHs_python = False - shs = None - colors_precomp = None - if override_color is None: - if pipe.convert_SHs_python: - shs_view = pc.get_features.transpose(1, 2).view(-1, 3, (pc.max_sh_degree+1)**2) - dir_pp = (pc.get_xyz - viewpoint_camera.camera_center.repeat(pc.get_features.shape[0], 1)) - dir_pp_normalized = dir_pp/dir_pp.norm(dim=1, keepdim=True) - sh2rgb = eval_sh(pc.active_sh_degree, shs_view, dir_pp_normalized) - colors_precomp = torch.clamp_min(sh2rgb + 0.5, 0.0) - else: - shs = pc.get_features - else: - colors_precomp = override_color - + output = rasterizer( means3D = means3D, means2D = means2D, shs = shs, - colors_precomp = colors_precomp, + colors_precomp = None, opacities = opacity, scales = scales, rotations = rotations, - cov3D_precomp = cov3D_precomp - ) - + cov3D_precomp = None) + if record_transmittance: rendered_image, radii, allmap, transmittance_avg, num_covered_pixels = output + transmittance_avg = transmittance_avg[:num_fg_points] + num_covered_pixels = num_covered_pixels[:num_fg_points] else: rendered_image, radii, allmap = output transmittance_avg = num_covered_pixels = None + radii = radii[:num_fg_points] # Those Gaussians that were frustum culled or had a radius of 0 were not visible. # They will be excluded from value updates used in the splitting criteria. rets = {"render": rendered_image, diff --git a/scene/__init__.py b/scene/__init__.py index 5d85d918..a944917f 100644 --- a/scene/__init__.py +++ b/scene/__init__.py @@ -14,7 +14,7 @@ import json from utils.system_utils import searchForMaxIteration from scene.dataset_readers import sceneLoadTypeCallbacks -from scene.gaussian_model import GaussianModel +from scene.gaussian_model import GaussianModel, BgGaussianModel from scene.appearance_model import AppearanceModel from arguments import ModelParams from utils.camera_utils import cameraList_from_camInfos, camera_to_JSON @@ -23,13 +23,14 @@ class Scene: gaussians : GaussianModel - def __init__(self, args : ModelParams, gaussians : GaussianModel, load_iteration=None, shuffle=True, resolution_scales=[1.0]): + def __init__(self, args : ModelParams, gaussians : GaussianModel, bg_gaussians: BgGaussianModel = None, load_iteration=None, shuffle=True, resolution_scales=[1.0]): """b :param path: Path to colmap scene main folder. """ self.model_path = args.model_path self.loaded_iter = None self.gaussians = gaussians + self.bg_gaussians = bg_gaussians if load_iteration: if load_iteration == -1: @@ -82,10 +83,12 @@ def __init__(self, args : ModelParams, gaussians : GaussianModel, load_iteration "point_cloud.ply")) else: self.gaussians.create_from_pcd(scene_info.point_cloud, self.cameras_extent) + self.bg_gaussians.load_ply('background_gs.ply') def save(self, iteration): point_cloud_path = os.path.join(self.model_path, "point_cloud/iteration_{}".format(iteration)) self.gaussians.save_ply(os.path.join(point_cloud_path, "point_cloud.ply")) + self.bg_gaussians.save_ply(os.path.join(point_cloud_path, "bg_point_cloud.ply")) def getTrainCameras(self, scale=1.0): return self.train_cameras[scale] diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 09d81998..2a6c1298 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -274,6 +274,7 @@ def load_ply(self, path): scales = np.zeros((xyz.shape[0], len(scale_names))) for idx, attr_name in enumerate(scale_names): scales[:, idx] = np.asarray(plydata.elements[0][attr_name]) + scales = scales[:, :2] rot_names = [p.name for p in plydata.elements[0].properties if p.name.startswith("rot")] rot_names = sorted(rot_names, key = lambda x: int(x.split('_')[-1])) @@ -478,10 +479,10 @@ def split_big_points(self, max_screen_size): def add_densification_stats(self, viewspace_point_tensor, update_filter, pixels): if pixels is not None: - self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) * pixels[update_filter].unsqueeze(-1) + self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[:len(update_filter)][update_filter], dim=-1, keepdim=True) * pixels[update_filter].unsqueeze(-1) self.denom[update_filter] += pixels[update_filter].unsqueeze(-1) else: - self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[update_filter], dim=-1, keepdim=True) + self.xyz_gradient_accum[update_filter] += torch.norm(viewspace_point_tensor.grad[:len(update_filter)][update_filter], dim=-1, keepdim=True) self.denom[update_filter] += 1 @@ -542,4 +543,51 @@ def densify_from_depth_propagation(self, viewpoint_cam, propagated_depth, propag new_opacity = nn.Parameter(opacities.requires_grad_(True)) #update gaussians - self.densification_postfix(new_xyz, new_features_dc, new_features_rest, new_opacity, new_scaling, new_rotation) \ No newline at end of file + self.densification_postfix(new_xyz, new_features_dc, new_features_rest, new_opacity, new_scaling, new_rotation) + +class BgGaussianModel(GaussianModel): + def __init__(self, sh_degree: int): + self.active_sh_degree = 3 + self.max_sh_degree = sh_degree + self._features_dc = torch.empty(0) + self._features_rest = torch.empty(0) + self._scaling = torch.empty(0) + self._rotation = torch.empty(0) + self._opacity = torch.empty(0) + self.optimizer = None + self.setup_functions() + + def capture(self): + return ( + self.active_sh_degree, + self._features_dc, + self._features_rest, + self._scaling, + self._rotation, + self._opacity, + self.optimizer.state_dict(), + ) + + def restore(self, model_args): + ( + self.active_sh_degree, + self._features_dc, + self._features_rest, + self._scaling, + self._rotation, + self._opacity, + opt_dict, + ) = model_args + self.setup_optimizer() + self.optimizer.load_state_dict(opt_dict) + + def training_setup(self, training_args): + l = [ + {'params': [self._features_dc], 'lr': 0.01, "name": "f_dc"}, + {'params': [self._features_rest], 'lr': 0.0005, "name": "f_rest"}, + {'params': [self._opacity], 'lr': 0.05, "name": "opacity"}, + {'params': [self._scaling], 'lr': 0.005, "name": "scaling"}, + {'params': [self._rotation], 'lr': 0.001, "name": "rotation"} + ] + + self.optimizer = torch.optim.Adam(l, lr=0.0, eps=1e-15) \ No newline at end of file diff --git a/train.py b/train.py index 3ae004eb..ea1e4b15 100644 --- a/train.py +++ b/train.py @@ -16,7 +16,7 @@ from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F -from scene import Scene, GaussianModel, AppearanceModel +from scene import Scene, GaussianModel, BgGaussianModel, AppearanceModel from utils.general_utils import safe_state from utils.patchmatch import process_propagation import uuid @@ -119,8 +119,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi first_iter = 0 tb_writer = prepare_output_and_logger(dataset) gaussians = GaussianModel(dataset.sh_degree) - scene = Scene(dataset, gaussians) + bg_gaussians = BgGaussianModel(dataset.sh_degree) + scene = Scene(dataset, gaussians, bg_gaussians) gaussians.training_setup(opt) + bg_gaussians.training_setup(opt) if checkpoint: (model_params, first_iter) = torch.load(checkpoint) gaussians.restore(model_params, opt) @@ -161,10 +163,11 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi viewpoint_idx = randint(0, len(all_cameras)-1) viewpoint_cam = all_cameras[viewpoint_idx] # Set intervals for patch match - intervals = [-2, -1, 1, 2] - src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] - process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) - render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) + # intervals = [-2, -1, 1, 2] + # src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] + # process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter), bg_gaussians=bg_gaussians) + # render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] gt_image = viewpoint_cam.original_image.cuda() @@ -250,7 +253,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi tb_writer.add_scalar('train_loss_patches/dist_loss', ema_depth_for_log, iteration) tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) - training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) if (iteration in saving_iterations): print("\n[ITER {}] Saving Gaussians".format(iteration)) scene.save(iteration) @@ -289,6 +292,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if appearances is not None: appearances.optimizer.step() appearances.optimizer.zero_grad(set_to_none = True) + if bg_gaussians is not None: + bg_gaussians.optimizer.step() + bg_gaussians.optimizer.zero_grad(set_to_none = True) if (iteration in checkpoint_iterations): print("\n[ITER {}] Saving Checkpoint".format(iteration)) @@ -410,7 +416,7 @@ def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_i parser.add_argument('--port', type=int, default=6009) parser.add_argument('--detect_anomaly', action='store_true', default=False) parser.add_argument("--test_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) - parser.add_argument("--save_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[500, 7_000, 20_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) parser.add_argument("--start_checkpoint", type=str, default = None) From 0b28dcee29a232f69144c53315ef4e6dfbc385d1 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 23:04:31 +0800 Subject: [PATCH 38/71] feat: Update BgGaussianModel training setup - Remove redundant setup_optimizer call - Adjust optimizer params to use training_args config - Simplify parameter group definitions --- scene/gaussian_model.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/scene/gaussian_model.py b/scene/gaussian_model.py index 2a6c1298..051b2805 100644 --- a/scene/gaussian_model.py +++ b/scene/gaussian_model.py @@ -578,16 +578,13 @@ def restore(self, model_args): self._opacity, opt_dict, ) = model_args - self.setup_optimizer() self.optimizer.load_state_dict(opt_dict) def training_setup(self, training_args): l = [ - {'params': [self._features_dc], 'lr': 0.01, "name": "f_dc"}, - {'params': [self._features_rest], 'lr': 0.0005, "name": "f_rest"}, - {'params': [self._opacity], 'lr': 0.05, "name": "opacity"}, - {'params': [self._scaling], 'lr': 0.005, "name": "scaling"}, - {'params': [self._rotation], 'lr': 0.001, "name": "rotation"} + {'params': [self._xyz], 'lr': training_args.position_lr_init, "name": "xyz"}, + {'params': [self._features_dc], 'lr': training_args.feature_lr, "name": "f_dc"}, + {'params': [self._opacity], 'lr': training_args.opacity_lr, "name": "opacity"}, ] self.optimizer = torch.optim.Adam(l, lr=0.0, eps=1e-15) \ No newline at end of file From 66feecfeef3fcc4be242a8926ceecb96ecb9a949 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 23:04:49 +0800 Subject: [PATCH 39/71] feat: Add bg_gaussians export and import --- scene/__init__.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scene/__init__.py b/scene/__init__.py index a944917f..3aff1c55 100644 --- a/scene/__init__.py +++ b/scene/__init__.py @@ -81,14 +81,21 @@ def __init__(self, args : ModelParams, gaussians : GaussianModel, bg_gaussians: "point_cloud", "iteration_" + str(self.loaded_iter), "point_cloud.ply")) + if self.bg_gaussians is not None: + self.bg_gaussians.load_ply(os.path.join(self.model_path, + "point_cloud", + "iteration_" + str(self.loaded_iter), + "bg_point_cloud.ply")) else: self.gaussians.create_from_pcd(scene_info.point_cloud, self.cameras_extent) - self.bg_gaussians.load_ply('background_gs.ply') + if self.bg_gaussians is not None: + self.bg_gaussians.load_ply('assets/background_gs.ply') def save(self, iteration): point_cloud_path = os.path.join(self.model_path, "point_cloud/iteration_{}".format(iteration)) self.gaussians.save_ply(os.path.join(point_cloud_path, "point_cloud.ply")) - self.bg_gaussians.save_ply(os.path.join(point_cloud_path, "bg_point_cloud.ply")) + if self.bg_gaussians is not None: + self.bg_gaussians.save_ply(os.path.join(point_cloud_path, "bg_point_cloud.ply")) def getTrainCameras(self, scale=1.0): return self.train_cameras[scale] From f6a348d5e4d6c537999ab3c00f073142c4655728 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 23:06:07 +0800 Subject: [PATCH 40/71] feat: Add bg_gaussians pretraining and finetune --- train_with_bg.py | 446 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 train_with_bg.py diff --git a/train_with_bg.py b/train_with_bg.py new file mode 100644 index 00000000..d5652764 --- /dev/null +++ b/train_with_bg.py @@ -0,0 +1,446 @@ +# +# Copyright (C) 2023, Inria +# GRAPHDECO research group, https://team.inria.fr/graphdeco +# All rights reserved. +# +# This software is free for non-commercial, research and evaluation use +# under the terms of the LICENSE.md file. +# +# For inquiries contact george.drettakis@inria.fr +# + +import os +import torch +from random import randint +from utils.loss_utils import l1_loss_appearance, ssim, l1_loss, ms_l1_loss +from gaussian_renderer import render, network_gui, render_bg +import sys +import torch.nn.functional as F +from scene import Scene, GaussianModel, BgGaussianModel, AppearanceModel +from utils.general_utils import safe_state +from utils.patchmatch import process_propagation +import uuid +from tqdm import tqdm +from utils.image_utils import psnr, render_net_image +from argparse import ArgumentParser, Namespace +from arguments import ModelParams, PipelineParams, OptimizationParams +try: + from torch.utils.tensorboard import SummaryWriter + TENSORBOARD_FOUND = True +except ImportError: + TENSORBOARD_FOUND = False + +def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): + top_list = [None, ] * K + for i, cam in enumerate(cameras): + trans = render(cam, gaussians, pipe, bg, record_transmittance=True, skip_geometric=True)["transmittance_avg"] + if top_list[0] is not None: + m = trans > top_list[0] + if m.any(): + for i in range(K - 1): + top_list[K - 1 - i][m] = top_list[K - 2 - i][m] + top_list[0][m] = trans[m] + else: + top_list = [trans.clone() for _ in range(K)] + + contribution = torch.stack(top_list, dim=-1).mean(-1) + tile = torch.quantile(contribution, prune_ratio) + prune_mask = contribution < tile + gaussians.prune_points(prune_mask) + torch.cuda.empty_cache() + +def ranking_loss(error, penalize_ratio=0.7, extra_weights=None , type='mean'): + error, indices = torch.sort(error) + # only sum relatively small errors + s_error = torch.index_select(error, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + if extra_weights is not None: + weights = torch.index_select(extra_weights, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + s_error = s_error * weights + + if type == 'mean': + return torch.mean(s_error) + elif type == 'sum': + return torch.sum(s_error) + +def normal_gradient_loss(rend_normal, gt_normal): + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + + return loss_x + loss_y + +def edge_aware_normal_gradient_loss(gt_image, rend_normal, gt_normal, prior_normal_mask, edge_threshold=1): + # Define Sobel filters + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + + # Compute gradients of rendered and ground truth normals + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + # Compute gradients of gt_image for edge detection + dI_dx = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_x, padding=1) for i in range(gt_image.shape[0])]) + dI_dx = torch.mean(torch.abs(dI_dx), 1, keepdim=True) + dI_dy = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_y, padding=1) for i in range(gt_image.shape[0])]) + dI_dy = torch.mean(torch.abs(dI_dy), 1, keepdim=True) + + # Compute edge strength + edge_strength = dI_dx + dI_dy + + # Create non-edge mask + non_edge_mask = (edge_strength < edge_threshold).float() + + # Compute loss for gradients + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + loss = loss_x + loss_y + + # Apply non-edge mask and prior_normal_mask + masked_loss = loss * non_edge_mask * prior_normal_mask + + # Normalize by the number of non-edge pixels + num_non_edge_pixels = torch.sum(non_edge_mask * prior_normal_mask) + 1e-6 + normalized_loss = torch.sum(masked_loss) / num_non_edge_pixels + + return normalized_loss + +def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint): + first_iter = 0 + tb_writer = prepare_output_and_logger(dataset) + gaussians = GaussianModel(dataset.sh_degree) + bg_gaussians = BgGaussianModel(dataset.sh_degree) + scene = Scene(dataset, gaussians, bg_gaussians) + all_cameras = scene.getTrainCameras() + + bg_gaussians.training_setup(opt) + + bg_color = [1, 1, 1] if dataset.white_background else [0, 0, 0] + background = torch.tensor(bg_color, dtype=torch.float32, device="cuda") + + pbar = tqdm(range(5000), desc="Training Background", unit="iteration") + for iteration in pbar: + viewpoint_idx = randint(0, len(all_cameras)-1) + viewpoint_cam = all_cameras[viewpoint_idx] + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=False, + bg_gaussians=bg_gaussians, skip_geometric=True) + total_loss = ms_l1_loss(render_pkg["render"][None], viewpoint_cam.original_image.cuda()[None]) + total_loss.backward() + bg_gaussians.optimizer.step() + bg_gaussians.optimizer.zero_grad(set_to_none = True) + pbar.set_postfix({"Loss": f"{total_loss.item():.4f}"}) + # TODO: Trim unused background point + # prune_low_contribution_gaussians(bg_gaussians, all_cameras, pipe, background, + + gaussians.training_setup(opt) + if checkpoint: + (model_params, first_iter) = torch.load(checkpoint) + gaussians.restore(model_params, opt) + + iter_start = torch.cuda.Event(enable_timing = True) + iter_end = torch.cuda.Event(enable_timing = True) + + ema_loss_for_log = 0.0 + ema_depth_for_log = 0.0 + ema_normal_for_log = 0.0 + + progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") + first_iter += 1 + if dataset.use_decoupled_appearance: + appearances = AppearanceModel(len(all_cameras)) + appearances.training_setup(opt) + else: + appearances = None + + for iteration in range(first_iter, opt.iterations + 1): + + iter_start.record() + + gaussians.update_learning_rate(iteration) + + # Every 1000 its we increase the levels of SH up to a maximum degree + if iteration % 1000 == 0: + gaussians.oneupSHdegree() + bg_gaussians.oneupSHdegree() + + viewpoint_idx = randint(0, len(all_cameras)-1) + viewpoint_cam = all_cameras[viewpoint_idx] + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter), bg_gaussians=bg_gaussians) + # render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) + image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] + + gt_image = viewpoint_cam.original_image.cuda() + Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance + loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + + # regularization + lambda_normal = opt.lambda_normal if iteration > 15000 else 0.0 + lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 + lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 + lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 + lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 + + depth_loss = torch.tensor(0.).to("cuda") + normal_loss = torch.tensor(0.).to("cuda") + normal_prior_loss = torch.tensor(0.).to("cuda") + + rend_dist = render_pkg["rend_dist"] + rend_depth = render_pkg["rend_depth"] + surf_depth = render_pkg["surf_depth"] + dist_loss = lambda_dist * (rend_dist).mean() + + if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: + depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ + 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() + depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) + valid_depth_sum = depth_mask.sum() + 1e-5 + depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) + + rend_normal = render_pkg['rend_normal'] + surf_normal_median = render_pkg['surf_normal'] + surf_normal_expected = render_pkg['surf_normal_expected'] + rend_alpha = render_pkg['rend_alpha'] + + if lambda_normal > 0.0: + normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') + normal_loss += lambda_normal * normal_error + + if lambda_normal_prior > 0 and dataset.w_normal_prior: + prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() + prior_normal_mask = viewpoint_cam.normal_mask[0] + + normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], + penalize_ratio=1.0, type='mean') + + normal_prior_loss = lambda_normal_prior * normal_prior_error + if lambda_normal_gradient > 0.0: + normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) + + # loss + total_loss = loss + dist_loss + depth_loss + normal_loss + normal_prior_loss + + total_loss.backward() + + iter_end.record() + + with torch.no_grad(): + # Progress bar + ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log + ema_depth_for_log = 0.4 * depth_loss.item() + 0.6 * ema_depth_for_log + ema_normal_for_log = 0.4 * normal_loss.item() + 0.6 * ema_normal_for_log + + + if iteration % 10 == 0: + loss_dict = { + "Loss": f"{ema_loss_for_log:.{5}f}", + "depth": f"{ema_depth_for_log:.{5}f}", + "normal": f"{ema_normal_for_log:.{5}f}", + "Points": f"{len(gaussians.get_xyz)}" + } + progress_bar.set_postfix(loss_dict) + + progress_bar.update(10) + if iteration == opt.iterations: + progress_bar.close() + + # Log and save + if tb_writer is not None: + tb_writer.add_scalar('train_loss_patches/dist_loss', ema_depth_for_log, iteration) + tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) + + # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + if (iteration in saving_iterations): + print("\n[ITER {}] Saving Gaussians".format(iteration)) + scene.save(iteration) + + + # Densification + if iteration < opt.densify_until_iter: + gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], + radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.01)) + gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, None) + + if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: + prune_big_points = True if iteration > opt.opacity_reset_interval else False + gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, prune_big_points) + + if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: + gaussians.split_big_points(opt.max_screen_size) + + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: + if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: + print("Skipped Pruning for", iteration) + continue + prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, + K=1, prune_ratio=opt.contribution_prune_ratio) + print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') + + if iteration % opt.opacity_reset_interval == 0 or (dataset.white_background and iteration == opt.densify_from_iter): + gaussians.reset_opacity() + + # Optimizer step + if iteration < opt.iterations: + # visible = radii > 0 + # gaussians.optimizer.step(visible, radii.shape[0]) + gaussians.optimizer.step() + gaussians.optimizer.zero_grad(set_to_none = True) + if appearances is not None: + appearances.optimizer.step() + appearances.optimizer.zero_grad(set_to_none = True) + if bg_gaussians is not None: + bg_gaussians.optimizer.step() + bg_gaussians.optimizer.zero_grad(set_to_none = True) + + if (iteration in checkpoint_iterations): + print("\n[ITER {}] Saving Checkpoint".format(iteration)) + torch.save((gaussians.capture(), iteration), scene.model_path + "/chkpnt" + str(iteration) + ".pth") + + with torch.no_grad(): + if network_gui.conn == None: + network_gui.try_connect(dataset.render_items) + while network_gui.conn != None: + try: + net_image_bytes = None + custom_cam, do_training, keep_alive, scaling_modifer, render_mode = network_gui.receive() + if custom_cam != None: + render_pkg = render(custom_cam, gaussians, pipe, background, scaling_modifer) + net_image = render_net_image(render_pkg, dataset.render_items, render_mode, custom_cam) + net_image_bytes = memoryview((torch.clamp(net_image, min=0, max=1.0) * 255).byte().permute(1, 2, 0).contiguous().cpu().numpy()) + metrics_dict = { + "#": gaussians.get_opacity.shape[0], + "loss": ema_loss_for_log + # Add more metrics as needed + } + # Send the data + network_gui.send(net_image_bytes, dataset.source_path, metrics_dict) + if do_training and ((iteration < int(opt.iterations)) or not keep_alive): + break + except Exception as e: + # raise e + network_gui.conn = None + +def prepare_output_and_logger(args): + if not args.model_path: + if os.getenv('OAR_JOB_ID'): + unique_str=os.getenv('OAR_JOB_ID') + else: + unique_str = str(uuid.uuid4()) + args.model_path = os.path.join("./output/", unique_str[0:10]) + + # Set up output folder + print("Output folder: {}".format(args.model_path)) + os.makedirs(args.model_path, exist_ok = True) + with open(os.path.join(args.model_path, "cfg_args"), 'w') as cfg_log_f: + cfg_log_f.write(str(Namespace(**vars(args)))) + + # Create Tensorboard writer + tb_writer = None + if TENSORBOARD_FOUND: + tb_writer = SummaryWriter(args.model_path) + else: + print("Tensorboard not available: not logging progress") + return tb_writer + +@torch.no_grad() +def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_iterations, scene : Scene, renderFunc, renderArgs): + if tb_writer: + tb_writer.add_scalar('train_loss_patches/reg_loss', Ll1.item(), iteration) + tb_writer.add_scalar('train_loss_patches/total_loss', loss.item(), iteration) + tb_writer.add_scalar('iter_time', elapsed, iteration) + tb_writer.add_scalar('total_points', scene.gaussians.get_xyz.shape[0], iteration) + + # Report test and samples of training set + if iteration in testing_iterations: + torch.cuda.empty_cache() + validation_configs = ({'name': 'test', 'cameras' : scene.getTestCameras()}, + {'name': 'train', 'cameras' : [scene.getTrainCameras()[idx % len(scene.getTrainCameras())] for idx in range(5, 30, 5)]}) + + for config in validation_configs: + if config['cameras'] and len(config['cameras']) > 0: + l1_test = 0.0 + psnr_test = 0.0 + for idx, viewpoint in enumerate(config['cameras']): + render_pkg = renderFunc(viewpoint, scene.gaussians, *renderArgs) + image = torch.clamp(render_pkg["render"], 0.0, 1.0) + gt_image = torch.clamp(viewpoint.original_image.to("cuda"), 0.0, 1.0) + if tb_writer and (idx < 5): + from utils.general_utils import colormap + depth = render_pkg["surf_depth"] + norm = depth.max() + depth = depth / norm + depth = colormap(depth.cpu().numpy()[0], cmap='turbo') + tb_writer.add_images(config['name'] + "_view_{}/depth".format(viewpoint.image_name), depth[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/render".format(viewpoint.image_name), image[None], global_step=iteration) + + try: + rend_alpha = render_pkg['rend_alpha'] + rend_normal = render_pkg["rend_normal"] * 0.5 + 0.5 + surf_normal = render_pkg["surf_normal"] * 0.5 + 0.5 + tb_writer.add_images(config['name'] + "_view_{}/rend_normal".format(viewpoint.image_name), rend_normal[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/surf_normal".format(viewpoint.image_name), surf_normal[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/rend_alpha".format(viewpoint.image_name), rend_alpha[None], global_step=iteration) + + rend_dist = render_pkg["rend_dist"] + rend_dist = colormap(rend_dist.cpu().numpy()[0]) + tb_writer.add_images(config['name'] + "_view_{}/rend_dist".format(viewpoint.image_name), rend_dist[None], global_step=iteration) + except: + pass + + if iteration == testing_iterations[0]: + tb_writer.add_images(config['name'] + "_view_{}/ground_truth".format(viewpoint.image_name), gt_image[None], global_step=iteration) + + l1_test += l1_loss(image, gt_image).mean().double() + psnr_test += psnr(image, gt_image).mean().double() + + psnr_test /= len(config['cameras']) + l1_test /= len(config['cameras']) + print("\n[ITER {}] Evaluating {}: L1 {} PSNR {}".format(iteration, config['name'], l1_test, psnr_test)) + if tb_writer: + tb_writer.add_scalar(config['name'] + '/loss_viewpoint - l1_loss', l1_test, iteration) + tb_writer.add_scalar(config['name'] + '/loss_viewpoint - psnr', psnr_test, iteration) + + torch.cuda.empty_cache() + +if __name__ == "__main__": + # Set up command line argument parser + parser = ArgumentParser(description="Training script parameters") + lp = ModelParams(parser) + op = OptimizationParams(parser) + pp = PipelineParams(parser) + parser.add_argument('--ip', type=str, default="127.0.0.1") + parser.add_argument('--port', type=int, default=6009) + parser.add_argument('--detect_anomaly', action='store_true', default=False) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--quiet", action="store_true") + parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) + parser.add_argument("--start_checkpoint", type=str, default = None) + args = parser.parse_args(sys.argv[1:]) + args.save_iterations.append(args.iterations) + + print("Optimizing " + args.model_path) + + # Initialize system state (RNG) + safe_state(args.quiet) + + # Start GUI server, configure and run training + network_gui.init(args.ip, args.port) + torch.autograd.set_detect_anomaly(args.detect_anomaly) + training(lp.extract(args), op.extract(args), pp.extract(args), args.test_iterations, args.save_iterations, args.checkpoint_iterations, args.start_checkpoint) + + # All done + print("\nTraining complete.") \ No newline at end of file From b2b4447fafd13dab194365534ebda3fd15f59add Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 23:09:51 +0800 Subject: [PATCH 41/71] feat: Add ms_l1_loss --- utils/loss_utils.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/utils/loss_utils.py b/utils/loss_utils.py index 202f805a..89e6d67d 100644 --- a/utils/loss_utils.py +++ b/utils/loss_utils.py @@ -17,6 +17,22 @@ def l1_loss(network_output, gt): return torch.abs((network_output - gt)).mean() +def ms_l1_loss(network_output, gt, scales=[1, 2, 4]): + total_loss = 0 + weights = [1.0, 0.5, 0.25] # Weights for different scales, adjust as needed + + for scale, weight in zip(scales, weights): + if scale == 1: + # Original resolution + total_loss += weight * l1_loss(network_output, gt) + else: + # Downsampled resolution + scaled_output = F.interpolate(network_output, scale_factor=1/scale, mode='bilinear', align_corners=False) + scaled_gt = F.interpolate(gt, scale_factor=1/scale, mode='bilinear', align_corners=False) + total_loss += weight * l1_loss(scaled_output, scaled_gt) + + return total_loss + def l2_loss(network_output, gt): return ((network_output - gt) ** 2).mean() From 1c0fd9df3002fc6fae470da39df462a8e982fcf6 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 14 Oct 2024 23:10:29 +0800 Subject: [PATCH 42/71] feat: Add skip_geometric flag to improve efficiency --- gaussian_renderer/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 96738923..4ea385ab 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -17,7 +17,7 @@ from utils.point_utils import depth_to_normal def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, scaling_modifier = 1.0, - override_color = None, record_transmittance=False, bg_gaussians=None): + override_color = None, record_transmittance=False, bg_gaussians=None, skip_geometric=False): """ Render the scene. @@ -97,7 +97,9 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, "transmittance_avg": transmittance_avg } - + if skip_geometric: + return rets + # additional regularizations render_alpha = allmap[1:2] From 3192088957249560a0edc676d031e7dce8cff404 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 14:20:20 +0800 Subject: [PATCH 43/71] clean: Remove bg gaussian code from train.py --- train.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/train.py b/train.py index ea1e4b15..750c6cf4 100644 --- a/train.py +++ b/train.py @@ -16,7 +16,7 @@ from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F -from scene import Scene, GaussianModel, BgGaussianModel, AppearanceModel +from scene import Scene, GaussianModel, AppearanceModel from utils.general_utils import safe_state from utils.patchmatch import process_propagation import uuid @@ -33,7 +33,7 @@ def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): top_list = [None, ] * K for i, cam in enumerate(cameras): - trans = render(cam, gaussians, pipe, bg, record_transmittance=True)["transmittance_avg"] + trans = render(cam, gaussians, pipe, bg, record_transmittance=True, skip_geometric=True)["transmittance_avg"] if top_list[0] is not None: m = trans > top_list[0] if m.any(): @@ -119,10 +119,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi first_iter = 0 tb_writer = prepare_output_and_logger(dataset) gaussians = GaussianModel(dataset.sh_degree) - bg_gaussians = BgGaussianModel(dataset.sh_degree) - scene = Scene(dataset, gaussians, bg_gaussians) + scene = Scene(dataset, gaussians) gaussians.training_setup(opt) - bg_gaussians.training_setup(opt) + if checkpoint: (model_params, first_iter) = torch.load(checkpoint) gaussians.restore(model_params, opt) @@ -166,8 +165,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # intervals = [-2, -1, 1, 2] # src_idxs = [viewpoint_idx+itv for itv in intervals if ((itv + viewpoint_idx > 0) and (itv + viewpoint_idx < len(viewpoint_stack)))] # process_propagation(viewpoint_stack, viewpoint_cam, gaussians, pipe, background, iteration, opt, src_idxs) - render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter), bg_gaussians=bg_gaussians) - # render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] gt_image = viewpoint_cam.original_image.cuda() @@ -175,7 +173,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) # regularization - lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 + lambda_normal = opt.lambda_normal if iteration > 15000 else 0.0 lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 @@ -292,9 +290,6 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if appearances is not None: appearances.optimizer.step() appearances.optimizer.zero_grad(set_to_none = True) - if bg_gaussians is not None: - bg_gaussians.optimizer.step() - bg_gaussians.optimizer.zero_grad(set_to_none = True) if (iteration in checkpoint_iterations): print("\n[ITER {}] Saving Checkpoint".format(iteration)) From 2b8e1568fd5e269793afd07b83a7ee378ca4a02b Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 14:20:55 +0800 Subject: [PATCH 44/71] fix: Update skip_geometric flag --- gaussian_renderer/__init__.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/gaussian_renderer/__init__.py b/gaussian_renderer/__init__.py index 4ea385ab..7d15df21 100644 --- a/gaussian_renderer/__init__.py +++ b/gaussian_renderer/__init__.py @@ -97,9 +97,6 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, "transmittance_avg": transmittance_avg } - if skip_geometric: - return rets - # additional regularizations render_alpha = allmap[1:2] @@ -126,13 +123,16 @@ def render(viewpoint_camera, pc : GaussianModel, pipe, bg_color : torch.Tensor, # for unbounded scene, use expected depth, i.e., depth_ration = 0, to reduce disk anliasing. surf_depth = render_depth_expected * (1-pipe.depth_ratio) + (pipe.depth_ratio) * render_depth_median - # assume the depth points form the 'surface' and generate psudo surface normal for regularizations. - surf_normal_expected = depth_to_normal(viewpoint_camera, render_depth_expected).permute(2,0,1) - surf_normal = depth_to_normal(viewpoint_camera, render_depth_median).permute(2,0,1) - # remember to multiply with accum_alpha since render_normal is unnormalized. - surf_normal_expected = surf_normal_expected * (render_alpha).detach() - surf_normal = surf_normal * (render_alpha).detach() - + if skip_geometric: + # assume the depth points form the 'surface' and generate psudo surface normal for regularizations. + surf_normal_expected = depth_to_normal(viewpoint_camera, render_depth_expected).permute(2,0,1) + surf_normal = depth_to_normal(viewpoint_camera, render_depth_median).permute(2,0,1) + # remember to multiply with accum_alpha since render_normal is unnormalized. + surf_normal_expected = surf_normal_expected * (render_alpha).detach() + surf_normal = surf_normal * (render_alpha).detach() + else: + surf_normal_expected = render_normal + surf_normal = render_normal rets.update({ 'rend_alpha': render_alpha, From 7f37cbb5cbc28942326c61cb16270ebc677d95c8 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 14:24:19 +0800 Subject: [PATCH 45/71] feat: Optimize Gaussian model training - Removed unused import of render_bg from gaussian_renderer - Improved viewpoint sampling with pre-initialized stack - Enhanced model regularization and cleanup steps --- train_with_bg.py | 118 +++++++++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/train_with_bg.py b/train_with_bg.py index d5652764..5a20feb4 100644 --- a/train_with_bg.py +++ b/train_with_bg.py @@ -13,7 +13,7 @@ import torch from random import randint from utils.loss_utils import l1_loss_appearance, ssim, l1_loss, ms_l1_loss -from gaussian_renderer import render, network_gui, render_bg +from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F from scene import Scene, GaussianModel, BgGaussianModel, AppearanceModel @@ -129,9 +129,11 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi background = torch.tensor(bg_color, dtype=torch.float32, device="cuda") pbar = tqdm(range(5000), desc="Training Background", unit="iteration") + viewpoint_stack = None for iteration in pbar: - viewpoint_idx = randint(0, len(all_cameras)-1) - viewpoint_cam = all_cameras[viewpoint_idx] + if not viewpoint_stack: + viewpoint_stack = scene.getTrainCameras().copy() + viewpoint_cam = viewpoint_stack.pop(randint(0, len(viewpoint_stack)-1)) render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=False, bg_gaussians=bg_gaussians, skip_geometric=True) total_loss = ms_l1_loss(render_pkg["render"][None], viewpoint_cam.original_image.cuda()[None]) @@ -139,6 +141,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi bg_gaussians.optimizer.step() bg_gaussians.optimizer.zero_grad(set_to_none = True) pbar.set_postfix({"Loss": f"{total_loss.item():.4f}"}) + bg_gaussians.optimizer = None # TODO: Trim unused background point # prune_low_contribution_gaussians(bg_gaussians, all_cameras, pipe, background, @@ -175,7 +178,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi viewpoint_idx = randint(0, len(all_cameras)-1) viewpoint_cam = all_cameras[viewpoint_idx] - render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter), bg_gaussians=bg_gaussians) + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=False, bg_gaussians=bg_gaussians, + skip_geometric=True) # render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] @@ -183,53 +187,58 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) - # regularization - lambda_normal = opt.lambda_normal if iteration > 15000 else 0.0 - lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 - lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 - lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 - lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 - - depth_loss = torch.tensor(0.).to("cuda") - normal_loss = torch.tensor(0.).to("cuda") - normal_prior_loss = torch.tensor(0.).to("cuda") - rend_dist = render_pkg["rend_dist"] - rend_depth = render_pkg["rend_depth"] - surf_depth = render_pkg["surf_depth"] + lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 dist_loss = lambda_dist * (rend_dist).mean() - if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: - depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ - 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() - depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) - valid_depth_sum = depth_mask.sum() + 1e-5 - depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) - - rend_normal = render_pkg['rend_normal'] - surf_normal_median = render_pkg['surf_normal'] - surf_normal_expected = render_pkg['surf_normal_expected'] - rend_alpha = render_pkg['rend_alpha'] - - if lambda_normal > 0.0: - normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ - 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) - normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') - normal_loss += lambda_normal * normal_error + # regularization + if iteration > 15000: + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=False) + lambda_normal = opt.lambda_normal if iteration > 15000 else 0.0 + lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 + lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 + lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 - if lambda_normal_prior > 0 and dataset.w_normal_prior: - prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() - prior_normal_mask = viewpoint_cam.normal_mask[0] - - normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) - normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], - penalize_ratio=1.0, type='mean') + depth_loss = torch.tensor(0.).to("cuda") + normal_loss = torch.tensor(0.).to("cuda") + normal_prior_loss = torch.tensor(0.).to("cuda") - normal_prior_loss = lambda_normal_prior * normal_prior_error - if lambda_normal_gradient > 0.0: - normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) - + rend_depth = render_pkg["rend_depth"] + surf_depth = render_pkg["surf_depth"] + if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: + depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ + 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() + depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) + valid_depth_sum = depth_mask.sum() + 1e-5 + depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) + + rend_normal = render_pkg['rend_normal'] + surf_normal_median = render_pkg['surf_normal'] + surf_normal_expected = render_pkg['surf_normal_expected'] + rend_alpha = render_pkg['rend_alpha'] + + if lambda_normal > 0.0: + normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=1.0, type='mean') + normal_loss += lambda_normal * normal_error + + if lambda_normal_prior > 0 and dataset.w_normal_prior: + prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() + prior_normal_mask = viewpoint_cam.normal_mask[0] + + normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], + penalize_ratio=1.0, type='mean') + + normal_prior_loss = lambda_normal_prior * normal_prior_error + if lambda_normal_gradient > 0.0: + normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) + else: + depth_loss = torch.tensor(0.).to("cuda") + normal_loss = torch.tensor(0.).to("cuda") + normal_prior_loss = torch.tensor(0.).to("cuda") # loss total_loss = loss + dist_loss + depth_loss + normal_loss + normal_prior_loss @@ -270,19 +279,21 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Densification if iteration < opt.densify_until_iter: - gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], - radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.01)) gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, None) if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: prune_big_points = True if iteration > opt.opacity_reset_interval else False gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, prune_big_points) - if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: - gaussians.split_big_points(opt.max_screen_size) - + # if render_pkg["transmittance_avg"] is not None: + # gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], + # radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.01)) + # if iteration > 7000 and iteration % opt.split_interval == 0: + # gaussians.split_big_points(opt.max_screen_size) + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: - if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: + if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval or \ + iteration % opt.opacity_reset_interval == opt.split_interval: print("Skipped Pruning for", iteration) continue prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, @@ -301,9 +312,6 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if appearances is not None: appearances.optimizer.step() appearances.optimizer.zero_grad(set_to_none = True) - if bg_gaussians is not None: - bg_gaussians.optimizer.step() - bg_gaussians.optimizer.zero_grad(set_to_none = True) if (iteration in checkpoint_iterations): print("\n[ITER {}] Saving Checkpoint".format(iteration)) From dbcd181d3eb208a896c04ac7bb504cf22570b23d Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 14:56:42 +0800 Subject: [PATCH 46/71] feat: Add w_mask flag to load extra mask --- arguments/__init__.py | 1 + scene/cameras.py | 2 +- utils/camera_utils.py | 10 +++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index 43405deb..d880d3a5 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -56,6 +56,7 @@ def __init__(self, parser, sentinel=False): self.eval = False self.render_items = ['RGB', 'Alpha', 'Normal', 'Depth', 'Edge', 'Curvature'] self.w_normal_prior = "" + self.w_mask = "" self.use_decoupled_appearance = False super().__init__(parser, "Loading Parameters", sentinel) diff --git a/scene/cameras.py b/scene/cameras.py index 5110e2a4..c3318c7e 100644 --- a/scene/cameras.py +++ b/scene/cameras.py @@ -51,7 +51,7 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.image_height = self.original_image.shape[1] if gt_alpha_mask is not None: - # self.original_image *= gt_alpha_mask.to(self.data_device) + self.original_image *= gt_alpha_mask.to(self.data_device) self.gt_alpha_mask = gt_alpha_mask.to(self.data_device) else: self.original_image *= torch.ones((1, self.image_height, self.image_width), device=self.data_device) diff --git a/utils/camera_utils.py b/utils/camera_utils.py index 23a6311d..5282e8bf 100644 --- a/utils/camera_utils.py +++ b/utils/camera_utils.py @@ -47,7 +47,15 @@ def loadCam(args, id, cam_info, resolution_scale): gt_image = resized_image_rgb else: resized_image_rgb = PILtoTorch(cam_info.image, resolution) - loaded_mask = None + if args.w_mask: + mask_dir = os.path.join(os.path.dirname(os.path.dirname(cam_info.image_path)), args.w_mask) + if not os.path.isdir(mask_dir): + exit(f"Cannot find mask dir {mask_dir}") + mask_path = os.path.join(mask_dir, os.path.basename(cam_info.image_name) + '.png') + loaded_mask = Image.open(mask_path) + loaded_mask = PILtoTorch(loaded_mask, resolution) + else: + loaded_mask = None gt_image = resized_image_rgb if args.w_normal_prior: From 6b63529a629cdc979cec489dfb3742baf5dbc79d Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 15:13:59 +0800 Subject: [PATCH 47/71] feat: Add alpha loss --- train.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/train.py b/train.py index 3ae004eb..90a16c3b 100644 --- a/train.py +++ b/train.py @@ -171,6 +171,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + # alpha loss + if opt.lambda_mask > 0: + opacity = 1 - render_pkg["rend_alpha"].clamp(1e-6, 1-1e-6) + bg = 1 - viewpoint_cam.gt_alpha_mask + mask_error = (- bg * torch.log(opacity)).mean() + loss += opt.lambda_mask * mask_error + # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 From ab2cadcd4a602b6a19c865c232ea7f885162a811 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 15:15:03 +0800 Subject: [PATCH 48/71] fix: Update nerf evaluation scripts --- scripts/nerf_eval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/nerf_eval.py b/scripts/nerf_eval.py index a95c9920..9f0a546d 100644 --- a/scripts/nerf_eval.py +++ b/scripts/nerf_eval.py @@ -23,7 +23,7 @@ jobs = list(itertools.product(scenes, factors)) def train_scene(gpu, scene, factor): - cmd = f"OMP_NUM_THREADS=4 CUDA_VISIBLE_DEVICES={gpu} python train.py -s {dataset_dir}/{scene} -m {output_dir}/{scene} --eval --white_background --lambda_normal 0.0 --port {6209+int(gpu)}" + cmd = f"OMP_NUM_THREADS=4 CUDA_VISIBLE_DEVICES={gpu} python train.py -s {dataset_dir}/{scene} -m {output_dir}/{scene} --eval --white_background --lambda_mask 0.1 --lambda_normal 0.0 --port {6209+int(gpu)}" print(cmd) if not dry_run: os.system(cmd) From ff9149ecb79f41504237d367ea6ef8674be1b42e Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 15:33:48 +0800 Subject: [PATCH 49/71] fix: Update lambda_mask --- arguments/__init__.py | 1 + train.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index d880d3a5..a89ad251 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -91,6 +91,7 @@ def __init__(self, parser): self.lambda_dist = 0. self.lambda_depth = 0.1 self.lambda_normal = 0.05 + self.lambda_mask = 0. self.lambda_normal_prior = 0.25 self.lambda_normal_gradient = 0 self.opacity_cull = 0.05 diff --git a/train.py b/train.py index 90a16c3b..6176b7d3 100644 --- a/train.py +++ b/train.py @@ -197,7 +197,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() - depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) + depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) & viewpoint_cam.gt_alpha_mask valid_depth_sum = depth_mask.sum() + 1e-5 depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) @@ -209,12 +209,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if lambda_normal > 0.0: normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = normal_error * viewpoint_cam.gt_alpha_mask normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') normal_loss += lambda_normal * normal_error if lambda_normal_prior > 0 and dataset.w_normal_prior: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() - prior_normal_mask = viewpoint_cam.normal_mask[0] + prior_normal_mask = viewpoint_cam.normal_mask[0] & viewpoint_cam.gt_alpha_mask normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) From fb8cd9c8547eed9ecbb190f162e067a9dfda2d1f Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 20:25:26 +0800 Subject: [PATCH 50/71] fix: Add default principal_point_ndc --- scene/dataset_readers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scene/dataset_readers.py b/scene/dataset_readers.py index 1e7ae760..ffeed45f 100644 --- a/scene/dataset_readers.py +++ b/scene/dataset_readers.py @@ -35,7 +35,7 @@ class CameraInfo(NamedTuple): image_name: str width: int height: int - principal_point_ndc: np.array + principal_point_ndc: np.array = np.array([1/2, 1/2]) class SceneInfo(NamedTuple): point_cloud: BasicPointCloud From 608afe0753d8059a9c0591f77f33b67069d12be3 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 20:27:34 +0800 Subject: [PATCH 51/71] fix: Fix masked normal loss --- train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/train.py b/train.py index 832e2c74..19ebb148 100644 --- a/train.py +++ b/train.py @@ -210,13 +210,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if lambda_normal > 0.0: normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) - normal_error = normal_error * viewpoint_cam.gt_alpha_mask + normal_error = normal_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') normal_loss += lambda_normal * normal_error if lambda_normal_prior > 0 and dataset.w_normal_prior: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() - prior_normal_mask = viewpoint_cam.normal_mask[0] & viewpoint_cam.gt_alpha_mask + prior_normal_mask = viewpoint_cam.normal_mask[0] & viewpoint_cam.gt_alpha_mask.mean(dim=0) normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) From a4748615a24d8a13254dd531ffc77072e2651e6a Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 22:11:28 +0800 Subject: [PATCH 52/71] feat: Enable normals and depth normals processing - Re-enabled storing normals and depth normals in GaussianExtractor - Fixed background masking issue preventing redundant RGB clipping - Adjusted normal and depth normal visualization saving logic --- utils/mesh_utils.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/utils/mesh_utils.py b/utils/mesh_utils.py index e9b1524f..69a2690b 100644 --- a/utils/mesh_utils.py +++ b/utils/mesh_utils.py @@ -92,8 +92,8 @@ def clean(self): self.depthmaps = [] # self.alphamaps = [] self.rgbmaps = [] - # self.normals = [] - # self.depth_normals = [] + self.normals = [] + self.depth_normals = [] self.viewpoint_stack = [] @torch.no_grad() @@ -113,8 +113,8 @@ def reconstruction(self, viewpoint_stack): self.rgbmaps.append(rgb.cpu()) self.depthmaps.append(depth.cpu()) # self.alphamaps.append(alpha.cpu()) - # self.normals.append(normal.cpu()) - # self.depth_normals.append(depth_normal.cpu()) + self.normals.append(normal.cpu()) + self.depth_normals.append(depth_normal.cpu()) # self.rgbmaps = torch.stack(self.rgbmaps, dim=0) # self.depthmaps = torch.stack(self.depthmaps, dim=0) @@ -165,11 +165,11 @@ def extract_mesh_bounded(self, voxel_size=0.004, sdf_trunc=0.02, depth_trunc=3, # if we have mask provided, use it if mask_backgrond and (self.viewpoint_stack[i].gt_alpha_mask is not None): - depth[(self.viewpoint_stack[i].gt_alpha_mask < 0.5)] = 0 + depth[(self.viewpoint_stack[i].gt_alpha_mask.mean(dim=0)[None] < 0.5)] = 0 # make open3d rgbd rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth( - o3d.geometry.Image(np.asarray(np.clip(rgb.permute(1,2,0).cpu().numpy(), 0.0, 1.0) * 255, order="C", dtype=np.uint8)), + o3d.geometry.Image(np.asarray(rgb.permute(1,2,0).cpu().numpy() * 255, order="C", dtype=np.uint8)), o3d.geometry.Image(np.asarray(depth.permute(1,2,0).cpu().numpy(), order="C")), depth_trunc = depth_trunc, convert_rgb_to_intensity=False, depth_scale = 1.0 @@ -290,6 +290,6 @@ def export_image(self, path): gt = viewpoint_cam.original_image[0:3, :, :] save_img_u8(gt.permute(1,2,0).cpu().numpy(), os.path.join(gts_path, '{0:05d}'.format(idx) + ".png")) save_img_u8(self.rgbmaps[idx].permute(1,2,0).cpu().numpy(), os.path.join(render_path, '{0:05d}'.format(idx) + ".png")) - save_img_f32(self.depthmaps[idx][0].cpu().numpy(), os.path.join(vis_path, 'depth_{0:05d}'.format(idx) + ".tiff")) - # save_img_u8(self.normals[idx].permute(1,2,0).cpu().numpy() * 0.5 + 0.5, os.path.join(vis_path, 'normal_{0:05d}'.format(idx) + ".png")) - # save_img_u8(self.depth_normals[idx].permute(1,2,0).cpu().numpy() * 0.5 + 0.5, os.path.join(vis_path, 'depth_normal_{0:05d}'.format(idx) + ".png")) + # save_img_f32(self.depthmaps[idx][0].cpu().numpy(), os.path.join(vis_path, 'depth_{0:05d}'.format(idx) + ".tiff")) + save_img_u8(self.normals[idx].permute(1,2,0).cpu().numpy() * 0.5 + 0.5, os.path.join(vis_path, 'normal_{0:05d}'.format(idx) + ".png")) + save_img_u8(self.depth_normals[idx].permute(1,2,0).cpu().numpy() * 0.5 + 0.5, os.path.join(vis_path, 'depth_normal_{0:05d}'.format(idx) + ".png")) From e5641a3dd731393133f61d614123a0aea7821a82 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 22:36:26 +0800 Subject: [PATCH 53/71] fix: Update train_progressive --- train_progressive.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/train_progressive.py b/train_progressive.py index a3c9b45c..8b2a1d67 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -33,7 +33,7 @@ def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): top_list = [None, ] * K for i, cam in enumerate(cameras): - trans = render(cam, gaussians, pipe, bg, record_transmittance=True)["transmittance_avg"] + trans = render(cam, gaussians, pipe, bg, record_transmittance=True, skip_geometric=True)["transmittance_avg"] if top_list[0] is not None: m = trans > top_list[0] if m.any(): @@ -179,9 +179,17 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + # alpha loss + if opt.lambda_mask > 0: + opacity = 1 - render_pkg["rend_alpha"].clamp(1e-6, 1-1e-6) + bg = 1 - viewpoint_cam.gt_alpha_mask + mask_error = (- bg * torch.log(opacity)).mean() + loss += opt.lambda_mask * mask_error + # regularization lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 + lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 @@ -189,15 +197,18 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_loss = torch.tensor(0.).to("cuda") normal_prior_loss = torch.tensor(0.).to("cuda") + rend_dist = render_pkg["rend_dist"] rend_depth = render_pkg["rend_depth"] surf_depth = render_pkg["surf_depth"] + dist_loss = lambda_dist * (rend_dist).mean() + if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ 0.4 * (rend_depth - viewpoint_cam.depth_prior).abs() - depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) + depth_mask = viewpoint_cam.depth_mask.unsqueeze(0) & viewpoint_cam.gt_alpha_mask valid_depth_sum = depth_mask.sum() + 1e-5 depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) - + rend_normal = render_pkg['rend_normal'] surf_normal_median = render_pkg['surf_normal'] surf_normal_expected = render_pkg['surf_normal_expected'] @@ -206,12 +217,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if lambda_normal > 0.0: normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = normal_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') normal_loss += lambda_normal * normal_error if lambda_normal_prior > 0 and dataset.w_normal_prior: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() - prior_normal_mask = viewpoint_cam.normal_mask[0] + prior_normal_mask = viewpoint_cam.normal_mask[0] & viewpoint_cam.gt_alpha_mask.mean(dim=0) normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) @@ -223,7 +235,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) # loss - total_loss = loss + depth_loss + normal_loss + normal_prior_loss + total_loss = loss + dist_loss + depth_loss + normal_loss + normal_prior_loss total_loss.backward() @@ -251,10 +263,10 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi # Log and save if tb_writer is not None: - tb_writer.add_scalar('train_loss_patches/depth_loss', ema_depth_for_log, iteration) + tb_writer.add_scalar('train_loss_patches/dist_loss', ema_depth_for_log, iteration) tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) - training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) if (iteration in saving_iterations): print("\n[ITER {}] Saving Gaussians".format(iteration)) scene.save(iteration) @@ -413,8 +425,8 @@ def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_i parser.add_argument('--ip', type=str, default="127.0.0.1") parser.add_argument('--port', type=int, default=6009) parser.add_argument('--detect_anomaly', action='store_true', default=False) - parser.add_argument("--test_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) - parser.add_argument("--save_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) parser.add_argument("--start_checkpoint", type=str, default = None) From 4e414e84cbfaa50c970b986c2272c861fb1e3258 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 22:36:37 +0800 Subject: [PATCH 54/71] feat: Add training scripts --- scripts/train_with_background.sh | 5 +++++ scripts/train_with_mask.sh | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 scripts/train_with_background.sh create mode 100644 scripts/train_with_mask.sh diff --git a/scripts/train_with_background.sh b/scripts/train_with_background.sh new file mode 100644 index 00000000..ddb91260 --- /dev/null +++ b/scripts/train_with_background.sh @@ -0,0 +1,5 @@ +data=$1 + +gs-init -s $data -o ${data}_gaustudio --overwrite --pcd combined +python train_with_bg.py -s ${data}_gaustudio -r 2 --lambda_dist 100 -m ${data}_gaustudio/result +gs-extract-pcd -m ${data}_gaustudio/result -o ${data}_gaustudio/result/fusion --meshing nksr \ No newline at end of file diff --git a/scripts/train_with_mask.sh b/scripts/train_with_mask.sh new file mode 100644 index 00000000..6584e07e --- /dev/null +++ b/scripts/train_with_mask.sh @@ -0,0 +1,5 @@ +data=$1 + +gs-init -s $data -o ${data}_gaustudio --overwrite --w_mask mask +python train_progressive.py -s ${data}_gaustudio -r 1 --lambda_dist 100 --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio/result +gs-extract-pcd -m ${data}_gaustudio/result -o ${data}_gaustudio/result/fusion --meshing nksr From 965fc37952e8373e1f92f99332dad925a032a9b2 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 16 Oct 2024 22:45:42 +0800 Subject: [PATCH 55/71] fix: Add background model init --- scripts/init_bg_gs.py | 7 +++++++ scripts/train_with_background.sh | 1 + 2 files changed, 8 insertions(+) create mode 100644 scripts/init_bg_gs.py diff --git a/scripts/init_bg_gs.py b/scripts/init_bg_gs.py new file mode 100644 index 00000000..7911f789 --- /dev/null +++ b/scripts/init_bg_gs.py @@ -0,0 +1,7 @@ +from gaustudio.pipelines import initializers, optimizers +from gaustudio import models + +bg_gaussians_coarse = models.make("vanilla_pcd") +bg_initializer = initializers.make({"name": "gaussiansky", "radius": 100, "resolution": 500}) +bg_initializer(bg_gaussians_coarse) +bg_gaussians_coarse.export("assets/background_gs.ply") \ No newline at end of file diff --git a/scripts/train_with_background.sh b/scripts/train_with_background.sh index ddb91260..e73c85e1 100644 --- a/scripts/train_with_background.sh +++ b/scripts/train_with_background.sh @@ -1,5 +1,6 @@ data=$1 +python scripts/init_bg_gs.py gs-init -s $data -o ${data}_gaustudio --overwrite --pcd combined python train_with_bg.py -s ${data}_gaustudio -r 2 --lambda_dist 100 -m ${data}_gaustudio/result gs-extract-pcd -m ${data}_gaustudio/result -o ${data}_gaustudio/result/fusion --meshing nksr \ No newline at end of file From 4615fa510daf8d7a0c8be8fa1eb127321da2d2c4 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 17 Oct 2024 05:45:15 +0800 Subject: [PATCH 56/71] fix: Add init_normal scripts --- scripts/init_normal.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 scripts/init_normal.py diff --git a/scripts/init_normal.py b/scripts/init_normal.py new file mode 100644 index 00000000..73652edd --- /dev/null +++ b/scripts/init_normal.py @@ -0,0 +1,28 @@ +import click +import torch +import glob +from PIL import Image +import os +from tqdm import tqdm + +@click.command() +@click.option('--source_path', '-s', required=True, help='Path to the dataset') +def main(source_path: str) -> None: + normal_predictor = torch.hub.load("Stable-X/StableNormal", "StableNormal", trust_repo=True) + output_normal_dir = os.path.join(source_path, "normals") + output_mask_dir = os.path.join(source_path, "masks") + os.makedirs(output_normal_dir, exist_ok=True) + os.makedirs(output_mask_dir, exist_ok=True) + + image_pattern = f"{source_path}/images/*.jpg" + for image_path in tqdm(glob.glob(image_pattern, recursive=True)[::3]): + image_name = os.path.basename(image_path.split("/")[-1]).split(".")[0] + + input_image = Image.open(image_path) + output_normal_path = os.path.join(output_normal_dir, image_name+'.png') + if not os.path.exists(output_normal_path): + normal_image = normal_predictor(input_image) + normal_image.save(output_normal_path) + +if __name__ == "__main__": + main() \ No newline at end of file From e7b4bbb5ba40fbfecf3f7831a24edd7df2447b31 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 17 Oct 2024 05:46:13 +0800 Subject: [PATCH 57/71] fix: Update normal_prior_loss --- train.py | 15 ++++++++------- train_progressive.py | 24 +++++++++++++----------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/train.py b/train.py index 19ebb148..1e96369d 100644 --- a/train.py +++ b/train.py @@ -183,7 +183,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi lambda_normal = opt.lambda_normal if iteration > 15000 else 0.0 lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 - lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 + lambda_normal_prior = opt.lambda_normal_prior * (7000 - iteration) / 7000 if iteration < 7000 else opt.lambda_normal_prior lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 depth_loss = torch.tensor(0.).to("cuda") @@ -214,12 +214,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') normal_loss += lambda_normal * normal_error - if lambda_normal_prior > 0 and dataset.w_normal_prior: + if lambda_normal_prior > 0 and viewpoint_cam.normal_prior is not None: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() - prior_normal_mask = viewpoint_cam.normal_mask[0] & viewpoint_cam.gt_alpha_mask.mean(dim=0) + prior_normal_mask = viewpoint_cam.normal_mask[0] - normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = normal_prior_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') @@ -237,8 +238,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi with torch.no_grad(): # Progress bar ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log - ema_depth_for_log = 0.4 * depth_loss.item() + 0.6 * ema_depth_for_log - ema_normal_for_log = 0.4 * normal_loss.item() + 0.6 * ema_normal_for_log + ema_depth_for_log = 0.4 * (depth_loss.item() + dist_loss.item()) + 0.6 * ema_depth_for_log + ema_normal_for_log = 0.4 * (normal_loss.item() + normal_prior_loss.item()) + 0.6 * ema_normal_for_log if iteration % 10 == 0: diff --git a/train_progressive.py b/train_progressive.py index 8b2a1d67..a3e3efa7 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -190,7 +190,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi lambda_normal = opt.lambda_normal if iteration > 7000 else 0.0 lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 - lambda_normal_prior = opt.lambda_normal_prior if iteration > 15000 else 0.0 + lambda_normal_prior = opt.lambda_normal_prior * (7000 - iteration) / 7000 if iteration < 7000 else opt.lambda_normal_prior lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 depth_loss = torch.tensor(0.).to("cuda") @@ -221,12 +221,13 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') normal_loss += lambda_normal * normal_error - if lambda_normal_prior > 0 and dataset.w_normal_prior: + if lambda_normal_prior > 0 and viewpoint_cam.normal_prior is not None: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() - prior_normal_mask = viewpoint_cam.normal_mask[0] & viewpoint_cam.gt_alpha_mask.mean(dim=0) + prior_normal_mask = viewpoint_cam.normal_mask[0] - normal_prior_error = 0.6 * (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ - 0.4 * (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = normal_prior_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') @@ -244,8 +245,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi with torch.no_grad(): # Progress bar ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log - ema_depth_for_log = 0.4 * depth_loss.item() + 0.6 * ema_depth_for_log - ema_normal_for_log = 0.4 * normal_loss.item() + 0.6 * ema_normal_for_log + ema_depth_for_log = 0.4 * (depth_loss.item() + dist_loss.item()) + 0.6 * ema_depth_for_log + ema_normal_for_log = 0.4 * (normal_loss.item() + normal_prior_loss.item()) + 0.6 * ema_normal_for_log if iteration % 10 == 0: @@ -281,10 +282,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: prune_big_points = True if iteration > opt.opacity_reset_interval else False gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, prune_big_points) - - if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: - gaussians.split_big_points(opt.max_screen_size) - + print(f'Num gs after opacity prune: {len(gaussians.get_xyz)}') + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: print("Skipped Pruning for", iteration) @@ -293,6 +292,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi K=1, prune_ratio=opt.contribution_prune_ratio) print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') + if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: + gaussians.split_big_points(opt.max_screen_size) + if iteration % opt.opacity_reset_interval == 0 or (dataset.white_background and iteration == opt.densify_from_iter): gaussians.reset_opacity() From de9d8fe24faab731622be959e0e8594739d7f180 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 17 Oct 2024 05:46:30 +0800 Subject: [PATCH 58/71] fix: Update normal loading --- utils/camera_utils.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/utils/camera_utils.py b/utils/camera_utils.py index 5282e8bf..16a93d41 100644 --- a/utils/camera_utils.py +++ b/utils/camera_utils.py @@ -67,14 +67,20 @@ def loadCam(args, id, cam_info, resolution_scale): _normal = - (_normal * 2 - 1) resized_normal = F.interpolate(_normal.unsqueeze(0), size=resolution[::-1], mode='bicubic') _normal = resized_normal.squeeze(0) - else: + # normalize normal + _normal = _normal.permute(1, 2, 0) @ (torch.tensor(np.linalg.inv(cam_info.R)).float()) + _normal = _normal.permute(2, 0, 1) + elif os.path.exists(normal_path[:-4]+ '.png'): _normal = Image.open(normal_path[:-4]+ '.png') resized_normal = PILtoTorch(_normal, resolution) resized_normal = resized_normal[:3] _normal = - (resized_normal * 2 - 1) - # normalize normal - _normal = _normal.permute(1, 2, 0) @ (torch.tensor(np.linalg.inv(cam_info.R)).float()) - _normal = _normal.permute(2, 0, 1) + # normalize normal + _normal = _normal.permute(1, 2, 0) @ (torch.tensor(np.linalg.inv(cam_info.R)).float()) + _normal = _normal.permute(2, 0, 1) + else: + print(f"Cannot find normal {normal_path}") + _normal = None else: _normal = None From b194160a41c4afea2f1c6e02cb345d83bc079bb5 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 17 Oct 2024 05:48:50 +0800 Subject: [PATCH 59/71] docs: Add wnormal training scripts --- scripts/train_with_mask.sh | 9 ++++++--- scripts/train_wmask_wnormal.sh | 11 +++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 scripts/train_wmask_wnormal.sh diff --git a/scripts/train_with_mask.sh b/scripts/train_with_mask.sh index 6584e07e..88092e81 100644 --- a/scripts/train_with_mask.sh +++ b/scripts/train_with_mask.sh @@ -1,5 +1,8 @@ data=$1 -gs-init -s $data -o ${data}_gaustudio --overwrite --w_mask mask -python train_progressive.py -s ${data}_gaustudio -r 1 --lambda_dist 100 --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio/result -gs-extract-pcd -m ${data}_gaustudio/result -o ${data}_gaustudio/result/fusion --meshing nksr +gs-init -s $data -o ${data}_gaustudio_wmask --w_mask mask +python train_progressive.py -s ${data}_gaustudio_wmask -r 1 --lambda_dist 1000 \ + --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio_wmask/result +gs-extract-pcd -m ${data}_gaustudio_wmask/result -o ${data}_gaustudio_wmask/result/fusion --meshing poisson-9 +texrecon ${data}_gaustudio_wmask/result/fusion/images ${data}_gaustudio_wmask/result/fusion/fused_mesh.ply \ + ${data}_gaustudio_wmask/result/fusion/textured_mesh --outlier_removal=gauss_clamping --data_term=area --no_intermediate_results \ No newline at end of file diff --git a/scripts/train_wmask_wnormal.sh b/scripts/train_wmask_wnormal.sh new file mode 100644 index 00000000..649d6bc6 --- /dev/null +++ b/scripts/train_wmask_wnormal.sh @@ -0,0 +1,11 @@ +data=$1 + +gs-init -s $data -o ${data}_gaustudio_wmask_wnormal --w_mask mask +python scripts/init_normal.py -s ${data}_gaustudio_wmask_wnormal +rm -r ${data}_gaustudio_wmask_wnormal/result +python train_progressive.py -s ${data}_gaustudio_wmask_wnormal -r 1 --lambda_dist 1000 \ + --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio_wmask_wnormal/result \ + --w_normal_prior normals --position_lr_init 0.000016 --iteration 20000 +gs-extract-pcd -m ${data}_gaustudio_wmask_wnormal/result -o ${data}_gaustudio_wmask_wnormal/result/fusion --meshing poisson-9 +texrecon ${data}_gaustudio_wmask_wnormal/result/fusion/images ${data}_gaustudio_wmask_wnormal/result/fusion/fused_mesh.ply \ + ${data}_gaustudio_wmask_wnormal/result/fusion/textured_mesh --outlier_removal=gauss_clamping --data_term=area --no_intermediate_results \ No newline at end of file From 163372d4fef9a0fc2e661400544ff879dbe4552d Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Thu, 17 Oct 2024 06:14:37 +0800 Subject: [PATCH 60/71] fix: Update wmask scripts --- scripts/train_with_mask.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/train_with_mask.sh b/scripts/train_with_mask.sh index 88092e81..5119d9b0 100644 --- a/scripts/train_with_mask.sh +++ b/scripts/train_with_mask.sh @@ -2,7 +2,8 @@ data=$1 gs-init -s $data -o ${data}_gaustudio_wmask --w_mask mask python train_progressive.py -s ${data}_gaustudio_wmask -r 1 --lambda_dist 1000 \ - --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio_wmask/result -gs-extract-pcd -m ${data}_gaustudio_wmask/result -o ${data}_gaustudio_wmask/result/fusion --meshing poisson-9 + --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio_wmask/result \ + --position_lr_init 0.000016 --iteration 20000 +gs-extract-pcd -m ${data}_gaustudio_wmask/result -o ${data}_gaustudio_wmask/result/fusion --meshing poisson texrecon ${data}_gaustudio_wmask/result/fusion/images ${data}_gaustudio_wmask/result/fusion/fused_mesh.ply \ ${data}_gaustudio_wmask/result/fusion/textured_mesh --outlier_removal=gauss_clamping --data_term=area --no_intermediate_results \ No newline at end of file From a339fb3727de4851217465b5e97edc69e90861dc Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 18 Oct 2024 00:37:43 +0800 Subject: [PATCH 61/71] fix: Update diff-surfel-rasterization --- submodules/diff-surfel-rasterization | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/diff-surfel-rasterization b/submodules/diff-surfel-rasterization index 910e7627..94f6d305 160000 --- a/submodules/diff-surfel-rasterization +++ b/submodules/diff-surfel-rasterization @@ -1 +1 @@ -Subproject commit 910e762782dd417c9a68f8a17504b95c6fc4e048 +Subproject commit 94f6d305556968a35651ba08cee3216ba4a74959 From 83ded47a80f968c84c952a6008dba534ef1c7e33 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 18 Oct 2024 02:11:22 +0800 Subject: [PATCH 62/71] fix: Improve mask handling and prevent NaN in normals - Use ground truth mask for valid pixel processing in losses - Adjust normal calculations to avoid NaN values - Ensure accurate weighting by valid pixel count --- train_progressive.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/train_progressive.py b/train_progressive.py index a3e3efa7..431ecf36 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -200,7 +200,12 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi rend_dist = render_pkg["rend_dist"] rend_depth = render_pkg["rend_depth"] surf_depth = render_pkg["surf_depth"] - dist_loss = lambda_dist * (rend_dist).mean() + rend_alpha = render_pkg['rend_alpha'] + gt_mask = viewpoint_cam.gt_alpha_mask.mean(dim=0) + valid_pixel_count = gt_mask.sum() + + dist_error = rend_dist * gt_mask + dist_loss = lambda_dist * (dist_error.sum() / valid_pixel_count) if lambda_depth > 0 and viewpoint_cam.depth_prior is not None: depth_error = 0.6 * (surf_depth - viewpoint_cam.depth_prior).abs() + \ @@ -209,17 +214,18 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi valid_depth_sum = depth_mask.sum() + 1e-5 depth_loss += lambda_depth * (depth_error[depth_mask & ~torch.isnan(depth_error)].sum() / valid_depth_sum) - rend_normal = render_pkg['rend_normal'] + # fix normal + rend_normal = render_pkg['rend_normal'] / rend_alpha.detach() + rend_normal = torch.nan_to_num(rend_normal, 0, 0) + surf_normal_expected = render_pkg['surf_normal_expected'] / rend_alpha.detach() + surf_normal_expected = torch.nan_to_num(surf_normal_expected, 0, 0) surf_normal_median = render_pkg['surf_normal'] - surf_normal_expected = render_pkg['surf_normal_expected'] - rend_alpha = render_pkg['rend_alpha'] - + if lambda_normal > 0.0: normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) - normal_error = normal_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) - normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=0.7, type='mean') - normal_loss += lambda_normal * normal_error + normal_error = normal_error * gt_mask + normal_loss = lambda_normal * (normal_error.sum() / valid_pixel_count) if lambda_normal_prior > 0 and viewpoint_cam.normal_prior is not None: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() @@ -227,7 +233,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) - normal_prior_error = normal_prior_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) + normal_prior_error = normal_prior_error * gt_mask normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], penalize_ratio=1.0, type='mean') From eb55716883b449784383d98ecdc0df2e1599b026 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 18 Oct 2024 02:13:33 +0800 Subject: [PATCH 63/71] fix: Add edge_aware_curvature_loss from atomg --- arguments/__init__.py | 2 +- train_progressive.py | 4 +++- utils/loss_utils.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index a89ad251..5adc79e5 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -93,7 +93,7 @@ def __init__(self, parser): self.lambda_normal = 0.05 self.lambda_mask = 0. self.lambda_normal_prior = 0.25 - self.lambda_normal_gradient = 0 + self.lambda_normal_gradient = 0. self.opacity_cull = 0.05 self.split_interval = 500 diff --git a/train_progressive.py b/train_progressive.py index 431ecf36..ba0dabde 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -12,7 +12,7 @@ import os import torch from random import randint -from utils.loss_utils import l1_loss_appearance, ssim, l1_loss +from utils.loss_utils import l1_loss_appearance, ssim, l1_loss, edge_aware_curvature_loss from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F @@ -226,6 +226,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) normal_error = normal_error * gt_mask normal_loss = lambda_normal * (normal_error.sum() / valid_pixel_count) + if lambda_normal_gradient > 0.0: + normal_loss += lambda_normal_gradient * edge_aware_curvature_loss(gt_image, surf_normal_median, gt_mask) if lambda_normal_prior > 0 and viewpoint_cam.normal_prior is not None: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() diff --git a/utils/loss_utils.py b/utils/loss_utils.py index 89e6d67d..f98cbd83 100644 --- a/utils/loss_utils.py +++ b/utils/loss_utils.py @@ -14,6 +14,49 @@ from torch.autograd import Variable from math import exp +def edge_aware_curvature_loss(I, D, mask=None): + # Define Sobel kernels + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(I.device) / 4 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(I.device) / 4 + + # Compute derivatives of D + dD_dx = torch.cat([F.conv2d(D[i].unsqueeze(0), sobel_x, padding=1) for i in range(D.shape[0])]) + dD_dy = torch.cat([F.conv2d(D[i].unsqueeze(0), sobel_y, padding=1) for i in range(D.shape[0])]) + + # Compute derivatives of I + dI_dx = torch.cat([F.conv2d(I[i].unsqueeze(0), sobel_x, padding=1) for i in range(I.shape[0])]) + dI_dx = torch.mean(torch.abs(dI_dx), 0, keepdim=True) + dI_dy = torch.cat([F.conv2d(I[i].unsqueeze(0), sobel_y, padding=1) for i in range(I.shape[0])]) + dI_dy = torch.mean(torch.abs(dI_dy), 0, keepdim=True) + + # Compute weights + weights_x = (dI_dx - 1) ** 500 + weights_y = (dI_dy - 1) ** 500 + + # Compute losses + loss_x = torch.abs(dD_dx) * weights_x + loss_y = torch.abs(dD_dy) * weights_y + + # Apply mask to losses + if mask is not None: + # Ensure mask is on the correct device and has correct dimensions + mask = mask.to(I.device) + loss_x = loss_x * mask + loss_y = loss_y * mask + + # Count valid pixels + valid_pixel_count = mask.sum() + + # Compute the mean loss only over valid pixels + if valid_pixel_count.item() > 0: + return (loss_x.sum() + loss_y.sum()) / valid_pixel_count + else: + # Handle the case where no valid pixels exist + return torch.tensor(0.0, device=I.device, requires_grad=True) + else: + # If no mask is provided, calculate the mean over all pixels + return (loss_x + loss_y).mean() + def l1_loss(network_output, gt): return torch.abs((network_output - gt)).mean() From 1604bf3010df114dc9980a98b93a6be88a81c332 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 18 Oct 2024 06:24:54 +0800 Subject: [PATCH 64/71] fix: Update curvature loss --- arguments/__init__.py | 2 +- train_progressive.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index 5adc79e5..97ab04f2 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -93,7 +93,7 @@ def __init__(self, parser): self.lambda_normal = 0.05 self.lambda_mask = 0. self.lambda_normal_prior = 0.25 - self.lambda_normal_gradient = 0. + self.lambda_normal_gradient = 0.01 self.opacity_cull = 0.05 self.split_interval = 500 diff --git a/train_progressive.py b/train_progressive.py index ba0dabde..721d7b9f 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -191,7 +191,7 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi lambda_depth = opt.propagation_begin if iteration > opt.propagation_begin else 0.0 lambda_dist = opt.lambda_dist if iteration > 3000 else 0.0 lambda_normal_prior = opt.lambda_normal_prior * (7000 - iteration) / 7000 if iteration < 7000 else opt.lambda_normal_prior - lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 15000 else 0.0 + lambda_normal_gradient = opt.lambda_normal_gradient if iteration > 7000 else 0.0 depth_loss = torch.tensor(0.).to("cuda") normal_loss = torch.tensor(0.).to("cuda") @@ -227,7 +227,9 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi normal_error = normal_error * gt_mask normal_loss = lambda_normal * (normal_error.sum() / valid_pixel_count) if lambda_normal_gradient > 0.0: - normal_loss += lambda_normal_gradient * edge_aware_curvature_loss(gt_image, surf_normal_median, gt_mask) + curvature_error = 0.6 *edge_aware_curvature_loss(gt_image, surf_normal_median, gt_mask) + \ + 0.4 * edge_aware_curvature_loss(gt_image, surf_normal_expected, gt_mask) + normal_loss += lambda_normal_gradient * curvature_error if lambda_normal_prior > 0 and viewpoint_cam.normal_prior is not None: prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() From 23012695a154b6c96f27c234ba0c24bdd92d1bc6 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Fri, 18 Oct 2024 06:51:49 +0800 Subject: [PATCH 65/71] fix: Update training scripts --- scripts/train_with_mask.sh | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/scripts/train_with_mask.sh b/scripts/train_with_mask.sh index 5119d9b0..55de7c3a 100644 --- a/scripts/train_with_mask.sh +++ b/scripts/train_with_mask.sh @@ -1,9 +1,12 @@ data=$1 - -gs-init -s $data -o ${data}_gaustudio_wmask --w_mask mask -python train_progressive.py -s ${data}_gaustudio_wmask -r 1 --lambda_dist 1000 \ - --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio_wmask/result \ - --position_lr_init 0.000016 --iteration 20000 -gs-extract-pcd -m ${data}_gaustudio_wmask/result -o ${data}_gaustudio_wmask/result/fusion --meshing poisson -texrecon ${data}_gaustudio_wmask/result/fusion/images ${data}_gaustudio_wmask/result/fusion/fused_mesh.ply \ - ${data}_gaustudio_wmask/result/fusion/textured_mesh --outlier_removal=gauss_clamping --data_term=area --no_intermediate_results \ No newline at end of file +postix=gaustudio_wmask +gs-init -s $data -o ${data}_${postix} --w_mask mask +rm -r ${data}_${postix}/result_2 +python train_progressive.py -s ${data}_${postix} -r 1 --lambda_dist 1000 \ + --w_mask masks --lambda_mask 0.1 --max_screen_size 5 \ + -m ${data}_${postix}/result_2 --iteration 20000 +gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion \ + --meshing sap --config 2dgs +texrecon ${data}_${postix}/result_2/fusion/images ${data}_${postix}/result_2/fusion/fused_mesh.ply \ + ${data}_${postix}/result_2/fusion/textured_mesh --outlier_removal=gauss_clamping \ + --data_term=area --no_intermediate_results \ No newline at end of file From c403e24295d655b90ce39feaca3b84532c7577bd Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Wed, 23 Oct 2024 22:48:00 +0800 Subject: [PATCH 66/71] fix: Update normal supervision --- arguments/__init__.py | 2 +- scripts/init_normal.py | 54 +++++++++++++++++++++++++++++++--- scripts/train_with_mask.sh | 9 ++---- scripts/train_wmask_wnormal.sh | 19 ++++++------ utils/camera_utils.py | 12 ++++---- 5 files changed, 69 insertions(+), 27 deletions(-) diff --git a/arguments/__init__.py b/arguments/__init__.py index 97ab04f2..ed77c3ba 100644 --- a/arguments/__init__.py +++ b/arguments/__init__.py @@ -92,7 +92,7 @@ def __init__(self, parser): self.lambda_depth = 0.1 self.lambda_normal = 0.05 self.lambda_mask = 0. - self.lambda_normal_prior = 0.25 + self.lambda_normal_prior = 0.05 self.lambda_normal_gradient = 0.01 self.opacity_cull = 0.05 diff --git a/scripts/init_normal.py b/scripts/init_normal.py index 73652edd..d569f893 100644 --- a/scripts/init_normal.py +++ b/scripts/init_normal.py @@ -4,24 +4,70 @@ from PIL import Image import os from tqdm import tqdm +import numpy as np +from transformers import AutoModelForImageSegmentation +import torchvision.transforms as transforms @click.command() @click.option('--source_path', '-s', required=True, help='Path to the dataset') def main(source_path: str) -> None: - normal_predictor = torch.hub.load("Stable-X/StableNormal", "StableNormal", trust_repo=True) + # Load StableNormal model + normal_predictor = torch.hub.load("Stable-X/StableNormal", "StableNormal_turbo", + trust_repo=True, yoso_version='yoso-normal-v1-0') + + # Load BiRefNet model + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + birefnet = AutoModelForImageSegmentation.from_pretrained('zhengpeng7/BiRefNet', trust_remote_code=True) + birefnet.to(device) + birefnet.eval() + output_normal_dir = os.path.join(source_path, "normals") output_mask_dir = os.path.join(source_path, "masks") os.makedirs(output_normal_dir, exist_ok=True) os.makedirs(output_mask_dir, exist_ok=True) - image_pattern = f"{source_path}/images/*.jpg" - for image_path in tqdm(glob.glob(image_pattern, recursive=True)[::3]): + def generate_mask(image): + image_size = (1024, 1024) + transform_image = transforms.Compose([ + transforms.Resize(image_size), + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + + input_images = transform_image(image).unsqueeze(0).to(device) + + with torch.no_grad(): + preds = birefnet(input_images)[-1].sigmoid().cpu() + pred = preds[0].squeeze() + mask = transforms.ToPILImage()(pred) + mask = mask.resize(image.size) + return mask + + image_pattern = f"{source_path}/images/*.jpeg" + for image_path in tqdm(glob.glob(image_pattern, recursive=True)): image_name = os.path.basename(image_path.split("/")[-1]).split(".")[0] input_image = Image.open(image_path) output_normal_path = os.path.join(output_normal_dir, image_name+'.png') + output_mask_path = os.path.join(output_mask_dir, image_name+'.png') + + # Load or generate mask + if os.path.exists(output_mask_path): + mask = Image.open(output_mask_path) + else: + mask = generate_mask(input_image) + mask.save(output_mask_path) + + # Apply mask to input image + input_array = np.array(input_image) + mask_array = np.array(mask) + # masked_input = np.where(mask_array[:,:, np.newaxis] > 128, input_array, 0) + masked_input = np.where(mask_array[:,:] > 128, input_array, 0) + masked_input_image = Image.fromarray(masked_input) + + # Generate normal map if it doesn't exist if not os.path.exists(output_normal_path): - normal_image = normal_predictor(input_image) + normal_image = normal_predictor(masked_input_image) normal_image.save(output_normal_path) if __name__ == "__main__": diff --git a/scripts/train_with_mask.sh b/scripts/train_with_mask.sh index 55de7c3a..9be9fe87 100644 --- a/scripts/train_with_mask.sh +++ b/scripts/train_with_mask.sh @@ -1,12 +1,9 @@ data=$1 postix=gaustudio_wmask -gs-init -s $data -o ${data}_${postix} --w_mask mask +gs-init -s $data -o ${data}_${postix} --w_mask mask --overwrite rm -r ${data}_${postix}/result_2 python train_progressive.py -s ${data}_${postix} -r 1 --lambda_dist 1000 \ --w_mask masks --lambda_mask 0.1 --max_screen_size 5 \ -m ${data}_${postix}/result_2 --iteration 20000 -gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion \ - --meshing sap --config 2dgs -texrecon ${data}_${postix}/result_2/fusion/images ${data}_${postix}/result_2/fusion/fused_mesh.ply \ - ${data}_${postix}/result_2/fusion/textured_mesh --outlier_removal=gauss_clamping \ - --data_term=area --no_intermediate_results \ No newline at end of file +gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ + --meshing sap --config 2dgs \ No newline at end of file diff --git a/scripts/train_wmask_wnormal.sh b/scripts/train_wmask_wnormal.sh index 649d6bc6..70d69a0c 100644 --- a/scripts/train_wmask_wnormal.sh +++ b/scripts/train_wmask_wnormal.sh @@ -1,11 +1,10 @@ data=$1 - -gs-init -s $data -o ${data}_gaustudio_wmask_wnormal --w_mask mask -python scripts/init_normal.py -s ${data}_gaustudio_wmask_wnormal -rm -r ${data}_gaustudio_wmask_wnormal/result -python train_progressive.py -s ${data}_gaustudio_wmask_wnormal -r 1 --lambda_dist 1000 \ - --w_mask masks --lambda_mask 0.1 --max_screen_size 5 -m ${data}_gaustudio_wmask_wnormal/result \ - --w_normal_prior normals --position_lr_init 0.000016 --iteration 20000 -gs-extract-pcd -m ${data}_gaustudio_wmask_wnormal/result -o ${data}_gaustudio_wmask_wnormal/result/fusion --meshing poisson-9 -texrecon ${data}_gaustudio_wmask_wnormal/result/fusion/images ${data}_gaustudio_wmask_wnormal/result/fusion/fused_mesh.ply \ - ${data}_gaustudio_wmask_wnormal/result/fusion/textured_mesh --outlier_removal=gauss_clamping --data_term=area --no_intermediate_results \ No newline at end of file +postix=gaustudio_wmask_wnormal +# gs-init -s $data -o ${data}_${postix} --w_mask mask +python scripts/init_normal.py -s ${data}_${postix} +rm -r ${data}_${postix}/result_2 +python train_progressive.py -s ${data}_${postix} -r 1 --lambda_dist 1000 \ + --w_mask masks --lambda_mask 0.1 --w_normal_prior normals \ + --max_screen_size 5 -m ${data}_${postix}/result_2 --iteration 7000 +gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ + --meshing sap --config 2dgs \ No newline at end of file diff --git a/utils/camera_utils.py b/utils/camera_utils.py index 16a93d41..f462f441 100644 --- a/utils/camera_utils.py +++ b/utils/camera_utils.py @@ -61,17 +61,17 @@ def loadCam(args, id, cam_info, resolution_scale): if args.w_normal_prior: import torch # normal_path = cam_info.image_path.replace('images_4', args.w_normal_prior) - normal_path = os.path.join(os.path.dirname(os.path.dirname(cam_info.image_path)), args.w_normal_prior, os.path.basename(cam_info.image_path)) - if os.path.exists(normal_path[:-4]+ '.npy'): - _normal = torch.tensor(np.load(normal_path[:-4]+ '.npy')) + normal_path = os.path.join(os.path.dirname(os.path.dirname(cam_info.image_path)), args.w_normal_prior, os.path.basename(cam_info.image_path).split('.')[0]) + if os.path.exists(normal_path+ '.npy'): + _normal = torch.tensor(np.load(normal_path+ '.npy')) _normal = - (_normal * 2 - 1) resized_normal = F.interpolate(_normal.unsqueeze(0), size=resolution[::-1], mode='bicubic') _normal = resized_normal.squeeze(0) # normalize normal _normal = _normal.permute(1, 2, 0) @ (torch.tensor(np.linalg.inv(cam_info.R)).float()) _normal = _normal.permute(2, 0, 1) - elif os.path.exists(normal_path[:-4]+ '.png'): - _normal = Image.open(normal_path[:-4]+ '.png') + elif os.path.exists(normal_path+ '.png'): + _normal = Image.open(normal_path+ '.png') resized_normal = PILtoTorch(_normal, resolution) resized_normal = resized_normal[:3] _normal = - (resized_normal * 2 - 1) @@ -79,7 +79,7 @@ def loadCam(args, id, cam_info, resolution_scale): _normal = _normal.permute(1, 2, 0) @ (torch.tensor(np.linalg.inv(cam_info.R)).float()) _normal = _normal.permute(2, 0, 1) else: - print(f"Cannot find normal {normal_path}") + print(f"Cannot find normal {normal_path}.png") _normal = None else: _normal = None From 51bf7dbeff44d09fa267de81be21d580d2cd9a5e Mon Sep 17 00:00:00 2001 From: YeChongjie <40767265+hugoycj@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:52:28 +0800 Subject: [PATCH 67/71] Update train_wmask_wnormal.sh --- scripts/train_wmask_wnormal.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/train_wmask_wnormal.sh b/scripts/train_wmask_wnormal.sh index 70d69a0c..12179289 100644 --- a/scripts/train_wmask_wnormal.sh +++ b/scripts/train_wmask_wnormal.sh @@ -1,10 +1,10 @@ data=$1 postix=gaustudio_wmask_wnormal -# gs-init -s $data -o ${data}_${postix} --w_mask mask +gs-init -s $data -o ${data}_${postix} --w_mask mask python scripts/init_normal.py -s ${data}_${postix} rm -r ${data}_${postix}/result_2 python train_progressive.py -s ${data}_${postix} -r 1 --lambda_dist 1000 \ --w_mask masks --lambda_mask 0.1 --w_normal_prior normals \ --max_screen_size 5 -m ${data}_${postix}/result_2 --iteration 7000 gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ - --meshing sap --config 2dgs \ No newline at end of file + --meshing sap --config 2dgs From 9eea48421b2a27a37d7eb0efb36cc8cdfed822db Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 28 Oct 2024 03:29:29 +0800 Subject: [PATCH 68/71] feat: Add 2dgs fast scripts --- scripts/train_wmask_wnormal_fast.sh | 11 + train_fast.py | 427 ++++++++++++++++++++++++++++ 2 files changed, 438 insertions(+) create mode 100644 scripts/train_wmask_wnormal_fast.sh create mode 100644 train_fast.py diff --git a/scripts/train_wmask_wnormal_fast.sh b/scripts/train_wmask_wnormal_fast.sh new file mode 100644 index 00000000..5ea693d3 --- /dev/null +++ b/scripts/train_wmask_wnormal_fast.sh @@ -0,0 +1,11 @@ +data=$1 +postix=gaustudio_wmask_wnormal_fast +gs-init -s $data -o ${data}_${postix} --w_mask mask +python scripts/init_normal.py -s ${data}_${postix} +rm -r ${data}_${postix}/result_2 +python train_fast.py -s ${data}_${postix} -r 1 --lambda_dist 1000 --lambda_dssim 1 \ + --w_mask masks --lambda_mask 0.1 --w_normal_prior normals \ + --max_screen_size 5 -m ${data}_${postix}/result_2 --iteration 7000 + +gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ + --meshing sap --config 2dgs \ No newline at end of file diff --git a/train_fast.py b/train_fast.py new file mode 100644 index 00000000..d9298452 --- /dev/null +++ b/train_fast.py @@ -0,0 +1,427 @@ +# +# Copyright (C) 2023, Inria +# GRAPHDECO research group, https://team.inria.fr/graphdeco +# All rights reserved. +# +# This software is free for non-commercial, research and evaluation use +# under the terms of the LICENSE.md file. +# +# For inquiries contact george.drettakis@inria.fr +# + +import os +import torch +from random import randint +from utils.loss_utils import l1_loss_appearance, ssim, l1_loss +from gaussian_renderer import render, network_gui +import sys +import torch.nn.functional as F +from scene import Scene, GaussianModel, AppearanceModel +from utils.general_utils import safe_state +from utils.patchmatch import process_propagation +import uuid +from tqdm import tqdm +from utils.image_utils import psnr, render_net_image +from argparse import ArgumentParser, Namespace +from arguments import ModelParams, PipelineParams, OptimizationParams +try: + from torch.utils.tensorboard import SummaryWriter + TENSORBOARD_FOUND = True +except ImportError: + TENSORBOARD_FOUND = False + +def prune_low_contribution_gaussians(gaussians, cameras, pipe, bg, K=5, prune_ratio=0.1): + top_list = [None, ] * K + for i, cam in enumerate(cameras): + trans = render(cam, gaussians, pipe, bg, record_transmittance=True, skip_geometric=True)["transmittance_avg"] + if top_list[0] is not None: + m = trans > top_list[0] + if m.any(): + for i in range(K - 1): + top_list[K - 1 - i][m] = top_list[K - 2 - i][m] + top_list[0][m] = trans[m] + else: + top_list = [trans.clone() for _ in range(K)] + + contribution = torch.stack(top_list, dim=-1).mean(-1) + tile = torch.quantile(contribution, prune_ratio) + prune_mask = contribution < tile + gaussians.prune_points(prune_mask) + torch.cuda.empty_cache() + +def ranking_loss(error, penalize_ratio=0.7, extra_weights=None , type='mean'): + error, indices = torch.sort(error) + # only sum relatively small errors + s_error = torch.index_select(error, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + if extra_weights is not None: + weights = torch.index_select(extra_weights, 0, index=indices[:int(penalize_ratio * indices.shape[0])]) + s_error = s_error * weights + + if type == 'mean': + return torch.mean(s_error) + elif type == 'sum': + return torch.sum(s_error) + +def normal_gradient_loss(rend_normal, gt_normal): + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 4 + + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + + return loss_x + loss_y + +def edge_aware_normal_gradient_loss(gt_image, rend_normal, gt_normal, prior_normal_mask, edge_threshold=1): + # Define Sobel filters + sobel_x = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + sobel_y = torch.tensor([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]).float().unsqueeze(0).unsqueeze(0).to(rend_normal.device) / 8 + + # Compute gradients of rendered and ground truth normals + rend_grad_x = F.conv2d(rend_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + rend_grad_y = F.conv2d(rend_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + gt_grad_x = F.conv2d(gt_normal, sobel_x.repeat(3, 1, 1, 1), padding=1, groups=3) + gt_grad_y = F.conv2d(gt_normal, sobel_y.repeat(3, 1, 1, 1), padding=1, groups=3) + + # Compute gradients of gt_image for edge detection + dI_dx = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_x, padding=1) for i in range(gt_image.shape[0])]) + dI_dx = torch.mean(torch.abs(dI_dx), 1, keepdim=True) + dI_dy = torch.cat([F.conv2d(gt_image[i].unsqueeze(0), sobel_y, padding=1) for i in range(gt_image.shape[0])]) + dI_dy = torch.mean(torch.abs(dI_dy), 1, keepdim=True) + + # Compute edge strength + edge_strength = dI_dx + dI_dy + + # Create non-edge mask + non_edge_mask = (edge_strength < edge_threshold).float() + + # Compute loss for gradients + loss_x = F.mse_loss(rend_grad_x, gt_grad_x) + loss_y = F.mse_loss(rend_grad_y, gt_grad_y) + loss = loss_x + loss_y + + # Apply non-edge mask and prior_normal_mask + masked_loss = loss * non_edge_mask * prior_normal_mask + + # Normalize by the number of non-edge pixels + num_non_edge_pixels = torch.sum(non_edge_mask * prior_normal_mask) + 1e-6 + normalized_loss = torch.sum(masked_loss) / num_non_edge_pixels + + return normalized_loss + +def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint): + first_iter = 0 + tb_writer = prepare_output_and_logger(dataset) + gaussians = GaussianModel(dataset.sh_degree) + scene = Scene(dataset, gaussians) + gaussians.training_setup(opt) + + if checkpoint: + (model_params, first_iter) = torch.load(checkpoint) + gaussians.restore(model_params, opt) + + bg_color = [1, 1, 1] if dataset.white_background else [0, 0, 0] + background = torch.tensor(bg_color, dtype=torch.float32, device="cuda") + + iter_start = torch.cuda.Event(enable_timing = True) + iter_end = torch.cuda.Event(enable_timing = True) + + viewpoint_stack = None + ema_loss_for_log = 0.0 + ema_depth_for_log = 0.0 + ema_normal_for_log = 0.0 + + progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress") + first_iter += 1 + all_cameras = scene.getTrainCameras() + if dataset.use_decoupled_appearance: + appearances = AppearanceModel(len(all_cameras)) + appearances.training_setup(opt) + else: + appearances = None + + for iteration in range(first_iter, opt.iterations + 1): + + iter_start.record() + + gaussians.update_learning_rate(iteration) + + # Every 1000 its we increase the levels of SH up to a maximum degree + if iteration % 1000 == 0: + gaussians.oneupSHdegree() + + # Pick a random Camera + if not viewpoint_stack: + viewpoint_stack = scene.getTrainCameras().copy() + viewpoint_idx = randint(0, len(all_cameras)-1) + viewpoint_cam = all_cameras[viewpoint_idx] + render_pkg = render(viewpoint_cam, gaussians, pipe, background, record_transmittance=(iteration < opt.densify_until_iter)) + image, viewspace_point_tensor, visibility_filter, radii = render_pkg["render"], render_pkg["viewspace_points"], render_pkg["visibility_filter"], render_pkg["radii"] + + gt_image = viewpoint_cam.original_image.cuda() + Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance + loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + + # alpha loss + if opt.lambda_mask > 0: + opacity = 1 - render_pkg["rend_alpha"].clamp(1e-6, 1-1e-6) + bg = 1 - viewpoint_cam.gt_alpha_mask + mask_error = (- bg * torch.log(opacity)).mean() + loss += opt.lambda_mask * mask_error + + # regularization + lambda_normal = opt.lambda_normal + lambda_dist = opt.lambda_dist + lambda_normal_prior = opt.lambda_normal_prior + lambda_normal_gradient = opt.lambda_normal_gradient + + depth_loss = torch.tensor(0.).to("cuda") + normal_loss = torch.tensor(0.).to("cuda") + normal_prior_loss = torch.tensor(0.).to("cuda") + + rend_dist = render_pkg["rend_dist"] + dist_loss = lambda_dist * (rend_dist).mean() + + rend_normal = render_pkg['rend_normal'] + surf_normal_median = render_pkg['surf_normal'] + surf_normal_expected = render_pkg['surf_normal_expected'] + rend_alpha = render_pkg['rend_alpha'] + + if lambda_normal > 0.0: + normal_error = 0.6 * (1 - F.cosine_similarity(rend_normal, surf_normal_median, dim=0)) + \ + 0.4 * (1 - F.cosine_similarity(rend_normal, surf_normal_expected, dim=0)) + normal_error = normal_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) + normal_error = ranking_loss(normal_error.view(-1), penalize_ratio=1.0, type='mean') + normal_loss += lambda_normal * normal_error + + if lambda_normal_prior > 0 and viewpoint_cam.normal_prior is not None: + prior_normal = viewpoint_cam.normal_prior * (rend_alpha).detach() + prior_normal_mask = viewpoint_cam.normal_mask[0] + + normal_prior_error = (1 - F.cosine_similarity(prior_normal, rend_normal, dim=0)) + \ + (1 - F.cosine_similarity(prior_normal, surf_normal_expected, dim=0)) + normal_prior_error = normal_prior_error * viewpoint_cam.gt_alpha_mask.mean(dim=0) + normal_prior_error = ranking_loss(normal_prior_error[prior_normal_mask], + penalize_ratio=1.0, type='mean') + + normal_prior_loss = lambda_normal_prior * normal_prior_error + if lambda_normal_gradient > 0.0: + normal_prior_loss += lambda_normal_gradient * normal_gradient_loss(surf_normal_median, prior_normal) + + # loss + total_loss = loss + dist_loss + depth_loss + normal_loss + normal_prior_loss + + total_loss.backward() + + iter_end.record() + + with torch.no_grad(): + # Progress bar + ema_loss_for_log = 0.4 * loss.item() + 0.6 * ema_loss_for_log + ema_depth_for_log = 0.4 * (depth_loss.item() + dist_loss.item()) + 0.6 * ema_depth_for_log + ema_normal_for_log = 0.4 * (normal_loss.item() + normal_prior_loss.item()) + 0.6 * ema_normal_for_log + + + if iteration % 10 == 0: + loss_dict = { + "Loss": f"{ema_loss_for_log:.{5}f}", + "depth": f"{ema_depth_for_log:.{5}f}", + "normal": f"{ema_normal_for_log:.{5}f}", + "Points": f"{len(gaussians.get_xyz)}" + } + progress_bar.set_postfix(loss_dict) + + progress_bar.update(10) + if iteration == opt.iterations: + progress_bar.close() + + # Log and save + if tb_writer is not None: + tb_writer.add_scalar('train_loss_patches/dist_loss', ema_depth_for_log, iteration) + tb_writer.add_scalar('train_loss_patches/normal_loss', ema_normal_for_log, iteration) + + # training_report(tb_writer, iteration, Ll1, loss, l1_loss, iter_start.elapsed_time(iter_end), testing_iterations, scene, render, (pipe, background)) + if (iteration in saving_iterations): + print("\n[ITER {}] Saving Gaussians".format(iteration)) + scene.save(iteration) + + + # Densification + if iteration < opt.densify_until_iter: + gaussians.max_radii2D[visibility_filter] = torch.max(gaussians.max_radii2D[visibility_filter], + radii[visibility_filter] * (render_pkg["transmittance_avg"][visibility_filter] > 0.01)) + gaussians.add_densification_stats(viewspace_point_tensor, visibility_filter, None) + + if iteration > opt.densify_from_iter and iteration % opt.densification_interval == 0: + prune_big_points = True if iteration > opt.opacity_reset_interval else False + gaussians.densify_and_prune(opt.densify_grad_threshold, opt.opacity_cull, scene.cameras_extent, prune_big_points) + + if iteration > opt.densify_from_iter and iteration % opt.split_interval == 0: + gaussians.split_big_points(opt.max_screen_size) + + if iteration > opt.contribution_prune_from_iter and iteration % opt.contribution_prune_interval == 0: + if iteration % opt.opacity_reset_interval == opt.contribution_prune_interval: + print("Skipped Pruning for", iteration) + continue + prune_low_contribution_gaussians(gaussians, all_cameras, pipe, background, + K=1, prune_ratio=opt.contribution_prune_ratio) + print(f'Num gs after contribution prune: {len(gaussians.get_xyz)}') + + if iteration % opt.opacity_reset_interval == 0 or (dataset.white_background and iteration == opt.densify_from_iter): + gaussians.reset_opacity() + + # Optimizer step + if iteration < opt.iterations: + # visible = radii > 0 + # gaussians.optimizer.step(visible, radii.shape[0]) + gaussians.optimizer.step() + gaussians.optimizer.zero_grad(set_to_none = True) + if appearances is not None: + appearances.optimizer.step() + appearances.optimizer.zero_grad(set_to_none = True) + + if (iteration in checkpoint_iterations): + print("\n[ITER {}] Saving Checkpoint".format(iteration)) + torch.save((gaussians.capture(), iteration), scene.model_path + "/chkpnt" + str(iteration) + ".pth") + + with torch.no_grad(): + if network_gui.conn == None: + network_gui.try_connect(dataset.render_items) + while network_gui.conn != None: + try: + net_image_bytes = None + custom_cam, do_training, keep_alive, scaling_modifer, render_mode = network_gui.receive() + if custom_cam != None: + render_pkg = render(custom_cam, gaussians, pipe, background, scaling_modifer) + net_image = render_net_image(render_pkg, dataset.render_items, render_mode, custom_cam) + net_image_bytes = memoryview((torch.clamp(net_image, min=0, max=1.0) * 255).byte().permute(1, 2, 0).contiguous().cpu().numpy()) + metrics_dict = { + "#": gaussians.get_opacity.shape[0], + "loss": ema_loss_for_log + # Add more metrics as needed + } + # Send the data + network_gui.send(net_image_bytes, dataset.source_path, metrics_dict) + if do_training and ((iteration < int(opt.iterations)) or not keep_alive): + break + except Exception as e: + # raise e + network_gui.conn = None + +def prepare_output_and_logger(args): + if not args.model_path: + if os.getenv('OAR_JOB_ID'): + unique_str=os.getenv('OAR_JOB_ID') + else: + unique_str = str(uuid.uuid4()) + args.model_path = os.path.join("./output/", unique_str[0:10]) + + # Set up output folder + print("Output folder: {}".format(args.model_path)) + os.makedirs(args.model_path, exist_ok = True) + with open(os.path.join(args.model_path, "cfg_args"), 'w') as cfg_log_f: + cfg_log_f.write(str(Namespace(**vars(args)))) + + # Create Tensorboard writer + tb_writer = None + if TENSORBOARD_FOUND: + tb_writer = SummaryWriter(args.model_path) + else: + print("Tensorboard not available: not logging progress") + return tb_writer + +@torch.no_grad() +def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_iterations, scene : Scene, renderFunc, renderArgs): + if tb_writer: + tb_writer.add_scalar('train_loss_patches/reg_loss', Ll1.item(), iteration) + tb_writer.add_scalar('train_loss_patches/total_loss', loss.item(), iteration) + tb_writer.add_scalar('iter_time', elapsed, iteration) + tb_writer.add_scalar('total_points', scene.gaussians.get_xyz.shape[0], iteration) + + # Report test and samples of training set + if iteration in testing_iterations: + torch.cuda.empty_cache() + validation_configs = ({'name': 'test', 'cameras' : scene.getTestCameras()}, + {'name': 'train', 'cameras' : [scene.getTrainCameras()[idx % len(scene.getTrainCameras())] for idx in range(5, 30, 5)]}) + + for config in validation_configs: + if config['cameras'] and len(config['cameras']) > 0: + l1_test = 0.0 + psnr_test = 0.0 + for idx, viewpoint in enumerate(config['cameras']): + render_pkg = renderFunc(viewpoint, scene.gaussians, *renderArgs) + image = torch.clamp(render_pkg["render"], 0.0, 1.0) + gt_image = torch.clamp(viewpoint.original_image.to("cuda"), 0.0, 1.0) + if tb_writer and (idx < 5): + from utils.general_utils import colormap + depth = render_pkg["surf_depth"] + norm = depth.max() + depth = depth / norm + depth = colormap(depth.cpu().numpy()[0], cmap='turbo') + tb_writer.add_images(config['name'] + "_view_{}/depth".format(viewpoint.image_name), depth[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/render".format(viewpoint.image_name), image[None], global_step=iteration) + + try: + rend_alpha = render_pkg['rend_alpha'] + rend_normal = render_pkg["rend_normal"] * 0.5 + 0.5 + surf_normal = render_pkg["surf_normal"] * 0.5 + 0.5 + tb_writer.add_images(config['name'] + "_view_{}/rend_normal".format(viewpoint.image_name), rend_normal[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/surf_normal".format(viewpoint.image_name), surf_normal[None], global_step=iteration) + tb_writer.add_images(config['name'] + "_view_{}/rend_alpha".format(viewpoint.image_name), rend_alpha[None], global_step=iteration) + + rend_dist = render_pkg["rend_dist"] + rend_dist = colormap(rend_dist.cpu().numpy()[0]) + tb_writer.add_images(config['name'] + "_view_{}/rend_dist".format(viewpoint.image_name), rend_dist[None], global_step=iteration) + except: + pass + + if iteration == testing_iterations[0]: + tb_writer.add_images(config['name'] + "_view_{}/ground_truth".format(viewpoint.image_name), gt_image[None], global_step=iteration) + + l1_test += l1_loss(image, gt_image).mean().double() + psnr_test += psnr(image, gt_image).mean().double() + + psnr_test /= len(config['cameras']) + l1_test /= len(config['cameras']) + print("\n[ITER {}] Evaluating {}: L1 {} PSNR {}".format(iteration, config['name'], l1_test, psnr_test)) + if tb_writer: + tb_writer.add_scalar(config['name'] + '/loss_viewpoint - l1_loss', l1_test, iteration) + tb_writer.add_scalar(config['name'] + '/loss_viewpoint - psnr', psnr_test, iteration) + + torch.cuda.empty_cache() + +if __name__ == "__main__": + # Set up command line argument parser + parser = ArgumentParser(description="Training script parameters") + lp = ModelParams(parser) + op = OptimizationParams(parser) + pp = PipelineParams(parser) + parser.add_argument('--ip', type=str, default="127.0.0.1") + parser.add_argument('--port', type=int, default=6009) + parser.add_argument('--detect_anomaly', action='store_true', default=False) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[500, 7_000, 20_000, 30_000]) + parser.add_argument("--quiet", action="store_true") + parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) + parser.add_argument("--start_checkpoint", type=str, default = None) + args = parser.parse_args(sys.argv[1:]) + args.save_iterations.append(args.iterations) + + print("Optimizing " + args.model_path) + + # Initialize system state (RNG) + safe_state(args.quiet) + + # Start GUI server, configure and run training + network_gui.init(args.ip, args.port) + torch.autograd.set_detect_anomaly(args.detect_anomaly) + training(lp.extract(args), op.extract(args), pp.extract(args), args.test_iterations, args.save_iterations, args.checkpoint_iterations, args.start_checkpoint) + + # All done + print("\nTraining complete.") \ No newline at end of file From 515588a6080bc0d3fed8b09f48af7f841f3dcf9f Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Tue, 29 Oct 2024 18:26:46 +0800 Subject: [PATCH 69/71] fix: Update scripts --- scripts/train_fast.sh | 5 +++++ scripts/train_progressive.sh | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 scripts/train_fast.sh create mode 100644 scripts/train_progressive.sh diff --git a/scripts/train_fast.sh b/scripts/train_fast.sh new file mode 100644 index 00000000..dd463507 --- /dev/null +++ b/scripts/train_fast.sh @@ -0,0 +1,5 @@ +data=$1 +postix=gaustudio_fast +gs-init -s $data -o ${data}_${postix} +rm -r ${data}_${postix}/result_2 +python train_fast.py -s ${data}_${postix} -r 1 -m ${data}_${postix}/result_2 --iteration 7000 \ No newline at end of file diff --git a/scripts/train_progressive.sh b/scripts/train_progressive.sh new file mode 100644 index 00000000..690fd029 --- /dev/null +++ b/scripts/train_progressive.sh @@ -0,0 +1,5 @@ +data=$1 +postix=gaustudio_progressive +gs-init -s $data -o ${data}_${postix} +rm -r ${data}_${postix}/result_2 +python train_progressive -s ${data}_${postix} -r 1 -m ${data}_${postix}/result_2 \ No newline at end of file From d4b3dcbb8ef2b893dd8f4601a0142e3f565924f4 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Tue, 5 Nov 2024 13:28:11 +0800 Subject: [PATCH 70/71] feat: Add fused-ssim for acceleration --- .gitmodules | 3 +++ submodules/fused-ssim | 1 + train_progressive.py | 10 ++++++---- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 160000 submodules/fused-ssim diff --git a/.gitmodules b/.gitmodules index da5edc04..058b5395 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "submodules/diff-surfel-rasterization"] path = submodules/diff-surfel-rasterization url = https://github.com/hugoycj/diff-surfel-rasterization-MCMC +[submodule "submodules/fused-ssim"] + path = submodules/fused-ssim + url = https://github.com/rahul-goel/fused-ssim.git diff --git a/submodules/fused-ssim b/submodules/fused-ssim new file mode 160000 index 00000000..d99e3d27 --- /dev/null +++ b/submodules/fused-ssim @@ -0,0 +1 @@ +Subproject commit d99e3d27513fa3563d98f74fcd40fd429e9e9b0e diff --git a/train_progressive.py b/train_progressive.py index 721d7b9f..c8093593 100644 --- a/train_progressive.py +++ b/train_progressive.py @@ -12,7 +12,8 @@ import os import torch from random import randint -from utils.loss_utils import l1_loss_appearance, ssim, l1_loss, edge_aware_curvature_loss +from fused_ssim import fused_ssim +from utils.loss_utils import l1_loss_appearance, l1_loss, edge_aware_curvature_loss from gaussian_renderer import render, network_gui import sys import torch.nn.functional as F @@ -177,7 +178,8 @@ def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoi gt_image = viewpoint_cam.original_image.cuda() Ll1 = l1_loss_appearance(image, gt_image, appearances, viewpoint_idx) # use L1 loss for the transformed image if using decoupled appearance - loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + ssim_value = fused_ssim(image.unsqueeze(0), gt_image.unsqueeze(0)) + loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim_value) # alpha loss if opt.lambda_mask > 0: @@ -437,8 +439,8 @@ def training_report(tb_writer, iteration, Ll1, loss, l1_loss, elapsed, testing_i parser.add_argument('--ip', type=str, default="127.0.0.1") parser.add_argument('--port', type=int, default=6009) parser.add_argument('--detect_anomaly', action='store_true', default=False) - parser.add_argument("--test_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) - parser.add_argument("--save_iterations", nargs="+", type=int, default=[7_000, 20_000, 30_000]) + parser.add_argument("--test_iterations", nargs="+", type=int, default=[1,7_000, 20_000, 30_000]) + parser.add_argument("--save_iterations", nargs="+", type=int, default=[1, 7_000, 20_000, 30_000]) parser.add_argument("--quiet", action="store_true") parser.add_argument("--checkpoint_iterations", nargs="+", type=int, default=[]) parser.add_argument("--start_checkpoint", type=str, default = None) From 323ad80a632b64922952af1a4b1fa6b5f4282261 Mon Sep 17 00:00:00 2001 From: hugoycj <576550489@qq.com> Date: Mon, 11 Nov 2024 09:16:54 +0800 Subject: [PATCH 71/71] fix: Update normal scripts to latest version and fix some bugs --- scene/cameras.py | 2 +- scripts/init_normal.py | 52 ++++------------------------- scripts/train_with_mask.sh | 4 +-- scripts/train_wmask_wnormal.sh | 2 +- scripts/train_wmask_wnormal_fast.sh | 4 +-- scripts/train_wnormal.sh | 9 +++++ 6 files changed, 22 insertions(+), 51 deletions(-) create mode 100644 scripts/train_wnormal.sh diff --git a/scene/cameras.py b/scene/cameras.py index c3318c7e..48ef2d81 100644 --- a/scene/cameras.py +++ b/scene/cameras.py @@ -55,7 +55,7 @@ def __init__(self, colmap_id, R, T, FoVx, FoVy, image, gt_alpha_mask, self.gt_alpha_mask = gt_alpha_mask.to(self.data_device) else: self.original_image *= torch.ones((1, self.image_height, self.image_width), device=self.data_device) - self.gt_alpha_mask = None + self.gt_alpha_mask = torch.ones((1, self.image_height, self.image_width), device=self.data_device) self.K = generate_K(fovX=self.FoVx, fovY=self.FoVy, width=self.image_width, height=self.image_height, principal_point_ndc=principal_point_ndc).to(self.data_device).to(torch.float32) diff --git a/scripts/init_normal.py b/scripts/init_normal.py index d569f893..46630143 100644 --- a/scripts/init_normal.py +++ b/scripts/init_normal.py @@ -12,62 +12,24 @@ @click.option('--source_path', '-s', required=True, help='Path to the dataset') def main(source_path: str) -> None: # Load StableNormal model - normal_predictor = torch.hub.load("Stable-X/StableNormal", "StableNormal_turbo", - trust_repo=True, yoso_version='yoso-normal-v1-0') - - # Load BiRefNet model - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - birefnet = AutoModelForImageSegmentation.from_pretrained('zhengpeng7/BiRefNet', trust_remote_code=True) - birefnet.to(device) - birefnet.eval() + normal_predictor = torch.hub.load("hugoycj/StableNormal", "StableNormal", + trust_repo=True, yoso_version='yoso-normal-v1-5', + local_cache_dir='/workspace/code/InverseRendering/StableNormal_git/weights') output_normal_dir = os.path.join(source_path, "normals") - output_mask_dir = os.path.join(source_path, "masks") os.makedirs(output_normal_dir, exist_ok=True) - os.makedirs(output_mask_dir, exist_ok=True) - def generate_mask(image): - image_size = (1024, 1024) - transform_image = transforms.Compose([ - transforms.Resize(image_size), - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - - input_images = transform_image(image).unsqueeze(0).to(device) - - with torch.no_grad(): - preds = birefnet(input_images)[-1].sigmoid().cpu() - pred = preds[0].squeeze() - mask = transforms.ToPILImage()(pred) - mask = mask.resize(image.size) - return mask - - image_pattern = f"{source_path}/images/*.jpeg" - for image_path in tqdm(glob.glob(image_pattern, recursive=True)): + for image_path in tqdm(glob.glob(f"{source_path}/images/*.jpg", recursive=True)[::5] + \ + glob.glob(f"{source_path}/images/*.jpeg", recursive=True)[::5] + \ + glob.glob(f"{source_path}/images/*.png", recursive=True)[::5]): image_name = os.path.basename(image_path.split("/")[-1]).split(".")[0] input_image = Image.open(image_path) output_normal_path = os.path.join(output_normal_dir, image_name+'.png') - output_mask_path = os.path.join(output_mask_dir, image_name+'.png') - - # Load or generate mask - if os.path.exists(output_mask_path): - mask = Image.open(output_mask_path) - else: - mask = generate_mask(input_image) - mask.save(output_mask_path) - - # Apply mask to input image - input_array = np.array(input_image) - mask_array = np.array(mask) - # masked_input = np.where(mask_array[:,:, np.newaxis] > 128, input_array, 0) - masked_input = np.where(mask_array[:,:] > 128, input_array, 0) - masked_input_image = Image.fromarray(masked_input) # Generate normal map if it doesn't exist if not os.path.exists(output_normal_path): - normal_image = normal_predictor(masked_input_image) + normal_image = normal_predictor(input_image, data_type='outdoor') normal_image.save(output_normal_path) if __name__ == "__main__": diff --git a/scripts/train_with_mask.sh b/scripts/train_with_mask.sh index 9be9fe87..1d1bee05 100644 --- a/scripts/train_with_mask.sh +++ b/scripts/train_with_mask.sh @@ -1,8 +1,8 @@ data=$1 postix=gaustudio_wmask -gs-init -s $data -o ${data}_${postix} --w_mask mask --overwrite +# gs-init -s $data -o ${data}_${postix} --w_mask mask --overwrite rm -r ${data}_${postix}/result_2 -python train_progressive.py -s ${data}_${postix} -r 1 --lambda_dist 1000 \ +python train_progressive.py -s ${data}_${postix} -r 2 --lambda_dist 1000 \ --w_mask masks --lambda_mask 0.1 --max_screen_size 5 \ -m ${data}_${postix}/result_2 --iteration 20000 gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ diff --git a/scripts/train_wmask_wnormal.sh b/scripts/train_wmask_wnormal.sh index 12179289..48054cd1 100644 --- a/scripts/train_wmask_wnormal.sh +++ b/scripts/train_wmask_wnormal.sh @@ -5,6 +5,6 @@ python scripts/init_normal.py -s ${data}_${postix} rm -r ${data}_${postix}/result_2 python train_progressive.py -s ${data}_${postix} -r 1 --lambda_dist 1000 \ --w_mask masks --lambda_mask 0.1 --w_normal_prior normals \ - --max_screen_size 5 -m ${data}_${postix}/result_2 --iteration 7000 + --max_screen_size 20 -m ${data}_${postix}/result_2 --iteration 7000 gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ --meshing sap --config 2dgs diff --git a/scripts/train_wmask_wnormal_fast.sh b/scripts/train_wmask_wnormal_fast.sh index 5ea693d3..b28ce8dc 100644 --- a/scripts/train_wmask_wnormal_fast.sh +++ b/scripts/train_wmask_wnormal_fast.sh @@ -1,11 +1,11 @@ data=$1 postix=gaustudio_wmask_wnormal_fast -gs-init -s $data -o ${data}_${postix} --w_mask mask +# gs-init -s $data -o ${data}_${postix} --w_mask mask python scripts/init_normal.py -s ${data}_${postix} rm -r ${data}_${postix}/result_2 python train_fast.py -s ${data}_${postix} -r 1 --lambda_dist 1000 --lambda_dssim 1 \ --w_mask masks --lambda_mask 0.1 --w_normal_prior normals \ - --max_screen_size 5 -m ${data}_${postix}/result_2 --iteration 7000 + --max_screen_size 20 -m ${data}_${postix}/result_2 --iteration 7000 gs-extract-pcd -m ${data}_${postix}/result_2 -o ${data}_${postix}/result_2/fusion_2 \ --meshing sap --config 2dgs \ No newline at end of file diff --git a/scripts/train_wnormal.sh b/scripts/train_wnormal.sh new file mode 100644 index 00000000..84f492bf --- /dev/null +++ b/scripts/train_wnormal.sh @@ -0,0 +1,9 @@ +data=$1 +postix=gaustudio_wnormal +# gs-init -s $data -o ${data}_${postix} --pcd combined +# python scripts/init_normal.py -s ${data}_${postix} +rm -r ${data}_${postix}/result_2 +python train.py -s ${data}_${postix} -r 1 --contribution_prune_ratio 0.5 \ + --lambda_normal_prior 1 --lambda_dist 10 \ + --densify_until_iter 3000 --iteration 7000 \ + -m ${data}_${postix}/result_2 --w_normal_prior normals