From 84f79dc5f981643ff98eb414ccb434a5dc751d65 Mon Sep 17 00:00:00 2001 From: haopengzhan Date: Wed, 12 Feb 2025 07:25:09 +0000 Subject: [PATCH] AI generated initial commit --- .gitignore | 14 + README.md | 10 + makefile | 25 + pyproject.toml | 106 ++++ requirements.txt | 15 + requirements_dev.txt | 5 + src/modules/__init__.py | 0 src/modules/html_extractor/__init__.py | 0 src/modules/html_extractor/extract.py | 266 ++++++++ src/modules/summarizer/__init__.py | 0 src/modules/summarizer/llm_script.py | 192 ++++++ src/server/__init__.py | 0 src/server/app.py | 87 +++ src/server/static/css/main.css | 818 +++++++++++++++++++++++++ src/server/static/icons/back.png | Bin 0 -> 22812 bytes src/server/static/icons/clock.png | Bin 0 -> 22372 bytes src/server/static/icons/fast.png | Bin 0 -> 22293 bytes src/server/static/icons/music.png | Bin 0 -> 13892 bytes src/server/static/icons/pause.png | Bin 0 -> 19939 bytes src/server/static/icons/people.png | Bin 0 -> 18476 bytes src/server/static/icons/play-pause.png | Bin 0 -> 21336 bytes src/server/static/icons/play.png | Bin 0 -> 20681 bytes src/server/static/js/history.js | 29 + src/server/static/js/main.js | 216 +++++++ src/server/static/js/search.js | 0 src/server/static/logo.png | Bin 0 -> 280474 bytes src/server/static/test.mp3 | Bin 0 -> 5501424 bytes src/server/templates/error.html | 69 +++ src/server/templates/index.html | 108 ++++ src/server/templates/login.html | 65 ++ src/server/templates/page.html | 102 +++ src/server/templates/register.html | 61 ++ 32 files changed, 2188 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 makefile create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 requirements_dev.txt create mode 100644 src/modules/__init__.py create mode 100644 src/modules/html_extractor/__init__.py create mode 100644 src/modules/html_extractor/extract.py create mode 100644 src/modules/summarizer/__init__.py create mode 100644 src/modules/summarizer/llm_script.py create mode 100644 src/server/__init__.py create mode 100644 src/server/app.py create mode 100644 src/server/static/css/main.css create mode 100644 src/server/static/icons/back.png create mode 100644 src/server/static/icons/clock.png create mode 100644 src/server/static/icons/fast.png create mode 100644 src/server/static/icons/music.png create mode 100644 src/server/static/icons/pause.png create mode 100644 src/server/static/icons/people.png create mode 100644 src/server/static/icons/play-pause.png create mode 100644 src/server/static/icons/play.png create mode 100644 src/server/static/js/history.js create mode 100644 src/server/static/js/main.js create mode 100644 src/server/static/js/search.js create mode 100644 src/server/static/logo.png create mode 100644 src/server/static/test.mp3 create mode 100644 src/server/templates/error.html create mode 100644 src/server/templates/index.html create mode 100644 src/server/templates/login.html create mode 100644 src/server/templates/page.html create mode 100644 src/server/templates/register.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7005809 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Virtual Environment +venv/ +.env + +# Build artifacts +*.egg-info/ +build/ +dist/ + +# Test artifacts +.pytest_cache/ +__pycache__/ +*.pyc +run/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7beeb6 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Be my anchor + +Make you a podcast like audio fomr articles you'd like to read but want to listen instead. + +## How to run it + +``` +make setup +python -m src.server.app +``` diff --git a/makefile b/makefile new file mode 100644 index 0000000..623bf56 --- /dev/null +++ b/makefile @@ -0,0 +1,25 @@ +download-webdriver: + curl -L https://storage.googleapis.com/chrome-for-testing-public/132.0.6834.110/linux64/chrome-linux64.zip -o chrome-linux64.zip + curl -L https://storage.googleapis.com/chrome-for-testing-public/132.0.6834.110/linux64/chromedriver-linux64.zip -o chromedriver-linux64.zip + +prepare-webdriver: download-webdriver + mkdir -p run/webdriver/chrome + unzip chrome-linux64.zip -d run/webdriver/chrome + rm -f chrome-linux64.zip + + mkdir -p run/webdriver/chromedriver + unzip -j chromedriver-linux64.zip -d run/webdriver/chromedriver + rm -f chromedriver-linux64.zip + +setup: prepare-webdriver + python3 -m venv venv + pip install -e . + +clean-webdriver: + rm -rf run/webdriver + +clean: clean-webdriver + rm -rf run + rm -rf venv + +all: setup \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..88cb9ea --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,106 @@ +[build-system] +requires = ["setuptools>=42", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "be-my-anchor" +version = "0.1.0" +authors = [ + {name="Pengzhan Hao", email="me@pengzhan.dev"}, +] +description = "Web content to podcast converter" +readme = "README.md" +requires-python = ">=3.11" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] + +[project.dependencies] +annotated-types==0.7.0 +anyio==4.8.0 +attrs==25.1.0 +beautifulsoup4==4.12.3 +blinker==1.9.0 +cachetools==5.5.1 +certifi==2024.12.14 +chardet==5.2.0 +charset-normalizer==3.4.1 +click==8.1.8 +cssselect==1.2.0 +distro==1.9.0 +feedfinder2==0.0.4 +feedparser==6.0.11 +filelock==3.17.0 +Flask==3.1.0 +google-ai-generativelanguage==0.6.15 +google-api-core==2.24.0 +google-api-python-client==2.159.0 +google-auth==2.38.0 +google-auth-httplib2==0.2.0 +google-cloud-texttospeech==2.24.0 +google-generativeai==0.8.4 +googleapis-common-protos==1.66.0 +greenlet==3.1.1 +grpcio==1.70.0 +grpcio-status==1.70.0 +h11==0.14.0 +html2text==2024.2.26 +httpcore==1.0.7 +httplib2==0.22.0 +httpx==0.28.1 +idna==3.10 +itsdangerous==2.2.0 +jieba3k==0.35.1 +Jinja2==3.1.5 +jiter==0.8.2 +joblib==1.4.2 +lxml==5.3.0 +lxml_html_clean==0.4.1 +MarkupSafe==3.0.2 +newspaper3k==0.2.8 +nltk==3.9.1 +openai==1.60.1 +outcome==1.3.0.post0 +pillow==11.1.0 +pip-chill==1.0.3 +playwright==1.49.1 +proto-plus==1.25.0 +protobuf==5.29.3 +pyasn1==0.6.1 +pyasn1_modules==0.4.1 +pydantic==2.10.6 +pydantic_core==2.27.2 +pyee==12.0.0 +pyfranc==0.2.3 +pyparsing==3.2.1 +PySocks==1.7.1 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +PyYAML==6.0.2 +readability-lxml==0.8.1 +regex==2024.11.6 +requests==2.32.3 +requests-file==2.1.0 +rsa==4.9 +selenium==4.28.1 +sgmllib3k==1.0.0 +six==1.17.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +soupsieve==2.6 +tinysegmenter==0.3 +tldextract==5.1.3 +tqdm==4.67.1 +trio==0.28.0 +trio-websocket==0.11.1 +typing_extensions==4.12.2 +uritemplate==4.1.1 +urllib3==2.3.0 +websocket-client==1.8.0 +Werkzeug==3.1.3 +wsproto==1.2.0 + +[project.optional-dependencies] +dev = ["pytest", "black"] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1f68129 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,15 @@ +flask +google-cloud-texttospeech +google-generativeai +grpcio-status +html2text +lxml-html-clean +newspaper3k +openai +pip-chill +playwright +pyfranc +pysocks +python-dotenv +readability-lxml +selenium diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..cf068d0 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,5 @@ +-r requirements.txt +pytest>=7.0 +black>=23.0 +isort>=5.0 +pip-chill>=1.0 \ No newline at end of file diff --git a/src/modules/__init__.py b/src/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/html_extractor/__init__.py b/src/modules/html_extractor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/html_extractor/extract.py b/src/modules/html_extractor/extract.py new file mode 100644 index 0000000..9b8935e --- /dev/null +++ b/src/modules/html_extractor/extract.py @@ -0,0 +1,266 @@ +""" +Web Content Extractor Module + +Provides functionalities to fetch web content using headless Chrome, +sanitize HTML, and save results with comprehensive logging and error handling. +""" + +import logging +import os +import time +import random +import string +from typing import Optional + +from lxml.html.clean import Cleaner +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from bs4 import BeautifulSoup + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[logging.StreamHandler()] +) +logger = logging.getLogger(__name__) + +# Configuration constants +DEFAULT_CHROME_PATH = "run/webdriver/chrome" +DEFAULT_WEB_DRIVER_PATH = "run/webdriver/chromedriver" +DEFAULT_WAIT_TIME = 10 +DEFAULT_OUTPUT_DIR = "run/tmp" + +CHROME_OPTIONS = [ + "--headless", + "--no-sandbox", + "--disable-dev-shm-usage", + "--disable-extensions", + "--disable-gpu", + "window-size=1920,1080" +] + +CLEANER_CONFIG = { + 'page_structure': True, + 'meta': True, + 'embedded': True, + 'links': True, + 'style': True, + 'processing_instructions': True, + 'inline_style': True, + 'scripts': True, + 'javascript': True, + 'comments': True, + 'frames': True, + 'forms': True, + 'annoying_tags': True, + 'remove_unknown_tags': True, + 'safe_attrs_only': True, + 'safe_attrs': frozenset(['src', 'color', 'href', 'title', 'class', 'name', 'id']), + 'remove_tags': ('span', 'font', 'div') +} + +ALLOWED_TAGS = { + 'img': ['src', 'alt', 'width', 'height'], + 'a': ['href', 'title'], + 'video': ['src', 'controls', 'width', 'height'], + 'source': ['src', 'type'] +} + +UNWANTED_TAGS = [ + 'script', 'style', 'nav', 'footer', 'header', 'aside', + 'form', 'iframe', 'noscript', 'svg', 'canvas', 'applet', + 'object', 'embed' +] + + +def configure_chrome_driver() -> webdriver.Chrome: + """Configure and return a Chrome WebDriver instance.""" + try: + chrome_options = Options() + for option in CHROME_OPTIONS: + chrome_options.add_argument(option) + + chrome_path = os.path.join( + DEFAULT_CHROME_PATH, 'chrome-linux64', 'chrome' + ) + chrome_options.binary_location = chrome_path + + driver_path = os.path.join( + DEFAULT_WEB_DRIVER_PATH, 'chromedriver' + ) + chrome_service = Service(driver_path) + + logger.info("Initializing Chrome WebDriver") + return webdriver.Chrome( + service=chrome_service, + options=chrome_options + ) + except Exception as e: + logger.error("Chrome driver configuration failed") + raise RuntimeError("WebDriver initialization failed") from e + + +def extract_html_with_chromedriver( + url: str, + wait_time: int = DEFAULT_WAIT_TIME +) -> Optional[str]: + """ + Extract HTML content from a URL using headless Chrome. + + Args: + url: Target URL to scrape + wait_time: Maximum wait time for page load (seconds) + + Returns: + str: Raw HTML content or None if extraction fails + """ + driver = None + try: + driver = configure_chrome_driver() + logger.info(f"Fetching URL: {url}") + + driver.get(url) + WebDriverWait(driver, wait_time).until( + EC.presence_of_element_located((By.TAG_NAME, 'body')) + ) + + logger.debug("Page load completed successfully") + return driver.page_source + + except Exception as e: + logger.error(f"Failed to extract HTML: {str(e)}") + return None + finally: + if driver: + logger.debug("Closing WebDriver instance") + driver.quit() + + +def sanitize_html(dirty_html: str) -> str: + """ + Sanitize HTML content using lxml cleaner. + + Args: + dirty_html: Raw HTML input + + Returns: + str: Sanitized HTML output + """ + try: + logger.info("Sanitizing HTML content") + cleaner = Cleaner(**CLEANER_CONFIG) + return cleaner.clean_html(dirty_html) + except Exception as e: + logger.error(f"HTML sanitization failed: {str(e)}") + raise + + +def extract_content(html_content: str) -> Optional[str]: + """ + Extract and clean main content from HTML. + + Args: + html_content: Raw HTML input + + Returns: + str: Cleaned HTML content or None if processing fails + """ + try: + if not html_content: + logger.warning("Empty HTML content received") + return None + + logger.info("Processing HTML content") + soup = BeautifulSoup(html_content, "html.parser") + + # Remove unwanted tags + for tag in soup.find_all(UNWANTED_TAGS): + tag.decompose() + + # Clean tag attributes + for tag in soup.find_all(): + allowed = ALLOWED_TAGS.get(tag.name, []) + attrs = list(tag.attrs.keys()) + for attr in attrs: + if attr not in allowed: + del tag[attr] + + # Remove empty tags + for tag in soup.find_all(): + if not tag.get_text(strip=True): + tag.decompose() + + return str(soup) + except Exception as e: + logger.error(f"Content extraction failed: {str(e)}") + return None + + +def save_html_to_file( + html_content: str, + output_dir: str = DEFAULT_OUTPUT_DIR +) -> Optional[str]: + """ + Save HTML content to timestamped file. + + Args: + html_content: Content to save + output_dir: Target directory path + + Returns: + str: Path to saved file or None if save fails + """ + try: + os.makedirs(output_dir, exist_ok=True) + timestamp = time.strftime("%Y%m%d%H%M%S") + rand_str = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + filename = f"output_{timestamp}_{rand_str}.html" + filepath = os.path.join(output_dir, filename) + + logger.info(f"Saving output to: {filepath}") + with open(filepath, "w", encoding="utf-8") as f: + f.write(html_content) + + return filepath + except Exception as e: + logger.error(f"File save failed: {str(e)}") + return None + + +def get_content_from_url(url: str) -> Optional[str]: + """ + Main pipeline: Fetch URL -> Extract Content -> Sanitize HTML + + Args: + url: Target URL to process + + Returns: + str: Processed HTML content or None if any step fails + """ + try: + raw_html = extract_html_with_chromedriver(url) + if not raw_html: + return None + + sanitized = sanitize_html(raw_html) + return extract_content(sanitized) + except Exception as e: + logger.error(f"Processing pipeline failed: {str(e)}") + return None + + +if __name__ == "__main__": + target_url = "https://www.cncf.io/blog/2025/01/22/kubernetes-in-2025-are-you-ready-for-these-top-5-trends-and-predictions/" + if (result := get_content_from_url(target_url)) is not None: + file_path = save_html_to_file(result) + if file_path: + logger.info(f"Successfully saved output to: {file_path}") + else: + logger.error("Failed to save output file") + else: + logger.error("Content extraction failed for target URL") \ No newline at end of file diff --git a/src/modules/summarizer/__init__.py b/src/modules/summarizer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/summarizer/llm_script.py b/src/modules/summarizer/llm_script.py new file mode 100644 index 0000000..27c9b8f --- /dev/null +++ b/src/modules/summarizer/llm_script.py @@ -0,0 +1,192 @@ +""" +LLM-based Podcast Script Converter + +将HTML内容转换为播客风格的稿件,支持多种LLM模型接口。 +""" + +import os +import logging +from abc import ABC, abstractmethod +from typing import Optional, Dict, Literal +import html2text + +# 第三方库导入(需要额外安装) +try: + from openai import OpenAI # OpenAI官方库 + import google.generativeai as genai # Google Gemini +except ImportError: + pass # 运行时检查 + +# 配置日志 +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +class LLMConverter(ABC): + """LLM转换器抽象基类""" + + @abstractmethod + def convert_to_podcast(self, html_content: str) -> Optional[str]: + """将HTML内容转换为播客稿件""" + pass + +class OpenAIConverter(LLMConverter): + """ChatGPT转换器实现""" + + def __init__(self, model: str = "gpt-4-turbo", temperature: float = 0.7): + self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + self.model = model + self.temperature = temperature + + def convert_to_podcast(self, html_content: str) -> Optional[str]: + try: + # 将HTML转换为Markdown格式 + markdown_content = html2text.html2text(html_content) + + response = self.client.chat.completions.create( + model=self.model, + temperature=self.temperature, + messages=[ + { + "role": "system", + "content": """你是一位专业播客编剧,需要将技术文章转换为生动有趣的播客稿件。要求: +1. 使用口语化表达,避免专业术语 +2. 结构清晰,包含引言、主体和总结 +3. 突出文章的核心观点和技术亮点 +4. 适当添加过渡语和互动提示 +5. 总长度控制在1500字左右""" + }, + { + "role": "user", + "content": markdown_content + } + ] + ) + return response.choices[0].message.content + except Exception as e: + logger.error(f"OpenAI转换失败: {str(e)}") + return None + +class GeminiConverter(LLMConverter): + """Google Gemini转换器实现""" + + def __init__(self, model: str = "gemini-pro", temperature: float = 0.7): + genai.configure(api_key=os.getenv("GEMINI_API_KEY")) + self.model = genai.GenerativeModel(model) + self.temperature = temperature + + def convert_to_podcast(self, html_content: str) -> Optional[str]: + try: + markdown_content = html2text.html2text(html_content) + + response = self.model.generate_content( + f"[播客稿件转换要求同OpenAI版本]\n\n{markdown_content}", + generation_config=genai.types.GenerationConfig( + temperature=self.temperature + ) + ) + return response.text + except Exception as e: + logger.error(f"Gemini转换失败: {str(e)}") + return None + +class DeepSeekConverter(LLMConverter): + """深度求索转换器实现""" + + def __init__(self, model: str = "deepseek-chat", temperature: float = 0.7): + self.client = OpenAI( + api_key=os.getenv("DEEPSEEK_API_KEY"), + base_url="https://api.deepseek.com/v1" + ) + self.model = model + self.temperature = temperature + + def convert_to_podcast(self, html_content: str) -> Optional[str]: + try: + markdown_content = html2text.html2text(html_content) + + response = self.client.chat.completions.create( + model=self.model, + temperature=self.temperature, + messages=[ + {"role": "system", "content": "[播客稿件转换要求同OpenAI版本]"}, + {"role": "user", "content": markdown_content} + ] + ) + return response.choices[0].message.content + except Exception as e: + logger.error(f"DeepSeek转换失败: {str(e)}") + return None + +class PodcastConverter: + """播客稿件转换管理器""" + + def __init__( + self, + provider: Literal["openai", "gemini", "deepseek"] = "openai", + model: Optional[str] = None, + temperature: float = 0.7 + ): + self.provider = provider + self.model = model + self.temperature = temperature + self.converter = self._init_converter() + + def _init_converter(self) -> LLMConverter: + """初始化指定的LLM转换器""" + try: + if self.provider == "openai": + return OpenAIConverter( + model=self.model or "gpt-4-turbo", + temperature=self.temperature + ) + elif self.provider == "gemini": + return GeminiConverter( + model=self.model or "gemini-pro", + temperature=self.temperature + ) + elif self.provider == "deepseek": + return DeepSeekConverter( + model=self.model or "deepseek-chat", + temperature=self.temperature + ) + else: + raise ValueError("不支持的LLM提供商") + except Exception as e: + logger.error(f"转换器初始化失败: {str(e)}") + raise + + def convert(self, html_content: str) -> Optional[str]: + """执行转换流程""" + if not html_content: + logger.warning("输入内容为空") + return None + + logger.info(f"开始转换,使用模型: {self.provider}/{self.model}") + return self.converter.convert_to_podcast(html_content) + +# 使用示例 +if __name__ == "__main__": + # 测试用HTML内容(实际应从文件或网络获取) + sample_html = """ + + +

