From 7a36caa3d41335b5a5b514c05ba61b4e1cd72511 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:25:31 +0800 Subject: [PATCH 01/21] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d3eac25 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# NST + From 3ff98ee9d30be0e20319e517865383502393cbe6 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:30:15 +0800 Subject: [PATCH 02/21] Update README.md --- README.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3eac25..630ede6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,73 @@ -# NST +# 🎨 AI 画风迁移器 (StyleTransferAI) +一个新颖、轻量级的Python项目,旨在通过神经风格迁移算法,实现快速有趣的艺术风格转换效果。 + +## 🚀 快速开始 + +1. **克隆项目** + ```bash + git clone https://github.com/yourname/style_transfer_ai.git + cd style_transfer_ai + ``` + +2. **创建虚拟环境并安装依赖** + ```bash + python -m venv venv + source venv/bin/activate # Linux/Mac + # venv\Scripts\activate # Windows + pip install -r requirements.txt + ``` + +3. **准备图像** + 在 `data/raw/` 目录下放置你的内容图 (`content.jpg`) 和风格图 (`style.jpg`)。 + +4. **运行程序** + ```bash + python scripts/run_style_transfer.py + ``` + +5. **查看结果** + 结果将保存在 `data/processed/result_时间戳.jpg`。 + +## 💡 项目特点 + +- **高质量风格迁移**: 基于VGG16深度学习模型,生成高质量艺术效果。 +- **速度快**: CPU优化,无需GPU即可快速运行。 +- **可视化监控**: 实时显示训练损失,生成详细损失曲线图。 +- **高度可定制**: 修改 `configs/default.yaml` 或核心代码即可调整风格迁移效果。 +- **多模式训练**: 提供快速、扩展、高级三种训练模式。 + +## 📂 项目结构 + +``` +style_transfer_ai/ +│ +├── configs/ # 配置文件目录 +│ └── default.yaml # 默认超参数配置(学习率、迭代次数、权重等) +│ +├── data/ # 数据目录 +│ ├── raw/ # 原始输入图像 +│ │ ├── content.jpg # 内容图像(用户自定义) +│ │ └── style.jpg # 风格图像(用户自定义) +│ └── processed/ # 输出结果目录(自动生成) +│ └── result_20251202_2227.jpg # 示例输出(带时间戳) +│ +├── models/ # 模型相关代码 +│ └── vgg16_extractor.py # VGG16特征提取器封装 +│ +├── scripts/ # 可执行脚本 +│ └── run_style_transfer.py # 主程序入口 +│ +├── src/ # 核心源代码 +│ ├── style_transfer.py # 风格迁移核心算法实现 +│ ├── loss.py # 内容损失、风格损失计算 +│ ├── utils.py # 图像预处理、后处理、可视化工具 +│ └── trainer.py # 训练循环与优化器管理 +│ +├── outputs/ # 日志与可视化输出 +│ └── loss_curve_*.png # 损失变化曲线图(按运行时间命名) +│ +├── requirements.txt # Python依赖列表 +├── README.md # 项目说明文档(即本文件) +└── .gitignore # Git忽略规则 +``` \ No newline at end of file From 3badce0659051058a22953fa4d40ddd012c9c912 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:31:18 +0800 Subject: [PATCH 03/21] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 630ede6..9061de9 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,7 @@ ## 🚀 快速开始 -1. **克隆项目** - ```bash - git clone https://github.com/yourname/style_transfer_ai.git - cd style_transfer_ai - ``` +1.**项目介绍** 2. **创建虚拟环境并安装依赖** ```bash From 00f0e079b62a74ac5437ce5476dd7ce87f755f7c Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:36:08 +0800 Subject: [PATCH 04/21] ADD file via upload --- main | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 main diff --git a/main b/main new file mode 100644 index 0000000..50558e5 --- /dev/null +++ b/main @@ -0,0 +1,171 @@ +""" +图像合成器模块 - 基础版本和传统方法。 +""" + +import numpy as np +from typing import Tuple, Dict, Any +from scipy.optimize import minimize +import warnings +from abc import ABC, abstractmethod + +warnings.filterwarnings("ignore", category=UserWarning) + + +class BaseImageSynthesizer(ABC): + """图像合成器基类""" + + @abstractmethod + def set_content(self, image: np.ndarray): + """设置内容图像""" + pass + + @abstractmethod + def set_style_features(self, features: Dict[str, Any]): + """设置风格特征""" + pass + + @abstractmethod + def synthesize(self, initial_image: np.ndarray = None, **kwargs) -> np.ndarray: + """合成图像""" + pass + + +class ImageSynthesizer(BaseImageSynthesizer): + """ + 传统图像合成器,负责生成最终的风格化图像。 + """ + + def __init__(self, config: Dict[str, Any]): + """ + 初始化合成器。 + + Args: + config: 配置字典。 + """ + self.config = config + self.content_image: np.ndarray = None + self.style_features: Dict[str, Any] = {} + self.synthesized_image: np.ndarray = None + + def set_content(self, image: np.ndarray): + """ + 设置内容图像。 + + Args: + image: 内容图像,形状为 (H, W, C)。 + """ + self.content_image = image.astype(np.float32) / 255.0 + + def set_style_features(self, features: Dict[str, Any]): + """ + 设置风格特征。 + + Args: + features: 由 StyleFeatureExtractor 提取的特征字典。 + """ + self.style_features = features + + def synthesize(self, initial_image: np.ndarray = None, max_iter: int = 200) -> np.ndarray: + """ + 合成风格化图像。 + + Args: + initial_image: 初始图像,如果为None,则使用内容图像。 + max_iter: 最大迭代次数。 + + Returns: + 合成后的风格化图像,形状为 (H, W, C),值域 [0, 255]。 + """ + if initial_image is None: + initial_image = self.content_image.copy() + + # 将图像展平为一维向量以便于优化 + h, w, c = self.content_image.shape + x0 = initial_image.ravel() + + # 定义损失函数 + def loss_function(x): + # 重塑回图像形状 + img = x.reshape((h, w, c)) + + # 1. 内容损失:保持与原图相似 + content_loss = np.mean((img - self.content_image) ** 2) + + # 2. 风格损失:匹配风格特征 + style_loss = self._calculate_style_loss(img) + + # 总损失 + total_loss = content_loss + self.config.get('style_weight', 1.0) * style_loss + + return total_loss + + # 执行优化 + result = minimize(loss_function, x0, method='L-BFGS-B', + options={'maxiter': max_iter, 'disp': False}) + + # 重塑结果并转换回[0, 255] + synthesized = result.x.reshape((h, w, c)) + synthesized = np.clip(synthesized, 0, 1) * 255 + self.synthesized_image = synthesized.astype(np.uint8) + + return self.synthesized_image + + def _calculate_style_loss(self, image: np.ndarray) -> float: + """ + 计算当前图像与目标风格特征之间的损失。 + + Args: + image: 当前合成的图像。 + + Returns: + 风格损失值。 + """ + loss = 0.0 + + # 1. 颜色直方图损失 + hist_r, _ = np.histogram(image[:, :, 0].ravel(), bins=32, range=(0, 1)) + hist_g, _ = np.histogram(image[:, :, 1].ravel(), bins=32, range=(0, 1)) + hist_b, _ = np.histogram(image[:, :, 2].ravel(), bins=32, range=(0, 1)) + current_hist = np.concatenate([hist_r, hist_g, hist_b]) + target_hist = self.style_features['color_histogram'] + # 使用KL散度作为距离度量 + epsilon = 1e-10 + kl_div = np.sum(target_hist * np.log((target_hist + epsilon) / (current_hist + epsilon))) + loss += kl_div + + # 2. 纹理强度损失 + diff_h = np.abs(np.diff(image, axis=1)).mean() + diff_v = np.abs(np.diff(image, axis=0)).mean() + current_texture = np.array([diff_h, diff_v]) + target_texture = self.style_features['texture_strength'] + texture_loss = np.mean((current_texture - target_texture) ** 2) + loss += texture_loss + + # 3. 平均颜色损失 + current_mean = image.mean(axis=(0, 1)) + target_mean = self.style_features['mean_color'] + mean_loss = np.mean((current_mean - target_mean) ** 2) + loss += mean_loss + + return loss + + +# 工厂函数 +def create_image_synthesizer(synthesizer_type: str, config: Dict[str, Any]) -> BaseImageSynthesizer: + """ + 创建图像合成器工厂函数。 + + Args: + synthesizer_type: 合成器类型 ('traditional' 或 'neural') + config: 配置字典 + + Returns: + 图像合成器实例 + """ + if synthesizer_type == 'traditional': + return ImageSynthesizer(config) + elif synthesizer_type == 'neural': + from .neural_image_synthesizer import NeuralImageSynthesizer + return NeuralImageSynthesizer(config) + else: + raise ValueError(f"不支持的合成器类型: {synthesizer_type}") \ No newline at end of file From c69d17d7733b5913e600a5dac1ee628f6f1a0711 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:37:54 +0800 Subject: [PATCH 05/21] ADD file via upload --- run_style_transfer.py | 263 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 run_style_transfer.py diff --git a/run_style_transfer.py b/run_style_transfer.py new file mode 100644 index 0000000..80f5be2 --- /dev/null +++ b/run_style_transfer.py @@ -0,0 +1,263 @@ +# scripts/extended_training.py +import warnings + +warnings.filterwarnings("ignore", category=UserWarning, module="torchvision") + +import torch +import torch.nn as nn +import torch.optim as optim +from torchvision import models, transforms +from PIL import Image +from pathlib import Path +import yaml +import time +import numpy as np + + +print("=" * 60) + + +def main(): + # 加载配置 + config_path = Path(__file__).parent.parent / "configs" / "default.yaml" + with open(config_path, 'r', encoding='utf-8') as f: + config = yaml.safe_load(f) + + # ========== 关键修复:大幅提高风格影响 ========== + config['model']['image_size'] = 256 + config['model']['content_weight'] = 1e3 # 降低内容权重 + config['model']['style_weight'] = 1e7 # 大幅提高风格权重 + config['model']['learning_rate'] = 0.003 + config['training']['num_steps'] = 400 + config['multi_scale']['enabled'] = False + + print("📋 长时间训练参数:") + print(f" - 图像尺寸: 256x256") + print(f" - 内容权重: 1e3 (风格权重的1/10000)") + print(f" - 风格权重: 1e7 (内容权重的10000倍)") + print(f" - 权重比例: 1:10000 (强调风格)") + print(f" - 学习率: 0.003") + print(f" - 训练步数: 400 (约5分钟)") + + # 设备设置 + device = torch.device("cpu") + torch.set_num_threads(2) + + # 加载图像 + project_root = Path(__file__).parent.parent + content_path = project_root / config['paths']['content_image'] + style_path = project_root / config['paths']['style_image'] + output_dir = project_root / config['paths']['output_dir'] + + print(f"\n📷 加载图像...") + content_img = Image.open(content_path).convert('RGB') + style_img = Image.open(style_path).convert('RGB') + + image_size = 256 + content_img = content_img.resize((image_size, image_size), Image.Resampling.LANCZOS) + style_img = style_img.resize((image_size, image_size), Image.Resampling.LANCZOS) + + print(f" 调整到: {image_size}x{image_size}") + + # 预处理(移除标准化) + preprocess = transforms.Compose([ + transforms.ToTensor(), + # transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 注释掉 + ]) + + content_tensor = preprocess(content_img).unsqueeze(0).to(device) + style_tensor = preprocess(style_img).unsqueeze(0).to(device) + target_tensor = content_tensor.clone().requires_grad_(True) + + # 加载VGG16模型 + print("\n🔧 加载VGG16模型...") + start_time = time.time() + vgg = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1).features.to(device).eval() + + for param in vgg.parameters(): + param.requires_grad_(False) + + print(f"✅ 模型加载完成 ({time.time() - start_time:.2f}秒)") + + # 定义层索引 + content_layers = ["21"] # conv4_2 + style_layers = ["0", "5", "10", "19", "28"] # conv1_1, conv2_1, conv3_1, conv4_1, conv5_1 + + # 特征提取函数 + def get_features_fixed(x, layers): + features = {} + x_tmp = x + layers_int = set([int(l) for l in layers]) + + for idx, (name, layer) in enumerate(vgg._modules.items()): + x_tmp = layer(x_tmp) + if idx in layers_int: + features[str(idx)] = x_tmp + + return features + + # 提取特征 + print("\n📊 提取特征...") + start_time = time.time() + + # 标准化输入以匹配VGG的预训练权重 + def normalize_for_vgg(tensor): + mean = torch.tensor([0.485, 0.456, 0.406]).view(1, 3, 1, 1).to(device) + std = torch.tensor([0.229, 0.224, 0.225]).view(1, 3, 1, 1).to(device) + return (tensor - mean) / std + + content_features = get_features_fixed(normalize_for_vgg(content_tensor), content_layers) + style_features = get_features_fixed(normalize_for_vgg(style_tensor), style_layers) + + # 修改Gram矩阵计算(关键修复) + def gram_matrix_fixed(tensor): + b, c, h, w = tensor.size() + + # 展平特征 + tensor_flat = tensor.view(b, c, -1) # [b, c, h*w] + + # 计算Gram矩阵 + gram = torch.bmm(tensor_flat, tensor_flat.transpose(1, 2)) # [b, c, c] + + # 关键修改:只除以h*w,而不是c*h*w(原始论文做法) + gram = gram / (h * w) + + return gram + + # 预计算风格Gram矩阵 + style_grams = {} + for layer, feat in style_features.items(): + style_grams[layer] = gram_matrix_fixed(feat) + print(f" 层 {layer} Gram矩阵形状: {style_grams[layer].shape}") + + print(f"✅ 特征提取完成 ({time.time() - start_time:.2f}秒)") + + # 优化器设置 + learning_rate = 0.003 # 使用更高的学习率 + optimizer = optim.Adam([target_tensor], lr=learning_rate) + scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.5) + + # 训练参数 + content_weight = 1e3 + style_weight = 1e7 # 大幅提高 + num_steps = 400 + log_interval = 40 + + print(f"\n🎨 开始长时间训练 (约5分钟)...") + print(f" 优化器: Adam (初始lr={learning_rate})") + print(f" 内容权重: {content_weight}") + print(f" 风格权重: {style_weight} (非常高,强调风格转移)") + print(f" 权重比例: 1:{int(style_weight / content_weight)}") + + start_time = time.time() + + # 记录损失历史 + loss_history = [] + content_loss_history = [] + style_loss_history = [] + + for step in range(1, num_steps + 1): + optimizer.zero_grad() + + # 提取目标特征(需要标准化) + target_normalized = normalize_for_vgg(target_tensor) + target_features = get_features_fixed(target_normalized, content_layers + style_layers) + + # 计算内容损失 + content_loss = torch.tensor(0.0, device=device) + for layer in content_layers: + if layer in target_features and layer in content_features: + diff = target_features[layer] - content_features[layer] + content_loss += torch.mean(diff ** 2) + + # 计算风格损失 + style_loss = torch.tensor(0.0, device=device) + for layer in style_layers: + if layer in target_features and layer in style_grams: + target_gram = gram_matrix_fixed(target_features[layer]) + style_gram = style_grams[layer] + diff = target_gram - style_gram + style_loss += torch.mean(diff ** 2) + + # 总损失 + total_loss = content_weight * content_loss + style_weight * style_loss + + # 反向传播 + total_loss.backward() + + # 梯度裁剪(提高限制) + torch.nn.utils.clip_grad_norm_([target_tensor], max_norm=10.0) + + optimizer.step() + + # 更新学习率 + if step % 100 == 0: + scheduler.step() + current_lr = optimizer.param_groups[0]['lr'] + print(f"📉 第 {step} 步: 学习率降低到 {current_lr:.6f}") + + # 限制像素值 + with torch.no_grad(): + target_tensor.data.clamp_(0, 1) + + # 记录损失 + loss_history.append(total_loss.item()) + content_loss_history.append(content_loss.item()) + style_loss_history.append(style_loss.item()) + + # 定期输出 + if step % log_interval == 0 or step == num_steps: + elapsed = time.time() - start_time + steps_per_second = step / elapsed if elapsed > 0 else 0 + remaining_steps = num_steps - step + estimated_remaining = remaining_steps / steps_per_second if steps_per_second > 0 else 0 + + # 计算风格损失贡献 + style_contribution = style_weight * style_loss.item() + content_contribution = content_weight * content_loss.item() + style_ratio = style_contribution / (style_contribution + content_contribution) * 100 + + print(f"⏳ 第 {step:3d}/{num_steps} | " + f"总损失: {total_loss.item():8.2f} | " + f"内容: {content_loss.item():6.4f} | " + f"风格: {style_loss.item():6.4f} | " + f"风格贡献: {style_ratio:.1f}% | " + f"用时: {elapsed:.1f}s | " + f"剩余: {estimated_remaining:.1f}s") + + total_time = time.time() - start_time + + # 分析损失变化 + print(f"\n📈 损失分析:") + print(f" 总损失变化: {loss_history[0]:.2f} → {loss_history[-1]:.2f}") + print(f" 内容损失变化: {content_loss_history[0]:.4f} → {content_loss_history[-1]:.4f}") + print(f" 风格损失变化: {style_loss_history[0]:.4f} → {style_loss_history[-1]:.4f}") + + # 保存结果 + postprocess = transforms.Compose([ + # transforms.Normalize(mean=[-0.485/0.229, -0.456/0.224, -0.406/0.225], + # std=[1/0.229, 1/0.224, 1/0.225]), # 如果之前没标准化,这里也不需要 + transforms.ToPILImage() + ]) + + output_dir.mkdir(parents=True, exist_ok=True) + with torch.no_grad(): + result_img = postprocess(target_tensor.squeeze(0).cpu()) + + timestamp = time.strftime("%H%M%S") + output_path = output_dir / f"extended_result_{timestamp}.jpg" + result_img.save(output_path, quality=95, optimize=True) + + print(f"\n🎉 训练完成!") + print(f" 总用时: {total_time:.1f}秒") + print(f" 结果保存至: {output_path}") + + # 尝试显示结果 + try: + result_img.show(title="风格迁移结果") + except: + print(" ℹ️ 请手动打开图像查看") + + +if __name__ == "__main__": + main() \ No newline at end of file From 258c7111fd3ddb1125bb90dc1af7d5780f730a8a Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:38:20 +0800 Subject: [PATCH 06/21] ADD file via upload --- requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fd393b8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +numpy>=1.24.0 +Pillow>=9.0.0 +scipy>=1.10.0 +PyYAML>=6.0.0 \ No newline at end of file From 25241cf44dc93bdef2e386c45da10a003d701f86 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:38:42 +0800 Subject: [PATCH 07/21] ADD file via upload --- default.yaml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 default.yaml diff --git a/default.yaml b/default.yaml new file mode 100644 index 0000000..8c24c2e --- /dev/null +++ b/default.yaml @@ -0,0 +1,36 @@ +# configs/stable_config.yaml +# 稳定训练配置 + +# 模型配置 +model: + model_type: "vgg16" + image_size: 192 + content_layers: ["19"] # conv4_2 + style_layers: ["0", "5", "10", "17", "24"] # 全部5个层 + content_weight: 1e4 # 增加内容权重 + style_weight: 5e4 # 降低风格权重 + learning_rate: 0.005 # 低学习率稳定训练 + +# 路径配置 +paths: + content_image: "data/raw/content.jpg" + style_image: "data/raw/tem.jpg" + output_dir: "data/processed" + +# 训练配置 +training: + num_steps: 150 # 减少步数 + log_interval: 15 + tv_weight: 1e-5 + +# 多尺度配置(先禁用,稳定后再启用) +multi_scale: + enabled: false + scales: [192] + scale_weights: [1.0] + +# 性能配置 +performance: + use_gpu: false + batch_size: 1 + precision: "float32" \ No newline at end of file From 3837c10388b03241961b860296493bd7e416a967 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:39:41 +0800 Subject: [PATCH 08/21] ADD file via upload --- feature_extractor.py | 103 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 feature_extractor.py diff --git a/feature_extractor.py b/feature_extractor.py new file mode 100644 index 0000000..32d85b6 --- /dev/null +++ b/feature_extractor.py @@ -0,0 +1,103 @@ +""" +风格特征提取器模块 - 基础版本和传统方法。 +""" + +import numpy as np +from typing import Tuple, Dict, Any +from abc import ABC, abstractmethod + + +class BaseFeatureExtractor(ABC): + """特征提取器基类""" + + @abstractmethod + def extract(self, image: np.ndarray) -> Dict[str, Any]: + """提取特征抽象方法""" + pass + + @abstractmethod + def get_features(self) -> Dict[str, Any]: + """获取特征抽象方法""" + pass + + +class StyleFeatureExtractor(BaseFeatureExtractor): + """ + 传统风格特征提取器。 + 通过计算图像的直方图和局部纹理特征来定义"风格"。 + """ + + def __init__(self, config: Dict[str, Any]): + """ + 初始化提取器。 + + Args: + config: 配置字典,包含特征提取参数。 + """ + self.config = config + self.style_features: Dict[str, Any] = {} + + def extract(self, image: np.ndarray) -> Dict[str, Any]: + """ + 从图像中提取风格特征。 + + Args: + image: 输入图像,形状为 (H, W, C),值域 [0, 255]。 + + Returns: + 一个包含各种风格特征的字典。 + """ + # 确保图像在[0, 1]范围 + image_normalized = image.astype(np.float32) / 255.0 + + features = {} + + # 1. 颜色直方图 (RGB通道) + hist_r, _ = np.histogram(image_normalized[:, :, 0].ravel(), bins=32, range=(0, 1)) + hist_g, _ = np.histogram(image_normalized[:, :, 1].ravel(), bins=32, range=(0, 1)) + hist_b, _ = np.histogram(image_normalized[:, :, 2].ravel(), bins=32, range=(0, 1)) + features['color_histogram'] = np.concatenate([hist_r, hist_g, hist_b]) + + # 2. 局部纹理特征 + diff_h = np.abs(np.diff(image_normalized, axis=1)).mean() + diff_v = np.abs(np.diff(image_normalized, axis=0)).mean() + features['texture_strength'] = np.array([diff_h, diff_v]) + + # 3. 平均颜色 + features['mean_color'] = image_normalized.mean(axis=(0, 1)) + + # 4. 颜色标准差 + features['color_std'] = image_normalized.std(axis=(0, 1)) + + self.style_features = features + return features + + def get_features(self) -> Dict[str, Any]: + """ + 获取最近一次提取的风格特征。 + + Returns: + 风格特征字典。 + """ + return self.style_features.copy() + + +# 工厂函数,便于创建不同类型的提取器 +def create_feature_extractor(extractor_type: str, config: Dict[str, Any]) -> BaseFeatureExtractor: + """ + 创建特征提取器工厂函数。 + + Args: + extractor_type: 提取器类型 ('traditional' 或 'neural') + config: 配置字典 + + Returns: + 特征提取器实例 + """ + if extractor_type == 'traditional': + return StyleFeatureExtractor(config) + elif extractor_type == 'neural': + from .neural_feature_extractor import NeuralStyleFeatureExtractor + return NeuralStyleFeatureExtractor(config) + else: + raise ValueError(f"不支持的提取器类型: {extractor_type}") \ No newline at end of file From 57208129b4500853b93714dd56d177000e80d5e5 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:45:01 +0800 Subject: [PATCH 09/21] Delete 'main' --- main | 171 ----------------------------------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 main diff --git a/main b/main deleted file mode 100644 index 50558e5..0000000 --- a/main +++ /dev/null @@ -1,171 +0,0 @@ -""" -图像合成器模块 - 基础版本和传统方法。 -""" - -import numpy as np -from typing import Tuple, Dict, Any -from scipy.optimize import minimize -import warnings -from abc import ABC, abstractmethod - -warnings.filterwarnings("ignore", category=UserWarning) - - -class BaseImageSynthesizer(ABC): - """图像合成器基类""" - - @abstractmethod - def set_content(self, image: np.ndarray): - """设置内容图像""" - pass - - @abstractmethod - def set_style_features(self, features: Dict[str, Any]): - """设置风格特征""" - pass - - @abstractmethod - def synthesize(self, initial_image: np.ndarray = None, **kwargs) -> np.ndarray: - """合成图像""" - pass - - -class ImageSynthesizer(BaseImageSynthesizer): - """ - 传统图像合成器,负责生成最终的风格化图像。 - """ - - def __init__(self, config: Dict[str, Any]): - """ - 初始化合成器。 - - Args: - config: 配置字典。 - """ - self.config = config - self.content_image: np.ndarray = None - self.style_features: Dict[str, Any] = {} - self.synthesized_image: np.ndarray = None - - def set_content(self, image: np.ndarray): - """ - 设置内容图像。 - - Args: - image: 内容图像,形状为 (H, W, C)。 - """ - self.content_image = image.astype(np.float32) / 255.0 - - def set_style_features(self, features: Dict[str, Any]): - """ - 设置风格特征。 - - Args: - features: 由 StyleFeatureExtractor 提取的特征字典。 - """ - self.style_features = features - - def synthesize(self, initial_image: np.ndarray = None, max_iter: int = 200) -> np.ndarray: - """ - 合成风格化图像。 - - Args: - initial_image: 初始图像,如果为None,则使用内容图像。 - max_iter: 最大迭代次数。 - - Returns: - 合成后的风格化图像,形状为 (H, W, C),值域 [0, 255]。 - """ - if initial_image is None: - initial_image = self.content_image.copy() - - # 将图像展平为一维向量以便于优化 - h, w, c = self.content_image.shape - x0 = initial_image.ravel() - - # 定义损失函数 - def loss_function(x): - # 重塑回图像形状 - img = x.reshape((h, w, c)) - - # 1. 内容损失:保持与原图相似 - content_loss = np.mean((img - self.content_image) ** 2) - - # 2. 风格损失:匹配风格特征 - style_loss = self._calculate_style_loss(img) - - # 总损失 - total_loss = content_loss + self.config.get('style_weight', 1.0) * style_loss - - return total_loss - - # 执行优化 - result = minimize(loss_function, x0, method='L-BFGS-B', - options={'maxiter': max_iter, 'disp': False}) - - # 重塑结果并转换回[0, 255] - synthesized = result.x.reshape((h, w, c)) - synthesized = np.clip(synthesized, 0, 1) * 255 - self.synthesized_image = synthesized.astype(np.uint8) - - return self.synthesized_image - - def _calculate_style_loss(self, image: np.ndarray) -> float: - """ - 计算当前图像与目标风格特征之间的损失。 - - Args: - image: 当前合成的图像。 - - Returns: - 风格损失值。 - """ - loss = 0.0 - - # 1. 颜色直方图损失 - hist_r, _ = np.histogram(image[:, :, 0].ravel(), bins=32, range=(0, 1)) - hist_g, _ = np.histogram(image[:, :, 1].ravel(), bins=32, range=(0, 1)) - hist_b, _ = np.histogram(image[:, :, 2].ravel(), bins=32, range=(0, 1)) - current_hist = np.concatenate([hist_r, hist_g, hist_b]) - target_hist = self.style_features['color_histogram'] - # 使用KL散度作为距离度量 - epsilon = 1e-10 - kl_div = np.sum(target_hist * np.log((target_hist + epsilon) / (current_hist + epsilon))) - loss += kl_div - - # 2. 纹理强度损失 - diff_h = np.abs(np.diff(image, axis=1)).mean() - diff_v = np.abs(np.diff(image, axis=0)).mean() - current_texture = np.array([diff_h, diff_v]) - target_texture = self.style_features['texture_strength'] - texture_loss = np.mean((current_texture - target_texture) ** 2) - loss += texture_loss - - # 3. 平均颜色损失 - current_mean = image.mean(axis=(0, 1)) - target_mean = self.style_features['mean_color'] - mean_loss = np.mean((current_mean - target_mean) ** 2) - loss += mean_loss - - return loss - - -# 工厂函数 -def create_image_synthesizer(synthesizer_type: str, config: Dict[str, Any]) -> BaseImageSynthesizer: - """ - 创建图像合成器工厂函数。 - - Args: - synthesizer_type: 合成器类型 ('traditional' 或 'neural') - config: 配置字典 - - Returns: - 图像合成器实例 - """ - if synthesizer_type == 'traditional': - return ImageSynthesizer(config) - elif synthesizer_type == 'neural': - from .neural_image_synthesizer import NeuralImageSynthesizer - return NeuralImageSynthesizer(config) - else: - raise ValueError(f"不支持的合成器类型: {synthesizer_type}") \ No newline at end of file From af1c5cd019fa3d7a26c61c1fbbf3891aae5dfec8 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:59:22 +0800 Subject: [PATCH 10/21] Delete 'feature_extractor.py' --- feature_extractor.py | 103 ------------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 feature_extractor.py diff --git a/feature_extractor.py b/feature_extractor.py deleted file mode 100644 index 32d85b6..0000000 --- a/feature_extractor.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -风格特征提取器模块 - 基础版本和传统方法。 -""" - -import numpy as np -from typing import Tuple, Dict, Any -from abc import ABC, abstractmethod - - -class BaseFeatureExtractor(ABC): - """特征提取器基类""" - - @abstractmethod - def extract(self, image: np.ndarray) -> Dict[str, Any]: - """提取特征抽象方法""" - pass - - @abstractmethod - def get_features(self) -> Dict[str, Any]: - """获取特征抽象方法""" - pass - - -class StyleFeatureExtractor(BaseFeatureExtractor): - """ - 传统风格特征提取器。 - 通过计算图像的直方图和局部纹理特征来定义"风格"。 - """ - - def __init__(self, config: Dict[str, Any]): - """ - 初始化提取器。 - - Args: - config: 配置字典,包含特征提取参数。 - """ - self.config = config - self.style_features: Dict[str, Any] = {} - - def extract(self, image: np.ndarray) -> Dict[str, Any]: - """ - 从图像中提取风格特征。 - - Args: - image: 输入图像,形状为 (H, W, C),值域 [0, 255]。 - - Returns: - 一个包含各种风格特征的字典。 - """ - # 确保图像在[0, 1]范围 - image_normalized = image.astype(np.float32) / 255.0 - - features = {} - - # 1. 颜色直方图 (RGB通道) - hist_r, _ = np.histogram(image_normalized[:, :, 0].ravel(), bins=32, range=(0, 1)) - hist_g, _ = np.histogram(image_normalized[:, :, 1].ravel(), bins=32, range=(0, 1)) - hist_b, _ = np.histogram(image_normalized[:, :, 2].ravel(), bins=32, range=(0, 1)) - features['color_histogram'] = np.concatenate([hist_r, hist_g, hist_b]) - - # 2. 局部纹理特征 - diff_h = np.abs(np.diff(image_normalized, axis=1)).mean() - diff_v = np.abs(np.diff(image_normalized, axis=0)).mean() - features['texture_strength'] = np.array([diff_h, diff_v]) - - # 3. 平均颜色 - features['mean_color'] = image_normalized.mean(axis=(0, 1)) - - # 4. 颜色标准差 - features['color_std'] = image_normalized.std(axis=(0, 1)) - - self.style_features = features - return features - - def get_features(self) -> Dict[str, Any]: - """ - 获取最近一次提取的风格特征。 - - Returns: - 风格特征字典。 - """ - return self.style_features.copy() - - -# 工厂函数,便于创建不同类型的提取器 -def create_feature_extractor(extractor_type: str, config: Dict[str, Any]) -> BaseFeatureExtractor: - """ - 创建特征提取器工厂函数。 - - Args: - extractor_type: 提取器类型 ('traditional' 或 'neural') - config: 配置字典 - - Returns: - 特征提取器实例 - """ - if extractor_type == 'traditional': - return StyleFeatureExtractor(config) - elif extractor_type == 'neural': - from .neural_feature_extractor import NeuralStyleFeatureExtractor - return NeuralStyleFeatureExtractor(config) - else: - raise ValueError(f"不支持的提取器类型: {extractor_type}") \ No newline at end of file From ec2ca99c9b76c9183207045851e2b0e37da18eaa Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 16:59:29 +0800 Subject: [PATCH 11/21] Delete 'default.yaml' --- default.yaml | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 default.yaml diff --git a/default.yaml b/default.yaml deleted file mode 100644 index 8c24c2e..0000000 --- a/default.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# configs/stable_config.yaml -# 稳定训练配置 - -# 模型配置 -model: - model_type: "vgg16" - image_size: 192 - content_layers: ["19"] # conv4_2 - style_layers: ["0", "5", "10", "17", "24"] # 全部5个层 - content_weight: 1e4 # 增加内容权重 - style_weight: 5e4 # 降低风格权重 - learning_rate: 0.005 # 低学习率稳定训练 - -# 路径配置 -paths: - content_image: "data/raw/content.jpg" - style_image: "data/raw/tem.jpg" - output_dir: "data/processed" - -# 训练配置 -training: - num_steps: 150 # 减少步数 - log_interval: 15 - tv_weight: 1e-5 - -# 多尺度配置(先禁用,稳定后再启用) -multi_scale: - enabled: false - scales: [192] - scale_weights: [1.0] - -# 性能配置 -performance: - use_gpu: false - batch_size: 1 - precision: "float32" \ No newline at end of file From ea953576e134fc1e2193227b46c21f250abfddab Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:04:12 +0800 Subject: [PATCH 12/21] ADD file via upload --- extended_result_174121.jpg | Bin 0 -> 35499 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 extended_result_174121.jpg diff --git a/extended_result_174121.jpg b/extended_result_174121.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f086d226c25bfee93a6396094343c89d6b7556b GIT binary patch literal 35499 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