人工智能的未来发展

+

近年来,AI技术取得了突破性进展...

+ + + + """ + + # 使用OpenAI转换 + openai_converter = PodcastConverter(provider="openai") + result = openai_converter.convert(sample_html) + + if result: + print("转换结果示例:") + print(result[:500] + "...") # 打印前500字符 + else: + print("转换失败") \ No newline at end of file diff --git a/src/server/__init__.py b/src/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/server/app.py b/src/server/app.py new file mode 100644 index 0000000..fe63868 --- /dev/null +++ b/src/server/app.py @@ -0,0 +1,87 @@ +from flask import Flask, request, render_template, redirect, url_for +from ..modules.html_extractor.extract import get_content_from_url +from flask_dance.contrib.google import make_google_blueprint, google + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'your-secret-key-here' +app.config['PREFIX'] = '/proxy/5000' + +app.config['GOOGLE_OAUTH_CLIENT_ID'] = 'your-client-id' +app.config['GOOGLE_OAUTH_CLIENT_SECRET'] = 'your-client-secret' + +@app.route("/") +def index(): + print("index!") + return render_template("index.html", prefix=app.config['PREFIX'],) + + +@app.route("/page") +def article_page(): + url = request.args.get("url") + if not url: + return redirect(url_for('index')) + + try: + content = get_content_from_url(url) + return render_template('page.html', + prefix=app.config['PREFIX'], + url=url, + summary=content, + audio_url="/static/audio/sample.mp3") + + except Exception as e: + app.logger.error(f"Error processing {url}: {str(e)}") + return render_template('error.html', + error_message="Failed to process the URL"), 500 + +@app.route("/login", methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + # Add authentication logic here + return redirect(url_for('index')) + return render_template("login.html", prefix=app.config['PREFIX']) + +@app.route("/register", methods=['GET', 'POST']) +def register(): + if request.method == 'POST': + # Add registration logic here + return redirect(url_for('login')) + return render_template("register.html", prefix=app.config['PREFIX']) + +@app.errorhandler(404) +def page_not_found(e): + return render_template('error.html', prefix=app.config['PREFIX'], + error_message="Page not found"), 404 + +@app.errorhandler(500) +def internal_error(e): + return render_template('error.html', prefix=app.config['PREFIX'], + error_message="Internal server error"), 500 + + + +google_bp = make_google_blueprint( + scope=["profile", "email"], + redirect_to="auth_callback" +) +app.register_blueprint(google_bp, url_prefix="/auth") + +@app.route("/auth/callback") +def auth_callback(): + if not google.authorized: + return redirect(url_for("login")) + + resp = google.get("/oauth2/v2/userinfo") + if resp.ok: + user_info = resp.json() + # Handle user authentication logic here + return redirect(url_for("index")) + + return redirect(url_for("login")) + +@app.route("/auth/google") +def google_auth(): + return redirect(url_for("google.login")) + +if __name__ == "__main__": + app.run(port=5000, debug=True) diff --git a/src/server/static/css/main.css b/src/server/static/css/main.css new file mode 100644 index 0000000..0d7fb04 --- /dev/null +++ b/src/server/static/css/main.css @@ -0,0 +1,818 @@ +:root { + --primary: #6366f1; + --surface: #f8fafc; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + touch-action: manipulation; +} + +body { + display: grid; + grid-template-rows: auto 1fr auto; + min-height: 100dvh; + font-family: system-ui, sans-serif; + background: #f8fafc; +} + +/* 头部样式 */ +header { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + padding: 12px; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + z-index: 2000; +} + +.branding { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: 0 12px; +} + +.brand-logo { + width: 32px; + height: 32px; + object-fit: contain; +} + +.site-name { + font-weight: 600; + color: #1e293b; + font-size: 1.2rem; + white-space: nowrap; +} + +.nav-group { + display: flex; + gap: 8px; + justify-self: end; + /* 右侧菜单保持右对齐 */ +} + +.history-button { + padding: 8px; + border: none; + background: none; + cursor: pointer; + justify-self: start; +} + +.history-button img { + width: 32px; + height: 32px; +} + + +/* 菜单系统 */ +.menu { + position: relative; +} + +.menu-button { + padding: 8px; + border: none; + background: none; + cursor: pointer; +} + +.menu-button img { + width: 32px; + height: 32px; +} + +.menu-dropdown { + position: absolute; + right: 0; + top: 100%; + z-index: 100; + background: white; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + display: none; + min-width: 160px; +} + +.menu-dropdown.active { + display: block; +} + +.menu-item { + padding: 12px 16px; + color: #334155; + text-decoration: none; + display: block; + border-bottom: 1px solid #f1f5f9; +} + +/* 主容器设置 */ +main { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + flex: 1; + padding: 20px; + overflow: hidden; +} + +/* 图片容器 */ +.image-container { + position: relative; + width: min(60vw, 300px); + height: min(60vw, 300px); + /* 明确设置高度 */ + margin: 0 auto 20px; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + z-index: 90; +} + +/* 图片绝对居中方案 */ +.image-container img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; +} + +/* 文字内容容器 */ +.text-content { + width: 80%; + max-width: 800px; + text-align: center; +} + +/* 主容器设置 */ +main { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + flex: 1; + padding: 20px; + overflow: hidden; +} + +/* 图片容器 */ +.image-container { + position: relative; + width: min(60vw, 300px); + height: min(60vw, 300px); + /* 明确设置高度 */ + margin: 0 auto 20px; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +/* 图片绝对居中方案 */ +.image-container img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; +} + +/* 文字内容容器 */ +.text-content { + width: 80%; + max-width: 800px; + text-align: center; +} + +.url { + font-size: 1.1em; + color: #3b82f6; + margin-bottom: 12px; + word-break: break-all; +} + +.summary { + line-height: 1.5; + color: #64748b; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 4; + /* 默认显示4行 */ + overflow: hidden; + text-overflow: ellipsis; + --lines: 4; + /* 默认显示行数 */ + --mobile-lines: 3; + /* 移动端行数 */ +} + +/* 响应式调整 */ +@media (max-width: 768px) { + .text-content { + width: 90%; + /* 小屏幕更宽 */ + } + + .summary { + -webkit-line-clamp: 3; + /* 减少显示行数 */ + } +} + +/* 播放控制栏 */ +footer { + display: flex; + align-items: center; + padding: 16px; + gap: 4px; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1); + z-index: 2000; +} + +.progress-bar { + flex-grow: 1; + height: 6px; + background: #e2e8f0; + border-radius: 3px; + overflow: hidden; +} + +.progress-fill { + height: 100%; + background: var(--primary); + width: 0%; + transition: width 0.1s linear; +} + +.control-button { + padding: 8px; + border: none; + background: none; + cursor: pointer; +} + +.control-button img { + width: 40px; + height: 40px; +} + +/* 历史记录面板样式 */ +.history-panel { + position: fixed; + top: -100%; + left: 0; + right: 0; + height: 100vh; + background: rgba(255, 255, 255, 0.98); + backdrop-filter: blur(30px); + z-index: 2000; + transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1); + padding: 60px 16px 16px; +} + +.history-panel.active { + top: 0; +} + +/* 关闭按钮位置调整 */ +.history-close { + position: absolute; + top: 12px; + left: 12px; + /* 改为左上角 */ + padding: 8px; + background: none; + border: none; + cursor: pointer; +} + +.history-close img { + width: 32px; + height: 32px; +} + +/* 滚动容器 */ +.history-content { + height: calc(100vh - 100px); + overflow-y: auto; + padding: 0 8px; +} + +/* 历史记录项样式 */ +.history-item { + padding: 12px; + margin: 8px 0; + background: rgba(0, 0, 0, 0.03); + border-radius: 8px; + transition: all 0.2s; + cursor: pointer; + display: flex; + align-items: center; + gap: 12px; +} + +.history-item:hover { + background: rgba(0, 0, 0, 0.05); +} + +/* 滚动条美化 */ +.history-content::-webkit-scrollbar { + width: 6px; +} + +.history-content::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.05); + border-radius: 3px; +} + +.history-content::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.2); + border-radius: 3px; +} + +.search-form { + display: flex; + align-items: center; + border-radius: 20px; + overflow: hidden; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); +} + +.search-input { + flex-grow: 1; + border: none; + padding: 15px; + font-size: 16px; + outline: none; + color: #333; +} + +.search-button { + background-color: #007bff; + /* Blue button color */ + color: #fff; + border: none; + padding: 15px 20px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.search-button:hover { + background-color: #0069d9; +} + +/* Optional: Add a magnifying glass icon */ +.search-input::placeholder { + color: #999; +} + +/* Responsive adjustments (optional) */ +@media (max-width: 768px) { + .search-form { + width: 100%; + } +} + +/* Add to main.css */ +/* Auth System */ +.auth-main { + display: flex; + justify-content: center; + align-items: center; + padding: 2rem; + min-height: calc(100dvh - 120px); +} + +.auth-container { + background: white; + padding: 2.5rem; + border-radius: 16px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 420px; + margin: 0 auto; +} + +.auth-title { + text-align: center; + color: #1e293b; + font-size: 1.5rem; + margin-bottom: 2rem; +} + +.input-group { + display: flex; + flex-direction: column; + gap: 1rem; + margin-bottom: 1.5rem; +} + +.input-group input { + width: 100%; + padding: 12px 16px; + border: 1px solid #e2e8f0; + border-radius: 8px; + font-size: 1rem; + transition: border-color 0.2s; +} + +.input-group input:focus { + outline: none; + border-color: var(--primary); + box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2); +} + +.primary-button { + width: 100%; + padding: 14px; + background-color: var(--primary); + color: white; + border: none; + border-radius: 8px; + font-weight: 500; + cursor: pointer; + transition: opacity 0.2s; +} + +.primary-button:hover { + opacity: 0.9; +} + +.oauth-divider { + display: flex; + align-items: center; + gap: 1rem; + margin: 1.5rem 0; + color: #64748b; +} + +.oauth-divider::before, +.oauth-divider::after { + content: ''; + flex: 1; + height: 1px; + background: #e2e8f0; +} + +.google-login { + width: 100%; + padding: 12px; + background: white; + border: 1px solid #e2e8f0; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + cursor: pointer; + transition: background 0.2s; +} + +.google-login:hover { + background: #f8fafc; +} + +.google-login img { + width: 20px; + height: 20px; +} + +.auth-links { + margin-top: 1.5rem; + display: flex; + flex-direction: column; + gap: 0.75rem; + text-align: center; +} + +.auth-links a { + color: var(--primary); + text-decoration: none; + font-size: 0.9rem; +} + +.auth-links a:hover { + text-decoration: underline; +} + +/* 统一搜索页面样式 */ +.search-main { + display: flex; + justify-content: center; + align-items: center; + min-height: calc(100dvh - 120px); + padding: 2rem; +} + +.search-container { + width: 100%; + max-width: 720px; + text-align: center; +} + +.search-title { + font-size: 2rem; + color: #1e293b; + margin-bottom: 2rem; +} + +.search-form { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.search-input { + padding: 16px 24px; + border: 2px solid #e2e8f0; + border-radius: 12px; + font-size: 1.1rem; + transition: all 0.3s ease; +} + +.search-input:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2); +} + +/* 统一按钮悬停效果 */ +.primary-button:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.2); +} + +/* 历史面板动画优化 */ +.history-panel { + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + transform: translateY(-100%); +} + +.history-panel.active { + transform: translateY(0); +} + +/* 新增CSS样式 */ + +.search-textarea:focus { + outline: none; + box-shadow: 0 0 0 2px var(--primary); +} + +.search-icon-button { + position: absolute; + right: 16px; + bottom: 16px; + background: var(--primary); + border: none; + border-radius: 12px; + padding: 12px; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; +} + +.search-icon-button:hover { + transform: scale(1.05); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); +} + +.search-icon-button img { + width: 24px; + height: 24px; + filter: brightness(0) invert(1); +} + +.search-options { + margin-top: 1.5rem; + display: flex; + gap: 1.5rem; + justify-content: center; + flex-wrap: wrap; +} + +.option-checkbox { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + color: #475569; +} + +.voice-selection select { + padding: 8px 12px; + border-radius: 8px; + border: 1px solid #e2e8f0; + background: white; + font-size: 0.95rem; +} + +/* 加载动画 */ +.loading-indicator { + display: none; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + padding: 16px 24px; + background: rgba(255, 255, 255, 0.95); + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + align-items: center; + gap: 12px; +} + +.loading-spinner { + width: 24px; + height: 24px; + border: 3px solid #e2e8f0; + border-top-color: var(--primary); + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* 验证状态提示 */ +.invalid-input { + border-color: #ef4444 !important; + background: #fef2f2; +} + +.validation-error { + color: #ef4444; + font-size: 0.9rem; + margin-top: 4px; + display: none; +} + +/* 新增/修改的CSS */ +.search-group { + border-radius: 16px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.search-textarea { + width: 100%; + padding: 20px; + border: none; + resize: none; + font-size: 1.1rem; + line-height: 1.6; + min-height: 150px; + background: #fff; +} + +.search-actions { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 20px; + background: #f8fafc; + border-top: 1px solid #e2e8f0; +} + +.advanced-toggle { + display: flex; + align-items: center; + gap: 8px; + background: none; + border: none; + color: var(--primary); + cursor: pointer; + padding: 8px 12px; + border-radius: 8px; + transition: all 0.2s; +} + +.advanced-toggle:hover { + background: rgba(99, 102, 241, 0.1); +} + +.advanced-toggle img { + width: 14px; + height: 14px; + transition: transform 0.2s; +} + +.search-icon-button { + background: var(--primary); + border: none; + border-radius: 12px; + padding: 10px 16px; + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + color: white; + transition: all 0.2s; +} + +.search-icon-button:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); +} + +.search-icon-button img { + width: 20px; + height: 20px; + filter: brightness(0) invert(1); +} + +/* 高级选项面板 */ +.advanced-options { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease-out; + background: #fff; + border-radius: 0 0 16px 16px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); +} + +.advanced-options.active { + max-height: 400px; /* 根据内容调整 */ +} + +.option-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; + padding: 20px; +} + +.option-group { + display: flex; + flex-direction: column; + gap: 8px; +} + +.option-group label { + font-size: 0.9rem; + color: #475569; + font-weight: 500; +} + +.option-group select, +.option-group input { + width: 100%; + padding: 8px 12px; + border: 1px solid #e2e8f0; + border-radius: 8px; + background: white; +} + +/* 开关样式 */ +.switch { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; +} + +.slider { + position: relative; + width: 40px; + height: 20px; + background: #e2e8f0; + border-radius: 10px; + transition: 0.4s; +} + +.slider:before { + content: ""; + position: absolute; + height: 16px; + width: 16px; + left: 2px; + bottom: 2px; + background: white; + border-radius: 50%; + transition: 0.4s; +} + +input:checked + .slider { + background: var(--primary); +} + +input:checked + .slider:before { + transform: translateX(20px); +} \ No newline at end of file diff --git a/src/server/static/icons/back.png b/src/server/static/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7b2bc28e5cfffac50d452313d52f0321e49758 GIT binary patch literal 22812 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 WB<>qNlLe>_=)8dm;gz0a`2PSMBqfLd literal 0 HcmV?d00001 diff --git a/src/server/static/icons/clock.png b/src/server/static/icons/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..61e206c2088ab4262752ac31bca86ad61e26507a GIT binary patch literal 22372 zcmdRWhd%*I`*j~ zjuAyTRyNP=`+J^0;_3D3rI*h=u6teMeZ8-u^>wwF8ICdl0GO{`)wl@&68;kj=xE@N zHQ%9a_=Dc#s<}5npw|!oB2wrcn!;Zmd7x?bz|h_Cfsd`11MuV;%#T^;UMMi z<&?IlbQAy~a82W~k#G9npMHr}4tN#HY=HaOCVM@)@ROJiZbEo&Ha3wbF_^19_f7fF zOBf`th2mmgt6BxpMv%vUZq?ipd<&>ku5Gr&EiesB`E2bj)y zzhMR>WED$a4bq$!^EJ8)?Mz9IsWo9M`Q%jTKa`w0EXkxX(SgL+|IMk!`YL7M#d0_i zI$ZtHmvPY|FX_laKxQh6suDq9e7|qd!Pwj~65>CnZA=euB zsglnAyoM;1JP&~yT$^$>835L7zd3QW*O9k!bMzial?HXA`3x@JMhHn%o^hHdC#EQ? zom8cd|5N0fLYD{l9PnS*(-2Cc5_+_K+#(GkugcB+)&;6MV5h_iz{cE{TU{&gd#5r1 zC?6qQ19?cwQ#;Lm#+(%lXd2)674o?DR0fSksXBXo3<_63_vOo69OHSdU#tEvXcdm+ zcUhl9_fU)STPY(IQoL7R;2$i6Nh~DbxF)PBUv6`N%hXG z)IYL(%`_L+HItc@FYP;PMN*S0qdvg#o#j$4xE(*DzH)(GS)F?p$oHW+*FRZ+jiSj6 zD~7@5rzMInd=!?GG461Y0-X^BEWumg*THR1&G#bEMZV64ak zimtEDx-`y|uKhu7oy&5f;&a7EOU&JPJSv_sh7P>7A~#wQRm9E+jGx7_tY0e8!P8xp z#l?Yd<7m#uA7~8f4UOJMx?PvDJCb#;6^VKN?nl-*)9t6&(+slaqA@lx_cl^BR#HX_ z<8z*(a3Y04ZjKQ&ty>I%bOf_`rRg`OS-(wu4{Dt6-g%7W%eiTX$m%llNM?C%zx`Td zQxbQVwSJuS^8ypOdJ)TJw8(8EQ-vV5qXNy zy|}&;&D4*n0PzXUeI@EURe$25$Rfb7WL4kTpCYd}RV$e%5Xo1j3t8})AzAx$u5bk`f} z4vP`{YX-#LqEjzc3a4y~37H~aLRkvvdJ8Afsu@;Q6_(p2ZEOqljNmbmIJ|ox7J7!D zwb|wB9`l>o{EO5K8o_Xk2QWN)rw|kgyk7Zla&fJb{GzTqpTRB7YLqvX<^L-u*+v1_ zCIofkN2lN1Ed;q5yntvNrnySVr zPw5_kX+?CvoJ}>0`fxM~C$aeABA}nTw8J?GdGR_;1-g_6`e+x$nLE(Db#*|8rG>8w<{7wQ9 zmavWVEmmJs+Cq)lNrxBjbk+MmA~6obkF4iL3F@M_Xp(spf7Q`GX`gk{ejl1nla~=B zXfe(2CR1`$J(#Y3vnq+0;8J?U(h05xh)K24$zD}o|fXy!g_#gzmLkW0`R@qXG9^?632@!Lz*T zBnw($xk{kl^7c|*8ls7X@CYuV=vx}jx-}nFplSvR#8QZ353>YU%fs%(VtGVHt}Sb~ zujiC4j--^nj#q>YFcN3I2Y6%1M?qNWAY1?Vcb2ZNk#Z;ZOJA!a=g)CHk_2z{7OD*+ zQ7UfK=RTns*%!jP1VfditO5g8?#_#Gxk-YxSTuUb^1ye-i+vC6t0Vnfdw?O(PeXmh zf=JV+Xp6{FZm9E{M=V?YRRw_rIK=u7cPe@*vr)s^k7&Bbtc+j}|L)_11f(_)fa{N< zx&K;C%3>(3u>*c(gkQ`5IhHbe{c)#qt|Y2yq97i(JF| zQ}DU|tpG-qpN`c&C5r6JQkGS|{z8;cRp^G)h$!yYf_bBC{qGEyO}H6;UjaC03$iOM z(A1|*!t42Uonxot@{D5P2oXESLAWY*#rEsL*fOhLz=M|(i_x>Pf>S0RhM%CauGeJL z?)mzT^&*~D6V(EeP!&fB+H8$c7;6rC>+s*&8UF5fCF>vB)|S-LJ-jwG^ZeS$D>NK` z^Fwq%qq@<#%UO|_bBLH_aEIr60VXCzc|7esfZl;!+}9OUws7Gp9>d*R`NobmdPz%Io`*jPgokI4a~NX%vU@NnlFg zGLl}fun4HevK2}4;3UqwXONh_C)Vp`WmXYyeu-e>efrJj+v|9b7}?<0-AKU0k~Mw~o+u4d~LG zqe{;$daI?0b(L*gA^++NWkZ1~>Rb<6duU6Bj0;oxt2)-UPfLI0*)rRc zgD)*B>2wxH^F9S1(|qvp*V5qj=d2-5oKIE0e-$zx6jTz8QDZmz<0R(_o4%syl6V<0 z?KPM3$^hl8N5{kOOh<(Id$UH0U`sh7%Xnz0a)ZZ%zGEQJzQ01YGW>TO!b!6!m>-=Kt>GPl>{S?xsq`GQ|Y z+U_i@_Wm~Mo>*lTrQ5KR&W4ML-clm6wH^UP+fzT)UIw@o4JB$5SXYPKXF#nM? zeq*le8k#ePHZ-F1@KH&+Z{4VK$`1MGX zklM(MeO>{z50cLX-(f65_!fQqw2s81zVSa7jjb+V^G2;Be2w0`Q$RCa{SwmE$t6#P zbHaDq7B^vt*1iEN^z%YSME`X2C8jJ-8VoeUp59UMY4&A~f#dzoAhFfpD5wln~Nlb}i_rh#ZJo zTD8eLIECc*pu}E2AfHgadQi@6W8BeLDEsT{si#^F1O3@!d7=aPD8vkvGj;75DHCfh zMsx~k^fnwR0!8q2_1T9DwgSjs%dHV_ zqKnZkO$h&4c6a}pY|vBH9Q*l}{Wl1eOY8D}jYg{RA70l~F4<$6aRPDuD~eu%8Wr~6 zrl&Op1USr`vL`8R3omCJ*E?s<%bi(6&P&?PY!TXD2k{5Ih_iiteN)C%vYURy>2v%- z?oKw>m9yT4k=i(IgcTihJoE|*_w6@7rZQS7*H>9o0{J(u%{h;G{mDc+R}nc(WCZ2! zG{o8Itr?iw48(1i(5WapG>lsG2wtD4^>%+I4K^j~@(GGJ$+IW!bn88M;9cwjy-WE! zt>&p~_XcY3bbdVj_E;|!OXj3qPxm8no_`CA(mBreUyAD`Z__3y@?3BgoGtW0nNk09 ze8sCxy!GvD5b3h>xEbL0*xGrkVwhsx;N9!(e~g_>eyyYv?9QYfk+MG}NsvAjvMQ>V z%zWx#V)~7C>NZQPdh?qYy^uJz#qNWXtKHsZ&Fb&WXtSH_5OnoV(y;nUnOodOdT)sw zr$q?iK7KF#uQRD%N&ID30?OQ8#!5$fcyjJFY0u`xt%Q+_ae;iJwiNg1UEz7rvEZQE z`!%s@OHWZk?IUS5m%4J7kQ8gU$yMWKteu&E>{==vc8EWbt&QS?x%pPonErlJ;wv8K zK5;@oNp<*Vs%6*i4IA&;`_(LJ0UwcUHx+qz*KwlTd*$1$p?8&aLK`0Ze_vUjK>AL&fgN- zmE3r^q>K+*nRt`l<*l_8-)Y8jxU^ki&{a~5*y}X4cOA}&_~Sf#M^&N*^(-i#!9E&j znK{Xb)@2uq`q9@iv#|2u*zUUO++rp(%=0I=Q^hKbbtW3xMQu3**Ea&jqmFcX7hhMs zlGAgEaMcYmFy5!fd_c#YLNuTQTt-T~`&cA_aR12A26I8+cXVW~0WE{Biel`<>oY5r zqsYsviGNm#uQ&1;{7C=Il|()b21~2WCdET1T9Ir>*Be2Z21&G2t$T<}e(7b4g1;YomO! zuKREu^Nxy4AjaBKDq@1T#wn;J#fJ?gMMI1n3vR9HL)pz_N0e?2@y^L(Vnp-Cw=-_@ zLc>o{1buD0ZN88(*4qWxicTV3F5+gyJ;#ea-D4;C&Pyg;y8nipsNnfjDJw^?g;%-bNP<%j zV^W|&PSD-Vv{&rZt-%QS0rZm)(>)>iiIE@kCYH2?S0n*VS$b*M;G^wepi@b_c{fsE zYU-y`2U{_DJr?v%E2qo2rZ!sCo1T&wCAzk>FlTkZAw*s7bSIS0CEtKTFf(EvUz96W zJ)OD8-BC|6mnh8B^%zi);eX)U(W~Qk0pGb3t7=U$-hLb%Gdz&!#?|o*7yFiY)Amz@ z`&HtMTS!s|XNko9`zk>}HO%|aO_*rh@_f>IK+m#2{X$c@+gdu=9eA{0lNl6U+M?D( z=GlfLWC8ck$jb&KVVI;Kad*H|1zy-Nqvm`23dhMq*E+lBxq}^Y5UHv*Q&{)Bme-*u zDAqMxug^b{l?(p01#|&skq zx9#TsJkuYtbSjJw%-R$ZWG!Lh!7(_yE-KO~n6ungg`0lPH=Mjy&;6r+$^CEO(9%$$ z;ji477I}jslFpwm_|myidBC&niN|hPom+k1QV`USzBc5^jCu7XE&pQInu_GCDT5zX7314*fdO(T)a`jbhG;|n`8~~<`MM3#;5TVW1{(b}4Hc{KG8Qm{`8rq1Hd z-@B_5q>JlX@;Q5)vbfRdF@2%>7jsZZCJu;Rn(YKw03>;@5gxM z8aeaXCDal};%C-Hn=eHmixgEi42BL7DB=ep^w+iy-xOSO4!SCaqGf3glx5{K0 zG4^kQ-27kA_@^LgEuF-xhc8Pi26=9fYfHj3n7@KVGw5cSw+BZ=vF@Mfq$BRVT_CfP zkMZvoTAXb>yJaMmsme}x4F|v9nDXS{?Q3-f>m3M#3F zH2A-7wZUax(CIY&f@FJ4@L4JdzIaSKgMlnHFX`}bJ0j`TnNoEPW_LuQ{-^ZM51x}R zYxsH++kO0ed;L6p-wiK+RUrR8B74#$HB{_mYTB^sxs)xHtb^P5+^1f2p$YHZ$^*L4 zSB)w_V%MQNsuQ$rfQYRi-jvePS@)bYmx)@)pXr^O+AK75czu^4C;qOR$pIm7JK#|J zY9CR~{4APp9Ta)Ll7$1+h|(ANzWsSpjCEh@25Seo1%*hJ--Kpq(XHEO{iHN?MIY=U zkos?Mypn~TI~^ewau{E!xmObnq&k~_bUq!tLy|$#5vQgeY3z_lLtnEcp5Hq0T0+qL z?FGMLEX&tQz@#6r`mgdb(dNkT>ihgg(TKwQ@X6hr;MDW#&8`BWUEHP5{z!wP!!56v zqy8lR7f^=PJ*@>aS+CWbgl6}|ioy;&og(ZhyrZOZ0;cAjLSENQ-B%4ZR?OovCkg5Xk7T%pp>IOp3IsoVR;M*H1p zts`&3FnMR2mABqv*?2u^vIJqc8Wxwv*4lb-OIA&GlPXltn<9F&PE)zYCR8M*cs3y; zGR^NyR`6!tdfT?~A8n9+AOCuY#f9QIx}$b}lj_jZK0eQ;VbEW5!S69$ve~Sdva)Sk z(b{Z@VOuTwjAlm53G?K#gh4|M>>4ERIy!YQLnW%D^nneo5@budzB=91(4d+ju z%HJe8%(@D?3$$I71RXs+%z(zSQ!IB`%lG9lAL}P_i!qm=;;zRvOIqQW)L0h!?SIAf zAjSs1wMt>X-uGkZa2GQW(?|NYK~JaRjDMYYhsM6aaZ9uS+W#Wa0)v5yd5N@%%s>FQzEjIaPp`fJvtl(6^G5*-N5Tx7< zyfClDtWXh+>x~~DoyiC6p49RzAS`C{#-!u*;Kp(H(&`@Q^S5b5 zI#O6e!GZ5kx6;Iuf)@`}R1a*ya|H{_Y+i_N5Z@9fkUY4cmr!}r^*P{Q8)@JYRQTFn zs;jLRFQq?B-zB1{4KB{jm2TBwUjO5}^>ugaXe|r-!|bD|4+Z~9*Kz^0E(Q|JqFeI! zy~N&a{`~cQ;fMyd_@;;`ykU=QG+W@H;jv{wXM&z%qblqW-=3hpSpK7;9F%w`_H4E( z>nNPMaBL4?tZ|IGN(S2{VQj|l*%Mrv`71lA6jg#3XADTfAD*IaOYa8m+5jf_)EL6F z=yYERq&n>(Kv7+hZG@6NJ}m0tU-tO!)4jBmMr<<2k&IPNhG6c>wbandzIbEu&U9hnR}0g;Gryp1jN?v&GYA;^G}cb zlmGZ$zaW=c3T=+Bl!C#VwP)9@^9W1u1&78wavD>5HoCk()q$)?%T7D*s;^T)l+nM4 z4IP~MNPhfRPBQe2C*In^1b`_*ij(0 zC)XO-hhvjN(0gs3&~fOx5=`EY_#>~WF@&aL=g!L&|0!0aOj4lHC7}x2+dDqlS7TpP z(EX&d702HQQeg-?Fc{oB$Fgs3VAbB5*>(1b|BEJut!8X&$l!D98+l*QnlHoM5-Yq8 zAs2~(dw9F7h**x#O3GFndk72{o>}(SwRwIGqsI1k8jLtP{=w3e8oAc z%l)FsJM;Wh7lTZgUVjYtGVeS{lTp899x0TwZ~68@B~oN@sYGGT3bYc3| zQYHicOA74UfFTQ~Kjmip@=G76BbZpn%MH1m^zh;a=-c51MYsIj#;H}M^e_hQcn5IP zT2lVLtj1Pg;5PEtI1po zBh!oS#9T=KZ8yE2&A(SY*S0tOL1QiU;ql6VQfw?@TjvMA0JIa=hk0;9Y4v<8<-3CD zn;w6=Cw@?z^3(EllTu35*$n(ph0~^p-EO!JCX?6DH0!*W|u7$2V~+u^F3#-H{lPOLwB5n- z#O|=T2WRU=J6&IeySm0ficL>NvOc#)Ai-++L#9)5mWr z^hmjno<|?s}_Cr%m2Ob7@GZXNIU74>%L=i8aqap}Yp&%Y# z>q>d5DL!&~hbHk6n1q&-xgSfW8(i_O?Ft5=~JmGXCltReCMfy;tYD+oC)cH)#O{ zHC{>7|1vW3Ms-Gb^91ho8H!f|Qcuv$^?L9dWVt4bg|FqEdQ7kz{&nV@&>uas$b!To zaWMHiTNS$Vl*1v;oYv#4?WOfGb1|H|!@VaBlG0PlL+140m{LV#mlx_vU8Z2V#Ct6g zxmqe~blsQ>_wM7ul1Wx8Ja+y|-#h!BPc&`w{u*vcO8&T}m2Jk9)?%lJ`dV{gJ!pVj zBR*ZWP`XuJusej-QoZ5k+VlA>ivhi{0pQwyOgggN25)16`p!2&P}0p{g`e}b_%BL* zB=|14O+-RY%K5Xrd0AoON?&>F@F4P{hu3E@lW9f*Zz@(yL-lZLV_(kMQ7YJM_NZ>j zI!2`hlUXc1l24=j&wQxNJM~9+)3atVS9j_D@<8e=_of~^pS4Pq)7?M3gAqE@j2MZ` zeQKC_Qi$PRWgihZcsQ3p?e>nv;MuPI%y}cnR-5e8u3fp7rRw^dS9MwtLazANf;4^? z3%jHrJPSl%aJ^<)zvE8i?-U5~j}-^gJyP+jx?d4%;5w3q4UgGRz{V)`*0(Abu%J% zO4W@7xiP9P_(=hJsiKdZ!_G@Q55G2vc&tVPO^;@5gjdXc#P8qwtOP441P9{u;|)UQ zEjKRq8Wsari{5!fmfUY+wN_l5BeRbAmYrD?dYlWW+rSHNdL(MQ+A|Uwk_tBd%{B63%$OM6-dY1)(H+{05@R2J+*=Hpl!42+dD+{$I%2n{B>02! z$l73?(4IBefv!I34X0YutSV?kV`(0_2;>~SHCE?vp~thw<`47UZhe}Td1RIchXHRb zi|XzBm)4;({)?>}$wuwrHroPmT6(R=`(HhuM9KSo&YxdNRcc48XL~KD(vyyerN3J; z^*)1x2tiD4?AXn*l)gCmjzdTQCoi`bJZ&V%u`+&z+}f?>mm?Gp5tsJU6D3iTHgLE`^O%zEOCzg#ne3iRM02;%#)sz|%?5 zWtqlYD~obdI#?Fhh>aC_W+5jTl!}eI$+%H4$SN^#AD?YD#k#J~JL4LRprdfA?6_;8 zJm;AnbKq#H`V}o;j*NzI{_yrGZMdCX(tg80i2V}0b|3x*?UhQ!s6(~;8I5Gu3{x8o zNWJR$aOe^$#t8APLPAl1;0zlT2ukt=IM)R;GnAxyr7Jl=2Q&jR?AHs_lwE(PsWDd5s(=U3vV>^C!8f6i4sGj7ZcLef}v@1W{H&v;4DP~`Snli z2$rdNg2B=LWDy(Oc^4_y%FIcQW6yCY~V10z+oq)x;M18_+>1CQuDevn2fquA^*Qi`u7 zv==_q)o?Q~`1+4e;dbljU#@w!T()Rryw81yJVC0Df;{`RDqyjSh|%cJ3%XcKbrnt) zA^4lNR5npeDse>=LF4A{XPMi6T!fq|J>M`%2YbwkC9{BB&tX~&}CA$4twl&-$(ZE-6UZeiQN{SY7pw;+|e3!62L_jX@3>C z*o*WXLu;|KG_H*{(?iid{6WTV{7en?v|Sb?>>Oy=Yb>9cr|X~u)w*3?B0gjPBS6<) zC>LCE3?(G!JG!3|#U%fZ1x%9o-YSY-dDG-E^JT-1fS^@aeyG}d*j>2!te^C#KY!mJ zEYN*=HNXop0hq{QP#82>NbdMS7(|!oG>q_N^_K4tz62=B7}m3zrHZBBhRB1{DRDo~ z55c`-rU$r4ZW23OR$+{Gt&p_=uH>joRH#Ch9otFkHGfwNsD z51C9S_{3f#dR74|f44a{pkCt5b??B_t?^5S7ea{ryJ3{}Jcy{dl>gB(@;9s8mAs$6 zGPOLn{?2wG2{;rkN=@k4r-rqYAf7Y-e)QwHdoy5}N0BVpZ1kx2kJ=^!)J_9<6=sc5##(UpT(GpoM+ngtQ zNO@C0DxFhg!wjIcvadj4okR%L@C>3JK5s-{pu&wjNvmCO7sxRqas$0zY)}ivh=y!u zyKwt_*PUF2{mp180j7Jm}cSpe(pdIh(gjA9g7=(}OtA2Zi%z~6BF10`X-6@FaQg5!` zS+V9vt62<~@)-ytt%b`V-8YPunLX;nQW@{<8Z3=S&QA#3n2Q~1>a1^;CvNImWi3v2 zvDJhLM#^eQp=I}2DLjDvaS9nVPY1WeGaegpN8T8)`R~=rll?;PNDZpH@5EV;QuLUMgqW=3@ zO+GbG{dhI~$ZOEafGa|;&afQ4htIlQZb>U7;xB4VCNhB`y!kysB~pmZX>4=^E$0Y~ z2xoE8VsDX2a`2&i_I64>>QMsfhRQf<;9=@jwxX%n`xT?_I^wYr@EKe|lyL*CktAPC z&PTLnh#80yYp2l@Y&=f9Pc!|IujYv*itzklQVF+HEW*V0@Q_FRBq>+mJ@B-9I?{1y zla^;lL*}Al42*EO=?yCdRh)K1QbaD?*6Kx;+fndI4#|5R2m-u^n>_Uc*!>FtJw4}v9t-zvpx3816O~(djoxdVfht0A%L0aYPu*= zWWwO-Km%mHr&bX4#he&0{LQlN_Xb`SAq(P4p@(6i;rS9v6LSd}>UDPr=6#1Uiv$UNpF#h*P-hS0?ILm4Ee_{n9~notV`v_WI3( zaV0=zQyT~7R1WboD3~z=*NNFCzuvEw-6>w-0ZH82fZ2*nJPUfWe+(0ujCGp|S$-n< zQhzalBmwv>>O=NY;Y&r{VmKXGY&`sU)lq>8!`;e(*%MtHMRrjwT9sJPiY3-vpd$Af zg2>Na1?CC!X2^m}CAbRh+G4yo&=}UqsWu5ag%dlOE)M4UuCQIUELS<$VATN646FlvrEI$g@iB_*IWil$mfE2k`)S*B{MzSu?LL(fKFET!>0~VghzpY?VAcDjU^+Aa( z0&GP??*y#+>WwZTeSbno*yA+r-xu#$@pCCsCQw$DJH*C9zeq>0trVGhac>Nbd3D&L z6>kYdWSstMGTFz3({=$GX241~#|IwB2_ki$A_w(ipq|1769q%C!g8Z{TEL$Hkk10s zlY6Od;0Hv+*qxBhaYjGuQSqieA0^=C_%6PcINaz~8%>xvRvg43mI(=4)aQp=62*WQwzyC?q&@}c+?&9z) zJj`YCXF(ps*Y%-&7ARz0^*_xikzSY$)NN4fN%ThE1|HdQEf^(yK zR}3$X1Iin0ECYD~j9j))#D*hLif64X(+2}d8zx+s?oG#GHz~gv_wUy z4Vpi-_GdEpcxxHJP_&#Wcb9y%{c{w-0k55)YTP9X!-f;!pI@q1@v_09>KY$!3EltQ0d>Tpw>Sr&QckxFNT6Ss2gPc z_al=;DhoSf;}Z4%z77@mb3$!<{iKKEekfn;Zs$n4NRQ5N+d!OiwbYcL= z-b1}x0t%>!jrEq7(1t)r;b|=qliR_8>CcWdgUVRU3G|%K?6?Q*;mDjmqKlT#2_JGj z4ho1F#vj2wjZ1+_wyh9(?w8M8nYH6sshx~mQ2)`qb4?HIcL(Uko zO91^HeL4H2$Ny|Ju0YX!B|?tMDHf$m2a$YC5>#)tU;DE&qI6)aSC#P^9?yvT&*}{zNtXN_SWBUKx0?EH+LEM-g=!slvoVbbrjF^je z=(8$%isiiz1Ti*W1=igyBE^!uQIJxuUVQeJIW08b#)qR_Z6xF(DZ9kVZgCbKfXUK3 zbekgN@ZVYDQCTtYWWN=}$TEWLh90z9u)H|{y|3f~e$EpUKScK`=U8gABxd;$H1&5V&pBtvEaD*uLnnfJvtahj>`{qI@RRP@93jhQWcL<3Zw zrBjy2ZF(VXj^Edy3dx`6-565vy!vwyx`(&|Byp6+cknq{eBz1Rrxb`lyYOQ7{!rPy|BRwGH21S9Gi(1q2 zS5RMqjS1qsork4ikWK~?`Jcw~*MU_k!q;ooZ2F`VBSCk=l2*(}inVdSinAJYmRaPs zLCDA#9$CFTZLS_InW$#pN=0Hn3|g{sbep!ycRQkyTkkY;kMo?9vtbOG{?6=EnoSmm1F8WtHgU0wk6$*k}sD`)&f9T7*52k1n? z?0_6x{oMk?!2{g>7`hdsU;~sod2AaeuOKK*xOq_E@x(u&Hfqj^-1oYkN=V;o{JiMi zVV0dk{^5b(9O>+DWzS|Hrj-APzI^W@hWOYuBnkGChfr{^P*LU;Y$DLp2>v!Ov|$Z9 zdB8*E@SM*%LHT(!;9vU|@?2oht_&b5MZW4)sOF2exo`BAm|LT&-zBOqP)qe9XQdkN z^mP!lufF>3@n>1}_UgR#=yw6&1Lu4&Dyjfj;miB@q*s3Vr~I$N$aOH!Hk~2yUZBDz ze)SPuff=o5>YP@|2`9lXb1eAOd8jpQHCYz@jr?j zPGh)Atr+#wpAbnCKo1g(YsUi5sbTa2-&XB zf<(+n6+@qaxRE?1s;EO#;>~T0B9Z;g4c-@|Xa9B8im>inIl{fR zy!^+%Hy~=&XEzo1p|TTE>uyluCpB8D!7cCq>xBPP=mIAfB;zpan0Y4KT2HeXeo)q= zS1#RrcE1k7WDv}P0Ubuz2LdgmYL-zN9PL-0`FN@vGvrW$FzLt#-E3Y9C$VIt&y`=x zEw@CB0l+9V4Wrd7NlLu8f6RCUml-X~7^_U_Vkbki+syf;+roM{{tE*Xuq{QQo z9P!yhBBmgsTzj8}08{oc*$hgx5~H;Upkr0fFAMd<1|xMc?M zKU}n8>MmG=H=MLB$6emUwYURB$k9$l56j$+Ns4S(IMEf8>I*lhUfzKyUrZ*}=Si5u zgK-gPxCpGH@0kJ6Q|8+4{hpq51`82^7!}@HX5xw8HAFU()XrZpHE@E06zzPWrtuC) zHa5*X60?2>!QYF$v}Ola3YMr&#&@WiMP|*Bhjegc=_djA1gm1%uatTZCTMyzU}GPd z3H%zr3t?&^^Re{*CR62DWIT?Nn$7@5;$@$yqjF^L9qUMpp=nJ5R=dQyQ#~z%bi6PY z+k-B~zVAe#(mQwhb*IIs&f~4((0A~cKgUU#`c0733l7j8hp0~hJ4N)rb2(S z>W%U%#;`*yFF|jg59e*^J>yO2*-`h&UVV7+JGB#{U`6c`C&f`E^B_`eT=aOc9rdqpISkY=M?Rqs5O*&uXTE#S^ZWeGcU~#Q)bz4lTV{V6SzlE+TbX%sOh*c@s>Q#nH3ZOMk~6yzo-!u-#RA*%jZ1u^yG0b z87gs}OU@koJc;IVo;>B6URrQo7b6jQqAN!+v^+l~p5a z`(hosnXcJMAp7R%E^0lD_hfK*kM*g<&rf=(&2}t&oe;pvQ27@6Q>Xl9vqUe{! zvvP*LN@uT?oFDW1`gvcY!v86}n#zJ1iGIBwF1z+`GWUYt!_*pH+u;QNEhboPvpa9~ zQjb9?po2jfdR@k~#};2O-_mwbok00BWW^=^rG27A{agHrzf14we@|;w)~wrBfoAmUH^~6yvPHZ<HIyrKdK1GOwUy{^6bsYz35~yTX0fTu%C}^ogzR#DhYnP6Uzt` zixgj?|5big3eikQ_9k798e2>qYjsC%Zr~5dlQX5XCuR31a7;gz-G6_4AaXGJUoD^Z zpXOAvIc=Q0!X_1Nv+g5WJ=gdr6UZ7EdHIN+U_XCyZ=w^I*L&)mv$I$**1UVFD`M)G z=Dd)Gk-{NQN?5cP6jT!j^zMH4+2+wtjCM0hdJzDJ@ZV>ub z`R;@5ErFjeDp_o^C7=WRraC&9w&E~_?rL4`ySwjk3DE67uLc_Zro7t0%!F*nZn*u# zxk}>S-grXMSs*uh>KJw1cSuxFTE2aJ-kSB7Yq2l+b=x7gLGO@vjIt>8W{SFV?V|f4 z?)vX;&+7FyZ~d^luW0JiBC zgcd9P$gkytZre}Wl%EXx9ffBE`@cg%PQe3PNc(p=^+o~zBzCr26RSiYR@s&n2v%&&_PZ&Cnpa0eRd7Bk)LxnyqJ}*t{JK3r~#vnhy`}q)nrII_Hxy6A?fIHAf;;TAv6cAxD1K_XxntFLPqzlFE zOGVaN(~rks3?4|@l&P1(JvgZ8{qmU&`)E#(ZDG_;MPnFpw649KkpQ}?EIA0udquCV zh^6`n0~x}eG)s=eA?V*j+Zs3VuP7LNo8E$zIqKmk7z4nE|2pcu6ZPLJho;Gi0JZwd z`tzJ;hPtUN!cocRPXGu7%)Ux7a=hP2w4 zY_hNu2#?w~IlS2hTN&6`j&482=1+H7;qJ9g{z%YMuWW~_on9fh2WM#d2l!scA+_9( zhnHK<3gsLOj+LAkV)Q3(nzXok?|p#HArb5h53Y$a*PQdj;;v)^Nn5K7-6q(mA2tmW~kQYo*<6z+$vbSw>deX1ubUS zf2_S{#RKC=3Z#JKiV#f8<^?#S8SA`k5#J&wj=lIw9m|P+})`3^Edb*XelyDd?qLXWf&CG__$G)(uHfX|_7C z+>UzgVsX?^5EnJ5m9umO)gZ6+-U0xg?}z^{!0lNdxrIY2WP`uUBW8`6=X}(yv6>8-lHxcvFI5D~>oeGHx;JfndahG@9iI5RO5T>8Uit zqrGa$caNRklfzu@kX3$aaC`mv>q^V8mI87f7;VfylJtCxrGo`GT+Xn{(DZ5=HumO7 zv*vPIrbF94ZyCXdEVJC}? zh{@(L$VN0I{jlYOmaH=x25Xz)F$?u&KYm4}uU#563 z!Je!mqf)5AT zzl~-dmyL9pMt`<#OjqpIX4eVy)p=>I@mO;t8M@eQGwNHxL3Kzot6P5Q+k$*NIE2Nw zTN^RXCwWN#WcZ#FOy=mTTw%u_61Y)tRW?*>KcM)U!kJr(0_)}QUJ2wIYrn~r!P;q< zenW!T)S0Pp)^?$HnJ-Ioe0|zvhIhr*xOxOT(=RC z1gE^d{H(gsz9WyL{4KG$)2sTtbIDC^{F1Ml6=m?(r;BcoQLh0j*gbDc?HPtVf)$@f z91u%WUwuBAK(L|}sjqfe3y;_ehD-U=kx#WdWAcM4+{iP6byqZ#Nod5gqBr9HHVgOy z>j18WNMqMe9Nji_H zNKNGj3$`}x9VAbhDhj^Outa)R`6=oM%{Fu{rsM{(n&X-#d;GqCi59hMGoR^Z3Od7yEcy^#lVn^r{#zM%N&ykcsr*%~9P{&r0#2NDIQ0h`FWVTtLxF zNWO;}N3xB4g8xFZRc$EbOzo9cb(Aj#xBl?4v( zf{a#f0#>uxf^cKjY0uu?s;fWJpUd}{j=sNFf81eZ?*CMC<^NE%@Bcn#7&}9jVvtgV zNMwr!BgwusJl4ku*_FmROk~d%t*FUTA`)ZBSSw44>|`DL;9(FCMf%S3`7gfb=li_R z`+DEk^*Z9C5(D7xg83<`hkHr-LJQ(Q?+nO;mo#~w|MTp6}UBx^A} zHaBjpM7}MV;F0poFBWju4f^14PJD`nJ*Z&~(`3x#+!&aDD-;u4AmEcf5UPu5LXdj2 zOycKR=u8aX7%x=OG3H-tOJ7_m3T>zJC1RUfvLpX!9QJ3f*|!Cv4b%2Ga^|oL10&NE z%p%m5&w?!1D+l;eZ$~ouWTErm1^D1!w<9&`1E??gnI0&db7cBI>zlUnHFeJ_%INjO zCi?J`PrOuqMD6mGMA{zF_gqwe^lkNdkVazoRLsS%Q9r)^IEbFJA-EL?_D#{$P9#h( zO(ZtYCRY&}mX(IWSX*LiPS9fN0LSP3qFUDp}IV-+hA=~rz$>|u=@5p3bBaJtn(;Z_()Nw~iV%9Bc?faNY)crCIU_U&@ z@8AR1&dLo0kClhqX0|{|NAW+l6Nt8|vGA>^Qr;`uH~hP^9A@XdfbdwrI}dxiNB+@8 zG&7%mSYHy!LNU{E5A3jmh9F*vG=nr3D0Zb> zFwT)AilcT22o1@r>sVI~;jdK8fy`55#~K*P-lO+Q$Qc9aI`T_%e9^2M z#-FE83;8D+)KDD#1Uf_2cj{|L*QI#DjpD|0TYTWc=z66wcaUd(T)iO#zyGHQEspl` zZ}c<%l_l$SJAsUz%i<~BLe0~$1W6memFSb59l!hG2qL+le~LcILvy5<_{kqVZ6EYE z5HvUb9LkdGyV5HsE$3Q7ta9|a<&n&olK|)aYDZtTIOj&jjf}06{&YZ6Yb9j$@Lj!4 zvvHYaw=RV^B_$qGo$B%{pFr-qh9(!bY=Tr*bh%mFgLKA3X~Cm7Mm3nfQ}y&f{=?tA z-WutQ#)R5q&a6-e>W%Qub}oC1JF_&S0x-!J9k{_xxiY`g6Ek;2lce zh$%>S&0Vsrk_3UXbZL|cAl*Vf&$E~()-sw>l-JHlqg-lC&mDP_6{f_ zna@yg&*j$*Y65JX)oJ=t<7QDeP*)f__Yv3N0+yIG)TLYGyhH~TIY}oq%Q$o&h_t!d z<)7HUzd4%|u5~QoWoxHd#NK7+4!lJ@l2-dOICQ~3`}Hch}%)v(lo@$reM3WB&s|U|x3Hl8_$vVfOB`sl+4p+OJ#=HM5ki zE;H(f;%sKq-!FF-zJER0sTIe*J=40``i0SmP4KVn-JAiLf9oH=eX6Zs7mA2qdl=%$ zt-KQw_uZ9)Fw62CCafv4I;R$1- zUaXI;r5TwSPKi|MY+s+E)%qLtCNpE0sY|7GrpY1muC2OVD{p;lHFa7l_En?F?J)SYK)_BF0Di?&U-n`k}Y4 zsFnqW0*U%kWdwzeaCr7y&>&Qtf0~v^c^c(}bykEW`xSoj_CNMUb;XHoNSOWQ*!pKn zgphspd-Xl}@#Cry;-Kovl20Hda61^-_|{Mmgpj=U6K171<%ovBx~e(kf&k6zTvdZ_F0}*CCBw!HYoIU0yP&ihhR$DmXnLCE z-g7_YTa?!AGl=kY_Cv+q^W5aY5fj%f&SmclcSHP63On#zVQ;bC`2O2U&@I&IK**6I z(&SH#7huLF?89-xYN~QqiQmbaD&q(jciS?JyWyqzSZhEkC`wX}k?M|87rNT?FjIJe z&j_o(?aq1@D8~k;H6?N4=VRtwB0AnKWUdKcRp129gC) z4K~47Pv#uFOGeb`dD_@1Q$yDZx?j3!M#no0Tpm(@_{ozw@$2$pL5_7T7Wi3^xuA9I z#E4uavSC2;Mv4h*wwI`FkMiTNt|b?gsBK%hVR0R9SYbUaS~|eK6qk_N@PlNZ@UeNp zqB<|9+Z|Le)_DRbDE-eLAt^+NDlftLcr#F*!kbWTv9x@);WjT-)d){VRefNGU44qEr<}v>l*P{gG z2U2AoB>|lLe5a+}(|ydFgP_`)#7HM)tXsY`OAB2r)h#em>g7!|(8!lY@zl z__gXkhJp2gMVIegarB1&V`8`QHH3KeD>x6*Q^S-(I$|m3DEo9A(yGyO z-~_9qf1;&NFzB>eGwTbtj1jBzwyaO(+MuumqCJ$31eWXtCe5bRog)McuI~4x&qkwF zYaGs$zsNW<_)RG^s+pxF#O_w9sHxzPja~2=cs8W*daVFCChz`K-T&KC&qK{57@F6Y z2PGcp9)1ZC^lVM|m=J3(ABoZVEgJm`T7%J2y)i@F5WrlrmGmK53EiS^xc zZ7RqxhbzHwd$@mv#&>g}Nl;6R7r+5C^@ckLe~v@u)sy-d;~%9-@9#Z2;GngOhG0f0 z2h*BRtuPQdlGFd5DcZ=^$LHw@SU|rO|IvpHA2|Zsiwx=p1*QT>+M-!w z0Cq(ZS!~)05z}Aavh#S!pt*ol|62aOb87;fL%9)?f5<5P{tP2vS#FVN#_$kNW$zrsqwOLI=HB1dc+{%JM$ruydcNc=$SB`MfoG1%c`Bff$ae!WVc?2 zVj~+F3`j-3&MzxCBK(PdG&Tc_Yl+33v^kdb#h?s~e}^T04xr@*1o{ga>_bqbX*NqA zYNBkKI6Np+nRXb2%lM}jW$^wE3=~iNum1al(Sa<=!+5?dwO9koiKA)tVli8F+@n1& zCO$yKHx46Vq>ID@F^J3}OP(~y(T@Y`lDway!$K|ks1%&6dN7b${mTH+k!wG-1I8e@ z|1Q6bl`Y&6_ik^O5#{$)o4Kf#$(bBHxzZ{ZjMIXgSV^OJJ}VZKElpRb+4sx8A8P$O z_#ts1%Tw-J+=iTUmWy45Oy5l!sB$ur={nCu{#gt?$O+H@mSdcWsxeZ+@8OwZP@X?E z(Hrh^tt}sMbrL}dc#yOvT2MFx&_`c127AxU+=f?*UksEZtf}Z;!0W86!KwFZ(lmM*6+)oMkdBw8$?vGUR6;^UTVKP!Eem6=)DA5v9&T~`Q`qHpfFvl6rY z)vc~JmbI8e649q=x&s3zg2(kRuiGIaJKC!nyRdKnqLevoL=A*fa%Er40vDDIRg!ji z`12$f=<_1qC3mJpqz<)m+A(MK^y3BdGx@+pE_#o*YF(V~rXWE80Sc6g`ukKb8odxH zd7EmeEQ!uqJEK(^$8w-;`z%d+t4wix%Vjq3C+2wu6OsL{{)+9dzVoxe&Tdj%cH2&1 zz%O*6l(DeZq_zJlxcwH|XF}(hW zkI)nBfgQOJnz1HTV9E?fw)MmD?rDaR*Uu(b#FhLrJpy`a#B9IX>q)=Cp=_*9QwA2Z z9Y2HKD5gfvpBVoe^ZhOiSf!8?6JAQ68Y)n6oEbqg+X+m8-njom3^))WMS^NajO#Tc z*Y$O|urGK~tFttK_V}*$rA9$1Fswew9HH!td9|Sx3c_U4M&%q<;IbEH+(*G}{#SloYwdO?g`GCa0oE7H9lJm~}<( z%{$kC%GvjZ^%lnoEXxS8q%>ip##QP!=O4nIWs#lzLf)x}X^y6DR(w*w2vZ$}{|#AUgvej^E{78eO)bjn)5Ue1kvBVrEw2};NYKdh>8OI z*zy@X06(bRZawgXU<%u(e_;t!&rQI8a(HQ)dKtPt@$!D?VF!78drLfXarAur(9KT5 z)x$n%Md>^Q@j6 zkGlty$Bgv?zN(gZDt&JaK4{eYSZtqP&`8e2{QvEb=AA;a2#n91-27U;4dE8G$6>_W za@-H!fJnYS@{1@^$>kbtJT@j`GMo&07y6mg%PID5FNGAdST1rcXY8ne46Xzx>_D~7 zPH9b1WH4qJ7Zi~^V4>*dp&KGeCB=%|W@1>EPXA5O>11yII|7xxazVh`4dU}aZgy|= z2ZukW>bcabI)J)EX3m z4I)G5Hx$Z#$t!v)!FA5gYmnvT{~W=k$b|DrKZWKQ*ZG7ej?<#ZLEC3 zTHKP~;Ogo4?silX!#U)TC7g?O`!7uce?!nB>+7>WYz7^}i!yGohCh)>GbR*33=;n` zYVx1@izOZ4XMWfkQpaesiGjmk@dylMDCv6QLb;~f`o_FID@gbH7+3A`y(X*IZb6pT zJMeC2%g@;BZL$$}zEv>rWd>n*xJ(fvajH-a;n6q2I z@w0<{yfZ*@yKbqOvC#@ci&98n`~xNg^Lg7-SJi6PD(4>FA-*5{h35}*$iM52u}OW{ zGG;Z9HuP7BNY5GZ{IxZVsU3MQzbSYxQpjT3bogax?3UsF?J(47 zc7=BFFh**H@2`**j8FP`VC!sXetD-oQ_oFRp-duKe}%%=@G(cra=D-MW~{a{F);a2 ztlihMgwDie?W6EQ^@!(f;*iF-e2++4CL)kRhpAqJwd~MNOpU~F5}#b(o4sVPygtHj z?&#oz8qcqxI0+$b?~uomDvLXQ-D0mRD!V2#qG0Pi+tc?@-?@6_Pnbcbhq`k;RUMdO_m~)7F?5qY4itl^~OA`0NpLvkz%awoyS)q*KEW1)B&&6!}}!v2_iD zZ)^QQQ8?^?hZwE&bJbt!_}52@qH2bWu67u@17C)RwZAKo#pjenwdz$wB86M?M3Sak z1MDiN1nRyYNnSRvi&HP6jS`j*Iu2bR&h-q5{dj|{H@y6tHqm zN=U#^p#_`HhS*4xB}yv;!9M=YR6pjh{76(vBJtMf)ZZuC(<(q2tGTeY4JP)(jT*Pc zA62-lv&joE6IS*ss#710sl|r^!%*}S4-CKfVmQ<(DbA0o1U)~{ zAu@UJQbL*Xn3e?oKaWzFQwEweFrK%Ec*%XLjlRFW+^)is?j2|uG-@57bLIQ#6aD+u z;eq0})3>UYR-)N0>ewW6r+Uq#?@G zK!HPEjGloE;5d8Dkbqq)CIUt00LLE{!nvmJCT zKE0EJrkkcbk^LvV0v;PS+6?ymM8V%skJ?rMeYVhC;Q1t9e&8=9Ma#jV7<}? z<(m~=PR8s4Q)l{Eos@J{T$~(J%1!VJ;Pbn0zgy}b?)UOrViKcYT49 z_aIzfX{B*y&nI^#6Wig!3>>6+ia zy>J|3<(-mMWGKqB#}2(yKQnR3{JY@s1Da9WF_yArN#;92{uoNrLD{33W-(GFO@IQV z-_28X#giyRuh69sHW_RJMQ{xQ*P-q~rixzVB7W?+c;@Z(<}|s%AH$dF&BhY$lFr34 z#w+|}4x$nKG(N1n{KmNx;G9aEQ2VSP*nb=)a;t%%PKiD>$WJA`3e)q}lrsJ=-0#7yV0?+LD z2KP8vnt3LmsD?3Zs#_X%xn&Zb)amLcfuj#K!Rt7+&B#C~U86+k`5lVbn5x}9OFTcD zGI-r~nRyZc!SEDJebetCObcO)T=~L@${?B3gxgbUG;{V3kDIz|n}7WbP0YjfE5(*W zLokK1`0X^xj$M6Uy*;I6-%kTrLD^|U_K8E<;b-YRM_(B~3@MH?|{ zMNZy=v@#|o=FS$)Cr}w5yt;v|7w-7^l*qBeNn{Z_6)uHDa@|a9etw&K9oP8mjq$w9 z?=T-upZAhgnbrabqrF!*LN1HR=RUr@c%R57R@8Oas>60Mp4Og`i}-9!!r(e}toMyA zpRd|m>_o+7M4`#N(@Nks(GN#EvvluGnauEDB+9FER8lSp5(-lIA{mzhVKceE*Att~9-} zjUj{jdGf9fF*cF~>l*gUK*?~vXO^0p;s-)%qf)n4?mm%`DX#UMF2D<2y$WW1?y+t( zCZhPl1}pXiQlQ5LhuJRKwkFj1dp-KO3Tp7!;FYN4`a|YTj7g^vt{6?&Lo*kUkUuTs{9r^SzICYQf(N zuJ|}yaeXYv$pv8^$)3i_^|oXP6r@WgxojfbUSd_a(Yv_#epH{ae<0IpLOt=hsKh0^ z&oUY-9C4V`z5yXJ{KXHd43Lq*`SVxZpGtVX5>p{3I2p~#j8(F-AK%yV{%I1Wtot}% zR$TvBSZuRm+aKIj?*lFU6R~y1i^l1+_FGNY4Z`%)>=@9kh5n+?;gWspMcR%lVmrwA z`iHS<4vKz9*?8^`ykL>)*}Ena+VtIsEeq%uOt3IX6wgDPm&dS**praD7x@;RUV3sI}I-HRxR{y zD}VAeN^khHbB@=b-)NdFTWLJA_@89%`x76iCSjwtO!&s_Ao`13Tu{fwQ`Ok7O4N3I zPZng@EC9KdxnxRz$(|Tm1s>R4XCRGY$oj*bY-`uR;;9tP4(EbIeOa9ml_FprrOF_!`+zd z??<8Od_uMOU#>3KOjyXf209AkmMr-Tg*}0oXj@L|-$6 zGsIBtlG(+7o{ML8UD3~QndX=c?evLg%A$#BdS#@<0I`XC&N&zxS{{TLaLVZAWwO6u z<>kPrgMI-+S(( zzy9~c$*6PS($gj^-{T$HmqX^c7$DnX_a_H`zG1g6=hu?sz>zi9>Q68q7ngXRyQUww zP^G?c_$lgxv~7BI`W`!UJVT?MLAt^htO}F=feoMM_452sfZEAP-C$|@&B2?hCj83ukJrJG3s}krG>s}e07OnV z_PLBVX#qLqYi-_G+s9Y6h-f?KnC7vLEoMM=Jc&q{%qH^ zGtEf80%;T}KJ5joKK;yD&6EFNH6Qw9H>UPMk{o-%G}}q<1R~^VtU2ClpEQKn;PKzE zC!V2&N?A(#apqP&7Z*zCydyVM_R0S684oppwY)*lCWJDuJot1;S{0f$BA&_QudOf8 z_V~x$xTJTYA771^_{Re=fVfC3@pLjz+%X*J{tB}aYu52qRTpCk zq~9;`tj}P<>A)ZTq5~WDG~z1N+HlXzd+LR?c(;x42#Y^;7FIPY=|^r*dgj%kZ9N@( z8C8mDDX?$`OM6St_+XSj|1&(R>Q=;pl3Cp+EAs9PdMpg z_t>CJJ=59HROFwQP^gZPs;7>n88A)TzoolI2~HJlNLUAU_^k*jv!3AlsU@x{$%h=h zak_ZG7ZACmcVfdZ2%gRvkGQiEBXjKoyx2#&C&UosH*bk;(j#s)^;UoAY00Vg!BN<{ zAl$GhS_A5%E4LVQE&s?ovRq)aydpxP7Z~SA(Jt`a@IF@p_3_B|{5^2-8NUnpBs7gw zyO1V`G`7m=*2d%T{)hO7%wJVs2R}2}e)FPeE4=tq9O-6+Tz13P0~I2Z7y}sY@?W5G zO9Yz0hCP1PFPPUIBGhBbzZK2b@$MJINunGmUMnpuXh3;y%M|CYgK7+E#YLI-E(8r zq`$&E0Y7TTt(FY}|C3H~RLLrlzk&^SSZFRb=*cw77*AP`t^d1a03W3xoFjguc^5j#4_jf-STX1v zv&@e>?x{{YG9mNvKleSR%six$6uhHfy;lUz#)qKi*1lH*LbhkX$3i2nJFJ(;+|VfP zM1M9M&GuTsV0zH+Q&8p)?fs=r>+Q40lvyg(K4o;T+}7?~-=AaiaM7x1>IPv32nRCq zt{E0&%0ZY)#gpYR5uyLv9>JGa8CARAFe%Z-K?D=U6 z^LLL&6<)S9!_r$$uP(PwlaLn1GO(RFE@|wxX_M)LyiId6 zLDAz3@ww>|+&*`MtSSf**4hs7mNa*@U;7bxyI+`~Ul*EpwNXHp@ZdP-CU7fr%FEYM}RN=6pE$y&$_|KFAV_D+BZ?X-3;+gOC`Gji* z`<>qmhU8ZF3LCQj+kmdW-l8^mWgfaG=ofVj-$~Ud@~{{(WLTn{<*|m?CN24s2Q~8A z>k#6%Pz9Ol*U8y;C1!I=n0tCB`2z#}#31FYFD3(>q=6kCk~EPfih>eNQyvhS#tG}L zbaB^Dqr!&Z%t!mp1Da6X#YXd;*5tLdMItCW)9{kyI90O||9eMwN<-Wr4AWV?p#X|k zc7B>t!`OEIU@?3|$K;jH#q7(L(l*?cit&CMlzoHaaf?(7Ye47DYTBE-Iy9mvHD8k< z$!oK2Xk~kn)u?T=5zlBjA=VxXZb$7De{Op4ed%sk>X9crWdv{N=`8=>svu`x%{wuY zm(#tMyxw0Ty<1n|rK2EM%9X!b?c$DO&9BY(DO9*V)9fPJ`t5TI=!)7K$;8>>4?2V4`WK5$yZh*k=82K<@^--v%$bOY1L) z%KvdS0vSWt?_2x4m4UYLOKy;;;oT|)GogwzIBNXmE9_KTIncPAg5QzqgYRtlYI-Le zVJ}L*e78Q|^G|$nI>y2rBmGk)baQL$s155n_YcVjq&&puH|Hkc2;gH)8mYe8E+rOq6dKJ)j9tT=Jfw85PuS7%w zvzG|4jW}Rb@#0o|xi#J%pyFmPcdWE-+X2G5Yo`gQfH z<_$LMKg)*{a@oYTrb+jhI;Phe%kz@sn&2_^al^mPqUeK$v0(rSM^DZE-VUIPDvk_gb1ax4~}yw zQVS6T^O|#h27DmXJaQq%-pg-0U8VpLcWU!^2Tn&)rm_zG`s?R-;=rx89$(6ko{?yh zq(U>Idvc-3{0%~&_FM11Oo{2|7kvsjA5Ie)7cW~Uj(5%aP8+leHWp&wwu9DR$iw9O`ciI|<`uKERq0c|@Tm|Fx&n+;L>m~SDi z0i%5_yz1N0@PdpG?y@MUx30)4-M&(ysP2ct%h48bDEet?N-7t^FAt^FcCtdg=S3VC z{E6p(7-uwl�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 Lm>cICx`h1)$n9Zy literal 0 HcmV?d00001 diff --git a/src/server/static/icons/music.png b/src/server/static/icons/music.png new file mode 100644 index 0000000000000000000000000000000000000000..b7dfc730ab41392a37f10f13a93a3d7018c028ad GIT binary patch literal 13892 zcmc(GgNGt*p3jzx$DM+^{BE8a$ zba(eR`#kS=ecylZa$Q~w_nbL%X6DQ}zjNjo_Do%gl$f3vf*?}3vb-h);e#eVbnPnm zwddV`0)Ab0QPy{d@L>D6e|U-4JaxfGI)s8ALd)3-;q}tZ67ur$;||lx<^&2dDr<@q@ekaRoN6YE;U9K zea;Ak0xWHVwsTQFT5oe8LI}EP(X;ip;ht zdPyjMpVwGqJND|?$d@O05F|W45{9iirNqogxA# zip@V8PCe@qFQmTDZ^n!m!6}m&ri=W`-PWv&(WMz}(qgx`AP8AwAlc}z%y7Dl>h3=} z+;3f_K_55g`<)h0h%0s2?%k(_WUj8&6*IR^{u6Ls0`oNcTqob_Cr4x}k_zOAgd+pa zUB8M6tP1P}tN&5KalB>!8c>dYGT2W~C`{VZTVg593?8G0K53tMm^KZymYT z%#U8k_3CH5Eeroy{}w_n*fgJ?bS+qIcO(`iZ*^dw7~olhy$ISDJ3T2HQccV8Xdcgs zR`FE>{E$Kr6yth*a)_By>#Q{UoHCFRretGl=LsR7D}Qge81~*Uf+q<;bUu}M5UQ-o z@3f&jV@ZtzeZOxyWB1C-QPB@PYaZ})M^Z+1wr&WLX|KPeN;hhcUr1Vutje41qzdk) z`e6UcuiWhoMmrGjFd!9={r- zP)I=I(F_{zKx4KEG{Qk6>t};hFOr-OiiA#2lrJlKyVqyqYTdh(k| z>M!&#A|Swmju4Vr_*zU3Ca?f9G)-kfkTT!F{%h-B0tCnxFHM4+iZ3p3DQ1dX4s zKtlpFrYY}ZzEqZLrC8Cqs+V5Rg(9xB@?($kP^{}YJXwj>ay0}Dv3h^=!~GiVeY9IdtUoomqRu1P1R zf2IL8lTcAJI6=Ak zTEcF$B1u8I3+x=aq&WS$SMss;z+K~u9kKEWZe8monc3%s%F*Lu{tu>pg}!q2)dh{SG#cmW#*f>K_$IR7leZZ7Sr>$E=6?~Tg564fj}Ju>oSuBq zO+eIJ=pq)zikH{FsQ|9!^Vf$)YeR}>1RNI$QY@(;vk${VJ?{)BJS+_hclLWsBrN5Y z1ZTBJ7krN<_3SqbYANu|1;hmF+NiXhdqi4P+yX?`9~V=slZ

&KIwH_W#iY6p2nKYUzHA1wY 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 literal 0 HcmV?d00001 diff --git a/src/server/static/icons/pause.png b/src/server/static/icons/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..91bb0afe2984e46d8b3901248e6bc21ba301640a GIT binary patch literal 19939 zcmdSBi93|v{|9`Ju{C8GOG?&}Y(`VuuvhfHrr_b(hZ<%NjXdr>^t1DJg#7&c#P7Si`qu$JdL4d#?UfTow)P( zvCTzvClZ;3{&rI546;j&7D-J|_j!2J-hMqU9pXSFLXaL}rjxa7Qb07p3(6RXLox+y4ev--@<1r0E?k}(GFSO9-XFg) z@!`ZdqaE$>xv;ayq;qso7Nn#5eZh6+n-L28I&1Yp?EWvc#=pkcO1hNd0XJC6sRak< z7wonE)cYF92JRr8QFg+ihROO8swnfQNOatlDh$gX#ZgOo?H>+@8+dv_d{=xI4dg3I z#p~YUmuc_FAW2_$D&Erj!pm84`Cik`#Wbs%=Z^EI|7baEw1f`Es*L;+qxq$nHQEWo zj zeH;7vw)Pn&i;gOg83%_gF|2HP7a^!xwL& znP|#+akOOdK)MKB{e#;Yx36Q8<0i6~2aUCZ$rrOSrXlp^={y;?*IXJ0myv0iG1;&O z9wdywIwvlv(Cm5H7m0>KzojokRgCIK7>*vTsdLY7qHC~FUY$A$%CB$VHQfBn zbYJJ%uK;}{4L8_sv9Y1O>&BlMSPIh}KQd1i%Yg~I>Gj3wlL|qO-SSTs(mbJz*0arT zj>S;2=NcoQjcv!^ZPLD5F_p1qWK2Qm@WFA}>XUp<`B5)2&e)UGjjxx%>-i-D_mV=k z`pvtTVO)?fG$+lpyinkG4Oa%kTkbHM=-;ANd5J$x>l=S!LX2%e(#=M_z?Q>i4fKO^bRZANOr=p z`%YrTad}_nC}5kydq)qrUqw6U!8gxApTNgxy2(%}TU=O~E1GEDrSAsF&+a!J{pL)I z@-N1PV2HIO2p^#{0*woX$`gmHZeAfuv$=CY`C0PuH~QC=9>RWnB}8`fOF)4(eqo1t z#p=S1vXH(;wTz>3VPP6G*L{-OYh+o-Fj0|5jwD^Ri*q{b!Vw(6{jX)Xf-;cL}qRaWcIoF+3PPBTKAVe*LxnU7<1J!e^$(w*oDX< zRP@QfpqxA0>b|njPGz7VLW9+P%Ej02F4}yy?25ycz{q^KbfC^o5>c_3E{=)$!hg=9&wymws%9;`|cw0u!j{ z;96#W!#Gou&3c-UEirJgN?GW!m8H@C1BfHs^nvL&Ti8XTJLcy(j~$)LPMOn14yKxq zCg2@&qwii|lY#}e5=1)Ip*g=DA$c&_8%#F7QtOB&RntGu>8gqMB*?p$K z^%~gT2X@43{)n^CJ*qRVB(`e^t5@UVp`#xo6RX@a*JmJRwLC%W18ZfUlep|+OSSV1 zcW5%28l1D9Ju_lRrjWa%CZ*lvd_np(b;(Zzk&D!3HdY@E>i2PCFXt3#>^Hse7@x-jrxbH`rYxvq;THqJQ2mb{URyBF&a_ zDB8v^T5*Malz-gw2#(gOmd;_KTRjQ=GOLqa6oh1A7Nr|$L{sGxA1Unab)TS8G6_#B z3F6u!(8sSV>RbeuHV95keh-JfBoM*GnZlXYooFZQ|vJsmSp0 zn!ZLpgJ`bJ&3pvO(Y^J^{v9-X8-Hi&alx9Ak;qz!W&YKJ-@Z2iTX3)cB(v{3l9O>? zVtV=oBVrXeI**;X)tB$P-3ZeP?xpcW0GpkTHah&-fsK~fkms!PggmuG3o2^%dcQ(% zN-U`^GIUBe5Dq#`x8g&70*fGX@F30y3T6n-Z9Ofr8hc}Km&2$jvBo`f8qDlyOyS&N zNwKWhYrC-ND~CMLM;-ae2c5eOjNWdqE6>=V(aHl)W`CJ4jn0jc^LF*&a2&i(UaiaF z+!c6xzhYk4Z@Ag4So5G%f`5VL}VNxm8P=Qi%E91U6;deDRu zzo^WuA7Z{J-qUOsrH^CJUKIWNHO19fvWsvYIy$u=0=~Cn8O0no)R>#8PF<;wW3sG! z&1yv=aj2vz__wu{K~(QcM0_MU!e(JsjiJH89^yx{g!H3*TlX`(6GoVRI{jZv-3FnT zOTQs`M(ES%x$jaY<yMJn`7r=c#3~1Sh_V zG5Pn&UeM*C(U*Jm=oPxlPL={J1>Y!rSE>aVrdW!m+X8e@~|Sb;;c*>9p4O z8H43lIv5J9NI2|kNPZ#Y^w>mB&Mr51u#lOvGF;sHu0~H=poJ{!jDJ=}yUtWmB1dp0 zPr8gAUtx#R!kSK7ob6oJUV+s?^f)P^*}sM3($a|xVtTlw&)@eqFD>I#C|s8Y}UWlhv@owj-Gt#qn_aS~2ISc<5{4z+%fnZ7-J~qy1ClrxqW}pu+bxUd{yk z*a^P7Btt=Ugc5LZ4xg2%ApvnfFLr;^fcEClRSj=Tewe`MX;h()R$75n=K6n=MDi>2$v|)6PF9 zX<1H!gM2J)@>;;Ko6~3X5pup^HeZ%D?~{uaKE}Y&k=6g_0l_*-EJYt=Q+0_i=p8)6 z(i@bVY0mdYemp+2_B3z2Ee&2VVG;EhNrywo7Tuo-^3D&UZjC2iVz2Fq@?(4VTh};* z`%(&Ncq9k0^nhe&C$T#?rmWO7V^hO;;+zd!|K8{K*S+)q$$f0zEmBU6o!j|6t>=*K zV{q_nPi+cq0X}qU^zD_exX?~Qc7*sck5($9=b8}W+Tik0$5~WhGxi2e z+PBfyazuI5DSw7mVeEN2ztxTBT^|EO>k8kWKGo5Fa8Hd*8$=U6&|x}OGqPC2cxQ3B zBy3#1!*L9DCem12No9p}hS33$Vuq6{Q4n=Nt$V{g7`V8b{j%G=85WagvMGUW zd~{T`J#5gox<@jAdG)t%9f;m>*v*P-ebXhC2bb+8WG`VthoqT3s`~h{*2z5hcb6iV z(|;8FD+^KFz>*OhUXZYXrMI(?ft54Kz#VZgoujqnFuthCb~}qT_mdvY<~?#^rIFRc zPm+&}ilwaDVHw794V>uwbWBdfuL~t{VWAt3FnHl&Ly@(pTAkptF$%?&JrCYS%v(Eh zPjT8%n?-ErW=e?8<`KCax3x&QyZo=jU+EJ0F~;0J_wK8s-q?sF9D*s@v%Aa9yZt3n zR&B5ht^Z|EmTo{R749P098LKxVNM?HqCn3SmTu4Ku9&K4EuKxohJ+;|m>qA!I*we^+jba^zOUv`O7}nQlxV@w}GzAwF>{5r}vS zZ~cI0TRb|~N==ThWIoWndXz&+H?g4*>Biaz55z;MaCv})4tJGVX71;%L~y{|+ZuD1 z(s>RvAxyF5b=~qCCfl|HyvL8Q2qcZArOrLk;6rJU#!9{--14n)|(soUU9x+J9%} z#Qa?M-CJ|tyTyc}+cV})S28^BVV3p1s&;jS34bR-^X!oa;MVkB=s9lp{+fBl1 z%H=OO0=1o~&>T`N3pIA`ZvFHX_N`eKeq^eF_#Ams&c#^UZn<-@CdFDR$|44H>6H0;b%qID-vO zdHwPJ`F=43i6#;pUw-|LGA~ z?<*ADw|^b)%PYwUL8v`~2PLAC)ZV!{CKZ~3rA9`MbQDyq!0P)6_Qq`X-WDs z!u}avZEgh$&86!-w&Dv+@h(YHG{&e;_MT@9_DRkg9%$%=6s)6I;W~er%`Ca8$*`P} zKWp?k!E}9f_BuM-j5I_uEiad~OvpdRyI2Oz3|wVzpj$2#lF)tn$xnAHhRh@!TinxG!Ui-!S_n!VhJEY`60n-|0EH4+Qk#nH(-Ayad2ix{#cPrkIItSO;4w3 zyFiYAZundZhQ-p^cepHvd4eF@8L9(>dWr5MFFvz%CaE4j{N*-!`Pvf_0@=ufRtp}2 zn@OOrBm5apH2N=OCe|%K{M?ho`SqS;&aLtnR9?`G#^r^RSJItOTPgsP7Tk?xI@^|ES#D9 zi0Ra`VFWrGTJJ8Y*Ey!2RHa{bac)hcOIu8m2w4q3A`^Bc+nDRVtuoIPfsu(j{D3Ms@HEF z)+0tuJh`s>nZ`3sz7jR_JU%o_)Q+~z#fYi~+0Si=?n?psvaD_YS&UTz*7TCJG*m6^ z7}-9di8#(}g%uv+$maN04VVZzu2V;(@Z;3;j%~LAMvURGzg!yDXv`{Ide0W`X_Q zhl7+Uh=aXqjjZ(f8vBj-r#@_NigW1T!@Ur5tYb5^Cexw8!dGkH?SU91kzMRzT`x1w zlj+Bz2lbL!^~=lb`|VM@M1tsnA}f$KVLBUC52z{;d~mwH7D%! zq0xNSk9I2TR#6YF)?6$RIcz8e$JGZd=&2&S!?Bo4<^g%3R%}eruBS;@`EanQ_}$r$VCo`U}B zJ~}RKO(${-WG3+XN!$QBF#C3~Re{1jPx8k_RfC9>HTi?{N#6zz!laT6C3xE75W%0O z=TEMN8eD84i<3T2&yQq%`Nw*!XY5|Pd?vHN?dwlH3r%Bn=W&PeIFxq`ww?YrDt$fu zSTtbQu4H3lmj)t7PXBns^il2;gQL#?OqK~jCVTiY-x(~aEBuldCZ7W-@s_5a&TlSq zy?#SY1xkG}w8pGNB-mrvMtsG!72VPd#E50>G?20*2?iC)hW+*?jS%dsZ;$8vi=DJ2 zazlKr%`b$eTZ$E2H2TrgA~c~7NRn#r-pLr%RmA644=_Q0)aGLKpH?iN39nw+<1p78 zib?WY)Xb1=C(P(B1~ZM+ADEy;bJCeEqRV+?eYa!SEl92kF0V0LRM1&+Jn{@#@LQL; zrtzC94{?nRuS)DkdTY}6k<~0Lresygiki>NbW&_vZWkTgCvX3rQJJ|5PCx2bAi367 zHeC4rL)}pTO=%S%)<75o^CB!GTkwMfbr4Vi=nEWQZSQg$h$TymFu`8Ck=AY*U!EY? zy=QZ-bNAPbnES9oWHNIaiqRTsp~pSa{M#e+3*^AeO^prn>7a?7qL42J=E9ycCQbIX zwafYJ$TlwOt>cq1Ay$p2Czn59Rj60KAD>ec8R{#sAyN`6C&n5D&{L)}a(wq9_Hs>W z+b7a$f&AeLB@|clw2e)m4Y8q#q!qbcX&mYY$2cOfJ#5FAM%h#3+PnGL(`^-Y$`@p- z;jN2Z-`>%JYEl>d#lPlUVc+DlZjXh?Y@-MCB#e41ZwaSNJCh&#Ww(}!nMN?t6(-Ug zuBo6a#t8P*xz#dE+;_MQL^8P{MWj&KB-`+p;&U$1`K(dN!4H3HlZf(JX6+?yE#Jod zrdO1KTOeNJeg-+=<9$iwx-cCMgv0t*0p(f+tl?Wb7MepWG*-Kz)(2e5cH9QVYOsGF z!(UvNt{)M8Y)Gj(2!}e63`E(_zqk=+=4Y%17T`YY&4k8X!PCfkIevwkkW48pho(FX zKmCZvpfUPYK7)vtZD`+X=Jx)hXQ@e<15GgP(rB$<)(+m+NSf*mc>fe9!aA9;**<3F zWd&z0AktaP93TA>bf;O3z-kr@4VJyEyYLX+nkr{Ohkx|z*xPN<#%q1^VwarPcAbR# zLn?^tzKN!MyTg>)=YpOsAd0IELsuETv0nOudI(3ii=~{!-Kt#{HW)7wI~b79x^8k{ zweP(;IWSW^95*sFsQFkyuj%6!gdlPYj{0sr?zJN#f1f76&>B=BdON4b27mr4?*Y?j z$ZIW@8B~6^Dp+M~j9N2Cu410>dNubFvW?T{Cr!UtA`4-6Hrm5Bg~{=T(RVVjaHK(v za7WVyj7>B0ZzejE6Cx_7|Dpr+Nd@iA>B6NKAFlkrSOBeqFyQat3mw0W{xF0}{{}Xf zHOb9S|GZ+!RtRKNs)SWrFl%IIJH~Y)3W`;t?-O4k2KY)c?Npoajfu>kbOSFkz=PPkbDY-60?R^GPYWSZ5kZjG;^mr)d`g! z?KFf;{rDSJxb8!yMWI|p7e|Ap{>|0QZdb+&N9mt}Xm(0_xq3A1>nt^yk>=ksJMKdF z0YNdrhs9WRxyN@Q=E3_!20_AMp-liuJ_6ru(SPM9)WyTFROI8@r{En5{RrOY-3I>Y ziMr!x{LziEKs~m$BRg5{fj!urUa^LzsqSd^_9ssel6kq-s4VTmASGXgv3<@vON1K@ z1w>@_?*k}fn%9A(&(hfwS@$^u_{;|SRv-&`!t)(gQ^c6tGH5*f9~|<`z^X^@{&|OA zDCsEKxgJia-ENHAfJ3;jI!58h`A0&>NMuvw9ElTR`^XLHa94fjrCtps$Fm&N_}rNG zAR;js)$dK`*Ek?O5H8&L*HHDuwpvWp3Us&L76f8JK;2!uxhElnq zxqhM-q8>H$JwHlZ^k+p2Na7z-ndw2Ma{xj@QI;z9&jn$ zj_c7B#~mLbUMYFx3I&kk??zj?4z_suLb#7<1v;|^p~rfdYHa%mOc8i$S6>mc>O3Dp z`mnJSf-!0I8wyow9egrUiFpw^5rK940U`KVc5QRddzu6ZL5k6G8#RyT!ZcNg!2Ye)i!mdCt*;+xAg7i8Mg_Q@v7F{5v85M-K86mIn)*T8d5}o}GQO_71PYFo^|}>ReBkQuyxS=?>|8 zIsM~pox$Y;cmBC6NFKoU9$_^rj8Wnxx)2vQ7WbPMU;!RN(#_B2!LqF@uTF+95P3(5-Eh0mXrwfEzadS%3zxwJ{B?^TQ^_rIlBJc}rh0UD-N|)c5jzQ2t zsH{OlKjoXz`+da*I9E92P>EHoc&PwkFpiTduGadB{VCE2&j*mciIa_$YPb``jEqa1 zSJ<@ECjHEz1KYc(6xPFg z{`VZ3?1}yN1{~ACKVNL6ptRTk;^KrrwO^hR4YPetvb~K$an!G;%eUohK&fXTRMF+r zIPgZJ{F8h*UKnH5z^qTy1-KCWT{$U8t34NR-ymC=g%C3`GE&XzCk$E|!;q@+JBj^OdjKlh7Ep(^OwAWZ1-n(xrHBr-2VL zgGu4@y%J(bgMsMQ6ebg-ms5%NJxCwxLUjFAU`{nJ|`^^Z}hbo0d{IIpE8V zG+1res3~+whogVWT{St;3d7;^t%Ci0O_ZXVOMUM_o_{nV>!nIqkThw8%}mk7z9R_!oWkq0XcsxEo7|>)WQ;ba0EcJmM zgK3*r*eDpyDH8*aCkL9gP|Lw|7z~>~qg# zAE=EXY<|(kusuvy@C$F)v>Q%=@kQiINr<*`17=$HnpZM8zu5cV4!xY|pfMO9O7vWw zc(JcDg%rZF)g@Wt|7|+8P{9_)Hk4M=lLA94zRDH#t1SXb?iP0-vsKzY7u0hpDnd%4 zkm+W*J0A*hGW=$>yKwS6JJ){sB0V?POmD1cgd0UaeN-2+T~nHcpkj)y&71acBI#e8l7^CIh8UspD&X)u-(dS-Cd8)G<_d{^@^dB_Zu!;# zl6a@-tmL4YrT$xEvf*K5P97KrM6HiiRtjp}88gqOEI$2VW4chir5b|?|J@fQVz3Mu z-vofW;&U-`--f_F>MssN6+EEsx0HGLu>f}GS6nm)Gz-X=^%~T%3@9Fl=~s}5Wd2WO zjfp+)0AU|RxtvjEYE9yhCAg~vYJv;}%Cyt=^Aa^Ew-~(Vu#yM-{s20&{S=F?2<}fS z5d%CFeLXdh346~i@DWg)ia@no3=bZn7y^^#XB4^9k%NrWW7H)o?=q38DGGHgfQcRH zN6fVYMgVtQj8z@PVu^pThS!@ znEBf$KoR>JVE<_Fj0`4v{Xv~ZWubqpn$10;#96}0uXe00-a??5_i&roLd^#sq}*$!xn*^H(Vc#Poc(H+ud7GMfRmzN;u zM@dt__kSf68!-5sYYYaet=ygK0{gGA?OL*O(CpM`EVt4C0f+Bq59Rkxz^aQFhdBA> zO!R(+P4+Z*Y(PYFKQ^6^-~SnLuSF%JkKx!G?8oI{;P@))11GE*zUt#v^gK&iE(}!X}TOp%>bKzW_aP%HnOM?Lo z?-V$M0bKF>hsK}dk0e-YL#()>Q*AXKU+iBR;<)%>?-bNJ1>-wc5=Mpd0EE>0&z-s* zt+SF8Dt`M|lZ=1v?F-cxn%dB<3IV$;;<*Y?Aa_Wr7&c=k?o4~Az8bz7HC5AnqmL14 zUk1*eY8HQ@Tn8`_!uj6zQr|%>OCjchf2+LRRp6Q#57lsldJy z09`XZ6k8UNO_3$4C3-T>aJHksdZErM5L&Q$>Cf4!1N`P6B{hPF{FJO(#(j^TV769w z@X!qFXnW`b9M!2!KpljlGf5w@MjD+)p$ZwXOHBr0j@Fkg`k0{fAPzg(ZJk>f#(v@+UJfW%2r=I`9P z*YBcHS#|)j^q~IXKi={w$FjbkLQr$t9*hrLHVZo-60+G)fvJ>O=T5%;N_33v&bD@& zynS^lFVIdJ%Qf!8gT0_on@aIyYJ3vqd0L+nxpSDiB}&fq@UsDT_Na@HiP`$86blxvSoaljgg1RBblJ;=Bmf=Rkqi*F9VM3}P+185o$-^l%bfW^z4BRHYLd`< z!|B)_ZxAEkr@Q0d->O{ZLsfbMTrRTJ4t(mlBXFZMD1pP7xzXgCH+>E`ad;Qgi^)e^ zxYr;Cva)oo6}}2b-@5VzR*yBw?Vc}T#p9Q{*N8NNJx)~>>>wIsc>{R($n7?Kdgw0> z(JR{&;OqqQu~{x}6kC00wqYa&+V(fLFWyMk3T#&JjGUDOM64M z^eF6+rNq%~OzOdx=VcdOa8{J^p$e0SuExdmyed)9{;kmP>4AAZEp9DnND0y9PDfqd z9{;n~i6V4`j-THbqAY`$#~{E zp2L$6l1Zh`UAS(50is}MX;)(ajZk}9vlud-Q`(tZpAEavq2o0xjU}@U4&c$ZXeURp zdS&sp+$|&WSz~H4(EH`2Mo>^z&=xGrqtu0n+|tfzSoCv%Dq_sawt{2V64-6CudhdaN+z+p5bx@O(Hoi?L`)?o{6KvWQk45>FW_GRrP$97`jj{@EZxd`LD0}nP_$uwj&UwHSziEPFzy58hp3Lr)Jwf zd?sWjswqJi&)}7)CJn%D@S3RSJ|Gd?`CPL{D&~%|f*Q>$GnuC^0~e~@{e`Fw?tVHI zFbeXaY>F#ZP@mEaCbQ-5pJz%S@Vk-80~m8^>HV>^GEaSAN4p$!g~;uZ+v<_4=jZt^ z?8oMx-2liBRvFM)NBO{?uj&eLcb?02X2sA!hc+*1dQ1Hv;I<4 zyl&b5Me4kLDgMKRN(>$q5dcwbP)nOw1$Q9VP08^VNRyRc&|ON3DDdJt`oF`+9`uKh z=Vz9m`3V`e3Dtr^*y{IwRp8vu4td>xax0`q65GHEV1hZuW(DdXwb z(LL9*P=2mJUvw~i0wNH`vUA2!H#g!uw z!t@T$N{@Em6|1{+D(x&RTeKpem7?wb+jsuFsc}}`HajtFP(#UC`?DP~_ZEW}lPk=< zlOe~$-v<+al6JPd>i76J)|QVjx{9%#oh_+IgEj^tg8-Ys?y)1cfexd>&7;>lUJy>j zbYnhddS8nz&d%}xHd*y9sdx8=ENuj@$)4u1NMaYv>Y(V0DabCDN<{FQ2^q(}4O11E z+*>;bI|b@GPq}^p2t*elE14_cz2c0<+6{w)dW6a{R=C;w2hw{zGwR7o_n^$uhqBq+ z{)DppNeAey=-~!ieOv6^7Imkds-z?HO+D_opNARFlvH>d<~+}0(D6j^Jz88T%$&|o zf_4*gAfC=A4G zO_IC1;I;c&dB$^ZF*B-%%)YyEKh`*S(7k?ttFpV~zf9Frmx2@^(ZSunJ*Qq)`uXa+ z8g0vx@fKI@pA_#7!++@Du0vw5-RuJa8PW2AjkStDQnNZ>3lhov-$gWeL?mviST$!v zJhR`ZlE3~z{~z-hoVO}$3))T(eLrUOoPKHBFZYjZbA zkd>16PA7maJp=hA(dH0s%i7=uciyc5`p!1Q64Raek^@t3=m?sG8H@>H%|by{tTebl zfhSm>Oh@PSp00P5oeoj1P zamC#>^t2~A-o<f_nS)t~BMeHQWS;YD-~56>#-nepw9s81COABPvYy4;R9SW; z2e1n$$XSQ+@8iaU6X-|SFZ4=-B;EmM=At@=bKd}emQQH(MCUlzMR~07ElQZ;L~?5aP|=YLF2%_-iJ^A9QU@(R%A^=)m_8eILE4;3_Z_LhIK< zeLO7HDbT!M@2#)_P>23lM)4lmv4{KF{1S_xGGbRUM~9;{RM4fi#MGz?)Qcy5dvpBn zd{)nm3(_cMcW82xTZ_u-Cne)eXy@cO1%+PqLsArNc4jNTEAN-Sx@Eqs)xa?RAaUFy zK-WK8!rl{g@$^)nC?6Qu)r43`qQC_>{zG+v8$i5^PhM)y>hm~+XIa16eiqaTs`3CC zz^ZF?s&(s^Y8KvKB~8V$%RCBz2vUJ(PczYS!rgX@2_iRXWqp@N34_68&IBy#);nZ* z%JicYt+^{8&_g^kQx1xRc!8d{#NJR`WlA*jqo$$5$wX_iq~V@Sy_$JR{L~BbnwZ(< z+D|uQ)mlIaE3ncc>h5w_x0nDUlx`OGmzDWcnD ztqhf-08&Gv(6mz2J07bUu+UQW#ZkNlxOqEQ8e<^N*hc)@jJB30Tm{T4x1_k%kW+R3zKwQTTdzISq}iJSF7qQPn7& zD+tFJKc%o();b)F`yBLk;>#ayPv}QPdgq!@rWt@NT{w|H;Wt;z@XG=a*b{pmn;00% z%M~`X^44m&LH6h|7NhS4`E%Gd_a44J+F>?GDGpNfL4qz0zn8Jl1feqQt$r}B zh>a1ll=N~t5QW0ZmxX!d>S{y|0jvszh_C&WSyqU;85ON0XXmDPaYWMi6dkTaizF5R zIe|4^Kqo0kBTH~8O~l+yC%)`cQBm5AKplaT&-2~IM!$^_`dIp1b0Ul!o0Nx@4sQ{W*I z0}9a7IskxrB{2BoClOf+#=q~gG0#r$1>=9UZ8Qn~7k<(sP5KXh%8Ro^U!(zG)ttun zNqL9tppWFl>CG-s82*6OG(WLj`o+mTMM~3JW&SNbCPCZf;*4V;rGLxt7S+Y&HeB{PX;<1 zi!}x5PL&GMLB27`Sk|hM9K)W86IuF(0b$BM418UduU@9z3DvW0k0qWhoqBsnfAfb_ zs5I^$;1=CXTbqCWxxau;=qala@hO0WEd7jILr5WO<%+dUg|g67w5XsmLiQ|rl#sK; z=JV^#w^x=<%m#ba(hSz;`Ge9wmp?@}GvY0x>hbVadMqe(YlM54`x$F#1{ux01#)&Z z&@C=y1KQIg$7?fBj{WDaC|GsE?yz0>d$xtEl?0HK83V`e9@ ztROmDT6*N4hkg77>_Sacu$g14g)5mAKA|1{1@OQ`70@`}YNQ?e!lw<%@rZyDec{yZ zlHRr4M<6?-YHRz?Y`ZJi zjM?Baz>(i~>#^Zj?6h62v%1>nbodHX5Uw;lY8k0wp)1PbI663#Ad{*jG4c!kx}h~_dq*1m_Mqes%T1I}`H z6R)C1e&s-lBFHJ8P(1H7Z)?gMLap9xAwXWcFSLdT6abbh_p zue2bhst%8nru(LTl@>hpN8X_U_@PAGZpBlbr2r(mowyR9xpOh*uuuMRKJg*fi=XWr zP23S_#g?KsaPz3WrRM+jj9s#8=f)uxmXf5WgT6vf!0QJ={W~kJpkILqW+qcwK6aE2 zO@07_e&4p~wD?gHz$2;=Xz#X|4weCSXfs=@sQ*vMnX@bg#;-nP!R3G+ygK7IXg%A@ z%t0Llf#O|ubYzW8URXwq9FcoCBa1`#%^TTg{RlqM7Eq2>V7oG5(iu!nE@TD>`B$=E z$u_9R(&?kjTMjbJF7{KLANz`q`wk#WCEf(dn@pC2`cO6v7|@u*Lt) zS?^?!$X{54)`^!)uFxz_$Q)P;BIEQeX9iBBuT0pg$A*nZ@pN^z$b&smpx%s74OXIP zGA7e)#_6J!upEFLn)bde@RE4`hgSb22g@<9Nwvfot%m^30_w3QL}F?)BE~|Ydm3hY zFe5k2>Sj%Wm$EflX6}oCGqYF?l3u-bN;A*_R7z@Mi|%K=Q-Re?;$A4&iQ4|uI}emx zL~)7a_Xx#MQ=izD>G)_@|3TXtFS^#&|2ma&O%V<%nzrJ5=vM5c5C9I0lPe4rGjOyrOfEX*? zB@>N?Q%(Y$SuJCMBNs%K(R6>|e592J$=Fo-L&n2Of!=cK^d?w=lNa5HBTDd)t_X9jK8R zry*uxaE&W4*)Br68BePT=s21Guj2$X;ojCXB-bP;Ynt?F{0$whOUWt<;%obLNCoUq zMm~UBl~T24W5Ziw7E?>Z_k+OITrbQPRBGSxV!$z()tMPh_Rt(gHxRiu^}sBG+n#zRIHAVkp{NN0$tjb z{i}~way+)s;+)5)-mUOHILN`aQabj=Uf)!~wS)GjZn|)cZtE%NPA)=UeB&W-r3qYHT`=ZT`bl zpYficq|HPyjUJ~a-khsiJ|P-DE?;jwO|9Jb3$!wFz4#xx-vZrom&D>J2f>+F{{4qv zweMDPyOdI3*lI2ssOWNdBGfW-;O&JH-PCT&!?BOB)*GS#O)n0W5C!A?TQ|JC=BIc6 zHijhB=9b)F;6wMpJlS@6%%8emSU#(g#sao4nO_HEaSsG0-!XIxftEXOF96L}DG_jX0Cb7ZqmS=CiL;v5nR@bHXRUpAALT@! zb!N{amCk}D3MEE^@Zi|I{RYsQMPGf5Aw+{u1!~E=m{b-MgmIV}@U4I?BZi((l=FUy zdI+x%bT!;`^OY!5+ZgDcVJcR4eh3;NF|IQM50U27cN(#=*+-0%Lg`VFX|XJNmR