E+o4hBlGUPG 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 Date: Mon, 29 Dec 2025 17:04:25 +0800 Subject: [PATCH 13/21] ADD file via upload --- extended_result_133911.jpg | Bin 0 -> 41775 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 extended_result_133911.jpg diff --git a/extended_result_133911.jpg b/extended_result_133911.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cf8281db39b926a75b167c2515338b992b700d6 GIT binary patch literal 41775 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 literal 0 HcmV?d00001 From 066f039a45e28cb35e1f0e3c8e1d8c8ecb5b4878 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:05:58 +0800 Subject: [PATCH 14/21] ADD file via upload --- feature_extractor.py | 103 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 feature_extractor.py diff --git a/feature_extractor.py b/feature_extractor.py new file mode 100644 index 0000000..32d85b6 --- /dev/null +++ b/feature_extractor.py @@ -0,0 +1,103 @@ +""" +风格特征提取器模块 - 基础版本和传统方法。 +""" + +import numpy as np +from typing import Tuple, Dict, Any +from abc import ABC, abstractmethod + + +class BaseFeatureExtractor(ABC): + """特征提取器基类""" + + @abstractmethod + def extract(self, image: np.ndarray) -> Dict[str, Any]: + """提取特征抽象方法""" + pass + + @abstractmethod + def get_features(self) -> Dict[str, Any]: + """获取特征抽象方法""" + pass + + +class StyleFeatureExtractor(BaseFeatureExtractor): + """ + 传统风格特征提取器。 + 通过计算图像的直方图和局部纹理特征来定义"风格"。 + """ + + def __init__(self, config: Dict[str, Any]): + """ + 初始化提取器。 + + Args: + config: 配置字典,包含特征提取参数。 + """ + self.config = config + self.style_features: Dict[str, Any] = {} + + def extract(self, image: np.ndarray) -> Dict[str, Any]: + """ + 从图像中提取风格特征。 + + Args: + image: 输入图像,形状为 (H, W, C),值域 [0, 255]。 + + Returns: + 一个包含各种风格特征的字典。 + """ + # 确保图像在[0, 1]范围 + image_normalized = image.astype(np.float32) / 255.0 + + features = {} + + # 1. 颜色直方图 (RGB通道) + hist_r, _ = np.histogram(image_normalized[:, :, 0].ravel(), bins=32, range=(0, 1)) + hist_g, _ = np.histogram(image_normalized[:, :, 1].ravel(), bins=32, range=(0, 1)) + hist_b, _ = np.histogram(image_normalized[:, :, 2].ravel(), bins=32, range=(0, 1)) + features['color_histogram'] = np.concatenate([hist_r, hist_g, hist_b]) + + # 2. 局部纹理特征 + diff_h = np.abs(np.diff(image_normalized, axis=1)).mean() + diff_v = np.abs(np.diff(image_normalized, axis=0)).mean() + features['texture_strength'] = np.array([diff_h, diff_v]) + + # 3. 平均颜色 + features['mean_color'] = image_normalized.mean(axis=(0, 1)) + + # 4. 颜色标准差 + features['color_std'] = image_normalized.std(axis=(0, 1)) + + self.style_features = features + return features + + def get_features(self) -> Dict[str, Any]: + """ + 获取最近一次提取的风格特征。 + + Returns: + 风格特征字典。 + """ + return self.style_features.copy() + + +# 工厂函数,便于创建不同类型的提取器 +def create_feature_extractor(extractor_type: str, config: Dict[str, Any]) -> BaseFeatureExtractor: + """ + 创建特征提取器工厂函数。 + + Args: + extractor_type: 提取器类型 ('traditional' 或 'neural') + config: 配置字典 + + Returns: + 特征提取器实例 + """ + if extractor_type == 'traditional': + return StyleFeatureExtractor(config) + elif extractor_type == 'neural': + from .neural_feature_extractor import NeuralStyleFeatureExtractor + return NeuralStyleFeatureExtractor(config) + else: + raise ValueError(f"不支持的提取器类型: {extractor_type}") \ No newline at end of file From d4b8d18af9b02d5b786148d46c5a024d78b60b8a Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:06:10 +0800 Subject: [PATCH 15/21] ADD file via upload --- image_synthesizer.py | 171 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 image_synthesizer.py diff --git a/image_synthesizer.py b/image_synthesizer.py new file mode 100644 index 0000000..50558e5 --- /dev/null +++ b/image_synthesizer.py @@ -0,0 +1,171 @@ +""" +图像合成器模块 - 基础版本和传统方法。 +""" + +import numpy as np +from typing import Tuple, Dict, Any +from scipy.optimize import minimize +import warnings +from abc import ABC, abstractmethod + +warnings.filterwarnings("ignore", category=UserWarning) + + +class BaseImageSynthesizer(ABC): + """图像合成器基类""" + + @abstractmethod + def set_content(self, image: np.ndarray): + """设置内容图像""" + pass + + @abstractmethod + def set_style_features(self, features: Dict[str, Any]): + """设置风格特征""" + pass + + @abstractmethod + def synthesize(self, initial_image: np.ndarray = None, **kwargs) -> np.ndarray: + """合成图像""" + pass + + +class ImageSynthesizer(BaseImageSynthesizer): + """ + 传统图像合成器,负责生成最终的风格化图像。 + """ + + def __init__(self, config: Dict[str, Any]): + """ + 初始化合成器。 + + Args: + config: 配置字典。 + """ + self.config = config + self.content_image: np.ndarray = None + self.style_features: Dict[str, Any] = {} + self.synthesized_image: np.ndarray = None + + def set_content(self, image: np.ndarray): + """ + 设置内容图像。 + + Args: + image: 内容图像,形状为 (H, W, C)。 + """ + self.content_image = image.astype(np.float32) / 255.0 + + def set_style_features(self, features: Dict[str, Any]): + """ + 设置风格特征。 + + Args: + features: 由 StyleFeatureExtractor 提取的特征字典。 + """ + self.style_features = features + + def synthesize(self, initial_image: np.ndarray = None, max_iter: int = 200) -> np.ndarray: + """ + 合成风格化图像。 + + Args: + initial_image: 初始图像,如果为None,则使用内容图像。 + max_iter: 最大迭代次数。 + + Returns: + 合成后的风格化图像,形状为 (H, W, C),值域 [0, 255]。 + """ + if initial_image is None: + initial_image = self.content_image.copy() + + # 将图像展平为一维向量以便于优化 + h, w, c = self.content_image.shape + x0 = initial_image.ravel() + + # 定义损失函数 + def loss_function(x): + # 重塑回图像形状 + img = x.reshape((h, w, c)) + + # 1. 内容损失:保持与原图相似 + content_loss = np.mean((img - self.content_image) ** 2) + + # 2. 风格损失:匹配风格特征 + style_loss = self._calculate_style_loss(img) + + # 总损失 + total_loss = content_loss + self.config.get('style_weight', 1.0) * style_loss + + return total_loss + + # 执行优化 + result = minimize(loss_function, x0, method='L-BFGS-B', + options={'maxiter': max_iter, 'disp': False}) + + # 重塑结果并转换回[0, 255] + synthesized = result.x.reshape((h, w, c)) + synthesized = np.clip(synthesized, 0, 1) * 255 + self.synthesized_image = synthesized.astype(np.uint8) + + return self.synthesized_image + + def _calculate_style_loss(self, image: np.ndarray) -> float: + """ + 计算当前图像与目标风格特征之间的损失。 + + Args: + image: 当前合成的图像。 + + Returns: + 风格损失值。 + """ + loss = 0.0 + + # 1. 颜色直方图损失 + hist_r, _ = np.histogram(image[:, :, 0].ravel(), bins=32, range=(0, 1)) + hist_g, _ = np.histogram(image[:, :, 1].ravel(), bins=32, range=(0, 1)) + hist_b, _ = np.histogram(image[:, :, 2].ravel(), bins=32, range=(0, 1)) + current_hist = np.concatenate([hist_r, hist_g, hist_b]) + target_hist = self.style_features['color_histogram'] + # 使用KL散度作为距离度量 + epsilon = 1e-10 + kl_div = np.sum(target_hist * np.log((target_hist + epsilon) / (current_hist + epsilon))) + loss += kl_div + + # 2. 纹理强度损失 + diff_h = np.abs(np.diff(image, axis=1)).mean() + diff_v = np.abs(np.diff(image, axis=0)).mean() + current_texture = np.array([diff_h, diff_v]) + target_texture = self.style_features['texture_strength'] + texture_loss = np.mean((current_texture - target_texture) ** 2) + loss += texture_loss + + # 3. 平均颜色损失 + current_mean = image.mean(axis=(0, 1)) + target_mean = self.style_features['mean_color'] + mean_loss = np.mean((current_mean - target_mean) ** 2) + loss += mean_loss + + return loss + + +# 工厂函数 +def create_image_synthesizer(synthesizer_type: str, config: Dict[str, Any]) -> BaseImageSynthesizer: + """ + 创建图像合成器工厂函数。 + + Args: + synthesizer_type: 合成器类型 ('traditional' 或 'neural') + config: 配置字典 + + Returns: + 图像合成器实例 + """ + if synthesizer_type == 'traditional': + return ImageSynthesizer(config) + elif synthesizer_type == 'neural': + from .neural_image_synthesizer import NeuralImageSynthesizer + return NeuralImageSynthesizer(config) + else: + raise ValueError(f"不支持的合成器类型: {synthesizer_type}") \ No newline at end of file From 6c595120508944cc399853d6848ff138c38f7292 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:43:38 +0800 Subject: [PATCH 16/21] Delete 'extended_result_133911.jpg' --- extended_result_133911.jpg | Bin 41775 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 extended_result_133911.jpg diff --git a/extended_result_133911.jpg b/extended_result_133911.jpg deleted file mode 100644 index 3cf8281db39b926a75b167c2515338b992b700d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41775 zcmb4qWl$Vl(C*@{0fI|dT!IJJ;10XEySrn>axGlT5y9Jlv?gWPbfgnLbKHl%% zANTL=sp*=jbEf;5shTt0Pxt&=`L_eWSCUhd10Wy(00^%e;NLnx27rk0pZup0{}W`S z|1=6RG7>T>3M%UV?r0e3sAw2ysHo^z=opy)$?Fj|7AE$8C;u7wKbIn+AR(b(qM@Sw z@09;9^{)>=fc_sQB!qVWL;?gP0)&5q0BQgL5fSM>c!2*asAwqYNXQt72$+D^aXI`~ z^hijEuV7J7kx`Ie=OQ8@qY$7H(gD!W-*8J2z0)+u;BhCWmkvuN(XuG2{{`gj-+k*5 zK6^#VAfwI5_c5aQ)egmfe*a%LfLAMss0aYG*Fix7z<)lF&=64(5s;Byfgm6f&>9s0T~rU+(=;=YvOrUZN@cAXPa(Yh6IDF3dYe-VyJw3-d0+{Xeb{cbgVFxvv zlb|=@@>-Yn+L{X5@@*82xQ0)4i%Oii<@MBprUc_2rx-vE9MZaY3Qcm4vi1E9m283ii5BEuaqY2{45Q%#XBnbkQi& z_SnbyqZmH5Lqe;-zS|;PS6K;X#n3-$+o!RxavhscMo+jo`-11d%;E)(N-};Ao?}kQ zXN{B!_fYP%wZIFy4xNBaO%Dk)E&g_Ru>WDzxWEs*?R$!Q{2MIZEqWYyZ#!=cO>NFATcAN>u-1Z{m0<&$h;~w5 zjN&jc@D6Z(6K@!jAwfa*^9C%;DNt{gSX)9xK)V^D+{`|j@LeA3B8>Ash5?Aoz==Tj z``erNv5lXKkhK?U#8KVN2?U#xcCRMvM6jsEjF z9`7r1r+baHz2j21l@KYY8m^){8d2v*}w$SznpRa^CG`3I=J@PaWcI#)RpS;6_H6A+IgM|T3S zulmN0Ev_n^#Om9har4Ub;XvBSsr6RMeOvldw6jDgm7OnIhp@7)uBLG_vGY>fjK-iv zVSe3bI9w#IY7}>t{5gzA%B-~YkhGk<3l8X;xM+8jI;#6SF?>6(FQ%Mt#r{7oubTyjCO6usb$Sg2jX zu$DpXLO}Sob+}<9{@=a1>!t_Nehg-2AENT2GO+54;;DN?+#MIO$@3xz0u2@l%mMQj6 z`t)@p0D~6Yv$Lgjb*Y6P{3oX*j;@OZfTx2SkU^tr-Evp+-S3b6#V>Xq6^Z@%{=+f4 zn{O4vo{wR-5=Lv6swcs36^YBEkP}MZ{{t+4y14f6Co`Qq+Ki^2=o@2O=;&Z$gtZyo z{N>WO3TNKSsu8CGFA$ryQ#6DWgrxaamS$2^x+XuLlnsm?d|{pz1U~))^a$s@c!PE? zv0Mdlf1Y#Dbp*~gS1NkL*|jn_0E%REpCo#kYVTsJT~RZN!dOo)6f^Cnv#un>tqkRq z#(SWjRt`MGE&W(Jy`3-KI^JBAH*TD;Y!$Cl)@Q~he~k1kP&X~`E!sO@q;Fpv%4g;T zC1xmoaWTPcort&-O)dC!>n0-W)_LNJ+k&GmCY6GvD(VK-6cS<7{cY9%XwHS!`~7ZO zb!%DG3o*a9;#eW+*A$njhMhKZ+tuXFh7Gc$OV;A#uXC9Bg-%4-Oinqv&Xwb5)>af- zQ^`|>$Ar-Nd@FBL3+DIWdc)eZ@C0uQ`%|s2ery+9=uebLf5id}|6sJO2FAm+l{A+W zkQe5_h7P4@-%FCwCab5&)Ij*2`R?HeryJXL`!(}qFenX~^nlxl&<$;{2k*jl=jYO2 zf`%e-x%DX7Tkf2D!62y4R{Rc5S2(g_rp;suu2=r~v=#f^IcQ0E-O7EFWrvVG5wNOB z2FSKZMO)1b$R*yuD>*;O2Cwnk>+Z7LbKidZ2dJI#dJB72wC_ao1)fKB&40iO?Qh~) z;pYQB3oDI+qFJ%%0YAC4K3WGuU9O87q0KoC0lrZI+Uj5#R(X%eWeWZNwZ2Cl0iIH~ zP!nWL$2AOi&f+w_$bn??d;DuDL^(OH_#=mEU#7^E>K)g8(ROb8{-y4<0d-YZf_{Kc z7(VIpynEl#vBY$(*BVKF&S#^`#4DcOg9O=e`5S~_w3B~;kn*GOoLPBIWzf%qRpW0o z;~s)X=Ly{t0a1Dwd|OVgX9wd5)5m_N@f5;zuHO)gg+iXxQ?D0tTD^y8-_YkD`P}Cr zI*4y6!cIyd`MC-MG%j5}>x}~4{9eijCqGgGJXA%w+svwe4ko&vqAio%P|;}58amp? zDIdzMZuD4LD_I3lb5AdC*QV)o1h8ZVOSh$3s+gCYK%=m++mYYq1c04*)r@tBJQ$_nO3Uq>AEFFg##InyOso z*BPCXN0ofnkRro5KmYGtv}dLzcyq8Ev~yyR9=@QFoGTg1WV^(nS#o~sb7Emdy5>1@ zJ)*qsYuz+dp0>$mN2tiWj~n|ScfCqRpM-|IcQP-$4%Reu^(&JFCT1pTiAkKi{5kt@ z7p#>bS$um_Wwhq)F04cM%f zg~ZKk^U47p!gEQ+#zz18zXapieI4Jn`|i!hSuSM2vS%x|`tHSgBQm`{c|1kvcAAO+ z%nOoc)d)F{()}qW7JvZ9FZTMTWva=d@Ou<5P2n@4=dVP1l+}D5m%uBJpiBR?G(l2j{b>#K{jQm^G%mrz|jBTDX4V~3xO4CF*(5@Wn! z`1(Zbv`l{U_N_>|iW~bW&lr(r5~TO>ASv;Rx^!!U!z%{UHsX7(ntz>;uS@YzG-8rt z6{40Tphxk|Gz=Bpci;c(pV@nh@5Pp-=Q`;aMC2GO=UybojQ;e6{FW~tV5>+_B?+7_0- zI)~+QK!l3@xPdZN`{4)XcV1NxM(p_HRtI?8BOwM8`P84=h*ak@3)c_&oK+R@4?R2 zs$wX}F5fwXGQDC}S>8}xcj8@I*^2Jh?a`-bYO!eAOpj5^l$?)NYx1)$0-d{lpAIYj z@kW26c}DSb!H0-fMGrDw{#=*qA^!E#?PF+F=^6>E17lReX*w}P1~fhs6+|P6k$FJ# zx+pW9qN%v-+C7PfHENv%(`yq`Av4DF<7|;Wf1h7K-zOr119ftWz`yB4>1n>wqm(%b zcdF~$(nqUf3-5%a{x@1GX~}iRwE>n3vu)XB^Y-DPtgdE2--PimG_^r{0 zJSlDe=8-JD`ndY3LxeD)d*qY={cV2PrDc5%t4d5+G9G1May><`;_VdoPobB>Hwjxa zRh1mO(Gar&rTV?y3RfD5(; z*PGGvYgp{t)Hc?r>#0R^Hkz!`Ul4Yzb6t_}aQY2eK<+_y=nk@Ny-ES=w zKbsrmFTfnC6c2a8!u;@Zzai(Tjx?~cJZ3|bPnm8k!=oajVE@_;thCYoJ%TPrpl7vQ zOG~|yU>^pfecfX@3wb?)NKbND3t3!FP%)1;&7sr1T{g6{#IdV@ih!rnE z59QWC7P(SnY>}aM+L344qWwAfh+A0T=g zV(_x%i1EZ-$r&PxTiUK|^z$v*J_3u&H^GGgdYTC;DeTT^^lN5%S1~WNfsvR%Xpk3& z_2INusu73xoW>?IQ(4@EqNvNb<}#TTTT^9F-}8{(&W)i%csq-KM60@P@IzbPVrPlL zQXRagpp&YgfL+GYR4`QOI^jg0B`3x$z=L8gp4L3IlWGM4DGgQ!7)22ua6oix>LQC5g zL_w*wdHC2@M~B)|ypKBxEo|6C3)5OcvKjz1qyWa{CrVaYo3;R*1GjlE zuQ`RZGaMwkcet5oQA-zuq1QA34(74W%jTTj`FBY(joTZ4;x&oeL^pv zX^!T<5VI0)i@SJVVru3-Kjc|w==~`1`g+WR2bRC0yrNRxU9a=SvWcltcz@r0(?a6e z>TJm(LC_Y!j?v@ex_doCZ7i>HNn*kp=(+p)nbAF?*ymbs`Ui+A=R{IinL<^#dyUcm zda#Y$wO-zbc#YrhX|J+X-Qmb6i;3ryWyji-#8j%y$UdwInB$(TAOI8U<=Zt|CNH&E ziH7@98%3TqvaJdL& zNB_D2=04WD2L0w;J4bN+qB*m)so51{;m}r?!`szQm~FffioPKob}@;nNb5zlSxr|h zDspdgUg(X(RoK2#Gp}(f3`*k3));$J$ps|Q|G??L_R{s((Bx7Cb=fy+dY)?#)q&f> z>~V3oh0^c}H3WVMVk_RG)x8q@eYt!v)@;1pks&ixrNfGX9xc<;4~lm*OXh z2c_bQi~#Go+<;qHF|4ZVm%=9~okk{f*rLJ6O&%YW@a2|t=;`CI&L*g|jMzAJ9cm-$ z=9pbq7l{cV?OOUiGO8lLYY~`7G8{!ND}vrxW1k6xUs}Z*`|yjZ9?D{T&!Ta(fb;wh zpdMt$)@u4jSM!~QHn3h=x+ytad-;%6Y9E_ASddBZ2ufppLu>=K>wF$n zDGK?i9*endxeNwbDQ!`0wD$kjk8IDM&A#>2V|tcaFzU(x2%TO5?93JDlyoJL6@l0p zhx?CepPzN~UHAer745nuSkdjA>NnYRT~t*0<{s?N9#%D!&QDb!J)e%AK59>0p*wu? zra#o;!8;Xue1f@fFQ2lt)GT<5TRRW$Dmt{xXB_0p1LtTOl1d6vaj^?x{?Fg zSNQ=|O?O9G4mxQ0A50AcX7C4I5wOxb_9=fkFw)V+q%j2K^t1;3oN2SpWBkeOobJ>6 zfim{<3(i30j^fOLE;N>V5yI&+a^F8B=d$v?YkO7R40i=;Cx#s4%cnT%?vY#MtQIR; z_0UUJ2G8puWXquGNF$FEjvoUfDC?aa?>L8i-fg?jZMGyxyrZz{k!(K|+;hsQjFd+7 zAu)dWC~H27Su{s$jIn;s=BxU~t#nZp^m}HS=!2bAdRkYn@J~1Nef(4T7WA9jlukoe zIYH-^b*YR!Z3Md_EuxsWG+oJw1RuK)hQ$ELJ475q3_AR=p6pm$WYj^wgsvU$K}(-= z=n>8P#e`*)vurGi4^5+&qmD%t{EF*NL>7Sdm9k5$-xXPq?$dsupW?8l4xeDjRjFf9 zaEtDcWG0yWln4q^cF5DkdSg|UrJ-M|XJ_3{hHDuQ#&2f9 zS}F^6XdLfg;XN9oFpw?Q3$JBl)DE;6MgZMbczBCDM>-vQL)k6<K zu+HG&-!iJo68Sp2(guv_q&BQ=>jzFxFCd93{d+N^?SU`7&5zTAHT6(<>%2jAPBH73 zc$EA|r2% zLNtV4i~>ZS8Sd$x9Jh@nLd)!a*s(@3SSo*uDK{%?qsPg$ynSi1H=HXD97N#QpZRqz z#+%+8m_p1KEB^$ysru&yrU0CVw5Dvgr$Sa6R@n7Ury>{XEdXq9p+ zU-FFEDo?y8CKmCxi-VHUzBuvZCXXJiHi&pF@T>&JYL=Ae$e@5}VJ&S;k)mm6KNV>M z_D;Ek7e6TFuwLonus8F04llF{+w}tnw-O?rjzg@e|FBJgyzA;@5?j^9)mG`Jwb4-s z?pAw}UJQ@aT}IbkdeDD#b@;&@r{yx^G_hj6=uyW9wJUqe;OuAO9g?pa-Y2dyyoKaa2bEw2qgQK`OnblBx zc3jUzib_e)wTM(Sv5iT>q{O(4uksT>fd}cleLYkaHJ;drxhf^3SKRWWH<#ANF=L71 zTPIi(vKjg-c^~M-!a?lZ6UqohwvEyfdP))#UX3bNGAJXM)Yl6tMHKogoY_swm%OQg z%}g;Y7TiIuWuM{noY=M$uFCo;B2OB`HapiXotR}tZ@W=o(z@2MUgl)8t0e{VK(<3w z7wRLs-}wiqU#=`8`o0+kSMZoR#dVfwu7P6dFy9=W>jrH9YBL0tlp+$V`{`N)LR=%@1(- z&Qcy;7JK+Bc@8zeHu$~ASurLSwl~wxHibY73uEa#3p+lTAFQggik(6$D-DrnO^sRi!@sY_tK{KUp)JCyCah{~2TO{v^16|0{$(J%T> z1EPJX1p1P2XY%gA5`hTAEhs#D)T!BAno(@}e*o>&DI)J#vb`wg(by4Mg6XrxkjoKE zSTj?Mqp9cGmnojR#}f-L9gtJEst61@iAP6qI3yaT8>59^62UJ2oPhhC-RSM&#kdyO zCz8F>{O+L3jCum*9^ponP$c z4CWGcD`2)2?)LdxzhyBpe^}U%aiaBbd7kt=nfL$cIDT~I-BSjGx{_4&)ty_WLy3Np ziSxshRS>kJ7_^uKclZwEvGUl4&pwdO06s${|Nr|G^y5PpJa5QkB zX!(x~J^ZZ!Iu~kldj(GIq|p{26fzOZxXYRTM}VlN6EN!^V_ezZf9WG8~BWj z6rHu>HbEvRMlaI3@m2M*!@#mB2h^p5BNkMib4Vin-PCBx#Gb)JF=+_1idAu^DS9~{ z!bx8I;BZbgpsBL~XDzLF-#e9fuU|k<{sP-!2ASOiS+`nq78O zS=`Z`RrPM2z=uJ!6tc12UlOH+SdR+rEqH&09PmGt9)(Ky3*D~qZQI_t!_=>c$yyG^ zCi~Va7B?>!=b}|ls8^5uU?qQ`tr9~Dx{I4EWqHwOY{Gw&C68aitE++=+CjtPy-ngo z4crfj8J%)y3sx`L(=aNQz|Two z#d4h#7C{ zORr^yDpS=q?6$()BP$Z@q8jO0w0Thtg#nYN1OvFCIr%a2qZN>Mf|S?6 z1jr5*!{LPumyx3bljn}RTp)=Js zvfnE#_ERbotBEHzO#BBR^%x^(ret;xm!a->*g@;RHMQ^EVQtdK|OJDjx0x+UWc zX=^E9d(~?*mA+?>BcQ6or+T>gj`xdyM_$r5bI&``$2(6}EGMBwfo(T1J0Tz&MfT%~ zYP%^Aflo^b4JFfj7f(mo=nvtq^nhmmPN@a4{2rjYytdOqBZrD%8|{a$T}K zg`r%*7ncsYt}ZcvP<)jV04<1V%aezz8PY8__zxiZi&EWX%G!^*E^h|co?4dA8;GZK zk|%i55iWuJ!&#L`lQrWS#u#^Ee2UL~eK6zG3*1GB;Z1Sr%2FF0r*>7kdYt^~A(8p| zghJ`}NQCV^8%0sqsPc!mRAj!bhPsZAf$GkI?&Wif(05578K*La(l%X%B7+9Fv|^4A zspc~Q(-?W=hTa5J>kFwlQV-ptR%N|CZ7KEyw|Frlqr-%OH6H0Qq+(Jb$*uA&y! zyX8MTQp8S?ywql3cdx=%R)SRdW>f3CO-!eTkC*s=SANQA8BRy|0kQ>LkYkG=%KXlp z_hPy8j`Uh;S1yt`-I1W(-?IhOt!LCU{yHLooFBP%w%mIC8iTWYW9h5AHdVD2u*I{82EV{(@*B)_g)OPpCgXQzRcyNnUu@ggMxnJG=je$ZS;KeNnM)6ScF>p!OD>-k~-M zQbu&$W>!1h;t%{gy^$jp-uXzCt9s&=hz{gK{DWlcViVwC>TC>c4wPkWEKh3Qr6mE7 z;Q9q8GIF%kx(0~UKZy*gMb^G$jU{nF)}XkC6Qc>z7+F5zsmZv4_)*GR?~2(-(%6PR zDLfbgLo*c;2}#C{!9UjJj&ax&7zLi3G|^$p9P|Q8%t$}csEmwFS5AIXwI$rc!)5vT zvEE4>#c5?R>pawmUz z`840vK9^B;6$}PXZ^Ht!%PUI^89#n`{|4KNh`QwAmqe|>Z6;g%&ILQv5A`&5ZY$8zCiTg=Ph3x1icdA0IyUOASu zpoIzNta1}b|0(FBl!Ij)tt#b$U=uPPm)h;S z4SF=t;ZPt^Bf(Jo`={kesFY=-tUW9g2IAz-)vQIh{J_Z82>>!$#8pvF^p?gRQyQfQ zol$G3Wdo*up~@KUhjVM!%lM0-KY+ZE*D`P~Zn`e+hY7{_d|x|k(*50WepObgRZ(`K zj4kj%>Ycyf?A+!Bi9gBh0pwIMA0r>bw{%E-d?(RH3;K||v+pINElHlDXP!o8!b5M` zBXm^sm!1-YZVA~1!e=je#s(CAx+#v3B7gu~Vt%L6P=B-#g<&C!;Esw?;aG$MMb_4U z!kU1nmi1;ZzjE~hv93_eV^B}Fgqp%@gqTEiR^4!NrnG&FbY9*n3!F=Gk6iOi{mF$J zvPto*2#xy(zyLnC^-EN|CXm$d-UJa-pJ#c84jL@6&StP-m2QWPvuUNVe5Rs;5Z6cO zi{r$2zCdwAr_X^Lilqwk6?Vv8DrF1SgF|((!@G)t*6EtIt4(8s8c~<~0mFNbs1eZ? zc+QvjrJ8cVQ7L&u(I=^UMAEi@0Q70`o2hfL3vGYK59~XRzyq6qpbZt6)vRd`WxC#MyL>vRLQ% z9{0>82?4K6vk)pU+L#km7K9yUw4P!ex!b{=4{JIaD5x6XoO)T-?GNk#%IE6`A^O!c zT<-iBUtJCPHAnA(`W)ioifTwC&en++6x$-)PRpHehZ(!rnZEV*6{iI-VV; z0&QcGdLg#dz!*-RcLw9eDg$u}WJJ-PoT#e3SPnGkZqJ|-fCwD{|2(n8PPQy~1ZH^6nV zS*&z6#mH3Yq#b_C@gx4j7)lEx%BcfVP?eNfObL&I8xcY3f?DoHV#3sokEg<&!EI1c zqfeuZlFJfyL+I8>bV#?uj_x_ z)B#!M12uC^90aL~UI`1;KgF?b zsf&7M^_q#p`}l%^3Y^+2r{mN5;fhd|a?KA^RpY+qYM57F?H%T>mo+gvBbz6b$z>Th zSVc<1G~^)Q*xxh`6;lX1mM%Pas-P1d{jlJUYoWu-o`;#hoJAc(()fLx`gZC|xchEr zBUSHZOVOeZ`MULx^2xk91I}<=7=FcOUlP5D9QMa+tV)Dab?FYQ)|)#=XZ|gvm=|Fs zpTg#c7)yItJf*YC2kH z3lrA7wMahUj%XJtNQ!9)i91i9pt0CF3cMt2==1*VHtzZ!Qx0!CxuxoHu>D&LFOat` zhgDNO$7)x(o*kP*J_0e8Vxz;NKVj1)iLxxI#*3kZyzsW#U22xO#w{!8Yh^l=-+D@+ zEW6w$beb=vXYbf3(o_;~kh_H|(zr=|xopx|sp*lCQx`H@xlpOyd6!mIik=E+aT{^} z_E}cylfp;o^zLpENGx>MW=lElw`i zlv>Q5!D{G|#DDV}nae&B>Pc!(mTglJhgxBVmFrF}K!6~)37!jwtb0YPtvc*f#LK9N zzopRh-CHSWy`^zFx5pb0k+FBh@%R&!+0nZ0w4j|ipZ0YlNS2H3AAt1(^3N1da2Bcg zyL65wYmwcHv4G}#)Jk1ba=$Z9f-WLHt%x4Mh!5FxM++@)&+`6AWZgX4&lw{|W)e!W z8x2Mc?~pjPPet3S!Cj2GDv}J-WN1n+EOoyOsC%&8(j=h=R%?r+P8N?>jEGnm3V>PRAlif zGbYpOv?BX|q6tPA#agW)iCVaq(%EfIULW$9Y@xGD`igC{iyT@>q5lB%9W}~x5;_zyl=?k@1@zg#&ZmrvCd1&I zFnGS$wX5EV{Rr8HduoCC*hr69d%x9>7+3}?v)mmMwbD*OEwr~*@=<)(@=^ugA;xjZ zw-`p#%rTChl2QTq=)nXx!v|6Bn>VZ?Q-SB(KapzeBfg<0vn+V>*6E((1R=@|&;#3r zUKnosAy~zdngvalW6fbT-b4%0yDMh(2!j6r?0c3oAtZ+wxpNK+3dIpXB` z_q5?XTXV-e@>`0A3HEf}timYtYb1ou6gM3Tt;Rc9rUTRE@@dTI z=>lU8t(26)AN<{pepT*@n(Q&w)_o$;<6^H}9t$|m93hom1lWP*wv)B35x1u{>(JuL zFMIEGk-|<0TbUkjFN$l(MWvjh?MDP}X=;QYK9b9d1O~rA*G;~p7uS+tY#)s-=bVaA z<*eK!m9mCOW^ZEQhkio?KK(^&Ke615_r&Q~Q7Cf_gPO7@$oY=}YlV)O$Y=wslCW4? zitNsbLBy$y)`|9MgU0iTn&)lQ@-t!m_b5wzGpFlX>&MkFRdsm^b~?&%1mGv5f=M-H zi5A6Mp%V%o2sm&k;@iW|C)>>Jq%{)_b4 zHy}fY$|a>}h521`>-TYQI+5e9H~kF`EDrG^NB`!&d};qE1dhVBX~NdroMtfR+Jcb znQ1KN+*rj~bb$sVtEy2} ztY=r0D3e7iyDXkQFI|$BvYoRJAxZBkzVo$r;CsrhvQ2qHcvQh;g-zVTqWZxw8l@}x zAD|VCRZjN?wfA2Bo04N5f@k4;M_W0pqJv{;)lbXHz#wad=Urvc_$RrNd&aXwx+lM^{kPm8OS#8+;20UT8#uHz-wB60y5MEOilF`(+Gw6M}Dz9NCVId_fEwS}-y-vq1S$9$B zI|Hfza8Wgra@*(!B)Vgcr%ith`u89#UrpG3S)vxu6z^}V^IhQuY$+tF% zmWonJ69-?@(X)68HxPKb}_1Sq2Y!XH)m0;OD57qp=4pO>z6u+p}@~2brh$iXOJSIET<_Kj=-1w zN7k@rsAX-_W5@%MaHG<;6|8lLPUM8Vn9nQ)Z?d2(N)i z7#k*=zK@_9myEQGlMq`rbiFs454H^ZhW-idNpL{qG3n{;R1r01d0|SqymiIr$jmqw z(ZG;`r{G7y^Hv{DfzhP_kJ55jY{H67elG9)QMlCYS}^+E-943Gr@gv>|GpW4Re$D5 z-%jZK<1LxRoHt+1^+LKjkH*DQ7=`2xcECTtd`${OcBn%K4?|3}WuGB$!rw8e%==@y zHr>dSY2Oi=ws6CPuCFNziWv27b_i|?(0VVqU6(!N;kCg9yGq{~U-g&91Eazq->4W^ z**fu59r&0ZSLSHV;p8m(bwB&t@M~ux&D|;arIfO1P$Z%16l5ngF)O#>S`C2FdMl<~ z=A={hHZ}g0E4h@0uA$4$;ivU(dsc|il+U+;ZI$am`NI0F%(m}atsoPpTU#4XA^BM% zCA(-XzZNO-tLM|wy!qM5kJM45Bddk5eM_zKswCM<5V}WdwS{%I-Oi0K7Aq@Z-xc!U zW`)HNy$u~XfTBvlhY9kl+^2?57_^jY6JQg54nv*~sg!ID8N_1=$VicZUw}vNNuNbl zuk%0l`M=_LW0*XIf=Q`L3R}895YILJ1H=nz#I8wswzB`#2odNkfIiWzk+J{k2kXOc zWhK6?X$g`jeYNIG0Gs6F3jpVXW(Te_X?YP^-hG4lG5&G}!!GN6-?U|{6qU94yBRq3 z$0i7qmLke$s40ZW;2SR4T2$sHEo~1ngvke-2beZJN*6b3tg@#rm;JD^2d0!aFhPHp zW~dY+khusbrn7!R_|%zK`|Hd*LJD*@_1lz{V-Cj91=im+06`=1S?Bv(59txQ6$cci z1{=AZ7>^B^zH}jd_Hz9P(C7SvyE8gZ(hokaVEUUk@e+Z5gdObhJo{+U2tFI{R#e7m z_UhD@WWSc;$}nh+)x+Q=yI$hA=rgOg*^uk|lK1@swn1W7Yez*AKL?76J%M(TsU7mw z<;VkWvB;aC&JEg*la6s2yHbT8&_;HmECX-Q%5223&o2aeWJW2n-MrPQ3HzRflQ)VE z`Ea`)&f=bqmL84Yiwny1%D|cxGKSY$3Sy+@Cje5rY+xaR)2N>f_iWeuR^|nRoAYzR z8ZPNNv59OU3aOi^67N=fnAzeNm=j;3x<_>^ZGL&uPk#aru+bw={9xQKo)9QIsRN7G zUwFzYuold&0Y`)zZ+5Rd2IRN6sCRtKH)38f?!VLEk$=SPnl-dWfOkzUw0OLf^B)26 zV8duLq1=l=O;pd5-`pp8o(^mkNvQydDb1(fOYzDR;#O4|!aySuO?+Fj8&c%B0%+~} zc7;erMQQ5>b(GTE^pdp?50E%q-f+a^V|nO9+?#eoOr6aLWwt7JZUSipI{9sc9?Mh3 z{iC14N$mzr>BF)$Z3dPB$)wU}8ncaI#}xKjD^Ce^jwLZM=H;3)pRrRbM%nC}ahQpl z0R2Q^d#Eb-I|NCgauUl`-gHzdS0l|n=kdYrabcrKRUee*k&E+lh*V3QGzKN!uiqZ$ zK<4Eg>LHM3UBA7F6yE8XQ1Q>-KNB+WVZRetzLvyU4{CQ$)MDzdJL@fK1C$`WT{g2wIu|jIPz&#e1ih zmp5)A>kT+`jQ+$jzVgbh6DLB){L-7CWPR3MY62wlqi8DOfYa=|=`QkK@Fug@?SSSY z-=gb5mQE0%013N$_*kTncm(AhTSoA`JOeR)H^Z7O3`~%sDDhs9#>MmHFOhN7g;;{Y zvGdX+xdOCe*9t;gB}vwACWf}XJ)e(Npaot(YT^43nYg=rn9lHA8g^Nrxk%oOp98PR zQgA>0J+ZnjT?1*lB#gFDnX>)!x2erp-pkg(;k&BV={_mF;_9yXlmcLn{^ou^A*L#L zV7Z0WUD>u%Aw^C`axM&L6$nGNLKF+5(eMyPTBbTX7szjS>O8|zC5oI{tb)JNfJqzj z58kKWw*uvAQH@DcPZ87r_Us@J6$oCr5gd9FJw0PN@9k2-3D-(Sv_MnD7Vni`)Ld;o znZtzZ!5VurlyL-4I$Jl`;`w04h99pcXeLxSD3oY`R$M%IPzeuQInP<0NLY8-N3cD# zMziz+nWu_J8G-swD)KOz5TPY?VSWZxPuoIv#%+~TlTMDX2Zc}Bf`+Dlt}P<^$N9RE zRS8q=8E8!6;N`caxNWocKlvT&tUDA2+v|@Kv65(oZ2UwOpMv!>FU0yzbY!K_5C(W3 zdxR8esL%BSv+n<{S9UbsR{YvL1CY6(b`wneQ8y+^t&mKS( z>3;xB|F|RHLyJOeM0G%y*>RrzkM~2jV>jJV4SM`KJvo~e*+uSDCa2di$t^<0zisJ1 z=_is}ytnlXC3RT<={Y(DcwB85E)QudqKznP+w;yxX_b2?Wl(4i_2S1I0wlczHs!gl}sQ`@HV};XGjB5xAS^Mfw|o5Z=o(}OKiFaL3pp6 zf?1+x{cz2?5vaKpa8N=`kP?s@Ze*$Iiukv(aDI!JeU0SG`d#^g1Is?7hPzv7nvQG) zjUJhxADN&)JLhP<6EEuGVb-r^hTKAq=$LkCX`I;O_Aa$^nmML#j9s4?{ZsgN0x+u; za1}?Un6EjfOf8|vQF}078&0pREY90X`_qfo%$DO@T;z=&3(LDy2P0<7-$>8jv2w9# zoUThPx91}+zbj#>t|=krnq~QIXMEEyD8l3XQCtnbFXiTaK6q^L96cR4IRl@Tne~{s z67WZ+2t!1&lgkr2&;~xvV35TXErhpO_K%5DCsYUYs-9v-mu8Ts5>uke`#YeH_U$2n z<@6pcH*#%DX`-EF%%Jmicf7g|b`>nlryp~uJL*s%1>bpGn>+WBRR{TnT;5LFAs|@j zx}N?OL5(O*_>Qdo@Sg5>rS<39!Eq?^Um`rKDM|7D)VT%NqU^3xl3>v0WY#3tfZ*Za ziTHvs+c-u=iuAz)LT0~j=z|=^H{7P%jLN_=%|EQxQN+8tcEG~B87rx*9G@7Rx@cGDNlKuKMLeFSvF3=~7Fr zAG>@yk)?ZFu%h^1r@7KfpRx|V_jL+o19ZqWn5oZUublq&S|VuGYuvDUZf1FLaRbHx zi)5~D7$>IpsP2*MF|rj!vDsJ=M57$;^*hgSltnG+m|MzmcwDiE(G`XZ**fpP{C@rY zRiK6^#Ccm57&Z@9{jOLXZbB9t{Pm|lZYnfT%rvas;WH|7rdeMsw|Li{{-pr=`D1vo zt#qS^E7LOTMmXNglXtysqwe+v!D@AKiD>S)b>_s!L|WcXvvbXSHM|M{p`?(@iGFae zb7_2bu@r&U>iU$@e!x!Z64qwU#qFEBTIJ<}^?L`zR`}@fLj6o*CE@qnhdI*mioRhC zvb9Zz`a(P3<_Rv`L#ch9qg2l$SSyP3Er{8#T(tYk!0)@I5lfbnz=(=lT{mWPf99Io zcTv-a#VJWz*)l|KF_VdG;}dOer2sUMtQ@A6Im5f0Kg0*V6790X{fVLX{{Tj+K9%zJ zo5au)XA)MTsPJVa+H$&3p?lXub?8T8u-uT^G&Olm;lVo1b><3QuhBO<$SE7sH${n- zZ|bFw-EaN}vp`J0eO(ANDfHi=^5*2Wb*UAjPFPAsExI{pQN(GC5B%LoR!KG9B)2(K zNf|+kF~9`+f061Y*GIKlwx=w_`n!6c=jwXfw^zL}TAXF&oU;~SFrjvU2leWT5CR+q zA2Xx}5m|EPXXhxvqO{P%432=6iZxtk&<&t-_x}Jcyk6=A zw-#qXgkiozjGxo$fB8HPw4%C25csNDJnG7ZBjPZ2#<~2l=hyDv)2-8?QoDik=bx5{ zDpR0!MuU5)bHo9h>F8?wKp1x{HWDF zcL$UQjz0eY_2^=4P?uR|q0$ytN2o2Gjk$><_;p4#R&Yd;hnb=rMtU#5GTqBPyziJB^%O+Bp1S0nDoXYq{Y2}a zcTdEtM&2nN+ufej>k8Xp7@8Ws^xUIYAL5EQRJZ8F53%ciNcSJ`*Y7}Ee7F5y*{hu6 z7VGWWtuJ;rlb@D#*-s=KmHC5!dE^oYR6kAlm($h~UiI4QtAyKj)6`E6?1%KHv7FmKiw%%O+1>m&_k8T>|_!dkflL!}w9P=ziF0n>Ajg)f2v^?kT3IRjqrZ=nzuL zPTOaVDIi3qMRW(`c5j{AJSgz(_=9(o!pCzdZXLYTv*`*;lL+bW7Kr0}RX}5eTDmF3 z$co2V9kAp8Djz8Acr6^A*cPC zJW<#?)|dqiEb2nYGBQ5?qxtl-dwok*)jLK*MYSDq`IKh|^%*1d$I}51;J5JtyLax5 zDClag7xtrF)zQ*J6W(A^fxcRAm1^SymXa(<=ouSu>dNWuL1)+gcB0Z0?$l2y@==rL zQRu*Ae99OV_xz<#rxZIT!#r^^G}OQovQA}>J5KPqCrfIlG1OWwN+zMK1b#xMER1uKNd15I9VYvSrmh+u z<#YI#N{S|wNpYa4$%dvjU5iy7+!&wb+a@^3-RQ@v)hZ^SAmGnVnP~^rq!3(=ce+Xd zBj?wDFQ%3C<ZZ&p9Tx8kee{{X)Fnv=9$i zRKJ%2or;alS&lP|{{ZpmI{vZPWURPH9W4oxedEfExN#B3suujCl787d^NxyT(f286 z4P6w}Z5Tlzse++uR7P`$%|7$A;DFc)NX9|qq3geTXVLcRhBP3z{)mBqFzTN2w2RYgRKjuH6&qGz0K=FziS0*(WC(}Rg>UlkU zOT}H12+bq@@ul1&_HIDhN8i)!*0>3(5S;w`dT0w&6(7@BFK|tBy~jcU*({Q?kEBXZ z`s1Ir2T|X(>1pOBCEWSI&nJ)cAE!i`s-k;MQK_P2{o8I$=nfClKTo$qkl%ZC4QaSt z?6XtI&z4B!W{5HMJ4QIqw@uQ&N^PA8C&)a!^(=DO-&(t(DsTXx-fh?V8kLUH)zk@H zc#u=m1>L!iFZvJr^&2g1J@UFbTV)C@G(1M6a{l0-wt2^?`wpf%nH_aSnP#Ai%#1KB ziSE35eMkKdT3Tk$Q*G1o-l~wHkwQSMFvM^f@$Hkq{{Y+82mQr$l&XY=*z(8Jykn4Z z`f`n}BvMZZll=kr*38$ord_oc27RLhw4oGzhyMT_WU|z?W!0l6%Zem>KP>~Yr?5wSkrgYEa|+ItNxH3_AmR*cAmG@*%Ok&jc(diJHt4HrxAwl>FI z`e?u+*+mO3{{T+9hO*visjS6B$s|H)VHF7=*d8)f)O(x|K|X--l6vtro`X=?C?r+$ zJgFX0ANP*nMn6KTNAvpi6BlOcDXr7l>2Lo44wbT*B~*_s8jt~1ImUR#eZGeSqg84v z1t!2%Vu^7Y=k4e-`gN=Nyg>mTrwt#;#x*XQX{Mr!I3&hk^E<}BKHrQ*J9az4#gkZS zJN&fT%JHb9{gI`fdEl9;5+dzdBzdtXfR^0(#_3T9)xmd!f0_ajDr71d(BI zjua_es{xfKCy~ep86=WQ`>Efa?03%kHD`JCo!d}Vk^?P$dr9OjOBiC^krZ5=s-tKJ zfx+wVWcx9yd$*~gq_*XK!z^uA0@F&fP(AMPE2Djyh&yIZ@`WIQnlR`R5Y-;?_O6sl6_W>^Eqv zbpHSe0znl;J-r%@3V;bkn99?$9G03^W@1h_!6TQg4{g+Xd2Ic{(pH~}jxs9dq_)JN zN3)MDMi4m8rF8j-QaK|S1Iu$x=3Q|zMA_T$ZAQ}64KAQgk*bP5b z0^FZYTdLrlOQlV^BvRwhh6(w;#BvTY2~=15gkke985tQEKVUC-B-?T3$C2-vq(M10MjYZS3J9IptpQsKo<nR2p`JDhFv}uxjf3mYxFLo| zT_EtG_@!x1{A*zci*Dk+fY+7O^z@dV?9)&~J)){mvBa_7Xbf@0u*tPU%pD^_K}l&p zH(bNhmTR4c)g4vFx6gu&6u|Mw2&xQ!=B_{@Alzht&5hUrmpPLAe_E;9zE7P9F-Z|C zf&7j~`}OH-&d;~JWnn-vOW;F>cH5!rCsrwT<#q_DTy;sv$dUf%1i zX{si!(LLAEk?E~vX_1oSXo|1Sf~pdKcUemz=303d46V*HjIkLxd#9u8wFZ)Vg|3{M z>J|V62Qot6ojB*wK?Hgg&sBf$g0XiOU-sL!kZUUWq@~mPlTgj0QcAMzNo9uCBdVne zN%Eoh{O@GaN7v|q1>C7qXAOW1GIR=SOd}7`_%5mN_yaGs30X zLLJWd(8YxH(FLU-z~cmf zxVW8^q_cMCw{(}k4R$uaTkcgxeN9byxIDK@w5pMbWEE2~l&g#Kv{S0a$RR4x#=d7& zBS#9#H$~KRrV~!6eDT7{8HT{a8B$9skD(xR?ChqwpF&pKtDY&PrFqBgN_utxoNry= z9yh3L4E@xQ81ylrl*(Tl#uz|6jz?D@nw3SGfd}~>PXnkq=ww@6JKW7Nd9%k| zV5@miy;4OhA~@j2>UoX9;G+OR&UxsAOcX=EXn4UMdgkC_`F zhB!Yk3>4*6Yh>{tH}&(Y9;y?i`%;o=q=6@%-ffYz6Ye#;8LH6NI=IYcq8KqcMlqQw z+i*K`>Qvwn_a1 z-AzRzN=SyXm6mEoJQ2SGjB&}y9-+8B5jB?2XrU2PNIcm{^**Q5fzwq|qJPKh`{O=G zQK>OYRNE2!{kP? zi7eb>9c7N~ElmI>58Z?xD)1NY>5_eauk==>$V#{m&#u~Pl@$<`1E^}dtppPJ6qNEx z`>};k26OfG$MWZ?YZjTRsi=zgdy!B^!Qp^sla4d?9=PlJ)l)*%z|z_O0D4a($;N-D zQa61|J+tMOoE9FzeLtz_zlo#=fXVuN`Oit*P^=abpyQDK_4e&+p644DQ#QP`N~Ce~`S#Hgv{cbWM$9)VjokiF z2l{(;@@iMSC;)t!<2^^wQ&r9yYL+Ci8`~e{)Vha`IHU8#5UzaL3ED{Z2ApZc@@6hEglS>tKJs4j;c_tD`98Llv0t3k9m|y^T#!s*W^<@^7 zl(k9rk4}Dm?8N8`s*^}4`+WKI)_qB?=rol)cU$#CM-#9aSe@H$N1~u4lkM&GAaxC2 zQK>Kb7HvyZjwhOxRw{KoERqnr6n>}r4D-=usnhhAb^@jaZ$eib1J~NA9VlXpY6#$n z`DwImA1UV_?~muww^Y$=gr#aM^UUD4Ks`^svujyZlzXrN{XYJD`fKqkq$n--U1@95 zx`O!)s+P9t6*Tuch5;#}c?RbtfgB8xkVbL!>f`Di7o~JfB6fb0PuwW%#)TxgEKed& zQ!^3)sFGNcNygkTWeEdsD;USEWbP-2ol{gMOMNmpWe>7K6plg1BxC*kx*+UdbT56C zh3sAR){;J*g`kGtZ>j>J=(o1knhX;nDhxX$c|wTbqcD%B?(Hbt+i?WCl4B<&BOIH3 zox>N`S!Z!`O0lF>!h+X`-WP}SLfB_5Kt=S*b{3{rmXMrDoBokEr-FvEBSbI)HPE2g(e z@Q81>le-o_>^XtD*EE+zQ&JgD?(y|8j(dB-_M62d5yKvv?#(o5I>r{Jx{5WHj-h`j zkh1)dHculaCfrvkkOud3Vzu3M1hVMLq?(Q;Sp^Lp@v32tJ)rMc9ogx|cq&HFNZN77 zNu7D2?p?UoH9B7Ja*39mQd(+?Z!G!HO%l8;Rat^FMCwd?iBiQFoF2UBeOG_dW;&y?u~R+o@*VVlG|3RI{A~=)I_y!83UNm zwM#H045%yt&qqEhyY+nR$6__#h;_FmWp16)HPse+Rgd>+GQ@nctLcDw$@X4z(7%H| z)Ys|l9Z3!L^%VAfO{S<8E4)(gRjZ?nr9S6ef~FZHi035?X~@A|ocfoyx=T>lD*J7& z=AxR8zM4p9qo|dCe-kMTxIdT>Po{W3&#rpkv;}HlRV8T!*29I^yASqaz%>h zBa+O=i~;TJFq7~NU479tmrl^?$)EOxnrEj~l4fAgv#g7NN%?um$EI=YGtk{{Yty~6 z?bS_PbIWy+o>5pko7>+RAKI-|qbe=d`=tc65K`8}BdDpT ziyma47Rqqr3Pw)^fshNdD^skW34FgelKotX{Q)`^Y5<@TFdL?RjznPW(W?R8U0q<( z{kytqYRJ>cikL^sZQoKu2*~7T3_t*Xi|fHpYxSfTD}5d6rkZaucodUQPE2(Rjt&{J z4n0`<{aE#0yjxx>>GUkRZqrfmo?XEm409^1iV{{w=j*w69OPs4vK_6_)7dm#x`sq} zmMSQcKn~(cs0Y{XI%HP@kpBL8_0Eu89vXxA+aIsC2Aw^i?){HSB=l9*_lk;0T3Od1 z1;z$RW&md(exP&C11auR+RD;3e`9ZSmDRS^a|IN25xUG6W$9%E{HN4_NCzZ?>%OV$ z+KYab(sjD$x!RVKO=)Xx*Q~hQWh=b%x6o(Tgis4H;Xx!0kaK<`-OSY;th(QP9(G>! zXVMh4qL!<zt{-N+m4}q?P$Ky9#Y1pY|?k{GqutQKvtk$|eiHsE`NZh|ZK?H5VVdy|O z%TKpm`|W>mB96OE-Du^ljx(Bhq$^P$*D<(PTxXo9_51Zj{0R4>yS^ke?as5hcX;o$ zuP2cuMP(#X11xH<7Ue=7i0gU0NHUyZ48SW-{bieT1-89#| zxu=f41*g9GCJVJHpGo6)4$H~Hvh9&avN-q77Ni{rb;cPUo+ek45a_|;5{yOW zf;Rbtf*5sL`>W$CU-m~-TW8ifCX#_~_UNuO7V9-SQ%OZfy@YZitE`cU841f2GINE& zIQqiS)}mIT(pfv7c=MMWwdKVsqOcf;B;ZE>02>2wt5>Oe%crjrS!wjtbu`wcuS0gF zsG%t&l;oyW{KdcwA9DiPD;Z33axq_QzG&8(#i2W`P-|b$pH9fvSdARg6U5N&=YuN6-^XT5J4Qe^1}qN0Jf}N zD!e@E`KHsAl?9-VQwqa+{Okt|-e@P^k6&DnK*EYf(uE|DPzfSWImR6C_H5}TtxKrs zgpHpaPDJd-Y~bnBAAK+Pi(FQnMNRt(;|cRVCXw7zPQ%?vuz}?<{&pk^>;~i z1vMPkYH{Wwhj_r@TOOo)AGb;S1$KhJ+F3M3_LS4ERMWLrpB{b2NhEM^N7EP|Q;j)p zueI7}ZuYyvJhhR}2&r$k2 zSy`&!du??*w6_XzzDin!3hIr<;hb(yPV0uSlq<0K?;LjY+Lr*GRA{<)s8E9^ZfW^yo9YJovIj?CwBldJAFwfq%Ibf)fC7jN(F%Y#}Ja)&L>TF zS7)geJH-Kra@gFMfs*8U<6oDK*7pX7S7@*P_=;qqA~~5bGKAnT9^CtSew{*h$46PE z)9ZJkkVs)~G8qW`r|tCP{W?|liv4!7>d2^V)dyuls>@9;DC%>@ICI(N1-d%u z>7$-E%u+eR$`?4#-`msr^+h2Tw-5fZLkIcp+4V0SOWSaSk zr0vGF6*ZDUOCnjJnN%SIb9_1#!!QiyMNeESs+<*2ZEn+6`~I-0v7JS2w!=?FHGGES zacGOd6DIVB5lYidi9T5N<;vr7=Wt5tuF~J{{lJG#Y4kx?@ec5ot&W>+z|LFEk(E&4 zcqM?z9OU%J*{VNc$8y#+wSTm!9paT*;PosBX%vq&qV@rvjWc(|3jY8u3E>eAOMmuD5#+&{+v{DwPIm^b@28TM_imx7 zc%z2xM6VTm3iv)`BoI}?E&5f^)G~*+AeA zpdAVti}iwn*L0HbC#Jdih6Y-MW=4pn_}^<18F!<6;R#n(+ky{8`d04@r6R0_UwJ!~ z@-xT%{{YjiDxEhjeVf-FUSFn@MP(GFEWzRAeE2pxRd}+~x;A@7in~tQDiZ4qlSy=z z2wkF%2Ls7RK4#S*$1@PIWSLc-LKG+t?T=-(#oF6!?iIsL%Gz?OzDUyGtR#kKi_2$) znl>gEDmrb-!y?AR$H*%cI9eq@b##_R%5sUT-3 z9Z2{b?cTKU6W=W-*ewxk6;=0Zno}zXOBkZu46?c81VjbNAOIJW>6lLERaDa}Tj-~E zM?8Y$?LNn!_x*X^@V{B#zRl|>JH6OT{mRjErIaGxAgo$icKLxYGfc}I>PQ=-`N94z zrvxK;P*AfpQ{fo*^B@!EL-XHMENN7&b}mbmKHz8QI=1_3w-?ULXkOH6k>Rf2+$-*e z)Kv7dU9?^5-&ruGuD3|p_<3U_q~<1KtT128G31gM^xf@M$6sA7kZDbMBoA9p2ztuO zGP1=qV>o0~3aagoMauoMGHd>o?*9OL{9t%(wCkN^+WX~`xw-AzYsp&W9-Pn}TF@=wbd zC)9f9u6wiV(xGZ87IIW)CCCIzGLjfek^)T5i+N*lb9GYYnUci#lfwKV$Rq$Jcu8;! zV@wJQET>RS-OlT2Xd_)SaZ#b{bjb73+~T;R$PbpqY5cf}9DJcRamI6w0qd$-meJxVDNSTrcT74*Zk$w9SSqEO zs+s(yaw3jM)r_v;qYMiWHk<>M>wq7Kk9ehxpPH!SBdeu7ma~zf#}ie*H3l@WnWWTd$HkSW&Ec+$&&H2 z0~t4YJCmyW);n(1x0&*WsQ#LR01%h4ey_o0rbfOtEJ*w@k7&I5&Lxo z!ttaQ_p7cHxv}YbIb)18gk*1#qjQX~+{&R>(Qx@Vp_T3G^vv}BiZerI*S7z3=j+f!XTiK{5}#;vJ}d%W-uj=4y{OEMrJG->G? z{{RTbu+B2wbyRHWDF{O30W%9% zZQ4T9rEJq_=C}MbHrQ>EB`?Fe;G)E;6e$Pto z?Dh2-^!sPmC$9Vc1)e$O@k!xYgR{Dl?;C2K*i%Oh)&^o`tf6>iT6(5tCw2;?Wcr4T zWcY|)C6oz_hGDw~cmQQuA+z>}w!RR%>wVHa zu+(((#d(f9l$u&O%T`dOJC%Brj|G|$9Mdb2k~S&B0OB%F7oEp83R^GjYBZKAw;}f? ze8qUAZV%rpjC$=;_v)N!KJnlCkNA#F;wI&Eks=z#p4n+vY#)PKzbvYc;RQ<^dz_Q% zIW0N%Vs+_FFbf)JhO07 zPL*YG5&;fAp3M;6+Gh4URaWSK6ISZ_i0dM?UTyL!quZtlD-!-**;)3IyQCZ-EGCE- z{o5C{x}Ny}p_Yb*VwCZ~vP)Hr0vSsHx%D{YpFy9mrCz@F;@#b^3zoaRO*6@Jv{~V= zwNyhZB#TiT3hJSOA1k=p+2E@%_v%|ic$KtxiS16Cj>V}XN~?_qbpi?1=A@D|{{V=N zLWF?f#?~3mS+?Y<0cF)RswQ3e?ff|%W?oLCU0Z%8xirI&zyY6~S^?w+mcAgh)ynZ# zQu=BHmV%P3R9s}JK+7se%E#%?Ad{b$oM8LX&3|{iYtGl#M(2|Z z08pVqgMgt_D8LE^&}=`A9`jjrMy!uW_J;ipR95JGyQHbK#%GY=Q>i)gSOUAq1xDft zVlWif8>OoM0B*LyZ_?=va>Xyk*NmUeAq7TBBmoKA>9kES=YB=%M%^@N)uvo48y{u` z_no8$E_}G9cUq#TsS^3*-mE&{h!Wb4vuSwgV2bTUV_JQY?GwKiB^NiGfL1EeM{LjpCz)5;%d8pOBy*nX*n!Pb8jwewnRy%Ilob zTWFv%O)~{m1Jsk#bix)mqvq4<`sb?}v@39>+;#mM`O!aUJAp50W|IALs(EOpU*Azi zsV_0b2XJ(3Q`_LKk?rYkJ0+!sm&@`3vD+d934xU%lk*(6 zLK?$KUo6F}_j)N2&}11GllT7s;CLUZPP=idBLL zAwcDfj$pLL+1F8N{{T`#gUfc{-ZEL0yQ7&_|$ixp`S1q}Zp(iJt4AWo4-^GQ4!v6qeBln$@fC6LE8Pm6ZE>M1YP8TxMP!_mS*YZl{&}Hq zokN(vc7&IbLP z_L%75cob6zr}GuL9{3o*9cfh+NtUhu0B=7hhdY;@0+kbVvJxbD{q{au6zwf#G+MUl zQC&wlp4AzW-%nRh=0Q7vOGTCWfH?IbzMh>9 zQY)>LmA8wG@Wnwz8hPwkf~$bpB(W+0SwYxBsXuD1670KXrF4}hH`Q=ofQ+E}}Xs;svUgM(Qm3{uujEKh?h zmD5EU!rOr&3P_AdFuRG|!6V?t;Yr{N!&Spb>8JBM$=oPu=(U!lp^hkjvve+|UxR~a zz?+4PdMY!!ox~_=VJ5P__gAWRe^-5F&ko-r4!NJ}WB!Pj)OU+UEjdx#C)tiO73R^gI$~t06)<1SN z5{=QPuseZ1$Eum6tyR}5w5yd_Rj}|!F~u{XWk{7 zVsp9e>M05D=?UdMAP~lXT<+We?&o5){{V$<<6gTn+eH*Im>*iEYqQmFaTAl*HPf0O>WJtI%&6Y++!942l3EmA){{V_| z_IvR6@ON&Dx@jELllPBP@41~XPFZ58uP~ADl*LBq@)VY78ZGjMW#|<9PUf9H@o8ba z{#>1b@(#jA!CJ9N7I&x#3h`tD(j>Vo>;sbpn8AmxUK>0HcmDv!k8tR_WuP=&RE$WH zvS}bOLq!6x-89m^5)=hM+}nvDDx}@bma;cy^@H_sv;NZlR{9h+egJqLvy@+SR21 zGfe*gkqb8Mkq$sRQBUzz@5STArhvZqUDDM04x)tEdW^-qNURN;fg3kjekX4eCWXI3Tm_1Z0!#k?b?o znC#w(?^lcd{?K=!dmT|8l&H8xEqyPd$k-lS=h-9b%TUp`uVFm?3r{a*-;e zC;;hw-n!atO{pcc+UkV1>mxO`-pEGA5VIpN#~3WF_Vvdeu2Q2)^4pC>up`K`moCMJ zu`D=9)Ya3gYh17nQeQ3}Js?Z5f)6^Xpv>IUN6F*xU=Xf5a5Pg3NgX5fTP)@I$_Ik-0^(SH_nl z5Z!s_XforbjBYiZtf=jEipQliecB8BNXvM*)JqS;FcL^XP`|v9qz;9QhiqP0Silb^ zb^Bv>w&)F62BEmy1i~o;Y+;@~@zBy+uJp3`H1afL=O`vC8-F3k`F;BSTb+Dk%czvD zJ#g%Q(DX`__-XKx<9zaM%iw=y$&$Lob;Up#u?*5q%rZ^}n%(a1ZLhnUnhT{Bv1q6x zDI3Vk^8ij6+aFI}KA&Edea-A_9n9`kO`AY#`Y7#I+E;JdI*MZgD#sf<^7(Nqw!p{| zG*xGIbG43EEd{VB>Jf-c)*lh9vrM3Eey6i`13ceyXC6 zWMX=EiORYkm~r+XdynPyLesO;ZA=V18D8*I6Sqy&~`$>!g^KAaGDtC2TTx3sY0+ zgsL)AD0%B@nTb{d0JeXK79;r&=-|6)I~BsZzHK`cloqv(o~m|Itpph?>@x4@r)TCl z+n?gX!uW2`fB1^k*YQRv=&s102@K7&LvD-aGCB4Qh3Dz@-OGxpOem0GeI19quo3jr zHnzcQ3B&sG=`eh?A3@%oMcI2i{nXQjN*X&21d-a5rXI4kMKIFAy9Wawwuy5X-!Nc;ck~{7>_~05tE{*zEf+fjkhAUPRL<)fO;b}TXKkTW633P}$NL;uKHFYw77I6- zJtQqI#U!>5KVSF%0Dg-`f;&E$NtGzMfB{pNAOHYzOY?^%hM`xizS5`@!VsEcgfqJg z0-{T^dP@n`@Ae{^`)WFNtvtVpfstK6U5r$Ke#bx1^X=A`VY`8QLviiCwz#a9OD)0t zge8v1asZ4olFfiHa!DK!j1ktg&$&~}s_Ev6rYcoQcSkcs%&`?Y3{gnm>G^sa?uE1V z&O4W<%UiDydR5WNOmBcr;~MP^>F9a%89jKKN?HM^0r|8ax2ut<)b76zP^Bs^SV3sq zOnH8zIyLTP%7ahPR@`bSeBhK*NT?Slg*o*1#(&HCXm~xYw`-oyU3E2@&?u^+s**aW z5=@oB-;i)PK4JY29>buX;de!^9kisqR+gZ+$j=Q`3?vtKC`yGmA$cgxxDBHtmfO1* zhrabycIUPFvgK0#WQ=L(=&8x!=9o&^`r%d@=zF)y(PEay-fuSDxh9=@u*S#=!sHCG8qg(=jDVL(4FRFYH-4DdPh zaV6X&b!o?+G{Nh z%BS|N=B;2yibB!^3^1$o8GHafynE-UeU#JsTd{qqhSht&)7a@KEwV{e=-Z_yV@V>! z4ok>>b}W4WXJdiN{i$BHH6ojFDNq1uI1XAv%Wh>{jxD=R@LJSTjGgn>9~%H*=z7G|jPKbNYr}Ykz(E4AsG!}G*uUUn;!)v9N&7CM@ka;gA2_dFqgj4f4 zCPTp;G<7|m(c%99wDni*MN<_#T5j2jjm^zXZqmhb?iI^%_WoTC#@Q&lG|6aljHtfD zB&jKW6CsRFm8*6C0L4K=6H!c;A=m~^9x}t0%=%u*-TSVr*E3qF>j0;QcWS1Mu&z*$ z%un}6qK{#Zb~$0)HBO|sMNOulxzy9mRSKj)`}kC%^mq|eGd5l&86@Qd*CYq>{Z zn^Q|dC9bQo{@UO`PyKv9?a!T{M-5Pghog@pe-!UBaouJP70_ z@DI$+gpni2uK0jBoDDAu)uWCl7gfHpl4ybksO9({WK8T9?*>?MdH-b zSF&Oql^$zAia6((z?kl5@Iwu1d4`gP6E#xJwho8F?*o%OP%o=QvgynfQFx5*)zD%=K^ z2UGH*sU(1YW-QDJ1m<-*6e`pON%qLe*oX`c?GdWon^L_stqD_kha0OBG64?F67i~6 zbM9A*PZ!J}EFVkJA?YchMbiBOD6;$#pQLKJr1dW-QL6Zs;bHE*2-^7Gk z`*p7LPlVfT^(*AY)sh2B@B3f8pr&5~ay9%vFMfO|n!P>WvC?0q~?bVGbfy50_CmV#Uj_C*o@g z{yriTnSqZEUEQF9?r_1_--CaJxv$pG{<^z?qNr=XXx?G4_J#|!D4IAN`J%G)v9}CW zV|ZX=k^cZO#|#Tx&l0`o?5AWjHQTseBKxBSu9B8ezXKh}nZ#tUf}T0bOwXc}9cyF+N&Qxz?yFNCq$w7r%|g(?xV_i@1)MLSN>?5lzGCc601{64$0 z;(uA&7N=d>`+1`@{S=1HOy+vK<5$&S)m)k_s~lBsKX$T6WRX;i1;T}uPOY-b0%3uJ z)r$#kM7CI#eKu)an~pUGcP+?c+&@{t3<*nHylrbg79Gf`*Lr74Po#8il6fh#tXEn! zg`%otDJ@YOiu_QGwyG{xoH@%pgttvj*V=oj-^!M-_A9oZw#_1{R@cQU!EU6;z%tax zL{Sn43K^ZfqdgM#Bk`;K&e7?LNs>x26K@Yq?tJ^PU7c3QVp%J zSKRKj31g&{s%@5tGO^N8r6sn4JaX7ju|l~7<<3tepIm0{?xi|lQW3IS$Tkaf96`G2 ziXGJ<-Yf$fz!=Lm>>)xhOHF6)zkn;1i%il{cN4p7CH}oPwFa7}Q$C>2!JvmJ&^D;0LheCb$=O2EKJZt_YeTdLjw&FN3vPnfLspn?mQ21o?EZq4e&#zVfP-Bm@^LTUgBd@~s=e>PdN z#Es5${{ZhlVf&S(FP5DvX6`h#)K_{&mK(KIgW#GVr9%lKc_rs8xcPuN&JF^R&gS;h zRd{FD8UsM;uKn3HW#?Y4eD9^GEFMi&ii(XDrLC!`TE|v|w2?-?@bTtJ6#-^DdQDw> ziQ}`qwdYT3j`ck?9dxMmqRC^5f<_6uXxy=fiALu6Rf##}j~Q?FyS18Av>Hyj#iytu z`0KS)RaeWTfHg&9#F8p`k{q+`^JF7&INaY;)mw^JDhMK@2JsEgCgnexBzR-<4A{`L zp>Ap_m@Aen2xd@`#6ZX+a-axl2X3cO%STlxqbJM8(Vub9rP`9eQC$TMDwdL_Ok|!u z`9DAh{RVT8=&H^?*+>_~%v=jNd2-ID|T?46&9j?&z zPXv3bYRSS=sRZpG-hXrb)ye$CbWw1@w*&T_{dU>(ty^kpsuq(6r@ngfbF6*mvL(vh zZ|tq6NgXdk;`MD}f~WR$XDt>%C-<(qPq0*B>fAv0*SJ&mAGIS+S|o)vX0i}LO+y>5 zE%ciULkG*Bn6K}pY~fW=00$(H_PVl5mAB1)AFvJwMp&eQ_{mO$N#(%q)ey}9geoYHnXjXYXn%V$F^bTPDxIACNm zZ9-a4Gk2N6EXDnEo~n0(9V12ILV`ZwYpSYasc&UsyxgFG$m)Vfc3SAv0^3Zo!lWn9 zER4B004=M~+6!ChZq?d5U2_F)f}UBc)G%bDR*}l7VUR*5#2Co=eqJ%xJ#ko6P*r+l z!DE(lfCPu-p15sYua2!WQ!Py}Ib^z>ngdA&NR56@J4xG(F{t)Mf}yv@A_`cEG83&asivod1RyRC&FltGKjqMQsjrffYFZk)m^{=g zQ%@YFM5up(fIl$w;Qce~dY>>~XVVXFqOnIPt`V@Sbv|TDfPxVEV3YF#4=Oz|*K^z_ zh^a@H(iB{ocLxEPfF$djsZ|EtB?)33&OyUNM2xxL$Qj$NR@;`Bw$W5sDVn-@nn-RC zRwJJzGi4qyHzSh3<&UIb1;-?%sSsPf8l4rkNgE_=xdUqk=jskW*QDm3{jH?qj^gn& zk#0FS_Xm;FV@vnbK-`#7LqQZ(6UP{oTqz4GNEZidq=;8I$p>)sI0v4-Qpg2EZ`V_T zPk55JBshKB_4;T}#U_%r+pY_E()24wW16U=Nl_@&0mGsMxOvScHuY(7R#IL;V?I=6KCrn=uGH%&iTAf8lZNMndFnSBZv zjzgg%Zq@`hBb<}cqrDxbvso^7yVjbs(^}%b$ugT|KbRt>sEDVV8mxnI040p<%LLq0 zc2SWz%XF`?5TjAn9QcXxF+c2OM34CgC;gfqwx`<^`*n1v6WxH22m%iXlei8B3^*m7 z^n3Vn_B&8&Em>dUdii6Kbk>G~SNOT$VHCG1X{Jg#WnwU2dwIlXgp2A&MxH43jpqGy z(O0XDW133CRSTx`gZs#dRvzJ_UB7UpeGe~cd-bZ#;2X1jgzT*qMIFB91p2pJRn*lX zHTP3Me z#gFs*=caas(2-u=v$~zZ)HMl9Z*_WlI#NC&wsu?%gymBTe>upFe<&r(TlqPAP3 zU~nQCeEW^3KlJE+ZCzU&KeJM)nNuND9u$8+eDo`7X}SuyNiMmVIgmXY%ZsLkTeN8& z3TYkyA->QNkyvh$k(7x%v-~nD665MneK?A&v()M;N}4*wX&|eJ$5RqE+^ORr z`l}CS7$Eb|b=sEorS9oVafVYe#u__Mqn%U&j07 z1DG4Wl%r7yxZ_U$01sc0&s{(9J#1OLC~6ChzUdvpXQiPLTxr({Sqje?hEa|%%KLyG zn~$*RJ$CS?Q{UeNI^Nc$((74lYKt7~yS%rhT#N(hzb>Tv1|Fjz#CSsQP0PCe6|bF* zsm#^dZZwjSavA5fmn@%58hMzh_So^a%Z@H(lT~OR4c-`NHKw?=&E!+*=p?L!2-P7o z#)rrZSZ`u*qZ!End-eJ6Y295~_KIm!P#gn^M4g<1ctg1Guy`OH!Ph_(iWUkgM;Tgx z0yZvjB3p!~5Hjow@AQqrctf z?>B9<6aou2u&lCaJH2cY$x%R(ZZ&L=DcaLWPQxN11c(Tf1uSH+eaXIDqgbp~$ekc0 zg$hnENhjCTl1U`;PD#%_bXGO5YoI3aB$S9uFqbYlxHGtHV_x3Xp<1X#1d44Wg5;8V zl2|sxiFwJ&_lmP{TPBF8tTMDx1g5pqup0uB+hc(;a6W;KGIM}>(6vu)t+~%rcezOo zEh2-kqrCMEjz`Qg8JmorKy3B$$47RhR+7zgt+&@x$jR|m>Vp)Z?Kx1&Lj&!{)cbMK z7K`ouzQb#0FqtL%sHX%d9;ff^`t@f1*jBMfT3J(^1HMZ{OMfwF*WkHVh>^Dc08Y7Y zgIc=g&!p=0RnpTe(Nn_GQ(53%W+LgUgS4yO5&k{- z6CTj)di{qryHVgfzgLS)ce^)hio#oDb$5!tBYr=)j0=??WXJQ)8&y6CJE5cEx7~F| zd33Fe89sRAvenHTV;K46NdtTGRSCv@@I}+ry6T5Uz}kmgY6>e*Xv|jVCX)paj#fDR zS&yddALs8`d{Owdq3!;Ix_1V{+dI~+nv#{i0yceabTB3NTLcDB!1QsW^rbD*o?6?DP*|e;+2=U+@!m8MGU5*e?Y>lQLDr1b{NGJTW z_UT=!v;%94!*=T9Q!RB}TyfND86tL$I4MiyQ-Fj8^9o>$l2J*|Jug+mvrs&ldkQCH@6c?eJ!lh3ClA^W4^qS4{Ax3vjzxeMl|si^pkOJ<%VdIU77l*!=2hCOX6V(E%4!hXYmOw z!?upQ*{5z-*e!k?yJ=rV73Wh_8E!ST6|us!>$QM>PD;fdaHt7U$OG4>M`e3O+7Au- zN*Jgv6w5%n1>;v<=1N&Eje*2_kC@R6e(o6lP(F6aC7YlA6Ry59`|sS!{^r4}YV?H_ z)o|Ae$PHD(NjZ)uzO>bo ze0_b|y8+gYI?9d2HzD0=A^}$z!DV2L=v^eS6Um(PW;v4k0|f7)roAd78$;ESjd~G=PE9>L&O+_nNksWdk_lmhk~sl`JG&k~b_H;-r; z96!zS`}~YDcpWYHJEc=AE&&oV&yaj>?T2_8T?@CkswtGZfnnkUCmi6H^Kra>ZTvmy zbhv61*R^ufG!~auG_}-%qB`^c0PAHeK3}Oh_27H;HQ!$ASo=ewsWjCbKNEVYgwC+a zgKZ#oCoRrP9Fy!h=OYS3^me?sXkKsg?n2cEY3W8vMq z^L)JO%~yJx;4Mw4(J_7pI1ZV!#5XcHsaJOps?fEsv;N z4E+Oh>C|2KKv&xgwDCw#i8Ca}jes5i{d#=qEf-W#s+!Ra1qCV?ZMN!v`E;=YO2)t5 z#z|*9yApbd*4?+eU*?Uz5#y#AEip_h@^CkLA4Ab?YxiBFRcNQe7F>sLHWJ=4T3LWB z&IIE5KaH^N>Qv$syeKTiQ~v-EOC)UWNE0VWd#1I$J#*7bD=I1~6^kJT20xJ?ay|J! zUYY&9?QWm3_GkY9sIKX2X#OGQdOa7VDWvmiYKp$uDyJL@YIH8aS0(3^@D(F-CywxT zlKoet?UlM#7^SAOz(rjW9j&;Ww7=sd`umOm-~hNga<&~;+e$$!d!Ea4^O^|3EQo(L zRE}E%aK=FZ@*Cw7yGrtn>Q_pD4wx_DGXOE?mu4*uof5;c6WNMI&2mUn5EIBKJHJNq z1@WsNr?pjGv$c9-LP-;arG_@T1N;LyShMeda>vsr9W49d+xv{#-pwV!8_Kxdq=>(k zTYDBpBkp{%Nc&{^WQUv$+Z{C>vJ3T6)ryD}mT4GAN`-*(!#}GQEToMN4#;~;&i92pB}N1C02y{*2!ZDB zue)2cY2R6zX#^y0e90{%%!kV`-$J)2F87U4Qs~ocfn-IeX$u3m5x4{Baski3`r2;* zw+_m7&Vu=W?v|Uo+;tlHDW+qg5ttMl?`PlWz~dY?LExbSBNsg>rMrh|xA#KJK^#d_ zOBtFthXe#%AJ+$>TP2E;f}SdiEQUNTe8l|2pZayuTvk1yWB7EHQwKaG4>0UmWV&n--7YuTK+VZl{ipm8+Vmv?; zyN57La=^xkELv|=R%q*{u(Rpv+3nWEM6R!fhF6B2+~EVrs#Y>c<9SeixgZc7YWI89 zvXVNw$sRg(l3G}lZSoj}RzOBK1_-=1a950OZkV<$Wvp$QL3?{oaY1Y~a@E5O)X}+$ zSr8r;Q>TOp05K{&P{f}IbpSK0J{h&e7jHXC61R~%sQNAw*#HFc_!y*KX7 z(q7s*?3yz{Lt2#28#$fC%^b)d@`5B-!$wFTN1PCO=db%Q2KhCDc%LrK2|U3)NCXK{ z=JafCm33~4Yd@5hEJ+Sr%l@O3hDui{+ph_GPGVD;(qEzelF?omi3C(wBffcW~>j;`Nn zxcp5lL3i$A2l27>WA^_5Q}!K9+Iy#@^mdz`uKxg~>n^iaMq{>9QZgEO4Xh zdaql#uAoYXIA(2}&iuJHrYf?4DGB!(cEEAA?;yVV8m6YHzfd&|(xO=9m3K2Em0*6o zPFMEkeQVpgO$nmAk#^DZ(%cqXrAC^HAKDeP!B}}P$uYzwnZ9X4yQoqZYd-b!M?rg* z=Pc`LSm{^g^W=U`2k@>vKU4gVP+G@d#i!}2Yb-i0mr+(z#KNA6x^ol{DN+}61ZGkg zt8g>M+>C};L>bYEe_O{;iSM zt1;=Wnzc$)5yDwSBBiIAq16{^AV5hx4C6me zc<3gZTWacxI=iNc(UtdGZ6)a}^*0JQe8pP!iKX&3rdX9l%P|2}h)nOws2_<9b*dwt zrt#dpdNlMDN@BOTn3HXRK|WO+WR`lS87(;n%Ns)D18_%XbhZBgwi*_%Tg`sF=-oT0 z=&=o!-v0m(cD+&%N0}_IlR-+si1S$a^KX5Mp~ITUO>0Uk6pN`s3F0#(JCN~^;7gLm zP@_>7OF^h0IV@O~9hR%&aTyrJrD zHGq|hnwUN?H$1Yw$kq0RBRXfWANa4VEyT+${itbyI)b8rQ&WJ)E&Dcr78G>k=Mzd^ zd9%A9J~}(omRlV9A_;1=tu+;f33u4^wJbhWBT1i@d6(99Cj@zgi32U4PNy}dsj2PX zY^r63vRX4a`0M4sF^*YLu(8Ca)NdeweV1_=_gdD@+Rb33l@R%7bCcoW4oM`y4nP2$ z68iS;=_DnP6hrWa9*$3zNhW&erVSTWpe#beVS*?imT=cfzdRS(qi_%Q8-FjS1CL&Z zb#HnmxIsxlPgg2gEt{z=l*r{;qE`9l2z^FamXbls6UoL0Kz)t4>OD)@c=e8~yG=`P zy0yx_^>Ri40SoMdqG~7JwH$+fVB+zpNGtO%W6dxx|EJ68Tm7_4WHDG_o;4oRco;dGl0sg z!jDgXZ`ZF)u2W4~-%?J-FDfxfZ>fe?Ne<(%sxq)4$tt^)h8$pn&r%)I?zdoj2S-D1 z?hd1&rJmzg9W}m%<=rhr%)kT+ip+ToxbqC@qlABY*4c_~7j*{18UHf;4;)rg+ zke@-dMgjCt%tzFbHzk4yAui87AYysDFnKyXwF2s@gDDOMAZ|(7%K;>vwa54&y46w3 zd70gp%`w0T$R~zx>Bsfx%eLM6m$v#+rpKl<#3Ht8k2dRBHC&}@fEYybi+ORB`G}E5 zTX7AQ$s2m3PhF(a)K+aDY-*;enQ2w&BFH%)?2FeWm~!5ML1UctmiO8FPi(BP+qEP= z9d@}>3c96*io-!g9EwXh_5I@wgWZ=TdXBtJ^_uO)C5ch+ByIr&l?*V<%8oUv_SaVR z&B7`$V&u!dKm@$c{=Uar72Y6xOZOh0MD31;b%j1zDyXSlar~H-C;tF0e^038ru*WT zO#Jl~NcRqhv8hWpjZGI&VDWUsr_pNI>QB&xsy57?DJf5Nyv z-AtuQooZsOB#{%l*?e?f4Z6iKH=$l*=-WYo^nQGic`u? zfUIQt@g!Km=Okm)W37wqwwpbUuG4JO?_m?9F#gXJjS53GKg%r22pc!P>;=FB1oFUj zn?!1gd%d8gZ9rwF9#umIA1rR)U!ZI_`W4SkB9%&Xc+%`h*qo27v^yL;>J18(_caJv z5*?+E%np1BF7|ch9yW6#ModySrn;Z zoDlZ6Ro(8Fn~s}%B}BD!Qkfb!!jCc^MPa;v4<4EI$scGR0e2Z~mo0tSyYwv)mh$&X zSY%ENk|M=WzhWLRNcF>gIxwmlqqF_Z8j70A^|ra;dTPjwWVCr1M@9sGU+$7d3BU)c z2o;AIX^w*foB&Uj&c{=Lq`EZt$s?@pe7Zkf9CqUErLXt8G^xH*ThdC%>Db)d!{y5E zu_7?RAekLkfI!Yk+6xADp|#z#)!x5H)zOG*=_=j|wUe14mNqKt3bx#W2tK@y3E=dP z(pHEnrTCVbpfy2u6H-*PG8J-n1#}>cf<`|0>d0E`cI(Zqn&CxSwG{KJ0Xtwawg7G8 z_((anTZcfB3mxpx~>R^Dmpejc8sgR}tWIVWg1 z^#Fe_li?-5lw^?dvtL^YcBU4QyZI{q;{$or_9Fp&nTanTi zJ)ub#D5qD5C1Flm!onp^4om=*xe^G`(PV_uH4w4JlE4=Pad8J?lJGYuXLrNd4%FT1 zfAG510x*9s%{kqX%d!6eL)P_GU26hii31K-<@f1l*k2JE4^8O_w8iI1+$&*e{L57F z%jL8P!<2GEXP$BXe*HA9x}!vDX(Ff7_0yWNo2I5}W+E;!0daw!<INRB|Olmz%9SjbaIQ|>_ z50%Dv=Q#fWFXiphpSyj@?YC|8WyfD@eQiUgwAGvjyJ}jJ`&y=(vU)D_s4C)+`89W2fuy4+`{o7AvM;_1$Dh!KG#|enB|GKg zBUB>y&$@RxmKbD9Nossst%!N@Bc_iL(!@su!4PIUL%C9N8gy^3RIc!Fq%$}qk-7Y$ z0D;bMHP}?Pu(AOZ*TiHNW67pRF)$tysnyHzWBA+E>Kb}04}~2cQDd_Rnwr&l?lsCW zTXc^gil2j`3L#U83M`TaV8ON=0z&(H_>ZNtOIRMiv^V?ay{USbQvU#1+!p(OV;^uD@2sl3g_w+L%WzPy;9+NBQD_56g|Ah7ThQeW;pU z@@Ww-87|K_XZL)aE8TEgcZLH@L-dV~-mSKYduiIM&vN^ud&A$lr@GvuZ!(h8QcF`( zD*Vc!56a&+%zbi352iX~>S}N8-my`Ano7xwyzx@tu)^muFvrYz#!31Cj-k6vd4}gS zjY~|x7=B`fh#ZfpI6V_+{Y7J?xLj+iE%lXgTq;(QMyIEJp9>D+>%0u@l2TOd{uDfo z#D)rLs-mE{h5`9<_w;Wp4(gpGoCDAII-R#z?bLQu?jE&?R^JN$0QOp0z{O*q{{Suz zssIRHK68`#N6d`zm8@Q~x6oW}mBNmedxxH4VTPGi92p24pHQp%oN?2GQEF>DP;$WoGUdi3+~lXx&#W&YqT9J9V~{KpSOI zU}~n=2coMc)jvU>nfDImM*Zd2 zc8w+4iyvsOw9eGjwn`Z8R@i0R9c63Nqop44>Zyn*K>!RTrid{tNcBZk-tCdV4WCY}M|NoCyy^NaI|9KaHBESG=cU8Ro4|JiH3SGE8E From 27ca4cff2e71d152a91a3cb5818092f7109d9ba9 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:43:44 +0800 Subject: [PATCH 17/21] Delete 'extended_result_174121.jpg' --- extended_result_174121.jpg | Bin 35499 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 extended_result_174121.jpg diff --git a/extended_result_174121.jpg b/extended_result_174121.jpg deleted file mode 100644 index 4f086d226c25bfee93a6396094343c89d6b7556b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35499 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

E+o4hBlGUPG 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 Date: Mon, 29 Dec 2025 17:43:49 +0800 Subject: [PATCH 18/21] Delete 'feature_extractor.py' --- feature_extractor.py | 103 ------------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 feature_extractor.py diff --git a/feature_extractor.py b/feature_extractor.py deleted file mode 100644 index 32d85b6..0000000 --- a/feature_extractor.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -风格特征提取器模块 - 基础版本和传统方法。 -""" - -import numpy as np -from typing import Tuple, Dict, Any -from abc import ABC, abstractmethod - - -class BaseFeatureExtractor(ABC): - """特征提取器基类""" - - @abstractmethod - def extract(self, image: np.ndarray) -> Dict[str, Any]: - """提取特征抽象方法""" - pass - - @abstractmethod - def get_features(self) -> Dict[str, Any]: - """获取特征抽象方法""" - pass - - -class StyleFeatureExtractor(BaseFeatureExtractor): - """ - 传统风格特征提取器。 - 通过计算图像的直方图和局部纹理特征来定义"风格"。 - """ - - def __init__(self, config: Dict[str, Any]): - """ - 初始化提取器。 - - Args: - config: 配置字典,包含特征提取参数。 - """ - self.config = config - self.style_features: Dict[str, Any] = {} - - def extract(self, image: np.ndarray) -> Dict[str, Any]: - """ - 从图像中提取风格特征。 - - Args: - image: 输入图像,形状为 (H, W, C),值域 [0, 255]。 - - Returns: - 一个包含各种风格特征的字典。 - """ - # 确保图像在[0, 1]范围 - image_normalized = image.astype(np.float32) / 255.0 - - features = {} - - # 1. 颜色直方图 (RGB通道) - hist_r, _ = np.histogram(image_normalized[:, :, 0].ravel(), bins=32, range=(0, 1)) - hist_g, _ = np.histogram(image_normalized[:, :, 1].ravel(), bins=32, range=(0, 1)) - hist_b, _ = np.histogram(image_normalized[:, :, 2].ravel(), bins=32, range=(0, 1)) - features['color_histogram'] = np.concatenate([hist_r, hist_g, hist_b]) - - # 2. 局部纹理特征 - diff_h = np.abs(np.diff(image_normalized, axis=1)).mean() - diff_v = np.abs(np.diff(image_normalized, axis=0)).mean() - features['texture_strength'] = np.array([diff_h, diff_v]) - - # 3. 平均颜色 - features['mean_color'] = image_normalized.mean(axis=(0, 1)) - - # 4. 颜色标准差 - features['color_std'] = image_normalized.std(axis=(0, 1)) - - self.style_features = features - return features - - def get_features(self) -> Dict[str, Any]: - """ - 获取最近一次提取的风格特征。 - - Returns: - 风格特征字典。 - """ - return self.style_features.copy() - - -# 工厂函数,便于创建不同类型的提取器 -def create_feature_extractor(extractor_type: str, config: Dict[str, Any]) -> BaseFeatureExtractor: - """ - 创建特征提取器工厂函数。 - - Args: - extractor_type: 提取器类型 ('traditional' 或 'neural') - config: 配置字典 - - Returns: - 特征提取器实例 - """ - if extractor_type == 'traditional': - return StyleFeatureExtractor(config) - elif extractor_type == 'neural': - from .neural_feature_extractor import NeuralStyleFeatureExtractor - return NeuralStyleFeatureExtractor(config) - else: - raise ValueError(f"不支持的提取器类型: {extractor_type}") \ No newline at end of file From ca034d7cc74d80e86b6618e24eeeffcbe8b842e4 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:43:54 +0800 Subject: [PATCH 19/21] Delete 'image_synthesizer.py' --- image_synthesizer.py | 171 ------------------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 image_synthesizer.py diff --git a/image_synthesizer.py b/image_synthesizer.py deleted file mode 100644 index 50558e5..0000000 --- a/image_synthesizer.py +++ /dev/null @@ -1,171 +0,0 @@ -""" -图像合成器模块 - 基础版本和传统方法。 -""" - -import numpy as np -from typing import Tuple, Dict, Any -from scipy.optimize import minimize -import warnings -from abc import ABC, abstractmethod - -warnings.filterwarnings("ignore", category=UserWarning) - - -class BaseImageSynthesizer(ABC): - """图像合成器基类""" - - @abstractmethod - def set_content(self, image: np.ndarray): - """设置内容图像""" - pass - - @abstractmethod - def set_style_features(self, features: Dict[str, Any]): - """设置风格特征""" - pass - - @abstractmethod - def synthesize(self, initial_image: np.ndarray = None, **kwargs) -> np.ndarray: - """合成图像""" - pass - - -class ImageSynthesizer(BaseImageSynthesizer): - """ - 传统图像合成器,负责生成最终的风格化图像。 - """ - - def __init__(self, config: Dict[str, Any]): - """ - 初始化合成器。 - - Args: - config: 配置字典。 - """ - self.config = config - self.content_image: np.ndarray = None - self.style_features: Dict[str, Any] = {} - self.synthesized_image: np.ndarray = None - - def set_content(self, image: np.ndarray): - """ - 设置内容图像。 - - Args: - image: 内容图像,形状为 (H, W, C)。 - """ - self.content_image = image.astype(np.float32) / 255.0 - - def set_style_features(self, features: Dict[str, Any]): - """ - 设置风格特征。 - - Args: - features: 由 StyleFeatureExtractor 提取的特征字典。 - """ - self.style_features = features - - def synthesize(self, initial_image: np.ndarray = None, max_iter: int = 200) -> np.ndarray: - """ - 合成风格化图像。 - - Args: - initial_image: 初始图像,如果为None,则使用内容图像。 - max_iter: 最大迭代次数。 - - Returns: - 合成后的风格化图像,形状为 (H, W, C),值域 [0, 255]。 - """ - if initial_image is None: - initial_image = self.content_image.copy() - - # 将图像展平为一维向量以便于优化 - h, w, c = self.content_image.shape - x0 = initial_image.ravel() - - # 定义损失函数 - def loss_function(x): - # 重塑回图像形状 - img = x.reshape((h, w, c)) - - # 1. 内容损失:保持与原图相似 - content_loss = np.mean((img - self.content_image) ** 2) - - # 2. 风格损失:匹配风格特征 - style_loss = self._calculate_style_loss(img) - - # 总损失 - total_loss = content_loss + self.config.get('style_weight', 1.0) * style_loss - - return total_loss - - # 执行优化 - result = minimize(loss_function, x0, method='L-BFGS-B', - options={'maxiter': max_iter, 'disp': False}) - - # 重塑结果并转换回[0, 255] - synthesized = result.x.reshape((h, w, c)) - synthesized = np.clip(synthesized, 0, 1) * 255 - self.synthesized_image = synthesized.astype(np.uint8) - - return self.synthesized_image - - def _calculate_style_loss(self, image: np.ndarray) -> float: - """ - 计算当前图像与目标风格特征之间的损失。 - - Args: - image: 当前合成的图像。 - - Returns: - 风格损失值。 - """ - loss = 0.0 - - # 1. 颜色直方图损失 - hist_r, _ = np.histogram(image[:, :, 0].ravel(), bins=32, range=(0, 1)) - hist_g, _ = np.histogram(image[:, :, 1].ravel(), bins=32, range=(0, 1)) - hist_b, _ = np.histogram(image[:, :, 2].ravel(), bins=32, range=(0, 1)) - current_hist = np.concatenate([hist_r, hist_g, hist_b]) - target_hist = self.style_features['color_histogram'] - # 使用KL散度作为距离度量 - epsilon = 1e-10 - kl_div = np.sum(target_hist * np.log((target_hist + epsilon) / (current_hist + epsilon))) - loss += kl_div - - # 2. 纹理强度损失 - diff_h = np.abs(np.diff(image, axis=1)).mean() - diff_v = np.abs(np.diff(image, axis=0)).mean() - current_texture = np.array([diff_h, diff_v]) - target_texture = self.style_features['texture_strength'] - texture_loss = np.mean((current_texture - target_texture) ** 2) - loss += texture_loss - - # 3. 平均颜色损失 - current_mean = image.mean(axis=(0, 1)) - target_mean = self.style_features['mean_color'] - mean_loss = np.mean((current_mean - target_mean) ** 2) - loss += mean_loss - - return loss - - -# 工厂函数 -def create_image_synthesizer(synthesizer_type: str, config: Dict[str, Any]) -> BaseImageSynthesizer: - """ - 创建图像合成器工厂函数。 - - Args: - synthesizer_type: 合成器类型 ('traditional' 或 'neural') - config: 配置字典 - - Returns: - 图像合成器实例 - """ - if synthesizer_type == 'traditional': - return ImageSynthesizer(config) - elif synthesizer_type == 'neural': - from .neural_image_synthesizer import NeuralImageSynthesizer - return NeuralImageSynthesizer(config) - else: - raise ValueError(f"不支持的合成器类型: {synthesizer_type}") \ No newline at end of file From 9e5fad485721ba861aa34c2aaf670ac664616675 Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:43:59 +0800 Subject: [PATCH 20/21] Delete 'requirements.txt' --- requirements.txt | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index fd393b8..0000000 --- a/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -numpy>=1.24.0 -Pillow>=9.0.0 -scipy>=1.10.0 -PyYAML>=6.0.0 \ No newline at end of file From 626e5f869ec0cab1cc44a7f603dcaedb22fd4cce Mon Sep 17 00:00:00 2001 From: p82b7rtam <1761133400@qq.com> Date: Mon, 29 Dec 2025 17:44:03 +0800 Subject: [PATCH 21/21] Delete 'run_style_transfer.py' --- run_style_transfer.py | 263 ------------------------------------------ 1 file changed, 263 deletions(-) delete mode 100644 run_style_transfer.py diff --git a/run_style_transfer.py b/run_style_transfer.py deleted file mode 100644 index 80f5be2..0000000 --- a/run_style_transfer.py +++ /dev/null @@ -1,263 +0,0 @@ -# scripts/extended_training.py -import warnings - -warnings.filterwarnings("ignore", category=UserWarning, module="torchvision") - -import torch -import torch.nn as nn -import torch.optim as optim -from torchvision import models, transforms -from PIL import Image -from pathlib import Path -import yaml -import time -import numpy as np - - -print("=" * 60) - - -def main(): - # 加载配置 - config_path = Path(__file__).parent.parent / "configs" / "default.yaml" - with open(config_path, 'r', encoding='utf-8') as f: - config = yaml.safe_load(f) - - # ========== 关键修复:大幅提高风格影响 ========== - config['model']['image_size'] = 256 - config['model']['content_weight'] = 1e3 # 降低内容权重 - config['model']['style_weight'] = 1e7 # 大幅提高风格权重 - config['model']['learning_rate'] = 0.003 - config['training']['num_steps'] = 400 - config['multi_scale']['enabled'] = False - - print("📋 长时间训练参数:") - print(f" - 图像尺寸: 256x256") - print(f" - 内容权重: 1e3 (风格权重的1/10000)") - print(f" - 风格权重: 1e7 (内容权重的10000倍)") - print(f" - 权重比例: 1:10000 (强调风格)") - print(f" - 学习率: 0.003") - print(f" - 训练步数: 400 (约5分钟)") - - # 设备设置 - device = torch.device("cpu") - torch.set_num_threads(2) - - # 加载图像 - project_root = Path(__file__).parent.parent - content_path = project_root / config['paths']['content_image'] - style_path = project_root / config['paths']['style_image'] - output_dir = project_root / config['paths']['output_dir'] - - print(f"\n📷 加载图像...") - content_img = Image.open(content_path).convert('RGB') - style_img = Image.open(style_path).convert('RGB') - - image_size = 256 - content_img = content_img.resize((image_size, image_size), Image.Resampling.LANCZOS) - style_img = style_img.resize((image_size, image_size), Image.Resampling.LANCZOS) - - print(f" 调整到: {image_size}x{image_size}") - - # 预处理(移除标准化) - preprocess = transforms.Compose([ - transforms.ToTensor(), - # transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 注释掉 - ]) - - content_tensor = preprocess(content_img).unsqueeze(0).to(device) - style_tensor = preprocess(style_img).unsqueeze(0).to(device) - target_tensor = content_tensor.clone().requires_grad_(True) - - # 加载VGG16模型 - print("\n🔧 加载VGG16模型...") - start_time = time.time() - vgg = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1).features.to(device).eval() - - for param in vgg.parameters(): - param.requires_grad_(False) - - print(f"✅ 模型加载完成 ({time.time() - start_time:.2f}秒)") - - # 定义层索引 - content_layers = ["21"] # conv4_2 - style_layers = ["0", "5", "10", "19", "28"] # conv1_1, conv2_1, conv3_1, conv4_1, conv5_1 - - # 特征提取函数 - def get_features_fixed(x, layers): - features = {} - x_tmp = x - layers_int = set([int(l) for l in layers]) - - for idx, (name, layer) in enumerate(vgg._modules.items()): - x_tmp = layer(x_tmp) - if idx in layers_int: - features[str(idx)] = x_tmp - - return features - - # 提取特征 - print("\n📊 提取特征...") - start_time = time.time() - - # 标准化输入以匹配VGG的预训练权重 - def normalize_for_vgg(tensor): - mean = torch.tensor([0.485, 0.456, 0.406]).view(1, 3, 1, 1).to(device) - std = torch.tensor([0.229, 0.224, 0.225]).view(1, 3, 1, 1).to(device) - return (tensor - mean) / std - - content_features = get_features_fixed(normalize_for_vgg(content_tensor), content_layers) - style_features = get_features_fixed(normalize_for_vgg(style_tensor), style_layers) - - # 修改Gram矩阵计算(关键修复) - def gram_matrix_fixed(tensor): - b, c, h, w = tensor.size() - - # 展平特征 - tensor_flat = tensor.view(b, c, -1) # [b, c, h*w] - - # 计算Gram矩阵 - gram = torch.bmm(tensor_flat, tensor_flat.transpose(1, 2)) # [b, c, c] - - # 关键修改:只除以h*w,而不是c*h*w(原始论文做法) - gram = gram / (h * w) - - return gram - - # 预计算风格Gram矩阵 - style_grams = {} - for layer, feat in style_features.items(): - style_grams[layer] = gram_matrix_fixed(feat) - print(f" 层 {layer} Gram矩阵形状: {style_grams[layer].shape}") - - print(f"✅ 特征提取完成 ({time.time() - start_time:.2f}秒)") - - # 优化器设置 - learning_rate = 0.003 # 使用更高的学习率 - optimizer = optim.Adam([target_tensor], lr=learning_rate) - scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.5) - - # 训练参数 - content_weight = 1e3 - style_weight = 1e7 # 大幅提高 - num_steps = 400 - log_interval = 40 - - print(f"\n🎨 开始长时间训练 (约5分钟)...") - print(f" 优化器: Adam (初始lr={learning_rate})") - print(f" 内容权重: {content_weight}") - print(f" 风格权重: {style_weight} (非常高,强调风格转移)") - print(f" 权重比例: 1:{int(style_weight / content_weight)}") - - start_time = time.time() - - # 记录损失历史 - loss_history = [] - content_loss_history = [] - style_loss_history = [] - - for step in range(1, num_steps + 1): - optimizer.zero_grad() - - # 提取目标特征(需要标准化) - target_normalized = normalize_for_vgg(target_tensor) - target_features = get_features_fixed(target_normalized, content_layers + style_layers) - - # 计算内容损失 - content_loss = torch.tensor(0.0, device=device) - for layer in content_layers: - if layer in target_features and layer in content_features: - diff = target_features[layer] - content_features[layer] - content_loss += torch.mean(diff ** 2) - - # 计算风格损失 - style_loss = torch.tensor(0.0, device=device) - for layer in style_layers: - if layer in target_features and layer in style_grams: - target_gram = gram_matrix_fixed(target_features[layer]) - style_gram = style_grams[layer] - diff = target_gram - style_gram - style_loss += torch.mean(diff ** 2) - - # 总损失 - total_loss = content_weight * content_loss + style_weight * style_loss - - # 反向传播 - total_loss.backward() - - # 梯度裁剪(提高限制) - torch.nn.utils.clip_grad_norm_([target_tensor], max_norm=10.0) - - optimizer.step() - - # 更新学习率 - if step % 100 == 0: - scheduler.step() - current_lr = optimizer.param_groups[0]['lr'] - print(f"📉 第 {step} 步: 学习率降低到 {current_lr:.6f}") - - # 限制像素值 - with torch.no_grad(): - target_tensor.data.clamp_(0, 1) - - # 记录损失 - loss_history.append(total_loss.item()) - content_loss_history.append(content_loss.item()) - style_loss_history.append(style_loss.item()) - - # 定期输出 - if step % log_interval == 0 or step == num_steps: - elapsed = time.time() - start_time - steps_per_second = step / elapsed if elapsed > 0 else 0 - remaining_steps = num_steps - step - estimated_remaining = remaining_steps / steps_per_second if steps_per_second > 0 else 0 - - # 计算风格损失贡献 - style_contribution = style_weight * style_loss.item() - content_contribution = content_weight * content_loss.item() - style_ratio = style_contribution / (style_contribution + content_contribution) * 100 - - print(f"⏳ 第 {step:3d}/{num_steps} | " - f"总损失: {total_loss.item():8.2f} | " - f"内容: {content_loss.item():6.4f} | " - f"风格: {style_loss.item():6.4f} | " - f"风格贡献: {style_ratio:.1f}% | " - f"用时: {elapsed:.1f}s | " - f"剩余: {estimated_remaining:.1f}s") - - total_time = time.time() - start_time - - # 分析损失变化 - print(f"\n📈 损失分析:") - print(f" 总损失变化: {loss_history[0]:.2f} → {loss_history[-1]:.2f}") - print(f" 内容损失变化: {content_loss_history[0]:.4f} → {content_loss_history[-1]:.4f}") - print(f" 风格损失变化: {style_loss_history[0]:.4f} → {style_loss_history[-1]:.4f}") - - # 保存结果 - postprocess = transforms.Compose([ - # transforms.Normalize(mean=[-0.485/0.229, -0.456/0.224, -0.406/0.225], - # std=[1/0.229, 1/0.224, 1/0.225]), # 如果之前没标准化,这里也不需要 - transforms.ToPILImage() - ]) - - output_dir.mkdir(parents=True, exist_ok=True) - with torch.no_grad(): - result_img = postprocess(target_tensor.squeeze(0).cpu()) - - timestamp = time.strftime("%H%M%S") - output_path = output_dir / f"extended_result_{timestamp}.jpg" - result_img.save(output_path, quality=95, optimize=True) - - print(f"\n🎉 训练完成!") - print(f" 总用时: {total_time:.1f}秒") - print(f" 结果保存至: {output_path}") - - # 尝试显示结果 - try: - result_img.show(title="风格迁移结果") - except: - print(" ℹ️ 请手动打开图像查看") - - -if __name__ == "__main__": - main() \ No newline at end of file