From a358f221ffe7ef5fcdd1c3fc48f3ad2cab5843f8 Mon Sep 17 00:00:00 2001 From: "LASTA_DEV01\\lasta" Date: Fri, 22 May 2026 20:16:28 +0900 Subject: [PATCH] =?UTF-8?q?[=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98=20=EA=B0=95=ED=99=94=20=EC=9E=91=EC=97=85]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crawler_platform/app/api/routes.py | 7 +- .../app/core/crawler/page_analysis_policy.py | 82 + .../app/core/crawler/page_classifier.py | 46 +- .../app/core/crawler/page_cleaner.py | 15 + .../app/core/crawler/page_signal_extractor.py | 843 ++++++ .../app/core/crawler/page_signals.py | 144 ++ .../app/core/crawler/page_type_scorer.py | 747 ++++++ .../app/core/crawler/page_type_taxonomy.py | 476 ++++ .../app/core/crawler/page_unknown_patterns.py | 347 +++ .../app/core/crawler/pipeline.py | 38 +- .../app/core/crawler/site_crawler.py | 39 +- .../app/core/extractor/ai_provider.py | 32 + .../app/core/extractor/base.py | 27 + .../app/core/extractor/hybrid.py | 82 +- .../app/core/extractor/strategy.py | 190 ++ .../app/core/ontology/domain_discovery.py | 19 + .../app/core/ontology/relation_schema.py | 12 +- .../app/core/research/graph_research_loop.py | 26 +- .../app/core/research/relevance_engine.py | 36 +- ontology_platform/data/crawler_platform.db | Bin 25300992 -> 25300992 bytes .../docs/crawl_flowchart_llm_decision.png | Bin 0 -> 161374 bytes .../docs/crawl_flowchart_llm_decision.svg | 61 + .../docs/crawl_layers_llm_decision.docx | Bin 0 -> 196706 bytes ontology_platform/docs/phases/PHASE_INDEX.md | 36 +- ...semantic_page_classification_codex_spec.md | 2265 +++++++++++++++++ ontology_platform/ont_platform/api/main.py | 15 +- .../ont_platform/api/product_backend.py | 2 +- .../web/frontend/src/lib/api/crawl.ts | 25 + .../web/frontend/src/pages/CrawlPage.tsx | 73 +- 29 files changed, 5633 insertions(+), 52 deletions(-) create mode 100644 ontology_platform/crawler_platform/app/core/crawler/page_analysis_policy.py create mode 100644 ontology_platform/crawler_platform/app/core/crawler/page_signal_extractor.py create mode 100644 ontology_platform/crawler_platform/app/core/crawler/page_signals.py create mode 100644 ontology_platform/crawler_platform/app/core/crawler/page_type_scorer.py create mode 100644 ontology_platform/crawler_platform/app/core/crawler/page_type_taxonomy.py create mode 100644 ontology_platform/crawler_platform/app/core/crawler/page_unknown_patterns.py create mode 100644 ontology_platform/crawler_platform/app/core/extractor/strategy.py create mode 100644 ontology_platform/docs/crawl_flowchart_llm_decision.png create mode 100644 ontology_platform/docs/crawl_flowchart_llm_decision.svg create mode 100644 ontology_platform/docs/crawl_layers_llm_decision.docx create mode 100644 ontology_platform/docs/semantic_page_classification_codex_spec.md diff --git a/ontology_platform/crawler_platform/app/api/routes.py b/ontology_platform/crawler_platform/app/api/routes.py index 6a59e25..3499702 100644 --- a/ontology_platform/crawler_platform/app/api/routes.py +++ b/ontology_platform/crawler_platform/app/api/routes.py @@ -29,7 +29,10 @@ from crawler_platform.app.core.database.repository import ( make_claim_hash, ) from crawler_platform.app.core.database.session import session_scope -from crawler_platform.app.core.extractor.ai_provider import list_openai_compatible_models +from crawler_platform.app.core.extractor.ai_provider import ( + list_lmstudio_loaded_models, + list_openai_compatible_models, +) from crawler_platform.app.core.extractor.factory import extractor_for_domain from crawler_platform.app.core.ontology.definitions import DOMAIN_ONTOLOGIES, Ontology, ontology_for_domain from crawler_platform.app.core.ontology.domain_discovery import DomainDiscoveryService @@ -1686,7 +1689,7 @@ def register_routes(app, database_url: str) -> None: def extractor_models(request: ExtractorModelsRequest): try: if request.provider == "lm_studio": - models = list_openai_compatible_models(request.base_url or "http://localhost:1234/v1") + models = list_lmstudio_loaded_models(request.base_url or "http://localhost:1234/v1") return {"ok": True, "models": models} if request.provider == "openai": import os diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_analysis_policy.py b/ontology_platform/crawler_platform/app/core/crawler/page_analysis_policy.py new file mode 100644 index 0000000..8925913 --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/crawler/page_analysis_policy.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from crawler_platform.app.core.crawler.page_type_scorer import PAGE_TYPE_METADATA +from crawler_platform.app.core.crawler.page_type_taxonomy import ( + AnalyzeStrategy, + LLMPolicy, + PageClassificationResult, + PageType, + normalize_page_type, + normalize_semantic_page_type, +) + + +DEFAULT_ANALYZE_STRATEGY = AnalyzeStrategy.ANALYZE_METADATA_ONLY.value +DEFAULT_LLM_POLICY = LLMPolicy.NO_LLM.value + + +def decide_analyze_strategy(result_or_page_type: object | None) -> str: + semantic_page_type = normalize_semantic_page_type(result_or_page_type) + if ( + isinstance(result_or_page_type, PageClassificationResult) + and result_or_page_type.analyze_strategy + and result_or_page_type.analyze_strategy != DEFAULT_ANALYZE_STRATEGY + ): + return result_or_page_type.analyze_strategy + profile = PAGE_TYPE_METADATA.get(semantic_page_type) + if profile: + return str(profile.get("analyze_strategy") or DEFAULT_ANALYZE_STRATEGY) + if semantic_page_type == PageType.UNKNOWN_PAGE.value: + return AnalyzeStrategy.ANALYZE_METADATA_ONLY.value + return DEFAULT_ANALYZE_STRATEGY + + +def decide_llm_policy(result_or_page_type: object | None) -> str: + semantic_page_type = normalize_semantic_page_type(result_or_page_type) + if ( + isinstance(result_or_page_type, PageClassificationResult) + and result_or_page_type.llm_policy + and result_or_page_type.llm_policy != DEFAULT_LLM_POLICY + ): + return result_or_page_type.llm_policy + profile = PAGE_TYPE_METADATA.get(semantic_page_type) + if profile: + return str(profile.get("llm_policy") or DEFAULT_LLM_POLICY) + if semantic_page_type == PageType.UNKNOWN_PAGE.value: + return LLMPolicy.NO_LLM.value + return DEFAULT_LLM_POLICY + + +def is_protected_strategy(strategy: str | AnalyzeStrategy | None) -> bool: + return str(strategy or "") == AnalyzeStrategy.SKIP_PROTECTED.value + + +def is_noise_strategy(strategy: str | AnalyzeStrategy | None) -> bool: + return str(strategy or "") == AnalyzeStrategy.SKIP_NOISE.value + + +def should_analyze_page(result_or_page_type: object | None, analyze_page_types: set[str] | None = None) -> bool: + strategy = decide_analyze_strategy(result_or_page_type) + if is_protected_strategy(strategy) or is_noise_strategy(strategy): + return False + + if isinstance(result_or_page_type, PageClassificationResult): + return True + + if analyze_page_types is None: + return True + + normalized_page_type = normalize_page_type(result_or_page_type) + normalized_allowlist = {normalize_page_type(item) for item in analyze_page_types} + return normalized_page_type in normalized_allowlist + + +def apply_analysis_policy(result: PageClassificationResult) -> PageClassificationResult: + strategy = decide_analyze_strategy(result) + llm_policy = decide_llm_policy(result) + result.analyze_strategy = strategy + result.llm_policy = llm_policy + result.is_protected = is_protected_strategy(strategy) + result.is_noise = is_noise_strategy(strategy) + result.should_analyze = should_analyze_page(result) + return result diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_classifier.py b/ontology_platform/crawler_platform/app/core/crawler/page_classifier.py index efd759c..fbb49a4 100644 --- a/ontology_platform/crawler_platform/app/core/crawler/page_classifier.py +++ b/ontology_platform/crawler_platform/app/core/crawler/page_classifier.py @@ -11,6 +11,13 @@ from crawler_platform.app.core.crawler.page_type_taxonomy import ( ) from crawler_platform.app.core.crawler.page_signal_extractor import extract_page_signals_from_page from crawler_platform.app.core.crawler.page_type_scorer import score_page_type +from crawler_platform.app.core.crawler.page_unknown_patterns import ( + build_unknown_pattern_payload, + should_store_unknown_pattern, +) +from crawler_platform.app.core.crawler.page_analysis_policy import ( + should_analyze_page as should_analyze_page_by_policy, +) PRODUCT_DETAIL_PREDICATES = { @@ -109,9 +116,15 @@ def classify_page_semantic( text: str = "", html: str | None = None, source_zones: list[dict[str, object]] | None = None, + final_url: str | None = None, + status_code: int | None = None, + content_type: str | None = None, ) -> PageClassificationResult: signals = extract_page_signals_from_page( url=url, + final_url=final_url, + status_code=status_code, + content_type=content_type, title=title, text=text, html=html, @@ -135,6 +148,35 @@ def classify_page_semantic( return result +def classification_metadata( + result: PageClassificationResult, + *, + title: str | None = None, + text: str | None = None, + html: str | None = None, + source_zones: list[str | dict[str, object]] | None = None, +) -> dict[str, object]: + """Return metadata that preserves legacy page_type while carrying semantic evidence.""" + + payload = result.to_dict() + if should_store_unknown_pattern(result): + payload["unknown_pattern"] = build_unknown_pattern_payload( + result=result, + url=result.url, + title=title, + text=text, + html=html, + source_zones=source_zones, + ) + return { + "page_type": get_legacy_page_type(result), + "semantic_page_type": result.primary_page_type, + "analyze_strategy": result.analyze_strategy, + "llm_policy": result.llm_policy, + "page_classification": payload, + } + + def relation_allowed_for_page_type(page_type: str | None, predicate: str) -> bool: if page_type in PRODUCT_DETAIL_PAGE_TYPES: return True @@ -150,9 +192,7 @@ def claim_allowed_for_context(page_type: str | None, predicate: str, zone_type: def should_analyze_page(page_type: object, analyze_page_types: set[str] | None) -> bool: - normalized_page_type = normalize_page_type(page_type) - normalized = {normalize_page_type(item) for item in (analyze_page_types or set())} - return normalized_page_type in normalized + return should_analyze_page_by_policy(page_type, analyze_page_types) def _zone_type(zone: dict[str, object]) -> str: diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_cleaner.py b/ontology_platform/crawler_platform/app/core/crawler/page_cleaner.py index d044cc5..b5fc964 100644 --- a/ontology_platform/crawler_platform/app/core/crawler/page_cleaner.py +++ b/ontology_platform/crawler_platform/app/core/crawler/page_cleaner.py @@ -71,12 +71,27 @@ ZONE_SELECTORS: dict[str, list[str]] = { ZONE_PRIORITY_BY_PAGE_TYPE = { "ProductPage": ["product_title", "product_summary", "product_description", "product_detail"], + "ProductDetailPage": ["product_title", "product_summary", "product_description", "product_detail"], "BrandStoryPage": ["brand_story_body"], + "AboutPage": ["brand_story_body"], + "ContactPage": ["brand_story_body"], "NoticePage": ["notice_body"], + "PublicNoticePage": ["notice_body"], + "ArticlePage": ["notice_body"], + "NewsArticlePage": ["notice_body"], + "BlogPostPage": ["notice_body"], + "FAQPage": ["notice_body"], + "QAPage": ["notice_body"], "BoardPage": ["notice_body"], + "ForumBoardPage": ["notice_body"], + "ForumThreadPage": ["notice_body"], "EventPage": ["event_body"], "PromotionPage": ["event_body"], + "CampaignLandingPage": ["event_body"], "CategoryPage": ["product_title", "product_summary"], + "CategoryListingPage": ["product_title", "product_summary"], + "SearchPage": ["product_title", "product_summary"], + "SearchResultsPage": ["product_title", "product_summary"], } STRUCTURAL_NOISE_TOKENS = { diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_signal_extractor.py b/ontology_platform/crawler_platform/app/core/crawler/page_signal_extractor.py new file mode 100644 index 0000000..5362bc4 --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/crawler/page_signal_extractor.py @@ -0,0 +1,843 @@ +from __future__ import annotations + +from collections import Counter +import json +import re +from typing import Any +from urllib.parse import urljoin, urlparse + +from crawler_platform.app.core.crawler.page_signals import PageSignals, RawPageSnapshot + + +KEYWORD_GROUPS: dict[str, tuple[str, ...]] = { + "commerce": ( + "product", + "price", + "sale", + "cart", + "basket", + "buy", + "checkout", + "sku", + "상품", + "가격", + "장바구니", + "구매", + "주문", + ), + "listing": ( + "filter", + "sort", + "category", + "pagination", + "items", + "results", + "필터", + "정렬", + "카테고리", + "상품수", + "결과", + ), + "editorial": ( + "article", + "author", + "published", + "updated", + "headline", + "news", + "blog", + "기사", + "작성자", + "게시일", + ), + "community": ( + "question", + "answer", + "comment", + "reply", + "thread", + "vote", + "faq", + "q&a", + "질문", + "답변", + "댓글", + "문의", + ), + "knowledge": ( + "documentation", + "api", + "endpoint", + "parameter", + "version", + "reference", + "guide", + "문서", + "가이드", + "버전", + ), + "corporate": ( + "about", + "company", + "contact", + "address", + "team", + "careers", + "privacy", + "terms", + "회사", + "소개", + "문의", + "주소", + "채용", + "개인정보", + "약관", + ), + "protected": ( + "login", + "password", + "captcha", + "access denied", + "forbidden", + "payment", + "billing", + "로그인", + "비밀번호", + "보안문자", + "접근 제한", + "결제", + ), +} + + +PRICE_PATTERN = re.compile( + r"(?:[$€£¥₩]\s?\d[\d,]*(?:\.\d+)?)|(?:\d[\d,]*(?:\.\d+)?\s?(?:KRW|USD|EUR|JPY|원|달러))", + re.IGNORECASE, +) +DATE_PATTERN = re.compile(r"\b(?:20\d{2}|19\d{2})[-./년]\s?\d{1,2}[-./월]\s?\d{1,2}", re.IGNORECASE) +API_ENDPOINT_PATTERN = re.compile(r"\b(?:GET|POST|PUT|PATCH|DELETE)\s+/(?:[A-Za-z0-9_./{}:-]+)") +VERSION_PATTERN = re.compile(r"\bv?\d+\.\d+(?:\.\d+)?\b", re.IGNORECASE) + + +def build_raw_page_snapshot( + *, + url: str, + final_url: str | None = None, + status_code: int | None = None, + content_type: str | None = None, + title: str | None = None, + text: str | None = None, + html: str | None = None, + rendered_html: str | None = None, + metadata: dict[str, Any] | None = None, + source_zones: list[str | dict[str, Any]] | None = None, + collector_payload: dict[str, Any] | None = None, +) -> RawPageSnapshot: + snapshot = RawPageSnapshot( + url=url, + final_url=final_url, + status_code=status_code, + content_type=content_type, + title=title, + text=text, + html=html, + rendered_html=rendered_html, + metadata=dict(metadata or {}), + source_zones=list(source_zones or []), + collector_payload=dict(collector_payload or {}), + ) + return merge_collector_payload(snapshot) + + +def snapshot_from_collector_payload(payload: dict[str, Any], *, url: str | None = None) -> RawPageSnapshot: + return merge_collector_payload( + RawPageSnapshot( + url=str(url or payload.get("url") or payload.get("source_url") or ""), + final_url=payload.get("final_url") or payload.get("resolved_url"), + status_code=_optional_int(payload.get("status_code")), + content_type=payload.get("content_type"), + title=payload.get("title"), + text=payload.get("text") or payload.get("markdown") or payload.get("clean_text"), + html=payload.get("html") or payload.get("raw_html"), + rendered_html=payload.get("rendered_html"), + metadata=dict(payload.get("metadata") or {}), + collector_payload=dict(payload), + ) + ) + + +def merge_collector_payload(snapshot: RawPageSnapshot) -> RawPageSnapshot: + payload = snapshot.collector_payload + if not payload: + return snapshot + snapshot.open_graph.update(payload.get("open_graph") or payload.get("og") or {}) + snapshot.twitter_card.update(payload.get("twitter_card") or payload.get("twitter") or {}) + snapshot.json_ld.extend(_ensure_dict_list(payload.get("json_ld") or payload.get("jsonld"))) + snapshot.microdata.extend(_ensure_dict_list(payload.get("microdata"))) + snapshot.rdfa.extend(_ensure_dict_list(payload.get("rdfa"))) + snapshot.headings.extend(_string_list(payload.get("headings"))) + snapshot.links.extend(_dict_list(payload.get("links"))) + snapshot.images.extend(_dict_list(payload.get("images"))) + snapshot.forms.extend(_dict_list(payload.get("forms"))) + snapshot.buttons.extend(_string_list(payload.get("buttons"))) + snapshot.inputs.extend(_dict_list(payload.get("inputs"))) + snapshot.tables.extend(_dict_list(payload.get("tables"))) + snapshot.breadcrumbs.extend(_string_list(payload.get("breadcrumbs"))) + if payload.get("screenshot_path") and not snapshot.screenshot_path: + snapshot.screenshot_path = str(payload["screenshot_path"]) + return snapshot + + +def extract_page_signals_from_page( + *, + url: str, + final_url: str | None = None, + status_code: int | None = None, + content_type: str | None = None, + title: str | None = None, + text: str | None = None, + html: str | None = None, + rendered_html: str | None = None, + metadata: dict[str, Any] | None = None, + source_zones: list[str | dict[str, Any]] | None = None, + collector_payload: dict[str, Any] | None = None, +) -> PageSignals: + return extract_page_signals( + build_raw_page_snapshot( + url=url, + final_url=final_url, + status_code=status_code, + content_type=content_type, + title=title, + text=text, + html=html, + rendered_html=rendered_html, + metadata=metadata, + source_zones=source_zones, + collector_payload=collector_payload, + ) + ) + + +def extract_page_signals(snapshot: RawPageSnapshot) -> PageSignals: + html = snapshot.rendered_html or snapshot.html or "" + soup = _soup_from_html(html) + title = snapshot.title or _title_from_soup(soup) + text = snapshot.text or _text_from_soup(soup) or _text_from_html(html) + combined = "\n".join([snapshot.url, title or "", text or "", html[:12000]]).lower() + open_graph = {**_extract_meta_prefix(soup, "property", "og:"), **snapshot.open_graph} + twitter_card = {**_extract_meta_prefix(soup, "name", "twitter:"), **snapshot.twitter_card} + json_ld = [*_extract_json_ld(soup), *snapshot.json_ld] + links = snapshot.links or _extract_links(soup, snapshot.final_url or snapshot.url) + images = snapshot.images or _extract_images(soup, snapshot.final_url or snapshot.url) + forms = snapshot.forms or _extract_forms(soup) + inputs = snapshot.inputs or _extract_inputs(soup) + buttons = snapshot.buttons or _extract_buttons(soup) + headings = snapshot.headings or _extract_headings(soup) + tables = snapshot.tables or _extract_tables(soup) + breadcrumbs = snapshot.breadcrumbs or _extract_breadcrumbs(soup) + schema_types = _schema_types(json_ld, snapshot.microdata, snapshot.rdfa, soup) + keyword_hits = _keyword_hits(combined) + link_counts = _link_counts(links, snapshot.final_url or snapshot.url) + layout = _layout_signals(soup, combined, links, images, tables) + repeated_card_count = max( + layout["card_count"], + link_counts["product_link_count"], + _count_selector_matches(soup, CARD_SELECTORS), + ) + button_text = " ".join(buttons).lower() + input_text = " ".join(_input_blob(item) for item in inputs).lower() + form_text = " ".join(_form_blob(item) for item in forms).lower() + table_text = " ".join(str(table.get("text") or "") for table in tables).lower() + content_type = str(snapshot.content_type or snapshot.metadata.get("content_type") or "").lower() + path = urlparse(snapshot.final_url or snapshot.url).path.lower() + + signals = PageSignals( + schema_types=schema_types, + og_type=_string_or_none(open_graph.get("type") or open_graph.get("og:type")), + twitter_card_type=_string_or_none(twitter_card.get("card") or twitter_card.get("twitter:card")), + has_price=bool(PRICE_PATTERN.search(combined)), + has_currency=bool(re.search(r"[$€£¥₩]|(?:\b(?:KRW|USD|EUR|JPY)\b)|원", combined, re.IGNORECASE)), + has_cart_button=_contains_any(button_text + " " + combined, ("cart", "basket", "장바구니", "bag")), + has_buy_button=_contains_any(button_text + " " + combined, ("buy now", "purchase", "구매", "주문", "결제")), + has_variant_selector=_has_variant_selector(soup, input_text + " " + combined), + has_sku=bool(re.search(r"\bsku\b|상품\s*코드|product\s*code", combined, re.IGNORECASE)), + has_rating=("AggregateRating" in schema_types) + or _contains_any(combined, ("rating", "stars", "별점", "평점")), + has_review_section=("Review" in schema_types) or _contains_any(combined, ("review", "reviews", "후기", "리뷰")), + has_product_gallery=(len(images) >= 3 and _contains_any(combined, ("gallery", "product", "상품"))), + has_repeated_cards=repeated_card_count >= 3, + repeated_card_count=repeated_card_count, + has_filter_panel=layout["has_filter_sidebar"] + or _contains_any(combined, ("filter", "facets", "refine", "필터", "조건")), + has_sort_control=_contains_any(combined, ("sort", "order by", "low price", "high price", "정렬", "낮은가격", "높은가격")), + has_pagination=_has_pagination(soup, links, combined), + has_author=_contains_any(combined, ("author", "byline", "작성자", "기자")), + has_published_date=("datePublished" in _json_keys(json_ld)) + or bool(DATE_PATTERN.search(combined)) + and _contains_any(combined, ("published", "posted", "게시", "등록")), + has_modified_date=("dateModified" in _json_keys(json_ld)) + or _contains_any(combined, ("modified", "updated", "수정")), + has_article_body=("Article" in schema_types) + or ("NewsArticle" in schema_types) + or _count_selector_matches(soup, ("article", "[itemprop='articleBody']", ".article-body", ".post-content")) > 0 + or _contains_any(combined, ("articlebody", "article body")), + has_tags=_has_tags(soup, links, combined), + has_question=("QAPage" in schema_types) or _contains_any(combined, ("question", "q:", "질문", "문의")), + has_answer=("Answer" in schema_types) or _contains_any(combined, ("answer", "a:", "답변")), + has_comments=_contains_any(combined, ("comment", "comments", "reply", "댓글", "답글")), + has_votes=_contains_any(combined, ("vote", "votes", "upvote", "downvote", "추천", "투표")), + has_thread_structure=_contains_any(combined, ("thread", "discussion", "게시글", "토론")), + has_faq_structure=("FAQPage" in schema_types) or _contains_any(combined, ("faq", "frequently asked", "자주 묻는")), + has_code_blocks=_count_selector_matches(soup, ("pre", "code", ".highlight", ".code")) > 0, + has_toc=_count_selector_matches(soup, ("#toc", ".toc", "[class*='table-of-contents']", "nav[aria-label*='contents']")) > 0, + has_api_endpoint=bool(API_ENDPOINT_PATTERN.search(f"{text or ''}\n{html or ''}")), + has_parameter_table=_has_parameter_table(tables, table_text), + has_version_info=bool(VERSION_PATTERN.search(combined)) and _contains_any(combined, ("version", "버전", "release")), + has_contact_info=_contains_any(combined, ("contact", "email", "tel:", "문의", "연락처")), + has_address=_contains_any(combined, ("address", "주소", "road", "street")), + has_policy_terms=_contains_any(combined, ("terms", "policy", "agreement", "약관", "정책")), + has_privacy_terms=_contains_any(combined, ("privacy", "personal information", "개인정보")), + has_career_terms=_contains_any(combined, ("career", "jobs", "recruit", "채용", "지원")), + has_login_form=_contains_any(form_text + " " + combined, ("login", "sign in", "로그인")) and ( + "password" in input_text or "비밀번호" in combined + ), + has_password_field="password" in input_text, + has_payment_fields=_contains_any(input_text + " " + combined, ("card number", "payment", "billing", "결제", "카드")), + has_captcha=_contains_any(combined, ("captcha", "recaptcha", "hcaptcha", "보안문자")), + has_access_denied=_contains_any(combined, ("access denied", "forbidden", "permission denied", "접근 제한", "권한이 없습니다")), + status_code=snapshot.status_code, + has_error_status=bool(snapshot.status_code and snapshot.status_code >= 400) + or _contains_any(combined, ("404", "not found", "error page")), + has_not_found=snapshot.status_code == 404 or _contains_any(combined, ("404", "not found", "page not found")), + has_sitemap_resource=("sitemap" in path) or ("sitemap" in content_type and "xml" in content_type), + has_feed_resource=("rss" in content_type) or ("atom" in content_type) or path.endswith((".rss", ".atom")), + has_json_resource=("json" in content_type) or path.endswith(".json"), + has_xml_resource=("xml" in content_type) or path.endswith(".xml"), + has_file_resource=path.endswith((".pdf", ".csv", ".xlsx", ".xls", ".doc", ".docx", ".zip")), + internal_link_count=link_counts["internal_link_count"], + external_link_count=link_counts["external_link_count"], + product_link_count=link_counts["product_link_count"], + category_link_count=link_counts["category_link_count"], + profile_link_count=link_counts["profile_link_count"], + article_link_count=link_counts["article_link_count"], + layout_blocks=layout["layout_blocks"], + has_hero_block=layout["has_hero_block"], + has_card_grid=layout["has_card_grid"], + has_filter_sidebar=layout["has_filter_sidebar"], + has_sticky_action_box=layout["has_sticky_action_box"], + has_media_player_area=layout["has_media_player_area"], + has_map_area=layout["has_map_area"], + has_calendar_grid=layout["has_calendar_grid"], + has_pricing_table=layout["has_pricing_table"], + has_comparison_table=layout["has_comparison_table"], + dominant_language=_dominant_language(combined), + keyword_hits=keyword_hits, + url_hints=_url_hints(snapshot.final_url or snapshot.url), + title=title, + text_sample=(text or "")[:500], + external_collector_signals=_external_collector_signals(snapshot), + ) + return signals + + +def _soup_from_html(html: str): + if not html: + return None + try: + from bs4 import BeautifulSoup + except ImportError: + return None + try: + return BeautifulSoup(html, "html.parser") + except Exception: + return None + + +def _title_from_soup(soup) -> str | None: + if soup is None or not soup.title: + return None + return soup.title.get_text(" ", strip=True) or None + + +def _text_from_soup(soup) -> str: + if soup is None: + return "" + return soup.get_text("\n", strip=True) + + +def _text_from_html(html: str) -> str: + return re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", html or "")).strip() + + +def _extract_meta_prefix(soup, attr_name: str, prefix: str) -> dict[str, str]: + if soup is None: + return {} + result: dict[str, str] = {} + for tag in soup.find_all("meta"): + name = str(tag.get(attr_name) or "").strip() + if not name.lower().startswith(prefix): + continue + content = str(tag.get("content") or "").strip() + if content: + result[name.removeprefix(prefix)] = content + result[name] = content + return result + + +def _extract_json_ld(soup) -> list[dict[str, Any]]: + if soup is None: + return [] + payloads: list[dict[str, Any]] = [] + for tag in soup.find_all("script"): + script_type = str(tag.get("type") or "").lower() + if "ld+json" not in script_type: + continue + raw = tag.string or tag.get_text(" ", strip=True) + try: + value = json.loads(raw) + except Exception: + continue + payloads.extend(_ensure_dict_list(value)) + return payloads + + +def _extract_headings(soup) -> list[str]: + if soup is None: + return [] + return [node.get_text(" ", strip=True) for node in soup.select("h1,h2,h3") if node.get_text(" ", strip=True)] + + +def _extract_links(soup, base_url: str) -> list[dict[str, Any]]: + if soup is None: + return [] + links = [] + for tag in soup.find_all("a"): + href = str(tag.get("href") or "").strip() + if not href: + continue + links.append( + { + "href": urljoin(base_url, href), + "text": tag.get_text(" ", strip=True), + "rel": " ".join(str(item) for item in tag.get("rel", [])), + "class": " ".join(str(item) for item in tag.get("class", [])), + } + ) + return links + + +def _extract_images(soup, base_url: str) -> list[dict[str, Any]]: + if soup is None: + return [] + images = [] + for tag in soup.find_all("img"): + src = str(tag.get("src") or tag.get("data-src") or "").strip() + if not src: + continue + images.append( + { + "src": urljoin(base_url, src), + "alt": str(tag.get("alt") or ""), + "class": " ".join(str(item) for item in tag.get("class", [])), + } + ) + return images + + +def _extract_forms(soup) -> list[dict[str, Any]]: + if soup is None: + return [] + forms = [] + for form in soup.find_all("form"): + forms.append( + { + "action": str(form.get("action") or ""), + "method": str(form.get("method") or ""), + "id": str(form.get("id") or ""), + "class": " ".join(str(item) for item in form.get("class", [])), + "text": form.get_text(" ", strip=True)[:500], + } + ) + return forms + + +def _extract_inputs(soup) -> list[dict[str, Any]]: + if soup is None: + return [] + inputs = [] + for tag in soup.select("input,select,textarea"): + inputs.append( + { + "type": str(tag.get("type") or tag.name or ""), + "name": str(tag.get("name") or ""), + "id": str(tag.get("id") or ""), + "placeholder": str(tag.get("placeholder") or ""), + "autocomplete": str(tag.get("autocomplete") or ""), + "aria_label": str(tag.get("aria-label") or ""), + "class": " ".join(str(item) for item in tag.get("class", [])), + "text": tag.get_text(" ", strip=True)[:240], + } + ) + return inputs + + +def _extract_buttons(soup) -> list[str]: + if soup is None: + return [] + values = [] + for tag in soup.select("button,input[type='submit'],input[type='button'],[role='button']"): + text = tag.get_text(" ", strip=True) or str(tag.get("value") or tag.get("aria-label") or "") + if text.strip(): + values.append(text.strip()) + return values + + +def _extract_tables(soup) -> list[dict[str, Any]]: + if soup is None: + return [] + tables = [] + for table in soup.find_all("table"): + headers = [cell.get_text(" ", strip=True) for cell in table.select("th") if cell.get_text(" ", strip=True)] + text = table.get_text(" ", strip=True) + tables.append({"headers": headers, "text": text[:1000], "row_count": len(table.select("tr"))}) + return tables + + +def _extract_breadcrumbs(soup) -> list[str]: + if soup is None: + return [] + crumbs = [] + selectors = [ + "[class*='breadcrumb']", + "[id*='breadcrumb']", + "nav[aria-label*='breadcrumb' i]", + "[itemtype*='BreadcrumbList']", + ] + for selector in selectors: + for node in soup.select(selector): + text = node.get_text(" > ", strip=True) + if text: + crumbs.append(text) + return _dedupe_strings(crumbs) + + +def _schema_types( + json_ld: list[dict[str, Any]], + microdata: list[dict[str, Any]], + rdfa: list[dict[str, Any]], + soup, +) -> set[str]: + types: set[str] = set() + for payload in [*json_ld, *microdata, *rdfa]: + _visit_schema_types(payload, types) + if soup is not None: + for node in soup.select("[itemscope][itemtype]"): + raw = str(node.get("itemtype") or "") + if raw: + types.add(raw.rstrip("/").split("/")[-1]) + for node in soup.select("[typeof]"): + for item in str(node.get("typeof") or "").split(): + types.add(item.split(":")[-1]) + return {item for item in types if item} + + +def _visit_schema_types(value: Any, types: set[str]) -> None: + if isinstance(value, list): + for item in value: + _visit_schema_types(item, types) + return + if not isinstance(value, dict): + return + raw_type = value.get("@type") or value.get("type") + for item in _ensure_list(raw_type): + if isinstance(item, str): + types.add(item.rstrip("/").split("/")[-1]) + for nested in value.values(): + if isinstance(nested, (dict, list)): + _visit_schema_types(nested, types) + + +def _json_keys(json_ld: list[dict[str, Any]]) -> set[str]: + keys: set[str] = set() + + def visit(value: Any) -> None: + if isinstance(value, list): + for item in value: + visit(item) + return + if not isinstance(value, dict): + return + keys.update(str(key) for key in value) + for nested in value.values(): + visit(nested) + + visit(json_ld) + return keys + + +def _keyword_hits(text: str) -> dict[str, int]: + hits = {} + for group, terms in KEYWORD_GROUPS.items(): + count = sum(text.count(term.lower()) for term in terms) + if count: + hits[group] = count + return hits + + +def _link_counts(links: list[dict[str, Any]], base_url: str) -> dict[str, int]: + base = urlparse(base_url) + base_host = base.netloc.lower() + base_path = base.path.lower() + counts = Counter() + for link in links: + href = str(link.get("href") or "") + parsed = urlparse(href) + host = parsed.netloc.lower() + path = parsed.path.lower() + if not host or host == base_host: + counts["internal_link_count"] += 1 + else: + counts["external_link_count"] += 1 + same_document_query_link = path == base_path and bool(parsed.query) + if not same_document_query_link and any(token in path for token in ("/product", "/products", "/goods", "/item", "/p/")): + counts["product_link_count"] += 1 + if any(token in path for token in ("category", "collection", "/shop", "/list", "catalog")): + counts["category_link_count"] += 1 + if any(token in path for token in ("profile", "user", "author", "member", "creator")): + counts["profile_link_count"] += 1 + if any(token in path for token in ("article", "blog", "news", "post", "story")): + counts["article_link_count"] += 1 + return { + "internal_link_count": counts["internal_link_count"], + "external_link_count": counts["external_link_count"], + "product_link_count": counts["product_link_count"], + "category_link_count": counts["category_link_count"], + "profile_link_count": counts["profile_link_count"], + "article_link_count": counts["article_link_count"], + } + + +CARD_SELECTORS = ( + ".product-card", + ".card", + ".item", + ".product", + ".prdList > li", + "[class*='product-card']", + "[class*='grid-item']", +) + + +def _layout_signals(soup, text: str, links: list[dict[str, Any]], images: list[dict[str, Any]], tables: list[dict[str, Any]]) -> dict[str, Any]: + blocks: list[str] = [] + hero = _count_selector_matches(soup, (".hero", ".visual", ".main-visual", "[class*='hero']", "section[aria-label*='hero']")) > 0 + card_count = _count_selector_matches(soup, CARD_SELECTORS) + card_grid = card_count >= 3 or _count_selector_matches(soup, (".grid", "[class*='grid']", "[class*='cards']")) > 0 and len(links) >= 3 + filter_sidebar = _count_selector_matches(soup, (".filter", ".filters", ".facet", "aside", "[class*='filter']", "[class*='facet']")) > 0 + sticky_action = _count_selector_matches(soup, (".sticky", "[class*='sticky']", "[class*='fixed']", "[class*='buy-box']")) > 0 + media_player = _count_selector_matches(soup, ("video", "audio", "iframe[src*='youtube']", "[class*='player']")) > 0 + map_area = _count_selector_matches(soup, ("[class*='map']", "#map", "iframe[src*='maps']")) > 0 or "google map" in text + calendar_grid = _count_selector_matches(soup, ("[class*='calendar']", "[class*='datepicker']", "table.calendar")) > 0 + pricing_table = "pricing" in text and (bool(tables) or _count_selector_matches(soup, ("[class*='pricing']", ".price-table")) > 0) + comparison_table = _has_comparison_table(tables, text) + for label, present in [ + ("hero_block", hero), + ("card_grid", card_grid), + ("filter_sidebar", filter_sidebar), + ("sticky_action_box", sticky_action), + ("media_player_area", media_player), + ("map_area", map_area), + ("calendar_grid", calendar_grid), + ("pricing_table", pricing_table), + ("comparison_table", comparison_table), + ]: + if present: + blocks.append(label) + return { + "layout_blocks": blocks, + "card_count": card_count, + "has_hero_block": hero, + "has_card_grid": card_grid, + "has_filter_sidebar": filter_sidebar, + "has_sticky_action_box": sticky_action, + "has_media_player_area": media_player, + "has_map_area": map_area, + "has_calendar_grid": calendar_grid, + "has_pricing_table": pricing_table, + "has_comparison_table": comparison_table, + } + + +def _has_variant_selector(soup, text: str) -> bool: + if _contains_any(text, ("variant", "option", "size", "color", "옵션", "사이즈", "색상")): + return True + if soup is None: + return False + for select in soup.find_all("select"): + blob = " ".join( + [ + str(select.get("name") or ""), + str(select.get("id") or ""), + select.get_text(" ", strip=True), + ] + ).lower() + if _contains_any(blob, ("variant", "option", "size", "color", "옵션", "사이즈", "색상")): + return True + return False + + +def _has_pagination(soup, links: list[dict[str, Any]], text: str) -> bool: + if _count_selector_matches(soup, (".pagination", ".paging", "[class*='paginate']", "nav[aria-label*='pagination']")) > 0: + return True + if any(str(link.get("rel") or "").lower() in {"next", "prev", "previous"} for link in links): + return True + return _contains_any(text, ("next page", "previous page", "페이지", "다음", "이전")) + + +def _has_tags(soup, links: list[dict[str, Any]], text: str) -> bool: + if _count_selector_matches(soup, (".tag", ".tags", "[rel='tag']", "[class*='tag']")) > 0: + return True + return any(str(link.get("rel") or "").lower() == "tag" for link in links) or _contains_any(text, ("tags:", "태그")) + + +def _has_parameter_table(tables: list[dict[str, Any]], table_text: str) -> bool: + if _contains_any(table_text, ("parameter", "required", "type", "description", "파라미터", "필수")): + return True + for table in tables: + headers = " ".join(str(item) for item in table.get("headers") or []).lower() + if _contains_any(headers, ("parameter", "required", "type", "description", "파라미터", "필수")): + return True + return False + + +def _has_comparison_table(tables: list[dict[str, Any]], text: str) -> bool: + if not tables: + return False + return _contains_any(text, ("compare", "comparison", "vs", "비교")) or any( + int(table.get("row_count") or 0) >= 3 and len(table.get("headers") or []) >= 3 for table in tables + ) + + +def _url_hints(url: str) -> set[str]: + parsed = urlparse(url) + value = f"{parsed.path} {parsed.query}".lower() + hints = set() + for hint, terms in { + "product": ("/product", "/products", "/goods", "/item", "/p/"), + "category": ("category", "collection", "/shop", "/list", "catalog"), + "search": ("search", "find", "keyword=", "query=", "q="), + "article": ("article", "blog", "news", "post", "story"), + "board": ("board", "forum", "thread", "qna"), + "protected": ("login", "checkout", "payment", "account", "cart"), + "system": ("sitemap", "robots.txt", ".json", ".xml", ".rss"), + }.items(): + if any(term in value for term in terms): + hints.add(hint) + return hints + + +def _dominant_language(text: str) -> str | None: + if not text: + return None + korean = len(re.findall(r"[가-힣]", text)) + latin = len(re.findall(r"[A-Za-z]", text)) + if korean == 0 and latin == 0: + return None + if korean > latin * 0.25: + return "ko" + return "en" + + +def _external_collector_signals(snapshot: RawPageSnapshot) -> dict[str, Any]: + payload = dict(snapshot.collector_payload or {}) + for key in { + "html", + "raw_html", + "rendered_html", + "text", + "markdown", + "clean_text", + "metadata", + "links", + "images", + "forms", + "inputs", + "buttons", + "tables", + "json_ld", + "jsonld", + }: + payload.pop(key, None) + return payload + + +def _count_selector_matches(soup, selectors: tuple[str, ...]) -> int: + if soup is None: + return 0 + count = 0 + for selector in selectors: + try: + count += len(soup.select(selector)) + except Exception: + continue + return count + + +def _input_blob(item: dict[str, Any]) -> str: + return " ".join(str(item.get(key) or "") for key in ("type", "name", "id", "placeholder", "autocomplete", "aria_label", "class", "text")) + + +def _form_blob(item: dict[str, Any]) -> str: + return " ".join(str(item.get(key) or "") for key in ("action", "method", "id", "class", "text")) + + +def _contains_any(value: str, terms: tuple[str, ...]) -> bool: + lowered = value.lower() + return any(term.lower() in lowered for term in terms) + + +def _string_or_none(value: Any) -> str | None: + clean = str(value or "").strip() + return clean or None + + +def _optional_int(value: Any) -> int | None: + try: + return int(value) + except (TypeError, ValueError): + return None + + +def _ensure_list(value: Any) -> list[Any]: + if value is None: + return [] + if isinstance(value, list): + return value + return [value] + + +def _ensure_dict_list(value: Any) -> list[dict[str, Any]]: + values = _ensure_list(value) + return [item for item in values if isinstance(item, dict)] + + +def _dict_list(value: Any) -> list[dict[str, Any]]: + return [dict(item) for item in _ensure_list(value) if isinstance(item, dict)] + + +def _string_list(value: Any) -> list[str]: + return [str(item) for item in _ensure_list(value) if str(item or "").strip()] + + +def _dedupe_strings(values: list[str]) -> list[str]: + seen = set() + result = [] + for value in values: + clean = " ".join(value.split()) + key = clean.lower() + if not clean or key in seen: + continue + seen.add(key) + result.append(clean) + return result diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_signals.py b/ontology_platform/crawler_platform/app/core/crawler/page_signals.py new file mode 100644 index 0000000..e555832 --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/crawler/page_signals.py @@ -0,0 +1,144 @@ +from __future__ import annotations + +from dataclasses import asdict, dataclass, field +from typing import Any + + +@dataclass(slots=True) +class RawPageSnapshot: + url: str + final_url: str | None = None + status_code: int | None = None + content_type: str | None = None + title: str | None = None + text: str | None = None + html: str | None = None + rendered_html: str | None = None + metadata: dict[str, Any] = field(default_factory=dict) + open_graph: dict[str, Any] = field(default_factory=dict) + twitter_card: dict[str, Any] = field(default_factory=dict) + json_ld: list[dict[str, Any]] = field(default_factory=list) + microdata: list[dict[str, Any]] = field(default_factory=list) + rdfa: list[dict[str, Any]] = field(default_factory=list) + headings: list[str] = field(default_factory=list) + links: list[dict[str, Any]] = field(default_factory=list) + images: list[dict[str, Any]] = field(default_factory=list) + forms: list[dict[str, Any]] = field(default_factory=list) + buttons: list[str] = field(default_factory=list) + inputs: list[dict[str, Any]] = field(default_factory=list) + tables: list[dict[str, Any]] = field(default_factory=list) + breadcrumbs: list[str] = field(default_factory=list) + source_zones: list[str | dict[str, Any]] = field(default_factory=list) + screenshot_path: str | None = None + collector_payload: dict[str, Any] = field(default_factory=dict) + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class PageSignals: + # structured data + schema_types: set[str] = field(default_factory=set) + og_type: str | None = None + twitter_card_type: str | None = None + + # commerce + has_price: bool = False + has_currency: bool = False + has_cart_button: bool = False + has_buy_button: bool = False + has_variant_selector: bool = False + has_sku: bool = False + has_rating: bool = False + has_review_section: bool = False + has_product_gallery: bool = False + + # listing + has_repeated_cards: bool = False + repeated_card_count: int = 0 + has_filter_panel: bool = False + has_sort_control: bool = False + has_pagination: bool = False + + # editorial + has_author: bool = False + has_published_date: bool = False + has_modified_date: bool = False + has_article_body: bool = False + has_tags: bool = False + + # community + has_question: bool = False + has_answer: bool = False + has_comments: bool = False + has_votes: bool = False + has_thread_structure: bool = False + has_faq_structure: bool = False + + # knowledge/docs + has_code_blocks: bool = False + has_toc: bool = False + has_api_endpoint: bool = False + has_parameter_table: bool = False + has_version_info: bool = False + + # corporate/legal + has_contact_info: bool = False + has_address: bool = False + has_policy_terms: bool = False + has_privacy_terms: bool = False + has_career_terms: bool = False + + # transaction/protected + has_login_form: bool = False + has_password_field: bool = False + has_payment_fields: bool = False + has_captcha: bool = False + has_access_denied: bool = False + + # system/resource + status_code: int | None = None + has_error_status: bool = False + has_not_found: bool = False + has_sitemap_resource: bool = False + has_feed_resource: bool = False + has_json_resource: bool = False + has_xml_resource: bool = False + has_file_resource: bool = False + + # graph + internal_link_count: int = 0 + external_link_count: int = 0 + product_link_count: int = 0 + category_link_count: int = 0 + profile_link_count: int = 0 + article_link_count: int = 0 + + # visual/layout candidates from DOM structure + layout_blocks: list[str] = field(default_factory=list) + has_hero_block: bool = False + has_card_grid: bool = False + has_filter_sidebar: bool = False + has_sticky_action_box: bool = False + has_media_player_area: bool = False + has_map_area: bool = False + has_calendar_grid: bool = False + has_pricing_table: bool = False + has_comparison_table: bool = False + + # text/layout + dominant_language: str | None = None + keyword_hits: dict[str, int] = field(default_factory=dict) + url_hints: set[str] = field(default_factory=set) + title: str | None = None + text_sample: str = "" + + # external collector hook + external_collector_signals: dict[str, Any] = field(default_factory=dict) + + def to_dict(self) -> dict[str, Any]: + payload = asdict(self) + payload["schema_types"] = sorted(self.schema_types) + payload["url_hints"] = sorted(self.url_hints) + return payload diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_type_scorer.py b/ontology_platform/crawler_platform/app/core/crawler/page_type_scorer.py new file mode 100644 index 0000000..b7538e8 --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/crawler/page_type_scorer.py @@ -0,0 +1,747 @@ +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +from typing import Any + +from crawler_platform.app.core.crawler.page_signals import PageSignals +from crawler_platform.app.core.crawler.page_type_taxonomy import ( + ActionIntent, + AnalyzeStrategy, + EntityType, + EvidenceItem, + GraphRole, + LLMPolicy, + PAGE_TYPE_PROFILES, + PageArchetype, + PageClassificationResult, + PageDomain, + PageType, +) + + +UNKNOWN_THRESHOLD = 0.22 + + +@dataclass(frozen=True, slots=True) +class SignalRule: + key: str + weight: float + source: str + message: str + predicate: Callable[[PageSignals], bool] + value: Callable[[PageSignals], str | int | float | bool | None] | None = None + + +@dataclass(slots=True) +class ScoreAccumulator: + scores: dict[str, float] + evidence_by_type: dict[str, list[EvidenceItem]] + + def add(self, page_type: str, rule: SignalRule, signals: PageSignals) -> None: + if not rule.predicate(signals): + return + value = rule.value(signals) if rule.value else True + self.scores[page_type] = self.scores.get(page_type, 0.0) + rule.weight + self.evidence_by_type.setdefault(page_type, []).append( + EvidenceItem( + key=rule.key, + value=value, + weight=rule.weight, + source=rule.source, + message=rule.message, + ) + ) + + +PAGE_TYPE_METADATA: dict[str, dict[str, Any]] = { + **PAGE_TYPE_PROFILES, + PageType.ARTICLE_PAGE.value: { + "domain": PageDomain.EDITORIAL.value, + "archetype": PageArchetype.ARTICLE.value, + "main_entity_type": EntityType.ARTICLE.value, + "action_intents": [ActionIntent.READ.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value, GraphRole.ENTITY_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_FULL.value, + "should_analyze": True, + }, + PageType.BLOG_POST_PAGE.value: { + "domain": PageDomain.EDITORIAL.value, + "archetype": PageArchetype.ARTICLE.value, + "main_entity_type": EntityType.ARTICLE.value, + "action_intents": [ActionIntent.READ.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_FULL.value, + "should_analyze": True, + }, + PageType.FAQ_PAGE.value: { + "domain": PageDomain.COMMUNITY.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.QUESTION.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.ANSWER.value], + "graph_roles": [GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.QA_PAGE.value: { + "domain": PageDomain.COMMUNITY.value, + "archetype": PageArchetype.THREAD.value, + "main_entity_type": EntityType.QUESTION.value, + "action_intents": [ActionIntent.ASK.value, ActionIntent.ANSWER.value, ActionIntent.READ.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value, GraphRole.RELATION_HUB.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.FORUM_THREAD_PAGE.value: { + "domain": PageDomain.COMMUNITY.value, + "archetype": PageArchetype.THREAD.value, + "main_entity_type": EntityType.ARTICLE.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.COMMENT.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value, GraphRole.RELATION_HUB.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.ABOUT_PAGE.value: { + "domain": PageDomain.CORPORATE.value, + "archetype": PageArchetype.ARTICLE.value, + "main_entity_type": EntityType.ORGANIZATION.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.LEARN.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value, GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_FULL.value, + "should_analyze": True, + }, + PageType.CONTACT_PAGE.value: { + "domain": PageDomain.CORPORATE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.ORGANIZATION.value, + "action_intents": [ActionIntent.CONTACT.value, ActionIntent.NAVIGATE.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_METADATA_ONLY.value, + "llm_policy": LLMPolicy.RULE_ONLY.value, + "should_analyze": True, + }, + PageType.DOCUMENTATION_PAGE.value: { + "domain": PageDomain.KNOWLEDGE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.SOFTWARE_APPLICATION.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.LEARN.value], + "graph_roles": [GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.API_REFERENCE_PAGE.value: { + "domain": PageDomain.SOFTWARE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.SOFTWARE_APPLICATION.value, + "action_intents": [ActionIntent.LEARN.value, ActionIntent.CONFIGURE.value], + "graph_roles": [GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.WIKI_PAGE.value: { + "domain": PageDomain.KNOWLEDGE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.UNKNOWN_ENTITY.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.LEARN.value], + "graph_roles": [GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.DATASET_PAGE.value: { + "domain": PageDomain.KNOWLEDGE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.DATASET.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.DOWNLOAD.value], + "graph_roles": [GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_DOCUMENT_ONLY.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.RESEARCH_PAPER_PAGE.value: { + "domain": PageDomain.KNOWLEDGE.value, + "archetype": PageArchetype.ARTICLE.value, + "main_entity_type": EntityType.ARTICLE.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.LEARN.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value, GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_FULL.value, + "should_analyze": True, + }, + PageType.JOB_POSTING_PAGE.value: { + "domain": PageDomain.JOBS.value, + "archetype": PageArchetype.DETAIL.value, + "main_entity_type": EntityType.JOB_POSTING.value, + "action_intents": [ActionIntent.APPLY.value, ActionIntent.READ.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_FULL.value, + "should_analyze": True, + }, + PageType.COURSE_DETAIL_PAGE.value: { + "domain": PageDomain.EDUCATION.value, + "archetype": PageArchetype.DETAIL.value, + "main_entity_type": EntityType.COURSE.value, + "action_intents": [ActionIntent.LEARN.value, ActionIntent.SUBSCRIBE.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value, GraphRole.REFERENCE_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.VIDEO_PAGE.value: { + "domain": PageDomain.MEDIA.value, + "archetype": PageArchetype.MEDIA.value, + "main_entity_type": EntityType.MEDIA_OBJECT.value, + "action_intents": [ActionIntent.WATCH.value], + "graph_roles": [GraphRole.MEDIA_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_METADATA_ONLY.value, + "llm_policy": LLMPolicy.RULE_ONLY.value, + "should_analyze": True, + }, + PageType.LOCAL_BUSINESS_PAGE.value: { + "domain": PageDomain.LOCAL.value, + "archetype": PageArchetype.DETAIL.value, + "main_entity_type": EntityType.PLACE.value, + "action_intents": [ActionIntent.CONTACT.value, ActionIntent.NAVIGATE.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.REAL_ESTATE_LISTING_PAGE.value: { + "domain": PageDomain.LOCAL.value, + "archetype": PageArchetype.DETAIL.value, + "main_entity_type": EntityType.REAL_ESTATE_PROPERTY.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.CONTACT.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.PROFILE_PAGE.value: { + "domain": PageDomain.COMMUNITY.value, + "archetype": PageArchetype.PROFILE.value, + "main_entity_type": EntityType.PERSON.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.CONTACT.value], + "graph_roles": [GraphRole.PROFILE_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_ENTITY_ONLY.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.PRICING_PAGE.value: { + "domain": PageDomain.COMMERCE.value, + "archetype": PageArchetype.LANDING.value, + "main_entity_type": EntityType.SERVICE.value, + "action_intents": [ActionIntent.BUY.value, ActionIntent.COMPARE.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.LOGIN_PAGE.value: { + "domain": PageDomain.TRANSACTION.value, + "archetype": PageArchetype.FORM.value, + "main_entity_type": None, + "action_intents": [ActionIntent.LOGIN.value], + "graph_roles": [GraphRole.TRANSACTION_ONLY.value], + "analyze_strategy": AnalyzeStrategy.SKIP_PROTECTED.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, + PageType.CHECKOUT_PAGE.value: { + "domain": PageDomain.TRANSACTION.value, + "archetype": PageArchetype.TRANSACTION.value, + "main_entity_type": None, + "action_intents": [ActionIntent.BUY.value, ActionIntent.PAY.value], + "graph_roles": [GraphRole.TRANSACTION_ONLY.value], + "analyze_strategy": AnalyzeStrategy.SKIP_PROTECTED.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, + PageType.PAYMENT_PAGE.value: { + "domain": PageDomain.TRANSACTION.value, + "archetype": PageArchetype.TRANSACTION.value, + "main_entity_type": None, + "action_intents": [ActionIntent.PAY.value], + "graph_roles": [GraphRole.TRANSACTION_ONLY.value], + "analyze_strategy": AnalyzeStrategy.SKIP_PROTECTED.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, + PageType.TERMS_PAGE.value: { + "domain": PageDomain.CORPORATE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.LEGAL_DOCUMENT.value, + "action_intents": [ActionIntent.READ.value], + "graph_roles": [GraphRole.POLICY_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_DOCUMENT_ONLY.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.PRIVACY_POLICY_PAGE.value: { + "domain": PageDomain.CORPORATE.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.LEGAL_DOCUMENT.value, + "action_intents": [ActionIntent.READ.value], + "graph_roles": [GraphRole.POLICY_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_DOCUMENT_ONLY.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.SITEMAP_PAGE.value: { + "domain": PageDomain.SYSTEM.value, + "archetype": PageArchetype.SYSTEM_RESOURCE.value, + "main_entity_type": None, + "action_intents": [ActionIntent.NAVIGATE.value], + "graph_roles": [GraphRole.SYSTEM_RESOURCE.value, GraphRole.NAVIGATION_HUB.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_DISCOVERY_ONLY.value, + "llm_policy": LLMPolicy.RULE_ONLY.value, + "should_analyze": True, + }, + PageType.RSS_FEED_PAGE.value: { + "domain": PageDomain.SYSTEM.value, + "archetype": PageArchetype.SYSTEM_RESOURCE.value, + "main_entity_type": None, + "action_intents": [ActionIntent.READ.value], + "graph_roles": [GraphRole.SYSTEM_RESOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_METADATA_ONLY.value, + "llm_policy": LLMPolicy.RULE_ONLY.value, + "should_analyze": True, + }, + PageType.ERROR_PAGE.value: { + "domain": PageDomain.SYSTEM.value, + "archetype": PageArchetype.ERROR.value, + "main_entity_type": None, + "action_intents": [], + "graph_roles": [GraphRole.NOISE_PAGE.value], + "analyze_strategy": AnalyzeStrategy.SKIP_NOISE.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, + PageType.NOT_FOUND_PAGE.value: { + "domain": PageDomain.SYSTEM.value, + "archetype": PageArchetype.ERROR.value, + "main_entity_type": None, + "action_intents": [], + "graph_roles": [GraphRole.NOISE_PAGE.value], + "analyze_strategy": AnalyzeStrategy.SKIP_NOISE.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, + PageType.ACCESS_DENIED_PAGE.value: { + "domain": PageDomain.TRANSACTION.value, + "archetype": PageArchetype.ERROR.value, + "main_entity_type": None, + "action_intents": [ActionIntent.VERIFY.value], + "graph_roles": [GraphRole.TRANSACTION_ONLY.value], + "analyze_strategy": AnalyzeStrategy.SKIP_PROTECTED.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, + PageType.CAPTCHA_PAGE.value: { + "domain": PageDomain.TRANSACTION.value, + "archetype": PageArchetype.FORM.value, + "main_entity_type": None, + "action_intents": [ActionIntent.VERIFY.value], + "graph_roles": [GraphRole.TRANSACTION_ONLY.value], + "analyze_strategy": AnalyzeStrategy.SKIP_PROTECTED.value, + "llm_policy": LLMPolicy.SKIP.value, + "should_analyze": False, + }, +} + + +def score_page_type(url: str, signals: PageSignals, *, unknown_threshold: float = UNKNOWN_THRESHOLD) -> PageClassificationResult: + accumulator = ScoreAccumulator(scores={}, evidence_by_type={}) + for page_type, rules in SCORING_RULES.items(): + for rule in rules: + accumulator.add(page_type, rule, signals) + + _apply_interactions(accumulator, signals) + + if not accumulator.scores: + return _unknown_result( + url, + alternatives=[], + evidence=[ + EvidenceItem( + key="insufficient_evidence", + value=True, + weight=0.0, + source="page_type_scorer", + message="No page-type evidence was detected.", + ) + ], + ) + + alternatives = sorted( + ((page_type, round(min(score, 1.0), 4)) for page_type, score in accumulator.scores.items()), + key=lambda item: item[1], + reverse=True, + ) + primary_page_type, confidence = alternatives[0] + if confidence < unknown_threshold: + evidence = [item for page_type, _score in alternatives[:3] for item in accumulator.evidence_by_type.get(page_type, [])] + evidence.append( + EvidenceItem( + key="low_confidence", + value=confidence, + weight=0.0, + source="page_type_scorer", + message=f"Top score {confidence:.2f} is below UnknownPage threshold {unknown_threshold:.2f}.", + ) + ) + return _unknown_result(url, alternatives=alternatives[:5], evidence=evidence) + + profile = _profile(primary_page_type) + evidence = accumulator.evidence_by_type.get(primary_page_type, []) + if not evidence: + evidence = [ + EvidenceItem( + key="score", + value=confidence, + weight=confidence, + source="page_type_scorer", + message=f"{primary_page_type} selected from accumulated score.", + ) + ] + secondary = [page_type for page_type, score in alternatives[1:4] if score >= 0.18] + return PageClassificationResult( + url=url, + primary_page_type=primary_page_type, + secondary_page_types=secondary, + domain=str(profile["domain"]), + archetype=str(profile["archetype"]), + main_entity_type=profile.get("main_entity_type"), + action_intents=list(profile.get("action_intents") or []), + graph_roles=list(profile.get("graph_roles") or []), + confidence=confidence, + alternatives=alternatives[:8], + evidence=evidence, + should_analyze=bool(profile.get("should_analyze")), + analyze_strategy=str(profile["analyze_strategy"]), + llm_policy=str(profile["llm_policy"]), + is_protected=str(profile["analyze_strategy"]) == AnalyzeStrategy.SKIP_PROTECTED.value, + is_noise=str(profile["analyze_strategy"]) == AnalyzeStrategy.SKIP_NOISE.value, + ) + + +def _profile(page_type: str) -> dict[str, Any]: + return PAGE_TYPE_METADATA.get(page_type, PAGE_TYPE_METADATA[PageType.UNKNOWN_PAGE.value]) + + +def _unknown_result( + url: str, + *, + alternatives: list[tuple[str, float]], + evidence: list[EvidenceItem], +) -> PageClassificationResult: + profile = _profile(PageType.UNKNOWN_PAGE.value) + return PageClassificationResult( + url=url, + primary_page_type=PageType.UNKNOWN_PAGE.value, + secondary_page_types=[page_type for page_type, _score in alternatives[:3]], + domain=str(profile["domain"]), + archetype=str(profile["archetype"]), + main_entity_type=profile.get("main_entity_type"), + action_intents=list(profile.get("action_intents") or []), + graph_roles=list(profile.get("graph_roles") or []), + confidence=0.0, + alternatives=alternatives[:8], + evidence=evidence + or [ + EvidenceItem( + key="unknown", + value=True, + weight=0.0, + source="page_type_scorer", + message="Page did not match known semantic page type evidence.", + ) + ], + should_analyze=bool(profile.get("should_analyze")), + analyze_strategy=str(profile["analyze_strategy"]), + llm_policy=str(profile["llm_policy"]), + is_protected=False, + is_noise=False, + ) + + +def _apply_interactions(accumulator: ScoreAccumulator, signals: PageSignals) -> None: + # Protected signals must dominate commerce signals when login/payment fields are present. + if signals.has_password_field and signals.has_login_form: + _manual_add(accumulator, PageType.LOGIN_PAGE.value, "protected_priority", True, 0.3, "protected", "Login form and password field override commerce signals.") + if signals.has_payment_fields: + _manual_add(accumulator, PageType.PAYMENT_PAGE.value, "payment_priority", True, 0.35, "protected", "Payment fields override product or checkout content.") + if signals.has_access_denied: + _manual_add(accumulator, PageType.ACCESS_DENIED_PAGE.value, "access_denied_priority", True, 0.35, "protected", "Access denied signal is a protected page indicator.") + if signals.has_captcha: + _manual_add(accumulator, PageType.CAPTCHA_PAGE.value, "captcha_priority", True, 0.35, "protected", "Captcha signal is a protected page indicator.") + if signals.has_repeated_cards and signals.product_link_count >= 3: + _manual_add(accumulator, PageType.CATEGORY_LISTING_PAGE.value, "listing_product_links", signals.product_link_count, 0.18, "link_graph", "Repeated cards with multiple product links indicate a product listing.") + if signals.has_question and signals.has_answer and signals.has_faq_structure: + _manual_add(accumulator, PageType.FAQ_PAGE.value, "faq_question_answer", True, 0.18, "community", "FAQ structure with question/answer content.") + + +def _manual_add( + accumulator: ScoreAccumulator, + page_type: str, + key: str, + value: str | int | float | bool | None, + weight: float, + source: str, + message: str, +) -> None: + accumulator.scores[page_type] = accumulator.scores.get(page_type, 0.0) + weight + accumulator.evidence_by_type.setdefault(page_type, []).append( + EvidenceItem(key=key, value=value, weight=weight, source=source, message=message) + ) + + +def _has_schema(*schema_types: str) -> Callable[[PageSignals], bool]: + return lambda signals: any(schema_type in signals.schema_types for schema_type in schema_types) + + +def _keyword(group: str, minimum: int = 1) -> Callable[[PageSignals], bool]: + return lambda signals: int(signals.keyword_hits.get(group) or 0) >= minimum + + +def _url_hint(hint: str) -> Callable[[PageSignals], bool]: + return lambda signals: hint in signals.url_hints + + +def _contains_terms(signals: PageSignals, terms: tuple[str, ...]) -> bool: + text = f"{signals.title or ''}\n{signals.text_sample or ''}".lower() + return any(term.lower() in text for term in terms) + + +def _flag(name: str) -> Callable[[PageSignals], bool]: + return lambda signals: bool(getattr(signals, name)) + + +def _count_at_least(name: str, minimum: int) -> Callable[[PageSignals], bool]: + return lambda signals: int(getattr(signals, name) or 0) >= minimum + + +def _value(name: str) -> Callable[[PageSignals], str | int | float | bool | None]: + return lambda signals: getattr(signals, name) + + +def _keywords_value(group: str) -> Callable[[PageSignals], str | int | float | bool | None]: + return lambda signals: signals.keyword_hits.get(group, 0) + + +def _schema_value(signals: PageSignals) -> str: + return ",".join(sorted(signals.schema_types)) + + +def _url_hint_value(signals: PageSignals) -> str: + return ",".join(sorted(signals.url_hints)) + + +SCORING_RULES: dict[str, list[SignalRule]] = { + PageType.PRODUCT_DETAIL_PAGE.value: [ + SignalRule("schema_product", 0.4, "structured_data", "schema.org Product detected.", _has_schema("Product"), _schema_value), + SignalRule("schema_offer", 0.15, "structured_data", "schema.org Offer detected.", _has_schema("Offer"), _schema_value), + SignalRule("price", 0.15, "text", "Price detected.", _flag("has_price"), _value("has_price")), + SignalRule("cart_button", 0.2, "dom", "Cart button detected.", _flag("has_cart_button")), + SignalRule("buy_button", 0.16, "dom", "Buy button detected.", _flag("has_buy_button")), + SignalRule("variant_selector", 0.12, "dom", "Variant selector detected.", _flag("has_variant_selector")), + SignalRule("sku", 0.1, "text", "SKU or product code detected.", _flag("has_sku")), + SignalRule("product_gallery", 0.1, "layout", "Product image gallery detected.", _flag("has_product_gallery")), + SignalRule("review_section", 0.05, "dom", "Review section detected.", _flag("has_review_section")), + SignalRule("url_product_hint", 0.05, "url", "Product URL hint detected.", _url_hint("product"), _url_hint_value), + ], + PageType.CATEGORY_LISTING_PAGE.value: [ + SignalRule("repeated_cards", 0.32, "layout", "Repeated cards detected.", _flag("has_repeated_cards"), _value("repeated_card_count")), + SignalRule("filter_panel", 0.2, "dom", "Filter panel detected.", _flag("has_filter_panel")), + SignalRule("sort_control", 0.15, "dom", "Sort control detected.", _flag("has_sort_control")), + SignalRule("pagination", 0.1, "dom", "Pagination detected.", _flag("has_pagination")), + SignalRule("product_links", 0.18, "link_graph", "Multiple product links detected.", _count_at_least("product_link_count", 3), _value("product_link_count")), + SignalRule("category_url_hint", 0.06, "url", "Category/list URL hint detected.", _url_hint("category"), _url_hint_value), + ], + PageType.SEARCH_RESULTS_PAGE.value: [ + SignalRule("search_url_hint", 0.28, "url", "Search URL hint detected.", _url_hint("search"), _url_hint_value), + SignalRule("listing_results", 0.18, "layout", "Repeated result cards detected.", _flag("has_repeated_cards"), _value("repeated_card_count")), + SignalRule("filter_panel", 0.14, "dom", "Search filter panel detected.", _flag("has_filter_panel")), + SignalRule("pagination", 0.12, "dom", "Search pagination detected.", _flag("has_pagination")), + SignalRule("search_keywords", 0.12, "text", "Search/result keywords detected.", _keyword("listing"), _keywords_value("listing")), + ], + PageType.ARTICLE_PAGE.value: [ + SignalRule("schema_article", 0.35, "structured_data", "Article structured data detected.", _has_schema("Article", "NewsArticle"), _schema_value), + SignalRule("author", 0.15, "text", "Author/byline signal detected.", _flag("has_author")), + SignalRule("published_date", 0.15, "text", "Published date detected.", _flag("has_published_date")), + SignalRule("article_body", 0.2, "dom", "Article body detected.", _flag("has_article_body")), + SignalRule("tags", 0.05, "dom", "Article tags detected.", _flag("has_tags")), + SignalRule("article_url_hint", 0.05, "url", "Article URL hint detected.", _url_hint("article"), _url_hint_value), + ], + PageType.BLOG_POST_PAGE.value: [ + SignalRule("blog_url_hint", 0.25, "url", "Blog URL hint detected.", lambda signals: "article" in signals.url_hints and "blog" in (signals.text_sample or "").lower()), + SignalRule("author", 0.14, "text", "Author signal detected.", _flag("has_author")), + SignalRule("published_date", 0.14, "text", "Published date detected.", _flag("has_published_date")), + SignalRule("article_body", 0.18, "dom", "Article body detected.", _flag("has_article_body")), + SignalRule("tags", 0.08, "dom", "Tags detected.", _flag("has_tags")), + ], + PageType.QA_PAGE.value: [ + SignalRule("schema_qapage", 0.35, "structured_data", "QAPage structured data detected.", _has_schema("QAPage"), _schema_value), + SignalRule("question", 0.2, "community", "Question block detected.", _flag("has_question")), + SignalRule("answer", 0.2, "community", "Answer block detected.", _flag("has_answer")), + SignalRule("votes", 0.1, "community", "Vote signal detected.", _flag("has_votes")), + SignalRule("comments", 0.05, "community", "Comments detected.", _flag("has_comments")), + SignalRule("board_url_hint", 0.05, "url", "Board/community URL hint detected.", _url_hint("board"), _url_hint_value), + ], + PageType.FAQ_PAGE.value: [ + SignalRule("schema_faq", 0.36, "structured_data", "FAQPage structured data detected.", _has_schema("FAQPage"), _schema_value), + SignalRule("faq_structure", 0.25, "community", "FAQ structure detected.", _flag("has_faq_structure")), + SignalRule("question", 0.15, "community", "Question content detected.", _flag("has_question")), + SignalRule("answer", 0.15, "community", "Answer content detected.", _flag("has_answer")), + ], + PageType.FORUM_BOARD_PAGE.value: [ + SignalRule("board_url_hint", 0.25, "url", "Board URL hint detected.", _url_hint("board"), _url_hint_value), + SignalRule("thread_structure", 0.2, "community", "Thread structure detected.", _flag("has_thread_structure")), + SignalRule("comments", 0.1, "community", "Comments/replies detected.", _flag("has_comments")), + SignalRule("repeated_cards", 0.14, "layout", "Repeated post cards detected.", _flag("has_repeated_cards"), _value("repeated_card_count")), + SignalRule("pagination", 0.1, "dom", "Board pagination detected.", _flag("has_pagination")), + ], + PageType.FORUM_THREAD_PAGE.value: [ + SignalRule("thread_structure", 0.3, "community", "Thread structure detected.", _flag("has_thread_structure")), + SignalRule("comments", 0.16, "community", "Comment thread detected.", _flag("has_comments")), + SignalRule("question_answer", 0.14, "community", "Question and answer content detected.", lambda signals: signals.has_question and signals.has_answer), + SignalRule("votes", 0.08, "community", "Vote signal detected.", _flag("has_votes")), + SignalRule("article_body", 0.08, "dom", "Post body detected.", _flag("has_article_body")), + ], + PageType.BRAND_STORY_PAGE.value: [ + SignalRule("corporate_keywords", 0.2, "text", "Corporate/brand keywords detected.", _keyword("corporate"), _keywords_value("corporate")), + SignalRule("about_url_hint", 0.18, "url", "About/company URL hint detected.", lambda signals: "about" in (signals.text_sample or "").lower() or "brand" in (signals.title or "").lower()), + SignalRule("article_body", 0.14, "dom", "Brand story body detected.", _flag("has_article_body")), + SignalRule("hero_block", 0.08, "layout", "Hero block detected.", _flag("has_hero_block")), + ], + PageType.ABOUT_PAGE.value: [ + SignalRule("corporate_keywords", 0.22, "text", "About/company keywords detected.", _keyword("corporate"), _keywords_value("corporate")), + SignalRule("contact_info", 0.08, "text", "Organization contact signal detected.", _flag("has_contact_info")), + SignalRule("article_body", 0.12, "dom", "About body detected.", _flag("has_article_body")), + ], + PageType.CONTACT_PAGE.value: [ + SignalRule("contact_info", 0.32, "text", "Contact information detected.", _flag("has_contact_info")), + SignalRule("address", 0.18, "text", "Address detected.", _flag("has_address")), + SignalRule("corporate_keywords", 0.1, "text", "Corporate keywords detected.", _keyword("corporate"), _keywords_value("corporate")), + ], + PageType.DOCUMENTATION_PAGE.value: [ + SignalRule("docs_keywords", 0.18, "text", "Documentation keywords detected.", _keyword("knowledge"), _keywords_value("knowledge")), + SignalRule("toc", 0.16, "dom", "Table of contents detected.", _flag("has_toc")), + SignalRule("code_blocks", 0.16, "dom", "Code blocks detected.", _flag("has_code_blocks")), + SignalRule("version_info", 0.08, "text", "Version information detected.", _flag("has_version_info")), + ], + PageType.API_REFERENCE_PAGE.value: [ + SignalRule("api_endpoint", 0.3, "text", "API endpoint detected.", _flag("has_api_endpoint")), + SignalRule("parameter_table", 0.22, "dom", "Parameter table detected.", _flag("has_parameter_table")), + SignalRule("code_blocks", 0.1, "dom", "Code blocks detected.", _flag("has_code_blocks")), + SignalRule("docs_keywords", 0.12, "text", "API/docs keywords detected.", _keyword("knowledge"), _keywords_value("knowledge")), + ], + PageType.WIKI_PAGE.value: [ + SignalRule("wiki_schema", 0.28, "structured_data", "Wiki/DefinedTerm structured data detected.", _has_schema("DefinedTerm", "WebPage"), _schema_value), + SignalRule("toc", 0.12, "dom", "Reference table of contents detected.", _flag("has_toc")), + SignalRule("definition_terms", 0.14, "text", "Definition/reference keywords detected.", lambda signals: _contains_terms(signals, ("definition", "wiki", "glossary", "reference"))), + ], + PageType.DATASET_PAGE.value: [ + SignalRule("schema_dataset", 0.42, "structured_data", "Dataset structured data detected.", _has_schema("Dataset", "DataCatalog"), _schema_value), + SignalRule("download_terms", 0.12, "text", "Dataset/download keywords detected.", lambda signals: _contains_terms(signals, ("dataset", "data catalog", "download", "csv"))), + SignalRule("parameter_table", 0.08, "dom", "Dataset metadata table detected.", _flag("has_parameter_table")), + ], + PageType.RESEARCH_PAPER_PAGE.value: [ + SignalRule("schema_scholarly", 0.42, "structured_data", "Scholarly article structured data detected.", _has_schema("ScholarlyArticle", "TechArticle"), _schema_value), + SignalRule("published_date", 0.1, "text", "Publication date detected.", _flag("has_published_date")), + SignalRule("citation_terms", 0.16, "text", "Citation/references keywords detected.", lambda signals: _contains_terms(signals, ("abstract", "citation", "references", "doi"))), + ], + PageType.JOB_POSTING_PAGE.value: [ + SignalRule("career_keywords", 0.26, "text", "Career/job keywords detected.", _flag("has_career_terms")), + SignalRule("apply_intent", 0.12, "text", "Apply intent detected.", lambda signals: "apply" in (signals.text_sample or "").lower() or "지원" in (signals.text_sample or "")), + SignalRule("address", 0.06, "text", "Location/address signal detected.", _flag("has_address")), + ], + PageType.COURSE_DETAIL_PAGE.value: [ + SignalRule("schema_course", 0.42, "structured_data", "Course structured data detected.", _has_schema("Course"), _schema_value), + SignalRule("course_terms", 0.18, "text", "Course/curriculum keywords detected.", lambda signals: _contains_terms(signals, ("course", "lesson", "curriculum", "instructor", "syllabus"))), + ], + PageType.VIDEO_PAGE.value: [ + SignalRule("schema_video", 0.42, "structured_data", "VideoObject structured data detected.", _has_schema("VideoObject"), _schema_value), + SignalRule("media_player", 0.2, "layout", "Video/audio player detected.", _flag("has_media_player_area")), + SignalRule("video_terms", 0.1, "text", "Video/watch keywords detected.", lambda signals: _contains_terms(signals, ("video", "watch", "episode", "duration"))), + ], + PageType.LOCAL_BUSINESS_PAGE.value: [ + SignalRule("schema_local_business", 0.42, "structured_data", "Local business/place structured data detected.", _has_schema("LocalBusiness", "Place", "Restaurant"), _schema_value), + SignalRule("address", 0.18, "text", "Address detected.", _flag("has_address")), + SignalRule("contact_info", 0.12, "text", "Contact info detected.", _flag("has_contact_info")), + SignalRule("map_area", 0.1, "layout", "Map area detected.", _flag("has_map_area")), + ], + PageType.REAL_ESTATE_LISTING_PAGE.value: [ + SignalRule("schema_real_estate", 0.38, "structured_data", "Real estate structured data detected.", _has_schema("RealEstateListing", "Residence", "Apartment"), _schema_value), + SignalRule("property_terms", 0.18, "text", "Property listing keywords detected.", lambda signals: _contains_terms(signals, ("bedroom", "bathroom", "sqft", "property", "real estate"))), + SignalRule("price", 0.12, "text", "Property price detected.", _flag("has_price")), + SignalRule("address", 0.08, "text", "Property address detected.", _flag("has_address")), + ], + PageType.PROFILE_PAGE.value: [ + SignalRule("schema_person", 0.34, "structured_data", "Person/Profile structured data detected.", _has_schema("Person", "ProfilePage"), _schema_value), + SignalRule("profile_links", 0.12, "link_graph", "Profile link pattern detected.", _count_at_least("profile_link_count", 1), _value("profile_link_count")), + SignalRule("author", 0.1, "text", "Author/person signal detected.", _flag("has_author")), + ], + PageType.PRICING_PAGE.value: [ + SignalRule("pricing_table", 0.3, "layout", "Pricing table detected.", _flag("has_pricing_table")), + SignalRule("price", 0.16, "text", "Price detected.", _flag("has_price")), + SignalRule("comparison_table", 0.12, "layout", "Comparison table detected.", _flag("has_comparison_table")), + SignalRule("commerce_keywords", 0.1, "text", "Commerce keywords detected.", _keyword("commerce"), _keywords_value("commerce")), + ], + PageType.LOGIN_PAGE.value: [ + SignalRule("password_field", 0.4, "form", "Password field detected.", _flag("has_password_field")), + SignalRule("login_form", 0.25, "form", "Login form detected.", _flag("has_login_form")), + SignalRule("protected_url_hint", 0.08, "url", "Protected URL hint detected.", _url_hint("protected"), _url_hint_value), + ], + PageType.CHECKOUT_PAGE.value: [ + SignalRule("protected_url_hint", 0.25, "url", "Checkout/cart URL hint detected.", _url_hint("protected"), _url_hint_value), + SignalRule("buy_button", 0.14, "dom", "Purchase button detected.", _flag("has_buy_button")), + SignalRule("commerce_keywords", 0.12, "text", "Checkout commerce keywords detected.", _keyword("commerce"), _keywords_value("commerce")), + ], + PageType.PAYMENT_PAGE.value: [ + SignalRule("payment_fields", 0.42, "form", "Payment fields detected.", _flag("has_payment_fields")), + SignalRule("protected_keywords", 0.16, "text", "Payment/protected keywords detected.", _keyword("protected"), _keywords_value("protected")), + SignalRule("protected_url_hint", 0.1, "url", "Payment URL hint detected.", _url_hint("protected"), _url_hint_value), + ], + PageType.TERMS_PAGE.value: [ + SignalRule("policy_terms", 0.32, "text", "Policy/terms terms detected.", _flag("has_policy_terms")), + SignalRule("corporate_keywords", 0.08, "text", "Corporate legal keywords detected.", _keyword("corporate"), _keywords_value("corporate")), + ], + PageType.PRIVACY_POLICY_PAGE.value: [ + SignalRule("privacy_terms", 0.36, "text", "Privacy terms detected.", _flag("has_privacy_terms")), + SignalRule("policy_terms", 0.14, "text", "Policy terms detected.", _flag("has_policy_terms")), + ], + PageType.SITEMAP_PAGE.value: [ + SignalRule("sitemap_resource", 0.45, "resource", "Sitemap resource detected.", _flag("has_sitemap_resource")), + SignalRule("xml_resource", 0.12, "resource", "XML resource detected.", _flag("has_xml_resource")), + SignalRule("system_url_hint", 0.12, "url", "System URL hint detected.", _url_hint("system"), _url_hint_value), + ], + PageType.RSS_FEED_PAGE.value: [ + SignalRule("feed_resource", 0.45, "resource", "RSS/Atom feed detected.", _flag("has_feed_resource")), + SignalRule("xml_resource", 0.1, "resource", "XML feed resource detected.", _flag("has_xml_resource")), + ], + PageType.ERROR_PAGE.value: [ + SignalRule("error_status", 0.38, "http", "Error status detected.", _flag("has_error_status")), + ], + PageType.NOT_FOUND_PAGE.value: [ + SignalRule("not_found", 0.5, "http", "404/not found signal detected.", _flag("has_not_found")), + SignalRule("error_status", 0.12, "http", "Error status supports not found page.", _flag("has_error_status")), + ], + PageType.ACCESS_DENIED_PAGE.value: [ + SignalRule("access_denied", 0.42, "protected", "Access denied text detected.", _flag("has_access_denied")), + SignalRule("error_status", 0.1, "http", "Error status supports access denied.", _flag("has_error_status")), + ], + PageType.CAPTCHA_PAGE.value: [ + SignalRule("captcha", 0.45, "protected", "Captcha detected.", _flag("has_captcha")), + SignalRule("protected_keywords", 0.1, "text", "Protected keywords detected.", _keyword("protected"), _keywords_value("protected")), + ], +} diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_type_taxonomy.py b/ontology_platform/crawler_platform/app/core/crawler/page_type_taxonomy.py new file mode 100644 index 0000000..29fe84d --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/crawler/page_type_taxonomy.py @@ -0,0 +1,476 @@ +from __future__ import annotations + +from dataclasses import asdict, dataclass, field +from enum import StrEnum +from typing import Any + + +class PageDomain(StrEnum): + COMMERCE = "Commerce" + EDITORIAL = "Editorial" + COMMUNITY = "Community" + KNOWLEDGE = "Knowledge" + CORPORATE = "Corporate" + LOCAL = "Local" + EDUCATION = "Education" + JOBS = "Jobs" + MEDIA = "Media" + SOFTWARE = "Software" + FINANCE = "Finance" + GOVERNMENT = "Government" + HEALTHCARE = "Healthcare" + TRANSACTION = "Transaction" + SYSTEM = "System" + UNKNOWN = "Unknown" + + +class PageArchetype(StrEnum): + HOME = "Home" + LANDING = "Landing" + DETAIL = "Detail" + LISTING = "Listing" + COLLECTION = "Collection" + SEARCH_RESULT = "SearchResult" + PROFILE = "Profile" + ARTICLE = "Article" + THREAD = "Thread" + FORM = "Form" + TRANSACTION = "Transaction" + DASHBOARD = "Dashboard" + DOCUMENT = "Document" + MEDIA = "Media" + ERROR = "Error" + SYSTEM_RESOURCE = "SystemResource" + UNKNOWN = "Unknown" + + +class PageType(StrEnum): + PRODUCT_PAGE = "ProductPage" + CATEGORY_PAGE = "CategoryPage" + SEARCH_PAGE = "SearchPage" + BOARD_PAGE = "BoardPage" + NOTICE_PAGE = "NoticePage" + BRAND_STORY_PAGE = "BrandStoryPage" + ABOUT_PAGE = "AboutPage" + CONTACT_PAGE = "ContactPage" + PROMOTION_PAGE = "PromotionPage" + REVIEW_PAGE = "ReviewPage" + UNKNOWN_PAGE = "UnknownPage" + PRODUCT_DETAIL_PAGE = "ProductDetailPage" + CATEGORY_LISTING_PAGE = "CategoryListingPage" + SEARCH_RESULTS_PAGE = "SearchResultsPage" + FORUM_BOARD_PAGE = "ForumBoardPage" + FORUM_THREAD_PAGE = "ForumThreadPage" + PUBLIC_NOTICE_PAGE = "PublicNoticePage" + CAMPAIGN_LANDING_PAGE = "CampaignLandingPage" + ARTICLE_PAGE = "ArticlePage" + NEWS_ARTICLE_PAGE = "NewsArticlePage" + BLOG_POST_PAGE = "BlogPostPage" + FAQ_PAGE = "FAQPage" + QA_PAGE = "QAPage" + PROFILE_PAGE = "ProfilePage" + DOCUMENTATION_PAGE = "DocumentationPage" + API_REFERENCE_PAGE = "APIReferencePage" + WIKI_PAGE = "WikiPage" + DATASET_PAGE = "DatasetPage" + RESEARCH_PAPER_PAGE = "ResearchPaperPage" + JOB_POSTING_PAGE = "JobPostingPage" + COURSE_DETAIL_PAGE = "CourseDetailPage" + VIDEO_PAGE = "VideoPage" + LOCAL_BUSINESS_PAGE = "LocalBusinessPage" + REAL_ESTATE_LISTING_PAGE = "RealEstateListingPage" + PRICING_PAGE = "PricingPage" + LOGIN_PAGE = "LoginPage" + CHECKOUT_PAGE = "CheckoutPage" + PAYMENT_PAGE = "PaymentPage" + TERMS_PAGE = "TermsPage" + PRIVACY_POLICY_PAGE = "PrivacyPolicyPage" + SITEMAP_PAGE = "SitemapPage" + RSS_FEED_PAGE = "RSSFeedPage" + ERROR_PAGE = "ErrorPage" + NOT_FOUND_PAGE = "NotFoundPage" + ACCESS_DENIED_PAGE = "AccessDeniedPage" + CAPTCHA_PAGE = "CaptchaPage" + + +class EntityType(StrEnum): + PRODUCT = "Product" + SERVICE = "Service" + ARTICLE = "Article" + NEWS_ARTICLE = "NewsArticle" + PERSON = "Person" + ORGANIZATION = "Organization" + PLACE = "Place" + EVENT = "Event" + JOB_POSTING = "JobPosting" + COURSE = "Course" + QUESTION = "Question" + ANSWER = "Answer" + REVIEW = "Review" + DATASET = "Dataset" + SOFTWARE_APPLICATION = "SoftwareApplication" + MEDIA_OBJECT = "MediaObject" + RECIPE = "Recipe" + REAL_ESTATE_PROPERTY = "RealEstateProperty" + MEDICAL_CONDITION = "MedicalCondition" + LEGAL_DOCUMENT = "LegalDocument" + FINANCIAL_PRODUCT = "FinancialProduct" + UNKNOWN_ENTITY = "UnknownEntity" + + +class ActionIntent(StrEnum): + READ = "Read" + BUY = "Buy" + SUBSCRIBE = "Subscribe" + RESERVE = "Reserve" + BOOK = "Book" + APPLY = "Apply" + DOWNLOAD = "Download" + WATCH = "Watch" + LISTEN = "Listen" + SEARCH = "Search" + COMPARE = "Compare" + FILTER = "Filter" + ASK = "Ask" + ANSWER = "Answer" + COMMENT = "Comment" + REVIEW = "Review" + LOGIN = "Login" + REGISTER = "Register" + PAY = "Pay" + CONTACT = "Contact" + NAVIGATE = "Navigate" + LEARN = "Learn" + VERIFY = "Verify" + CONFIGURE = "Configure" + MANAGE = "Manage" + + +class GraphRole(StrEnum): + ENTITY_ANCHOR = "EntityAnchor" + RELATION_HUB = "RelationHub" + NAVIGATION_HUB = "NavigationHub" + COLLECTION_HUB = "CollectionHub" + SEARCH_HUB = "SearchHub" + TRANSACTION_ONLY = "TransactionOnly" + POLICY_SOURCE = "PolicySource" + CLAIM_SOURCE = "ClaimSource" + PROFILE_ANCHOR = "ProfileAnchor" + MEDIA_ANCHOR = "MediaAnchor" + REFERENCE_SOURCE = "ReferenceSource" + SYSTEM_RESOURCE = "SystemResource" + NOISE_PAGE = "NoisePage" + UNKNOWN_PATTERN = "UnknownPattern" + + +class AnalyzeStrategy(StrEnum): + ANALYZE_FULL = "AnalyzeFull" + ANALYZE_STRUCTURE_ONLY = "AnalyzeStructureOnly" + ANALYZE_ENTITY_ONLY = "AnalyzeEntityOnly" + ANALYZE_RELATIONS_ONLY = "AnalyzeRelationsOnly" + ANALYZE_METADATA_ONLY = "AnalyzeMetadataOnly" + ANALYZE_DOCUMENT_ONLY = "AnalyzeDocumentOnly" + ANALYZE_DISCOVERY_ONLY = "AnalyzeDiscoveryOnly" + SKIP_PROTECTED = "SkipProtected" + SKIP_NOISE = "SkipNoise" + + +class LLMPolicy(StrEnum): + LLM_FULL = "LLMFull" + LLM_LIGHT = "LLMLight" + LLM_FOR_AMBIGUITY_ONLY = "LLMForAmbiguityOnly" + RULE_ONLY = "RuleOnly" + NO_LLM = "NoLLM" + SKIP = "Skip" + + +@dataclass(frozen=True, slots=True) +class EvidenceItem: + key: str + value: str | int | float | bool | None + weight: float + source: str + message: str + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass(slots=True) +class PageClassificationResult: + url: str + primary_page_type: str + secondary_page_types: list[str] = field(default_factory=list) + domain: str = PageDomain.UNKNOWN.value + archetype: str = PageArchetype.UNKNOWN.value + main_entity_type: str | None = None + action_intents: list[str] = field(default_factory=list) + graph_roles: list[str] = field(default_factory=lambda: [GraphRole.UNKNOWN_PATTERN.value]) + confidence: float = 0.0 + alternatives: list[tuple[str, float]] = field(default_factory=list) + evidence: list[EvidenceItem] = field(default_factory=list) + should_analyze: bool = False + analyze_strategy: str = AnalyzeStrategy.ANALYZE_METADATA_ONLY.value + llm_policy: str = LLMPolicy.NO_LLM.value + is_protected: bool = False + is_noise: bool = False + + def to_dict(self) -> dict[str, Any]: + payload = asdict(self) + payload["evidence"] = [item.to_dict() for item in self.evidence] + payload["legacy_page_type"] = get_legacy_page_type(self) + return payload + + +LEGACY_PAGE_TYPES = { + PageType.PRODUCT_PAGE.value, + PageType.CATEGORY_PAGE.value, + PageType.SEARCH_PAGE.value, + PageType.BOARD_PAGE.value, + PageType.NOTICE_PAGE.value, + PageType.BRAND_STORY_PAGE.value, + PageType.PROMOTION_PAGE.value, + PageType.REVIEW_PAGE.value, + PageType.UNKNOWN_PAGE.value, + "EventPage", +} + + +LEGACY_ALIASES: dict[str, str] = { + "product": PageType.PRODUCT_PAGE.value, + "productpage": PageType.PRODUCT_PAGE.value, + "productdetailpage": PageType.PRODUCT_PAGE.value, + "brand": PageType.BRAND_STORY_PAGE.value, + "brandpage": PageType.BRAND_STORY_PAGE.value, + "brandstorypage": PageType.BRAND_STORY_PAGE.value, + "about": PageType.BRAND_STORY_PAGE.value, + "aboutpage": "AboutPage", + "contact": "ContactPage", + "contactpage": "ContactPage", + "review": PageType.REVIEW_PAGE.value, + "reviewpage": PageType.REVIEW_PAGE.value, + "productreviewpage": PageType.REVIEW_PAGE.value, + "listing": PageType.CATEGORY_PAGE.value, + "listingpage": PageType.CATEGORY_PAGE.value, + "category": PageType.CATEGORY_PAGE.value, + "categorypage": PageType.CATEGORY_PAGE.value, + "categorylistingpage": PageType.CATEGORY_PAGE.value, + "productlistingpage": PageType.CATEGORY_PAGE.value, + "community": PageType.BOARD_PAGE.value, + "communitypage": PageType.BOARD_PAGE.value, + "board": PageType.BOARD_PAGE.value, + "boardpage": PageType.BOARD_PAGE.value, + "forumboardpage": PageType.BOARD_PAGE.value, + "forumthreadpage": PageType.BOARD_PAGE.value, + "search": PageType.SEARCH_PAGE.value, + "searchpage": PageType.SEARCH_PAGE.value, + "searchresultspage": PageType.SEARCH_PAGE.value, + "notice": PageType.NOTICE_PAGE.value, + "noticepage": PageType.NOTICE_PAGE.value, + "publicnoticepage": PageType.NOTICE_PAGE.value, + "promotion": PageType.PROMOTION_PAGE.value, + "promotionpage": PageType.PROMOTION_PAGE.value, + "campaignlandingpage": PageType.PROMOTION_PAGE.value, + "event": "EventPage", + "eventpage": "EventPage", + "unknown": PageType.UNKNOWN_PAGE.value, + "unknownpage": PageType.UNKNOWN_PAGE.value, + "notfoundpage": PageType.NOT_FOUND_PAGE.value, + "404": PageType.NOT_FOUND_PAGE.value, +} + + +LEGACY_TO_SEMANTIC_PAGE_TYPE: dict[str, str] = { + PageType.PRODUCT_PAGE.value: PageType.PRODUCT_DETAIL_PAGE.value, + PageType.CATEGORY_PAGE.value: PageType.CATEGORY_LISTING_PAGE.value, + PageType.SEARCH_PAGE.value: PageType.SEARCH_RESULTS_PAGE.value, + PageType.BOARD_PAGE.value: PageType.FORUM_BOARD_PAGE.value, + PageType.NOTICE_PAGE.value: PageType.PUBLIC_NOTICE_PAGE.value, + PageType.BRAND_STORY_PAGE.value: PageType.BRAND_STORY_PAGE.value, + PageType.ABOUT_PAGE.value: PageType.ABOUT_PAGE.value, + PageType.CONTACT_PAGE.value: PageType.CONTACT_PAGE.value, + PageType.PROMOTION_PAGE.value: PageType.PROMOTION_PAGE.value, + PageType.REVIEW_PAGE.value: PageType.REVIEW_PAGE.value, + PageType.UNKNOWN_PAGE.value: PageType.UNKNOWN_PAGE.value, + "EventPage": "EventPage", +} + + +SEMANTIC_TO_LEGACY_PAGE_TYPE: dict[str, str] = { + semantic: legacy for legacy, semantic in LEGACY_TO_SEMANTIC_PAGE_TYPE.items() +} +SEMANTIC_TO_LEGACY_PAGE_TYPE.update( + { + PageType.PRODUCT_DETAIL_PAGE.value: PageType.PRODUCT_PAGE.value, + PageType.CATEGORY_LISTING_PAGE.value: PageType.CATEGORY_PAGE.value, + PageType.SEARCH_RESULTS_PAGE.value: PageType.SEARCH_PAGE.value, + PageType.FORUM_BOARD_PAGE.value: PageType.BOARD_PAGE.value, + PageType.FORUM_THREAD_PAGE.value: PageType.BOARD_PAGE.value, + PageType.PUBLIC_NOTICE_PAGE.value: PageType.NOTICE_PAGE.value, + PageType.CAMPAIGN_LANDING_PAGE.value: PageType.PROMOTION_PAGE.value, + PageType.ABOUT_PAGE.value: PageType.BRAND_STORY_PAGE.value, + PageType.CONTACT_PAGE.value: PageType.BRAND_STORY_PAGE.value, + "ListingPage": PageType.CATEGORY_PAGE.value, + "CommunityPage": PageType.BOARD_PAGE.value, + } +) + + +PAGE_TYPE_PROFILES: dict[str, dict[str, Any]] = { + PageType.PRODUCT_DETAIL_PAGE.value: { + "domain": PageDomain.COMMERCE.value, + "archetype": PageArchetype.DETAIL.value, + "main_entity_type": EntityType.PRODUCT.value, + "action_intents": [ActionIntent.BUY.value, ActionIntent.REVIEW.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.CATEGORY_LISTING_PAGE.value: { + "domain": PageDomain.COMMERCE.value, + "archetype": PageArchetype.LISTING.value, + "main_entity_type": EntityType.PRODUCT.value, + "action_intents": [ActionIntent.FILTER.value, ActionIntent.NAVIGATE.value], + "graph_roles": [GraphRole.COLLECTION_HUB.value, GraphRole.RELATION_HUB.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_RELATIONS_ONLY.value, + "llm_policy": LLMPolicy.LLM_FOR_AMBIGUITY_ONLY.value, + "should_analyze": True, + }, + PageType.SEARCH_RESULTS_PAGE.value: { + "domain": PageDomain.UNKNOWN.value, + "archetype": PageArchetype.SEARCH_RESULT.value, + "main_entity_type": EntityType.UNKNOWN_ENTITY.value, + "action_intents": [ActionIntent.SEARCH.value, ActionIntent.NAVIGATE.value], + "graph_roles": [GraphRole.SEARCH_HUB.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_DISCOVERY_ONLY.value, + "llm_policy": LLMPolicy.LLM_FOR_AMBIGUITY_ONLY.value, + "should_analyze": True, + }, + PageType.FORUM_BOARD_PAGE.value: { + "domain": PageDomain.COMMUNITY.value, + "archetype": PageArchetype.LISTING.value, + "main_entity_type": EntityType.ARTICLE.value, + "action_intents": [ActionIntent.NAVIGATE.value, ActionIntent.READ.value], + "graph_roles": [GraphRole.RELATION_HUB.value, GraphRole.COLLECTION_HUB.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_RELATIONS_ONLY.value, + "llm_policy": LLMPolicy.LLM_FOR_AMBIGUITY_ONLY.value, + "should_analyze": True, + }, + PageType.PUBLIC_NOTICE_PAGE.value: { + "domain": PageDomain.GOVERNMENT.value, + "archetype": PageArchetype.DOCUMENT.value, + "main_entity_type": EntityType.ARTICLE.value, + "action_intents": [ActionIntent.READ.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.BRAND_STORY_PAGE.value: { + "domain": PageDomain.CORPORATE.value, + "archetype": PageArchetype.ARTICLE.value, + "main_entity_type": EntityType.ORGANIZATION.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.LEARN.value], + "graph_roles": [GraphRole.ENTITY_ANCHOR.value, GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_FULL.value, + "should_analyze": True, + }, + PageType.PROMOTION_PAGE.value: { + "domain": PageDomain.COMMERCE.value, + "archetype": PageArchetype.LANDING.value, + "main_entity_type": EntityType.EVENT.value, + "action_intents": [ActionIntent.BUY.value, ActionIntent.NAVIGATE.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.REVIEW_PAGE.value: { + "domain": PageDomain.COMMUNITY.value, + "archetype": PageArchetype.ARTICLE.value, + "main_entity_type": EntityType.REVIEW.value, + "action_intents": [ActionIntent.READ.value, ActionIntent.REVIEW.value], + "graph_roles": [GraphRole.CLAIM_SOURCE.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_FULL.value, + "llm_policy": LLMPolicy.LLM_LIGHT.value, + "should_analyze": True, + }, + PageType.UNKNOWN_PAGE.value: { + "domain": PageDomain.UNKNOWN.value, + "archetype": PageArchetype.UNKNOWN.value, + "main_entity_type": EntityType.UNKNOWN_ENTITY.value, + "action_intents": [], + "graph_roles": [GraphRole.UNKNOWN_PATTERN.value], + "analyze_strategy": AnalyzeStrategy.ANALYZE_METADATA_ONLY.value, + "llm_policy": LLMPolicy.NO_LLM.value, + "should_analyze": False, + }, +} + + +def normalize_page_type(value: object | None) -> str: + """Return the legacy-compatible page type string for existing callers.""" + + if isinstance(value, PageClassificationResult): + return get_legacy_page_type(value) + clean = str(value or "").strip() + if not clean: + return PageType.UNKNOWN_PAGE.value + alias = LEGACY_ALIASES.get(clean.lower()) + if alias: + return alias + return SEMANTIC_TO_LEGACY_PAGE_TYPE.get(clean, clean) + + +def normalize_semantic_page_type(value: object | None) -> str: + if isinstance(value, PageClassificationResult): + return value.primary_page_type + legacy = normalize_page_type(value) + return LEGACY_TO_SEMANTIC_PAGE_TYPE.get(legacy, str(value or legacy).strip() or PageType.UNKNOWN_PAGE.value) + + +def get_legacy_page_type(value: object | None) -> str: + if isinstance(value, PageClassificationResult): + return SEMANTIC_TO_LEGACY_PAGE_TYPE.get(value.primary_page_type, value.primary_page_type) + return normalize_page_type(value) + + +def build_classification_result_from_legacy( + *, + url: str, + legacy_page_type: str, + confidence: float = 0.55, + source: str = "legacy_classifier", +) -> PageClassificationResult: + normalized_legacy = normalize_page_type(legacy_page_type) + semantic_page_type = LEGACY_TO_SEMANTIC_PAGE_TYPE.get(normalized_legacy, normalized_legacy) + profile = PAGE_TYPE_PROFILES.get(semantic_page_type, PAGE_TYPE_PROFILES[PageType.UNKNOWN_PAGE.value]) + evidence = [ + EvidenceItem( + key="legacy_page_type", + value=normalized_legacy, + weight=confidence, + source=source, + message=f"Legacy classifier returned {normalized_legacy}.", + ) + ] + return PageClassificationResult( + url=url, + primary_page_type=semantic_page_type, + secondary_page_types=[] if semantic_page_type == normalized_legacy else [normalized_legacy], + domain=str(profile["domain"]), + archetype=str(profile["archetype"]), + main_entity_type=profile.get("main_entity_type"), + action_intents=list(profile.get("action_intents") or []), + graph_roles=list(profile.get("graph_roles") or []), + confidence=confidence, + alternatives=[(normalized_legacy, confidence)], + evidence=evidence, + should_analyze=bool(profile.get("should_analyze")), + analyze_strategy=str(profile["analyze_strategy"]), + llm_policy=str(profile["llm_policy"]), + is_protected=str(profile["analyze_strategy"]) == AnalyzeStrategy.SKIP_PROTECTED.value, + is_noise=str(profile["analyze_strategy"]) == AnalyzeStrategy.SKIP_NOISE.value, + ) diff --git a/ontology_platform/crawler_platform/app/core/crawler/page_unknown_patterns.py b/ontology_platform/crawler_platform/app/core/crawler/page_unknown_patterns.py new file mode 100644 index 0000000..64bbd35 --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/crawler/page_unknown_patterns.py @@ -0,0 +1,347 @@ +from __future__ import annotations + +from collections import Counter +import hashlib +import json +import re +from typing import Any +from urllib.parse import urljoin, urlparse + +from crawler_platform.app.core.crawler.page_signal_extractor import ( + build_raw_page_snapshot, + extract_page_signals, +) +from crawler_platform.app.core.crawler.page_type_taxonomy import PageClassificationResult, PageType + + +UNKNOWN_PATTERN_VERSION = 1 +LOW_CONFIDENCE_PATTERN_THRESHOLD = 0.45 +STOPWORDS = { + "about", + "after", + "again", + "also", + "and", + "are", + "but", + "can", + "for", + "from", + "has", + "have", + "home", + "into", + "more", + "not", + "our", + "page", + "that", + "the", + "this", + "with", + "your", +} + + +def should_store_unknown_pattern( + result: PageClassificationResult, + *, + confidence_threshold: float = LOW_CONFIDENCE_PATTERN_THRESHOLD, +) -> bool: + if result.primary_page_type == PageType.UNKNOWN_PAGE.value: + return True + if 0.0 < result.confidence <= confidence_threshold: + return True + return any(item.key == "low_confidence" for item in result.evidence) + + +def build_unknown_pattern_payload( + *, + result: PageClassificationResult, + url: str, + title: str | None = None, + text: str | None = None, + html: str | None = None, + source_zones: list[str | dict[str, Any]] | None = None, + collector_payload: dict[str, Any] | None = None, +) -> dict[str, Any]: + snapshot = build_raw_page_snapshot( + url=url, + title=title, + text=text, + html=html, + source_zones=source_zones, + collector_payload=collector_payload, + ) + signals = extract_page_signals(snapshot) + soup = _soup_from_html(html or "") + page_text = _normalize_text(text or signals.text_sample or _text_from_soup(soup)) + links = snapshot.links or _extract_links(soup, url) + buttons = snapshot.buttons or _extract_buttons(soup) + forms = snapshot.forms or _extract_forms(soup) + link_summary = summarize_link_patterns(links, url) + forms_summary = summarize_forms(forms) + payload = { + "version": UNKNOWN_PATTERN_VERSION, + "url": url, + "title": title or signals.title, + "primary_page_type": result.primary_page_type, + "confidence": result.confidence, + "reason": "unknown_page" if result.primary_page_type == PageType.UNKNOWN_PAGE.value else "low_confidence", + "text_sample": page_text[:1000], + "text_fingerprint": text_fingerprint(page_text), + "html_fingerprint": html_fingerprint(html or ""), + "dom_fingerprint": dom_fingerprint(html or ""), + "link_pattern_fingerprint": link_pattern_fingerprint(link_summary), + "schema_types": sorted(signals.schema_types), + "link_pattern_summary": link_summary, + "button_labels": _dedupe_strings(buttons)[:20], + "forms_summary": forms_summary, + "top_keywords": top_keywords(page_text), + "layout_blocks": list(signals.layout_blocks), + "keyword_hits": dict(signals.keyword_hits), + "alternatives": list(result.alternatives[:8]), + "evidence": [item.to_dict() for item in result.evidence[:12]], + } + payload["embedding_input"] = build_unknown_embedding_input(payload) + payload["cluster_candidate"] = build_cluster_candidate_payload(payload) + return payload + + +def build_unknown_embedding_input(payload: dict[str, Any]) -> str: + parts = [ + str(payload.get("title") or ""), + str(payload.get("text_sample") or ""), + "schema_types: " + ", ".join(str(item) for item in payload.get("schema_types") or []), + "layout_blocks: " + ", ".join(str(item) for item in payload.get("layout_blocks") or []), + "buttons: " + ", ".join(str(item) for item in payload.get("button_labels") or []), + "keywords: " + ", ".join(str(item.get("term")) for item in payload.get("top_keywords") or [] if isinstance(item, dict)), + ] + return "\n".join(part for part in parts if part.strip())[:4000] + + +def build_cluster_candidate_payload(payload: dict[str, Any]) -> dict[str, Any]: + return { + "version": UNKNOWN_PATTERN_VERSION, + "candidate_key": stable_hash( + { + "dom": payload.get("dom_fingerprint"), + "links": payload.get("link_pattern_fingerprint"), + "schema_types": payload.get("schema_types") or [], + "buttons": payload.get("button_labels") or [], + } + ), + "fingerprints": { + "text": payload.get("text_fingerprint"), + "html": payload.get("html_fingerprint"), + "dom": payload.get("dom_fingerprint"), + "links": payload.get("link_pattern_fingerprint"), + }, + "features": { + "schema_types": payload.get("schema_types") or [], + "layout_blocks": payload.get("layout_blocks") or [], + "top_keywords": payload.get("top_keywords") or [], + "link_patterns": (payload.get("link_pattern_summary") or {}).get("top_path_patterns") or [], + "form_count": (payload.get("forms_summary") or {}).get("form_count") or 0, + }, + } + + +def summarize_link_patterns(links: list[dict[str, Any]], base_url: str) -> dict[str, Any]: + base_host = urlparse(base_url).netloc.lower() + path_patterns = Counter() + text_labels: list[str] = [] + internal_count = 0 + external_count = 0 + for link in links: + href = str(link.get("href") or "") + parsed = urlparse(href) + if not href: + continue + if not parsed.netloc or parsed.netloc.lower() == base_host: + internal_count += 1 + else: + external_count += 1 + path_patterns[_path_pattern(parsed.path)] += 1 + text = str(link.get("text") or "").strip() + if text: + text_labels.append(text) + return { + "total_count": len(links), + "internal_count": internal_count, + "external_count": external_count, + "top_path_patterns": [ + {"pattern": pattern, "count": count} + for pattern, count in path_patterns.most_common(12) + if pattern + ], + "sample_texts": _dedupe_strings(text_labels)[:12], + } + + +def summarize_forms(forms: list[dict[str, Any]]) -> dict[str, Any]: + methods = Counter() + actions = Counter() + input_types = Counter() + form_texts: list[str] = [] + for form in forms: + method = str(form.get("method") or "get").lower() + action = _path_pattern(urlparse(str(form.get("action") or "")).path) + methods[method] += 1 + if action: + actions[action] += 1 + if form.get("text"): + form_texts.append(str(form.get("text"))) + for input_item in form.get("inputs") or []: + if isinstance(input_item, dict): + input_types[str(input_item.get("type") or "text").lower()] += 1 + return { + "form_count": len(forms), + "methods": dict(methods), + "action_patterns": dict(actions.most_common(8)), + "input_types": dict(input_types.most_common(12)), + "sample_texts": _dedupe_strings(form_texts)[:8], + } + + +def top_keywords(text: str, *, limit: int = 16) -> list[dict[str, Any]]: + tokens = [ + token.lower() + for token in re.findall(r"[A-Za-z][A-Za-z0-9_-]{2,}|[가-힣]{2,}", text or "") + if token.lower() not in STOPWORDS + ] + return [{"term": term, "count": count} for term, count in Counter(tokens).most_common(limit)] + + +def text_fingerprint(text: str) -> str: + return f"sha256:{_hash_text(_normalize_text(text))}" + + +def html_fingerprint(html: str) -> str: + return f"sha256:{_hash_text(_normalize_html(html))}" + + +def dom_fingerprint(html: str) -> str: + soup = _soup_from_html(html) + if soup is None: + return f"sha256:{_hash_text('')}" + tags = [] + for node in soup.find_all(True): + classes = ".".join(str(item).lower() for item in node.get("class", [])[:3]) + node_id = "#" + str(node.get("id")).lower() if node.get("id") else "" + tags.append(f"{node.name}{node_id}{('.' + classes) if classes else ''}") + return f"sha256:{_hash_text('>'.join(tags[:400]))}" + + +def link_pattern_fingerprint(link_summary: dict[str, Any]) -> str: + return stable_hash(link_summary) + + +def stable_hash(value: Any) -> str: + payload = json.dumps(value, sort_keys=True, ensure_ascii=False, separators=(",", ":")) + return f"sha256:{_hash_text(payload)}" + + +def _hash_text(value: str) -> str: + return hashlib.sha256(value.encode("utf-8", errors="ignore")).hexdigest() + + +def _normalize_text(value: str | None) -> str: + return re.sub(r"\s+", " ", str(value or "")).strip() + + +def _normalize_html(value: str | None) -> str: + text = re.sub(r">\s+<", "><", str(value or "")) + text = re.sub(r"\s+", " ", text) + return text.strip()[:200000] + + +def _path_pattern(path: str) -> str: + parts = [part for part in path.split("/") if part] + normalized = [] + for part in parts[:8]: + if part.isdigit() or re.fullmatch(r"[0-9a-fA-F-]{8,}", part): + normalized.append("{id}") + else: + normalized.append(re.sub(r"\d+", "{n}", part.lower())[:60]) + return "/" + "/".join(normalized) if normalized else "/" + + +def _soup_from_html(html: str): + if not html: + return None + try: + from bs4 import BeautifulSoup + except ImportError: + return None + try: + return BeautifulSoup(html, "html.parser") + except Exception: + return None + + +def _text_from_soup(soup) -> str: + if soup is None: + return "" + return soup.get_text(" ", strip=True) + + +def _extract_links(soup, base_url: str) -> list[dict[str, Any]]: + if soup is None: + return [] + links = [] + for tag in soup.find_all("a"): + href = str(tag.get("href") or "").strip() + if not href: + continue + links.append({"href": urljoin(base_url, href), "text": tag.get_text(" ", strip=True)}) + return links + + +def _extract_buttons(soup) -> list[str]: + if soup is None: + return [] + labels = [] + for tag in soup.select("button,input[type='submit'],input[type='button'],[role='button']"): + label = tag.get_text(" ", strip=True) or str(tag.get("value") or tag.get("aria-label") or "") + if label.strip(): + labels.append(label.strip()) + return labels + + +def _extract_forms(soup) -> list[dict[str, Any]]: + if soup is None: + return [] + forms = [] + for form in soup.find_all("form"): + inputs = [] + for tag in form.select("input,select,textarea"): + inputs.append( + { + "type": str(tag.get("type") or tag.name or ""), + "name": str(tag.get("name") or ""), + "placeholder": str(tag.get("placeholder") or ""), + } + ) + forms.append( + { + "action": str(form.get("action") or ""), + "method": str(form.get("method") or ""), + "text": form.get_text(" ", strip=True)[:500], + "inputs": inputs, + } + ) + return forms + + +def _dedupe_strings(values: list[str]) -> list[str]: + seen = set() + result = [] + for value in values: + clean = _normalize_text(value) + key = clean.lower() + if not clean or key in seen: + continue + seen.add(key) + result.append(clean) + return result diff --git a/ontology_platform/crawler_platform/app/core/crawler/pipeline.py b/ontology_platform/crawler_platform/app/core/crawler/pipeline.py index 596d2b3..d8caadc 100644 --- a/ontology_platform/crawler_platform/app/core/crawler/pipeline.py +++ b/ontology_platform/crawler_platform/app/core/crawler/pipeline.py @@ -3,11 +3,17 @@ from __future__ import annotations from dataclasses import dataclass from crawler_platform.app.config.loader import ProjectConfig -from crawler_platform.app.core.crawler.page_classifier import classify_page +from crawler_platform.app.core.crawler.page_classifier import ( + classification_metadata, + classify_page_semantic, + get_legacy_page_type, + should_analyze_page, +) from crawler_platform.app.core.crawler.fetchers import RobotsPolicy, make_fetcher from crawler_platform.app.core.crawler.plugins import ParserRegistry, default_parser_registry from crawler_platform.app.core.database.repository import KnowledgeRepository from crawler_platform.app.core.extractor.base import ExtractionPageContext, Extractor +from crawler_platform.app.core.extractor.strategy import extract_with_strategy from crawler_platform.app.core.extractor.validation import attach_page_context @@ -56,23 +62,33 @@ class CrawlPipeline: fetch_result = fetcher.fetch(url) parser = self.parser_registry.get(source_config.parser) parsed = parser.parse(fetch_result.analysis_html, fetch_result.final_url or url) - page_type = classify_page( + page_classification = classify_page_semantic( fetch_result.final_url or url, parsed.title or fetch_result.title, parsed.raw_text or parsed.text, fetch_result.analysis_html, parsed.source_zones or [], + final_url=fetch_result.final_url, + status_code=fetch_result.status_code, + content_type=fetch_result.headers.get("content-type"), ) + page_type = get_legacy_page_type(page_classification) project = self.repository.upsert_project(project_config) source = self.repository.get_source(project.id, source_name) warnings = [*fetch_result.warnings, *(parsed.extraction_warnings or [])] metadata = { **parsed.metadata, + **classification_metadata( + page_classification, + title=parsed.title or fetch_result.title, + text=parsed.raw_text or parsed.text, + html=fetch_result.analysis_html, + source_zones=parsed.source_zones or [], + ), "final_url": fetch_result.final_url, "crawl_status": fetch_result.crawl_status, "crawl_warnings": fetch_result.warnings, - "page_type": page_type, "raw_text_length": len(parsed.raw_text or ""), "clean_text_length": len(parsed.text or ""), "main_content_preview": (parsed.main_content or parsed.text)[:800], @@ -100,6 +116,20 @@ class CrawlPipeline: robots_status=robots_decision.status, robots_reason=robots_decision.reason, ) + if not should_analyze_page(page_classification, None): + return CrawlResult( + page_id=page.id, + claim_count=0, + entity_count=0, + crawl_status=fetch_result.crawl_status, + extraction_status="skipped", + page_type=page_type, + clean_text_length=len(parsed.text or ""), + raw_text_length=len(parsed.raw_text or ""), + warnings=warnings, + robots_status=robots_decision.status, + robots_reason=robots_decision.reason, + ) context = ExtractionPageContext( url=url, @@ -116,7 +146,7 @@ class CrawlPipeline: warnings=warnings, metadata=metadata, ) - bundle = self.extractor.extract_from_context(context, project_config) + bundle = extract_with_strategy(self.extractor, context, project_config) bundle = attach_page_context(bundle, context) claims = self.repository.save_extraction_bundle(project.id, source, page, bundle, project_config) extraction_summary = extraction_summary_from_raw(bundle.raw_output) diff --git a/ontology_platform/crawler_platform/app/core/crawler/site_crawler.py b/ontology_platform/crawler_platform/app/core/crawler/site_crawler.py index 281e2e6..05587d9 100644 --- a/ontology_platform/crawler_platform/app/core/crawler/site_crawler.py +++ b/ontology_platform/crawler_platform/app/core/crawler/site_crawler.py @@ -10,12 +10,16 @@ from crawler_platform.app.core.crawler.discovery import discover_links from crawler_platform.app.core.crawler.fetchers import RobotsDecision, RobotsPolicy, make_fetcher from crawler_platform.app.core.crawler.page_classifier import ( classify_page as classify_page_type, + classification_metadata, + classify_page_semantic, + get_legacy_page_type, should_analyze_page as should_analyze_page_type, ) from crawler_platform.app.core.crawler.plugins import ParserRegistry, default_parser_registry from crawler_platform.app.core.database import models from crawler_platform.app.core.database.repository import KnowledgeRepository from crawler_platform.app.core.extractor.base import ExtractionPageContext, Extractor +from crawler_platform.app.core.extractor.strategy import extract_with_strategy from crawler_platform.app.core.extractor.validation import attach_page_context @@ -209,6 +213,16 @@ class SiteCrawler: fetch_result = fetcher.fetch(url) if is_failed_fetch_status(fetch_result.status_code) or fetch_result.crawl_status != "success": error = f"fetch failed with status {fetch_result.status_code}; crawl_status={fetch_result.crawl_status}" + page_classification = classify_page_semantic( + fetch_result.final_url or url, + title=fetch_result.title, + text="", + html=fetch_result.analysis_html, + final_url=fetch_result.final_url, + status_code=fetch_result.status_code, + content_type=fetch_result.headers.get("content-type"), + ) + page_type = get_legacy_page_type(page_classification) page = self.repository.upsert_page( project_id=source.project_id, source_id=source.id, @@ -217,6 +231,11 @@ class SiteCrawler: status_code=fetch_result.status_code, cleaned_text="", metadata={ + **classification_metadata( + page_classification, + title=fetch_result.title, + html=fetch_result.analysis_html, + ), "final_url": fetch_result.final_url, "crawl_status": fetch_result.crawl_status, "crawl_warnings": fetch_result.warnings, @@ -232,7 +251,7 @@ class SiteCrawler: url=url, depth=depth, status=fetch_result.crawl_status, - page_type="unknown", + page_type=page_type, page_id=page.id, crawl_status=fetch_result.crawl_status, robots_status=robots_decision.status, @@ -246,13 +265,17 @@ class SiteCrawler: return parsed = parser.parse(fetch_result.analysis_html, fetch_result.final_url or url) - page_type = classify_page( + page_classification = classify_page_semantic( fetch_result.final_url or url, parsed.title or fetch_result.title, parsed.raw_text or parsed.text, fetch_result.analysis_html, parsed.source_zones or [], + final_url=fetch_result.final_url, + status_code=fetch_result.status_code, + content_type=fetch_result.headers.get("content-type"), ) + page_type = get_legacy_page_type(page_classification) discovered_count = self._enqueue_links( html=fetch_result.analysis_html, base_url=fetch_result.final_url or url, @@ -268,10 +291,16 @@ class SiteCrawler: warnings = [*fetch_result.warnings, *(parsed.extraction_warnings or [])] metadata = { **parsed.metadata, + **classification_metadata( + page_classification, + title=parsed.title or fetch_result.title, + text=parsed.raw_text or parsed.text, + html=fetch_result.analysis_html, + source_zones=parsed.source_zones or [], + ), "final_url": fetch_result.final_url, "crawl_status": fetch_result.crawl_status, "crawl_warnings": fetch_result.warnings, - "page_type": page_type, "depth": depth, "raw_text_length": len(parsed.raw_text or ""), "clean_text_length": len(parsed.text or ""), @@ -319,7 +348,7 @@ class SiteCrawler: ) return - if should_analyze_page(page_type, analyze_page_types): + if should_analyze_page(page_classification, analyze_page_types): context = ExtractionPageContext( url=url, final_url=fetch_result.final_url, @@ -335,7 +364,7 @@ class SiteCrawler: warnings=warnings, metadata=metadata, ) - bundle = self.extractor.extract_from_context(context, project_config) + bundle = extract_with_strategy(self.extractor, context, project_config) bundle = attach_page_context(bundle, context) claims = self.repository.save_extraction_bundle(source.project_id, source, page, bundle, project_config) extraction_summary = extraction_summary_from_raw(bundle.raw_output) diff --git a/ontology_platform/crawler_platform/app/core/extractor/ai_provider.py b/ontology_platform/crawler_platform/app/core/extractor/ai_provider.py index bf71fe3..2f6c422 100644 --- a/ontology_platform/crawler_platform/app/core/extractor/ai_provider.py +++ b/ontology_platform/crawler_platform/app/core/extractor/ai_provider.py @@ -637,6 +637,38 @@ def list_openai_compatible_models(base_url: str, api_key: str | None = None) -> return [{"id": item.get("id", ""), "owned_by": item.get("owned_by")} for item in items if item.get("id")] +def list_lmstudio_loaded_models(base_url: str) -> list[dict[str, Any]]: + """Return only the models currently loaded in LM Studio. + + Uses LM Studio's native REST API (``/api/v0/models``) which exposes a + ``state`` field. Falls back to the OpenAI-compatible ``/v1/models`` list + (treated as all-loaded) if the native endpoint is unavailable. + """ + clean = base_url.rstrip("/") + if clean.endswith("/v1"): + root = clean[: -len("/v1")] + elif clean.endswith("/v1/chat/completions"): + root = clean[: -len("/v1/chat/completions")] + else: + root = clean + native_url = f"{root}/api/v0/models" + try: + response = requests.get(native_url, timeout=5) + response.raise_for_status() + data = response.json() + items = data.get("data", []) if isinstance(data, dict) else [] + loaded = [ + {"id": item.get("id", ""), "owned_by": item.get("owned_by"), "state": item.get("state")} + for item in items + if item.get("id") and str(item.get("state", "")).lower() == "loaded" + ] + if loaded: + return loaded + except Exception: + pass + return list_openai_compatible_models(base_url) + + def parse_entities(items: list[dict[str, Any]]) -> list[ExtractedEntity]: entities: list[ExtractedEntity] = [] for item in items: diff --git a/ontology_platform/crawler_platform/app/core/extractor/base.py b/ontology_platform/crawler_platform/app/core/extractor/base.py index 8be1558..c749313 100644 --- a/ontology_platform/crawler_platform/app/core/extractor/base.py +++ b/ontology_platform/crawler_platform/app/core/extractor/base.py @@ -61,6 +61,7 @@ class ExtractionPageContext: clean_text = self.clean_text if text_limit is not None and len(clean_text) > text_limit: clean_text = clean_text[:text_limit] + semantic_metadata = self.semantic_metadata_payload() zones = [] for zone in self.source_zones: zone_text = str(zone.get("text") or "") @@ -85,8 +86,34 @@ class ExtractionPageContext: "clean_text": clean_text, "source_zones": zones, "warnings": self.warnings, + "metadata": semantic_metadata, } + def semantic_metadata_payload(self) -> dict[str, Any]: + payload = { + key: self.metadata[key] + for key in ("semantic_page_type", "analyze_strategy", "llm_policy") + if key in self.metadata + } + classification = self.metadata.get("page_classification") + if isinstance(classification, dict): + payload["page_classification"] = { + key: classification.get(key) + for key in ( + "primary_page_type", + "secondary_page_types", + "confidence", + "alternatives", + "legacy_page_type", + "unknown_pattern", + ) + if key in classification + } + evidence = classification.get("evidence") + if isinstance(evidence, list): + payload["page_classification"]["evidence"] = evidence[:8] + return payload + class Extractor(ABC): name = "base" diff --git a/ontology_platform/crawler_platform/app/core/extractor/hybrid.py b/ontology_platform/crawler_platform/app/core/extractor/hybrid.py index 17e03e0..26b5426 100644 --- a/ontology_platform/crawler_platform/app/core/extractor/hybrid.py +++ b/ontology_platform/crawler_platform/app/core/extractor/hybrid.py @@ -5,6 +5,7 @@ from dataclasses import replace from typing import Any from crawler_platform.app.config.loader import ProjectConfig +from crawler_platform.app.core.crawler.page_type_taxonomy import LLMPolicy from crawler_platform.app.core.extractor.ai_provider import LLMJsonExtractor, dedupe_entities from crawler_platform.app.core.extractor.base import ( ExtractedClaim, @@ -17,9 +18,40 @@ from crawler_platform.app.core.extractor.rule_based import GenericRuleBasedExtra from crawler_platform.app.domains.perfume.extractor import PerfumeRuleBasedExtractor -LLM_PAGE_TYPES = {"ProductPage", "BrandStoryPage", "ReviewPage"} -SKIP_LLM_PAGE_TYPES = {"CategoryPage", "SearchPage", "ListingPage"} -RULE_ONLY_PAGE_TYPES = {"BoardPage", "CommunityPage", "UnknownPage"} +LLM_PAGE_TYPES = { + "ProductPage", + "ProductDetailPage", + "BrandStoryPage", + "AboutPage", + "ContactPage", + "ReviewPage", + "NoticePage", + "PublicNoticePage", + "PromotionPage", + "CampaignLandingPage", + "ArticlePage", + "BlogPostPage", + "DocumentationPage", + "APIReferencePage", + "DatasetPage", + "ResearchPaperPage", + "JobPostingPage", + "CourseDetailPage", + "LocalBusinessPage", + "RealEstateListingPage", + "ProfilePage", +} +SKIP_LLM_PAGE_TYPES = {"CategoryPage", "CategoryListingPage", "SearchPage", "SearchResultsPage", "ListingPage"} +RULE_ONLY_PAGE_TYPES = { + "BoardPage", + "ForumBoardPage", + "ForumThreadPage", + "CommunityPage", + "FAQPage", + "QAPage", + "VideoPage", + "UnknownPage", +} MIN_CLEAN_TEXT_CHARS_FOR_LLM = 300 MAX_CLEAN_TEXT_CHARS_FOR_LLM = 60000 @@ -331,6 +363,22 @@ def llm_skip_reason( return None page_type = str(context.page_type or "UnknownPage") clean_length = len(context.clean_text or page_text or "") + policy = llm_policy_from_context(context) + if policy: + if policy == LLMPolicy.SKIP.value: + return "LLM policy Skip prevents LLM extraction" + if policy == LLMPolicy.NO_LLM.value: + return "LLM policy NoLLM prevents LLM extraction" + if policy == LLMPolicy.RULE_ONLY.value: + return "LLM policy RuleOnly routes page to rule-only extraction" + if policy == LLMPolicy.LLM_FOR_AMBIGUITY_ONLY.value and not classification_is_ambiguous(context): + return "LLM policy LLMForAmbiguityOnly requires ambiguous classification evidence" + if policy in {LLMPolicy.LLM_FULL.value, LLMPolicy.LLM_LIGHT.value, LLMPolicy.LLM_FOR_AMBIGUITY_ONLY.value}: + if clean_length < MIN_CLEAN_TEXT_CHARS_FOR_LLM: + return f"clean text is too short for LLM extraction: {clean_length} chars" + if clean_length > MAX_CLEAN_TEXT_CHARS_FOR_LLM: + return f"clean text is too long for LLM extraction: {clean_length} chars" + return None if page_type in SKIP_LLM_PAGE_TYPES: return f"page type {page_type} is configured to skip LLM extraction" if page_type in RULE_ONLY_PAGE_TYPES: @@ -344,6 +392,34 @@ def llm_skip_reason( return None +def llm_policy_from_context(context: ExtractionPageContext) -> str | None: + raw_policy = context.metadata.get("llm_policy") + if not raw_policy: + classification = context.metadata.get("page_classification") + if isinstance(classification, dict): + raw_policy = classification.get("llm_policy") + policy = str(raw_policy or "").strip() + return policy or None + + +def classification_is_ambiguous(context: ExtractionPageContext) -> bool: + classification = context.metadata.get("page_classification") + if not isinstance(classification, dict): + return False + confidence = float(classification.get("confidence") or 0.0) + if 0.0 < confidence < 0.55: + return True + alternatives = classification.get("alternatives") or [] + if not isinstance(alternatives, list) or len(alternatives) < 2: + return False + try: + top_score = float(alternatives[0][1]) + next_score = float(alternatives[1][1]) + except (TypeError, ValueError, IndexError): + return False + return abs(top_score - next_score) < 0.08 + + def merge_bundles( rule_bundle: ExtractionBundle, llm_bundle: ExtractionBundle, diff --git a/ontology_platform/crawler_platform/app/core/extractor/strategy.py b/ontology_platform/crawler_platform/app/core/extractor/strategy.py new file mode 100644 index 0000000..4413131 --- /dev/null +++ b/ontology_platform/crawler_platform/app/core/extractor/strategy.py @@ -0,0 +1,190 @@ +from __future__ import annotations + +from collections import Counter +from typing import Any + +from crawler_platform.app.config.loader import ProjectConfig +from crawler_platform.app.core.crawler.page_analysis_policy import decide_analyze_strategy, decide_llm_policy +from crawler_platform.app.core.crawler.page_type_taxonomy import AnalyzeStrategy, LLMPolicy +from crawler_platform.app.core.extractor.base import ExtractionBundle, ExtractionPageContext, Extractor + + +def extract_with_strategy( + extractor: Extractor, + context: ExtractionPageContext, + project_config: ProjectConfig, +) -> ExtractionBundle: + strategy = analysis_strategy_from_context(context) + policy = llm_policy_from_context(context) + if strategy == AnalyzeStrategy.SKIP_PROTECTED.value: + return strategy_only_bundle(context, strategy, policy, "protected page") + if strategy == AnalyzeStrategy.SKIP_NOISE.value: + return strategy_only_bundle(context, strategy, policy, "noise page") + if strategy == AnalyzeStrategy.ANALYZE_METADATA_ONLY.value: + return metadata_only_bundle(context, strategy, policy) + if strategy == AnalyzeStrategy.ANALYZE_DISCOVERY_ONLY.value: + return discovery_only_bundle(context, strategy, policy) + if strategy == AnalyzeStrategy.ANALYZE_RELATIONS_ONLY.value: + return rule_or_structure_bundle(extractor, context, project_config, strategy, policy) + if strategy == AnalyzeStrategy.ANALYZE_ENTITY_ONLY.value: + bundle = extractor.extract_from_context(context, project_config) + bundle.claims = [] + bundle.raw_output = { + **bundle.raw_output, + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "entity_only", + } + return bundle + bundle = extractor.extract_from_context(context, project_config) + bundle.raw_output = { + **bundle.raw_output, + **strategy_payload(context, strategy, policy), + } + return bundle + + +def analysis_strategy_from_context(context: ExtractionPageContext) -> str: + raw_strategy = context.metadata.get("analyze_strategy") + if raw_strategy: + return str(raw_strategy) + classification = context.metadata.get("page_classification") + if isinstance(classification, dict) and classification.get("analyze_strategy"): + return str(classification["analyze_strategy"]) + return decide_analyze_strategy(context.page_type) + + +def llm_policy_from_context(context: ExtractionPageContext) -> str: + raw_policy = context.metadata.get("llm_policy") + if raw_policy: + return str(raw_policy) + classification = context.metadata.get("page_classification") + if isinstance(classification, dict) and classification.get("llm_policy"): + return str(classification["llm_policy"]) + return decide_llm_policy(context.page_type) + + +def rule_or_structure_bundle( + extractor: Extractor, + context: ExtractionPageContext, + project_config: ProjectConfig, + strategy: str, + policy: str, +) -> ExtractionBundle: + if policy == LLMPolicy.LLM_FOR_AMBIGUITY_ONLY.value and classification_is_ambiguous(context): + bundle = extractor.extract_from_context(context, project_config) + bundle.raw_output = { + **bundle.raw_output, + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "ambiguity_limited", + } + return bundle + rule_extractor = getattr(extractor, "rule_extractor", None) + if rule_extractor is not None: + bundle = rule_extractor.extract_from_context(context, project_config) + bundle.extractor_name = f"{bundle.extractor_name}_strategy_routed" + bundle.raw_output = { + **bundle.raw_output, + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "rule_only", + "llm_skipped": True, + "llm_skip_reason": f"analyze strategy {strategy} uses rule/structure extraction only", + } + return bundle + if getattr(extractor, "provider", "") == "ai": + return discovery_only_bundle(context, strategy, policy) + bundle = extractor.extract_from_context(context, project_config) + bundle.raw_output = { + **bundle.raw_output, + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "rule_or_structure", + "llm_skipped": policy in {LLMPolicy.RULE_ONLY.value, LLMPolicy.NO_LLM.value, LLMPolicy.SKIP.value}, + } + return bundle + + +def classification_is_ambiguous(context: ExtractionPageContext) -> bool: + classification = context.metadata.get("page_classification") + if not isinstance(classification, dict): + return False + confidence = float(classification.get("confidence") or 0.0) + if 0.0 < confidence < 0.55: + return True + alternatives = classification.get("alternatives") or [] + if not isinstance(alternatives, list) or len(alternatives) < 2: + return False + try: + top_score = float(alternatives[0][1]) + next_score = float(alternatives[1][1]) + except (TypeError, ValueError, IndexError): + return False + return abs(top_score - next_score) < 0.08 + + +def metadata_only_bundle(context: ExtractionPageContext, strategy: str, policy: str) -> ExtractionBundle: + return ExtractionBundle( + extractor_name="metadata_only_extractor", + provider="strategy", + raw_output={ + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "metadata_only", + "llm_skipped": True, + "llm_skip_reason": f"analyze strategy {strategy} does not require LLM extraction", + }, + ) + + +def discovery_only_bundle(context: ExtractionPageContext, strategy: str, policy: str) -> ExtractionBundle: + return ExtractionBundle( + extractor_name="discovery_only_extractor", + provider="strategy", + raw_output={ + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "discovery_only", + "llm_skipped": True, + "llm_skip_reason": f"analyze strategy {strategy} uses discovery/structure signals only", + }, + ) + + +def strategy_only_bundle(context: ExtractionPageContext, strategy: str, policy: str, reason: str) -> ExtractionBundle: + return ExtractionBundle( + extractor_name="strategy_skipped_extractor", + provider="strategy", + raw_output={ + **strategy_payload(context, strategy, policy), + "effective_extraction_mode": "skipped", + "llm_skipped": True, + "llm_skip_reason": reason, + "skip_reason": reason, + }, + ) + + +def strategy_payload(context: ExtractionPageContext, strategy: str, policy: str) -> dict[str, Any]: + return { + "analyze_strategy": strategy, + "llm_policy": policy, + "page_type": context.page_type, + "semantic_page_type": context.metadata.get("semantic_page_type"), + "strategy_summary": structure_summary(context), + } + + +def structure_summary(context: ExtractionPageContext) -> dict[str, Any]: + zone_types = Counter(str(zone.get("zone_type") or "unknown") for zone in context.source_zones) + classification = context.metadata.get("page_classification") if isinstance(context.metadata, dict) else None + return { + "title": context.title, + "url": context.final_url or context.url, + "clean_text_length": len(context.clean_text or ""), + "raw_text_length": len(context.raw_text or ""), + "source_zone_count": len(context.source_zones or []), + "source_zone_types": dict(zone_types), + "classification": { + "primary_page_type": classification.get("primary_page_type"), + "confidence": classification.get("confidence"), + "alternatives": classification.get("alternatives", [])[:5], + } + if isinstance(classification, dict) + else {}, + } diff --git a/ontology_platform/crawler_platform/app/core/ontology/domain_discovery.py b/ontology_platform/crawler_platform/app/core/ontology/domain_discovery.py index dfd96a8..dd078e3 100644 --- a/ontology_platform/crawler_platform/app/core/ontology/domain_discovery.py +++ b/ontology_platform/crawler_platform/app/core/ontology/domain_discovery.py @@ -538,12 +538,31 @@ def relation_hint(label: str) -> tuple[str, str] | None: def entity_type_from_page_type(page_type: str) -> str | None: mapping = { "ProductPage": "Product", + "ProductDetailPage": "Product", "CategoryPage": "Category", + "CategoryListingPage": "Category", + "SearchPage": "Category", + "SearchResultsPage": "Category", "BrandStoryPage": "Brand", + "AboutPage": "Organization", + "ContactPage": "Organization", "NoticePage": "Notice", + "PublicNoticePage": "Notice", "PromotionPage": "Promotion", + "CampaignLandingPage": "Promotion", "ReviewPage": "Review", "BoardPage": "Article", + "ForumBoardPage": "Article", + "ForumThreadPage": "Article", + "ArticlePage": "Article", + "NewsArticlePage": "Article", + "BlogPostPage": "Article", + "FAQPage": "Article", + "QAPage": "Article", + "DocumentationPage": "Article", + "APIReferencePage": "Article", + "JobPostingPage": "JobPosting", + "PricingPage": "Product", } return mapping.get(page_type) diff --git a/ontology_platform/crawler_platform/app/core/ontology/relation_schema.py b/ontology_platform/crawler_platform/app/core/ontology/relation_schema.py index ee492d4..6483e88 100644 --- a/ontology_platform/crawler_platform/app/core/ontology/relation_schema.py +++ b/ontology_platform/crawler_platform/app/core/ontology/relation_schema.py @@ -3,6 +3,8 @@ from __future__ import annotations from dataclasses import dataclass, field from typing import Any +from crawler_platform.app.core.crawler.page_type_taxonomy import normalize_page_type + @dataclass(frozen=True, slots=True) class RelationRule: @@ -97,13 +99,21 @@ def relation_schema_compatible( return f"{predicate} expects a typed entity object" if object_type and rule.object_types and object_type not in rule.object_types: return f"object type {object_type} is not allowed for {predicate}" - if page_type and rule.page_types and page_type not in rule.page_types: + if page_type and rule.page_types and not page_type_matches_rule(page_type, rule.page_types): return f"predicate {predicate} is not allowed for page type {page_type}" if source_zone and rule.source_zones and source_zone not in rule.source_zones: return f"source zone {source_zone} is not allowed for {predicate}" return None +def page_type_matches_rule(page_type: str, allowed_page_types: set[str]) -> bool: + if page_type in allowed_page_types: + return True + normalized_page_type = normalize_page_type(page_type) + normalized_allowed = {normalize_page_type(allowed_page_type) for allowed_page_type in allowed_page_types} + return normalized_page_type in normalized_allowed + + def confidence_breakdown( *, llm_confidence: float, diff --git a/ontology_platform/crawler_platform/app/core/research/graph_research_loop.py b/ontology_platform/crawler_platform/app/core/research/graph_research_loop.py index 10ac097..e42297e 100644 --- a/ontology_platform/crawler_platform/app/core/research/graph_research_loop.py +++ b/ontology_platform/crawler_platform/app/core/research/graph_research_loop.py @@ -7,11 +7,17 @@ from urllib.parse import urldefrag, urlparse from crawler_platform.app.config.loader import ProjectConfig from crawler_platform.app.core.crawler.discovery import discover_links from crawler_platform.app.core.crawler.fetchers import RobotsPolicy, make_fetcher -from crawler_platform.app.core.crawler.page_classifier import classify_page, should_analyze_page +from crawler_platform.app.core.crawler.page_classifier import ( + classification_metadata, + classify_page_semantic, + get_legacy_page_type, + should_analyze_page, +) from crawler_platform.app.core.crawler.plugins import ParserRegistry, default_parser_registry from crawler_platform.app.core.database import models from crawler_platform.app.core.database.repository import KnowledgeRepository from crawler_platform.app.core.extractor.base import ExtractionPageContext, Extractor +from crawler_platform.app.core.extractor.strategy import extract_with_strategy from crawler_platform.app.core.extractor.validation import attach_page_context from crawler_platform.app.core.research.entity_expansion import EntityExpansionPlanner from crawler_platform.app.core.research.exploration_queue import ExplorationItem, ExplorationQueue @@ -206,13 +212,17 @@ class GraphResearchLoop: fetch_result = fetcher.fetch(url) parser_result = parser.parse(fetch_result.analysis_html, fetch_result.final_url or url) - page_type = classify_page( + page_classification = classify_page_semantic( fetch_result.final_url or url, parser_result.title or fetch_result.title, parser_result.raw_text or parser_result.text, fetch_result.analysis_html, parser_result.source_zones or [], + final_url=fetch_result.final_url, + status_code=fetch_result.status_code, + content_type=fetch_result.headers.get("content-type"), ) + page_type = get_legacy_page_type(page_classification) relevance = self.relevance.score_url( project_id=source.project_id, url=fetch_result.final_url or url, @@ -225,11 +235,17 @@ class GraphResearchLoop: ) metadata = { **parser_result.metadata, + **classification_metadata( + page_classification, + title=parser_result.title or fetch_result.title, + text=parser_result.raw_text or parser_result.text, + html=fetch_result.analysis_html, + source_zones=parser_result.source_zones or [], + ), "research_item": item.to_dict(), "research_relevance": asdict(relevance), "final_url": fetch_result.final_url, "crawl_status": fetch_result.crawl_status, - "page_type": page_type, "robots_status": robots_decision.status, "robots_reason": robots_decision.reason, "raw_text_length": len(parser_result.raw_text or ""), @@ -289,7 +305,7 @@ class GraphResearchLoop: fetch_result.crawl_status == "success" and parser_result.extraction_status != "failed" and relevance.score >= min_relevance - and should_analyze_page(page_type, analyze_page_types) + and should_analyze_page(page_classification, analyze_page_types) ): context = ExtractionPageContext( url=url, @@ -306,7 +322,7 @@ class GraphResearchLoop: warnings=[*fetch_result.warnings, *(parser_result.extraction_warnings or [])], metadata=metadata, ) - bundle = self.extractor.extract_from_context(context, project_config) + bundle = extract_with_strategy(self.extractor, context, project_config) bundle = attach_page_context(bundle, context) claims = self.repository.save_extraction_bundle(source.project_id, source, page, bundle, project_config) analyzed = True diff --git a/ontology_platform/crawler_platform/app/core/research/relevance_engine.py b/ontology_platform/crawler_platform/app/core/research/relevance_engine.py index d45ad60..30fb684 100644 --- a/ontology_platform/crawler_platform/app/core/research/relevance_engine.py +++ b/ontology_platform/crawler_platform/app/core/research/relevance_engine.py @@ -8,20 +8,46 @@ from urllib.parse import unquote, urlparse from sqlalchemy import select from sqlalchemy.orm import Session -from crawler_platform.app.core.crawler.page_classifier import classify_page +from crawler_platform.app.core.crawler.page_classifier import classify_page_semantic, get_legacy_page_type from crawler_platform.app.core.database import models HIGH_VALUE_PAGE_TYPES = { "ProductPage": 0.95, + "ProductDetailPage": 0.95, "BrandStoryPage": 0.88, + "AboutPage": 0.82, + "ContactPage": 0.72, "ReviewPage": 0.82, "NoticePage": 0.45, + "PublicNoticePage": 0.45, + "ArticlePage": 0.55, + "NewsArticlePage": 0.55, + "BlogPostPage": 0.52, + "FAQPage": 0.48, + "QAPage": 0.48, + "DocumentationPage": 0.5, + "APIReferencePage": 0.5, + "WikiPage": 0.48, + "DatasetPage": 0.52, + "ResearchPaperPage": 0.6, + "JobPostingPage": 0.46, + "CourseDetailPage": 0.5, + "VideoPage": 0.36, + "LocalBusinessPage": 0.44, + "RealEstateListingPage": 0.44, + "ProfilePage": 0.36, + "PricingPage": 0.62, "EventPage": 0.5, "PromotionPage": 0.38, + "CampaignLandingPage": 0.38, "CategoryPage": 0.34, + "CategoryListingPage": 0.34, "SearchPage": 0.22, + "SearchResultsPage": 0.22, "BoardPage": 0.18, + "ForumBoardPage": 0.18, + "ForumThreadPage": 0.24, "UnknownPage": 0.25, } @@ -96,8 +122,12 @@ class RelevanceEngine: normalized = url.strip().rstrip("/") parsed = urlparse(normalized) combined = unquote(f"{normalized} {label} {text[:3000]}").lower() - page_type = classify_page(normalized, label, text, html=html) - page_type_score = HIGH_VALUE_PAGE_TYPES.get(page_type, 0.25) + page_classification = classify_page_semantic(normalized, label, text, html=html) + page_type = page_classification.primary_page_type + page_type_score = HIGH_VALUE_PAGE_TYPES.get( + page_type, + HIGH_VALUE_PAGE_TYPES.get(get_legacy_page_type(page_classification), 0.25), + ) graph_terms = self.graph_terms(project_id) tokens = tokenize(combined) overlap_count = len(tokens & graph_terms) diff --git a/ontology_platform/data/crawler_platform.db b/ontology_platform/data/crawler_platform.db index 5e445ee5825a25cba02ed4614c4819650df8feb4..eb4fa8a8e27736fe56f54b309f6021447e5b41fb 100644 GIT binary patch delta 211580 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
{c%Zf!D4u_^ed~p2{tF+)$sgx^1GoZhPQfXO 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 delta 59857 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

d3TchmT?T%`!HE2!}4qdOZ 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%0A~)GRf|k%VSaG4Ksn(k-U? zZKb;U9)(E668aB}(3&I__czu|Horw5o-N!=KyCTMa{dc!kEtmRyCHD|zAAW{zlB02 zbAa?1R{{9-J*JU8ziKPxzRx*>qxsz(+9HWkAIX(>%Oh=mJVQh?Jf`;zDEF#<7d^$ z^mXT!Hpc)xg%NEMV{k=$MZm@b*Sya$jv~lJj53cMxx0`&TUkGHU4H$RV;=4Ox}>LL z?zPoGydshZ3EIt{dXBoye{rsNoSK&CksbM2Y}G>Rn0=es^vU$;%a^Ud0cxfru~DHc zuA31LG3zf#X;9=zBUakGgpmwXxt zL(Z+S-30S1UNhqoHW=K6+;irE2pCXwDM6igl?xJ*?zh^bn{o;nZ&GbEnlPl zu4T4P1J~>r$oCNZO)w$NknV6E-nM}=Gdd3y^t*S986nheHV!?1I;Va6i@c8lt>m#Who%*5v=VZmG8Xr_dwMilh%g>AJtngs%+iub8x1saygKgMxKe1 z)dmNy!SnX2YBWBG>D?rx$_(A@C5t%GRchap^L!S z_abpSLmJ%V6Z9P-4|qeA_c;Vt|LUk0H3>v2DC+%;l!hotGQ!l-YEbuXeU%DxUQW8W z6r>%!JcQ|ZmnT&7wcLP}`qzsmeG$V5nbGG83Fp4#yN(rTsy4GmHwd##2Bjd!Ya4~* zs+vxDv_Y%(tEy%H`%|J@4$kxg3@Y`9^)NzI<&q@S3wqDAt&*JK1KCNG_Oe&@EXKLt zwA9Ps=FP@cn|s$a5II*0MP*}PT&bX%6FqakMKCCI<}^FfM7n-Sg>IDhM1Y~YH|LXc zy^0Sj5Rqz$Eg0_XiGA{fC&9I>BNMxCc_}v2_5sa4rMcv8f6A=HA*1EaK<9{H-dp;z z4o;2^!XPvH%v=N7n-7D3skA;S2S+QJZEzXiTJ1=4D4ojFE5Q3-gHj2I5Q?X#X(QL$ zZv;sle&3)vSS=++HUao_wSA}VD-PCo6>R!4mcrtsQ?li(WQaGhCy7-rGM67Y zMBDK%dY;m=M*(`ic7S})?$Y#AyD%i!qh{@|2;1_5nPR(L6}P2OHn&y*!bM7|A+;vP z><;^_c$gF!4^gKZDs}pj#;WnI{bilEO-#CD@F)Y>o-$bY-YW`gMgy7<5kiQzryEJQ zVA<;I_Aq!+{i3gLMIFc7tWAor)SGEAFc1QnTZXTh_h6hSgHId@+#85?-1toQ zvvJ>y8q{E9-9S(uzpXZ%$&GvCun3vEOd0SMklWnyvV=xX_1U;xsgt#dD2?EfebB2lBeI|Ly zj4ryy0W>qJI>B@`x5<0b!x2l&{t`1H5sQo`!UIy zP>5VEK3NzZ>3>tcsPsZQ6tu=m04k#nmuVP=sd1OFR34DFn(^+DNqeOujNQw)VOP#A zeYu)e@;P878g?TPgHS?k;c*B13eUEE2?Tahyt>rIXzp#020TmU6Ja$3StM-M33t3_ zzlq0Ufv|dZRFHES*jCakZvwUf<%8ngU}BBI~MxEaP?SLaxZ;t`9r_DwI))3maU{Kr#)@%?jWSJ_?e)#>!iVFU}c( zIWm9-AlL7H`uA^j#?#nUA|iH%z?!KvsU0=@Rwi=r_Cf^OmTmST>Z(h9USsi*z~o0= zHHQ_5?@us8h`(SB2Co3Px7+mmD|=w@Tt|px$m{O`yHITYq^2HF7YK^ks#$Cy>+GG- z)ERm6|6cA$@OHhD=a2IC7G8Ua2OE`ky^#c~CNveo4$`kk(gLr4^Bg!nlT$7KcUyzw zE>m7oBCmf=J%Hl60rII!b%yjsepd%JgEK?4P%;vRZ(l634 z<^Lo}XdUUyu6=I>(dW=gkzl?xLbEvj1F^6XYjNY(L@Nv}2Ce{*55$a-tm2D>Wa4Ew z&K3(!%g%iNf1E@4W~6sTrGin`Z5gof2=;|}>~~*m-T4(@v=LEvoB9SgPFJ_V`O6pt`?``2>tKR2n_kt!jf@uazVO1x?v%-vgm6}kCmBN`Xs(jo!3?D!1h3z)>LL%!uw^=E`W#888U zFb?@eV`bkPkiN)o7y8)!6`r!6rtOk+%g2By?sWZ?}MrO(mK4dREN}c%RzpkDk z!qqbz2)=&r5JV=}jOYcc=KvUwyGqW1lRV6bGie{(aPN*YCM_&JjEGmDp zo@BoL!x!cWvV{RlMhF7Ek$0?lv=x9PzwVpJ#_M-HiqrKN1e%vw-Ii>11a_K!B}8HF zrgs-#zY8HUAfEi@b_{>cnG8C_ z6(E|q$X<-tO4Ma#qYxGGmRiGd4cC!QTMj)JG&TD9)t3wltvf*)+??=-&2-+HaMyXC zA?X+4Dt&A@I^NYJU!6MwSKaP|?1ni@BNvN2iMgF;y4j`yqLhJ?$1M`tX?FkQs#tpE zxz=n9ceNImmX0(y9%aVq0&dE5cZg{Tfpz!x?a_KGNd4jz?Ojq9PXH{ggLkXD;|m&V zBxI``dgv-4AY8vu(a)-Ea&7UsH{~%Z;gw&(C0H2CFZrqcn zRgOGSh3PeL-~FySjrD||Zu-Qrik&_qa0fO5Z>&8LA!b!Q{aVhYOpvj_6e;~d^ASZS zTu_M$4U)ng%s3_Olar)9Noz~Uy2OhD=Kp2j*B6>$y_6i_JdZnELYnW0ojGK>{&0@i z@ZY6TL@qPr?p=W|T@f_jFCvu=Tuz?Ma##O-MF1#_fodk0*AqQ`pw@RoGbN>A6qMN! zbx`eVEx8qPcJ-L_-MMW6E9K_%uQyIQYLJ?f+*1~tO*Xvgav)|y01jbj*cSByo_|B8 zS?*EqVE|lYQ(IKBJKOxx?L9_t)iO%LaeVU|6w4mx(UDTT%BD+#TD|SGgZ=J_Ti?@D z6QFz-&;`_c9{?gwiKdAuUjroL#Whpc*%y%(UiQGWmnI6BcermD4FD~j393*DR1)8R z?J46RjNvC%zak65LG$jpa}i9V(Cpfw+JKef)UqyVUygE`fSzdy)m1B)?;5f|9@mOB*8UY0AiWg90j9K?6g$BxD8RapbZ$TMD4DV^_Ggxx%mg^w_H0R znaLfoxKy&_OnF$=HMkxqCxJMUz%UqVGT02KFV?(p{r%m!V`n?n(ZlWrHL5}3n+PCw z0<(t{a3M0u^MD|qg`V$To@(}__w&rkAk?%4lp{7ew!fcZy}~_U9YzUaD;r_-@wBDOlra|(>k zsqS?w+BriwlkshT)pSJG{{fX92r7i-0Qj58B4M=ye)zAICBnfnKvbEHhW#cEo|yl) zwkQm|Tev5KH45;w0wvM}ZIz2Pwi+wNo-ZgSoQm&(&OtImI~IiG^43Qkb&Sd^Y>Eg_ zodCo-B&249r3dA9W&U%9voHSDGYxPR5;&{|%O086!pHWc<~LEcB@iKcnLrKD2-{-* z2!_%dp|r(sA5ySEEYaR;rM{)SS~tR_usi92vsssmFJEb^=bJn9ILF*-zHzj_))flg z*xt8=O?1x`b1K*hA)a3Z7Y(>xw}--gaMK?EQrLy9k($0BuVU9-ls20sx(~KR`Sp81 zwc|ZcBDv~-{xO@I@aV^SOFWdy0J3iqVCiu>5lISayz7BUt>REOX*WQ^S3l%%h8nt$56ZH zSvbgK8)YT#)!`$}r(h$Q1&-=T_HD4j0EdEfoEZbyK@V7Y4jpe`Pop{5b_{*n*sBhL zH&@H@8uWE4E733&s*aZXVbL zbL*DYZK)*>rl#&f^bkqp<6+8UXmi7D3AiX5PYM`QjdMT6_;cK{V4bL}FFJYGo!ogS z!x&tjx?Q>!H~S`RAV2Q59nE`{<%pFza^#31P6obuL9lTe56W$`_Tkvdp^u+1w+v8# z)ZrT0R*2HJ;oB9c?nWly1^{0&G$R**&^?Sl)C{Ij6<=?$Y%SxS-CjM~#iQttk}k71b3zrS*O77=G;8pQ4BMOKV@aKx3aEaYCcRLG0|I3oL~~3@$}jKbZY|P(yk%S@}labHyzt ze9#Gl)Hwo+h9L8}%%7{o%~Mb#^~5#b`Pnwp#{gOe1ROxXDm)F$|}z zxN3HBd+&nSb)|-1Ts(G|)5@{~qRWZ^oh;|iF?h8NsP$KJET$Iuln^HoTZd*_SmXc! z2R@(j2t4hN2NpK!JXLUDQ`A8#cSC8F4&9WV^e%ZojW=*7-F%q%OCoFrWfa;V7$CX& z4p!-6NiR^6tF(f{al^!}K-^R>w7HlAjtqS1NmMAZz+PF1ITu}siB-D!Ll;~OU=uq< z;!ou4qACDg3b>=aNl;PTwCDI}OBSQ&J+YVRBdXp775QG~ee}1T;856AA*IJ|COh6L zx&v6Ar|M-GoKZsBSY-q(bkkF_55Og6?==?+tP25#n+cg!Y;X!(MM``RhD~vLg1n1T zdlK{y#B?mn(8E^&1M+0zMVR8=>T~{Oo7>k`wDy2S3W&YIV-Q21@gR2#w}z`Xk$-+$ zucdA0QNOvD$wEKI0A*^@vCyz44o5aZO1y22@Sw!BenrBy4~ZjRsR0scX=#+lb2p$A zu$j3S29M6dagP2#GkyS7Ak(B+W&H|5a}sN)Za27efmcv!OUKyC*s~A)!_|~YNb&Zf zm=JdeUJVZj%&gps)FHpPlQgx2`mKUnhh$Es!c<7c(xfx_5I78LIEpX2TSt21Z=XJC#K%%j!70lN z^{paC)x9g(POQA~1~nk?_LpJcWJH8@1Nis&`@aAeKN^w^y$S)iAWB?Brq#e9 ze_vDlU!hSS9}o8yd9C;U1-32Z^>=(0nHQv(z{O`efihLo z_5lKxG|1jZ5}*cKiTQ6%PsYpW)_Rd((|8LA3tqzc%9MDhi^8JzPx;fkAw>SPZyJo! z#Ojbybg9B{{9o;Cg|6Z^LsG>>{Nxd|DEOX2CwH#|D8vq_70QD(aQC*q; zUmk@p6C+i?9sOu_*QLCHH8B0E{6IAU#xcmlgpv39tJtTL=Mcm26?MD8t-N6Meg6W&-#}gqONRWMliB(OQR>Hk6Q%yLP44Zz1(@|X@*%PH z9aLP?30PkJgpnB>(zYv7>{trcnSN&$lAQc6 z2q^&Ge2l0=Pu@gk7Lqo}%YcY(;?}g=KB#OUOKireL-03Yu_TygeenRGss@+kVGb@- zRjyuGdIrE#mv6!j-3zmwAnX=?dZ9CTu;pF0I-F|`vPit4)Kko=hrWW7_JAq^yfyAE z#|S%ve=s=zE(}geMYy!AhFkWJ;t-4yKlxiX4#1M{32d5R9po3*7I!Z}i-z@UtKk|J ztkpV=pf7mv{&+K3J!6qeADw&iuhRQ>Lx}YLZ>wkHSK;bev2G0@8VEdnS^+}Hz_h)!@{F`Gc&7pW$+h~o2DG@e(y9m zYK8H329PJ?3f_|%O5GCge0E?M9G+)5)*qv$)xt1nA)qCnBDQ_h!ddr!yRac6UdloIfXN(qp1Kit5TO2z*r$M6vo2l0R`e}- z*Aa>cKFHp*uNB!v<8SV8p((g`e^xv=$f&x<+|Y-noM z&7N;Kg{zw!q@C^rBxs1%-`wK&3;6O&QtYDs3W$Voh*-;zfTx@6bA05fz?1(^$()7j z$#51IAlMnyxZ>n2;B3)rEZ>7q*~)1069a@#3D&QT%?f2w9sBf$(WNkoWavV|z?;re zIx93U96{m^{FiDq(Af5#N;57fqm<&VND^6}QeREb8=Wgcvq>o(kah6mk63oUYXH+j zA23%NVA|1{{hGcf;>Z zr+6$aN)_0;sq$iLKGV_-!VpG~Hdi#@BoN}R1aTcyL4}fGh<^y2W7AQ}=P#$iQAc*} z-0A%pZ1vvKy}=3`?2F53ANu8v7Qb;7T5m1j%c?|dCwS)=)4g_d6ZxYx@!;{K9xowN zU<8?g%!)rf2)EV9#}g{cHrO%LhkmUOIM9Csuxav7IpP-+2(UgPbGf;3s#;P`AJ$5U={znP55SX zqtM7N;8$2=MGn3O!A&WNeG)Wmve<7I=JG*j;k#Aw1^|?*2_#qnGD}Lb>hgPC{_t-e z{lRzn{^U+6uz&qYTM?;OTb{Mo_(9dyBRm$dU+zq&)sd1zF$Wb)isneZNX2{lo{;=- zx)cbgkiR49rR~^wFa9ia695L~)nk(Tz-4?bP%?mH4xZitx|)!Hrxyantj0w^aL-qU zB(ib{P%*6U+(-wt(At+~AEC5{U;4`^^kLhI;APGp0B?wR3f)1(LKg&9cR6XGQ2*kC z4&8JS9JwkJ!O@d3q)PZq0|@;)%U_AAEzN7LTm&v!VIf^oVwOqXY^PTfXwYz+*&E1EMIYB7g-W;uA*N*#vhL$l!qw4KBun;5$uG+XkN< z3YUO&HTas4CU&#dvDxx;XGNRZ(WZFiu?CY75+HIw5iISqSHVg8nFtHQ!3RN2bGmcov&hq(J>;=mxt?r*yLgr-z31Z!^B>!# zB-@cjimlp0$HxKB$hbyE96tdnLqHiY-|v0%73gUf$OieJr%MZ&akV9MsuZu1e zOKRDx$4D)-@;h93I<`Da7WqSkempS1dM4avqw~RW>W?Pp-|USYF%Egi;CA!P?l7H4FF611ivqsTfkX%1b-=5BFVH9zaR|$g;mk~U&Izdk>cIbf6|%4$NvtIn-~B@ zPB@4-m@tKg0e+hh&|G0@8LKaY?tR4jN7LIHq#>COubB=wIsoC=CVK!3_L-J=*G0QR z5y2QNGeJ}OwOlj{+xZZ&O9Lum^_}Ve*qLcy0FWmpUn3s;(RDzv;4$%#%d~g`r!-y+ z$r{z=0-PSR0Ft${ow+5E2YVs6%lOmx_Rne_vI+@b|1Vk2pWxN>kG~d4rh9<{CEN9= zoV!=PEoj^WyU^Z@5ui&p+-N8rKx2giQE2Lb9RF{J7uIWKic|;%=1Us8^R+@Ehu%QV zFxquXmJrrJJj|xs6QOy0FiJjoCyct@V+$n{z6$_gYTm4P@buxVZwXkS) z@i;^T$CI)FBYYuD|%U{qjt=KSbO!0*%wZV&!umC!h! zvod7;?x(!a&xFwb#>^lYgh#K|T>pPANI#f1hf9J`70Fs&%OJXVLLt#Q@Vf&zf-Chf zKSJb_OevQ4tO7Ft0GN8gR;}buiaxPHi9E{IuBaCZ04{(ZK=lubDyn%~`K!N$9646b z@`DY^3_+}-pd7W>xX^CuYLFYC#+QzPPGG_2Mda5SWEfmrC4ME<>>0SdK0vG;qz~S1 zmn&{}mWqO1`wIrQvM}R{@+i8z*tBJ$^<@MTDBXzSHr>EBN5vBspUA_GitilTpzc*O z8VeS6=MvVOMWVKyp+IdNxE7)Qw+gg@;XfC^q!`K-?8t62rNxbx5B7Ni8~2J_Z?q3pqis zy~I(wakRB{QC!s3nWkN#ZX?qGEFPNY_7~E_v%OExS${2GGcrBe3`OT~g6h3or*Xkj zUtKP7`Gzwu_4mAZuHKPbbIs_PSa|SK(WgE&I+xDvKDj$$d)kv^i;UAYk<2{D=0k!= zP@8?LJ)F`}uk1{s;LY$9R|?COLRD!~Lpxid7=&z+ugBJ@srC^?%QJL!=CCXoTiVv0 z@U3C~Zg(Y%148|WjanoHGZpLMU{k{II6O<|asxfN@Mv~<`$PjuADT1{zqLMx5&IRR z%Xg?PS{}h1Nj;3qr86#UQIa=Ew|GHd+4)Q4w-N=cZI8o3>TdG z$iwdxo$mfdN;sBt`vt*m>}8^~cbRYbH_g%(<Tng`P@`++TrMe#l9EtXygefxY3k)0h<6$}L+y61 zxDWvrs`(}bHwXR0QPRpLB`%(M#-qVgVfAeqn7wb#Fp}QT9zG*=^|(iuGGI-5a{N~a zevW@CG(JeKHFD1QVfS?Gpc#1teaAY_=S<8MW$#XN-PujEBjOQEMo&p=w(IrLjIV^?Umd8?dAaDz9YqXj@fPbKq*hK!B8wEG;IRG(E1UqtkrjYc=`} z?YG%O9$AY;+Z8&^W-Fpi3Exkol`J{&M8*EXxpNN-Km-2jYlMdFBJ)GYSbr#7u8uPe zvU1v*JoOII86T4x2;JOJO>WGTv_7Tq+JXAHu{0*R^o@O3_0JR?F8igbRB&F5bk{hp zkP<~~2$NJzqRkBYpAcKW_u63tY$V!gBebKOy)o4%IQIBFxnO^#M6qy&FGuX$08KS| zIQ4rYv~r?Ip!PH!039CND&Zwf1IiVn)oTi&C)1H-_qViU%z96K_#B{EDPX?SzfmQi ztvxo@Ry;e_0@pc&$2pj7`p_2t!ap`m|HFLF;9h4Rqc)RRWKNwH`ZD@;Pknt*WpMlG z!+C6$;I(&D>o$65_Y6*zX?lmh8Fq+Tvh&kt&+xSWwdP4feM3X>uQLX&- z)V)4rZAxOB?cyZbt{|mlPALvF|0Eh!;7DtpL3|UQc>+YDdGQy>(`8JE98Q<@G3mY%Jlx^cYM$vkz7b`2$$5^7MIVu4*p zbZo4e&$rAN$1#-|UU-ruSg}8svC>fZIiJGH zEm>Lhw(M~&pCN^->y_E$rAcJ&Pkg>gvvpI^r*r$mmOG`)o}sF-E+>GE!@LC2-(Ln+uk1VFU_GX>A+SNDeOYce_3fn$K+{77-H4fcw46lqvFdA;?k>~ zGA*ipCzyFi#cUU8*sb3m~% z7530mxPC8R5Dh-G`u=?_v`7feQ*dy#eE9pgtMHYAryt|8r zF&*Aw3zVxotHJX@O6i~=NsaYA56Y@!8P;KYr}pHApw*k1jl&->{9`n#0WOpLvMkGG z?ouA*T*k~p4FfF68G?Kxl#ZMMy?H-t7r`woBqJzf~!_(dJ%MXrVR4|5*fbB+G1%?;PUjPaQo&Kn`+*|*t%DydNs ztDoMEZ)?`rN|p&!gm~bIhVW{aoOov5U^c^j3U|gVFv69walUmdzmUA?m`fLvhT}g0 zPDJnafI^20u>OuZD>&dr&RAjEvT57$*96c00T<|m_-{gx75wb#fx^JXiAN!dCbBam zceKjSti;Chy`6bp(-Eb)bF~oL&Pp83#*l8zM!PEd#)G{A`U0C-fo#yK`tL4ga}`BF zAzV;?!F@mI`Kk4Biz%MCpQ?1}%VU1B;npCX=D6OLHc7k5Ua_J2#Q}poO5~leh1m&_ z7flf`6fa`kbAXNW=xi0ZIyjKa279v$BNZ?cn1nz2BQfCGK21|~OD5?T-AM#Hf5wD> zT*NYa;V(01_d`_|O(~^F(09qnEj{svb89znorwIQCz{kfSUP(!YTK>zHGro2oi>nf zh1C+OhMh$7ineE@QXVe+u&uAdVaa`wrPHQ)wgL5dl-9)9MDOt8VBv;*k4con_+sHiafv5mG<_gj##k&2X-PjBlxUHJj z=VA)^#Wj$fO}$1YAT!fYz)?T)K{~d9kLIb_8c#E?Ep4;I zj(FNDC@aAC7ZUr@q+=3i92po&KiHn=qH<~7?3J=XpvsA#>%hKXy?f5tCW>O73^(J+ z(iYpcMkzY>POLFE1gC4hePiE}l{m~~7yTKL4HDR0*`|dk*C4ogqx|kuZ_mG+*QIiI zU0`pUeOo@-rrw{oE=)PS>eJGRgc}!nTeGTC;}}+FJv1R)$a0>nl9MtnWPTE;BpZ?H zc^)%Vy;Q+`O=fWmD~;1SreHZm5IG_C<2LD#il`n||F9g~V5BA?2Gin+dRKuXF4H)i z>_h1+us7ypzz!SBZJxueUS^0l!=6gTq9g>afeMX@rZL&>l*=%jG9Nf2?byaYsp9Rh zpR!dH;*;% zQq9&DUxQ>l;uJUDiFwON`s@&yd;Q1ixQVLC%lYY8O83-g&9wwf@}1tw`1_~Gf_GiH z>f-z6)qSYdSp88(^|QL@!?k^5zjz88ZU&7bRGS?I0|Ns{JA%Gsx?9T)U<(L1Pmb8O z#&wL2TGyF)5zHj6!pXxmJbkf^)?LgXb4w*#@-Aihi&nlbhuts*Y{OJX!Ek9rnC6i@}z=E9tLWbSschL%;DOZb{kHNAr zN44YD955;=YrJGN(0A<5;Mr;F9?U!THz_1;y;<5%u24L;Gk~tTv+%X;?=VXOR1WR2Mzh@y6O}s=Mn*)+gy-JDU6nvkE7e;i4C+RS=NJU+Zh2#dKx zC4}3z7wvZ9zh2A|OgFpdPLUqe78=%)u_kj}ed~1`LExv%=*&uq><|_d$0uba0|r5XYf*2bHClA zb(ytt=4+)7K_X_&g?uGdr=GvBz}8nkPyOyR`uv8Zk)L1{LRBz1jQjLP8627L`~vH# zY_qARkosaUD%eh2S#Mix_qBSdv=7Ru$Yo?&M%03?-uljr*0^+{2zFlCpm6l8Q z?CSLWNjBC?^}lrMd}Q_fwr9I=()J1MIj+0Z#TCq$;S#Cy-yJ{x1fJeL%!fTbRO?<- zFUd|`zd`-6{4lgl9?Yu5KZyUHhn+NdEFA9)IPoJvt)e131gj)7y_8+IdvtKfo`+wRN@ z3~gkd3MYLhSP6!2e7O0QnRVsu+1c9(IOW}!e{9-suT6iwn5pHnY4_cb%7N_IN;3Ab z$7o||s<)Esx%4#Dq#thr3{gxZWsvD5Olx+$zmS$b^Jx8nSVGVa$F73X!d232o5PZs zmk8GiHR#Gi?{-Bj8h5_fEUC)hIRGtWua1`YeHGk|63>~EN_qtMgp*(pwbzh8RWW*` zC4EA2prGg4vb+;Kl?3lUWZIB=^u?bDUgh`em9)zNw`v6GpPUKpSL~unH-;h^Qo6BZXMRW4jV}+U*6qUh^w0)tA~UWgny{w__dHiH zBzkwOfTjWR7^Xn_W!A-BL17Kg(}r5_q3w+XQzwzEa>sk;`eUBsV6)T-->N?KxK+s% zcPnH_gJzsnT_3mGnW``kI~tyVvgSP3J>*%rTTW65_V)-k(jtGHao${d%>lJc-yUdm zFy8&ad@#KQcI&a`512I&_>YfZPM6sCL~kYdOf?NIZOvS3!AxnWE?O(xN)9|jXSlbnv9(nsETJ7&DJkX3NoE2DdrGc>WS}72PUC?^6k6xmyoDs ztUP$#ZUOoz`TgBydPw9qFQoc$P*~smy*(hSew=Lk5uZyvvj)tod>eQ@Zmext3M$m% zNDeY-oQ^?WcCde!g|AlrZLGr8Ic&0zZkt?!=Nm0(DS&19aCxGNTH6^v$XNR3&{EXA z^|&zLm$kLA>{o~7a-Ld{4V9_Tt??e88?)-w)tB85F^*G)MMd*`CoG1tlrcld>h`UH zx#Z`ua9UR*J_m4Ty*QaGv%`k2c3gza*-Sy*?NV15L;wwa`>kSI`v%F5r#llu1tn9B zR%bhdTGM8m8*=YoJ@$d!xR}hb-T&RhGhE$k^(JWRm~0A|QK}R{u4%%nVSm!M$Cy$# zQ?Xy0Qv}m948lZ7mifk@wL$UT0~5K%@p+a#C9o9(_11ybIcwX>?=UN!z?VY=c2+0b zv=nuMWdga5rZ5HAQ2?RRrdhtc7+tH5qnj!j zW|X)m6ExmFVs+nbmSm}IQTCo1^i7TR=q6xFk=g@p8)ofIe$-r+^Fd{lvgaIY+ ztR4Y^6woC=@LrmfAENpan^dP;HMP+kBdKthhcXR2?a9$CgSTMywOy@}9admPxYqGtakBfsa%vss z{cwZ8vK7y$TDmyr;2Df|l=svvoI*&n>n|rO1Fz8x&vqe^We^g&UtGu-VL}W@3p39r znnb?c)irQ;4qk|?k9jIo0BH(ar1^R1zqNdp>9WoR7KHbue-Zb${YBgtTcDS!<+#bi z5j__=O2AKl%TbXa@PD!Q-ce0`UAt(kpeUfIs0hT0ihzoU^rAFTumLJfLWZ!R0&fO?Y8b^2i@ng-YlvgM!fdK^)a>=X6K9#2=IFf-s*0LTKsY zc?MvYJe(cdg26T*mVfsjmMQAHofySE#**vIyUWO_E)C@Y^DcHCDTS6qzlWAW(^jDT zFqrlAMT;J;31HrRQHIx{V*U7cN@zV48qymPE|Nz+0_b4V6X^93QgsZN{s0J}u$c(` zQ?Xi9HUT;>h*!_3hP5E|%!nAc^hQJPhfuJrZkO}<8S-5ka>ebk*G`@S7M;S0lxTk_ z@!ahL0q%!Ck6;VQJOVTwMTDB=;e8BPKKgK`%c}n^ zy!Ku%ygqaOZ{hXff3o@hezQ8gW;0r%?d^-eNXTdX^sM}2e+#d@|5 zA#Eg%p=~5Qkv0;RNE?auv&7N}#ljUN_0fh7QHTjVrXzY1$b|jkCy=V>iY(boE_k+ZL`z{-fT}BC@YNFP zn$MwaB-|2K>d`h5nd@yND$q6(en=aM3Mm|z>D`_%I9Qc?@0l=)Hj)G|sz|Y#wD{Nj zlhD@dC8Gft4@+t`7&B~-2n!*7nwQz5mMh6FuOwtXJKPP z#*kHa%@3%6Gs}pwg$6P;W@~Z1n=pR02+=S9I1C{2@mPOj@UL|{({JO-t^En7!h&0D<6w5jxuIi;I!+NDgeuv`ntVG;Qx z>tprv=TGSIwQBq$RkiB+@`H*|?5;@-eH^)WI z57ziwLgW-T_1ZT`oc#gg7w-knvYr??`K43K%KQRWE7!$fTsbM)x)KU{FPgSz8_y39 z4x0He?ftA(a4YNRK|7Ep8H?my**9}pyoZ=NC_D2gT(P908`-$8IUtn=ZXyIKr#vdp{qo#^#Fnm z(?F+GtHbrPnn&d zf}||reP>*3IJm?N_o$~JK*IK&S)L*rIR{>)IhET>9B!=LG3Wm+$Yi(A8To z6*DY|OC@>E)H!N9@$vOFNO;r-8to~_Hlr-H5fAO23V;2&Y4#oegs^FMYsv!0SqF_U z^T}?5={27ayMF_&R!Zsq1y?KWFF?lEh*H58$ZVwq8A-xSDv=0`!y$H8Da%2NtP?7$ zYgFH&UY)e@-j0dz39C!jc_;A_JKJYX1s*g7!ia0M@ii zX7USPbb9XF+mx1qIeoe3l=wuOBN#vWOx(Ex%mVFmszIFcu9ewXxyh1S^wSx@Xo z6!-Gf*WhSt1%$GRiJ;_G(2+z5R37vkw=*7!?;^Pq{p?roXGLXFR;fN^)LU+g|P%>beH6eS;~o=Mm*j z%K6D?9UzY=xz2s8(!E5ET_U-jJ^k8uFR%Kf2h}9%X?KW{l2QnBa&xIct@@R&#^{w> zpp$H~+A>2}JR6o)*N+wK_;WTug1lA~!B<~{>&Vqa?#JDt#2nV_ZI)8V2FBRPM=EFJ zpDLUpPA}DIi{Mt|eOqf=cR|=u!M*|9og2UQoYKk%D6xvmwIYtCd$zUxqi<_QNoKIT%*8o>od5ut%NV+cTLS7aMhWA;?KIVC8?q#jHT+v@A@~9( zxJ2)xqM~R&uI{ZB(4=Xc>LRl#sHeSV3cn5O{@`*0#a&{)3WwxUCc5(Kf1nTG>-PohkbO{7xzUY5EOAvxMv}F{P<7^k50|ZkHQ?5z+4=u(OzQ!urb$nRa{YSeHOQVZ{_Q;cviQ9t zxUHUOwBilT4%{^;d^&~Vozp$!DY&@v!mh@psyHe9WQ1lSVByf>sy;H$MPjAsw+79y zqDo(|c=qj^K>u9I&i&oF+DSlE5zx(iLJ8yq2LfCR4q&oGlO^qz8x0@3&dB-iDVWcl zi1QV*pLSUrZuzK`JCczPet zfhBygZAzH)&i2xQ4DGFd`7JG+OUdd(S6@(wO*n=Z4UwqG*mv@rhB_6fYv>6*B3 zy59J!qC#<6ZK}xM9o@A1i%tU$2n7&Lq5PqSOKFw0CBzrmQjjAZpz|IT%T`Ilxy6K* zx&u^bUX)PIriw34VX$)^oW7_*jH0>xe0|)hWT9QoOw7EiRH9lfNc^b+NCe=8d+X^P zFH-APtVqJK_6d!d$Yk8PTU8HdTAc_FBocL(;GK`M1zNZO?Nj%&N6WP>qz1D06|@U>!M(uJ+rAZ{ zl^d> zLE_Z6!v&HYU_0++K5Q+ta0=mq9Tp85_G13%n)XD9 zn=bQ|KX-ran5V+oHFdAxbq5mDHLUZ?*tNRH>r{kw%uXZ5(;clgpve_{H2@imFDWT| zProfnncu0Q?H1yQ{OT}@y3i_xb(y)vZ7SLc_y`e`>CaN?7R1~V(}MHP>b-G#RMDzK zt%KcJD&UCcDWQ5P~I**@HouOz^LN4XfeM|A1o2Jw)mQG0VQ- z>~lNM`Eygaj3(Kb6mqwBVpqXJP!%-N!@5-ng{+a>o66>77 z@dBN2LhWtB;!C?23Byw4&QMenIWtDK0*&n)T8&*m%**8H6l@?BPM042=}gg-vLTvn zdGG`|^&&l>$C3~Sp-24yvj6p=z<||tB;JTpx_b3Aa33Kz;|MGr_B_#fplAvABwn~F zzUY#X6hjYFlZW5z4naVk>dQd-hv4Hb#Bh)hDgosHK^2qP@69Z4Pifc0D_o1D)xNl? zuizqXzBXExnEjwD-?$lEeC~;xaJy@0mCGP5B<=@D(JV}@yj5cH{O~i=P+-;7?-bx& zSRCqMxhyvF-~w=GSMv2EBFIrmUV87FfY34CLryzmS6Xu0x65KISW|$Sq3S#?ViFAF zwr%~)e(?NYm;Zfyx&28*Xwo&~XO=*bg+?9rsS5B|-YCz!`ZBOw(t+W}#zN1qNxmiF z#PT9)4Sb^$J#T;DlVUWm0Lkw`dnI9|vcc3EN#~oc)Qqm27K*&m1xUa>AhE^u6b5mL zxqp2(4SqFhc^au4*E}}-gLz=5lkF=gv^xRo}^`L;viR6*b|{; zMNJUI-e+#*D~6tS=4#EJ4K)+^q?=(Etj)lg@4k=cuncfcvmvi~Z_)*tSuMHDHi~mW zRKv=T?k-Z3x6`g>mk2p(K6gce{K1+?VDXAr zHr6hHb52$zO$Twqnprh$ShbxFZR@>gQD%`$I=I$b-Nzj;);2MQg(8$vYNok_6WJBy zJlu<`fN9VWp7#`Zm%u8)wcTDF$Ucx<1S}bAC=3I$GFSFOmHQuIsYtV7T_HdYKqx;b zF+VX0Il)%_IzzTzCu-%jtzVoLJ2^yq<~x=%=v?x_;t&9eShE+;E;+*xjyaL}K#;7a z1Fa(@qmy^-%bz@A+?2#=wdyabxHe*7qE~Xg=8R_Te7aWF2607wI}dN z=cnIg3|CYe!i)Z_DW_}W_4HS1Z<5xQXV?U$#*IyWr;25@wn7@QTg_J|W9J#I{2OgW z7Tb1TeI}p-1_Z6xUKz}3Bl_jCq-pY&OQKQTqpMeIayUtK$2eaps;HDM{U|yS$PwX` z))<)A9jPa}KXW{&RVKY~oxL+}cC|K)w`;ZET1BkD5i-rEwF?KM9GOVP%f_8sOh@*)y6R{u7S~tfcmyyHCTngq#bvH$LRM)RH3jeY0$}v=1E*F zmNfbm%o4|=DwW{)JQ_)+*EOqxs&nL%I~lpa>;;02RUdkJx&cf3(^C zml%l|T37x|vloR(+P;^QOX3U!D!z7R_hWwddr(tA%kEKM?D4p&SEP=S`WCSj1ASsy z>NSu-Vio|=^o1{WX`66vlQ9Ud$LhW4_d~GQS|&n%15SlpODy(g$Pphys%QoTW=LH@ z`8mYPg=G5`-PIh8Lb=kr2>b?NY~{W9X3VR?-P{Xz{Nm+CvhjxKVbu+aGGY0IcU?1nxH zcc2P&u+NL~7VsCRFQ#8?fM)O!Qpmdpf9sBP_Y zHdp^G1;{d+3QI6<3K-Bk-N`wxk1JnchUj86MIy#w*^gbon`KrWb6QxebpT{MiL+`#F;D8)SIqZA=;kBlrT< z=fL8?2-cWnh<5;ZqHSwrbGKxHMf$SYVz&4*GhK(R`&$I+ZfyI9>Z>~koX`#;=l(kx=kSGD$&OGR4 zYlI-uO;UK!)j6*G4nRrkhkB!i0Sr_T-LL;a~kKheGDp=ro@_X z*BZVT550pJLukBNpp>GwTI|TALCYK_oJ)#-ds_RmRl;^)S{QYI={4rzb~lQ?FXHHz zx<`P^@jDb{o!RdBC-^>ti{z6VDmviRVuv?-gEJpf{lh9m&i~O2TMg{BXIAk2#XuxY zgRLrpSk#^t)|(>o^ICFiXJ9^VROCTm=txlnJ^F~AqSo+a$rg7 z0UghllY}FMK7I+|9+zW(!VZg6AQc)>R=8a4g<_z-fuRFo+o%9>dq;EGLh1XnD=k_4 z{_*A_3*fq_1G{-HLxHqG#2pK7>=4?})-nyEg)3c`pS#)sPZt1reZb2hU`O`nmE82p zMEa%9zHUKPzuX{+LZxgf&`StK@#T=201h<>5DuOqUN2dT&}6_1TWJW~cO^b)T!KO< z2YR_Gl*-^o$;V-5k0W`M9q6@cIKZQT@WK#=maC3C&#h;92DQI|ak^UPpTX6!R@{;o zuj7{uAvW}yHU;*r6d{W9Q5#T|4@~<3Q>+UH0SeP%r-BsR-8zKwu0h2M{1KMMiqo8Z zTE-gTMNrjahXJ5>v73=O&gPpHsUQeD5Nwt>#UN^fK1dgV&?822ot%jy)Gav|tmIPS zDC`KbV;**aW z6I-2HL)~#U?e_T+7Woo#*{2=O7md6B#P6%R!XjYN^O?d+%`+o%i9{{bli9U@pR=U{ z6(5kSX(@XJfhnkSIgozdNiRjPhV#cD)DCeDbGHLEKuxmtJmV9avMdfJb5lD8G(OuHANrIeKQYQi++`eAiO|7 zd)F5eQt)t$ZuWHlW|{ecplffK6V(Bb7_Qh_lWBO&$ohbEC%*HzQ!3D0~9|?^#?a zrI*4TbVz8r%22w`z>QbuK*o^!ll-<5SCCxOX@j;v!bGVb9}O z(ZPc^R1A0;(M8M_&H);fe46QXP+Q>seO5ucF;Q*20eEMNKWBsyFb$&r`^Aq|8aTy( zVj1o@_^x1Xs5W4KXI_`JgcKKb<>lTK2$5{8{Po3%-K9w3r>!!)hOi=Ykga5+6w?|i zl!$3sIfV~>tPnoEzArCO%}o)%LV{NbK&MHK=&c#obgj{~Y`4q|?9zzA`<}%=+iY=zrB7O;+qzhI@Qvz+rJz?|C zY%pH%d^u2v*Qm{5(kA)^{QpO!z2F7O9ygx$_ znWf_}PD@=7AA5B%gmWL%i$g0S-=qSkIwkfxh&c$JEt{6098dA0{KnZtbqbz+=YP*^ zuPYJgz~0)^nvlofKC|=(KaesIXnb%muKH^xQpUs^9VukIJo}~1ItEA;7;kT6_F%rJ z^xfox%Ea$b0Mhlvt>=jvnP0uQJwnLDecAHIHyIL4DgMqhaQDKr9PA{6(!h82g~m%P zw+&x$3DPLs?h(TDJftiRyq$QRr;rLTnbs|VrI8e6GYPrvt$zA-)z8AU)Px|MAKbLz zFl;>zz^DCJu;~^n(@u^Svvw?f4j&gJ?gCXfD@#@|&Cltf9a7F)17|?2$00`qZvNz1 zREx`7VkoG_(&+JcHW^c1KG@;9r>kecTLIg~X*#`_0;b zrjQ6piR$DQoZ&5ZXo!l^KQdPAQN~K}GSW@J0y*()1NR?btW+YxewR?nkB3w?Sra;~+>Br8j&%X{3^Ni~ z_rE130%fIP1eh($h+=`_j+cxZJeEh;m@v|^ik-!_&Z)po|HdygnlD-(elJ7)qAo^y zO~DIME$e>=p`u6rJDRWw?JPIug>aJ$6p_XvoWsKtjG?=M*@G>Y(!M1IoSG5juC_(( zdI|b`cRN}?Z$-YljNI8t#&aLzq5leZc&Z&gFoYEMAP?>N24M-kL`aCwkZ0cg8le-i z#lo+=kybK_4;}(h@%a^C4xkjK8`6wSAYF#t11H2F*TU%8R2!GaO@+rb1R~5%Otps3 z92wc%;p1@^^^M?P|7DyT0@-0(n*0rL4v7~Rr6{ch7~ z(Er4oY)4lU{At}#d3Xv;$gPVOuD2vaezi_;!|wTd>maIhh~0tyNH4^ZhB7P}w;|iY zfB5DVJGB$*-xU9s(?3RUpLRgt+GBwCYVR?!Jf(2cUj=3J@%t!>WmIM z^6$G2y2;wwpJ)FhB4kBiD5C^RM&l#zMI7N4{*J*(qpzIXr(b>n@cpmf=*_z;)t3Hx zfyb~%S7<^tm>o8uV;9iPYy-;{!E2iZ!xoEgK&Ki^@Kf}@^iHwWaaH=jCAPdmKzwYx zfoDftKJu?dbTIoBQ)@P7DOe&`J%XB>io1v2ZF?NlkKDiadM8Q?KeZF@C0;VYbD&&u z=w-X-{rR%Vn_9@DN}*SBJhJ1Tr(WMR3Qi3E^9Ty=W4@|}KbXFS{3w_O{ZWxZ_=8gP zEWzyP0lIAX1MwT^H#E@$2X36$Ke7jT&PQky$3FtHWt)$K^dqL74;f-?@iEUWuZxif zvPS=3%iHtg5#;ZRstB2W&(nLVn}HDqqgH%~$#2)btui+T%C0+#AT5N~?dz7{^D?wh zOPqBj5n@nDW11#tPw44<4$nOU0 zL!@yLX7C7d(cp7_*a|*mh6ST(-#-?zGK!bJ!!;k+BeMb9@->DL255qI90mwW|Nb4z z_(VMa=c`Q^=}YJrY~F5@RYdRMJhBgac&dhDKOocT1u}P}%i^!GR(m54!6=Aaa1U$E z=4b2EL=PD#kIjkj1zTh&KcF(B(noHdU>xK@hVlj$y+ZFPw$1(MDNgQ3Mvm3~?Y51x zs>o0t<44X}vBkhsS{5CcZK&XA- ze}PsDV+yW?W2N_n5lNu6Z#cF1zA3Ur;wd6i8t z>nI)(Bv&|Hsn~@)YVc0EuhwiZJXn}md$UGpc9Y?4S32{E4l7f_+A&HaNje8-?vOWx zEQK9iJ!B)j*iAhxzGj09({bf#ikWTw1Eddz%=f-x7Nz6AIXWM?eqvKtOt}|#zc(mk z<8j+XyJ0=O2znWI6fbn-A8^70;_gyTJTYc~6Z zCKb|4JWqxrT+Zwg*DkweIWBZXCnK-(3M6p1+VTRVQ_zhpKzr!hozU^ zQ>vOk%l4ADHWL}|Y7MZApO{5ItTy4KelAu8 z?xzl2w-?W}HL+sd47u9z#YqWJB=|*2U_c&*JEd)_%#0P$Ug`jOF-_ryEUzK{k?0)z2ZzAyqglmLX}^dYzo1lf}>Ixx&OwT*I4Z zEO4A3?+Jsf>YUqhun9W3=*apR6#0mKR6Z^=!R0jG`s}h~;33c#T4)_1rP%&)lVLq{ zpW^W`!``H)Z~C~h##WiLhP2qoX_we46EB4l%B{vDvy|JtVY>9EH;crM`gnzOmKk!5 zxy%+MT@kw=R@`gIy->IqlT;N*Kf&l}WuT0oTc862`74-@_JD&AZ)@F!9V?Lwf=M>K zlqghG9OwgTa{KgH_5RA1@nwjLT}Ny zUH_~?l!HsBXt9HxZKQR&xpjki&n-aSirb01woBjrgiPj11a|wv0h8ISuy35nB7gNe zh~SXS+FFwde`$dnL>at6y$77E<)o zig?mg+8aFO6o+ub@{^}3u{ouiq(;SNycR}+jP2Tk-FiF^Q5@_(=2ylk>FK%g>x-M*+ z%ZB+hp%0jDrfh-BfuqOHB3tnzq;&g6FyeIlmQ*9Z%vA`C`9+(Xw`;WqYf7XpE5~a? z8y+bB9oLIa4=5?yTc9B@beS*za`upt@jK^Z-cQO|w zSr_@@rr9>jKvv%Q=#LWNhg!pVhtxBEm*i=`(cR>I1Gx=WR5ZLI?iy=(LIxxXk@yZiiyqWQ_Pr>ylIv9q-jWSm zF-zH#@Mkp6nH~DLlPrHwyGA@}ky!B)FqY+Oo3rxpP^;xw!-YIx*%H)|?&yHR&-GC1 zSWM6ACKtGG>C#ZRXfP`>4BN&!8-nD!!Ug0bBET7}_C60lPVg570e?41R0 zd@xJqw-kVa!M~7SZMhmj>^6`PxTD2bfp;B`27#dlEF-@p=`A}K#Uj;rli$^FENF-# zc+oY>!>ojh79FcUK7<^Viau-7;AuM{tp52%x=yrLgGAiQ7Q<*n=g5UaK2$VG{veOA z#nKO6mZ7c**;4RoG1BPV`vUL3A{5qV{?a?&urrzmB(h8^xog$0am`l_YOFGkk(;PO zOKH2CH^@GONrjOUnjiBuH*?mj?QyzPA!6VO3k5MVm`We%(#|iI^Er9qd#*D8_3^WIm-T104(p|2 zVqr-;9X6aTGG89Hj!%e6t@ddWh8p)Xce@i)?P+?Qb@skN;TH^6J>`^vlyoccTCx|* zr{4bjqae0h2WmLgal2&IPqKk2bw+L%@k08E*$1)|UeT;7Mg^+em!AY1={V0*4R~oU zvPt7Mt$b~He%TXTR^Lnn?97N`A9uy!U!}^d{>;x%HM4xA^Q!M##J!!2U0U`8*ol-} zfo-%%bdef}BpEJD3dd94*vE7i-_v=;dLF_SfLu|pO3;qq`%=qbd@Z|vJ`R~)r@+C0oBMTlTG#&z~r zgK}@e*bQ4!O#n*@&^~Z9_g#I2g2h56H_hEj3|`nvG+0NA?U0_4BG-J2A#}gdWZ8_o zsC96=0~UAn^S!(pP>i;=hzoH|dDL!5A8$Rfp$~d{TARF9a1%Y;XhrwO*i+UTEg}rW~o$_F8}*6 zHZIKznUxiT`&<7>op;x%EW$JtH8?ValnLa{#UhutvP}&1$>&hOWYS8R`BRH z#E`q52Sl1oY7TwRQZ1aWQAZfWQm-%ka1|NqVUdhp>rt)MNaqJdC=ds|^jXP^S3n}g zt;frbTpPWbb6$Ln(021v-kPwI znaMZ3``0v*yMtM(;#nA_a5H9z655|vZ-PJo(}j7&+Mf6rR6k&bALw}gbiwcqSHZ{+ zU|!u+$hT^Zuy9{9nJ7E4b7HGVF2qgcs$@Sdoz~UKC@JgZD%~qxNjQf)4cv+wP5?N* z4*M&5e7RwHIDC1SazMCucDW(?K&srzG=qLk7%!z-!kuqRctNz-?P=Hes+$Te8Q_UG zzOf$W6Q$2}{kB+ExM^Ae;o?%gkQ+s+6`Ac-DzWeyKKEZQ&YPG^X5Bw%o zd>wVDZ3SW*DO=yeVxT zybd{2r}{#|m^}Z~-43jex0`P!@FegjMnR0eV^fO~QH3;jH%PI_H2fB4x@qXV%PKN{U%m9-g-J!UzKzz)iD(Rf5+Tj;@vnxj+F}@qnL^>F@sb6L~!j z_j)cf17mj}fA%)l=x-CSfHJJbO%~O1BQaX!;7wMu6F}XdBH;nVC#)ieAe@wl?vl$e z?<^h~I0sTTu#Z@EhXhz%!gV-DPIbmm{^{xkNp_KgS|`BaR%tEaC4}Qg3pBPebFAEp z*Mt>_SYT$JM@!vAuF2nGP5k%ct4s3o2z{G;cW`$V)Cy|monVl;k$ShWmtYIR7=X}V z6feOZiRt(0m;GwkuqKB%3uA@9eOps$1w^RQ4zxgYUbfX+ek&|8#J=lX|JShpipsRS5Rgou(a6caDW zLqd|}hg~HMI$g6=mL#x3vy0l89&IRveeP6lT8iGtV1Un($j z2wfU%9Vz?=%tQ^|x|4&`j5v$qZJNw%>u-l7Rg2>zbCI0Nn-sN-Lh$=#Sl3D)t;Aa- zad*VK4K@Y$=^qJzT}!)jJo`|Cp-S)Ltn!JSW8^{b6^b8q)GX+Ka-E@3bqevTlFkew z!BNFi)EXiI6fj%$8Ddyv=t%KZ0eUX_~zq7pExdJt;p* z)gu}Sj@7c`wFO_upQ-#e} z1t$+lj{76~bGA{4-ciXekjjfMH(-wrnO~_}={f_|Z4jE<=Etf9r|c8Zwj2u3PO5*; zDFRBFgAl||YVs*8zDSbA3KE6&yQ32yRr zIb=)#001H;*F-_4%AZ z?PifISg||a6l^k??t+a(zseoL=X`;r3#q!iR+6VqCD(6B8mVy^9_d=s0MRWe^4A7I zLxC4D9eDX1VO_`NZxNK?-^#BXNuk|NdsZMx0RB9RC+^w9zVCr5*+IW7_Bdy{k?pSy zt$7y2b7Ng&s^Ua}TVs1IRcePre*B~Cum2mB{xZ;s>@HBw!`+p7^8$7aK$0+R;t=58 zEg9Co8s5I;P9iu>hd#qyU%pt*p$Y&J+~<`}FafkKQf>MZSCBSfP6vf<;Qb)<(j?ts zx7C$+*y!tG=In3k|3+40VYYFYg09<)dmCuH*_Bx+kAs_Ds7a}9@ZapsA#651|3g>6 z2KK=xV1+b>1v7}l=BMt*D-y$|@uTBnh--Deny08&>!V9Yv72^(I7E(^_E4l?o-}s^ zm=5D;WLbhM5KGioa$q7U7ezcg@uUZTOrT0uT`k!f`apu^X^1w?V|n%DE;B~ehm_ENB0jZ8y-ihFV z8PPfUmNzV8Ev1m3tx?mi7K+l}t=ifzX2T|=PbhxeP%M|My5uw*WAr@?9G%d-aDU}j z@>ay9Xs#!1OWjNaky8`)azxtC`pA;mn#)DwOE8`7B^LUj{*)W?5j;h9Pg?#2N9_nL zh719KFDD1gcrX~OIAn`XE#m9M2!;433%YJQgWWBshDJ!^w?LPnP|DJ9VFnhnU#?W- zjM>0GGZy3D-^ju}gO20g!P>K_^o`07H(io-F zxe9ar$E%;G(hVK+XeKNWt!o~lVxi=4_FIF`wh{L{EoyUJfvy|%a>RV==gAePAck8O zGWNBLX7T~im+Z?(P&=XqQsPM@k)=A5^DfH}bAnXfZL*|SQ7JqfvlP5raw5- zZ>`FIKU>kf-cSdBy&5u+kgh^Rt}v6YqnX%bK{A{;zGy_EkxHn&JYWq@seP>|W4L4C zICoAXM-n=fTrL9S^_2r<#av+LGOP_=_4IVDg6}`8gr{7}4FHeqZ7qL;)GzkZ>TU;3 z&HwlUo{{ECRm97o+KW$a6zLcFM_iP&sbLX}1rpoIFd(r7utYEXoVffv=m51Np4)xZ z7HH{+m;^*~pVdycfiqf}dA&h&Du1$M=(Dp1?U5pRM90wt5PjG!GOeo`K+x?@%2&hH zn65mMqSA_U$*)}Y+`7t@x{1647ETh@gdP@qy76##gwSVOXY4@#&AAsnu(JG=lw zI^5xP_L&`jwwa!eVu_*7QtoW+-n?GQg63s;xlV8j*Hmy-UYF+EtzB`X74`U@?Aedp z#Ve-8^@igTjP|vEQ)XHRF7G2_kKv$KAhh{H)WkfB`S`ERiJ%naM+Lbm5&vrq2 zWO3;iJ}Y}5@X4Nva7c)hh(5TxFjJ#U2poI*M^_QKEh2(JV;_q_Vr)RSoUJokd~Ebh zq_D}|40VwBg-n1=eZ->FHJr#yPY@bbr@`hM7Dcz;rL*HY#c`=rjSPtGGDIV*L@xoP z(}I;7Xg)_b&n@2#Vs6^K9ny+u**=#4yR4(0OJ|{wV|z8>dBED4dGqLWlM;YHv#6(& zHJ0nHsPChTC#Y5JARvhwIsb|Q77v1W_e!|0Se4z5b6N=(y&;90n9&L%>Q>6)G#AMI z9@g@^W2x6)xZHgka$ce@^pOcD!WUWPw8uLPnQ(uzq*5=L*i>Nug^HYfsHB95FQr*c zBPTGfgbLcAxsZPu7i7oT*EF;A94y+kOCIr5)>YxK7x%EA@V5A|W54($=vBH2&bMuW zmUTS{#qDbXxjXJ*xl>Lcz}x_ehCvZY`n&u?Yn^OlsYdHgLKfibj>~$sojDRC@dJ^= zzsnD^p{IU!%&fOi;5*dOQw$>5U(8b2*uQ8uUj5IhHlv3 z&{Q!-gpVIM8@t~yt|$TMff@8haI|V;Ks{1rbr=g&jvxou)APq)G95-ItcN(NTQhg+ z41kISq3}Xyx4@4?5yKFy${PYG}93spMLnP3GzRv8oW)Q&bZ&~RJiAtYiN6=rOVtANYIm^SdkSmAe zJO)_<9{Gv+!R_e7?mW&d61uEZ7OuXPl#08BMXe_+f=WoJ+P z88zr*DTfT%mvw%K`%SI)(%$eoFdfMI!c^w~W}qj2%yZ1-@&+J*tT%fwL5A$CJ$l({ zCgkBgdgAiWlF&P^W2-qw0=jZ6*9TsZQIux%&#>$W3zj>$wRN!5`0zK!1LU&_nM zVbe+<^cR0wG5EbL{j%sUw#guqg;n2AQ|l8l;@Dlt!(;jt*Vx%lBM+}=gI;ubFU#Lk zY~PQJpY+3O!rxP%csf|aA#=-*$o%t|LC4EGFaNAF0XDF8NfOL=O|AEpzHpN_f{|B* z+5Q#A=_>LVvPfzJ_)v{|p5kRjUg2nCmWwLPo)5|@xhtHs;1`29*_Gw{@Q;cRMG!5+ zNVlVBfCK-Z734!+3iA2iO$!V;f(prD3LdOZ675syFMbFZl6svOrm{2zU^Yk>uPgBJ z9;^!uV*`P@zg!pSC%tu^FVnyH(|cqRSt9!*q{*Ah;FoW3i!RB!{5Z58u6i$W=N=U* z4EpCWAbJNT5ea%Q$KJnB@-o)Z=0pxXL@#nIzCF=vRuDD_jGabEPpOxSz1fIDy(nf7 z-%IE=>wI=;+l+@thf8Ok*rm9o%*uObA)w_zQgRe|jkn_kMv1SAlI|Ge4TQsDw4 z#*(u0{x!x5t>RD?`IASG>3wG7_e)0(ZU$N}2yU*^qE1MQE{|tjl-}sE-^ktM2QfNh zYVFf4bij9qd7O2NlPSPrD%2O8Emz}_hTHJ*O92U1R=Wd zfAhE!?|JrJ6J7l#^zXIgoih`?F7$Co{@KO{b^R8dt}8cKH}jDtRzu@RPcE*FCq!y& zkvZE}r$Oc`(EuU^49E0snf-!IG8n}xWAq3G&cm$qeP&v26Y+*D^gk~zKi6_-suC_; zp8von_F7-!BwX>K{1!da_?7Fi-{D82w`6U-rNtw2?D~8Lrte12u*?jQ(HVa}bv zzS_VPvO&6RfFj0<`*DUgJR&p?)U_L_lfi7b_l-|(_+D-Z(i*4D7g2VK8p4{sauExI ziv@DxN_~GU=EeL@$^(*dK7tt9lzSdrV8)Hd!7&u6XZ@CE)UM zOna5Ig&b}axE>9tWic)I)6b$K1_gmX5c9Evkx^g141TktG-;EiN%In4m;Lk$Q|b46 zj>!=;PV4YD-OaJpo|H!hzmAb{KIrvE4C5x^?6c)e0|l%2o7p!)T1Nc$ojz!6+Eu`} zZ{Y8JWPWS`v$mVq@of1{?9)ueqboR>2N&31oq(hxW}Tt;;lXLO_$wi@K3>?nS+>-` zx6zIBym_es7nYXsIY@m0W2k$o;3l~4vyeTq z>VJz0+FG}AGEpBH)vb3}e>@O7k`fGW`&{=Ln-U8Knk$JF zHaFldD$qvTAHIp25#x>o=m`2=*OD|FSgL2C&5XaU=hc_sN2b9~M6m(0<+qYr(53h_ zH^Dak_I%g*1YFOX)ux=BhN3*ZA}k}k_r#tsmP+$i@ZCY-zvS4D@$u||#U-YVfLjQ6 z#{EuP?5r^Q4_C&fXuIJ@RW3?bsbt;5$OLgS2h93puL-S_TJ^( zOn6JD8xodH^K?!+Z`!n*(89G>Ujl~73RUL(cEYSc2JAq^xW#L4crELCo!=U<@S@9Q z&mD&RDPnt$?N|1LysaFf*!gs`H;l!@IB{@5;F@UP`Jw$7>CSCI7U1rX|I>7zftHiH=L)deF9PslV zU6Y54-$gFI?G5wkL!kAkzRGfX9JbDNndEaPkz+Vj;3lJ+IBU{cqXZ^+)CK9&t%~Y; zcx*HRD-H~ai-fmVT}OjvK}Go-NK7K~%v={o^PQdqy*$SWRUF1pn16yLWU0a-JlW7v{t2hcx6xe| z;gaX?kUqFtofkw_#P;2CaO<=3(u^xfdd;^1+vPA8crSFy$*p&dIGs=F8qGLUr$S)}PpxsA{>?RlQ62hh2{ zSzM=lmb?FHPx2kcpSx>bKdM!6%hkQt&;FI|>+!d&H#?3hzmC6deEf({)91ZYl#4?3 zE%a9U@WsS~S%ebnUJ{;2UyQPjv2L&?@LAW7xZ(aAd+!<6RJW}S<701NK~brS6j4D$ zMLJegL=Xg|KY)Trl@1{Z76d^AL#v-i2q z_r2eFzxU_KFC{B;%{AAYW6p7pG44CXCUjz4Smfe*3*auD`+5n! zbmkfB8%Zk6!meV)y{xKV1Bs&Ve;1FQI_joAK83l%@+M~)@D<$iunZxiO5D+l`6OyU z&(LM=Pv*z9_dM9ee8uw@SGML(m=~?PcATHK|Mjks9{F*~sUtJ8r}E%wU_&=b>Rb6~ zpfHoQI@_7zL{#mjbZJCV$4QCA5EW9*i+wVx82hAh2*{Q1s%l4Sg-l9xm8 zC(G;)m-q#}7Tn^68z}=>7H*)7Go(#;(i14`c`tG3MdQQ3;V_L1lPs49Nz4ulO?EyT z_%ACXe;K5DoR3euK^$p9c2=&W*e&O4(E2=|=Vlq1!!*eyFJZq^Cj#p>GG}W%COe#0 zr>TGS>qwsRT=lX&r6OjiaWU)7s4PK}D?G|(zvC|_N~TI3nHB^f6exPAzjf#{Ikxm@1wJmdjgs)0o}-!YIvHw!qEQ5!Q{*29r;&pqk>Y9(i$t?MMSb zk2B-dxF~5eyozl0th@{tG&xtcnq?Cl172~ zhCjafr0kI+yjxz&SkMADUl<(J#T1Ghv8$d0(ad}Tx{_DrC>w!-Holk$>1(x&&Y zSY;YX&Azd$gR#K0oNEQbmnemI3$hv=r4w^oV-q}egZb|+eed<1v&)0J{VS;Dxjh~) z&K~P!S=H3A``To!J60{{h|XnwGRp}KCWFFbOV_D}IIZEdd7{eXYd+l1PC?FWarO7# zk<;AU&zD!cm=F-cdOl@T;!tIaP*d&Gwr)^&-wSj{erNdRBEfTsf&iHer!Qhb!aKdNpp!9N=ebe?ID>K zV$fur4brj8g(Hu7)HLs6n(_#Gj6C4Nne6TbwQzp<`%6FUiG0#!5+9j{kMXNtD$!vQ z;^I%`4bx0dTai0=idGktWL@g8RopA7Bcgeu{*8eSYvyjA&$w= zqD*UE>)uH^1|p$n4+_b;PVJ5_Ra^OG7E`8*tOm|HzXKQ%yNvv$p!RWi5Xfcs`4Fwg z<7qSS1latJ(ptF`=G7}#?xC4%-||^Zu=@!s&DDf1K0fJ{`A3>gS0cE@3!&$AnZ+Ix zGK5RCyprE>S5PzIH&Hkck%4e)l!dE#Q8uv48AP$=eWG7g#8Ukh>gO}3sAEcKHQ=DF zz56>S25WEA$Wob8pAdL(`>=`@RViN^=44q$Lwud#l=+*)0old=3Fdi7UTnq$;6ASU zj;e%RI*%uB;66Yj%gNlWeO5e2Zn-!2$^r<1_jj$jc6KOvPI1#tf|>_4vuvb2f6}wM zIiEXIb})nv`nmf^e)I8RPRspk`Q@E{_I~;^>40A(r(V!YtpvlIJ|amk@NMXZ5lNnW z1Vk`blhBTnngn6BC3-(TW@gbgUeWWD>G(UciZEuX3yl8DH}=yYUDZzGf%^P|i%wvE zDAV4OISa<~xi@6Y)9w|iID8-D_0fe*VJ4!qZa0r|Rd81k)qSv#F@?Mbs= z!}_C_>pF$;`{(>dUu=9Oy@$m9(Zht{LF25wsgJek#cFG#8dgo_!{)xFN;l3ZyqtKnpAj{W3CC&rWs7p4q`oLgg(*vg%9_e<}DEiEGR5F zpL2D&kR9=A6{p1R5Pz)+?4Pu68VSXCidh6fe52v#1t;7zh~fFA8Wuv~`V%j1e%X<{ zTp2X<5gF^iZGO}_%|?)*wD8ST zU{gBTd^)P$*~um#V2qQZJ* zv3lgK@e}>C-;|_;-2Yx0%i3veQy;f`+)sCCNEO4*k0CsdKjYIn%IsGho%$GYLG#Tq z{+Z=pE~WRH4%y;7e2dCq@@?*Ch5N-NR%7^&B$q5z>|H-Nc>evbB;k}7`{iZJ=BMPe z(J9*Wr`4@826<1(TjyHlaz``d;VO=#vgU34l!i+OkX_0e zc@eo{s+iw=m6a5$OCjQr;L`zb1h^qRi>S}86qyv>NXI*un?fC|j$(sFQBiGesOmJM z`#G+fb>{9u6s{a)m-;56Bj0VbF>HnBCzPd)x~fs4wCq)x%b8F-?o{%u z9p3_DY5s~+_dE0Whq$tx8G>nU-z{-|Gb`Wpr2=@6w--^3bMBcYrFrjM*Ucv?o=5pr z>=@X{BrGWw0#!Gxd67+<4%+)ExD&s}F1}D6%ne(KYg%{(c7N|t<2=|el-c#7VJdOc zd+L6^IU;DM);2s$w$qr~lFP!O_s8_+=vHm1BzO}pFk&a#KkKL6YkIVPD@a`BQ??t1 z3E@k>J9Y*&MeNpAon7J~jW-qDtb|c{Bc(qVo%mvE@mdsl|3FQq#FXuurij{V1<9_} z4^d`iC`{9pqJ3Ke6nh`Iu~ykjg$$mVq8fIMg zHmlrbdS>3a;oUdUL#b=cy)pCUYs*gI^-!plE}_SP)0k*j=`dkbu0=`jzed>G5KBW( z4*!ri1$n;rAObPjk=h4mpvz2-T0 zjH;^>G^uR|aKC2SV_CbMM(d(78@3ywX%BE)HoggSKbvN=X!&@h;2xflc{MqBkGc1B zc0B>=q>)u|OGJaZ!KXu8FXd7L} zzoIHH=Y#cZH!S#~$Cx4aiDTpynx~h(3I+<8`cO5IB-h?6=1m@>?Czu>ADF(!9ocfL zsj>q!XE|D$p7+nIq1<3ne!fnH%_->S(5_v(K!25YOTZat(n;T`!U5H40T1#(px^-~ z_R>(o#fi9ila#rWz)prIG7IyV+NP#I2mTmi)unrXa}JIBF)6y)V#8E=2VRCWGHnKV zDlbp1$SMDx2UglN()7q=vqu9r#W}c6SpGpXdE+$xc$HP8CD1?lm1{(0R{PCY)Rp6? zy|O-jn^3Vz?68|d*to*qVG!+pbId5MaiA?$-qEypaQX|7J_3*fU{TEh2owe9g{jd# zp;zyQgebkcKJI?^pkQ~QpxOWfAGL6&9aqv^O3#%mg2pnK>em%R z+Fm^JgM)K~u2lQwxw{wk>weOCe_x-6gu*V~QKB!0w|H1Jsx4z*zseiRKnaIj_w$`r zXpk-*>(!BL9sV2$rmytgEbhI|SeKIuoNgSjJ)z@o8y8;muu)(%weYspF9iFwR_y9K zpAj13a$TB)5iac#5BqPA)@K&KM-Ttp*p_yaN&Zo-6@ThbYc_%b|)epe1U>e2N6e>nwUBEb>U_21f0hD-LM=)cP{LBdtqH zAzC1#1uQd8J#TjW4Cj>(?JRNZN!ZoAtLmf=GIFiy#`zx?w-;)BEKD~`wJEd}-d@Nf zX*SW&Q3_M%P}wrfEa$T2X#&gmO*VhP`S+QZL)C`jj%I*pwW>2cc8N&_ZWw1$nHY4u zJ-x>u(?|(kB9X8UL%pCK@7=v#TV-DNuuR}HwHulV+?NlFQM?(I-{$!!8GaDbfMqWM zo8iu@qOd?g5tTlj+u-5=7W4|Bcf;UmYR$hy> zl#1QrY>?_Z z(}OPI1O15N>PjA^g~wjL7dM;$v%)SPp8lScw5>O_+TOX)(Tlno5W>zMg`rz1>!S`H z?Qw#!Tq}QwI?k@@7`XiU+8!bN{L=(tpO;r@`!EYz+YG#1H2xEZ3O54g#-;AE88#?^ zw+=RqP#tIu^1DYA-7$EW)u=D@=H$V18%dbD#UTx}XA72|#-uUB^eRHZi@M~g+BTe= zKS`_KdSK_(V=sx}U858XioQ+z&;idW+3mUlO0Ul^-rq>~D|SnI z?mV^htgvs^WyAS2*z0L5)bYw7Xu8j0dUsdvsIl+3qHG|}Z{h~{PFF+2wiepAe`3{c z%mg+TonTdsw#*)CpCR`uJG|6yIR|Zy!eIAAevUrrVO+?E3g}s$A9V(QU*3FjrD5!0 zE@pq>-|b!mHmyN>ci{HbrBIYo?*XG{GllzeaT9a88_aoqh#%Q(K4+l)nJ!uWIiY`a z&oP~MG|RT`K5x6Fu@7od$60bi0qHQjT;cl>TPeX7G<+g)xU6jPct3_d1O*%gj+$`) z?oddz>l&?WMm2=;%Zv3N+rdXCm^cSHh##KHIAh;6_`If3!EF@hhMDwQ!Q}isAPmP` zV5x~!V9=v1(7ClSe1S@F=n=b!MjTeQ3>~O}i8*6E+3pCJLA~L)OaIX04b&s|6{x*( zdfUbaw;Eq;cjcGE40c%KHy0uY^UV$wjrV-7B{4}GapwKB4A=~EVFkeqgHtZ7OsvXC zY@jfz01iV*lQDnZ)C&64iDo=t95H?=G*58Ty!>Wf)QrF$I9)QDz3q+-@JElt(>>pw zLAL`!15bvARzflzlz_VAO5nV4T+E*-pK&FkBD1`=7`FKQlB}xVMAB#PU#b(LmG+l0 z%Uz|R+V_?`seIfDMXnp17RJ9Gj4++At)52DF5j??Zz6|3J_=Qihq0{H^;`EIv%ou4 zT2J)DWUbt=7}`3=y=vwCl(1c$;LfMmRLu7nnzndB1 zyKosgxm4UJD0xbr>CuOFj8WK9H||$x;(Eo_dA~5oeql~ z(@W3SxqONBB=G!un-pB!H6lhjpl zlR!}K`S?+O-yufs8D)UDOzpilW6keZ#NaYtl}*1a(6PT zts!sd2siq)r*02-yxaYIhzVE+Ji$5jj`9{>Jq;a{+?h$5Nd|%Z;nhy#r+dID)2rrg zAS$Zlq`-;$u^MU=PVT+^N1(1PByY0)^XcD-q_!_YWrRksVvI}d!lM!)mtQJnR>i=i zzm6Y$G8EP|+J*p7Vg1x%`k+fKa7CSbbpz(f2GZNbNqLNd!!7cCM(hW68XYoYPx)~oma2yseXq0F9|BaVCdIgPVS5w_YA7fX?rzuLx zb8Vkyv8%<%41mJDUAuRKA~vJtm4yXnv0*Qtc`o>TE<{ZkRcC6HGA#0%vc!hSh6T-p zsGk)d#y{^yf`$HRcY<%$T%-5(Wh{545PAyPbhR5s#jaYPb;TyyR0ath7WstDLVAX< z|LUhAg5(cODxgZn6A_XAbw4o9uX)zc;=#?f3ty7P{A#|vR->}pfn;nW&;I3>Rtv)n z({e|X^S~;9zx@-&IC8hK#d6qRMX*(c3bAHKA8S0{r{LMWU}WE(QHN8*0x=xFkXhz% zv26nS$LG)W&PL#dATz$~?L>2k$#mxYgY97l)b4-%Ds$Nntd||30iocfJ)u+u^QGR( zK2I?|t?k&n)a&;4?(bT#i{ohf4SuTbV0#B>Vtnx?NmmBad{bzjO^Z)D<7ul^h6SNv z{bn~?VVArV%!?n*Fll!61sA0sHD6UoVivJ&Eu>jPnc%*)!+9|-SG#oNi)QfN<1Ygw zM!rUdNomNRonw{uc#N;ym*nk+VtFaOxyz?M8IA()Xb+0*EH`?wyMefC$A+4>`TVr* z+*Fz(@0LB9isgV?~LHCj<{m#G^+(12S-TkRDn60(TbuW9m`}t2fKidbQmV7Ko&I+HE+2 z3mVM-isTpe8riS)^NqsaSiTrpH>aZaekbmUvrp!>6{kcUEk(t2_VcaolN(<- zHI;qd_^P^hkx<~p%yhg#dho5HYM@Q*sK9O3*ai=`xpwl0RB2U4zL)COfb*JfGACA> zm1=p0i8$()kl0buFQnN`kmK`J?G>QJz2l{O*FH|ug%|R-G<}~7(30U7R&Cbe1h2Jt`<}E-+sH0M6S>CUzYf=fw2XXQUm!U# z$mg$r5(cfY+7301z3%7c#raM-4{{jqMXHfhJLKcf#Ys1Sf2sR#+VpUr-sq>6)HcQU z#_7AA2)Wjh6Jp|G0U9Rh?VG*&*%$Yk7o);dBaX5a(Icu1QxISt;12ANLmlL_RciEj zM~z^=_FLB~tdo`|k)(pN$Bfu@sU2#Tl0EX-CO)!)@()OSZi@2@t04a!BI$3>5d1(b z4)#X-C=Kb-rLt)6w6zb<@UM^^u4lBVq!-?rmCn z@-$@RdUt=*&cq*mt<(58Bn+5M{%ngXn_DRzpglj52s2nDHAC5Mj>u=;F5Wxco@_mN zRQl(aqcGGLfq_W9r0p|$X-0-b?0gw~Gr29`II>MHCrF!FpwsE70a{VS+AoGmXQQ5O zkj*4n>YwzT=uQ*dtUmPvqetL31__GiX13t;c`5L`Sl#?T> z!J4NpCR+&}`umPG2g8+ely36N4Myg9O*hS_XUNdDTuPODoAB~l{@wQAu>J#f&V2>P zZJjtEjrtA9D*67h3cGsR<<|_LxNxK$gaX#XhY#}}(M$K_n{<3u}ycj_Nm zRd~4I3L}&7raePnZjtpk@P&Y~`<)^)K*9itY^d*BBVwH%w#g24@Z4v zC03?9-U7r9f@cp`R(XP3!u-)A{E;+DB)nmbK2^dCEZt~0&?a}H!Vpy+86Li)O8^w? z%qTr?j=QOEkY3Mq&ZYOrC>uae9ruuD=ftC4z2dc#IP5@dgOD>9*$7O@3J4{hrmBzCk^Xfj}w0 zGhGvJ3-Qv8imEM)Hd{S~$yGO^?{HO0Gy4&jh)mG4-^ax_#Pm)eN)S->X_#s();m4h zt)#6+zxE?z`R61R4-@c+Cx&L38F@fB_E`k-{!bvrh8$KW9H4zibG03bU-hJ%R>-D= zri%u00}RmlbUWadr@d=xU?Xo(EpZ>8<4ut`eE1ebEAO~9=4}QF{A(o3k*R*?`(74z z=9&Q+b?VHL<=qmxPl5KVu}>I1mNDh`00@WDPVYPVk)1?6p^L44ugUZZ3wA>Uq7TksK25Glvc&u6|6P_gV=*PwmcX!E zsPlU>AW&?9_tTdWY=!-_Ft7NdZ~o)Re#OOePZ7C=rJ4s9o`xnUFLuCb@UVmSF+-Za z=w!Ph_u{Vd{OvqXUyLn6OWn@;{VeA8jgJ>+t(ulsi4MS5 zRETQL(09WMg8SpuzF!Nm=8TL=dEm|1~U>zMO2s>p4q#e{jv z!}zI%S$6{yeXbva3xMjZ*W2WUyp!s_wAr6m7;Z1(K>?k!XzAx5}W{~MLe&BjkMkb!-Wuz{(+wR5w z*{hO<@vTcmJ1uAo#~)Ky)mX~+W`b~7=J7IiaGmtofhFr35b+4!C>TvkJ+1nFAYGn0 znrukgrbc3$V~5w$dks!>ZA%60Th&3QpCN?t?F^EIw*vc%j57W9nX+SCHFp7>zZ0m` ztxB($HqGjn!1cRO?t)UQ(3XIgFFkvizxAG7y*hA#ht!h++{yb(>td;xg~_~_amBj; zjtMHMV676Z?+coX=Exm9I1p^_%yw#i#f;CttGP0A^ERyXy?kbcPJPq0Kj;Mzu{AIx ztu9xW>m9MJ|C*|K@ZiDsOqKWo32{JaA4|Q0veOP@Q};foMmNYXZdrM%w9#+Lw-plt zSmw-wL$=AWWOIWkDdw2r#f{A~eoS$aI_DKEL7iXA?jS5A3I z{oz+YEWWIV^{^B8p~B;luu?ZoJfrPZLY)D*!_^3GFSVIlMHM-1dmQ_x+fJV>Jm*^u zdk`b;d7k^YZZ1|RJ|+UrJl`eP9Nb}sVJ#Nkw9sDiSgD7cfJ_JpV>JC9K3Wfz2L{Qy zRh8VSBy!Sjajku(6VxLqIX{1d##V%`y%x1)eZ3%fqJZbe`Vqmk#m6qRL}%~D#wyst z!T=7RB2b6}9NpaQ0^{dvo-am;E486vv5IyVyH0K-lRm8x38|_Y2CXcK*!&__AYcF> zrvh|C7Z;aG@_DcsjOm;TNE{iPt=K&vbB5yl>|3kzY&A~PIH6?<$ip*zuMC5eP9_p; zivxuT`%R^~1UBT`w@uOND^ucp?7ZcC1i-6_3sVym=t4}imb`f%9MKQ7@f^9G^>t7! z>cy(>`Ajx$$LY|=P<*|xu;1-aEN~XD_ECC-^a+i$@83b~puBss{9vWms4e!m5v|tt zLPl|pzOO|ep&L?j`goKV;ZGH@9j09qWqV8a3OWE9mOENcWf~A>E@r046FyvEoardQ zpW3RqS>CxjPCp9v{ve=F6fs^s>G;E1+cS1$eu0;eRd?fEe~} zmHL#PzT5BA-!SDh^Ki0Y49$BN`)Cd)A<<=I)GXc?mrHN6 z?0kpcU({!q_(N^pG;DdRUdB@Nt31b!(kvTF-gvGm+sYf9XSQ3L7`@j63H8aj@Nos5 zhlHoztUER^%n-`X`^uN?IF0YY9tN-g~4) znbo-=UbtURdfB_W^o%2^mpXI~<_pXkZRPp7YH-a?Cs}+uwj!{P6&EA+&rz1z#=c)q z@lwe_GiX>!F-YY`nfuH$uIjDe7hMgsHkLr*giE4n*U9&iZZ5;Y`;{J0O8P$Ab}xEU zC>hv}t4YAX=ZGdvL+nqRspef?wEiJi%~5Frxhx`)uwU8zmL%_6S^MedMsAgiOg8bZ zE$+d6aTyGwq2uX%Zn@Um)p;c}1Iy?m!@-b>K4sdvkJj*ASd>z&M0%|Zf^`@-!zL-%Fy^TNw*HUx~7A zqHmjR3I6S?yu@3zyU^z2FMqgaImE1G<)_Ix%)e35-Us$iWZe_>X_ImriWyy1=;}r! z)?FvSu5V-7HSY-_pNr#5d& zbn33(B^C_C{dP%3fn3a&{&s?vPN z8tZv}M<>#1+ndz;Yv5j3ETYi3O7cEAA%LaS&zBSTx{wEZpqU(`i(qa}uMydxfx zST2OAposDE9g1a_B~$mv7#yn-4%_`gNih`rH*CdLul#q^pg|g=98PAv_;EtI-givE zmOY9yUtKo}-OhNB__V{+=Ruu8$5ZDZ2bmLqbO3BaH+&{^$kLq_<2L^w;pmC}B z+n2yw82o&t1kT&^VNsEe8$otyjVQ>@lC8>hTZkF973$u6}No{yOsAHCpAm~7e>*O{(a-EL_5D#iqH znGb>w%K&ydAv+6i^Z8r82A_4an`Wy4EiGSTv~%1xMQ7q%iqnx zDLcV+BzXX2di$5Y_EApy8Nr0meLu3c23<>dspdUabIVuStYEOZRxJ>YbWzXe+)otT zx?0d_dG=8s?houey%-$KchpyXoQdfY=CZ1ri5MbH(v6DD04lH!`z-8)m7A?rb;d@o z6xZ5{X_bx>8Xz%1VWQ>=iWcX?n8M!aGmh{~NhzheU7jV|?`2Jjgnc2{8aH+Hul`Nd z^Ch&&G^wj1$~0kB<6&uXgTRjQy;NwylqI18)t&`Wd&g&qLtN zYpOHbsqZNeFNWb}m?);I839AT?-yke=X$0I(w*)&7Ms5_ZJy|b^n)k1`_TYn>tPcx zq+(k@M{av>uYhwi`27!HlgBfstGyum7%=P^qbPGfbMd+(P_1{&1V5L-zy&#|&Z#pl zaA)|jlI5Su<1o{&Kc;}vlx3i}S~A2ZtiZCdwB6Bz5v36KzTYH_ZBrP`Iz@8tDS({T z+MGS7dD0I!(R~<+Xd2;nubf6${E}DDSwdH_VIQW>LrYs}_V>>{@Hh(Cfx!XMYRIFM zXpz9a{&BA0EMo!w5D*6LB0`tv#B!d5(9;MJ=iEr$iXtq3vwi$jL)yc#F893bWOGPk z`N9XcmQJ75LN!xN=-?$Voib3_SDXnDbYF>bH@;GIpx-={ZPUEu%n}>5_rA_VO_zxA zD&y$d)e}ncy{(oDoz5+t%VQffNLa5@0F1T=oQH(Z>)8TBs;B=z&6*5vE)hNiaY0X8 z6#VVFWZTc4#vIcP@0ePMl*Z4*vDxQ!>$Fw*cioul?pv(+^^kfPr#b)bG54x{ZH^10 z&N7i8a7J`GqNUk$b z?j2ulb&gmOk->kuL^mXvf|D}S_|W3{zNM-lwE1Y!)9sD--gX}*D`bL;_a6X_Y%Oo1 z`mK8qMh#Q*PKRu(ReK^3E%o}ghIN?&R(BqvEr zV?i7R(7@j{B^svg-xP>y^EF;Wc<s%NMnwo!GyH4{8hR*y<|uZ#ZB?gIv2 zZoh{h7KFTIOuaiwb*MFLET5v+s#7nYpzuA5qAag9{$+ndoW!hz_T0hK?;ZNiLo(zd zD*N?QA}&BYax~?0%b{4jhpjcpS>Gh@Dt zNga^OA;+>6Ye1|G-NbH~XyYbX1Sax>Qt@(WZPZbS3yHMHSn&o)!(&bqJ=K6r^}mk8 zlSM}IpH?Wo>BO^+%eCUo@!7&W>^+o~m3J<(S>@vo`vlr&l#L~_EUqv6_)79#yVm`H zVHSo_$+IXT1HayP(DVQAH|{JOw0VjnwpB%3RzLn>z4xD;oj5A( z_r6Zl==Ag1ewNGfX-Wmf$xN{TKlmZ7aTY17&(x*+iP%8%7Zksl_6=!{Q-m^x;GkHlN11dtG$I&7p_3JUHO-&~9meYC{H*saxXuBYPfRob+WAOuvnwPnP_Mq6m4Gt1H&2Qfl zDctyVy8n0qC48>qMTEsgd=pyu;32N?KHVdeeA~gp;@VNV?n%=J7(Yt<&ZjZ%yj&j; zr4Xd&Q0n&(Dj!9z1#LiXQnPm5lbae)6?O9p6j4DB6Cz|VCRR>i53%n*?%?`s&z3Xy z3ePkr%wJwM-M^Mg{mrK~8~r4vJ@I6M6bz`&xqWM2aY|7jUqye;w(B*t0U!TQ2(NZf zs8KNtMTj=+&NnroBzT9}G2&V-vWn^eQjP<&L;co#8wzlWzfr$7s(0GwN2vRQais26X#F3UF zfFM-lGE%EOx5@G#SNPf|kAOlHsw-d?2EDkadbT-1WpLG$Bif)Kg>57uGZ;QKTF?gP z^Z#?b{b^)}$p18ltQ7eCH*D3PAN*e$ySXZ7&3cL~v>ARJdGT^7M4<Oov0#GltIIKm+{smP*1K7VfRUv|toz#kDG;+lgH%b&0Qm|u}FO=pF7bLXIyG7dKZ z^5q(i6|P}4oAdq=6(MpM9pD=zbPBEfb?|udA2pLl>YSo}-p`}hW~32+4k^IDTzLn3 z_YvpLk2snT|Iz%WH{~JgUqkg9*Sg?;-w1Y`y@r^fN7s?2IX`&$&xLyI*SkJr;!ds_ zCj#x*(80A_-w_fD^=-R>w4@l3me`SqJiF{wFkBZm%feUn$gc2xAFR9`0pF3Yka%&p zM)NlX=U2oo*x=6HN^SVU6nu$DCm~uG>JERZJiol;REmQ2hcE6cO2X3oASeC`F1v^@ z;;2t0KmGv4pg*n8BUPQJ{sgB*PQx&WtWcPgY6$_b!N|J}GROOZ`IN@p0rUCh-$(zSZz!mF z*r)#Idamy!WSs4>3ox`Q>!9n%=l{~2{-5R!{u$5z-chLe%i#O!ORU+}57m&YD^phH z7%Cc@S2FhzD(&hi1JLBf(!Yw4^auavJ+?ZAz~2mz@h7M?u|1ZfCc|u3aKtv7lJUyQ*&obcu!)GZWE6C zGJwohlSg?o3_f1u4O>dT|IQ* z8FpOaNa^{sj6;c+owH_V!r;BC3t^f!eWPiKpZCeJO0_p~Lk*=2lr2c@FnniKwN~4q zb*7{}sx{M4iJ2*q-qHJCM?;q{C3uevCzSU?RWXbI&;R#I705IFj~=j zkgmp5bsm6xU*rM%Wy}E@gtBqs}y+{JQMwR&C}X#6=w+HGk%CgE?IInXpQOm>p52d=$1G$XC&O z4ztOp#e|9$u#;D1MLU#tlz8wPoBLguJ1i4Ga$ZDDbVcP--~J;wc$s^VL7v~AJMy&W z>Q$v_%*7=0OXz{WbqmmyJGqCX})9P!V5X&9MHAbWpT z(@*l~vD*vP3VddIxqQhlYYazv) zF*#GSyN~8IR>`us!y%j~uH;QbOhPtMY|>KoDFykzI25N1NXY}UzXhL`bq6ijf6}%Ir z5;w{6T~fSTC-7@1K%$~BN2o|gpyn>x3*D(?Lh2-K7zrX;)qvufi4iadv6|IgxS z){md>``-lAGy-{;`FFY`aNCPVei|^!8o^^{LFz#d$whzQ{CbVhWg6=R@d?fa5Q_2z zuHKFr4T_>Yyv`*cjQrnguXge=6>c&~2k$S@~kN15Jx0KT0v1}Z20{?5$bgy;3T>`+?0r;3D>m()w&R(WG-YFK$S4Y;-dqwYa)9B$nXkV0fYS)e%I9U|7qj>xW zR+;TabULtkle}${@iW*R6zUHkI~57Z%pBmLb#u{S=n_oS@qKsn({ z>Sth2P6?decDGwrqpfF@1@)kQ19u%aU}O))aqpG7^$C)+Q{?Rg5*kk_@425e|MHH$ z7eKg2UO7VCez%?cCqr8*Hw0)x@_<>RkT5CmCe5U1Lbmw^s|49-IS2}8`&%8QMn2{C zL$bZMQM(eNI|uL*Kd_7o6Hs|BCI<4sXjI8`YIUc5me_TKL0Ea9^Dxxqf~fJd#Lqe%CwQT zto`ewsISe0)IFp1@fMI5&MRm`>|2yLoL2EL#yEZ_ET{rby6D{7T~#5Aumyi3Ojf?h zyuCOxL`)geE4$rv1x4=I{ZiO>l&Rg~Q3@gXusn+iSe7N}{aLabGZg&DMf4T)UMI+J z9_X~52<+*59^m_KSp0I$bFVgOkXDQQV!UhhZ%i19v< zL||F@3o#ig{nI^aW^~2L=i(7G2)P#GXI}s>c-rk^MIfj+c+e6y4^a*6BEpbdbwcaO z(oBR(p>!I1C}+85Ek#Mi&+yJXY<)2d#v@+&YpS)QqT23eIqu7VpUT;?6KL`B2Z3Q`MEC(Y;nx z*mF{lhrK%a94>$aj_Wwt6lPx-`piA=q{@Kf#B1{im>c8+Ag9;}4Z^ma=?Iue2yj7%9Ij& zs;Zq;2J*H73j;GVQA@Vs)}7yPAsSJ(s#d7Ag!)zm+4`+iO4Nn-I*d|b208cOKs>~U zgcN7u$#MZgs5u`l@ttcbZShEi(8B^|I0mVK zw%lK2LnNU^$NzpdSXJVQIopew8c@=VlHTK_9jlt!qvlp>lM?@`_I*N6nO%~KX9az` z_I;o4O${aZRz{5?>f7J-qa;~pH-gHmb6n*yHELP(l4A%57d;=*Z&)KWesDXB!8gn_6|Fpo2 zWhTU9uO(|APOf`le*?Os*^v;zgz$i{LN;U>@br73$U0#iq-F3eYHR{&jtEnL-I9)7p&;j`-}9ED8rb=|yckgV=u5~d_XYuaDT7aXj4UK} zXC5NQ%75$VY*#!2OT#w4!V@j;Nz%u0yYIDS`4l>7F$m z7Z{f| zKc=|f>;DKL3AXPvRNVpvg;)pcF^S6#2=23WxZQ-FgT$dETx%_+mF zVrVxvfH(+jb@8+XXqH<=5Kq9D2pqP>w+t47nW0NB6IAn)eh=+-4bl4i%(0~Cdv z2CaUF&@goyKn9!_XM(UxAsGn(P|x+8g5cP)GTba4xmotPod>ygF#W8crOp3gW-~WX z+CO&6jfT!8@WIzj2sY^d3GuT z-(nQdw4nK1CnU~x@sDP?kAclUG|SC71i|plKPEl-?*4yhmWKx-HUjzlqYpl&zIAIj zFg)22>QN49e`(08mue&qk|iV8atRzKIe zC;yHn?+{@e-TmiEf&bKe)|A;lG|P3?fjvS#{|Hxn{i9iahtstG0iTLJ#R#_}m+LwF zlH;@D2S_QM>$gFT5DHbNO`?E2bsPRrBlzcX@kgH{`Jg9cea`>O#4F$bW^F?FVdr*% zA>>le+V#yi{>^l`+l`cKc7#V9t?rMUQJM3WEFxY!;bBMI8V~?Y%4#6Se#fhm-=6;w z1+V@S{V*1fmPKTT0jlRj;)2NrF@OKy$WRAe;@s7AZ@}G0`~L`=i*tVDYV7cOv(58C zWVAm0;cwpT^YQu#YebQf>mo;fNxfhb=#BqrsD^XQ@;|nF=AU=3y3S5?W~&s{kkKFNuxWX0;7xV#y8faXic z6RwN8ctZOn(vKuWwUTRHh|UQegg285#R>fQn0D{}203%7EzMH`TeElWg)H+g+77ji z5Ix}{izD|4-*{v<*@DxpzmT9V7kNEsNpAx|LoW4q$N&IVdp+ENBQ9CfgFJ|Oy^i>m zMve+LSp|6zkuM;){Dm`$bBF*X1cqO2-gT7oAhH~?bFwPvoUcJ1#Q*j|5f}m2hbPa? zo#EW%6sM;O7h^;oB67i8K~kJHOF@*loYO6iE-6>dHIPL$y88$M@kkRskC9t`cyaQa$OMNGiK#C<34lSH*lm*I1~zR6Cxkh} z19awAL4!yOoGEcG<@yd0XU=okAsf3$5Ok94gY@BVEYj-WMq5-PoCpy)4_MuJgxoWUhOW_?(D6jHE~;A?BR9#!0b6khE&GoDo{ zJTBx!pJck{idWm#-j!gUDz_d@Xt7zv)8B(665uU%-v-5yo>bTipE^4?lOl|#ELl(3 z)M{P{F>x+h$YwbGoS}$h`B-*Wp7((xusSkH=T6>zq+a4j8y;h;%$Nd@mFEtn9>wV_ zH+m{j&BZdLMcFpU1{t_32xoqH3SvMyNKheNXM=gI6<_%S(^N_uXrp&vr^~9e8to&k zMhPUbQILItgvdV8@!zuBUlgsp+*>WAUwUnLOI64o$a;(|{4QfuGM8dugE{;6cTo7- zCe!UzeZegDlxm4XO!NDD9(O1QEO`7>3N_Z;1YHEM5pcGThS~1g_w}H)P}%%brXbVm z`;yMFeTox3fSCmJK$*j8RSNY+(|h;YUCEknKIu*VvX@q(XT0cB{a@_8cTm&a_bwWH zK|rw}BF%=VfQo>C6bnUAP*ISsAWfR|P7qW;x-{tu3JL;Jqy>l~y+xXYF1?1(LkLOk z`b5w7p5NR*&OI}C&dfdcX67C9l4O5&U3=}dpY=RP&mTLm+X_flCqLQbl+5<+>C0XD zD5!1FbL?yl%abq|RPRT~#Hr#o_SvhmX(;CSsTYPn7Natc6I5`r$5&cn5}Xw-^KQ`h zcRgA9<$V;f+X!$TIX1-d-pGgK2Fg@SEVR*-czubTDr(>2Gg~~hN(j($|8eHv*&97u zDmK<5YZTMlT%igPi7t;$+2|1_mw=~c=gVtZ+G3trGrmKK(u33VswK}#f`F0Cr-UgC zYKrkBR>YXkwiRBVFmnOLdY23^3zb$-RVuLB>G29#S7+$0*l+O*>Nb_T?6NjTmS>gx zY6&^|Ag$JtfyvRw$h1KcD+w!kailL_)oV01DPF7=I7nD`1Od3Y^+8O+etqAsH*yUj zT>=tKjT<$oi@kj`UxkqP%O^cF0*2*v5?t+|$`JB+1R^)X2yDcA#8yik~f{Rv)v1?Fg7TP`srdF0kKP_~^x}30ZGPyCy&7)OcVm-v4+! z!h@wp7Z-0(;tdKO`}P=NsRB$y8H>3}B`K9tWKc7!I*S_^91r1##22T71gfM(Lr(rZ z1}Zqzlqjs1af4Bza8Y`)^C?R;1G&>RzW6hU;ZjCscFISOd4pZs_BGC2AO?K!%>DCA&YSGYVO{`g2@Hxq zM?HGv)VUXCUyW)*mg2-+Q)cEI7q_!;L>%MYSj_An^99nz7Mp?5=lpI@IQK_=YFnAw+Y> z5Frfs!?RvCe@93rygD?^k-72!HXwriS~ec^<~n`PayvWp*UREydS1t_ua?x#oqqTX zhc;!V0ly)D8xgu+xb!fo_XJ&2vT|~01W~KRjnFmXWi~Kdbw`6TOr1l7*e!(~mW@`8 zcbSs)R@JY*eLHMcV^}t5(wy^fVzz^FEW&077m9qyWSIB^>h1c2q zx>wL11+qSTwJ)|{1928dSax>V^j&(o!7A8tS-@jC=i^x~n)^6TLonWC$dkf)WTjnL zM19udbC+K?pcaGJs+|?R>AJqpoH1tMm2kzlNMP$(!CHPb>3`L5khLk~>~+-j9|w{j z(;Q`ClSUk%y_|38s-O{bBZ^5Ufi@|U!w)nFrX0arUxY9I0Cwi0%Oj&-O8b4PRV1C} zIJ%pXWd}pJFm??B*p~I###Z*^E=&5zm8>o%R=C1;=*}>T(@$(5+>_{8>8#K*AjBI^ zbX=gm(L9=Fm|TPyT6axKv%#`vl-tCMUd1li;YL=2J;vWUExMR?@~OZs2Eho#^x?sG zPEiK+A2sRELzBB?=d_PJYa)Re^-HhXSR{JSe`#0qzh7tE26x>#SVAt$96#~K7^!y@ zb!Q;PNgWEBf1j=|y->W}ylKL)1M*TXeM3?_*?I~hzJSM8*zQTU+RH5rfrx?yABhr zbcHjAZjio-cqRFP>yrc8C6ZZ?0dfdwiVuP~gdIfag>LI`Q^e~-0!OiqIxf+zD#DkI zChKe}&mM?AqXqfSoW`_6$7@wfmxi(-!pLd^JV-gc`<+EC>^vabXZVNCDf$(o-+ka9 zO~y>wXID(UFLHM{qgm*nEu{0=kZdf1-97ed&!FU$__JY;ktZ`ChQ=V@V~T{PUGw+L z@<>AZNif~IA+31<9<`fClJrF#?n>X*&%m7?v1@>KDNpOG-17;^e%rC?=AZG^uMfGB zI%{#|d7hVLHXb+FnCi97m8cSMR|qfm3_|Kxd##5ExodD-=;3l#oFivpl?^kY&oT9) zv2y1pjgMaaKjTCtXfKRrUK)bX{eoy{`T3}qhxu@bVvXExWQ^Z|AJ;uSycG9xOC_Oq zzhZFwa{s6~nuzlu%M;61rVUJ+s7`G_W%cPAIjOcSizt zSWA3dXnp@>zSf{IRCY;r$f?&tN1FU6OUq7c=Q(fyQ6H`$v*QkQp@pcGoo?(FWf0Bg zJFt7j&G~zw)h-x`?{>zj){)!DT2pUM%D9chVx*i{$C!{p;1(Q@QOkW&aPprs7t88OH7Fjx182u9W~I(Ci*UQ0QQxB{^d%f1LT~#qrDwgRnV5 z3d=y()JJtS$u#AUyE#0Kh8-~aHTIIJw)FfpH0g6?k0x!5gHqS7LJ{ODeV zC-oaCQ}X-MWA3V3^BD432n_Y2ssB)Rys(?|ei!3BWg|JQireK|vAere8d0L0MW; zWF~i-{6t7mKYqRPzNF;}W$e)O zC}^CqpAe*VwS0T3;lA-aK0e7#H)Id<;^qJ_j(3siFBh4ud-@z0ujR;*8rHcb>Zo}t z|1GfM5=``mrB3~?K+_zKC5F|nfgtGq%Jnm%m-95hT^E(f_Nwq8m)#DNe2hk!WJ z4hKJvRT_JV8ZE!^j2Pz*M>-A!U+oWnJ;=U!Z!^;Gdl@QPRjao?fCpaZ%GeLg!B(JB z!og=vK~6RQ4q+GMZ24dZLkziV6f)L_VaM>EO$Bu;Z(hXw?d^r5Y8VGn#7^G7CqF2n z4UW=q@ahR$QORW0n1+x zDUo*zGC$^7p_VBOZOu9cUST$7_!?Z|A-~9Dz$){KioZe}fct`+8$yRG|*_9;!HsKv7XQbnf1ea~RG)&Gc8LWv0}VQbv*HGfCs5q}S|s8~>^>oouD zw^M?lPWR*$Qq?+3+sCgFbviAEI^7fGLIV|c3T(3<(yQK<$e9^scN$Tr(~8{s7hqQ$#JI_pRZ#S zIm#=@jW;WMENwLBo|u7zB!jEED91*K8l#F>1~TaiDnlw`LXJK^7k(bOKcx zEhy9eCr0-#LaH@;=&u;vzaZ*qHtIhyx_@z2H~H)TwCAoc;!Aru?ehMW$<4qb`rp+0 zZvuCh8MXK!DAa^sf%^F~tcdrYL+oh_$Dn$nCm9`3b`JW9?J9J|U*P&yr4!q}tk!Sa zpBDP`9Gjad&|dsbK?tMDq3G)dk!s$o@f874RZ5w#iEjh`6YWNP)$QUIk|}s zEP%H|T#r-&i@rO)gfOkET`|8&Wkl1ne6)5Te}}?4xTj?V%tYnXpB2C4uEO8)NIh*k zn|APHOP@40@T0v(CiDEn&uL0&8X)<29Hzkg2V=m2aZoO{HK1CYJt$~!9{oI{`s~27 zHF9dp6vvdvFpgL&)Z0mzKGMu1JD%nnsCiod-Q?6kPMPlc@%fHan!)V%+}#Fca^XrCdS%YfU@=AAw;O#Uja|&*r*h(AkNa+eDW&t)5GdSu z0 zQ0&LmYD^lR;2jqb#DnnHu&d2|0S&%d17s?9t87EYr|Ikw&C7jn3!U_zOcWcdle*|I z88D)y_6^%S2QPm#O5DQ2O!TmCdG{>Ur2foMjpCBxoafwl)!I2ODJVsPu{Z5qViB;t zQ`~C)lo&g6$WpaW@@YM5s2U;P85c}9IC5Bn7u}~7#knH=P5t#K@k>K+WiYphjH}1f zWca$ZYG0|Sz~kTR@;NOV%ggVJp3s?~(Y%~vfrHU+6TA4CKpUgmekP`MBKP!ZQ=UAOrg7=7AYs^ zg%8*z!pIn^-@$f)kC8K^u&~H?LU9QQ(zN-S= z_KomMOW?7_M_))COr8^mgrCHx-?YBrsK7k>05Sykp8c1&wY8s?f(S}JSKe(eekv&7 zBpZpHxnbKT?@!9RtD*2#HMzsVQ}4|7dOxapQS!D)9xYdlbGU<~F`3?i%utlS-R8a)-hLIS-PncqV8(dk#&Cp9TVnu8u}U+!btZ6edo;ZF_i{(O z3q-w)fU5wVHQ8n*MU@ zi;{YWr>H;tM%r&Pn1JF(rX2Mh;Vhsz%G_s_wV1CQn+__@3s?L5A2GH4l!oO4>k_|7%H9>Y8;o4B9a1SlLADRnvOoH zr8bdV5#{HlD8rqod3%wwWsnhd;8YTXWQT*jzkWXr$(*u0`IQJ#=GY>VRf^mCf~-j9 zMXgQ69@Nj>f!fWZb{Qn^OQu90jUqK`&K~id`kVXF^J%ICpFUM{fNJ5_H>T$Y}QP zbBUdsysLiAzbj|E#C5Bk{6gp@Vk+M4McTKE*EaRXLuAi{zJ3ndvcL1o<6J>VG95?& zGd5as#`&>C?{PzN;rll^`JG0-o6Ku%Jvr-*S|2M^ky%tO6xyzQeh&?2S* zjfQjoMrf1lWycydVJy}B>C>kt*vy~RZ4%e*E&+(4=HU862aBR?=WXsa*}8eNp##1( zO|cl>lg5n$-!hZ!D(@B|b|AR9i)4(@3EXEjNae}vAx6?s43AASw}+;;M-NfsiC zVuhI)^%b?~a`q&o%Bw{0un@CW?kN@!$TNH}&ZE25`^K6`3P|(yKTf^q&i|-$+EKWo+uq(z`2?H9=sT))ah`ero0i)px0#<_S0xW0KEKge z!^|>(PS%#dz!nPQ0&?Nrl{P^51bmH0u2^=k`^pMTR>&p2m9elcuyyKc@?0&{(>wmHkv4@?hQ^Sf{&7MpUio6r#%RQueSS<;c_F1ric$0n6N% zO6@V~zK^e|M4gG9qxBYktQaUK*#t(zyz*tiQ^qrKXQRd(&a(wLNM?@RtmWab61TFO zgux$N|7vi8jXV`&U_bH{g=fY#8MriZv8u&i$h?_)J=uM+f=cS`CBSsTgLfpy$Io?Q z4~vD%e6da1jbq_=4ZOt78$uN?Wjo&(xjxNRfCjqFwtj5w#PxLgnrZ9Ma|*$6Np!+A z^0>)|?tRRL?5tVtas|0hn@f-CZVfvw%4&9`Af_okQc+4Vn0x(Zd8y;Y9(sE6MB+2; z^h;-*T@U3EqS3OK9=9dSZmvk0r#92QzS`idtpUgXUFcx{3gp=>5c=}9#XdPdDgZIA znhPUX^xU`5IhV<5c&p}2-!*tURBU<{>pazeYllkIxw~*vf*1X;pwt%vo2{1M2mT0~8PE|Et!d=n5=8MNHJ1nKmKQI=<{OrMEcLMM@C zpa*Wn(%Nfo-waoJ(%iGc<01J({hr-SbnS<3`m~B<*|J7XM@Pqy(W%JOcfT0LN91{B zM+)i`S@vs};aBh8Iv!s4T2@1zbF49{{v*@oVQr$!oD5`I^#UN~g4>nebbY$DPxnYSNSj_S6d9e5ZaD zoU~hy0RL>6+PGrf`sdmp%J@=+FTba_Bl)!~up4QlDy*c2N^T4@wOHf-geB&Uwj%a=dNsLwfo2icFS&v;Hb4KlnCxXb6nt*`7 z4jzX;sUh0o)R&kTe&5DYy_Ds8M|doP{nLHi<5O)d(12%TX!}GOB&73*&3+s_4dM;A4hu{ z&TaNR{mJ6zhNv@6md-U$><^glehgiXV;RW9G}KF<+0)FKtUavqC;e>!iCnM+N$lj~E2ntjcwHN$;HHUyCpX}Koel=UfHfcjZm0>L5C#<-iJ0`8 zb%ui4Wd%#s^n@!bID;4cTkcw4rqJvuJd`7rl&(Rp{kUde(%sF3!*|_XR@R^Cq)hp)%ykX;BL>A@RiJ z%jrh(*IBzSbPNc6OiQCJrO_3@`5YY`6%rp5HF=ohP}>`H;~1;Vx~@VpVWr#KD2^+< z{s-%4orz+jxDdL@J%?O1`g`YrLZegfgX6`Rd2*%s@utL{S|0cNCt@m6`$|_g(^G6J z2o<6hzl|Nf%W7B)SG@4Zw^eWZ+PeQ$uxh+L@j>SLOVi|})^ymDyr>5!WZG5;qBCL} zWDDwJgF^u~dcIlbHnu1BuYO4Kq>I%)1VxH$%%wY1jN$AuCSV{c9Tm?^_JzZb@h z^tI{un}Q)WhcG{3p{P-2xZXu*AC)p3jggR@`jl&c?s5NBbyFSGRqvKPT!<4TT`BC| z7o+E(n)<3&C0g9N&*5orpjRyReCfmY9wj-7r0hb)PQ34xO!Zk zhDfhiJ6>#7yr-`2w}(gM*?b+Owm-}@G`4Gqmd?G&&5v3SP(qEha1&k zH{3`ZvMo1n4%{RC*&-x~{V6};Sm$vIt|q)Mr~B+>YlF?fx_^4~?oYSoL~LO6c8^BqqG*TRMf zYxG%7F??jyBBoJTTG)&$2!)Nyj?3Q%`lXWX(*|S0>8t%16Yyg}Z1Zk`SvXwa zXkU76w*x4DRar4G^9T^Sml(ojsX(hs#IaA9INJO zcTiIK0uU#`5a|tCZ%$9T(@GzPmzNv1f|Vu_)!WWx&o7Pn0su-Xvl-T(b#wicMwYfc z@ZRY@>kdv{;n>~hz7(5*3b6{!5(KJd?mV^W;u}HF<>lSMsJ-^i55}=bKnUox@Wwb^oS*-s zRg#p=5QfL2C$D*1xb8*t51XtWJv;KZB6N@GuZ?Y3B;8L!!WF)LT*1q=wm+21{$4Hd zlv?lDReg_@ekQtYyQYDfHV7NP3g+ZjOSGk+dCHfPYV9*4zz}b%be{_gJ0f;@G-`q; zuw_>f0I3#-59CgDWQiN-6if~d@SE9IUbyOBSrqYi2JJy?MaK?e*;ncx<70l}=JV?+ zYP#+}(XaM!9_)X-#y%o6*~iyE;vh58^lmoiI_7s{G<{(*Lih$dY<-1|)(Jg%U8OUHCXn(dfZTWDL=F{ie@oa^op6q zb$!8o2KfwY!x(wTmC_2?S z=H2o$=kk?-TG?9^+aj4f7;1NJmvy{}UzhaS_eaKdc8jht1M@2{_Uw28CWhj!Epf@_ zM~2xlI+gS<(f zd0)J6=dBdF%|)}wy48kx1|Aab&pKXvD49A_li7CSUTY>( zkBEuMWzE5Z^tImJvGio8VQZ@XXS3E6poO&lipLOF?>wu19c2)beAp`4V|YO{Lo@I{ z1K}`>SuLW^l=5=z(FKY0v4-e+O2u`C8tn#K7oV_L3m&t#~dY&<(v& z^QHbcI&o=b@_q7FqTWZ#?l)=v^C9j@btkx*1V4ZNtm#}L65(+EjD!SvdWIg6kdV;I zLXugwREU?E?i4olgb=`KC2+Bo{6ww8y3!w(TDl%0>0)WP5=@?THP2aJr_}9JWk2;N zyghwa8y-k0UunpQ&aIco9im+-xN_l|`t!Iq!8#R*PhOp-;R zqtpLwHbeHLPn058tm?K03x?HaG(ShGaBcNoYoj%_`z%}m-|om4qO2KZEd|(0B~v?Z zN=Q_T@5j=Ib0%|F%=x|6T9$5yn&}o=#>R=Rmc6sbC=%(;4(f1JhntBan5q>WD?^Lu z;9{A%%z&R2hbg_pz+^XTcdf_Z+#AfU-*GrR58IzSy(;O_!;+;-UU#vy!cSH+(FVaA z8(qm2u`=d(^Ynzhmg}pHG}b=P##}|7yCrtjY$ugFGIb`pYl$p{H8s!MODCKhpYj(U|yY@|epog^$4rk|MT9OOBD zG?Mk&a8K&fs6)-6A%%XP7o2|91e>4Yy^=MyEBC@Zv8wS0&V6orai*^#)UJq`p`~pV zR||VKR%|H<%3`1)s(t~I+J~i~TPT?)c^#{)SA)OqVgYo-VxMajq zM-m1<_xC&Z-SNappLvksqUtAt*s@3MZ%$&k+u?SL*E-gBFWbF^;VF8p4oGu=*;2gI z7%h~ehcN+UbERx;USlbw#BY0PxW9(^la>)qNvJ#Z=~y+IDg%~eLe%n^QXJR##)itT z?1~BQ@G=K5kAuVot!4HHK&SuhfO>43SaW{LexZo%4r3$plo@kxl>Rjt2 zwSBTBY1e+|Tl0O3LD=BWNi`|*XwIqfB?(g&90()`UX!^KsRZVdOPa?ZXz={b)txVuyWa*3 zDg>=xbZVza)5Iu^LR{L!ckif+7DSVRUO46EEv&o#np;&3O>}md=@0c?4fhid8U470 z6;G_%9}-Yl8$vOe{My>;6n;#;Wu`-@OD!hC0v9Fh3>oqg^b}TqjvXuHn87|*xvttI zuM2e-`7{rt-4HB3ln)aZu^Pq=ks(~h4!?fgZRPPlcs5dYWpp-FZtu4zQz5NoB1P8e z;RDI8v)Pw^9`2BMhTSo@uE~Nq5O9OVrtN(H3ajkGHHxa{%AEM6I2KU3UHncZNl(2n zO8FU^#zFDCd#kg*o}Zh&UZhcT)QF7Z4-itp(kn)%vU8m1&q&)XB*BTjilO)=(?+IsDh{uV zEsmiryGupEpJ^TbXb`l%I7dmoGG5iM+Nz!CX83Ea-KOq#(SVd=Pt%7F&2YvNK_}Ql z_WmjXYb2R0(wlIk-YCYPN1_KL_S#{Xg9<|t8Ru2iiKx}14fWqlDUHnIH($d6>B{14 zO0|l(bmOe{#Yb{UvB{Npe3x!MaU7jl|pdgwxP$of!2uXJFY9Wqd$&+?)x0V7P zT#Z)QZW$kky}SK@JT?gq4nAeM2CBN)$0PH?HS+Ae1=g`92bL|BT7LW)0v+lzB+~9O z;AqX(je3lVcKr7Aqlkwa{pxXjuX6W-axfjTuJkbjlMqhX>7`H%_I|zMo$)}EKx>d4v6v_BXp{=7Szm2)?9bW0i=4+?#w}4XQ&rtVtsnQXu^PpYzw<2Te9au76WOS&$ zOE>dXmPj2C)}Zyknb4jl$|-IvW~=h;=>r3=xp1X{vvAgv6`FDwypG#yk)iR~W8GXz znL5nqtR#oZ3(_)E5rGB{gdS0wa&laHlIO`(t~m@Pn!@9yA*Uqt`qb0bAVF^BUHP{! z?R;4SD@pUC^2Z06w1h~~N|8)o85!4QxcWsyw6H~{7x6EZT9eRYiTvE9BK`d!ilYfM zzIf5=uR^B=MwZMl8qL$d|Kr~hv^KV8gDGEX71h*zTYr;XSgTOy=97+Pj(nfhq1#8c z61vgB55g3D*ByOT-2b#ruvpy3Dn}`suWDf*8!5E!H7SpPP~(xUFLKIPh8l6w2_}Bx z0|OWE?(N5yoc|*H&fTCZsqD2r)H&!%cNP6v-eN)oJ(qde>>pq-E=$6!W`*d zgSlpL-3JgX>Z7LQU{~{Ia>~#3UwgrsO{taO>Um;!x~}lm4nkD%CY@`}+;}aZmB2}k zM4GuTc5t*RU<%U@o{eUr`#C}obSnXvt{qzsinH=aSZg(*{`^!7!N5@`^h&nXY&tOE zdo?DqZVM#QCelDD{^UcC<#q87`>RBzw@U>S; zD(yi?r;y3km2P`4^X_q&7*y-q1iHzvOZk7oC-gD>vjH^4P#$#VV$W-3m`-bqE6iTYPPPBE zq)MQX+H@LeM^GDqcMUw@Y|te8CN9ox#EPVN_Q>&YrN)SmK&P~&ZYy_i2;)W_OU4Gk zO$_D|C{PHNM$;{hE^hKwWI250Vqh2dCp}D!&&ysW46%a#Ia_T&C)+aCn&^?x$~!%g z)W13=KERsN08yHL>i728<0aOKOtH@5ZGJ|cpvMf8#~aSQ2O_OD4#@bDP- zgj4WokJpwx35~ux-ehOmc%C!ElKb@L*s7w^F%|1=7DR>nmBzPI>UH719cCEEL z%fjEwL2NGXj2X_gz2ITk1CB9|TpuNYUa8tw_u$ZRJ3jf~6HUsTy8AHRi^EZ1CS0cj z+_!z+s}sb>YFUT}Jvk;rqcTG*TwCHqEmGrYjz165OR`kv z7tn(%cnXhaQvG9R*IleKt5{8p=hvn6?S8)#7e*2sWTl)3Dj||^rS75#Hao$=ZoNr@ zAgNbkYh*G~O4Q1l4y))VtyAilV+|ZtD>Qaym1*4vuyl6&iqF-Xi)2;cYM=GT$+&rHZt>O(5(62*l`0Xb z@$D58vf|r#`oL?(5R3Wn%fp#O1=Ev3r7LNfPk-Y@_^BIRE1E}(=@sT08iV$sT?Ty% zZxoL>vf!P~21&>aRgn4+>wUgA(efeI8mn(Zz#6<7DdqWHO#354{CE?Im0kl7=Zn^$ zSa2rv^Uc-UigQlsJCK<Q-joCtBIHMfGdpuz&|B@^})82zl&ZT(^%vCC+EgZP=! zQ)pd6(*M>FDF7){xgekbr0`1AS^`cWx|k(%3G{SKOUKsO-&xDaMC0Y9Sa z;pN90460bQy)8+`r~?%O&U;ad zp3xAU9E!=UWPGB1Tm7q*nGnu}DJI;NU+V??p(y=~`}L5_K*XpKLI|qpi51iBBv%_^ z`BP)6A!1MVUk@6G|L#o^G{sd!aDs0|_}FU8Jz-DVy^~M%uwlpERFvG%BmcV)P5j`q z_Yp?bG+6*a4#L&vtDL{pV8KO06XnUA_dGtTC70l>= zOOc}hyk9*RCz6Ykfa`h&&i4P(QxDGvUEGcGQZ{*cR{_8eV>bcVV+{ZkHGJBg&E5%2 z6KZPhODNRKP=r#q_!#fG^RIVq`i`spGCwVi3iH466Yw%3n;uu}Hs#ogdZP9gZS4lU zEvIi?>4gtCH$A?34?u!m7foKW&qMLU2zd+OSD15J*AbJK$ABt@<_gnOX{S60 zLf!l2x$|?T4YgP9DIB(%Cn{y4kD&Mp>@R)lkO{8Q)A*<*GSU3hm68R3SP*{(9(!Kv z&(Iht`l|ZER@CF;TurYN(fQ*D`}qLERn8W;yRtYF;Xao;{DGn!)bpc1gTaJeE)FCx7#ZL z=(B1UK%e9)_wB6_0La$Mw`S+r5eoIqCxE9}>CWcLt-R;90!C%`_?E{&oX+~f2Zjr9 zqdPJ9J^J38P%mov(n+j6`F=?c-g&}u<~2CjJlGCzkk>XOaf|W#-+8SdkRN#cf5R~R z&o=foy90tPtvl4B{Yowxz8(YfGNl)d{b;gMe^DGA2%(f6t4$ z;~mOV3HYb22&IIQQVL)QRk@X_pg(pY)G1+)Zup|)boasXKXDYgLXPj|4pV*nSu~j7 z7k8=LiEVmV1DuocE-)-Fp=rFisR%?eEZN62G%*6ygr1CSzQocPZcMrfrM&NkcpJ^&OoyY4H0 z3i)g3pw4^Rpw9m+CXAleuQVGSLMT%V;`yb&8p|4#C-#y1h_sxpNmh}Lwt5@5a*Jo_;qn~RB8HgTW$B;z|MRXn$eg8-?!Of8bs zH3Xkjkkva`h*YjY^7{yEe4!z^0j@YYKb1^`H^(J7Kc=iRPn#@$=G&r}t%H&20dY>_ zm#@c`$i25!RV5Zb)udwA&aef*QPpl(e2~Z8qaDxXMR9Bm6+yo)47F*sZ2FXw@0p!Q zBoysWD_e03CPJqb92m|vYWDPE=u;C`JGiR%hfkC;{~#iR*8j()}Xz)aq^_q9QiJG-}Tz2c+9h(uY%nP>N8(fvxLf1>_L*riA*}-j^=^J z4>JgNl=i@-u7Q2Gl}H*cLEI!{ zuNCT+(PKAG#)>Ybb7q%YETnw=5oh3~KfjURUlT$b4|YzjA1$?Og9dr8jnW^(KUMRO zNjRTB{KPL><*SwU*(wp+tEXwIIoWDfp@VI2MJ(o6)lC$79cMbt?Oc47DtZeA9f_V# zxmLSA`>}FGym|9xZY`x&R5k-*Qdg5=t{b35rxyJ5@nkd7;7Uh>tcLXZA3B2f;g?=l z-7vAU?x)|Py=kHt4;i!f9f)VyehMv~HKU#bV3nh*V03vI`F&8Wg&pNfL+9uvgz#-k z=s;xDXMd_0Bwn(@e_BX}lXqg&8O@+kVV!=>M5 zYC{IXn*{X>9M)O$QwUM43 zE)i~ifu=iX9V*~?u_y8;4OzPU$kGiv>_xY#|D0ZQ`10`2&-scW@pw{IbnV!>z^U5_ zN2<&P)vRbeI%-@_F1{CyRWx(%5@uDch^55w$uvM1;m@6a+FtWv6DYIy8aG7CorGCwY)8qJ`{Z8*vd4|#v*4Z zTEz8NQTr>e4f0GD@IRzpY)Bw6`Wmi|Ahx<^g|h>++ON0P4`j^UJt?f(nnMbE=Q$#% zc}Q@*Nb?Nz{W&wWxXYr=raM+SxjR06vvSt9+#XHO(8%(bUAT=sD#gbZ5JWTF0QKUA zXuK(7q$qp*)O>k|1Q8BXEt!87tnCLvX*DAT2RsejYvgEqJ z)@tKMjnM{11HzuC`fyEm%C7xP5{?m4mn_A9s(%kbpgUdZ`skSzR%aRQ77Ca$lE(eWI}0A+4LBUp75(+sm$w{ zVD{9gnYzNxwd~MQ?0Rlavxb2YApv@2!_!QL>^ez3S9b0cx4P93MM0`zRS-JuSK#q<3ZV57mg> z;`e&*?}R~m6aCG(P>I=nilW`FexSw>C8T~vc>TX?eckB?ufKs9G`>1AGO}M%Ub!J! zsc<Cu)D_J^km$Buu3KoWR#%hFeNxX>;$C{m*wwsYt<6$U zzszNB0C}8ckifljdZkZFdHPC?E%cWeGX-Ky$V}n*s4O3NsK3xkr=Z+&>b3Sai>>iq zdSA_oRPUB3SC2K){0kLB=wE6E8~ASr>OG3w>Z#F~;L!7zPj53it&ZABLb4lvlTe^;&o$|jLFfyCibf7st zPIpeQuPpd^I?dbx!?dfXU!TmI+W$LCj|YRt;=VpQR-P|ea7JB>aKL%nM{jar_jaDkEfuUcO31>$}#z4Ij}23VIj} z*h)_Z#sqUn(B8WzOMfJnfsqN~EQ)l+`r{#g=@ zy1tTvZF;gsbNHikM`xN=vkaFSU0{E5C&`|bOdOm`wC35dq(0|?hfzMKUvQ~ty?wPK za2!X0-SmLKy(b-OIMSC2#TH?3MR=X7r`%JaZdwj4uBL|s<7o7r4blLo^Nd)ukotNz zJ9m>=-cN^>*;aA0WZ3_e5+qX0Q}H)BNCW8_5kEO^3_lQ?Lu<^It7Qp^8zj}UkYw$2 ztXKG<^_AOtMW$-}I%5!8$OXoM`a~i4545G4Mkjsrimb3q?pO%lvHVZw`KO4hE)^zO z)3LMax%Xb084=e~;s%mf|~ zu$zz;=WZ>q{hH=5bx&dn_eIMdn2--yCEIB)^%MBP(9jssu(0{kJ_px+H%B)Iy2p5s zgn)n!i=+#^G5bnRb8Pw(qM090w^`k%(Cy1yGH#=5vF#IIbW0>pN_?~|xhQHe=Q_{l z7*}NWJ7Z-vfV#fQ4I0xDJ=TK@%a^+EC0x#@n%k7q9;a-5fpMhgXDfvtD;jX^hdpQQ zE5$V8l&T)N7IxaRVoyCL4|eH3TMGxN=%jtKS|!RK6P8VXHzoTxHMXnP%}K*h)af9h zn>V%TD1Qqi1?1P<@0Dzb7|T7uCJ}rv=a(w==XO?=IHem%k|xNlPT2STGe-;1S4sY} z#UxoZuK|lk1)jP~Y5fB;aRds;^x~G+*Kjv^SU=^%H6+iP%paU2kvq|c^7Y-)po#o8 z)Vp_w8Oe)M$bR_2SCPB(q2ys4pt9my(*}}Rrm0i!9xc2b32CYiFrgNg`^+CeNI~U} ziXcHoIj7}~Pd2|~h?OkXhF2_H`?}K;oUR2%gu;fe->luK5`8AuWTnSkwrRa=;`_dz zHQO;@3QK=VSmk*lpmFLYQ~d%#-mT!O#UiKMM@3os z`_iAlt6M7SJc=x6t_xrao>0y)jZ>ow1O(V1-_$cy;WkV2sx9>2V%*KRHej;yybn15U#u9J*P>~6s$-ZOHUdG9)UPOtE8=oJ4U`OLv1!w&z8 zXz+5$-ijrI_gFz$^*h+8IR||wMJyTW&=5>H>HI@RWITkqhiRPdL_{aOl`v9;_Hla+ zw|D}O9A#rMv8suCD#~2fIT9-5O5w`a3O^n zyspaiBnj7Tu)+COg0V@TcoQo!UiNFHIbRifB9Ow$c||ggMd4UD_}!6vr~XU|SGdu- zts$Q%3S3)qx>te(zZoteH#Lz}T!M2Nmd60sQRp0dMsgNgjk%yCvL9G`jz(~M`Z`T8 z^(eCaz}T!b)ubO0lU(lI6+wU6)rgBP%TMye5Xu%)S>0sq==R}CA7E)S+x`0aus&XV z2cm`pIfmZ17)LXk=EJH?E_-JO*ry}pgm!d@77!k?K_Y&!ux=;#SV^T)#Lgi-+||CwqX%6`mt7Sx#h zzLl6YjB;FcZ>##;taCJRCLJc+ZXSCG;h+vcI!HWam7C2fMo2Hiv-WrR)&sY9Fg-U{ zN9&fEnJ01EKf>5CSC+5!&^ zCr$stGLdi>22z(;6Jx}WoI|_w$J0)vcjP%`nW0cl%r|dby)WTHx0gzGg@8o!X^s4wX}W*X9NWdKoOb<~&bq!F{=3K%BU~?o}Zz zCZt}t{K5QZo~IMcbX#Pm@OGHoia&@c20QyvC7Sife0A8>RM^U*mxL^nP3T%8XaHzo z3*v5#IOlquj z#h%+(9-+nP4@|An^$ot@2Wzg@*C-l#&JU!kUD+@Mh@`_p?=JNU7@q)Bq6GNv;9bRM zW8C}R+V~`<-%7e*ych&it?d6`?>)nsT)TBqtk?h*1(j;W28bxVT0m5aBE2afMVhqG z35tpc0*Z=s6#=D6F99M7(uwp==nx>Z5FkL3Gu}AYx7IiJK4-0c?Q@;I*Ip;{$HYM1 zyybaDxyL>3F+14P%q7PJsw^L(nE{|D(WF3%=L_NwhdnPaXQcky5 zTRmkSBDPEQP|9Ockb!DVr)w)7-!`0Ql=qv7&Y0go`=Gn9ZD;6m#_n&gZJ%fMtIghiK zn`%76z@WXUjKZUy(BtP9j2JQg*3);+qPyOXm-Y-loyW7h2OEt5Xn^fBsTzP{*vLHDi$Dsr=Eh7*Id^(s|m*$Rc}T38p@+dbM)w)y33~GDKM5-9j8y+$u%6a@L_h&3Ujlo*)m^V5H*z+DZk~X5qMR|SB;!Jk~Ixtzu{?X z`-E>zFXP_@LsnE;;Hgx=%6HxZ30Y%9<(8hK`&UAry_~dz{H|YkC*Cum>iNeWOqP37 zvu`|`Gx4^up@p_N)s!?eeak4`*9Z8wO$+5nQXZgeP=KNeiuW!ztjvB2@|x9L z`v|(5VC_VOWgbF9FA^PII6B=qwqTQqU4+N=Mi@IR{}7hz$qfMQJkbwh%>cvHu?0&n zo?8Y(z>+VtYNzr$B$k*4Pe*>5;zT%~m=N?bihH&91{)F+6&TYWMp&ldKiGG0^1V>2 z)^QCz-Sn2~$+jI;IREZUOZ{(@caR0cUv|;19pb^+IS-pa_pqqCUIEI-R&|hIr&dOq z;rc`r?TOC^evkm4he&auZP$yt1%`xQg7h*miKd17XcKxqi#KSRCFUx>4n)6ran%Ea5S+J{_*wvYsob32LzS8#=WZmTE zdoqI(f*|nnCN~HqJWbJpfoW_0bR%kLPr{=a0DI!V%F=wE`G^gqgIySDZbRJr6C`ZD zL|jvm_g++t55#+8AqkBw*m}_zx^E}n98_FOGRWA~T>kx{k&y4&OI~SpLd38A9mWS# znazBbiEN4(vz|Ip$_hX@+0<7Tgo+oZJ1aQ^Ae8ns_EDTRt<#KV-f(aFjjQDBufzzq z7szg8e>`FfM37gu|A2g~^VL>X*FN}E8HrbHwRi+zRMM&0pesj=?2BboHy#SSl2J1D zgP%XauZv(u&yRNaalPZauajhTH1Jg!hklwIa4>-IE0P8A()md1IXlqh6ppVz;rqU zOfVxQTwBR}dsLaBUn&bv^Wt;+aZ9oEmTh-|HzDMF=FyM`*`%i02w|P#n_rFMasf_q zGcGziHW0aU$8h%is|){qkVrwuWq4M!xe{d-VQo|VH_Yj^MF4DTX5yH@%ooR-9WVB$ zK1TUJb9L)Kj8ZDqO4YV>i7~|1pY2W$YA}Kz&Y^G#dxqZWyJ@y?YW0J;m{*8R|6-$; zeQfug1a_pMw$rRno=0FFfB~HM$F6rsy*W%v1$1Q^(WmgcEjd6a zbLU^~J&x*)+Bt5yGyn*JaAdqi~(4 z*xU%sb<%H78hclK%L4osvvZ#6WH5sG|jh9R+D7*ui&Gvpn?C&l9G^(g$*j6|qIGb326y?&ZgM zoTnfHRghr7c9$lr-V=sQ1E|3bUZ%tXdcWe@+i|>#=vi}!tpHQ4Ls?F?r?Tf_N*5HB zFzHZ{5#X!Yxux@E;tjW5aR(>xmb&Mz4(ajezdaR=N~wlk+1cMbgEN|;rO+bReKRRO znCIhSX@Ojq2X1C|aaVT$Pt&=*mZ&My9QSb1f`w46@feS*VXO!cgwB*Pgszlp_C3Hh z2K?z0+8#@IWGF8OImvTIr1=?gbTzlQe71hV+ZmcNpVyV&yplt8LOOkt5axjshK>)_ zC<$^@odchUi*3F%P_C-B5JTlAsJJt;2SlCLUyPoC$-hxCG1=zx*&;`)YaEdw{qGw|-|csBt9(Os@XeB(1(_J6!R%T`(n!>9AIgHW>*k?Bt#l zgg%q(&m3~ojjlFc;Fa7{Wk8R5Wj{UP0Ck)bsDQs9Ij>mBf5rKNS>w+9xx~qfDOkE5FD5f>bIh?vFAO0#ppRF*hF#n^XC_fXk$W>v3BsJTj zqnCtE!r;_8&vDo;=b)JauFG|jAbt8LxR<3jW8=JDS3qgreLUUZk|63*RL5@kK12xaCA9g;I%Ztm5alC^HIV83xB$@gST$zLquf| zCmmnMmMDG4I!!i3%VX@RJNKv)Y>G4Dl0i$|7z;@KrABjk=x+golaDB(fxen2rcRJ_sBq-HZ00k z#2{hA%E%~^yCuYOiDfL$k7stI7#-ak0Xst!3xoour~U|#%l{dC&F|ry4r5;$@zqbP zVV3tOo*C%hA(svzroshT2{*Z&ij>$|vizUQcj_4u;s*F}L##q5o`IW+hCj!Qg^T+v?{S z^fBQP1Mvr~ojE#qaT9dnT459WJ0ZP%Fl^cPZz$)~0A6+CxLwFhd)Y7nQ*Q-;ZM$-O zsTgWe{PNb|n00C{_)Po$7{ia3iZ)G7ca&Vsxj^DeA}Ad6W6=YItKFVffZS>rf%Aw2WvH`Vcs$(xTTNT@39N$?rb628_k~n zUB+}}X{u;AqE%FQdNd?VcZP}!k6%7?z>cq@#JXU)n8PLXM`9l#q7kyGTp$Q9OED8o ze#;)Yf#6(rF;HR>!1PN4dLU|G#BJm}oDKmkHSwU&Lx>lYFG|UBxlv};V8JI^u6b6A zlf7Jabnlc}c7}C4^oW78r$P6vol>+XS_(-e9#@)$NH^Oxr~?`c4UtDfADl(FnEdR| zU_>BOcFL%uWjweUL0}TxOYppCqb01DQW4c=lT1A~MT*;`yo-x#TD$lrfpt9B(SW20 zmS-!GBs4uRCJ=Ve*=@Z5Dm!5edWM3wU4M*>)pt%PnY^OdcdV0!V6DSv8i1e>0P&q2 zlr`pa+Xad#fm41`YZfBs&l=0PYC$9}Xv^LnXBYB39wT!UQg`M@;h!4v%@;TvjOn)C;5U1Lf%#9NKEzz&`_z zpg=h5hNCUY$?a>9V=1qn-c2*SnqRcPfRJRrtvgbz6} z6-pELd&RYqa`eCb^83w*1 z(4FQ!mEyBEFa;iIa1L5f1RfD04f$NtH+n16F)5trUlowB1N%T2YaYiAr+Vq6@oyej zfR|y__GDUOE?^y_J?;q?>|%OOw?dd;3ca_%9PjQx(Hf#SNgMp!kHUhzb{0V}_ojtt zoH`7Apk^Oe6(am;41H8Pvy^oQC}7&;C%D zI0+fDFVPeH zLlW&v)&7hrgYWr&B#C~qLLP;mZ4$_ErkwyYx#PN0=#gianSloiH^k4qfaK711-Pg& z*Os%cAlj4+s~s4@%AsKb>h1y{NOJ*bhH^~-tP*J#t|822WA`I`^#)2 zs)rS)g!?uz1vZj)f%`xn?y+A3pSE;xGWqr0{Q&(QD+mSQxmz=EOS9ZP!Hs~V9k>y* zb3*^*MjRXdNs$tqMCF+!h^L0PGc)mLASQY!LTC2h^dCT246nbbNcu_qZ>K!@e{|D{ zpNu0!xkWk1qo`oa)-^6#ZLg|eY-DKe0FT(e7bwp_bkf-jZ&DP&Rm02i60(%k-|XF} zcZ=kgR36_+1}VVKGEy6}n8e3nN=LoPoI$(8*hl4<*E1VPm-3|{JX7#Rmezlz;`nt9BkyZ`^f2SkG@T{lZBr8gTP?=irMHr<@hX+ue)|E+cGaj zv+UsQG~I4aA;1FKM<&|O&~y(%EqR}?oa;~+D8@kXyQRmd_yKv6JOx5jxu+y06Lp(D zwWVmuu73HMQ8e`9D67r;%4id~#fn}vB`VhWP$=?VQNeHU$G*SlH4~LLl|sCgNXb&o z#Li@Ux=xup)t^P3U22V779goXftvN8oW;PvtMC)_Z>E*CBX0z~?xgpA@a@x1&Xu6| ziUI~0`8Fq*Ta*T^gt!$)wd)J-ikbNyHc@zlq%to<#&^C5>hMg>h@oJb*3Xko$+z-d ztQHvt3e&>=GgW9&!js|X#4gL;mB2rWa#DF$FYthXm}YWAa39p_?1CcBPPL$Qv5$`O zq9+>bgro!lOuom&`xZ@4_KXRxT-42RugNwpWhV2jS7IDwqHCB*#b#M!!Yjl{E}AIx zqISN8Ll~5pcRhb)LYqx2C@x*E0L_Eib$;Qp)tLnK(tT&u;-t)=nHN-Z=D#Y>)>dY~ z+3xe)c*##bXj|VF{*L>lQj$w1AE8T#BE)Zx^p;vF084t6^+1`kLMI0Q`-6{fat_Ml zJDhMI>3d6+m~_cZIkN>uhs3##(oRloPt(JY;NCZM(5L!Ak`A@}zNk4%7X+Lt zGu4vAZ-HbE(Vdp(Bj<56{B`XuGi-<|^QJy8@BS>KDYH zJQEGBR}VpD|eD^5=8Z57p>zJ0VXF;=9yKgN{o&S`=|d@_ANs7ty-=1 zhSr(7GNc(p&d z&lh3Ox~F>K)a8irQBhG%RXLqmXVpaBzj}08NiAMdK-bo{_f|oli)*-2K$30O`Q?Z$ z!q|SFfv{Iis#szDW)kTUXFOh{?;mO}Z4o9KDdvHD63U99L%YMF^FZG|FLqe1i1a9v zLfKxHOP8dRhYvRS&C!()@^EnNrrCKnIpczQYHh4p% zE%Ka`u@Zlvn~BaWxE>+2|11sKKM%EMdg1(W=8N+sQ@Uxe^R{&haO0=LXN30)7W2#!$0kQ&%D=nF}o$qO<7BbATO#g_FAc{+9Vxppg zgwNP?aENome$EP^d}~*y-Mj5O3s3!7lzWjyS|swImQ-r^JH~khOAU zttP(QO~I0+^Ma_=Kh;Zqm$e|GEH9ru1W;e*A>Bt^YVbWkLs#6Y&A0tF($BZO`r97W zdQW;*<4<#H;#!vsQ8#V$jP_RIFBY~wj{qs=8O~g~Zjn^NF!#P3gJXNYYUOzTZcInE z?UN_Sax6K1=*gwAURKKz5Ye*2%=!(&MnR-&DK_3sw-c|UBvQ4$IsaP`jCkManc+~o zL$PrWGyS9N`l4ENZCa8(e=sU;jn4~~zM-Ph<#FHG?QA<}B0gSf9Q8+Agde|Nkt@26 zZMDj>_;6=y2lO$27eXkW)n{OP9_M-TBiS+GGMn6lpOsf9rx{|Qo!TZrs^fWvH3$%$ z%K|A}kEzl)MUd+0Lz|Kk5)Su*7O$yUj%})jV^xtwLmY<03L-Ik48BJ=@C4;4x78|o zHL7E$OMXtjf7`a4_6}nS%+|Y%#9ZbuT=I0xlI0byXtCojxkY`y54-}UIaN3BCXoKz zLi`zhVOw|3_-FR9`wc6yw;?_s(5_9VC;9{aUL*}dK}BP%~n<4J|SWZ zjnbR#b~~s3k-Uy|I(-T zSJHc=`NnHi9ejI3T38OsCH?g12wr3&&k`zb!`QYN^ zk3hOKE_NJF;J#iIR0F|>pjRB{n~58GJjP=pEka7Wfds0%;+5;OOjURF zS?Gs0Vi&LR;j&H7Mr&2EBad@TeAB&v{M}Rup~Z}gV+5ipl2PbrcH3zoMBKUrGymF`l?qF;A+q8$?PzY#>aoZ_i_s6U-iRTSqu-ry`L5Wa|zPwsdv5( zSqny2Wk}L{bDI0?2F7O%9j(W^^B%l8XYz_v7f8xhn0!3%Xo)b5ZK}n)=mTEFY;u2 z&2{9gr0pw`g=I(zQ!Q#~U z=KI0D7lJq6LX>pSJ_GP9)5zmuo%C(p@+G$`Ww$UrXJ&BY;Nt$4U%)&6k_sX}{cnZ< zBB%8KSrgoDWncHi>%TL++FtzUgB!E0N$(!dz%DuXp!dF3)I~^@$9y+1&GWG!fWUJD zSC!5{exUCYfL&X}aJDUjn zFzx_>Aoo3cuW@@D(@5w|C239;$cvFFW(tEfaOfQ`01M%N!~h;&!?=Ox?4SMtGTt=> zkdf)%fQ-nDaEby82>WTe)<_q_(v4E+OQzJJ?z{TykdMy4F|mp|XS z0V)ts3%JI=5&r7ZYt}}O9DUl-7N%_pVDqc3!jX9~e~JLohu*+s9mlu(K(gVllEJM% zV`bw1jFkal3OKMZ&pz1Cj=b!(@UJ1gCShq&J@5H<9vZ zo=n!Cc`_9+PX=s>BB(f2$g2a5c{^kBZt|}BE&sMSvO9DajFH(Fa^%uMuo>J4?olCq z*%gW^l`T*&VU##3c!aw*F+B~m%|J4y8&4nuqM7zi*=o!lI1Q=tic!M$@EVYvc+8kYXG1`d_g1I-gq7mX$y{TZs;W z@@I8sI^Lxl_?sDf4I3ei&wk#TGITZA3kvs;v{Ss-$%MmA?(@tevu8{7!$^m5*g+&b zQ8?M_vbIT9o-2$@#d6OR5KWvq<@2m8o18P@={Syd?@Q zM}xp*pb@D$T)1qp+pB4*Bf*RB8(wZp>qYpI=35s^-@^Y#V2rO=Su>H^P82p;nfhew z?M*Bucl6H1&nDl*r>mFF)o;2nruu^Fyw=dM*#OJiC*9B<6D(Y8t$F)5=s(90hv6t; zoQ%ufV%8o5Eg6(dm>F#`oCEy!HT(?+<)Jp1C9su<_cbZ0qpqQ1NclH@KB#0WrSY~+5jM();?(h zisZs_*kM0hzb~OE0CbdiY>7=dvoO!X!uJWpgfm*0F-mN=s~08k?tOruxKRj^j=;Jj z>M{6iCiOy>&;v~VbQos;Opow0|LW@DF~{5dZ~C>xo`PlN1tr>Me%hvz^Y)a zq2DhJ=ZW{fCC$JW>_%iK0QZb-loPd52Rwunt9ko2$JupiVn;uQnn6r-hnTr&eMn7` z@Es%*{Rz9Eu@adLVAsPteIEx(_whdEc}P|w#Cv=B`zwF>?o?F6#1Lp77pBzl*mR`h zRyPFgt5I=d@}t|#mL(*lEMYgOPdw@G*?)D*2ExV{rsZn4_MF}JV*jnV7pBy&6Z_A2 z?%(<8)5*uW*3Emi>`AP-x#Jo!{_>8e_3yz!fAaq zbgcefcK>?B3tn#Nd$oar-7JR|e5K;uR+^nd+fxlv@0M?Looe--?+OrI1B%O^!MIFe zEHH8BU@Mn6EiyGxxlih%L)m=F?c>X?xF_oJ@uGu2)nD^?4-A&UR;rsww5VTIPhjua z<>7VZ8&j5VU$Ajk47WN}xAI!Hitfm;Wn&3(F>k+kcPTwnUpsn!p&)Q%tL+@qHzXIUv=R37ziB87DW+36Gl_WKdQX&?muGl-3TAZ+8xe=~l6Yvl_L70XObHK{U6pz0@blQNIULhOdOXSA-hCn=V8&$1Dr{XY^& znHjbO#Z7Uw5#kQV{Kp!j@#6%}1lKqj51|J=lP`7R;z)!EK2D$f^#Dn%P;Aja5L*?j zExP?IhfLtZ@*l_9o3TQ#xq2Jk!UO&Nt=L@iw+wKsH)HJfWZd*RM@RTNxdbD+9T~8kon~(r40OlIyb;LfKhH zT*Y~@HoC(S`0-~uTpMkO9)G=LcOuk>q|jWRDukV=wB!q^h`Z5K5Ev8`)L!Z-?`jt6 zC7>3!RF_!?j;9P3O)LhLZd5=EqSvEWDLOdYKI@;)RMAVtRwjtz46B#{qD#Q-ay6(T z;*{p(mj?my-nUz{$8#l09=r`UJ}e}Zq1$vMfSRzdU6l(p`8yxgF!}0z>o;1~a=%B* zPoKC@Id8|236-PD>en$hsKt4+n5pg;4 zJ#Br;aIY=)(o!+u*_lwe$>;r{a+v94lV*E8SQ)9Ag)1{X#rx0d@{e}GjlIcB8dKzg zAz=#cNPfUnZ8{$3I;oc&zur|ZoaDVgdHnQ-?>eDFH9Ft6r%V=2^S(MX3~-t5@Wg|L z=!=r$X`0s~PFpX*M_K>KWa$Yz^vfiR$Fa+BZlugg`X15odIRv7jjBFtRf5@)o3ECAb(3;;IsjT#L)tlW zB{5g#O(P4dU%XAl9~86rl}7ib|5Tr17pthO)cSg7a3nmc|6$*#GB+(0OZ07|#IlRo zc4k9u+OB6WyW3bpc(QF*bCtODL+V8yu8Uv7)8=VO7e?nJbH-)q%^xT`Ic9tFAb?D8 zC?a%gM)UF6eY07faSM2PaH0JGcZOwrc3**ARYqC~ zFF4r`#syD47_UCib5{9s?3isyR#ho@led#yQ<;R7@3I9W4bhfp%5R7_Ji)uyc)HGX z3T<<}%|dxyYo+kM5xFDaQ=0@#+-a4HUduD8!yyOTCV!-k`H)p}dBumw!-v`%G?u{t z$u61Gb&Szo z?2BD$MMXtwalhPX_`w=`xBJOUKD;!nIkVZr#>2^}j(y!9;_%oz`5{}F{Nx$#sM?oH z%=SUw%p~=xB@{@%+c?Pfju%m5V^<0FZwPl6%N;~5aX};X;wxj)N8_jHo+&C?NrL+8 zMqzi_GW28d)!Oj`t007gVzrL#^111I4VhEVdY-5*D!IdtTbulrcX6T<|O;f z&21{s$+&aa`R4%{7k3Re+SH}e#X?e9RnD=8g11UKSvp(~Q5yX!P1Go^gnIQ8rC#3Q z&zdx)-H4t?Yxr9T8D4xh$SWZ{fdzE@(aU(AJZy*qb~yseDKBI5qO1T;;@8Xuya|Z-AQi~0J^vX9< z0A$~evH zH~g(ZP(_vUc`I1<SFkKQ7h*V+ zc^!2jcJ!s#RgQ!vV`UyrM2J=;i|oG@E#{!IiULo)EWh5mULW+yl^E5QeA8X}vO(~# z%E~^^mb?x_4;7j>1&qT~hHC!#Jk5?Px#E-GyXqf()RtrU0XSKk2!Nd24BTR(3B|V$J zWbtjaL{sfNo^4&C(>KPrS>m{A-<>jo3?+X&)(6Ma7ak{@*%ryx-;r~Pl70LJZ5jMV z0g6Q}-LUk8b)9ZBViWw2;meE9!D3ylk0agJi0@y>zMwB;Qg*s+xWj}LVVvG*-?Y|b znLy@aUb<6a>+LTP``f+qi@eS-i;r9DgkyM5ft|B z^kGnHs|&q3Y8d**WKAC{Q@H=&6%$pP@hKlODPXDGP4LCj{h@;C3NSxkW=~Er)Mw#~M!N&JIUgy0RRFf5X zt;Z%y>)pa>BJQ;K*-A?HgTf0$`=@uPUSN2Y>YOnO+Y+os*ECG)HXNNgKV->f;}vlYajGkDiEJhj55CK3B;{ z%1y( zhGNU93nLU!{`x0Bp6)#E6DjTxccF0%7a^Qn|L4X8K_fAL^jje<)3!K~m+?O7-U(jjL zW88dQ^$Kt+4weMzfu6|F8=p|Mo7hJVC7i7|nfdR50^FRz50__TUme)3=?q#Q55shk zMjrE=?u)6+Y?I|V{Io0%=^<05Du zS@|U8+&hieb{as40C`YW-m+}KtV!si>b1`IfmO`DIS(B*#M98W8p3+3myf-xsQ$Ni zJl6GBjiRho^;&EOLBykW5wd1tcd4|9h$H2NR(SGF>{MA*h;)|gyIvu}%&SsQx);2U z;BTm!W#&wWvHk(T{a^PLSE+Vv7G`H>KS~e-&yGYiCzgw4ux*iwrRId}76T)(xtDGc z)WsX%8kUIC9D=kN!nld-U~9g$iFs8>#T~u}E45RzS4l3T~0B(6gZ! z^1WnV+I%aHt)B?J5zA`}Z<{=)pPVuixEa_E5r|jVs>KY8n6MrkEY1#9^ifiIC)-gG{&pn58{lWa9bIV;2QO_}l|?xw z+k=~s+FT$_ZDkKAksZ=lYUt(aEwm=VND<1=8HXg#{2uaJe%Vd>?ff&+d7#`~#tq-HBS#?{j^avwf z?4{W8>-%u8y~rh$;urgCd4|gLR<@GHadhx<1yadZJr99(wq7i(DJSC`e6&ZHxWNj3 zW_xzwfrcfT*lSAdrc5>lw%s{NDf0b)R$}Ccf6h>CWxzk&83y1OZzF}AlKqB@Wxv7 zU8ZiSkW8W zsAu2a$DV}L`>KZ?`l(5-y@miKs6F0y#TatZsAm6$n9JucW*Bg_lGY;5%QG=$edkC3 zM_<&ECP{kiGPiPqCD9*Q4gA*;v?WZM#n< zJ-t>f3yc2H&*cQXW@H{akOzRg{-+B3H4#94hKm+?M_sH- zcazJ#J2(WfHks&5-xEMT8p~sIQR?X7duF-DkWTtb{xZxk&HJTjcLKipd=-NjzgSET z>CeHgI6;5`!QYf)mH&wug<~g9v_EiBs(kPgvH(N!dv<>&pe*?LGsrh##ydF#yL5yN zZHHJZ-p}(fe;n{gZ#=1$@`M7(jl=~cu45v!eK00|$S^5*7bv~kKLD}iJUx-X#q_(( z&~XYg_F3!2Pp>G=&p!=yX#VC9zou%KBuKUI0{?e)>QGy#Oqt5%aA4g&tR9heDL~TA zL0CigN2E7pd+jSKhs0-d9-@846!4yr@^Ieu3bgW@==V=xv@`}qvi-C z7O@f@-G$pV$9yHx#BMUcjBigFEp&EYY?K>*!^)Wlu;6!^ls&%8Y|h|km1@i?l}+A` zG8~!`pjGt6t}dekbsFHiZh04YIx#2hdqRx5WC4nx-N`h#bdK|eiJ*-!f5P6qV*Q=N z{pv}$>*Q&2hl}?>oWUo(yH%<7ap&!n7FX6BmgM1FYYw5$`)CI=ieH^-ACHrps}#7+ zGQLEOh6nrB$bM~p+$7v688*KERv83}Vc#p3)Gb0a3%M@#Y}|xC5^??rkNRWr6Kr6@0DHZyn(4=BLnRzs(8i{tzUrgL`P}^sd28`fNj}BNFM^$^Afc3&YDwPq1>{kzDOH- z8+RAL%xQchW~CTX92aZ-Wdl#(;8MR=#Wc67TPEFPPEcO~7PxWq(ZImK2*dt#x?lO% zB*+WRVZ-TNOvz=WSFG)jUR@^KJp}Ti9nL+deiK9l8EmZUy?~7J^iA?-*C;=3U_Rdj zG0JLK!t%WWZ(&XWQ#AqEYzjh6rIwlZ<*9qq4Pu&Yr{_A}3C7Uc(ze4EGl2%~iTMa) zo?@$cH@Z;;N-gNf{CtzYnSgJJbBD>2w#v<$G3Trw4@@2mY$yaz;38YlvSD#r+e7}`w_Xp+BT)U>-iE(p?uy+G_Ogx|B z9Y9?oX55f$hS*7bXB=Iyo`n_ie^wHI9NIgWo}Xfbh2rloTJ~3I%7?;I0Z5@E-mdqH zF~s!X?~G72lu((6%8RZ2rCtdev<81X)sOShUmSoZBNrXBkc3B|d^RlK6+ck#zf)QupG9uaXs6|SsPWm(T9n5hw95Y_7VOPz*zQR^BV zP2-6*jiw`LrMOqujuFDj^l}&b?wLJ~0Js>z=J{TF*>wFN0MbjLyxBu9UTy~v)UxeM zGon~9m~i6C6u3W?4oBYSj_k?aIabzl*#Ivqm5JVkPu(bslky$;09VEvvkHZfWu@Sq z#%ffTv5uV_TZE@tGelO}k|Vrj$pKH})eexA005ot!-(I2h8U*ZnvBP4A9jIUlrzra zv9LZG5zCP*wsSJlnPzycgZASyCfK(SPrWMqAbcr3d`3ebARCdN#?n)Z;fPh>Gbyx> zjl#(|(l3KpjFy>N($C6qyw|uYXrG?C^~rrLUl6*&_r~ZKIk{?JrEPESc0t_x@Vo=w z(WXNx&!(b^voT(teyc5||DjPbfsdswe z$FBL8L&G~GP8z2{1!_)`B$=L(&oy;L?+Priw^o%;Y{>=433t!BiB+Cj5s6(`)^Kd-7fjNw7&r^olNu? z-^?t(iZ6>A7Eop3J=i%oM4~S}PSu&kxVD^Nxh+-=MF(IHW}Da7aQlo5s+er;d7@On z#4EA-&qs=TdH=A1181!Xmq58*WM4ke*PBJ!M9CnrM7P-19q4+tqafT z%~!|^71S6)tWN$FvC^VVQ=g9EzVAfs;2~qFS9fxp{k>F@Lti=q%?@mnm$uL`TSXFM zzp@BBo2i{H9ud)aDDQ?}ttzVwvX)mDxuKLN?{Lh+;@-HLUcUD^(0lAJ75Jhl#J4_s zWfT|xxxe6TWBakGvpbV@R}bddbj+l2or3Sb`Hd0ba=k&aFuL{vBMHlMvHqe{piNFl z1x9QrU}aDk>H|n=iAP$FYKvO5opM%(vDOoKW6*T^w0%2Q0(t1Td@HzXJ%7k&jvEc3 z{LC7kfZV`V@hEa-grHj2GI#l9u@p$)4oHsSM)Clf=cG9hE#95fEFO75Pk(K=+L!%C z{_%0V;Lgc~(b}!9&`>XC-@7lJQ`ks*xzp^mtKm|MFxYB62`EE2~z)m*J$pTEQt z>8rFTyWU*Mu2)N(>qXBW_T&>alNt^{`8J~u(}KlLpbIk7@*UP{ljFROkCG;NJ*T^5 zy_U=e--}LyKYqLl*&EAH{pb93hqr@@huUENy8oyrQP_4rpNYh4*GYk{^u@$Smo>!> zfX`9vTPgHZ^cmR`u!XFNW4*SN(*wn%qdu$m2PGhYGktB zm$|<>d2tFw?2mo_zRX9{YMx3)%USyTc*Y~Wcf2tg4f6rZU_x`|z!VhFUMfmm;in35@tjjFDKT|@HMjf;7$@giG@rZz?1lV%s zL=EJE6?^k}Fxg&Ej$Z!?(Cl5IcV)#6>@oumh{s*g6xM~r0iSOOp{}{IP~l2(moxT- zP@F;516P+vMmV%Fg8sbDL*lmDsr54N(e26keML4{tiju}dLTALELVH0SXKX0vQ6Z( z52|CPPq2}=yHADeFzduGS|ktIr9%rXijiFoD^0uI8^T{Fv&{77O+ikw3PAuZ-)mTj z48>+acM6o3)NLK_eY3cb2y8JT5PcHb`52 z*Mywon)G!LGnCUMWI=uSg*1 z7vg0u{|O!(p#t|4?_1=QxWhUZ@eZ~AoVjwMXxciu^v=(ttaRm72OsBxREHUq>o+ay z+p@(b&QRgjlN$?`O3`mq;oAlFw~=;epWt3}m{K0_=bMI4Fqbx}XaBV1NYTXnnpkE| zn%A^}0?CtG4tKs9ige8z6q~e^+Kj&;LJ7fhd9o{4#ed-1$4gssT&lqdbd7yLYeK>? z5M~X*+O&1Tv(Tt>9<`Px!Yk0k^CUJD=AA6>^eE*5i9|i{ou8+*0Mvu3q?~Va z>%g^upvJn1^x2{WuT*FKlBHi5Q45?wsfAJC(A6nk1JbIEbR247JF{7Rq{hFWf9hqA zZ?qWv($6JgzqZ8FwE7yA&SqS%4L%JVBNwH-Vm>^{w{)O~yq#-dq(&2J$N=oiV##_C z)jUYqZf|I4n2B+)_n9GV!n?bTO?%jM9Dj3KuLOJ`#t2_zJ-iBQi%tKXkk$hKO9Xw` zP1*%a!2?4FpD4^Y*LFpmrP}M|(iVR%L#gomYv*21o!J6B7f(7={ns&?ILk*~o0Egvzu8>yBmFRcLRRdRMJ6}mWs1Hc^<^3L&!`qi}N+*Bu;~}WleJ^Ja zg$6!A!dM}E!(!xdP3dQ&De#|-Gl0`EnKS5eOoLiL1W=7Gn4Yz*d0ja><1wtIW9V(g z3_)7m9gMcMZcwWhn?&iRE@nIPHdl2t+? z3xtx$#9smt2&zwuCj*mm8N~+g4E(Nf-Zl#dMqcLs+FAX7*Esw9Fl^r)lZQIe8``q~ z;{5VC-tx6Cz$*M+j1z;S{4J^X>%1Rvi-~`H0U2Fpf&7taP!$ORg-~?~cxYDvUfA8@ zP3C2)4)lHo9m@AN!sCBGjPxJd59P2hDWoBARE3nucV;Fhj(B6Rg^XD@%-&7?bWpmG zyqb*@e8&cV!oLCNn!yWLYw-BvNJli|361RHfVdDZGA>{SHfFTUu`nUbgIFo-z&}1)CXP)Lo zFe>Isk?~;3u$dbtVk2D5z$Ei)GinB5Hayq<%r&b{|L1k>*L&7^=LSJUwW7N6Z@)4W zN~rtmSABo`Rj)8LXyczxk^lB9jcd4Og*p(bVfvwfpq;xptjE#KicEj?dLmc!mte*v zb9CKi#zFpD*^1jj9Jw&Kkct1!-wyvf%N%*T{$Jk)n0C5$Mg;ckmPywe=R(0Th+)yE z!gn!+wJ@y8xsUuzVK1LN1tWoo-S8{#1Yl#P+P+|2=Lz8ZC|fbFPQ~k$|{jzB8_TjmJL5ZR>D&7crG%< zOiT|dJz=6C_v6<&j>rmyAW{I&Z;6d*bORH$co=6`)^@YA0~DzfU%i*W*%E4phfNa}#0UUZyyWQ%Ygk@_7oZp^9kO{)))$i< zT}LmKpqF|xmpaOHW|JS65TUrA^YDcwuzd;_Z2a-0pI{8Czjz-+)||q7K!cVkoXoQG zi#LD=$;wJwm|8ILHKNg~=ZQV}>&pqtfILhLuzUbWzv+`t&pY8opOaJ`H)21vaV0jXMce68=>U4)Du5_>9 z4o;y9L$Mp+W}Jnj<4JS$t8-q1fq^YV0=a=NM=d?W*$4^xkQBa26`_L>H!pa zE39*3O$lyzm@MPID@@WjS;x-B=`=TYyBtJ z0Od?nHETExVjkftS~w3@2xdu9=hcdT+9jw6R)`hrd zFtiiPapN3A=gEsMS>MX6w13RCI-5ZQ8@GN-X^_BrqhD`eVVLL4Y@45CsoSANn!UvFmawk@TzXVVC_v(mL zkYoMj*L^G`k2!1;rb;Bxb{ci;w5CXj!0m=@ZuAFO zqhyq1pkoRoH1LgqBG9+BDIx|_K$xEhn}>V|w2T2Xcuf4HLTMzVYqBu=SlywgGVV3MOwjG_R-dl*BtC*i zs-Qr~yFtg(ZqNZCs`rHDo*`IlAi+@s9vIk@6T@tAiZ;a-VB)D)2Pky;28Dl5#Z5kY z%{0h{7B<`*Ns}Hnr=LtNBmJGGG)AU5&!{HvU`#SJ5URu^)M+|0znVF6el zV(?AqB$Mf^dW{_5QDByiv~OkZ@KCKjNAkX%%u_f94owQRFhRq#XuiHst`L?`0iws! z4_jm}&&M8k+688W0%?8{+#J!V4~0M2H1`#-RDck3v?|HV{LMbvwR^Gb@bwmP0O)UE zLb#V5;y!WcA%D7Tk#5HwZ43vK%HCI}2+2Xfj{!tMju_ZBh#NR1v?bebN82XQa1kM1$JwLwU z@h9}srCZUD$W3|rQr9>p{389NidUX&sBFtpJKR8~fgkToB-`J%Xl`n|+DDwLON>nj zJwLe7kV6CF=>UFL8JSZmTG>0oUMA@`^J@vZ11{Q5Kk+z`R!>qRcRG(QYSA-7KFfr{ z!s%Y-rCzQP{VC%*m%bBnJaazDOH29gcH}MvQxNmetD+f=21$(qt#|+YRR7PIk)WOt zDhe2^hTh6FXP4fuh~oTBE`ka~`Y=#$uiq{Wc^G3hN#1-j_Gj40enCa>n)aj>ZiDIZ zd(bAlqOrm1kVG)eD-LTa2Fb7Ym#oDB6U&&WM7^yhFF9khkVE7uKl?-fG*o0KPu{m( z^mk1#%+AX+_r*Vtgfa>?l6!O585>_&-*kPvaz7w;yNj;3n3ah6>@h$RuQIuw8W}g! z>Ib%VXW39-3omfa%HVLKG@sj0nj&ZKy{hipq5(3&z6F$xUsL&T-{o%+TYTq5sXA$h zi8)enO0;LIlB}7%SaQUN=DKV5R7YDJaa5>i*?fK=^FCs<@2CRZb#g z{C5Sej|5wlxc@L*2wE8y@Qg+Bu!7CJEfS>=L?Ca|7W-n5v~P2XLW-yjU?^UbI``D`t# zqF%uGhAIj-?1k7>9jAnh5x&p9u5r|-vs$HA#B7UNSY0F>@bVe~T(W!Q5_a#0x>Spv zZZBxz_nT|7ZaXadIe+i=DoOkZ_fbGe%q-i1HJu2fr7#63j>FrN_9=1TNIDr`^J+3m zO#s$k`)@(ahH8<0s2kj1-%siLCg4HNHxg^j9D5M`mMs=ZML%+F_=;`n!KeQK^)mcb zy5N7cU`{cg^e7<9l$Kz+#{<=)uY2mNJ!U=+jzzFxM|dbF0U=RwS|cko4l2D4dsI*E zD+BAA=Rj@B;Jk--k%)f1^qv)@I9(u#ouB3oAN}gc+|Vyh{?*t%yTX^ zM=k28u{C21G^!9D{onkdf$`LBX}msBCII!JP~%;^_?#0d$1wN-RRL$PSjPo+>LAm3 zWo?iI54bH2>mQqQqz_^;Fxy}A_+^I9IZ#;nA>0t13rf25OYpT}lML-e za0kP1t*wM~k`b#4te|K~ccCQ}gk7+KjUqAt{M=-Mdo4-b(w7d%9_+9SLT}+j98t8E z)s>(w76SFFAUW9zwqL-Qz;-#<$JvkZrDVI_`4K<-MsR}G?f+UAKv2mS`gph5#AD|J z;)pb?+47Y+d^v77EoMb=72KJJ`nCx z*A?oV$Ok+tl?D%(2q$JF?aLeRjldTeWu|WT6tdVFPQ-kmg9(i+AqLxAN7ut*g0Yah zOgM88m@x{=F>IQ1O3I!2Lhvc?-3JoqDHZ!^4MFwBdvWxNP;8|}s zC$+&`^9%ie>jOi=L2vAt``9qZH~A+%+_uysvlHtJjr?B=e$JnP6Bg}kcLM~cfI8rg zRTcUrFP*n_Ghfcvarb(ImREy8!M>5O#Wn~#T+}k!c4P-#@S^^$IUK+)m2HuJTnB*h zktw+_3F1W@&QAS`K8ni>b&2tmkH2Kj(N>5+e_@P_JX=2`Q$x>grf!#7gp zDBl~{U6<3CAB{h^Rr?m&*7|p*?z|wY^k`hoWcSA8Q-HT>C&Sft(zxg5+j_ur+Afwl zK_lulrW7fVR}3u31VF?KCdSY#gBZw#6fvW-B zs3N-&ai0|d8M2}N+5KgFnF~F7ZbkQRqQBC;HC%JrJuDISMvH;zv~|BeW4L!^ZUBkz zU&1btXnLccf6bGj*Z%Vq|KAO(|BYeg{Ddy;m-M6RIZl`!GN88p0jh&~)Q`ABk6{T8 z6%qxLG?7EKaSOU22wh-$7aAya*gQlRAW%5T;d}XSE?J?5NlEfjJ{Tt5X6yg!sN{d< z)JC8B((j$7&^$yxzq_9Q&a_9P^ZP`x{{K5stXsz=-;@f=pYGp(;aBu++8=PXuGoJv G_P+oz)YN_e literal 0 HcmV?d00001 diff --git a/ontology_platform/docs/crawl_flowchart_llm_decision.svg b/ontology_platform/docs/crawl_flowchart_llm_decision.svg new file mode 100644 index 0000000..2fbc290 --- /dev/null +++ b/ontology_platform/docs/crawl_flowchart_llm_decision.svg @@ -0,0 +1,61 @@ + + + + + + + +크롤 진행 단계와 LLM 사용 판단 구조 +API 요청부터 Rule/LLM 추출, 검증, DB 저장까지의 흐름 + + + + + + + + + + + +\n\n아니오 +\n\n +\n\nskip +\n\nuse + + + +API 요청\n/crawl-site + +Job 생성 및\nqueue 초기화 + +URL depth / domain /\nrobots 검사 + +Fetch:\nHTML 수집 + +Parse:\n본문 / zone /\nclean_text 추출 + +Page Classifier:\nProductPage 등 분류 + +분석 대상\npage_type인가? + +discovered/skipped\n저장,\n링크만 확장 + +Extractor 선택 + +Rule extraction + +LLM 사용 판단 + +rule_only routed + +LLM extraction + +rule/LLM merge,\nagreement/conflict 계산 + +validation + +DB 저장:\nentities / claims /\nevidence / log + +progress 업데이트 + diff --git a/ontology_platform/docs/crawl_layers_llm_decision.docx b/ontology_platform/docs/crawl_layers_llm_decision.docx new file mode 100644 index 0000000000000000000000000000000000000000..47c4569f32f00f70172bb522cfd47c3b817c2696 GIT binary patch literal 196706 zcmeFY19N3jxGfr69dvAV*s*Qf>e#lObgYiqVaK*@cWm3%-f#E0@4Y&=?y0&z;G7xM z%FbH5CdN0%_{RLUk}M2eKW&M0$ zCkhKbOts$=7E4#ym~($2dG4H6h*s)SWyt*JZst9O#Sd{>KQKw&rg#mKuHkQ}BK|+W z-9+!+B*|W*5ukkcsl7cxv1aDf+6b7x3#VxPMrY6I#$9f_X6|QjTonaJ^_lP!EhZJh zDvv4qt&e?$C8bDjxhMnWGzQ^`;vnY}Tz3H-vkq2~@0^Rx&TldOY`;qNo(qs58zm{+tsCNQCsbk4~wvts;GHXlk))s7g zdup^u05EG#%R_`h4_6APSbKXJ2P=mD0AA~MC8pJXP|O+SaFj#R^nAkin+r<&db>2KX|s6cxbrWFKz& zNJ8)cYl}Yic5*LFq==v<%V8LQa*GYZB@hS+ru4rBH&G&9%Qfgf3ZU3U1O>ODvze_6 z6XU<%{}a^zjU)L#4ZSj{&wAiHlF)U?XUJTa@>(BGp#qc1>^jaWES#>i9LD;J^)ld- zZ)F8S|I|owVtyfc*4rgp!fof5{taHLI&xGO{L-tzfbM&zCs;~YXEC$qlH(py*3pys z=Qz3axABl@ZLFvnJeb6npXpP*7>BfCPlu(5R%G91{+duU6y`dqFF&XIv*u?oFD_Y2 z>H5Hy^NV+f6Shy|`XiVN)}^sBB*gb`)$0$coh7%j#9DuQq{p-U&P17=Xk3Yachfm{ z=3UrRIusd35C0oJlIh*oTn}9ba2$1nE68z8s@-U~>wurFFMJQ8xc@UgLOx1p2=T$d zjtjxSzJMmh!@=2<$<)Eb%?`wX|ETXm-_B)yxC!8I@kZ?aP?j@Jwq?lH#Oo>VTf_R; zl=D;wLq;0OEOi5sZ*cdUd_-Mr8*kY?$qnMyN2=%=}yhE*e+A#0sCD&g* z9jw|yO*Y(2bLt#}u7vmY9lz%-ew#r)?ZUXrSc4x-Ty68TSm*X_F!*?}1QEKW^@j$M zN4W|kPqWR8m#TP&O6~E{xOhXYDQ_`^cmfna&E=xtwEe~_N?D(6BT`Dwi94e)$%MWy zD^aLKN$)$sjNa8Ki7KKIqOtG^mKZWA+*1OXkN8}fxD)i>aw6eLrQjbG-V}8M(q{|Y z_FU3xH5C3_(ylcWMqJYTXKJVFjveM2yF=XTWjI71XOq~p;VwM}9Wc<#NHu)A&Es1L zzoZ@Oa0>Oh1jV9v^zGoW+JEUl82(wITquyO!+d`e+bmO%d^WV%j?WYz+#)7i^GMgI zAL$>7gmzhN&|~UemJZhU?7+kQ8l%(4%S(QSv@se?-U|umad<1N33y59v2PxMlo)Hh_pztwO68^K!gEf%v*4Rs zloJeI#bK^{d(5=?KFBj#-#0j{L?T__k%j3KPm^$H)6KBgpOD7b7J`PGp{v!}hif?k zxC{JuRvvXEbzYt4?cL>`(4BKtMx)@i?Ls#u*pIG)l|xcHRkFLe4Vwr}mVz0AAD|P0 zz~aH)5V3FxZzNrC^CaIe{L&j{BUA`UlDV89d4d|;t)K~QZXj6oSqb*34$x+jcxn=6 zJ;W?_G0%1z<^(<6@p!U}d6%i-L@>33G}lYjT&Dl%61AfP1{BLS-EVfQTa5e66`1gp zfJjCKfzv#@;uC+S2V_fjy_0k~sued{YCe|v#XOmS)R&1ag;)HEH27q_ADDcbfe0|cO*uQO`%6pAFE7&!f8y~;JR2^7p5NgGI-lnl(D>F+o`@A8fG2~3 zTzygPPu}Q_fOcdojuk`bs)&ldhM6E>^)9fMA3oS4tFI&HXpHplZr9SlrnFpO zil7uxKRha?1{TvL`fkZzOjnq9i0#RorZ^+|wo-fQE(6-&d-y`_VEQy5;kWrO&!CgQ zebCt4gL=C0_YJ@ zpI`X0P>25t#0EeqilAy2aYLMvTQ5CE&ezWY`lhVEeZWg2zYH;$3|0GF%DNnyHT>=V zlb-sR_=RJjIxH#FKbYPHWen#fUwi%jVjLPG`|hJ38XZl^A`4R2e*M`*Dc@_5b1H>! zxx<9~+ew9)*ftL~)_S?764JMBqP$+gvNhsyiKf4Rr;!`{<`^UVwU9gTzZefrL`1)1 zYA^Y0d9P+N8ZgHmd8e2m1PBr04!tbTPT4s&n`KJHqkf-&HzOc^3lAt<`bsV?Jas;_ zr7t8C>?DS8nV+}AjYg}x*&upC@2OtuDseoJ^_8-M&(LlgROqMOxpz#z6BGli?JkkSzYzB4buWw6qEAdf#BgjtZXzaM}ANk{P zhDIT~j6hDt&6K^%)ssymuf8Tozi&7_3xR)>@*@UEbO`Uex%VA?5SLan3n%o*n}ay-IXB;& zO!S8u=q;1~GP3Eh%qD9Y29Ir9HB3sA!R}y$t`>8M+i2}f9b}_6nUNGrcF*d*r~}@2 zKX7zz(mB2s@U@dytYUD<f}m_+CLs9 zm-mGDj2!x07-uD#dZUS9jrq4cW#(NwZKhJEe6G?Vawy?$GZg&HiKfh~r@?&=|K`Hh4RKOii)MvzLQl*7ZEH!j29;PV{|Cev# zWLmlE!~7I_abgtg;iT%!4I)8BeyQc*O?PGR0^d9Ns6{dh;Z^pkwVYkG6q|GUL?cDW z#c-IEZl$pqByb)KJ>d2tmd&xhS_rkw6?oJwreL=tclOP%-G$DH}( z;Z2_1UkJS97eYrz`&UY_8K#+zrL2RKY19dTf1}2I5ZOlz=+h>@_jG%mT<1c7Ha9LB zHhB69bU&Tm(--N$iC=^mY}+45xIeq}^t=+9(k3u6$E8EQnU{ZfDE>7_(Xz#8z%jO>`WtimYqYCH=LyL!b@y|6^F_WmT}>G#Vk=e<$>r#oYlsN zkT+-l*>6lf$%xv}qYYyj3pJG#CX4F=x>md6My*}(+@gl3#5c8*-wMy(qJ=aa=jMp) z(7{dEeOoAS{#y@u7h+}#I|UB`@opGy!qg9QOY6-kbl3@_To_p}*diuUna8XRfuH9I z`#Od8dP;NPc=9JV1#nks)C)UL#8+F8VbyZwJzYVx%k2tS=9<-gxE~k|CzL0IGpA&t zE*X@9Dvww1s$4`lrZ=u>W0}IaQtRQX({dNTT=NF965ACg@v6C1J$Bl-2kMn1yoMVr z67KgDp0wpDdLxR(!;ad7oAAhoV5=iuC^BXvC&|?`$J%F&MDVNC9S!Jn_QlcJ2IicJHhA+;<0ejwhzZn^1l6Jtv0IDD z@Frx?#mC6E&e=5z!aCUdXDPNGYM%<404&Dp)W(rF!J6H#h@HV4E>OCL1=-?hXN`EBzPT0gBnTbWb_ z_cw9&`rk-?vd#{+99Zd!f?hi9Wf!Xc0#2#0Nyx$8$Ft&ke)w5kUX@IZ;QRHH`ove zQbz)BulbjIcKDYe-8Bbp+fH0*xL-?bB#bG77GR;zY7^AF?wIYI&7kCyis>51u&!T( z*`9lV7Q`%jxq5+AL_M9e6mS|EX0#1!BeI3?IXye8;I8jIfMVe>Yo030y~WiLA_dG4 zBe95^((5KHiVAC%nnD9p6S{fqQ-ojnb!z4(?vNhJ^2i1W;p-u5+JhHttbSHss>&!7 zWBj%^Z>$!aNC%<|XcC>5PFG|lRKpog`Om+FuTotg8(*U@et(r5!S42;<{#VDR+)Vf z-rZnM$X3G%S2+CuxKYTpl8&G`!f9mL;RLf9feGdo4SUGdrJRP;#Z|o%Gf9lENH#tP^ z-p)4<<+;zk|Av!EtwB|Y0*|;FP3xv88_&$%{OhTHvd+idhU78#dz%qgWfwl~m=Sw7 zrdkiCx^{}cYQZWjCB3rnt7b9IZh^=b@2HrDI7maiwFXPH-8C&L3B7o%vujHDM7huX zP?8N_QV6CLnd6KOyCtTVM-K+m&;b%`mVDC&z_PO?iGqWGxsF)NH`=|2`X7p^najBTh0ZJ-Djy1PoW{6P1O{%S>T_^_rI4>1nr3E_qH9g|A_sw`HsUL)i z3!I>BJsK1Wk3*26Pv)x|z0FCZHdd=t#+8=K1zru`6gaA>QQhdyes*_nlK~%RG)YvT zOBq#`LMyi+5><;3C{a4jnA*pg>sb*`P5KbVq#t@MAAVw?_D~wbs550<2LLq@L|7px zoif>^oQ4DGij|{EkRL=P6i>L^Rp17w!f1?>sI#zA7Mg;9kP`_BAA%s$2nd|iv2$1- z{Q{sv^s_@x#N4LHMwa^Z>#G~WfYn?)gt+oon<&|YUxqrEjxJYy*!Wco!`OxjD87N$ z7nm^RN7;X2TLVUm0HPMDMHG1^c`k{?tY}tk9UD1b?nfCJ>PKCxiW&$2;xQQ`?G_6b zh`h0B|0Mlyp7*vC>G~%t=AMo61=Q4Y6U$tfgBUBN69SMSQ}P1IoUz*j1$4DV<<7X4 zFgDfP$ySwTt&p~wjaA~*o6FyGdLNRy7AW=V`=g;XpC1g_f8@xB(~M&=40uDju=g5J zz77!bZCle%nsPDbrKuJ3ozP~JJj^Xz;l?X+ADP}Jw$4}-wQ)xrL8TwH2HIu*>1P&W>WT5DHZlbP=$57t76Pd zIw>Wx0V&nvU{4-3Y2fDk3M}m#Pxjyhw*id?b?o5D)Oh?rLMws);$?-*0d00>%^h*6 z7)$?;5Abg(jm`=*u?!Q^QK-*OwJ=8sLcjhJ5Ni*5s-Hm#be6q`n@ySa7h22#c-mgB zNPN4ajgd7wS^m=U08%v5m0G@q+T!Sa&j~-xi1qTDqxUN59^67PAA&6c9^T(PT0Iz3 zubuP{*f$0&ZS#}N9T7zu*o7YxM~cfbZ+bsF8Ji9iT~2gXfhlP%nrxT+STkjfyR?`ZA58$lzy@I zgF9rXO=c5TXY;bvq!%QByZYAg7e7N16%*qB6RX_h*S zLh@x?ubOrfB`LC2GQfe{+pXX7@!TM(=ll2%-vlvA(_fC~Tx%CkhIZ)7g%e*XM6kQu zAXtfEbHc@g;v$sk`PLL5H?xTP;TnTOIur{_9TwC``2^xo0?h!;5p4dAaT8(J90jp{ z==L>|d1M2ucyAXBe=$Bc7c8F%;>=OwE{WP+u5qPYaV{N_4eQl9lD;-m_&P@gv1ts2 zsa1uGLv3l|H<$6U^AZ2(WnE$aI3j5K&ZDO|C_i==J%b^y^hYh?7p$Z?^O5NRLa;D| zXA>sH988fy2MG#%-gE!weQ3}=8GHZ&Z(u$UnFO=@YIEQxj0rH>;3@nYWdX3;n=Fyr zw|*Ju%I|vz&Xz-WN5CX)8BqvBcNf*GKHK16Qad*Kv+u3iUTgB?feO=H347?U(vDkc z5FP<=HBOW;A9&3Jo}-mr=|fRPHAgkyN6dIQ>lHtLgfku-URnc&GwX_&8lsaNehAwG zeZo?yj@Nhu!w^a!WVv<&FVQ8^l<+uv8+ryf4--Igb%~lWprgff8Oi_iiCcMP zarwSm^2%n(PkdKp1DDN}m5VMWaJn0UlIh9#xvB;KYw`fnQS^+9(=H`9G0DnXfSwq0U;{M(4R;}u+!5)&kDlHQ5LQP{Sl z#F!d*=J*V75!zoEW(MZF#nRtGlc5{n>CbV}DX5l%oxVdn(dJKuxE=0$?lB4sceG*E zY6+uhBUuaUstgrq6BpJfA3bAGWD;b zBJ^6SQ}lq>NhSZ|j};SKnI;XoCg&=}*ISMubd5LeSveEAk zVc>*GP!N-{G-2^vbJyDgtIJY-dZhzUne+V!OC1LD zp$z>V85xM*05gK`{sX57O^gVmV8gTiC}jcWCma7C6^wK~G1gdVRb5%ZYO{pk6tTCB;s0s7&3z}Wo&Zh6^XCU3JDt4o3VJfMQB6ne`|(n7@uU|b{U`S zgLw_)90w#u3kCZ=5dSMgIw%_?u7N5aG?2i+&_O`^4@8sl1S|N>*#DNO}T?8@8d#hVn#pFuZBI<*3iex*EcR1ddGhB6YX% zGoKOuoX^+;WDc zH7*X_LD)JbhU707CDJKfsu5+Q)Fjqdq$rB9??IBkjd9+B3>%Bk(=F|=KjL1%t(10e ztZ*1KPArE|S_8Sn#}ia1;3Py-Z}9Bj@*N>Yy>Vdt{`#_6L+7aT&l;nT>MW8olqNEA zwPZ>lyca#P&37uU$&o+CVVn~?lESxyL@FWSzL!5GkUpkPWI)TB)-T7HAK7LA%7^n~ zdgNAakfjkH*@R8Cq) zclZo(9OI}ehD zA3BTK&YA?&Hjwy8l|k3Br(k=&m}J?@?yV8Y9$GvcPCO`@*I!(9OqHTsli4Vlakb#A z_X*KG^t)MDoUhKcj=dm79 ziqC5}hZmOeVmSq2@=6@h zGbm$3VzP*UuOHr7eZ|BmR%ayRd@|)t+wOn7BkhC~ujw+0J=fP1q;AS9y1oDU0x)kd zUVa8;11)HW|7;; zn810fK2BvI<))I!cEn5)z%WraH443^y`9J~VN8vVX6WunP*! z@(TGqDBo=bbE#_2La(t&AGuBZOQh0e6r3J>P4x1*Gn^+ z_3#V2k&oGtGZN^c_jSL+xlSi`BS5N&kwmhk^}4RQ>UbXV8HEa)j^xT8TR*nCp~9m6 z>N<*AZ1zwER{r%(7-r(#X*X(Jg>pAubR&VMb>77Pb}CrpM-xZ+%J|1uDGBiRKpK=P#!L>OrQnG(#Lng0<&QRx~r7S}PdtI`rCgaH0KZlSbA>k;vF2e^YD7Y?a2VP1op9O!6NbA7GuuYJ< z=iYz59Ijpu`MkTxRDL@mGrsM0ch77NGa3A#Aws>to*`z}TSrG97NDRXhV%&v>k{k? zaBw(+PSTYjM07~a4Mz$5ymE}U-{VAIc-KRHr#d5p&OlPMA;-DI`s z>KAyN1eamsm9m2S`tvvZP@P;M3>Ot`9Q{|LUzm$QOT}e<-y`H45PN?meROH>smV13 zq%Fz`Cei*oPe8mH= z3PTT9!jv}oDLf>SfWeC|*3bthD$c(k*Qr0-4(%w+x%3@(n?ae_g+qF&@x;Dyz-=t| z)MepoCH*dEbV6$uD>bQ{8fEDyFTqI6fNBAs%Bf8mQsX?GoM_*ofiNdRAM)|7wG`Bfak z0vxQPND&cp+Hb*qD;F|sv9@FR-)kPV7Lay+k@lH+P1vJ;C!mT!!9L;I z@NqBI1YQs-%}z}{d?AlHUNP{-t@cdOC0y152o6mq4`eN;O+?o$ovmkO-FqzEO{^~- zpD(^PHFdsO5)$$^*$epUbOY@_Kb+dyTjyo09)|lKs^eA$4F6LAA%L#`HBvCHgOLXV zcL=b5KUknw{zFsQnVDJ{FJ!T)s*5^sWuz#M1YFIHCTKgX=_2Kq&? zXK?fGE4)k>;vyrZt?-U#a8wJ#ZnHh6Nzc94pk-4T6&JX6*5h?K9QMjZNYGB+r%-|3 zC#P&_1(MJ9H9ZeS=OFq81G9pI8(U%L++e?3u6uQKi@TbAs!-hK(aQ_>|AgIi0b*F; zF}0m!mlD5gg2&R_y#G2qHgxvO99~f5zpc{DgNF)26+C@^Szs!*>b&V}$n`tx6YA4$ z^1iIo_bIWe)T;Y9s1t<{A8(lHxn1({Lsx|^Oiqbrfm>-y2RcSxsMrQKn4zGS!F za{V(lT2@L*N&y9v?kkaUfmjAh@k9!pZkNs>Pm?u=t*2?0#?;wj6``7<%&zY;Kc56h zJb)!&K!|_^USzVp#$UrCy?Pxu;B(lI@71=pzJR_jdEKkE+PvRlR?99^=+yaMi}t6v z&mW#7o1EwVxgIn$|DJ}#7jT}8uIXg;*y_*Lt3<}<^qYI`V0!akuCyxbaOnAc4xgj% zUGF%;AMY=CQ|j9)hDG};i-l280SfdUnCK89!3qOkM}|g5j=fuEfXBP{)0c_on=tY2 zIf~njR#%OxsgcTPT{hx3>#`bawmxgE3VL+m%+UiEemwk5pP*{c63{D6EMV zyTwkIk*CWzYb;z`QhHc#@$Jv^Xpf<)Z=4NufY&7 zz>WNWMn^mRy=xWnx0-M5OCT1QXju?OcAq5f)+^d>V9z~ z&%euWWcs0_*?zs-^z=@;N73i~Q?anHu)6i(W7LCO)8LyWcLVWU%NC#DNL&Mn=E6+ca_%`FtKT-Clj0@Hx1QSMr(eUyDF}b6i0~ zOR7WN_F`UUn%enI?$CbeugS+--Eq3LOD;kDw@F4$u6+IEgdWB7Ac(i7?T&1@C*hAl zl}u1JCpY)&fZ|*C%^mM5J<(d1&y4Q1|J`k=A*cpUUenOYXbTk$A+5{j*}(5pKchH= zQU>#Sqs|Wmtt>Wsr7oS6@f2DK35j1nY3i;!gzKE@>YUCwZS^|r2RdJ)O90IGEl$aM zdn|tp4eMQB*_XE$ffdiuSahk+sBkP_@iGeo|H)YzXQ)uHR|Yn=M(Y%r*MQ9y+fDap zLE?9_zpWu%CUSBYCW>8LUgHlyflnn@SGBDe6okTOfe+)S?AOzE*)&GCb@^qz+4ITy zVp%iKk(-l0CntXpu*TW#=5LBH;*p^scs;J(N`U!kh5-SR?c2gb z3+ktCKv*-or~cZOtBQO9l#Vu!b@5E)cENVN_VQX9Iryj}NJYm;7Pwg8^z-TBY3hDC zh_!~*hSe)q8?&kIJb6&jm0mGF|ALHuIr>E?qkZ&b3>3-{*r~x-mh@_;XZES4ycZZtWO`d$E ztgHbG0SOhpmgdu$9aame50^}Wz?Hs|kg{_1s*gJtpuqcw&3vQ7Mx)nKwpW!78-Jrc zw_exBhY9FDt*fUt$GLfXi=rH7zP*_;Cs5c2?vRpDoY1FpQ=LOrw>~}1^~g&ty!`C} zdYuj(A04)i_Rb0$vROMG?0Q(m{n6#kn|T@CpP4djg$vexJUWt?%Be}9|DT2mGl zHrs9rcx(m#9*}%|zZwAnt3=TMpvFY-^&+c+v4`YZQhp~wc!20*nQ%@yF~XPO>1y-+ zGcZqYT(rS+to|WZy+X};v0ht&(W)YKs$8wQ)qkLb?K1i+(?m<4<1}#(OjP&4qlcJ* ztc-%pHVp}A#|ivFPBMuK0`5%V>N*T6q1S>PHv=O$%2F>N&-8v&An)1d;P!Z)jpL6Y zlVHv3wQ5Pg`(`}uRr_O!jeW;yCa5aExLK`CuTJJLike{iv;@Dp^Dqv!bS66)V8GOQ zH{E8Dm%BP|b5O9^@%-`K@q`lliSK~OpXhZRv<>ioi}3t>9z2*Uo~VWKc)sHIa^+ds z-g*grz%CNI-Q#YPF$s9x&5!HZO$|UH%;hM)n(JCWXX4LDHUa?wY?YcMwEv`wb3sA| zQ@Ka+mE6yyF#J{L?rtrM*n9=>LjG*vbn2C{SpnMX4gH>;u(}-b9^M<-I^3@|9#_*o z9ol!tH;BIBzT8z@JENodF9hUIc#pE^*}H7M#V%M(k4cwp2Zzbdr=bGcq>PO8Hj@Vw z!xwj7^@O=xo;n|5@3HB}XP7}95lX;76Va)wt2<>HeMkdqwc^04`u)oKk+g!4`2#n~1=>K2_^+UVinA2hD1nsKBXum|+ zWcau*KUlmFM$&Y}{~yWRj^QtsYY2o2cwDaeZHFjQQBzyEwg+c0+@~q;S9b%Z*<$}K z-2St{_!0evAo53n6TtsEDEnu0yy7+v?w3RdO}FU{Xq%-<+3ju+`kQQ)iSHotK%?#z z{(|O=mJ6I2IL=w$ukA6#{pw!1UCXSLzf`sTa)y5m{BEiB#(e^k8f_*c)9Mw=00FbN zh&-r*!b0y{w>3LXecfW`AqYJB0PQaG&9$cU1;aRvOU3CH8#e37m!hJ^3Hh+Fuq~fs z!FreHyTgf1&&@+c{&(xlC-LaCD*cw-SqOBLC2YgTfVW%G4Ec5-swg@JtCnqyt@V7X z@Z*{K0yVB|S{2vjq^y0%>)QRyW#VU>I|e#N#3$d`>hZQ#x3T(L*J8Q4)y5zHAU^iF zIptIQeb(^=7CM3GsL3AN$n5CIv7Kn8IZ9Sf+=E0=G)&koYi^@-?x$|Oa{Tk3;mm(S z^MldofwnW2Nr>ZVrctXJ0bo5)y43JyNORl5BCPx$@ZEg3ukXxUO|6aF$GGpeA8>K$ z$yUnE8hDy)%o`$Hrg``W9_P(X8~I4N|NiMq1jVt;LhE%Fctj(PK@TA0sYe?$QRHWf z@R%&OxX=oqgeXXagpKXt&4zKxaTx@;yqB4YOCFD&w>MrxpZkG4$+!$wkG`WRU61QX zX(>5S10k}(?7TTFIyDZL_jEwOaMSC$hu8JWf5GnAA{_+=A_zpe6l{$@0JL-&PD1H@ z_et75u4(`?*@KPTbfhgs8S&!n#2wIs1?{wZD}wXVC1i$ z`S9>?aSx4ZiNbchna%6n;T_QX^LdDK+xIv*q-(iazk}HGAw%6}X$!=luza4Qvxa9J zJa0;{QYA1zwu0W8e|m17vstiQ{mJK#R-NxAPt*K!gYn@RL3~`}-v0i2qrHIX3DZ00 z)mE29Z~kv=Lq|utFADD_O9ev{PYzbAozi{&%cP=pxLB-aD_SIs9YxDKc@lD&ACl%X z%S?sCpDfmTC^OD#S*e+Z`e3|_AnP!9)wfJRF)3J=E(_q+idp2ztE-#z4 z#85JmtxI9mWu5 zdWJD3;43jPa3KG8hJNDm_M7E$_2#Qr*HWeS^G3A8VQuoUfw#@#SyLMu8A^Y=sDx>& zmZpHLLJOGDIP4o}NR|>KrG{$>+0pUw*R$R7Z%-hhL8vB#g^$nacr#;#$J^+jk7EF; zXwvDT^4kwb#%D$Rb7%PKY}WI3kz;V24U&F&9`^AL0s*B$;|r)t!mXU7S*raK;t~WG zx(LuV77~WnqY;6Qz4=BpodEyLVU}W9EG7d!`TZ_bK5nzMm`);8&`6-T!AU}%LF8kuH_a?VbBHjxI|tTr93$nH^n7o;*W(hjex(yeM#(i>bD&K zWo$#@!SVvp2w)}^B#mmj+PTIQtKLn`kEx6f5*_T%A8?Tn@%5`j)F z-Aa@F;zio;?G3+o##6bW+l9{ZLj0=u z=BJZ6JUcsk+k>LT5n!Ad&=dP1a4n%iS~y;`T`D)@kE+{ZXIRe`5{87>e01uVl8}Ig zhv#kGf-!&nX0$WA>BI6eEEL{-Do7(gQMRc7g08Hb91pq+b|SMAS968^Q$_oAiMm&)*`ots=MEMySU8oU^_JUiw4oR-{n@Na#MgGHb3 z0%p4`o$|MPbi73&&Tw58{RiW_jj3~@zI&-{#r`v~g0tD-?lnY=jeUK6_4LMjTK#~r z@q#~OL4Vq|r?$rEuzY+lvZ-D9&=C3Eg(0Q&%j|c<=2dD`$watUL3+_sQMtcHsaxU6 z{-Oa~;RC1W)4%DKJn+^C`q(bJ%>N~<)^4x|B~~CbjZfU(2^s{P7e2V56UGaa>on26 z`W9z$+B}%F7kPn(IiXouuF9+1qy!0rJmJVOmpYYoFpu-9J6_xkN`vQXyqbNUbHPKx z%`GVV*=?3$v%Yi7?{iz^bzirrP~A&>{dJ2`N&z~l)x12}rZVs!^Wwe;nBCb8fkB;d zT=p>Zn=Ns>7qYhmaa>u_94MFC>h_ZyzkWD45UMlY9g4(2Bk@_$so z^j4Dda@B6b=y#LX0v#3CCo1_QtLcdGMY+JWOa-3|6^@0hyWfo5=>wX6~n_lG!Kgmrm2&Pw_D@k^%4iSq`0d58&6`pvRHuZ0I!T z4S}QWtGK<`em%0luZhNU*-od_97xX6((lfP&2~C$wvL1UWaY&tNOv}1pgp|6SiR^eD6qCdXx;foL^fvHXebpwo0jb;WgdSEk;>x5` zS~ynSYG;S`818nVQXGb;9&&_@r%T?u(qPBAJ+qdL*Bwx*Ie%?ES9$yHAdrUljzy<& zvAGQN`J8$N>40xjiNueu)_d0r23~+$n8)+OH#ksILy`^;cfVAZ!{ht@xg!Li)u_}G z$gBI4#qG1z1){v}&$9_8zOwT=Y<+)Kk$#{r5gtDNbG+`=`|)PWL-*TWXT`Fdrhl`d z(FGep2=Ze-^Qaf#;U?jKJd$lIKp)XZlWMuV^*sw?F?js{T0)IhxA+ zTd8aZViBvgfDbFNtoZH|KQ|3cE>hCn<__Yq8(kEB1wrl>$#DT`=>YjYk2z?5;sDx9 zYOkSVq4|92ZGpD+wV!zj;j=aIa z!IJIuHj{Uc?H7kkO?^|-LCNdxhnfgrG5}H6<%p5%vr?9c3s?zaik!#gf96Br1uM4M z*4ajxD9LsTjnUVVkXn$_L08k|2TFFV)+*Gid>4>4n{C$5f?{MyL2$|iTvuQldbzx9 zP`0R*W%o(`P%WJvbv(^i0|jp8cPs0+r*Ygz_m%Z-6N_*clcO@Pd+g8eJEaeoT{YcB zLjD{eJC9WsJkR$ir4;yXZH@tNztVbIU*YiS_Rxy--uYA>?c!7Pp)ZUB2Q|(A{(w~a z_x+M^Z+qX{^ zXK@eYeu!5>WiC26kYn*RMOJl)ih{!TO}uAcQQ$dDb8GB7VQ2nw264}`%A1_`_Vd?) zfjm&A@Vx1!s?}a2N=ZTG5AwwrH@*3v=XGBNx&L|k1gUChM^z@gO{fPQqoY4Bi243s zx2igRw+mG;;Cf)jWq!bhNxOf^^mGNAhx+04Vut<9186m|UaT}=;jun%z69ln0I!4e?(GjWeEc+{2#{b^sLEWt z_uuKGVNd$U8CIp)-+#>3vcdjKk3)c+{Lzt|Jqnt>3$4nZ!^rVSm@FWd2Rwy zd#wI@zv3i`Qw&283~)=>Z*P4Te5*(YQsM^&1~_du8cjy3b9g=MR@?2iKExZ2CbQUm z0Ow4Ci{;`ALZqp{9`ZZjb)D^6hlj(agyiwfbsaQf+5^!4#sf0k^y>~tV0i8&zE58- zlArqnKD;$1bg#W>`~;bq>l`{iZ+Wl%y!YU9nA&c#8Ak|BcI`lm#$^i8->KfFG9-Z< zm)+y&^mMHPvT8wYQ!1l+xm<=yz-NnV8A~xM;5uH^-~VJAD8C?T%IF9CQOoH&c*1+- zMKSP}vhL9R)H)rY86faHIRGCC4;es^3m65NuBZZlyNR0aYp*A(#jrI%=;&^pZnVrzPDlS?(y|2ISb2P$}zDZFzI}OIxR@(2PpZT>3UdlVd_em z+B#b-Q*YG3VQ6RU&bN3AbOZ%1h^MD)Df>Z&Q+Sc?;`K%Y;y!)O=NqcbJ@ii`e&GE2 z_LE;t!U$`;!0kt&B40r5^Vz*u&%f*uSTkV?Oysc6s48}c1#s~VY{zGD*ui6ZzkcxU z-86t0#A?ApK7$98o16TzO@|Uedd%nQG@_v`?nlIvUHHe%>SsJ3tLsb6=`$4t6$&x4 z_sh>YkR5&D{K2dr$A7dkEt$rk$^#q!&yo*L4E#Pr=y5Suv0Obtb|8Dd9a0XQxas(y zL}ZMhp#^!moiF1Z|FAXCHl)CNIJoX`+7%${skJgO!*4*(*9pp~SO|NL7v^q99#r z>?l>~AP|uz(xmrb1C*}x8WkzhdkZ8gLgeJwpVw0uOa-DxKN6lo6Q1f z&&iiK-ShnXi&$C!9a{X9MQe%`*=QpXb~iiUDWN?Siwit!>(z)pax;kzi~u*Fc1DD# zex-Ci;5y$v(-iL+WI19je{eN(Re?hX7kwq(?ZUZr>G|nLd#JfO$j2-^3}ktHyMzb` zo>QkjrYl^zvbJT#BWPUJ1qgR?KV|+mwpB;ZC@xqJ<3-8Z7;+sS*Qkk$RJX5Lp8L0? zKY7mY$lJGX1N{BdAq{2{VS|;Izj7tVqwpy`JA3p6>dQL*^U8MsNq!gdE+`}4Dwl8W@5tf~v#qYX4vpVJkSSfpo-#YLsAJTp6b1H!gaOf#{ zw2kpuUHC3>m7cr;1`SzxW$eg6g|+kc`cgr`nroiM&h(_2ocqHmoeA5KBr5CMyBqGm zOlK2>L=pgmC?~SC&A%)t_-&#VZJPs-%x(}-=UP9ie7kk~_8#r` zFwh&6{J<1-M5I-86D!eYYZh+nMqbra5R*y;LuFKd6Re2lADDSMKQCDE*6?t5`JHu&0zLNh`+7G>L1Pm8k<;M%DXy26|w_JaO&;E9s`7W|pL8$^n z&SF)#H9^XYHkqO5wQ*tg$!<2VbPtTh^%)lfU)}E1P#gl{!`cwg%OsPA7{1|ZPtx$7 zm%J~B&9i4Sr^AQb>nx^w5k>af-pBWxL%Vm*@>iNU=l%8ej5=^SfVlSw3b;S8dmk27 zHMhcq;$C0i%$HBTE4%qUmC$A9;*#K}p^!McHtS02@_~D}x3flp06gHAKoVD%nvm%pH05+!UrR~&AFnNJu5#vmC*hETk@;v5c9 zut8l9F1quXsD$=i2DqT6+>RP{gKuex=FZifZox+|a&yd&RF_}umR9`x+OwI(kf~@j z&Lc@36foo7TrF{Oz@02WJV%`HZ{EM>$g$dLIN+|EZ&F%doDBpFWQerzkysWEDW|TP zBe+m>)aZ)3QdhR~&t+~6h012AXxM&T+iI?3Pf`G1Z!L^p9QOX}*jcysEvt;Oe=b}| zL(h;W^6;k`_KP5v)gSiR>bP%JSC;FDCCY&NW(@0KR#Xnrb-N z`$VPy4kE&84uiKgI ziJstLTd!}{81@*XIXXH{ug{|l%TKS`Cl7eJK3CWxQx`F$dUU{^>=L1TvCC=7(K|b-y~4QlGHbsUWjg?&Dktl+$yE#6Z?a05SeP)d#dKJh zzSuS!DMBK0hzLBLl|c(E`pxXh-3#Fox7*I)5TDL7#+l;7l0`*DKYaL*rV^W_S@{$= zrpM*aQ7iB9mXGcZ>}KjVPr>Aa_P@fp<=jkMhq)h@*{k44zl4*8XIw2m6$HJz|ARVb#z?TL;6j#qpRDCJR__BHd*p9zUaXt zxRtJ7_>_#J_+XRsVCC7@WQ(uu1we`X^8C#k`Xy<|BM!u;S1nYgtEZ)u&_%9;>o-Q2 zn3#;^t$g@!QCB!#sz9hpd-$!sY0N^;T-*IHTq zYJO2lDsLlnUosMd#;ZBmw7>m(f#`kOaw*4vKAt)aZ!IQZ@rKWr=x$fHeFmCxx2kH(qJpTX_tRUoKfk1&Pu<pZtx*i2M&16_3II-OREy0biYpbR}X(bH5<>vY>hmK+`EqxlD{%fiA9h2eZXyu z_y`B*>4Gn}?M?9%S7l~oUzc5lV|!m&S&lR%O=CrjhG}7vzQVHAM&mw8s!}klwS6ChW%LP{&CyIt*e{d+T}?R(~C^LVG^{bmM}6 zfQVtWZGDRj6Wdh->{AM`8o=0=L1x!iQ2|l@Kh)*q1!ZtPSw59Tz&?C4&i1O^Rw}V= zF9EzSCg6AgkuKmRST@|eiYH&!%jEgEJQvG__bbrR(yZ5GupMujNDc-;? zryPk)x2)K}VjRje&sJsvE(K=alAnrCv*x|-v01x8r!g*7v?-g;@>rqA=>*37wW`dG?c<3Z^Fe?-(o&S@3^#IP=%c$zvc*Li z8PEAmqTk;VF26*~%5D1->OR0Rfv-XLd85kbt!welnuE=;Lf%kcc&}fl^tEvxHP!S0 z;3s_7?p8uQo(C(yYuN#fC=7fE|0z;`gPojv+VR7;Z{2E|s6Uf>=BieD>x}QXLPm;b zBhd68b!6iz{TDZ(P^{C`y6A`Cd*dAr;<}bLmyT%{lQ6R`KY}<&mZrpT? z!)(6B#d4~adIIt>zR_AM13ZJZTX(Kjv1_*FtJhMF9bLr)j4V93m#YnKWoJCz-(1p0 zn_5Ij)VZwJ@`5aY_I3U#ScBc!rvCa>;vek^1cj+UGHTR9kGS1h{-#KsvA6&z7zZ46 zdBw(ouC1XXehZ@XvvZ^D@L`s6!Fy1^8r+|X;`f^$D5V0ZJ52gQLh;DJ`pHalgHU2T zT3T_&Yi^5YaL4Aw4UP8#Ps>RMfWaY)4wr%)~n{*KO3gTkF|wu^|kc zQ$`+7%ZA@4Usabw0;7^wy#+9gI)XHN?s1iEot-wb+yh?D7zikh|&yqVm>i$Hkd3tt$jBn8*P z)eX3E(uDfD5#N<55Tkmp@}^XeG(2ozCb_?;So0lAmkX;bE|X% z!_`};6P*64_NSztiA!rVJNL@)?c28BUi z_c!NhPT2O-oEUG7mbPS!+rmJN^K>2^P8}}ug~}UBv*8NIRe0N8hrZ3#Klxd@-?V?< zR&441X1p55Y=_rKD)KXPa#|@T(&DBXoR4~;+RyYNy{%glx))(ATSWyfco;aTI6V`O zohPYlfZ*sMJ-(=APwjawQZ_d?$LfM{%T1jC5wkaV6X4W0>DY)34t{lfqmD1J87e>} z%SsCATtRQEa~?hjOyc<1c)9&>nPX?nWV2rDK$x~G~>COH}5CBWNlM7e%gf4UJ*``TxG4`oC2ICLLbTye zEVCOF=4)YONB$O9yAfyN;o%X!D8P6$a52LzS2t~?RC=V?qPZs`BI2=q^>*9ie9&A- z%jIFmegd8Z1r!=fUH9XHgo2L@=9f*DMwnM*Pse8rqio2K=UKQBVa?&I$U?a{`!VJ= zrbjRog0~Nt4C?Re60~Kc4~;hLzQZpodwC;(&b2YbpE_~tg9P|d;8SM@$zc77_7y8n zyn`Y8f;l;Q=Id(%&<0~0~L=C?hXosZob&FNn?@f>{* z8O{w;O*vvl>`=_3o8py=C0gp2^vYCwh$GiWH^cn1qN)KNBKlHx7dGUbNTIz+E@Oo< z^SO?x+eAN_DIYF`dyl$187||Kp=O}D42X||{@y!aErnY1`uZvg$NdnK6T*SA`j=La z0p5T$(i4oNwHFVO0f42vyFZZGuf5I&w&$I7yQ=l!7(XUiaV5mZ}$hTrA` z;+3#j&mQYnx6;)Y61L*!Ccl8XAA{wN)wXK3IJ zyxz+GumF@S(b&Sf#q~1tW$>V*qZ~dCPw-*K)RjI1Cg=a|-Kj0ld#rD_rhq=MEG#!~ zoUu0!C*az-7Tw4rk=R1}g@izPmFGb~<;ikHZ!I>>xX?E)g8kszhyPeyADy0;;fP}8 ziGnunsy z^>q+pFhGp(lg3S|ZS-qToYo3)I&tsV)?5SsT$Q>1&B%Kc#$#t=(j8a2W_j1Q<`RU2 zbSTUX%I5-H{pt_#65W~9yYhbz5uu>ZqA7RTS{c3e90yM zJb&oQxIt(k6v1HCmf zuOXcf6(zA&)bwSye`?ovBYSg&r)whN^At-YTPZo=gKmv;7_14EyMy>Ua7 zl0Y!oN#3^Z6QOg=^nY9I%QNV_N15x&(yn|8tf30Pe$^g@UneF2t?i5J3r&>De~dHT zeSJaPs+F5E`1TmPq^cum5GR&X_c7lB&ZOTeWqT`@)>(q~o%$wY#2GFDdLZG-Pt$?E zSYv|IKquCB-9@%43f10@!;fKX7k z(RryE(bH1)14;dNu@kRT+Ali_p7-HkhW%kau>ThG&j%U2V?)u5Yt+6U(U*0X%(c;zcWsb$dpv*E-W>z#Q6E%e#r%i9vZbdfN|IKAFpfbW*oc?0SG_`SB1~c`Oa;Zka@PBUU&e@tFTEJ+#iTZkj!G8jpaS~ z1_BajoE_~6i>dXhfTi?-N{624p4g_dBkzr6(cR-wKsTH|YdC|==$?L~xBsqE#7-Ff z!5WzM-x8Cu8@m>p-Y^Rf-}H|Mgrps_?VL0fJz-<))2$U9C@_YK1uVfo+uGVbd#3NA zZEmg&zs)C=S?9X5eeVnpP{MNtvBrrIVP2ySGWZ*U^M?0L?n~3s)a-bDSH-F&srbq0 zN644+AD5f1#^lPmFNDECgXQ1qxqIi%d(8`}LQx|0iglp$IUT!eW>e#oy#BMRm426J zuJ1d?6+kBvATNE*bEwjKLIa8U^w8sNK!B9JhxvGb65HC1KO&duI`WrqPMtbkPWE1; z|0L7}*DkpP6aRb7;Hh-ufBIl<-ub`y>b^Dg{~^6X{$eV$l6^>8!IM|NiF_;{c&dwyVb!_U0)=EV(BQAfb-)O!AA$4Q?!d`3if3Aebnb62WR-(%CR*Z6nE&Ec-~0mkrlIC>k@pgBm9`Jd|uSTDVLlYAzYG?z7VUCu%_hyS+S;C;~uQ*JoE& zUYz^TL_8w&Z=5G-9b(I_<7DN9RDR-S0dccY+=_tg$Zc-Nb9Y|$-E!bD0IvXN-B2nQ zT{}7S@#Dwzmbi`1cgsS$`E>4(tU_2^nkIeL_s~Z>1gvd&E#;eKB%w4j%C2%w*9}Ee zag2-or!j7{^sQjMkoYBhkDVNGVU?C8$yszsOr_ERLST%YTzXp^;!j4qGrKV7dh@SE z0r#fH2sn9K(oRA)NitTCn(Ej3nVc{14OLrs^PK=>V`w)N&^_39f&A}7Ui19*J3Jsc znd$M|bGfE7zU>Mxx2Qi-?}h9tl<&W#^OC-|5gb6cCSG%OgD?}EPJzHJiCW2duVuwc zEL4*sKL$qn)|MD|bF4Kny|J0RmW+G0rNLj1bh{?`&fxD|(yy;yzp5`hHtAcP$icrb zB}8ug`USv!{nDdIFQk{Qn=G<;F<(Z7T?9F7jw8Hw);tuK9PY*B7j1gy{aC4ucIC=X z@h|8318B0#y^dN;k8f;Jd7aIkj>D%ee8@<105(=gN9_4(%);$^VYtPj;^OO0aE81$ zE&`(#EodxuVXvXGe>H}_$gpH^B~T(s+YW613g$KGDt=6r>c6a}qOKkmPQ+L@uUiQ9 zwiy(-Y|s0{LV<5gmMfX>PPO^=@ezotKX`kwoRzZtHPc9BKD$*L@kouc+h(8uSoQA9 zdRN#vI6f$K+dg>E=!@myI(2GhcaN!(yG!Gas_oF!)j_=+lkz9aL9@l|>1XasIyg;S zm`*YL_7h1|xxSq_<@#KQT20hgWxMK^L2yq~zE^79p4tAPl+=@@i#3X0S~5Zz)%~mm znTtWXOJn`)?XWT1(rI20UCBk@?-nTdki~6%?&+1kzG-O6+#_E0|_S|OP3Kl#4 zeFAJLv5L+t@!`Q8g{54(3i>ZNY31)b2{S!1!RQJa8h>TvNN)}i;#k%Wc_s3{U>%s` zN8alLx%$<}H+bx`#wLiQs#6+6qIQXX2#>Cx7pPMWt*(uYuliSGRTE|WAaEy^*#?IW z$0pvpb0+^`UJJI{?Xkr3km-|uv1}Q~I_Z~=jnu)T@uFK|xMv`dB268qFVqUJvsVhrC++B-)@syc z8JQ(gg)ic!8fVYrGABD`4XDTDy>~y3;?$EcFAVrjTtb$uh3Zj`zCAdy`*jbtkVspj zg3C{K@d<>3YQY_bT^Z3Up1%5^#vsdl%~7db@w4+F?M*y{J<41=`kUOPf#+CG|dV*6(g& zUBu3I7&x=DaLAy3jIpNTHB>xfZH#bj!=9@Znr{RBjlq1M-EV+{w0)e*Q=4?LztP~a zw8Q3B`E6#LbVKUS0Tv6qX~GaIMQY zjAF}YwkgjSi4_(kEHE3)`+s(Qd)S*xjEa=E?M2%NTb|U35!7-bntEPyolbD&B<}fq zZ|Wv>GF!X1z*U>|ayi9E!wtKIfQjjs%$n@pPM~k|!_32=SzOT}>E;;fW#5ZF3+E(1 z!6?u6+hlgnRb;7f;%V2#e7DfcAn+LsORkhGi()YqXR_?L|BZK`(niCLS>5336|paO z`o+?~2oyJ`3$0v8Nfb^0o0&$H9pK1BMFk(m!rB0yhdKm7$ zetFFy^sF?6u=0b=Pj})im$UXNoHj_p7gpY&FG^UjW=6^L>qT8=Ep;7iYkgdv5g#sm zTTn|bM%eSuzy}E1)m!c5fNEN~$dy^wR%zgNmN#zS^M4!Qf)G?%rA~T9#Thtkm05NV zAgoMtH7k7r4m8{TZ9rB7tg{Xml3e6cmk<|M0X+&*cG~2SNI9$Z_MP3yH+Y`p^2s-X zX|JL$N6A&$6)#6xh0=WM<1@I?rWPIfW*fAFI(gby&vE|KyMCt4Z&u&{3aBL~djTG= zjOQ87GQ+S@MH+R#coY_^%k54GbJuI6$k=y;&~vnea`PUvyvH84>nSF7Zn8MlDojBPg0bqtT> z{CO)Jk>1LJ2u&$}Vc@p^XVh$%jYVafg_~-!=-!_6ltuB9tTM5qZDeyD@qFx zTxtBz)#4Q$AStp+ak33y3_;5a`5rQFqi|jqyC}67mzqGod_lop<4P)!$EoKbmi18j z)_E!15{^wd4vaLXRmo|K;%RRl-wV{*0=|EXP5+>m*I4T6>NFCh1SBLRC|dK7JTP;J zq9Ai)Pjc<}fqI8<|ABpQ(ng11<@=0mP1k7xGN+ zXC0F@bX3&Ztn_V70k2{9W&2@8%b&bBjYMZEg}o;~*3tC|^oMLV7Q=eWl@c;6P7rr4LOyvRi0HJi)!#@Bu7dc# zv(!nnuruJ?S?%)`-*%I|EMPTM;Mn|eG89#4{;w?gVbu zc<1AGlDd>joe9@PAp^+xa2jHp-$tY?1@i0L`mM{;?bMMpxl)HpKQnNi9g{W?J^@&C zd#1ukcRY%ys8s z;pXWXW|#8YLHET)=@%2|G~>z`f#jhyS`>$~QYaeK&vPwW;mz}roxgs4eRUfjauxyo z*b@`ugI4XMka{a_&If{@(#tg(t

detfum=}BN&>#bY26}O#!N6oHU5*|C!N;gP$hJJL-m(z>Q_Dx;$uEb~8A|t}u2a{> z2TPxy;^wY29gq3JU$2oQMuJ+wdkiUUUQs{7Tg(P+r5L;B`mLC8;M1_aiRqE)ZM&}X zU7Z?pQIDio2JCIF_DyE@4x@(s8N0V~Dudatm^{MT&YFd7qh0)#i*%s*p(|G>cj9x~pv<#P z?Ay}YiRlpMwowh4unp$8@4}%0N^5P1F)p^9mAA7YS^`IqV}P?B`pSU| zOZ*rW<LX;q@?~i@~ zG@R$Cza`ys^=nYSW{9BwCs&V-dAVj~Na*Gpe%na10xH&Oz50TgfEr?JlX;eW-Es^& zGge`?;)80ZCAa6Uk~=K{Pu~-BYvK@aAHf}7*_)QLb8T?8B5+kr@Pl86ZEv z%#De6s$TK@J2+^7{U2a>c$Tc-EPMqwl#vpb%5hUKum759Qw}IFwbbR)&0QuSEP@kv zZ|`u6*BP^%N)=&jOTt`-<1^;0F7sJyaE;MLAyFbp)e6`iM%xMAcH!v_Td4Lj^+3;>O^&(Bw=Eu+>l|%{E$9u7A z&|qE($rY4nRM(*{5$IzE0@^sBBF&B1|?{7RCH{PfpDtvreJ-XlS-z``YK`RBK2Jh!I}ndz~F4AAkA_NYBzd@PmgN1IgW#LGx# z>3B^n+9+vknt_GV6J@@N?z~5nVVuIkIxFO3lI}EFH)V(}l(%M@oj8C3&kx( zlzC6s_g9&bHw+H-M5$s!~roPczw)-mg`^x!j=2R{)K~)Jgr;PLB z7dqzuK&)*wx}CuAew;ZdF*n2Iv7|YYzYQ>ja<)Ir=D~ z86v|wmat7*YwUf)Ta)1)pwqy3=F};tHVy%oXM^*xg<4Zrjmj(rL5KM;&vy1Ag_PuB zi#gl9n@}O?PLUn|Rml{imL%&9X*OUZRXvkD7M>IvH5?p!Ja(g8IDI^^ukZG zyt(|C9vSE=ZxarRmE9dok6Mub9^o!fgSP!SKe{+p?}ek?zJC{ym(Q`C)jS@S>FI+n zqp+0h5lvwXK1Ie@?pZSO&QJj%|3`pP%66b*503#yqB~k{z&NenS;@zG_w{omIJqowSt0#*(Oy?<>UEFD>RN%(G zKcXjzrS>Cy7otu56fo`vrEa$arCO_ayt{5%XhUJo)TnVs9pZ+AQ+vz#^(e-;B(8Vw zLyb!_9wDZ;4dA+s&`e=C6%d0gHw5*UXdLD3~ zDv*5WKUOiimQuSkXjMXOsKur`Ad7q`a9gpt`WRGajDq*m@r{dTMA&#(Ss$f6-Kr|h zF1PE?1QQOtY4kzu+&OB@5N0&Ud5^lC0h0&jsKW)>B8uW7>LnDymn1ye4^eyoK;8$P zACr>g-8$Cb(6wllvxJ zOOb4%ZUGo4Qn$%xqj)9qEO&z$%wp=aY(?CiXU4=Mwdf;E~==)PQT ztBX@xy%(?67nc!}tG_zkoUY7X-*ykjJ8YHJ5e0V-?H0T!CqWl?@>FR z^ML+Eg@jdYC9DGSuIY`1$4Ws>j&nG(ffj$G*ThTLqYsH;)&(g}OJ(q0Tq&I*Ni4Sy z4;^;*=RY5$cLiCd8+sYq80k<;&g%B7S`_C}=gia5(Y=b5p%sfgfn8N~b#(*9Yot;$ z@l{&HBY>R&T-~0sX;blyxqWMYFLGoRk?$jB^`oO4v9-9}?452Bb1ToQTbYG8>^(Jf z*RRE}0Q_w0<1&a#3z&fm%Fy9Z<<^=-f7kYjh8!HvNqJoEzgz#;<-@DL-hM0AQdA|} z0zmfHx8maBQ>KqfteeZiv0Np8Kt)fht0RX76ERTBc?QSqNjUk8|K*xrwG?u6viU3d z^EK6pIChYB3NN_Mofbh|Til3;RLwStkz@>dPAlIVPoHWg!~n2o+h3Imr5E$(UzhdP zAPt997dA%JagJU%e7&NsTkK^)dNui|a$%p}3pQbctsm?Mq#XKF(iKcK=<-(J4|x%u zmVle(S5CD2rNlL)=_4a;*MoJXBv^V24@F{1ctxi+3|3>z_s&3dN&9P8%%=;`?t;X; z#pv{qQkQQtgL#;xcs<4V9sCfet4y354FVrdS3x!pLxBps76K#|FmCwy0q$bk$pO*R zyO}yQD{u;v>wYCtNZoWoM<&DF+QWQ70&`J4xdwiqiM6@ZCi$kQBO74H*zM8j4`vtH z;he0NPG>Z7r=I7xU-13mXR_rn(6U9SSvDXyw`FO6Hu`jlUNnlL4JH1S`apAeoB+5> zHXfe!pJwGsckh{dd=Kg-p*=?50M^DGvv0J%bub0Bm1>MJQ;rQ<9Qte#`Il?9cGklz zb8Qa~{ad%j+Kjz>9ERlGM~ez0En6N}%zukTc>M{>)?}-=tR1fmz)XtwT2J+L*W9x@ zn!3XzIEG4#i^-NjKS90%&@VXpcP`y&g5p9v4*^95h{A_5iz!C<&&Iu{&fN(Il;G3L zE+82!I=98AuAE&by=AsbP~UNWRl^m-GWBMDy0cQ!!hTmDatsJsA0i_3!AXsW*}L8u zPGD_{4hy;T0eod>@L;toek?7!UUkQ8a*iT`rPU!EYQEU#KHrimqi~k1LeUC11hq%4 z$TJq?QZ$Zg3ld(SPRz5bA{( zK7}Ra#gY=%zzE0>;#F3Y#MK*i|H%{_nOz-*c*d`M1~)rrLV2!7cv9aMG`Waf?uaEW zV9dAXpexP=m`ldjgde+i*el6J^wagC@AQc&EC6Ug2<91+F2ay2>R7~Cow=@@Dmb9< zAKeh^UUd-BaTB)h^!8rST!M_27BAAN7!e zLTSrGENr!yPL8qcr~{%Oz6K<-l73e%WDt*W0HDYl5K=|s8!x=g#*W)a*4P%fZ~+Y& z=9Q5roqZ*qkDE@t>_@ai(ld-T>-D!n8|AD2b;KYDuCW6Fo9d&mIiSMqmG=jAK&igI zuH2^EoOmp4Pfo?EaVGO)`y8@ zl|I*gAQ(qAZGbro35&e0a5(5C4kCP4LG4C`b8iayuka@I=>Q6hK^{o4lCGn$0_6953 zmHe^pqb>B9O}ijWTiznr_B>xG_7zx@26_E3V8xc9;n!bi$urwGzzQP3b~RPT!X4ipgaV!k6gh~DuQENowbl=DsVJMWuCu16t- z0kmpvGs}O7RbA($Ufn?8+{q)qBYs2oOF==w(@|5?QBz2Tf?1g~wj4IG+*D=m$d8d5 zi)!!QzgN4j>IFqI8$8G=OM`R%U%VJ_Z;;hu>2E$&>wF$t5K@Z{l2Z^BBn4L#70b;&@`X+6v9Sj#$XZZ*&XrwQ_9 z34p?jr>+X>Ua6)wGJX)8iacRgRBU^W0w{4=?EW9ge-hF4?&1?+mexvvotst3kqpi#Q$ zS7Lk(;xOQ)VQ6`A%BEP_7l(?)pGqmd8!th8;XmTynh&%)%-)+~!TlXU`2h*6ez~dh z8~*1OWeo;y%BCIFnMI!ZUP?W={Xj^AJcPSD>p_3Vg#&l*F#DxT*$!1X7?&$g?)R_% zKzR<+<2DCh@#j@#Dp@*M{2Qvnjvd?&A-08rj~-RIB=+T(wXs|ZN)w-Rpm=Q~^wOi9 zZK1ZtHX(T;%m#$DJ>-kyOhE;;YXcIGokxJWLLv)E{Uqx!Ty094IwWKK!b=0;VFq&- zu4xC+6$v*?FY>im0F=*ka6hCc4Q)T*>AAskL3o|Cx)I0HCRa=X)39nY-uct%z&-d` z2eKTP0{3r#)z^nEu{>i@l9WB*wf%kXJAnu@1}X_$+VO*FJj1dC;{pj7U6jp>!qTdk zvrzsg}>-RstW38%LxZ9pqw$N+L(&X z&3C8h8X9Nwngl#ox6dBGU*e_`)Uk_kuSIxO9if6~gSb91KEU|8ep~JF`XTrncE+Qj zDZpBkKj{aUQ#Z%NZ%8zkvnyMt@K%3R0YXX`H9ln*9FxPPfEoaW4`i)gZisVa9=-Rc z>L6TnXX<`~oJ_XFE{5jHxIyz`ViH2;xd3^Q;`Fl}qV|z97pGGk$Ey9C1vJnYh+5+S z*=yt6Ag+EnzoB-xTHvDnczW(Cy9h7510*TumCqnHLQXSzRnrak`zYA5@aIqX@21ay z`Q_c8@sTIlGG*j9#?1*Y&}5Mf+H8S@1a z=FjB_$Lty%2ngf2?$QF3jQi9#JnNrp9r^_xb%DrZL)EU{Ybmf?AwR`6!%eXH?aRn?i&a-(P`koL1cdkBydxL0M0$lUmNPZT# zeYfbh{c`@{&BH%P@7Wdg3%zKdHPV8N>ot$clGpZRcx;|NJ+A?cp8n)yAZeW5C&O_4 z*d@-_e<(}Cy=-eI4(A|Lg%+55@$@+}3@`qMi_u@etfPNACsY4>`LZ_r-$9!2x7Y9f z_tpQd!T;I;{b2lGw1fK|H=!ncIn=(Ao-2HTA)?o^+Mw<3UksP#AO@W}>II)z!gc;L zAH&0!Z~cLcjeHewX`x*S-#=*-5m^909M)b=~hEFF>orag^_QPQ1+JCr>mQZy& z+)NB7Le8#_MD+`EoMX80=p5fchD!tOpNvj0T+)8BC}RK3IxKh<)J$qQD({H`o~A8Hm?6IJ)KkuKL|eGA=}dI=gm zXPEah+|7=9$PMo_`t>zj`&k71lRp}#4@$Iy`{19?Sv(bH_>{T2aSXoYANtLNs0trt z;NrRaRt#?Y)_oA_KJ1InVq&;txI@|hKX-DJ8(G50z$~y^wvXYG?LqqcC5Zevz;O2i z&J^Y;i_@<>IwrIZ;Rlbr4*wfOU!)-nafLi((iCuspMF zchoBcevnHR)|P?6k5lIP5Whxs1&oT3V7I8P2gR>_iiGDjj6-Sv`iLd~2(&Za&A_Mv zl6~1wIg2v)@${=Yq_i4p$?_W*+%ylC!q8v?rpfTKy2zEZ9;1XVgCe6VhKO3!g9%^; zLl=B)*-o9(%rbY0z8oF)ymRceGhxQ1<&nXV#c)TX49Akzo-eJmTv73lsq?hRoNFTj z8U%UWhX>>YGT>o9-Ozsn6QKF>*Qlta-PtEFd415~&kr{M8LQ2v^PmxCoo4yHlAZXX z6|p#6>aD@YQoXE>rgi?v6L9e&hgx0SlX_9Nl`>c6f8%mwJZ3~-ZFy@}efad~<5v6GiR%5r zY&^RI!QmV7t5GzTOpp)&E7UfRa>9`riH-y_`e@P{e;Tcjau~c|^yL^0qABEQow4F6 zFXsGL*{(1j+|Sw+o2X#nv8YJ5-=YVHU^{N4#L3u<%vUmLmTB>qz|femv*PCh6<9!C z6;~L!zjBWHsup_ow8|W|@X^*CKWNFl#Z>5yx?&+GCAA1Mk&FCdVAOhsExq|pcrm|o zA3PG_Ut94U3wHSHt3A@mlyE!F!UYzd6r*l(-MNc^KsipP)!e$hx9j(UxV9&%$H*Bc z<83mx4pSGBDbQDX&8&y$-ZB8Q+5qK?DN2SOnziXi-!OSqyNh6yX}jL!R1wgz)2)i` z3m9%J!gR|$`|lcpgTT(f2jnnmX0Xz%H!~Lo-OX{?pyW)Hw%eSK+}Il*P|@OqAvW=t z10zL~`7^>N4r^x{3X;IGwx}<=TF5UuuIO)~r$?Z5VTvyh+DmQ-p8&7MFo8W+iyAIl z$UjqnpEb_b&g)yANnLMd4&=Fojy2kJA0B}g?ERHlPyKPdCt=jMSr22rF;28r&eF7F zVixH`solK_qKtXpPK25S3_^_9`*)Qp$<6tDDaf^X9%|3397d^}zE*ycS$b;2VZp@2 zanapyn5~v>@8|ky)OU+Qe1vSC3T5frf~l)sL>DB?QRF-EtRr)`#(gBBL(!?LqPUG* z14k>I=zGpWu{+AI*VxyQnTI}kk&%xNHon2arq}Lo1vkwmH|WEVhH6yG<^`8wTQNmLYvf<2PZxsGIp7FUpHr1NbhqouS&| zGc1Q!!CKm|f2zP1827)L$;>QA`fe`*WI7#2(ppzX%S`|36t0@y&9EdGM|g)rL%_?N z!}NwaCj%nt0PtIyWdyM0XEWHnX`MWy_;FeH22`|(7cXi>C*Y7@x|ovDfV`uTC8nGEue@jDCn#S@aNuqoJen|FY}pXMElSv z}OHAp=ddeJbO9qR&P4fAod2TiS`{P<(MG8co#$yKE=T_!oUe+0&#?k$ar{DJ|# zLszuY*8&}A(rIyGb%$!aU^2l(o}Z#9CEVcEjZcQ%O&dgStwn{ia9d(&5EL2sq}Adi z?D|)91P8%n?0U=Y&gH?UI*7WSCBRPX!EDAJW1ZaIyyrD;p@zvGa|U|zXy%?g9om=G zwwB~Re&&uh2;v%cJrnt2_l}RVh5pDXd(1R~SgBlV=yFItw4}%aD(U}CHbty6(*9X4%_#9HH9{|VE;gNCKeHBQhNR;cB&wRD#$ThP9P=Am0>p8 zI0IOAa!is9q1o{4*@5ioS^mHL+IKT!DmVDxeH(%V@6j!&H4jF#&?LktQ;B5X?I~}x zrQ6bPG~RZ&N+DQsrz87O&0L_vUb#i^#aBMdt?8(g1%-#GQddt-3{#M(Cb)z?V1KWl#~M+^7oJg8mFNb#8USAfI9bEycF$%y$? z%4&W!24a^4rp$p@=t~W&Q;FHz>}q+z!3Z63-$vc$u z8D_<{oaZwtccC|cg9>tdfdz$l(YG%gW=(JJWRszxdwU_)K`+}-26+!!*-qT~?>5br zKTbwwv|Z1{v?NJ7EbiP@JKN0?F#RW)1$$qO5$0W?X74I!ASU0!JUM8vb=D}Hyfcn)N3+J5+t0BMXY-j3qN?VsQgci&?57qf}S-pOoWMGch9+ERO35}QM`sQ ziEb^h?$@ufXMRnvJ(~9Ph-t<$%zBLQLyp%crRY($$1?pIYT1@l@>Q)W?ck}<#}W=c zb!pQn?v0@^za0YBX+N}--S)hM61+jg?fti4&5a`B;=0I~AK#?C*Jol(WkJgfQ^wll z$0xcP@8f8@8G&S+0u1rmLkEhFyL!X9=0|aG9=>?)9HaanGXJT_k1IYm;QMdhqqm7gFlh?yhm5F37N-2z#n=5% zDtFL=R*?ou>TpwqBx6rI++lKk+2*3 z12X|u?C6Gl^ZbAK3qUbQ!;un6is2Ox+!xY*E_L9mVB!lBK7B$g5w8ayLa-N0=JLFg zEYHIpQGRxP*L!=C!(nPe`Wzh6h<^`h0}BxFWZc#~Kg*B_c!r$+hrRcXYHID?MRB{` zR*IFaNU265Q2boh>8l*A|N${NR5;b zAdnE!?p)cwv(NW^pZ)pXZr#MnV~)@!J92Y0FVD z;Mj|dtPpm)cxDJvG}p@Mxh7?lZx4uarL}_x?taMw)jIfDP)PRjWgEECZ9nkcUu2Q+VV?W(2?o0?hh%Eu;d&<`^Nl09XuN#2@ugCzEL|ih@TpI!a9rs7 zZ5w3voG286H_t5BZc&Oq&W?GwuJ*#UlqeYrdQ za+A(}#F`b2g4IMSd=>@yL>f0nE5-0%!fKqSsk!&x-v_zHkOXcHX`W9VuS87t56adk z=b2~QHL6^he6Ob+49=u^nJaFoLM<$Edoff9^R?m-a};D#iza^*7eJ{TQh_BF@HfaB z5?w2r54F+SXyzDPi#&9GFjTh#>#plP9aThr6_IUSMLE5m#c`d<_|^gCK{v^4v3l>A86n+g^_rkHrl zEgt3B%3pRv%!ORZ`%04KdN<$y5nFzO3mM#!%4U2s3cY|Z_FPxCeAmI|Ky|pL_&HoW z{7=lewK~*T@G_=|TypzfdS6Ko4k|!%SHzL$$Et!rF`9#HorS!6hD%vl_j;p2lKY*I z3dNPcSsIR{Ju8ZO`SK`kaEKSV{ixq(zM29bo3O46|JqM?=!6&S@PZ{g;#e6kqF{+Zf|B3GZX3SdSR+3IDN!1hJ;98+x0KLV>~d$7I=cP(s+J+Py{jK`i+6lEo3wBUeyc^^BZ5;fI)8uPF{o=2__gQ?XLJyqr57Wk5 zydQhgQHgS=D82_FH54De^^1ZT;_}MwWa`D}*YuVTMk#ZtAFT~h%Awc^1o)%wJ(%i45KtAn=A@=}P9IpFkA%gmd{1jOdUv!`rkoS?ODc;xMf;n_vF6F}y ze^r12v~JGCu?GB4F|tI{U+;u^$Ud+eAdm57>XCv?&TZARRd_T|B7ML(9x&O9fvRyo zEOW+xcIA_@FQoFwA!!uxZLyWU;MwexvTclZZF_sWk;%99ycfn*CERjMiU(PdLnB7# zK0FpkuybnkiR>_JjWInDI)@YIzst57z?pPHv}2+Er5g+#xfWdLsnqQ01AC|1RlKp> zj8pr5fp5HOgV5%Qy&_8TjLY!lBT#n5m^#rf`9#~xo_4LXgJpDBWBC45tW?3OwM~oR zi5nFJv$NThC(>xBk=ioOf*R=x-ke2iP5o4LdqIf%mqt~{Mil@3w=a)3SG_Wgj6_eC zLCK?NvonV3sffomrHC)y_QR)SV}id` zv?Lr|H}d=u^b9)lZgO1G{`Lq6$~`ADV9h*`MbJ1Avv}yE^CaHW7}+}digaEaUHR6m zY=<`oO8SXSIF>qeYSl3nAdhQ`fyJp^zja>YD!6t?{kXw$YuL;$iJi?i>z9=9nSNIE z4%X*;oS5CupM)_7+8)prVSjv8{J` z%c00|3OJRQmVX*QLWQm>P%ztIQ6Rq#!qZD~aX)e_tw)|IEC1@;)uOWqM$nj89S8;A z)zLcKff{u>j7CK0aM(D)q@{>%PbfmTK6U$)1pZ5?X;na(F|{S#r(`GlaVZA|rH$Ur ztm7N@Ld=+4$(zH;(g3B(xpz)q|2!@bLQ>7`osRQ8K{|I}{yDdo^JR}PTaIrN)+$v3 z^KMBpv2BVSD0Qias2FCnC2&m>>oR*SLfi#8r;ClC{1n8tEFP|a|V`fEg za|E^gHcjG6kF3Co!#QyQ;1GA_+DYKS?6{v0PSwK;G~auysYmB}r@akWV0q^2k2)=} zwqc?6ZYH=a_BA#?m$f8lD|=Ug2cJWNYTK<-N>IkmtMMzKNh?LS#ut%cGl^D5gD~1q zBhB;tFkJOhwm@eixcNzgj~}UD&UYMz`qOrw-q78^FKrcWO?tcpP)7l^e*Ve8aa}{t z2&m7S&0iJ;T~6G>iNn+A)t*GZVX~p5(zOH+PpF11&gWDlS#&_PjDwhW8n&E|x_}`T zi|gv@)Uqy8WTA-Nlu}EgDgYhLVAG&(ZWWZ(nqM{uMKr=5gu>KS!n_OU7$b=Nio&jy zfL24ydZ^L|DjJ{0)e!zgKH2-ujuzHU;qUf#E8c_aHnU4RA9EhOZM|NZqc%2cgDpcSC9PZJl{pGDZ*(h|$aeI09%j zOaE>kcnV-ZTJu%1^{3cf*wo~pV0xIM;hWCF;Wo=w{(KWb`R9dhfj0TpmP()T=r02R zF8E>uhGA>fU4^GEauDkIVY{0XzkRN7e7_S2ltpy{CoomA~4YiBiyIpGXOmd>X zEUWjr#i7N~FXK(*!>u7!51Ofi#lLE2tuJ7P&+dTB_9xVxFADltVSgIR+AbaLEVvRh z<0~7vXgei-FN}w>{TlW(ad>D50SSIKR6;K>mEwi9M=odSkIQm!^ZiY9?$N*>U!NvI zV+$OVR~_&+r#oIbV1FC0B#@FwxqYqs=*lFIx!Fizh%fFiB$j?*$jVe(e#;m z92se-e}4Z~=_^o;W>}+)0IHqI9|ch@2C!voIsdd*Ch$K(mP*%K^0Vlde{S9!zejB9 zdqL;tixeDq8-t)9KzUA&DVnps(w{~|}C1=yD|`C z;T-%sx_&sl`^kG;uy)g{VZ(~+A3w?OBc(qGA{TyKpCT4=>U$w8>j!PCTdb$(GLbdQ zg(fmX6*BdIc+CJqAdD%t8wj0Y2VqRX1VGB;4xHzBl5o}Y>tTWm%?h;GjF-vIwrob^ zkB>``uBs5k3|@kdH#6!t&+mnQ%HiK28w0%llcf2-^V#0hz^5sBSKXjrSfQ~63CacZ zc%Gnj8MH>;a1usuG6gm*l8j{`pUwb5XH zm2#xvgAwFu=^Wp+37Ena^2KJN$U_W;N=za@-5;)&4;4AVZ@5|N*(Ud2T;cIRgqFLz z6Z!2);cuSS4LDQ_=kjZ7irwQ8qu zGS&5ej9tE87VO0F>i<~2Vz^%AHJ4Ec_5wm&*i+#3U-;4Qp;OU+2!FNekH6<+ls8`i zCN+5Z|8WAj=VtM*=8$3iM96aF^-s} zCh`_3TxIn6;UCL@5Z8yd_YrF%_QK2kBWE+i_n?TNejvHtOr0-Sj&9L!JDu1Vts0dP zdjH_X*yr+(&N4F^wiMY?&N1(A*>JIaXY}cFx1uiXQ!IIwzzj;v8Dq_81{pHq?Y>^_ zXjb<`r$+M2r)ib=3bDv~ZH5MY@{hZ3Jo0SKq@S<s=&YI zk$d~uQK$`gePmBGeC@P4^0leVd#~YZjn*d-sln0kCOSO8XVT+xA`(0wKJ(HsWrIIN z>nqPAs{aaIe4nV*D8tsiz5pEy6hi4g2+Em=l|5< zLTW~%6foy=uWEALcwwUc>TTW=s;enwy`3(Mxmq|!oAM3<0DK}RP*Q4x-QkJv*OXxb z_=9-`x1RIZhJ=|jRA@R;rtoy@B~(uTfD}pjMV8g~`LLuU_JC&cHq|#}EQI8B%lrJ<9qZGB9dGlb{g1)WLhk+rcUZ(o#HF`LzQ3nb(FGcl&(2n` z?>_3x>ps&5&B_am_#fOk5zI(jyCB@6dOiFKd(RghugIno2Tb0sQEP8+k3DD^Ta_$O zvA4?5rm=b}NC>8dO+>8AE0F{)i5|s#d3&ShJ1PVM7hWD$En<&;ck_Jb3E!Fv5q|4c zyrzI|R!lu}481f`{I)ePkM!W&W+zPl+bgY_f*iN88%M^mOD@3hTNM7D{_PH%aRMy)iuga~0k@iE;+{gMd)RVjw#92P* z6uyPb3eA>XM>n*po}Y7awT!ObUB@o#_wt_WU!A%znew7FHGuy#4TF<(Evu|$lgr8~ zx$SG~5>JIab-qoeK}FF1rz+spKC2h5zbfZxE`jLeLHj|mv+@4)Nhe&{VZd$(Pq6Ly zMkMH0EEMRr6Nt(;VU&?*USmOoBdi=#@^{yv^lGD_Tn$2kOgQNU@!xbmr1X z-*bsd0I>|>I9Vnos zS*kcOlYCg(TUTo~Da1^6(nf=rY}SMQmogeSWGlzsv4M-|Cu>7b9xy2gSbSt48?5EN z7+14aVWgFwsIVQQ?LU3rVjNJskVAhz@UbTR8Sb$l6C1|7vElZf?8zjDbbA9Cb(`zN zwXK>5JbtByeoI}qcsMVZpTy}t_uh#)-swL<#1NCT=EC{(V_Nq0c`IQF1hAx|>vmj7 zK34oO)Ks_qBXn4(S(xYuU9)*j=t=l*057xN+>)Xd_=_91fG1=@akic|bOfIA#(%f8 z)+?_ZLzG`};H8R&)n6b9c7pvi-=*MbIEN+KJj9`Qzh`(>2+62IHK7sqX^}idcv>=< z;?u4mTkYTY?fr(0;ZV#Qmp`1l;Fo8;^u)bqhF&~Deg0Jx&B?&lRC+^E2Furre5gI_ zM<6vpr`wAo_urun8wa1|%3|k>4F_ZmevdrP{cebwx`dR+h4R|v*|JW8E+=BrHR}CV zWi(qrY|N?5PWE!EO01);85Q6Dqiph`u1T}IL117%&}S-e(>6xn2lAWN#zZzcbXphu zBKsO$`qDRuqX>?pl-)#O$4C#%*(f4%y*mR}e4V4|w#KwI)7L4{iNJL{UCslt(QJV+ z!z+8Rt7hKS$rJ{c2GWb;jW{Q774r&3n!y)FbRfAh-*@x7M0 z?du;vsLg}xNDY`zv8+Uj*Zpm{>HDRFhgPc+ zo!rL?&V)gCK52}9c0DIZ&9xtPvk6rvQ@oj`{Q#y;_epSpahxYHmoslo6W5%7rOn-^ zQPcOn!^yH3O`Xdl*;NYOOUmjId=9|+{vdQk534xL&7b9b@UU%{)p+IgP3N25CmL)f z2;5Nj9B~3BBRHt3Xpg2NsUD(Y>TX%g>8CIAsr{A$<%@oJ0JGELvaUAlmcbc-$ zV8XjISG8F1Qq!iVK_L~JfAL;`p;ln`j+Lej=gPozmcRX?_+pP?)3q4Kl_R&(`1XXp>Nbg$<8R@mDWZnnkan`!&?%|9+RbP%0 zJf^>d`mV)p#Od;LXiBCI!K$LFzKIJq?AY_vYP=uWb_ZMT+^m4jU!%19w=V64&+Epo2SDqhmINz_M|uL-zoYZ) zS`!$HNANa1{v>iFT){4fNK<>jL-&3-h%jEy7V!GFZz~gK&JNxeuw88jq2{=y#-2S} zT7rkbyz*M5h<2VQ^ClDRz298Dd6OEKy8rT<@9<34ZaMh4#N6Wc?PK;^;3KxJq|PzH zk*^1gv%I2q>U^TLp?TF_y^oy@3}lmKJlxqv(_2+0vcJZaT`Tsn^kXCy8;Gm%m#{a| z_jL1)+nrPz0L=MSh|rU^QBryLOA{LAjg2eN1K)rW>mFy}IJfX#aYEIw<7H`$U%Y$! zciSGR5HEGZ_U(J`JAk`hahMn2t6n*`9y|9jgW#PSEHGJVCl5|*k0H1_p`^Qw<3( z1>JXF>#*`K&lWPIx(NJ)rpNMjtSujsu0~g97}V@ZRCB|uoge9|S9R-JTpW(zv83-m zdgPE+vM{N}Ek5M`>2ppEXI+ApcfexFhA%8xbb$M#A&xzTUAZ8oHv06kz6!8ErLc})mn)o2FgW3AP zxNKzJJWVHjnp8Zg7jL3J?aUa9reY@M23GQpx%4IR;uj{m{Kp<~_FvIDT2d9OWPVXl zJ=PR!Z_!i&8&l2Pr*wtRg7{#np*608dMBIOD$uO^2Fa$%Q=mwlmRIY;O>F18&vRa}6Yk4n25k zvwQ{1O6KEg*>`87cGjTN8 zr99;-UhE{pG2??k7@+TfVCTdpWVx+)B0Q}>2O=`$^&io*@U#E9Sod|`Sg`DD{y#2B2K=9(zjDF43 ziOF!tuedTuP3S6p02qX?-yg1lXjEjb0iLEqfGw1j_J?f)1qq_+>YiU3uUv6Te$lep z&6_im?<#B8!yeh?TjtukQ-KFt*Cs8*JrX$_P}Z#=Ei?I&SKXXQkjuGA(-+s~d=65? z*9017ErhgZ2JVNiVIRpOTE~YPwv9s9l(|LdSdT;*PbNLn@;zyyi(d5mP$QipS{A7_ zRJfgKR(biGGtwLAy8YkharCE+#uu!w1ZQEtD)BtINPg3r&5D(D*j+apG`y!As26Z2 znUu@J!%imnN^Ej-Jgd7tb)C!+*P&ETD&Df#H8qI2&%D$N+GQ&rr%$aVqBSLT!9+?_ zaUJ12Ck#aSLy7Jhf367ypJX1wIEeS-4s<{yQY!n^S^0OZ(up=$I8}Mt8JU^TtkoO| zI%D(AcWIV6_Y?;6!=R&bpo-V$CO0p7AG^Xj0(IE*50ElRR8=Et{E+Qt(D?|Okj4ZP zk4S6cDTO;sv*=ZA){^qdtIK?qy#jyDN@B1K^8EPqKfu+&o?~=HRl%+MJr;RLa(iKU zazEBD4_hat4y(m`vRgLLh^@Cx%^BOF`sk6)i~U^@NwNG;AE;FQt<7lf(K(Jvs@V3! z!JkIt_2T3|E9{n!(H_mX)@|wSu;6&bCnwLMy3N(R!egORktDBdl@LsYNd+OWsfeCt8O0*(>7weY8HK^+t?D# zq`)GmDOo&7Ex_4^IA+wC>NzG*x92|y`lHmfcj%oM4MhAmN6);-HgE&Cg&|l{sP^Zn zw!|u$^S^vwpJsIH^PALdYE`o|wUoTev){?ng1B?W4}y7?WxdVAg ze@h+Lw*7~_rcW!Glz;90*xf8Om}90U3SL31^u@*UdX18Bz7((c5c_Evh2B{ufVMiH zunCqPd{4vvxP*jlYqaOSe0QrGbgBt6Eva~?Ga0Mc7^8jN)D2_>r68P@FY+fQtI@t5 ze<7(HULuubsaDtaTt2+}ZE*9$i|EjkX)r|FzEgEy0RI9i*x>KVNn%?J&i-XK!rUsm=2OuM=mF!Zh4cHzyGkkOqE*TUPZ-xQ#${mUpmN< zlfBLiCn%))>T>E~B9MW8Te~vPG;hvd;7h-SJ!R3)#Oz+XdA}Es<2c5suD7A)zG?+k z)dj{5N`FB2u1-T|BmCgzNj00Tjc1;4{4ZsjQdXBC=u8^NZ7nVKjOc_;A4{9tpO;KY z2BfSd(KuESGrLem!E_Cc**2Bg$6io!EW{$X(cVKs&v27_syN$sYjfd5y$sKvAOkbd z(688TA=j;j**y3_h6~$!g?E+VAAwsPD88(gsN;%n`SIDO`>ekjKKUdieYK$Z2+ZD~ zN$k$HpSM+W2fVR)Vbr9kakj20>NVwo#KC6Q&Dje*ER25F2 ziLYC4rD`>MYM3Q`d(pMFVP-L*zO;O3C~_%y3)nocE?hm!6kJYIYxWh?#6yy6g;Ix1 znCSGC;($(al_oqaXQ3~-qF-517HGS7Q>9?qd?!TLE@c+1YjLcd^d8cw;je~|ONfqM zw#V$1EXt2-xOq*Rd8gtg?vz!rTm$*)PnES;u$k-QO2CI=j47|uy_X&qv|+&i5-lMp zz?(lz^vA4|R)LkeKs-JQE-jI-bi|I=%k3kX;LW54oINhyJD}{gy>Gd6>Ug0b_)BF? zw?baz9KbSxoCSOSky2#w&IlLpGNjewSx&~rND}-0%}0+ooAoTfQ!eON@}Di*o>JjM zUV2m0rfPbuW~?!*Dxedb5;tG-CZDqRT;dVkK$dYLN%qOQx2@;iThSJ;-XiY)T#ufG z^kIwM`E*JE}>C31; zx0sC{mV*927am4NI%j2N*#%rXzlGzeM0AZ-Mz)(zO>W*ntl_iClv&kC=yPrATQJqH zt!tveZCgoS9G?3M9Y@Xlh?y6*X?LYr7I?uvZgdFQNke{fCGf(*9_{H*QDG2a`PdvE z#1kZ4dkR%LoFFjTsopj8MNd5U*(UW(R(78DAf3BfZG&~8WT>2KRETN%CdZgM!$y$2 z}do)p6ELzR&WTm8+T5Hf#vy_{TJy^jJpafS+GA+IIl2SaYJcmkC3u|-02=E}eGyFS0RLrfT2pxdvgKed2QJ>xd`u@$WFn4j zS|bfRF}c=$2;T^oU%8MAtJ*3v4da`=d}hrIMU!;?r{LGQCgu2JsI&2hDJaB#9G z-O>f>S}YnwM*5)UuX9R!4|@Fn~dw1^Ftszam$RV_xJ$FHS>CG-zS8wkZ;oEF*odCW@NU6So z9jQ*2d&qx+4qm?gg>#A~2j2m3YMr~?Oz^~5$=S;%n7mhN^hKjQG5HyT0gLvbj_@M) zI(Fw?gq@3AJ_8T`NdDnwl->c0a(9N^(?m6=?V*T5N3KEW(!q@u`R%mOnO@deYdOiJ zU8Ax9+!mP=x;!CoOe!y*b322qADvi4F$J%X|5Iv9csRL{&A#xB-yaB_a(MUu99tH$ z7Yat_oUH;jlZ_}pv}5@Gdw8B;Mc8_XsX|`=5s{o$&I94cyQUXFIQ|e4j*@sP2sva7 zA*=WzqWh5O3|x?b+m-@8$ZI4uKyG63F$h7P`9W^-!((taLvB&mF8&)MsRF7Gob7Uv zn>u0CEu;6~NJyHqL?%~NROF#|iai|Z1#+Zgi0I>WssfDlrO`i8f6?W1TH`vbowu@e ztw_kP$UhJY`m`bvN?dfI65g_JqC_NwVw`t62#KoSwSK=m9OthrjO8UwIFFDORY_X^ z7?dE~=bgEKwEqRi5t7iWRMIjeL>i=e-})#)s`taq$oTKR07`d6a$HX2#5!d2`@CCa zhlqsyX&AT)!c0rleZCK5B9emsdG9hfV6j|6Izd0FhK*5Xx=l7pX{J)LDCYvhLRfvuW zCeJ^rjlT)-HRYCyD}{m%qr!i*9w&Z>i7&DO(;EJpP>Zq2@85@XLT)7Es1X}Em4qS?;*-pm5y3S^JRdy%ksgKE^BIG2kz9f1mhHx(y6f zuHnD`03zps=M-!BQ1ZvEs&=j4M6jf2rA&QLdb|}%B@U&@i9CzE9}3IoJhFUVz)Ct1 zEdjEr&q%)7i6`q}C0#^>9ulXJ!>-sZozz*QKM=7(WYz1&{8(G>vxwT^0P?qY(xQzk zmW8}Izvc`4tIZHOUf%etTcD))yL7|ftNmS^*ke$S?2TM)i+t^%5+VRN;gbO;o+q(M zdcD=hL24G54P?DsfbC*a!Y2@Jl%8MRiHJEA5YzJRFSuo=(S`?M)Ce~(k$JFrg~(?O z;t@C=vVtX^9)!XTo1W|xsy#LdjisiZH^?=HV}d1Z$pynzuqtwi zr{L(q*Z;?j%JXLwz>!2A?yUczfgNq^9P|N(JMC7?<##?A(k;VJ7W@a~J;!+7-9d)H zn5Nq;SX=oIwjs_FLHBpS*%76U$TLl|%gpRd^tN|Il+O9M{r=5ux=6=y0PKg3Ti5BwpDjo0$Im2*j6-#cr%lJ)KO#$eIVlh$7^R5Jz?P@D{N8N+CCz=Rrh z=)vYE!nOl+6p-jMPnL4(tfh&^%X)#FSUR*52$5lST;&h#GBbYbH|nX{r_oE6Ui{wn zkIwqZC{JB%-xH%029nUGo`I-99m?b)|2E!j{T<_`2_avR1&~Om9ly&@8@s=9UbF`~aMfkt89Ggb$_cf(|NO zBO~&ZC)`=^pH1*q8&OAxs#0bAe~QVTi~hCH7IM~{{S&7#_5I!-%<*lF3MiQSa#SH# z#oo08#s7J)5rbQ>l}-(ogFe#>U227H=v%jnev(O$Dy8X}i(Hys;xCfZ=^*zv&XuNjDfh)^X<) zM6}g5<3;xu?`LEbWhY&p1TjLsRsQ*~BY=0c8XaYGn$ZJ+Roy+Q3W`=mZ@qFh0DaHP zJ&=%ODJaob{+5-hAEX+1Ij*24OMt2ZAmd8jc5mtqx1lDQ(su39PbhNkeH{Hmab>iUzjJ4!Xe%lmNSQ7BF6~w*K5EzhS#4li z-FD&$2sj|vDI&Y5rT8y>8{7yrANp7wMD*gV4*+95IGL7yz_hZ`|HT2Nsy8r#t(7i4 zi+wR5d;qk&?(5Ti`*NV2J%T{9KM!9kbG|rP?kG?Xd&`XcbD<-VKA!-Q%8zKpn8;ke zD~vs+mTflFD(WcmM1MyFTOtkic_uCx%uxse03aBsCBw8Rs2WeHU>%lrHf3p`1jQ?!gr`6bbl38|lrB48qGmRbI!_{#8gnyB(k6U`jtRho6 zH5~f4rPo#3M2PUq$4gft{2{Lu7Sa}ZWwzaCalFrT8?A+Ec)T`%33-CW#9fB9(Xp{x z1|W-O2%;xV!rX}Mg;v9J=PGJ1aMn|Jo790&*|!n8G92~qTMLcq(^9_~XJ=FT0b_$$ z=^jcDFcU}7VvX<+c=J|w&8!L0Uc)EC*&sp7rG3P~IEz0p8!wg?xKtqb1BQh+VtRPX7wJG-*O9O}o&w~$VMjm-g-j9_MCG6JP&i)+<5vmc8^*1SYXKk*~@ z3S{eT%wENRgzJRkFH1R#oQmX6oI*v*nr6_g-zj4%{5DzOD1$^L^2Wf!-hV;T2bS$W=2N8*W_}ry=KYof>T7>N*owdrZ}pjivH@Y64x(#eE-Ej zL87^(YN28G))!~E+D^^BbxSE++*Y57SjF*4rpK=+h2pm<+;R**@G5ND(2olMkLp<1 zARs1wa2Yk)92SS0nGHFc*$qM%?Hr$$8ea;C>CR*PO?W-&=wGvq&EIxW^`*4A3~`9w zk~;N%0;{%2Ymlv@0k2fd!s0<|u}kIMt@b-mO}BdXNF-Sb1yeB=m3xj(tiUD1ie8Qi zrV0i?B0u7 zyu@vAulxFYZqAkC?ew?JjvX+h5isu>+LG69#PJ6i^|FL@LeCyDNncXI`vz3IpFEk7;4(E`uwvVq&;&InE+XL}Nhaf3+ieeMXmzPnSKMlQ zPX6Wo;U~VUz+Bc<%_Y!kX_X7UmGR$%OqVED$-9g#!9)T};WwSR(`4kqF%Mgsr`Ca}cd8Lw-(ZIq0FWzTp=D+%MO$4~xEH<@?uAv? zsjNy`HTqOAGZhGm0srCNnq)E9kXLU6)K(adX$ z8C=uQK*)XH`e?glx%=&`vfxF&rjJshllLjcSq`2cSWPSFQpD>M{HM*bb^D;cRR2>k zY|v4;_S#aN4y{D$yu26WS~*Y!&s<$RT{47%DAAu^Cw=stff&x_JD7RT3G_}*>cDSp zk_y1fsTpm3;F$Dd=H)eeHAfFJ(CX2A??^~RTt(}B;2nH#DT=w2Je{&q7F6jH`iO`5 z6TN%SmZv4V-k;x^A^zIueV7C2P+eTHhY~mM@@#r8-?WqV!a&QFx^ctMuwKmmcMSf> z7fq#Rt1N~w$TGo8^P}=Mi)-#~w<| zy+5;HJ?ESfr)0j~q5Dnjx1a-=oO3`8$8?GyBs9;i{f_3I-LSg_{a8P)))Xg5O&`}@ z;7&rXTvhj(LLj#upzC*up-TX=9PbVjg$ufZBA^kEEJqr;jsjyt~8mlCiPx zK>YLG)+D{N4~bp^*dKP$Zej}$+eGaYFp4)B^rZWqt4^I(ecWx;c~qI|4>zi}J8jE8 zi{qA>O|r$e+JZXVp!K+|=h3|JrN9O?x7v;a{iyk8Yl6^zo~`q3=%?GiQz@Z_M{o~@ zTm!FiY*f(xOvHKoxLXb!U4GsA@rid~qOvjL>VOgMXh)6x+9mKb*f=!oByF0Hp_fGz zRM#Xq0fbvd;r#+pD{FxI4mV4qzW|Bj5j%bbV>JM2hM3P=E^1g-kO26FYi}5%w8pvh zm+$Ln{4}q8P+y}^fA5;N&~El8weAy*$2#BxD~REd0+O`D?I|EsYgK60FDtg_tdD9wiEPYs=ad^vmCD6wDL=Hr? z0BtkkZooPay9i2{&3r;pA&@oN^Pj`9bjF*@x9cY&lxqfDsGFrz1ExV|diY!Lzd*?Z zP*3TzvNJPl$h5k3nuu17@8W|W>%O#H3xdrB z+?Gpa&Ioy{u)MbV)wpO>BLV0>y~Lx9>?9NDF+p}w+?5CttcgiC0!2?2(%HKrN(kFf zx!*SD>k5ts1CgGnmaYHt_-KL@eL~IsY?fpSz|&`|s4IB|j{ek{_33d3Eo;Fi2N`T= z_!e zT4&8^f9DVO7#)N1MV$S?ZkK_i4Gzlsacw?Wyy0Grkw&4LY5WhW(Nl1S6cbhPvQvA1 zm(=~jvF-sTDD>3hpE?ydFAWt-`wXOBzO8#J`i68XET?T2e%`xz=QRqaSam{em_EMc ze3lc|Zie`2M8p2rIr8&S<-g?hwonRh7@t3XJ`4rV(`zms3Nlm%#)U-%_ki*$zN%+ zO!na^t;uHNQ|xO|KEO?n@w6m?eI3Xg#wo>^fmq3R!0%W|Tr#CFID-fG`@KQU&tJo> z6Z6-)ts`@`KmM&^;a}FBIXlAxBlgP-9H3(LY>*D#L(?uERJpCTXTE&f6}QU4#)dK7 zAT)nwvy2m8>iOd@$|cfLg$2FR&#Ts?8^&O`SY7#sP|}Y z+E66IcL0;dy|aAD3nZ`+am-M1kZxYa@}{u4?-QL)f8f-$`jw!0aG1Oy1XDcKB(+ZTyBU{drO@D z^0apn*lViVTfsCZ2)9k`_P6#?`NwoqUeEq~H|L9Z*W@W>EpQlbgS-b+m5UE$_Zaem z5aHUsoG*{%V-5HF>c{MwOugL*;>Fg9K1Ad@oPzfSbB0O{RuSM=fG-!B>*WW(N6016 zijmpexpSknd~ThoChJd-=0P^FGpSM)yi4Znh|H4Bhd4xUS*Gk3@DaSI7Z`>GWRSN} z0ySoe@rbMg$O;goKMoIvZqDrLGPKUPqav36M%)&&PHzFv%5K7a*HE5xUc91=H>C^+7^(e#K0`uZq& z*)8wBXbOc|LS4>X*Qv!vQC>468zbYy&KyC!fI=#=d5ZkiEwm%vrj`kK>p`?I)X)}I zEm&0oUK38m>vXwg?&U{orIKU*Tf{GCx_iVx4SxJN>r&=Pb$$KXyk!_x-WPDyGRLZM; z1yDf3LRbKy$9xZei8M^C-rx$hq?`)9?DlsJ)Sz%SZSQrE`3C?t!bts6Mb}{Y-+!jbSxvJ)7!a5AJ*s7%Y^?lr}Xv-f{U-uc~#NBF{L)J(N zM7cI(_$0bwuTQugIZVqq$zEPn!{)*QC1x>T&LUt5h)j%)k7U`#9d%t?(ldkvgjBr8 z^n|p)Q37u4 zqyyOAyay5v3lV_h#2M`Y`o?oBI}$;j!bq@4yka7`CUlF^wZL7UCuAh+tKI?A?H7N3|4J#X1$;bey9Qg;6e6g_0`P>{-9kVqa{~Vb89l{u*nOfcYsY2Mq2)@j2@-1Pmy@n5xaY%7GM;{>%aZ zK#qZ;Ee=C21-Ht+xok_06uZ(mO>fV-Wd?mzPEjy4Dc-!`Oy zR1J6dXVcrP1q2DWTxFMPm7LAzE&!%L_$6=+libdn*4*1aP@}nrm@L7M<7Y)BkFx~o zEd1H3x|%ZBLrlxv2kXSN-*hgt=;Auu;`qgWL%pW>>S-o~8M3{ezjkb1nxEhTgMRyV z1tXl=&&Hv-r?VUEGDwI<^=C1@sA6VltyG3!HeVUBM_}7U8r}rF-w&)kCT9q7J{q?h zX>8vYq%u!xSPdek@fYF)TB9S^V0+TrL?LwD?hL5zR0+DN=Df%B?kwEIUG(Ez-Dhlb1Ynb&-5kJNG(76 zd&On-Nw9z&Ky^q7>MVnxD-GHukLFIAQ;O|ql{0qn%g+-iw9K<-dIo1B0QMf~f}DSm zHCl*sed0{n`-)>I)G%IeoWkhlw20Jpz*q7-rxW>R1tT2Lx^puzT-jDS(C5GF**rGsXaBRh;VJQLD)YktgUTGb^$QWIatKn|rGq-% z>!j!TAa)X`#SZQ|gYg`;tO~et^Jd$+t%DnhwM!;t;=2-IUTL5@()^3RMlmRK<{UfD zLbi29z2VEi=}=SOz@?9#tr|hBFeFt=;_rex`;(qM<4JMsS_W$SZ3B*U&<=vkKC7eh z_HfpM)M2yLo*?IlV%}L9+X925Lt>B>eSVRM4&=k+UnzSTRfMBeE)cz@wl})bT&reF zj7#zNt^rj7NeC5lbF}g6JvSc694#bjjyB3j3|IhsD(cc_7{7!KUI&}LoSl%I^vJMV zkPZ*5C8x7mg}ThMRm|0@hiSY2EuW|A%rStTuPF_vIA5H5?i_(Qd(?cz`iN~mm|0Fc zHF4X@b`>`(gS$w{Hl;QtTDh|`B_m`8@Zfd&pt9#K>aLq2DOUG6T3GZa;!#(2k*mS* z6&?|CMk8mzBLo+1e?Jm%f!XTo_q!6)7&A1qre(?6s#~UJWgzp)$VfOuZh660fuqU( z41Vo+*n!BmUW@RQ>Umn@p>YEU>ff+hQdL92bo!-)tgPAb`6vZVZFYmUyxu0LiG;4- z9%SQ3O?W>E8X(LPgI=9)8|Nx}U(FaYX-5f9SOeof-uzYLY*5a*lZ~3-n3?FVRoGq4 zZ{OHUfnvm`9*FXP7I0GD`kqPtYDUz8nRNp}eL}W7^kuXiNX8;!?rL?wS0LTSHoy)V zIkgtxu9@(l7$@}3MmU9dnf&0XHU#f8o%Z{A$5vqWa=R<|gP$c&>E0)O^HjJmrH~SQ z5fX7x_`hmE4qf!CmUGaeB!fYs>nfp{FB{W(-eKN-c6CFgQV>V#p{P(K(-8G(^=fjJ zm%jeN1fBzQ?G2_rwJ%mr0~=bbarvOiJ4Tb?=KavuZ`u#mj2&(e=p)Jma}dJyD+L$n z&l{3{25QN9l(M@ow@lYhmjuyY!{5 z)$OWa$w>(^uU>}x9!$MF4WUoqd(TLKvaglj`c|56zHwu?$zI&`k^3NpGOP4rLzOc~ znTFn<~GJ*ymH{@>a_pdGHbJ%qvBF?6unrX0Tp0N5_Eu!N1 zw+Gr?U={Q7s#j}CTZL*^#$!^`QRUjgznI~*zhSS8ngF=B&+>e{3n+N5BSJFd^{)=Q zFxmWBQ!Ah@;1shp^Vvex*&AU|XXMNOYqcW}cN$klKQ1{?b}beUWmI~M$5ZXw(Nu6d z2)`pi3%vfL=D>;hqQ<@dTGrtIVDG)7n%cLnVa~B&2ag36DIN=0QBjeO1yE72fPge9 zQlv>Q0fHg|A|NV)R0R~NkzSLih;$H;7D}Yo5NbjQN#3wWi`TPz>Fbi%*P}yJo7fC|pBq^ijgBe7hgKN3`+2#n%Lg71NVZ+<(%&v|U8(aol z0U#gn>L6Lg7ZZUu*Wo-nOct8==KB0`4W-+W-W3&M+Ua+N!N$Yi3+A!+1Kv%S)_~DQ zXzkshc;Gl`?SktUJ&m|gc!h$q#23VfLE$peCF9yzaNFQ@Kpw%d%fP(o-`xP0@dPO+ zZRY(9-^YU(*sS4#4*-uuplfpG0%q_-;ItExs`V!ql;8!>C(iXW4mk&M{L{lnfA*iG za`1=$msj+!ct!tczkxo_{|R!(W@x{x;uQj`oj1OB_)#3SazNZq?*#_6F1od3g7Ja2 zr{_81fV^4#SJ*(1V`-&OIFpC@Xr5S3u~0KO->YS4&IA)yaVp z(IvjoeH3PZ-~8lEEiiQym0f*1JpFx*Z z*63Mk`6mBy^$bK;&k!K^dcQ{y8Gn6(JFK2Z)Q-b<{#(}R$e3GN6|k#{X6wcE&%u+B zMb3^K|36t&ezKl~zy9G1^Ay>_fF*;1K=Gos)sJ@qkmTKIglxRt3K0t(Pe7n~o!)86 zkVRmp=~pNU^8iO1;X6EUcFijUCZG5F*9gz(^$&C^^1ea-kMLvHR$=%6CJOlga;)M- zRd>fM`sv1U0;f$tlL>_(6@Rr0mkwa6F6L$wk2XS?_k7*O6fMlq+9qme;cYtzkpb~! zH?gk-ru%?3@4dT!M<&3tnbNQ0Z= zj#^CTYzT2$^c)ll3z6z&h){7(y1BB<5xDC%Ph>aD;tpTN^)%{kj^1{QdWcf`&nlS2 zwNb48;;NXs=Qvew4RJE(6A}v7P>9f9=m2iYbZ4Mm5uR>$_wHz&8KizO;?|DumQ4UG zu8MQ6z2^lQYb0c=7z}XY=iqM}7I;>C+TtZBJ1>vD{QCAEO4(!&=nTcxfp{^2W)f&Q zg;3)G-dR}lYCSSbR8DRJdhv1lCyF8-$ou`K+vzNuKD& z08^y+JH?YnKJJQCM3A2#_E_pUA`klp+)-?bu(xwji8ZIy{l2`=xJ=}*?jci0dzAOMFj zG9?PdbO+WjT$1ngcyOWxwGDxjH@@-w(aM!{T=r}g|3dOP~IaH(+FSYF&r{>1* zlw*A^Z+3p5CdEPd&bI@o_nrVmoa0I6mAnN=M%XPqr@63j6L)K1+6xglw0q3>nRwbkX3LQU;h1sf{KZh3c2GvmV2$ruzM+y1A+H6=Mz7wU;zpq1 zfIy;Vmeg{XW3~;9m)-XWcYZiF(+U=25F;+J?M?TH>Ax%$Z_Ut&o3Y{BM-`n*#SSJH zpGf?(Qhh=CdKf%q1@)f~+u7^PZTJ1j$(X)({4KWrIZ%Lg86o|y_&AY#DEde1Wq8@< zLlOXddq-R=QV%Fo$>ZCox`NFB0xP3FY)ycl!v5H^BxF7 z7nr$6sCS%5kj!L{m|QDbp;#K6ehcmg%1I!O#LsAqHEL{!%ja!cy8ph;>@g*hto*Qx zMzyqG$TmEPoxtqj9k>wb=D0$TPnTcpT%DxWZl(1aWu+RSLn>Sl*= zH{QulR?L8+OPle2HwbRnx5_n`^+LahZaa`qB0R7Y-5lBYR-FKRUvCPEq9I?MziK?C?c*@cNnBJ4>!bIR8f#!KhiC*=7CIWsJi-~|0R zknQY*(kbW6Ilqv3L$D73@cdQeGiVNC1U0sDb;&ID_9Wf5;qi6hFVqgu=Z1s`q{4F0 zY97|jF#(woKyc!TPoR`#Sn)9yQTG50%m&02)?9K4Wc_7y>6FHvxw_K>VD>^csj(%p z$5{Yyf#wt#ol~8g=#-0^a3$lr{;cV6Z9WQ>9SADWasd2}>ld`z0sr{d$`W+2^b@4! zB4NLYfj8#!wKc*3{uOOe_lUP@Mq8Ixw($gnk3c?UL*lGY($3SI?EfRfuD=9xQu=U!$+>Y4u7ThA9vs zdT2lmP!8T<{1}E(JSuJRK7)6INT@F!q znha0%)i^=H8`JYPzme+p&UgrHg%Hm#yrVMQuX6yp4{kdOAca-%2EpkoqEc3!1<7;i zJcnRg6y1CPR68DvM52=_=pQqfagV=mHpM}y3?TbP4u%?|8k!&`!@B(_p@k3XCT$u> z`09vn5_S<@-KCREwvyLkU!6GFbPhI>IpCt(G6*C<6Pf_&Wo*9NR1q8<;|=dvIaGOS=jFcTN3Yv_KsH@Zmf{ zebL-5+cQ5Z9XG=W?`Y+d1=$)fSJJhMkG#+XTcM-uAp=DG`ePS4O&^b!`f%^;=Te@| zjg>3nT<0ft9}uJs-w=bMe-`-qOOxc;x=BaEPsrhV3e9$E;z#9}i{*iFnK5FU_-;8Z)S0@?ZMo>zpg)WA1zDe17u>m9D^u!cq# zmd;Kc2`O>yy^o~j=3N!`2&6%q7pP_iCi)lxVRJ;nU{(%lAf-_N7dwuS#(GWDgHO|D zZ(3992akY=@~#VYQ%4@FUd^-KN6i*4m(Ob-Jd)QazJDH9yFb}URq9BmewHI6#8|vV zppG*Z2XgaA9Wb}L4Gc3xXL3`Ot`bJ)phoJ3ZMyfPb+&f~Xc-W200EC#TOkB; zJU+PvU~L#AUFOLbv+&Rtr5!fN%=)C*3RWqSSxLY*g?a||E3|Pt`)1jt@Ezc=mMhV9 z61)p0`PUdw7Hz0Tld_Kt$c-tS3EN#>|(%`@*t|~9t38hskbW?iTv*O`UtcDBGDB#Vn zZ(uVhAyWpx0LjT~pi&J(43iUBr{W)i9VT=Lt;Re0`6!}0#p>Y9Z(o;PM_)eKq7q za47637ren}>bAX8a1XFNH|gszI3rNnSVbr-bkkFF55Xno;4McotP8%H+wp0Y3~&lu zM||@E44YzZaB{8+9*9#v64kyc^#-mI7?5Y*T!ks_Av^C=vb}9%c}o{qq=48PJO&M@ zv##Bp=+>ZRg#6FS%_^6zT+TIQRP zvLRpob+IB2v7)%8TL-{_Eidfti(afh^<~_Y$U741FzU)*_jc9-0aXo9dDhui-*g zCX%x|#sc?g)Rasd1z*3eF&MQ=co>)ec9CYe37DUpLzg$$3c6qL1s0LunkOr;PvE`P z4?f%-oL&r}zRb>zaIu%Oc%j~*P$LQz8z`eGof5Msi9$h)RY+At9sTl?CCk<^)f)<%a)8}9WF6|i{V1+2JpWMAN~YfyeUXF z^ePbGf(Sk?;T8>>+(V7Ae}+cAY#cmWd6L#0Wvzg0ZFV+OYf|qc;!bPsKJg}(! zC4YK9h{&G~O@mPyZ!I#4u9a(!|D&BP>MCv&n8e5BEsCH;{`bX5%!B-(5IZiDFACPk z{-~+A=l~8(#s3CzWS-dwI!=}hTM3r%8v$7lBLIt0R`AvRaGv$YS)bl+CFbj~QLhau?eDt^f zQ)2`9vj2(XDm;v1kcXj>_hv23v&oByVfdN@ zF!0dhC+aHPfj|2bb&dGP72@hg%3aANtM3O_5dH>oEG-$L^Y;3imqe)_|4Eek>n@SE z_m^N+1>{4#o7;!5jb~ta^+qEzILFTy|LdOA<7d#N^3y*tj(0%NdDhwjJi96HIhoG{7EU~HQj>GTJVu?S+{OS=v zRW+`Q!W>+xs%Tx|Rs`_W@hjS)dug`g(Qe`AmpX&{o7ypC;aanhMIxSDN7kXSn}O~P2;bM{J`AA?i#dc z*u1d{?qSJVjie2I!Tk@%>ci?8jokX^eEdI3@81t1()+)yo(*N_>RG;N10Wg*Jbhlw z01sy1;Ub`aeg98VWVnZ=R~J7!Cv$V)S1u#Hg`w@ZUGO9X;gZnfe|E$912=sEIqV~C zWDf@Jtn}o^EJW}({f-apXO}m@NKwc@+X3lv9|ni#*#+~D5mTF>0Z(*f(OaPR0NqwS+dV9} z-m%TiYBy16X5{0pK9S3iDrukfID7qi`wi6;C*U041Y=f~1$d~AO=^{s&Dhs|;xjRR z+;Cg^2au^JgNOA*`!5J+#i!6+A62mCeP6F^NsSe>;X9%`51yyaggtnueELAXI!!Qq6f%%pL}4@hcX>;l%99NJZ0GJpBBq2>DZ(Q9?{uGP-vACp zCpzKhdQ&XA3b_(&-K1I3)t@OT8o>x7=rWVX_bd?NZu&88q(Oy}s)-8#&avJo`SX`^ zA#x}8?%nJ08Ep05Qa!*59PEorDVcpDrwZepQ0uKFd|8@+A%S;}4%K~6CxJa$9Sa^$ zva$TadD@T}2(S6+K{zj@jn|$0cJ9Cl4l#TM@S84p=fmK2!yb;1zKILGgZbp7K z6dfEXiyreU?t`_XKsy%RAmnZjJJe)mMsI|4KabElQL_Ca_qjLU{)ClhM}81j_?pH3 zW)ZSoz5zAz^IZ;$EZ4EuAh;Z%^+P1N+y9xD%0jwdR<+j~|n6Imx0E`a~2-W+#h|M;#N>Etn^IArrjae?BZWXp%2?m1TS-N1$cwY4Rr_M4O$Xd*)1f4 zLj8-Ue9*S5;K)_+1{^(S2BqpRxMpjd1BF7e$&yBe}?$z`LAQFMW0ZgMZ-Tufx$EiXrM z)dD;iWr0?iWybN{l(l$e@+Wu8htlB%{RepD1PcHb42_K&X=C7Bq#%O_J~X%(Z#oC{4_$#(Nqx7 zqXY&&iq3?V0eqU2Hr~`aV;x+iw=P-`_CE${n)9T!&%@7?y1K`*MY=Ko?qZpq^;nF_ z&wXO`F42lOQfSs1G(HY^M(V9@#PJiLG6a+X^ZlOqGN9iPI6XtEr{^BXZU=%47bXN{ zpc`HGUBiuFNB5X-%B2X4pLdu276?k1dRT1nB3-er3yQF4&zG#63zl4{h-Xe@-)neQ zXG;{4gb@=~8gww~q!+Mu5LiwEoa*|36I(+V0?-5dBXr2DW+5AxV=|n6R&H==o(SSH zc$;UbSW?4SKSpe(l-^^)+p%OBq<3eQtH%NZtZTw~E;1J!r;au{thCm#HL%G+2Dh_U zM!SYJcraHQ)&nf{1N^>VZUJZ67W}1PiR`AF`4wUCFRhBk{~)$NMT&OCf6uLZ*jz5Mtn9xwe0Pk%GXfDQGLhntbdYtt5-uSi}X-KBZYN7&;4nR1j(Ha1QLwZFX zwUJIxM9=}tOwg2;mGY!xNCAjl8c-3d?oI#4&P@INfIQLI%CX>&t_q3;*NFfo&EzRu z(s&^xYeSA#;PPmBkgO?@vWvox^+0Zy`qTIJXEhI5h0x=_$#Q;zSJU7BTqJ2Oc{bz> zr&A&>?zxtraevey?=dq1bjf|h3_1`|QwQYye>*)|uN5wk!si*UXz0vU2@D^M zhniue(~fi$)<8VWrrX{?^Z1In;>|LHfF-QjjMigUl!JrB`XnEqBtyyT<%US4gcO4g zjWxmgc&0L`HP0O67Xf>hK7`^0pTZ2*-k;bD?#kPtmC3zg7+cY>88Kwz+irKm=U<~m ztE&nS5hx_4dwfGEiYACF5`fe(`W-qe9$;`oX;!41LbA75DFyT`N!m?or>7?}tC2tb z1;vm=SN*d^f`h9e;Czyjhan7_je^Y^aO=5&ZyPu5yP}SURr>00AxD;( zgXloL?`=)drK(V3c2jZ^K{3e9CUX|$fpVXq?h(;kJa49G7 zx8^@(H7;*%UJw(ZHQTr^$a!QMfW_mB%)WeTNQTGxdGoT;4I|T|O;B_W!AsxIwjbwk zd#N!AtG6h=R6h{*Lbg4-`j+-{-VlFoo@bubs@E>=Kf6El_vELECaLEw!f83SO~*Om zpf>wjbK+floumVijMK-Foyc@2@{m-kjJ$)X+zdX0=;gX|YN~BS+*FY&OB>$ZjVW&J zjQd)@XxCXmUjU(gK!XZVOkc`;*k2DnJPz;Dp;Y6BNJu23v~8kZP92&w4!TV+4f%tk;3SEF)T9SgzeDPM3@Oq zeci+F#qI4@65~#1-3`M#kG*^&;v>k-a=L~*Fo zq5MiHSg7Xe<{1t6gvbd=>J~Y=<>-w1PX*VtDjOV(SDZll+DunbONP_!(bVK> zrVZ86I`Ydz{gyMh;@@}hLaEF_6W0ixPrv(_MU&ts(4Rrl-K(*mnn2m4!|r=|Vyl?` z)-R68eEe-mxb<7xcMEy77@9+(rxvSd{b*}tWz(beoPJ+H&)t-$4C3^-xT{$hL_8S4S)a-~4i zNY83*bh~k!I`c819^c6fy1hAU-#St^KbB1EE{?YjuKMv#mC1N1E$E*UCDbvF z%_m0?>VpNO6DYF-K4*A0AG~!!0~0Q9zZKe1&KXYia!x$_G>V}mZ z%Er@Ut%Y-A&2XQCIINBSw#?SpFrVmT^~}YrfrAd7+O4|L$ecQl`Z9WVPL(~Z)VO;p zU=fqfdF>I=vWptjIg6F1>D^;*haIA(+u_;s=QzRy?ZUKXmPr6XHZJAr8{J2;JSw@H zhYosnUnak4wOp1!+2<#*%Kn`V#V3I>#IdC`%_6=D&)onbxp4JY$kT;&2@4Ay=1*D^ z=-$Gib3&(2kO=WtXswkctO;cz%j;GmtENwHL;4L%O>&CT+?RjzvR$$>Mod z?UB*ZGM-=4qHM>cW?3N#0$|1dLfA}Ia-_h#nC$(@y2A-vP#2*MN*=W>G&&kc09g&j z1A~GoLQPZyRI;7MxPjX1?BMAs>?fNcGD~f?Do@Gd8EQEc$lY&ZXUSqF!DA z#l}={fE&7guU--j2AF;Owh>w+1m%d?IGG0gR+deV&K+wp>&tL=vJB$PcG0^zuKn-r zWDp8nz!rHzqvEFa}c3Q)5rUCmjWk>^?*8Q?1 z-Eri)M(Vgm679_4VENIsmm&i*$fmw0C$Uy1zuX;S-o>|P%9|SsBj)bjnfcYNClyDu zZeA#|>U5o2VTPal&U)oIZ}b^N3S$v`YO2)v8)C6@W1U2O`tvin8{~xfar|co*H0Uy z(+(z3l4TDp{011wGBhsP6M+-K@?GJM5@@&}WsWQp&Vk6bE&OQ~9ewa-jtQvzehhiy z8)?E21%DnG-pykmWqV0qhB0p(IoR<0h7R7H;wKaol!Nq+y;;3!W?{?PmB=#3i{exl z_G~%$(%|$=s#eJFQxV9!7yYw_@>l=T^UINR5Ds3nUn26aRU3bS00=oA{z<7ln|L7& zFb*y*yEhCAzWV5s6007t=pFR2`bTB%r{U*rsG?2b_lX%F23+2}3>wqIEU!pv zMh;p>r(Dmz_$XXy9R=f>u;3*!>~`2rUr5pk!2qPB)nI#l>>3 zC{jdap@M|2Eqp_@-{AMZ#iH?zcf=`H_(o{|Fz?zq-{7;}SaSo+7|*HUoDpJM3ow)+Xhh-NKK=As%?DjNa{vGtZ6d^=FyS;K}Ge3U!*9wJZt$Nw3O8tv_-{gx<^NpkNdBXSiN}HB zy1QqIF7i@8(%&?c9wgZw7wIJK6$|zX@>dwNa%6*+R)2pr zgDK7f3gNucD=vpY&p%WbvyAM9{UJ>ix<2N;JH#BM(+f^_g>;jR7;Cmvg&om2Akn=S zwlFIcdAYy^hT;YE`!=v~o|>x!R|lK!l7XI#{BSXY34^$!ec=Y++CEK@c1|R!7u65s}*L%&00)S48A{~(3>n2^=8&~#(>-hwkK+G*_2Mk+TDJj%88wC$Ar<}zgXDC zBS$+MqR-k*S!UT1A#U3e&U{pGrZE%l3tklq$JrZkpqZgIoLcR{eDea*H z(vEHXlQhl>^C?40EJk9WESxDj-LGO{)0r+XcU-SPVTT5$1j56{AOQ927}x|ziS%{kZ7eRwK9l)`TK4s64u zN5ODuMERuU&i?yd?jb=Nq;njSEaN-|!z$k1_j#n}S*93jR4gFv+)X3;CA9Z&*d518 zr>m@_InhmDu_xVN1}oQZ7SkV3+!So#G%*6M%xCxPcyi&=rJ~6aabUsD0wKd{@*7XN z=aiF4^+*5RQKv4)Y&fD_RMK$GtiSj4&*0g9>ORan##cckZZ#_I>n<0+$elg>wN5X- zQai9OWZ_cr?gcFX(-ZwpU`)ktKCjqj9kc=9;nhM6DSy4`oaJ+lUN%$-~Qeu zQlLT9-U60698uClQ>=C1Q<96*NctzCcf8sTVTh7R*brVu_iHCF*id|LIp zid-|}E#~~3jXF|S`q*}*5lxOLso+E2FEq`fC!pIM>3K7ysb1A%Pao6*GSRw1Uwk)T8vV3Ctv=IKJ#c#GBe*jPK zkU{1F&mr?3J$C^Tt52iubgtqF;m!zOflb-FI;c~PmHiBA|m zIvuDgJ2EeP%=4JxbXmAlO=2k|WKHTGO6xpRhZ>XxW5dtEj#I&d#^?7Bt7_P`#xoiq zTm=`j>^2A1qo4-bxe($vycuWMFw>}vmVWcC(%juRtmOXd-?tsMzD#|+jHcqbZNFV$ zMSn(gMK|V&>u5u9l81!T#gt^ZNpIE!7^3J32qV)AO>6dixRRVQ`*`z_XuRJZ+m5{A z{B=SMixUEA*YLOUm8p`0@ArlNGVXA-NkE#tw;x)_YK@lmmT~MN__C%16CT4eS%}k! zIH<{S?u}L?daN_K)Kb2;XZ&WsI zv0w!Qea3p#Sc}~0g{MQ9SkQuI~N#>}_?^ zdGB`Dkc~ni>=Mq$H=)ijpfys9==o%|z;Sk4F;z!^l-r(e_$6R!(>?>wF3Lc4c&gSL zUB>jlffr($1dsML&@@2QfW{GenSQm0lV8npvlyy#z3hPmQ)iK^a?b~cy3=msV6#Mm zZT(juXUy%RX7OwmcNs*Bn0FeJ7JI~oozXTI=4?YLXTeh~o)*xy5)iNE+@b#mrY zs*lK|d38afgYnKxdmZ2Dfvt-)Ow73rRo$3Hjx=9J!CW18f}h?*QQ-oixsLEbuYVHS zC*QSOyoN+AW2OF^_H*PrQZA92}3iW|VZ%B!B$ z(XUug?{#B&bcq7t<4A?)M~#9nX|r_tn;;wV2A+fdk>pMxAYEl z+ny)I1#ya|8qAbPel5v!P4(Fiv`%L-8kTi0SRVeS>lPyGzJ43DbxhO)%qU3^FVZ;S zUVk{@>l1@wXFcBKP476WAPLn8!HJwhhUIg?lQ#5(uWzn3FWaKhP-QIY;EM-$LHTx-|Vl#L_^Y0 z9yhvC7E9HW&`d3INyIC^eN6APYZ9Q#?2z=B8t_VrcJ1s58a1=qHudga&soT!I1Xb~ zEF)RK%DorSgylE=pwVU}LaQy{V^r*Xr36`3k6_f?lCD$z@}R@yeP-Of#cP^57GYt2 z|9SGMC=Efo&6jV4uGlfg)Ns9KnwACxqR(}9b}$BMkf?6?asg(Y=kdj$A^lNt+6->1 zm^Q(oJQyf}N;mKjq<}5~g7@Nt+(*i%tUc~@ti3Kjl%-OS!Ax?8o_8(}j*;kcCr5-X z10%v$WrknEIwsub^NI!QjE3y*RM$iS%kRB|uNI;LoFIl^P=4puBM(&^W;6_0LFG?hA#$kGo9-LEcX zj4&bkh0x6N=>-DYN^1i=onu$R>!O~a3ZM&Ui!^Un^|z+a(;PQB!h-Oj_)p^gu0M(U zyi4>_nJi~fIHTKAM+x}X-*QwW2t<#+eF~KrhC=qO)R9ZVJsHu0_2$6b(5vqV@y`Fx z-tGT%7G7f7@ikm~j>MU8arL6aJ3?D5Ho1 zfJM5*?~&_(G@l<*XoZp)ZeW)fO^vMJ60Sp5{@;G^P*^Y5b6wbMA-BZ5JBOU=^guo^ z@8V|=DYP8=cc>Ja%>en~Q{HE%Y`X-p1zv}$gK0}@SS<(*ISmLG$-4jnbc8eB za%v;xYq+_3gCK+7b>LAzJ<;UG8L0*;olKGGhzm=@T=KFBM>a#bk0q=kNhng z`NlP8FN^L67M=3G)R;h!c>d-K3GVA3Ca{HM{th&q3kWsK`{5p7`Sdu&7vpLWgQOTm&@Vw$noD`5C87H zA|F-we-35*pL{w~1*>i@m?9U?pHW940C)t#|0#y^fAWq0tD6Owz$Ro430o^R`9+_S z5y`LL>Et{S1Td1fE2{2%{juueXAu~`T%zy)ajTi}3m^`tYt! z-ogJD;WaO^#&A76d-JF8`r(rB`q1&8!s}gsviW}gWkp8Sa#W)I&<}x;kYnleyhlcU z3a=mjDZKvq8!1$H{rOMf^{!_*Zeuhpkez$$etX?_cLvC`xvon1Mc_>4_p&^{L>DC{_LOjA>?QOW9yao)%O6n&KmHV z4b~aBPL#C@-W#?XG9VeUA1IDUd(cZ~`E4oo^T*6Ia8BxghYCvG)!k|fw=IlE@Nctw zJAmV9{>{!QM|P~aim>YGmXW>;0Mx;;g^H)gA}G6Es(6Up^yIHH&mr_+J9dUc#JJ!m zWR|82uxYbp;MRjhfX6#o3VHOdR*nNa1ro_i^4C;`uB`5@Eac0LJ2BvQp}2ixP`A)` z>AB{iVj^w6Nh}FafcnjcZ_VawZ{o};2@4{C6)BdKV00OJ1AR1jyl4Q?>}zi*A!>t~ z0&J?hVq~e5PeRdlw*vWMy@Vs5Z`lUg6ihBz8hqvr3P(e*(PV<>r_W@7j#vq5a+vvm za8vftQ~sDH)0)L%R+Ct=nCJ1q!1CD9(03f5#Ifg;;8i)7A=ZTozew1BFW@*5#6-1T z9yVxCnRDWiSHy!cO{B z2giLkTt+dU82-qvn0G?z#6{aIi8%F0UU@wH&_HBGJj%KYsw!@?WKHI3uw-4kIwZ`Xs5 za|fM_v1~v7)<^igL&ce&UyVjzYa-#Dx2Ech1^96^i`0|Boawx(7n7CqTETUoS;8wq zYPY*9z&&wZB`OU2I|*iwq5Fda@%l-6s@Kix=SZIYnkyjD2kvF5Fd+JYq-$?;LRdG? zx%RqFZ=9d-o1!^VWBErS9A1tgBz9v$!{GpPDLY zcNm1EI8$lP^N0*?z^OIoFgU4(MP6xCKlbj}e}ngSxhsR4_izICHF~iN5NsF*`UKr}&lC;GG%pHRj!E;&HmThn6(1>96p`dJldDaD zo*+!~{E39}U<2S0LcL6y(%(nqOeI0xf-zIm4n?3JQ{2?f<{G&5FT{UcR?-f=cs|E% z=4GT)NKj7T*24=OX#v~2!)}4Wn;>Sg4v^}ngNw7tK<6m`VV7}AYw%=5F3ZY=F{uPd{(Y!9Ce4DosmfsGqvHR)nSJ>$)@RzeM}N6 z9%_3o_GG7O^sL@&BLLRy)7DC}AN0F!xi}ICu$(^LykBOl)eROu&Sb)|?Hl?4Fb&!+ zv1?%zFxvF1Z{#^j+3Ly9(#7PGv@+u*x=DL~Q=nlTD*AZ3!ou?N?3;xeoaa1KR}}6U z%bqfm9Vj6_$QNEU!KMa<^3zi@)tISAtbqdp_od$gomvB5abR$WtI1DINZX`b!;?t4 zW54H1*l1Co^RP*cQ1ujkgW_Hfj5YaNn*pJ0TwAZ|xi8W$T_5kv{;UYa!ANo2GqZOc zQwxPx$!(jm$kD^ur1ww>pg0VuFia@j;F(*#iAR2_R|QuR%U0xGFR;;?+`w44P_el= zo^h>#_N9_@;m7ezLl)WhN!jB;5|5*HTu_BkI#i58a)ey_3;iaF)8U>&OM!QJ2WK`> z#i(h;X%@GtgeW_Urj;naE#Ze2+zOYGXubk?ZB{jnJ&J)r?;#+YhJ(V<>46s z1Vd>E#Ua)I=vel~<)4lzpK^0)tGK|db$R4@)MyqKqmq&CmF|3@@uYc-Uw;O7rtL0+`0N~^M2g|fD+3E zJ-;OIbWSz5z42?tMJ{PpRy{+zwEW5oY+2 z8}1a6Qz%U=d$2`*_UQ=$2#F%1qodhhFKww7(_w4w@1So|zM1}P?W-Fw?|01CF|o2U z<#9+YWvnB=wi3N8T6gO7TD2|?u|s;pj_DrQfpwsUJggTY!?;e4RfCQ12#hMe!@Yih zoxB!Cb>9!GXXCsA^7sXu&2wbI!gU=}=mU1n91KM;Z?$d3_wF4C716Jn{92UD6Py=E zZE(@-18mImWw~Iq*XZhGx`4-I=1?4FBsWIdo<;iLVKqo5<-A*-j&tIHiVT*0&M*aC$3$@>{+O(2{Qs(92Ys$ZZSp4zZZz zdf?nRI~mh-UAwoFFEgg*B>c|T*Tjkwt9{gl>ft)>eaSS-FYNCGYuh(`tJ5TZ?&wyXAN1?ufKUM06v`i}JDpxujVJr( z$U}{^k8^OhbdG9zoL6iZ0Si!}P4U~(O=`rFRBmTX|HLUxax~kc^4VT@{A`<|wX{tK zLAF98MCP6{SOgFyx@$S@{%JJ~d#Xgd%iD&`(g9@9Pn!=)cRIFyCU1p8J%oy_tf2|p zuh^%7JiyARP(x?I=Yf~}9ReS)K_^7$B!`e#F}cXf!xH)~iVHKaC_uTrbJqV+gE$z~ zt9A8MybJOxY0kdYj2GXIK&TJ8)S=1>4RKPToY&GxrLs1PtG_v0s2dlgxBphoaH*cH zd|%Gi!Zz^^xE7dtYgQt(T!n%c|9jLjH&y4^vu8z}PBX8P;@XDhTwrIk0dRiH!55Z} zZEpmmbsHd_xj~59LD5b&@;yO6^&iu9?oflGF)hhvxiW6EZBvkYxL4)NAJHM$1H<~F z@0zf~H{8jdDJ|&^S7(evWLPf-3+4D>?bOaRYA$l(2kMy1c&9di*OAQD(-RT9kJxtI zCGKFF;LP+Z=3Zf;0X%hldLDw87O8pfa>0V#^(#R#`g92JxY~hS8+hz_D+M%_JF@lD zt@iEO)#*OuW4nIAGPiQD{1nDafvy#@N;vqRau*cWoD_q=u{c%5mWTa=@~JezuUw$% zyA|yIyh~j4NwFP*%~=DvqnvE3Wm$cU^jU$ga}Y zEb0nO8Z_= zstwqRg;{sN2IE6&>Xrj9ic@FSYwCH0x*?z1g`zI(G6{nXLNbnD+Ukjsl9m%G@;7bC zd3dYB35G1G@}157o!P1oh!59`R!1Ii_IudoPc=!LL`MHptA*TXmiuN)m%+hGE>h z;n{swLGADt@4zmx#2Fkd)PGf9eWQNvv2(1f83DO66xBq|%ysq)n%lWHTX=w(m*s8> zY#?9UPn-N8rRvB#lC4+VzKfiCjuX^nSDyf>M{OUn|Mj52fc+ID--y0=>Cyq8BRm-W* zO*}95>s2KxUyfo|`(HCw_K>kz9RBn!=XOVdMH7VhLSxt9au-pROMhHw!dI}OnWZpZ zT;zH1x-!#DY{4^NKj2-$acG3)G1njx7Zi7tQD7VyNsmtQF^p&gLdR$qJ^hd~0e{1< z!*=AUju;E4h8dN#d3@^x8v9{=b?h>iAjz4%H@iq#YbNPaWgD@j;B2bNlMg#s%^)iC40 z$*A)kfCOj*i7lb4C`3@&3u0ec1CQ~X=OH2bz;tCmwQslF4(S1AG89!qORSlKVFz~J z%5O;)5x|c4nnBECr74C7a}f!$8>ckn>*8^TItZT+Qm;+5B}8_*vchsL1qxDi8lT+F z&scfp19(5>lLgq#t>n5`aSjj$VPT>r7t!s?Pv8lxJ4|Z6?Py0fyCzL-#9~M{)4etl zY`v{XC6bbEIz4B74`^n5ANPL*g-#1t{vU;qvhG-N?w?bFHwI%4`cI`@^Nd?tZ|T-` z(pu$(C>ytopI-LGg$yk#szM<5K6Jg{Lf8R}U~|q?n6=n@1Dx|yJ#K*l>{gLoXMl5> z19esHaSv!_Me~?ykP(EehW7}%yU35UdW#VcuFU|LHWe#=<9 zRS(mo2lcjRMI5NqLZOj8(k2#%Nmipygb2Z$Sum?xaGD5f?LKAu$u^m~W3juUM<{5d zb!v~3WRqD<5kL+=DBmGFGd2!2!DizcvrXOZtg_21Ke*44_@%mL+UIc`L8YfMkN`?L z@Rdx_Fz^UR-06qGkgTd5)e+Ls!Mph3M?N`$B6~oi;)7aTD>?X`Pjao!q)zorhHkcL zSB4+~n6ootc$+q9e4}~=Qi~c7B;oX;J_P|u6x@c6L`m4LwpX*apWdt4dBU#IrFayf zb$P@#es`YebfdDmg71>vw|wG0uU7Y}_{XA3h91$-c!B*qX>opXlNe>x!m=ezI=i_U z%7~pBe)_oehja_Bwies2{_WCzF@0D-P{lT*Kev?}kjIm*bFfqn&FV}pU8>3zpw{dW zcyd8il|cJiyf2tP(mlN)IKMN>P-&W!b?>hOad3%w4i(uHnNX+EG= z)F17(mRdrex=8jA+JDc3Rl6&slS95x5A?y{e81r!fIU!&L#pisd zqC8+Uw}O4q#7qE>3{AIxY!2`z{qLhS5KPupb!cZfx+Nskt+KC2W7{lEUI|#z_PWDu z^gcvfp@ezTp_3K+0ePWB&iva`o&*s!`L}M5Vvu5bO_Lh9I!E1A$K?UD7YH`GG4>E0 zCe=r5p*V~;D0e!~WE5ylQe((k`FK4jntFynC09FJ^2 zP+TOe8$SS#*kSOS*hSG*4*zx$f8q;Qa!A-aOnV@Q+>#rE?C3%Qy_iUchLeuFf&?C};n!W-hs;zXSj#13a1 zBAkRJcN)d!D>fxJ;l9ITaE2Af%r)5yPXao$OqQkIfb0Q9)pvF80el;gW*Iy-xps#4 z#9xAih9~#F4~xbB(!&%AR%P|~_%L4p{^CC0`JCPim)Ol6yT<XB->*Gg?4nlX$yUD3s zwus!}&}e<`kw4@P;_hBmE;kY=#ZqJ>-_0mmj4v;mYb&t0@syviI2vWnypOTH60<=m zY`@-t3g-S8Kz6;BtyGIReFuoRBTU=2c{-EzuTti*Ln2q$4xbwRH|gZnnYae>iB-U4tNj(U(7EFxi9)o$TF3A0=FE@v&}tl zGDVZQSbZ@xTFi-*54~*75k$ICo(R4=dsSWnDCrP6qY}=N&3{#G;&Tp0h7k(x_78;Y z^j#Z%Saa~3R4&B-ih$i7)GyK67n6Fk_O`}X;07vnj8t=TYCc}yQorTk0=@n;tWN=X zD&xIQuaK@!An)j9PxrADPoUOvfjzCsOfEf@|(vhMZAlurh%GmZ0!oM;Qp z<2~v$t$AF}_s$m@MY=KWa^2^WftQeDoE&WuBQOmYO5E0JvNH$kk0m9(IG~qe|8@;9 zEzCPVbX$lBVa;Q1NxB83Z59)B`wXJ2Lu(%VczTQ5L+5?nB|s!ihpj4dgE%&Z-R^d0HCf&BGyFeaK4>ubc~S38rs|2FYq7KI3(nm?UqmO23{?-h(0B@@3Jb^0#bU* z){H11(?h%Pb%y8yV!v5Pkz%=Yho^r_cxCJz6n|yh0jIH;@8F*Go*_C<}PPo#E<+TAL z@~q#iC4eXiHSjda?KJt@9O90?Ou1l@YyuCq-8QlUAMA?WFHG8Xg=-0cY4 zMiq$L>zY2z5+aT=zGoi^Otg`lh0x_Du$!lG%G6&ZvBL1icA^b!?b0DzINx#Zk*6c@ zbODez2D}^+c4U8Mprj@bF6OX+UQ%D2SPGR1;824BVgG*e75rkP z4mVN4UQ_IrC;4sz4TMmxoKiKA$`FU?dtql!pn8AW-fdsET|^n-g&_H}7DhPBs z*BNWN8FK)p@!6&Fj;^JXezlpw=qA0k89a{?p8o0mI?VrK?>)ns>Ylz)tY8Ba5fv#m zKv7T;ks3fLiWE^msW+n1L3#@bQba)nM5Gf7iU@*82|Y@YP6X*K(mSChp(ST_yr2Jh zuIG9`oDc8yemLjkgBR{(@4fcgvu0+^{N^{8tb6~Y9H_p^A@11sc};W!Z%^WvPF!lF z@|d)rcVhq)A0k;ND^6ZaxFl_dKpMMkJH8NRQ66gIGf?MpDD#51dAdX~_3#{cMUfRy z>`ZdO;u}cauvu7H8~hLnJGropx%b&!rb&|T4D(76P;*OJ>Qod_uK9y&+RM_lvJGf& zc)yde(Ei1AR`Q><7XIzQ`rbfy|ckF(vf^=+0WmbO}gjx8=aAN+7bM#_-A zGvivtQAg^HoG%uz0RvY9frLY>7vJ`QPe^;^ysj$^28Dpvc+_A6pd-lS@)$I1KBi(i zGk-trwk_tN6|pYbyNqTvDFHFZ1(H!#{qSqn;$HoCp4q#_^Gb(Hl!GqNohII{In>Xg z|KiDtARegnI;nGgT+kp1GI3UGIrC;x3abrQ4ky!E7fac{EK(Oz(~$6QzLCuRh3^jG z>q*Z)A`xDIpS>PPjx4-4!LWaHaI4bdQ231~_K*4ykQlAzJ0x%X%}#}X4}@FZ2r^Uc z0E6u_6xcnR19<=0&sQq8yP*zKRzc^aNMl{9(;a6$-C%948bMfgc2K|Am?a0yHsHW; z^z}x*EQOIuftmkY6gE)PXQSYcTx8>;YLmpx327Y=*s)pc)_LGgGJ* zKYp?C|9Kq6uFHp5*Gz%e^zOl%3D}*Sb(_BzT}m%I@8P@A^%eG6X8HPEG zh9#6$Su@R52YCG>_0efqs~Pr=TSlF#(&$yJAWJZ>R*~X(Y6)8(af8D9;*YHb89wwtQaAr1_)XWE0@dmTTvvkYF0@ z{tZj+uQc(=0>m=TYxs5H!bpAC!EStyi#&>dV2vq~0>5@Y78LUPDZ= z1JG7-t(DN5DzA~g80Qt;3vx#A^cKOQ05!Km{0ezdy^M&_{*RjM2}>(q0mzNug#}VK zO2BXKd5Mn}Gx-eHn`~A1R5h=b)V7c^T^f1ChVK!SJv@X8(yc!Lhbp_AQIGf~aFHHZ z9W5W|yYEUlbmxNdg6GSFLcC@ZUfT|tui*dRCv$@rq`mm>KNK)pD$A_`6|^lrGu(*S!8qJQfa3Y6oiUsByX z|51O9z_aK7&TRi>A}|Hp+Sm30&x)O+{2>gb552HHJp8`qTQ*Y0B$|{UX-%8|+ToH6 zpbD12Kty_2%F_pKo`uT9awq`l`HJbY(W8p#mvqKU+G1%=Kff!HL8QdGzks_JW9;d! z5dH;x=U`~O#Bs~=IllybO#mA&#lRzFap3Kwm_CA3fbFbVDJ+fDMAvD^ZEt^O(NOa^ z&R93od{e zknQu#lZL^IoMUov1seP>;!ii}?9j=}uY?(IVaswXJEGt@{xlnhm4qrKWT0jCK3&ca zD3H0SSam~6VhSyj41t5;PB{3Ce#T5bEVeAbGv^Z~TPOx5ho>IHFe0$b5)t@|<$oVG zgH!Dz<{7Yhwh1@jTF3i%9l?WQrO~4Vk@O+cNA3&^BA;f-{nUEhpR4&yBI<4GH zS?PU;2J{R&vaud~MfwPkm8LO3w$Kp90`=V?Y@7UOV_dsf6qVJxOWb@i0G<9_Ome(H zrZMhrmi{F(7R7b70ED${@HK1|{R&>wrEKZv1X!L*wJ1Rm={p2-cyx*_dLJNr1S?P` zy0U<&8AC?3BXMsC@blg2YWut$`7I3@nF!nYw<*wnMIbK2T?`OH>idz0_K!kPLLmqU z@iFqu`(7e&LaujkRv^+!M*W|A091T(6_5i=2$PN?+b*Ck6Wk9MWI^u5V(waFUGaV< z?tRk>1lh?_V-U1JMT|Rq{O&M)Blzq880H4K?f#oI4<0=nHsS7e}PjpmNt=auj{7eF_tTAnHm?jS1iU8)M&pze{xMZRonhqT`1s z1LX5BV02sW?CUM3f&Y_5q?5Ut;H$ri%FkbXO64zU;op{o$XR~@Zi4&2=^kb>9SZJd zo@5^BMQ0)`*>)gi;lKUzs=J=h-(Sl8kIO&0W_IT9H@E-CH@|LPfT40eL;e$9}%!3Ae5N^OE&9cvC>{Jgn#Ei#OfR0&e@Q! z5PbjFZwwUOo8iWIxg>1aXC^tN9l--e=)^^)G26tkP2$E@iJ0XQ9q3fU67h&RF7s1d z4g6I>aEoovks!Wc$^-wd_XWsb&CJOhRL`i}nxp1~-1Qh!-BjK=@_NU^@Ihq!fqy$u zIzH1Aij@!91<%36l0z@s{jnE*Oy4v{9u>vBlh?7`|GD&Et5GO4{GTJt;6BSY?YMtt zb&-=IIG86DtHu3O#=J@d5Ay&+Iqn}h9p*2Lmtg^o&@Sg zmd>-t6bqJ|@Za{b1bHAA=KqZY{ofu#zE{^q!1Vhc-PPU-h%lJ7k|VpG?LDwvNoVMX zrk6C*Lin$K-4<~{i5`tSuV5~6Per9SHzE?5gZK+#Rli-gwe~pj_#g)Rsyyl6Wo8U0#mb$H{I++i~ zgmbbCb3O16e2rYd5INf zy~*??IKaU?z$_SQIZaf8hFRhq5|z3>OeP?B}l?C-?>tr>BVQ zDE>&f!C4cCJOrBra>MQ+dyGiS}J3V-nO#@2i!2kw=Z#qw>v#3#La91dBUojP5=i*KxHQ zPx4%ukupiXHkN97cK&!{yTMBpGBt@F-rYK;t(unZmDmN`)?I~=88^3UZ=?AS37jSLdNfE zkF5JF+s?odQO48!n9MtFbB`tO$s8$Xu92gNhb5SOitB_N{Z7uMZqsb%#Z-jP0Ar6+b6<*W5ew53pg_m%cB?j!evZ4iXcuA*SkPh!x0$GW0CG@ zFHeqQs7n1DQIC*EP&|nEbm}ay?%ET#Njz){YpR%X3@@0i+ZDns8ebrh<6>F&o>=yJ zwc#_Wy`OQF=)lptuUP2^3Rxj<-XM~|8UAX=%U{Wp$w`}kG|11dPo;72oHeD;7B^oDT|iGiZ8lTw)}wS=Of2XraV~ktgBv579&*`kw$7YeAy+%OJS`851i#21SdoVjNblILH0Mn6 zKpmnkf04?SU&|f3m+&EPVvZc-`x_g#NMJR4o_WUblTM37xT^xC<_TmuP(|~ySqkoL zn$#@Q95FWkm0difb%I0I67Pk{z8J`=E?{U8woKt-AnRvX`mNyoib=^Se(%Y)$5#|y z907izrM5A0y4xR&66X=aHNUr69=3f0vnMqSwkw^pq`ym;MZc@I4Nxmx(``OBzjmuX z#*FdkX0hz?pn%BkAC~+R==s9btFjkmOZqJZmWq~>Q>$MvgxLI@A7~I3mKcCQ{s!u! zGwkraTgG?5VtwR?%_J8AB?A>z1tihF%ADUVQy+*_3zYT2hFoF8`taXwfSz*55c*_#Rd9K6izp$EfO}mV? zT8hsL-};WTe6ai?>DmaWso~55`ovyP+Q;^v2n1HFu1_in#^^uPq3!x#bfww+-@mZ> zl{r%=PQl2s`NKwa$!CHN$09zu1T8#RD|2OZikEq<2VtnLWkREOyT6-;LuKOLf7RXe zXYF87L+-P>_i3Nzi3+`5gvsLPs#?--yG{vTtj~#5E@6s#22&&!ub%U5+&Y&vJJFk| zTjh+yC`=TpIb@X)`->;t2j|riJ<;7VC7$kX2`-rqE=>-7x)6CQ=_Kvlsd(oTBFxiB z*zGGX2s5T=U~-pZ!D=~>;E?S*VEu{J(*_$sa=C;U=SCN6L1rX8=wv`Tbe24@ZGNYs z5pz0QyRDR6;mvAxX8ZSrA~wz$ z;l%dK1uMz0sj8Ed#(fwwJwyWq^R2}Ng6N1$o416M_jp2j;$@lQUmwF6sg7d-cVSmq z{JKTDD1+CUL?zkE<`;kZM|&znFWrR}cna0vIT+M&d`3CwrD2lWU{@-iS*m`cyr{t$ z(~Qm+e6sBsMub23lUza@v~K8HVl=M?RkN7njqg$N#qy6d97?u`upw(GLLL;fUxcm@ z+q01XDO{uXnCvXJj3Imc+lC?Np0$n-w_F^4eQgGv5lOKyp}UNHu>4R4D>hP|`l(=y zpF81VM$c&Z?*v@m0DvAqcToe*YrD<>`;4wB2gkk_$TWOoc4|G~4&FoE%Ll+$bW6+X z^)(_~q4O)|OST!BYwM5EvqsPd%q&~E5Pj(QiF1f4zK@h{>qH<@4KfU5qX znT5`J5}mdP>a;_C*pEOF>@BpI>E5$=K#ZTUOwB4?p+h%kM$y#zt*Dn7;yb0^A?_0x zTgCEQLTo4AsqSGfOm!&^#?5kVRf4R%&+(t7QumBU@kjKt+Dq{!QD$2Lb&z3jGD*WL z-{0UI><#GiMs2JjhILL&)X@Uz{n)x*f&})fioLZhl4jW%6^bCfT9D zBMPu0l^eqyde_H)7G4w))C%2o>u-pOSspqB>u3%OLd>#5c(LT1Br+k12*r2AIp#qV z#O@_BE4iMx5}dfe6?0M+fv=hSocWQrd#I|1P3q(lmr0ei5M!a;*qVbUK&_Tn9Y6Ab zKPXT~y1NSsKmTr}P9*oOZb8Gi70aUGrV*UTH0+q@ZVFfJi4#|ij|XS4Ch!6Taw5L6 zA}>c{LuxIKho`#`jt}Q3wWA;?81V}^YuojBQttzK@!Q61l?30(Bp?`S5@ZuoAiv__ zUvta|-tz2voFH(BBJrXdPDeS3mmIrRf4+%4j!HUb+vM*yC8hsaC(|@3ph^Dy$~Ma+ zgy#s&s~Rnns(M&h%8~L@lw+i4O1TWYS{6m7?0tpzUl|SSvw-qCIOdGeA^9A;DuH_a z8~lq^!v?GD6V#RsNy?Xfzc(r01EFG36hg*%6wLb5x3#1VS1?0B4b?O^`8>{rSd#m@ zI=~EGtZDIbCu{QbGT73bmc@x+2YVm$`abW=mC_IVVWA*uhNUVvEx#kcvt>8DMa>DSf@yHaR7OS{*PVjx--+@5PcbJm}`#4IaVaaTgz~ z`m1OFC`tF@jkExcPyK@h$AN6O0oZVA-tSe`7vTa`>Vpgy@j?bkxrcJpp3|Kx$Hl9$ zG@A%3Q=i3+2cq<+x#UULwzD1hXSq}S&fjgt-R(&eZ}+|@JkL;Ctu4sXws*R3`h4Jf z{M|ilJ;okHute8<0d2HQLZgNf$d*gfQYmXu9?88WcTJyjUVv>2gj|_km4v%k;N{lg zlzMQ}4xGp^KaL8$2oJc3>M)I8g=|1e1=aP4r28PG^85uo8SjbiqJq=jYQdQvuAOad z|55z6`-&I9*u&-rSe(OhQRWT)Es{0-Or;er#|lb z==bPZ6fvI18rMBo1I)c2CUo4$bzvOo0Q0T9p2VwHcj|QAvVlLi4(oJp-ok2v6%HI9XBAv%Sqz5UyB6=3A=v8rGNUs z$^6S&3~jTb71ZC%43?WQqz<1P?d1(nRXq${>q%cswupo9R~Pl(2F*Dh#}zL7ZVZU; zT0UD0Kbl$HQz)rkt_n+6k!jnJ%f*wz>UPz>JME?wmLEf3zs9*0rlF&h_$Dj$hFShS zy$?G_*iji;J)wrluIS%O)MWQ&&Ge3p9uUNjjYg1B-Nkd-xX?N1Vc3*g!8g63?RgUD z!m~#C6oHHPDuvCOlBqpU!V+w!jYi6Iw2Nlz^brIx>gC0szS1Lo912P6ecJT~nPR{Q z1>~TYKVJ(F6_-!P^aZ$6>yuXVF37FacR&vC*F!L;kritWg!~~%o(~fQ@Xww!8f6*h zf!p>@C3Ky(Vg#N6u@*f$+XG?!AS<7NcOMQZob|>K>+bfQI_F|h7Aps?A+U(v6@D#h zBr`=Vo9o2>#%0{Kz*!X=M$5ZcJP-803bJ^aDT~BYVkfdd`}a0_xb@`w`V2qn3PGu2 zWXy+Cxy0ngQY-}uzgR_L*Z(XIE!|Dy@R;o_yFXC}A`28hM1iRV96X0;V?`?C!dTr4 z6Rg=cIq%U9>0JUondDe;Awt_)^9|KJ@5Ult2kdmt4w5R-ZjV3U=NjYi<6%FJBddFg zkFSONJ%)?BE~a#DI;#KRx!i5ZW`fT{<83O%>YIXZ)sZtJ8@n7h1L1)t*$G z=j|o|^-V$$9RC~kSNHp><8(BRHoA65s(+r=lyoRVWo4GtqAo^stwtVuc3WIwlI*Qn z-<0Z`YOPt|i8n{NjGmQYEcCQH($sF+Rl;`hI-l%^?1wX}65=!a`#y@5nr;Li5HtP+ z&*g9226i6sP1=NpjggKO*xR7of{#{ItM=H7+r(9@H1zk#f%SqF^RBACi0U=QQ~@>} z!lqsMGg)>EuyqMI;yXZxweNBib3)tXcX4&nIulv%HcGXs%^*}|N$8*nv8)fEH8y9?J$z#-@%r35- zC(*t8nOa+#UJh(kT}H)=79aBn`N{%IihU2BK&L#lVgU}|miZUe5;s_nua-)pp#ZF8 z=$VyW`(URKzR&Y+-xYR1><$&o-{K!{w*?KT#97kfSfetQY)p;V;ygbE(2WgbdjR_r zPU$1Cos>`NQOR=XE*Tj*4^%c_N1S^j!<;YUx_lC5x|7%b{-faMf=HdfI3b|8ULR6(a6A`8VZ{c z&xA0J7XRgce${}JtZ;!FR-W%n(Aok!j>Vr(Pp^TUf&hY&_FWoGYyp73YvtdHl z_OQ#-f~x68z?LHg4UL^gryNs1%nE3-8f4v-!VbJ#A)HN?z}{S%bR>v}<)hT|h{mPe ztnApS!j~sQ)Yy3?FAukk75!J3X(M9$9$r3s(mYPIWjecKuoIG0tzP#Xr1Pq7uIXhJ zf#0vhxn6dECB-pSpeqG4+!8ThaV!k1mPz+y?vW--t^S8O6;pdAsKekZl-%#CTeA4% zJ4fFzEh4Nc_^?VxB$mufCh*5f`zQ^6y;f0#C%Jl!;uCvIx_GnXa?{gMTDWCo>z)#@ zY$HJH4mAPweNy=NiGfZ{(2tvufT!YS9bz+VTk4!Re|>RZGv(RXhDk|m|KJBv z|6YBF6SUbk6*8VBM^<>C4sz{agBC9vRh8sp!rC%r*3qSungR6aoc$&1JJj^>HTHuS z?+uUd$QeCjOu$&czIUoaejGG|xZKz6vmp!NFV(||gH=H(h!k!}7+$=veElV_uKh9EuUlE} zWC@YwnKk{s^q*yV3XI9(@qO{l>GiL(Lh=*%OvN|SU!A=LGCbI^fYxYDrFa|Wv0U~BGH@J=rx z{eZZM(@2;}YGW*)G%#fj!zO;(=&aiE)3hl;fhp%G*RL#05A$!R%r0ct6$b-JbEAAA zwVn?e47~}-^&#_Z4_<^S6uW3 zA~?=>V45&}WXIk&?oGHOd%`)Stq6&zFdBr0A&-Ov;&dK~i0yvcXq2Bx`kDs%*t$tO zae-PE(42R1tz-qWH0%=I>+bry;@Aw(ovLU|>52lVx!aBR*o@gjVwTz18>qPxqsdE4 z2SjA(207R3ujgSVsJJ~DMIIx9Bom*Nl`O)B`HA0$Wzf?{S!bwVks~!?@@4D|c6rXW zqets{rqN`HEy3s`)<_CeqprnP`$Dogew89RdYqeEl<9%?jfWB}`EPc_; zR%^S`FA=?KT@77}5@_0{HS*#{Yg{DdcOPkd?OsP~!XgA@c}PiY2`iA5MkDC_l$Z9OgwT@9U!^~kjfaA^mhoi}MB$nu)uD9kc;0WH2g`MH+QDWtgH)ikT&hPs$>$)rA`2;(p_|=&lls$zUAp z99cS}k%D>h!ZAQPOfq+trMN=bj~3TFcab%UHkP^N24X94UIi{pPBkn!ZFY+;>D$tn_OY;_(AR+LY&$f2 z;UE&EI_7jco);vdd-|1VOxAjOkr-FAk$XK9rN3Tv^H|OWBV<7=dDv87exPB1)f{@=zhsYa0_v=j*N%Pf|dfJ>-`Lq5f0=@)5$t z?l!G|A`*8;mq3O9f-fRN_QEVIf^v{8I<-t_kR=uoY?jP0dm^w-Gb3Z4}E3BIEfUuQ36np~^lQB1h?WK83=NdHuqPsoAV z^pi$fa+%lki(tQD@|)7zYI$1k4CzAKiQz{Ii>vkzujHNfd4V1a>buUGlX+!KtqdpQ zviSN7P-B$M=Bq6Xo~(J2!Lang(``9mw{CP~Ll8<1=f5`v?HI%2jW>Qb6q;c+uEa04 zeV$(N4rkSMRPv}_wpR^Hy6o|T47DSAKqa0^mZmh=UO>}e&k0m{x2OsMEs5IKuY3Q= zoQmf+75DxK@s%{$BV8%l_tY|s19n9R<$n);af(I#|~tm!3)vTDR+t#%~GBw{Cr zh*Tpy#$tGG&_!F!Fjw87(bANlSp%6!NLL{wS1i*nlXh__17$dAa@mSZCzo#Y3xhT| zrT4A!2kUJ|uZ8mlc?!^};B+ zKeW-6B7j|W16VpjCIP#-&w8gjz!|N|)@+iQDVQ!D`RrprzpqXmGxf5Ch(1`0Y?taL zAauK({>^eVxd%^HzqaC2`YWF&zoBZSVG4i9(Ocey*vH|)upaG=m;CJJBRDj8bKz+p zm_0#{t^f!j9qkG@_t;%5*WTPzz0}f_l0RS1jqhJuGP2JO5UoWW}ze(Q;Cr&7=O`l$r6ND+j28Cvea!5ZZhpY+`;TXT@$T$~t(N--BjD zCRMH<9`A+p$TH;@At!g}h0XrTI7o<;%KUR@X|7I#_+sMGA2W4iSR^C{E%;Ct5@SPV z6<%k~Au%9Xv$(cMLoUY#|>Ct>Sn79El@ zZA&2pnzL~_&4AW$RsR4(?t@Qh6k5Ab57s98(t5XC8RWOjlopU~7#na`k`H&zm7DJe-J3!rz4F ze$J3xk24UDhQ%DQSAPE2oQ_67b{~`*!a>Ed4L7LFCXCo)#V1IVic=yjv)vCrsq$F z>^jO6SU))?Z_UD~GZ0iPjD{CFzYR{3K@>xTwrC_oAulknA$_Y1DD?5OL$(7fg)q|l zT8O3P{ELLh5)lhzV~*6A2|8Z6>U4Afafn!+S|S@Q=fyo%G&dB~MRa-IcQ1AYY`3nDt154)d9dMIcvB6b4Hyu{8+%)vn({-qHz<1BCg zQtxc83Yr#UUegMR9{FuncRD(OM3Y#aGHZCYB@ULKV@`MklNX;YW}2I)y$E}aKRnd< zIK%>2YMAf`wyX>uo{zPO!$D3e$drBkix0uxG>%magxA5+g}g78nmmXZn9H5;pRm2M z2|yr!n?2YfQ+CdSdE1&@$iw^fy)QUNW{$jum3d(LmT{~LA{s0UamXtY><|%a*olms zC7TIJs)5w^E#^r7g}kgBwW|tZp7Ad#hQQrAsLVWLhY}(zoEFcFj6WeWF1QzYc$Pu+ zbsnD6$iu65e(R0 zN)ncGBjebrU>KxM1oDblc7B6-x{f@CGLqT=JXG`kM+Bv@=Q#R=)3O%3|35#f1S-9a z;f!IN@(Rrm{-}&p2huVY#ZKlG;K2W93Hgwhf_(mW!vZ6ZF^S|@3jbN1CV8YYp8gcK zB=>u>&g2-0gET0X{AJ)1J=_o-!vzF&|6*OBpY-;{v)Q2~pJEXqazgAQq{)B(fHR|T z%jh&SF&wiVu7(>KxnHFgtHlKtAiV>Xh-`XTPQ=Eh23VV#@F9opF>i7rrSoIJyaX5s z7I%ZlzOn$chy9pZqYTS1p`X}m-~IUV{!<;Hxciy?N^3W88*58lglb|0{2JEbIV~`! zf|+G}y8r}&;Gee!I;mY`V{uyBV|atD(zqm=LsjG$BHm{I5TRjqfNY2uW9^ch+_N!nvYSFA0svXGZS&QsiGJ`KH^1^2G7v!4ijB{(vAO&bYA zIO;cfI{lPAe;A0TSk4OxKHsz}a+BhZp*2}f+|M)g(J{$IfUfCeOh<6xVw-Jrg0D1% z8&A>~i`VwZSi+jVdPxu_R}jF7D~*HiSaftkfm2ZN$f{>^rTWlE86L?r<5btkeGJ=2 zZI}n2|1SEI89lm0jG|Oe8&Z3Vn}<)pOVt{u$&jm4$-9pNRU{&BkV-`UB3{ zU6#7V$@VwpY>&t6Q#-}j{U=n22B%HMTJGeznM|u9li$F`wiy0$GYi`m()?pu_5(HN zl$*Iak*#B)2TmWhw(BW8dtm6_ab&-31+})1)b*Hl``x2#_2VlzrGGB+JQsqbBg!n?2iMJ2P*_M7iA_N4d6!b~NCHH{VQhbWC4^ts8GjiMIv zVu%>jB8&|z+uE<`gy?^YB;iz(W4!<3i z`WGDgHYJ7UMMVy5F~dS?;d1`fqm@OgF(0B2yJS`Z2=OH%rj-H17Jf`YGKhQYp8h+0TZyk23`-)-4sR;rvt`RZVk%Qwwlbg1nOo$|ps8C-Zp7UrNrd8?37%`tjkmgxx>!)FAwmb$tvmFv+bMw zE=LYj??d=M|BKl3;CsO5-M^sDFfQdiZU&0xb>*iA%&+*L}ys=Yd7}JWxy`^vwL1#tXb{!b8sU zK^2EJ6s8FpC;MhoF?sPSbm)&G2aTp6Z8R?7STxda>?M>U1pHY0Lbb)gd)3-@lx2OU zl!_`EAy6%yRBias-^cel#wlF5O@8C+d_e+P5j*#(z|iMa71>r&&41s5*eX|`Z(U;@=>r$cCp3h&P`3-k5W8ywb%nxdq)o#}2G+{Hc3@Vf6a>R7z^185y0 zm+2NL%orovL->(?7(?K@qvqOY6~j;a({8iX?yGxwzg`QIZ+3T(=Ns3zldm{$b{*Gv znWAZZ@>o#IXYQG`OOlPPj5fyTrH_Ymh@~$5WCDq?oamD5(&R!s>(V%e!KFS7o1733 zyt>T{xJwtlUj^~M%6;p(@@z5nhcGsFeepGoM#jcE6SruOQXZ*mDl3;ahc&SiPk4Ej z3PnB=U84Tr+UnD%*^W{-E?H=$$Zz1g3S|z^t9}iiy7*rpLh};cA&iUmrQ8Y;>4uF!C6{e_0XrOF!LBIqAI?akLq+tSl)BJC$pE^*GWN z=GU@DC?Yfu0rbUl!S$>g^EGZ$9ggd>8MP01@Mi%1lQIU(H@rzL7tWtLwSQ-{xEUpQ$CbfBT?}6Ely&ud zYGSeXa^~ll&D(aa(`F*RJz#%&gimTI@Xpp%okdL@Fhn2&C+?bj^fFM zT?xtVx*@y|XqCO*3)Z<%x3BKAvcT>3;_{hZ`n{SOMqk@`i;i{k1)^g~pZH30qtT$i zIPC`60H-;Uu}GAkisr%9b@DN##o5n~^IJs488=)8kjk3l7fWF^sCrdTJNr`(&gFe9=xM=85V$Ri#%fd=N^qW znEh0B7c*S9ESBYur}s<`%g3BGD+KnNW($JvNFLs&taT;!{ZtS&M$};RRTOU+AHzgs zzhRzDBNesoy6~(z_23wuv~f@iY3Uu;7!SSKp*kE-o~xlbQYsC5l-~mP3&Mg@p{>9m zFB>SJ8GJs~VZ}ZU8Z=_qOsXc1yWbd(@g3ILE|#!@9}VC@X*|F*=MrwMJ#FZ!@ ztAV-B??a4;Q8N5FzcwJ^DYVP(^CDVIBvIzz39xw`#kCTt8`sp;t$a5a-lg-H5Z80} zG}e>5czDEC7yUIH)Fau2@G$cFtU|X*ae@jZx9Crzy3bt1O&=UIk%4q;jG41(K{l|< z>BlgnykcLKCy>!g4U1XRb$b__x)EPj zKGe1D+}R=PKFv?sjyzIS6c%*cl+e;|Unmf~war9lut(Ws=dxVdG^BpLTl#uIOb zZ8k4yeyRy6gbzXJ*z@v=;;!>k zX4f{3cMuzxGxUkdD{z8joJ%7Pn9a~7yp-y503Gpa9Vg4^5Q^3S_D{+WwdBIG8IwqY z5UWAjk^^oQn&F|-4e(I79_Yc&dww)GN8A_2F*KB8S9%4JBfrF>f`J+5L37t?%)ZF* zsRV7InILB~DsB zAjh9~(P9vvT)hNLO_=H#2H&MmWLU3sdXJPv*(7QHhwN#7*MDf^U-w!(Y)IsqK3}x^+>q`CJm4<~a1+>JPos zK^(~2i>$^u_RRKYc<$ZW&2wBRcji~2eQ?tTfhL0os%}{Gf^2L@ZPC)M#L9%_7jlC+ z;j4+wORqrh9}qRn1$!aKXgD4&pE%21U-$YHpEas&WMtS{ZDD5)9p`%}uJ@a6)y@in zC*jIk!eo1zUWQe(|F&Jw;wo=uk3l$pS#hO(=hNm$E^UQ*8b|*`bHU9Dn3dP3^%i2^ zznEUW9y5Gspe9Rr+VXXCWNo#yNZ0zi7?TnoOtX5y!JR=ey-qIlbp{RJn5KDHtvd>n zSVW95Bi9`FE^94RUH-gn=YA1`%p0C26}ycuEjl*7`EmSM`W919%wp-5l8a@xe0)~B z_ydAxF|n}HL15&s$A}%ePB_q*K=GX#`6+x6aK2WMftcz@?*ktwt6<6BHx`o$}NR#P_T{Lt;Js`~byKf|7B|v+i0LJE)Yp=yWhnPj3$G+qVz; zukPO&bjh**g7-9jK%x4G+wedz-(d#^Z7BKbWa6Sx>cRzJCo3av;Bz;$jg9LD{wiYy zn$EbQCgEr0%D*p+l&+HCp&=fy4jB~(gj`n*HIY>4^>NdSAMmMOUm zJ>8ZU6wsiwa6)-PxP0%x%h0Bchl3mys?)0ya(@NhgqZiBTOL64h^Im8+p9EP(_{||~BK}V}WV>IVxtq~6(3T)& zZ(KMy`x!_dA&>*XqME~yC<@69M^Qfcu0IG3m3?z#!u7#XzHU4pYG4i889kAbvhVK2 zll;mywkLYm?a-FtUO`N3tYR02trBWH_u?(s@x_n66gF|X?aDmX3Zo9JZ;L0K0PdaaH^f>x`u*>&l zsVfn`-R?D^Rs96Bv(k^nd{o%hYtMIMwNF8fi#?6i4 zpVgX47mro!758cbJ+YfVJ9WR$Oi>sYHt~{monwcYm+6oNbuS7+3@nOG=c+{Rhkcnh zIzCe#VHhRst3j*nr-~v7cCpiIUK)1Szb!r_17~{L1xSl+Wy0 za9ooK44-I@C(3U@R|wfMhGe&X5wqHB&B6c8hf*U>Pd3X1C^b*6oM_8YbDvey>3(pp zzfzlEkw-Z;uGPL)xAWCYZz#ESs+A@istIkhfMv#^=QU?t#D1x;&LaDseYJ$McglgY-8Vi28UB`Y9VjwLIz1iIntY~CQ{w^^!T zsG&sBOlVrI;7CoNZ43i9jAMVvNf>zhmmdAByRz^SiG+g~@)hkQ&+cv7@{77B#Dkxq zv^0|0RZpCp@m#C;vB)!%iH4L0EPG)vhI_9ahXo29QK_?Eoku2z+kC8V4}4$fOZHvr z$qtyEd1M=Xn)~<~NaVU*NAiIC!n+R}XC--VW=`MME)9p75J|cXkUz|cLih7PSpXY zkHpq;xzK7;9a_hCXc7z8i^{pjH^ABeRt$ zDZ6{qt8E?e_8#Q*pioBM7);%2NgsJow8sJFa*Nb4@&u!*V?Z_fIyZmW;*(@zpNB_r z`v@Id+XB2?6y9^k@T?GXV^Msx0}RxWc)N#9P#tIi?RQVfxMIpcs(n6FTRsdbvG!x? zmxt7R-G5`L85@+1@LT0!u!~Z0S7;mgkT*qX*mZdCwKFe?5nW?57$53x?PG`Cr_b-v zJyJUE?@}H{qkXZc_LZ`$j8z|ZUO72-k__~Y=8+WWB%MQu$v3a~spEYgmamts0`EmT zjrG~hjiKUpk#hcZ-({nfmu*<7=t7s2=Z@2~XZXJPN86P%z}8dfK4&YQ!lnDnX1Th0 z#|*tEWX=cU(34uQce)l9z6)>L{)t}8ngwhuIw1;bZCO3!J_Gi3Mno}s<(sdm4+hH} zl@@!!%@EJy6V$V^IOYiZeJRta)yDD1IhaHEf7(3=3`(OmSMZ*7T9}V)@8P@8=J1Dd zaFYwV+fDa-5kE2*JdQy7Gh4J$H>oGeeMaXE#k{S%&(oSV{tgv$mM$?A^aZAuCE^gG zD}@<+27$sSN=lZ`k}%XEDB#Gq*MR$XhXK^CYpkNhr!kCI>Llq5Cl8fiWm^Cs;Pochowv35Pvj;v1}n ziMwPm)ou?zgL=b>N2H;E?c`H7(&S!=Te~L)cNt!7cjlGA40c$Q?Z6|B`3}4CCM)mj zDI5K)I8zcO6O2I)tRRpu@N!{gV&z8@f(3l?!5K=Kiu?PfR(&s?Ybk>mM;tnp;ttz1 z5A@uNno+QUvqfXsyYD{){^-#ps(bt;-*$-5z?1pHRYJ4uWP!RwJ$TVDG48L(XR1e* zXO;FAf{D*7`dame*q`S4OJVYOg{>-PrK>nh+luB+=3$pEaNh2)H1Yjtr14^H^{nsw zik4+k^Ke9fC{#I~z|z;Z?K*JAtjw;$Vv+>HTCsgOtaX8X{hsF&!XCwbm%;gEjhOCR znnrnbN_iY4lMs2IeuBYArhDezS-l&hxZN1K*=8+IB*Yf@DCG$VG0@9ycwzD*#R*-b zLA=n36pN(7sCZM?st-IDQB%3yc{b4B!*k*rch)jS+&NckrlKM&RNSU{Dy)n^>?!@# z2Tb<@KHqxinO&3qF5XLMpXNbSMFQ+CPk#$B+PNn@jkJ^-r8^D#|3Rlcyz9{O<*klY zcWxZSHg=N;uw{sM~~(@V|MQB|P_1}ndPn2JlhP6UdhOP|aZ$*#R$B=^^%bxG&dx_^W9g5iRW7Br|etWM8qiQ>8{(up5$UK z-{1C`zl6{PT5L^)ffp4HRedR&RTT$9f1_+Ha45WMtPKf3g_FpI)WJu!z!i1jl@`d! z_WtDkh$_Wid?p6F$|{t_k= z^oM@g+;zU!B)9U(`C7Wm@c``l#O#c$+(O%@dF*;2A^}jiw~vbpI%2Q=er0BcS#CVQ zW10hdzDGn2aRo#{H0+HP@+qeVHp=se~Rp zgNo9+Tj;Errh9U-O@5HjVU|bO!GFsD?5|!r(vaNAs2r+f+>s{IzifgN(Jk`^W==QT zu6#}zN7wv_Mv)oqKr+V4acJdttC>NjajCtLGO)_qw12`FMsXRMt%Pqb08gY}TUFp76sc zoA2MnRnefmtO<<>1urFVrYeLd{dTtUjG?5qeG9GECH}#mTF{FVzP8)Z3a+4g2Ph|b zl8jQ+2Qs`s1E%Vc{f`o2_6aRYLZcjb$3OID5kuh2*nXh40@eU|5=o z(TB2N`_>NrVq%VV@#trbkOOC51__UTj|xAnCUtp%Ufkn0v1%i-zZ;6>Pv2Tlz4*ys z40uO-d>D=rV^_NyiTgOW*Tm=XQo3`}DKh(aa%(JS2_rIiABUdranE8`$-k~((aGB< zu#kJSF3D>)8oVD)hw#Iz&B#V2*$?*N55#A@*Q&e3JM zS=eFHN?{Ce^&MY!fXAQ{+hY2CI?k>oN-aYm1Dt%L9M$FK3RF|&+%p^d+3V6u<2&|* z+qpCb)lyx(R!Y5gc{ED-tOQvmyBWSW2@QV{d(N{mP)Ed-G9hg2{^QV|?k{1k$%{|& zPH*yyHArtv{t$zmxhrIV^u2NbvUc70rJ+`Jna=To_wUc~oe)m)9ZiGCz=J_*RP_to zW#6CEDxvh=ujUr(?e?%hL`*a8fCtW}zxXSPSHNTRkY?R$>3^_1apzqe3f`j6SqU*N zjVAC26d$s(Y6S`5qft_FDZ;Kgz2H+D?idxkDe{ z?&h-4KKw3SOkpk0Lt$5tvc~JI$@Lc5T89()9}WMxb154V&ZDRmh`QL3v(2=ux|8~v=8w#Siehv3{+$P9J8^ZNZW zxa0D0dUg~B$Eb#qR|pX4kImVPU6jpsuG%8+gxtm%p>!84ZvCV`@_Opb14PX$xR8L^^QY1t zCPkIc{2LNqm}Z`F@2MZB;FtJI1T=Ju1KVgDqb62ND~a{Y*uuJ}c(Gs0dfIqu?(p$o zbZp~s#FbzX?AgKgxa3rrd4InGW4O`cMJ7*(5F`OcfBs+Wy=Pcd&9*h#MvTC#D540B zC{aK}L~i)xb*C~_sEUTzQ(_zD|%X{ia#J4Fm33wfm7k^NpIw%wg?by>-@LpX+v*{JmdWLCK@BaJ zB(hWgVy^#|1Qp41LC?1fr}S#yJMB2$`Q_+N++>BT65)s%NKm}eFn~jk&5`gB#|T$a zVK*eChmg}db5%;;oJ>ue>K-!mgrrGAqstgKarjB5OWr;rGVnIjZmMxEDOqT7*X2Z! z_u+4@XX*WX>DzbM(5xq0z`&FS(%^1^S4r8Ma{QX8`HyKpabZh400FGWj~{2^y%Pgq zm)y_KHdivZ1R4yLKjPxn%ZuTHtE(x5z@N$YL>AWFJzuj*S?lI%01^gBWL<5~Calpt zsrg(yF~hh-*Y_xln~!K5K97kx8W!QSOeD+Py58yUOdY9v;2Htp$PT;dT$Wp{dH~}h z&I}%A3rKtLMT;;~a82o0D7dNHU1?T2Ep3jeszGpqZrN|}^S*JYLzXE?N5`*Y9G310 zdn(n^33*)HhLJo}%p5^_r*ooEYOEO&I~+ZC{9Cy#97`w_UF>naqYZ?>_0i{&#jH!W z>JGPxoGMjuDthbZ$JoIN3U(UAu0R1R+;+ijnDge{yrWbAJr%9JU!3O(diRdWko&lC zLn~0um?2d#6^Bv*vdmeX(!7@jyJo<*=2&hjh<_@5;^EB%Neky7`EeiRSMzyyxn~z5 z1!iVI7U|cF+|(_SfGZHCN6g6b#RkBa(n-iPueKT}iBGIqH8>8J$2U=*Vz5G9FMbJd zZ4c=lM@kS7^{JAmcA|S~rc+WumVCV;dHMSUsTc+zudVB%cFNns?4d9G(fdDzjLnd5 z4ZDYeuKe0h#9wvAi;AZaeUdmm=>Z04f4&!ROHuo(Dp<(tWb&=YW|`u-j~~AaY^APM zedbO`fq%VMdt|cD?6IAe?rakvqo(bt!c4n-4v8@su-yPigqqa=blcle6GLl2QUD@2^DvqZfJ)d`oP-4!IMM#lYi32O7R}AKBz}LK z1u?!}P@?#dH`nJ#jy9J7;FLZwq8 z>pU6_$0ymoyoazQIepe1<90?Z^|x;xLCDLPe#zOsAT)Vl9$s!bcqe-8-OWt#uW*~r zeRzb4U(H(H*}1|Lf@>NT?>bKQ7ntUosQCB6Nvbl!wSOjFtKA@H3&TmfK^v90nfH(@ zlejW4!M;E}woi~vJ+`U9B_H-eGf9vkR?BX6T(n?h>F`;dT86jy;In$U23lAKa3%Hiwc(l|>Hei? zv;3Ly=W=abeN{n%4`v$U-ML+<&7`@5$v_lq6+7SKJK6&4X-;NdoMV>z+dhef^Usmo z!cvvR#pgcZQVVUc8$52Ta8hN_jdS9s#Of=hl)`z)zq>9>#^q~j{ z^+!JlZ$8Pii$eN2LA9G$sP>gvF!n9trtgXGGRsRIq)=%p{yx{MWrzwPP@rPoa*#iA9CrnAJ z{RVI_1W>Un-)4f-6CLqq*yVqI(a5ox$cA}ktZ+je=-N?tf&}T!kv_`bUweZ(!-JQ~ zM1;g77D}P`v;AG{fr1axOdga1P&6WNf31Es;;bY&Vg9vAf0S%P@h@4iZs&&h2nLPZ z-wiiIbHE^<)X3Ip`E54klxsEE{D5-CM(w$lMrR$x<$RxOga<@t1?&-HvyZ7sXf?VZ zKKwJg?c{?~4vJJU%gNW!!+96B!O{RgzIp#7>6?}cl}csrT);>Es3&|&a9*DEpa#j} zi+e&17nM^?#}3~JN=_+Wv{S|L?KgbQGINbbC9GvB_b;u*Rg;RzYqIN7kEXpM@DzbU z>dP9zbNx#XZvo@+lJ02mVxp)_WPg$vWi(c$caLl@RTDqFh1{)ts$)+gVBa#vihZkW zu8!?q!thpLeG!r(-#=S;5>urI=)A6{WTylNq190r9q%>Y9`r+fFnw;q(931^Gjm)T~P46gS zS$gs-Be(CvOh3r1kz?93Rb4^O2F6xdrFU()vPg;7p!RE`JO>9yBt<$bo0|(zT6ey8 z5O&(8rf%H>(df#_YRxOpCFz`(99vwyA-Ny+AnXj(_t&r8;ljg5mfHmEV>b_EsL9P2 ze1BAx?8Q03mIk>AuHu&ZCX%Ier~w|IfB#sI%U!eB&wbPN*HqW*j<%FF$XN{0DS~K6 z;t}M83=_be298S@KgmV$VSU~Ab&{Pu=YUlNYWoE1E}6x<|gzH#R2qFd5= zjY%fS)zg^Xsnsz!EDPS7O{fui1luTZIrw5f6E%16WHI4k&^6gxdzp6^ua>yQOA>hp z2q_PP?lzUoqa#a~Ejj)T{qqyYk7pJUpO7k?vm5fRDB*1kSu3O&Y{FM+rW(#F*yWR^ zLGEzPpWaS(`fhG%dg}p`zNuEx(>doIi(m~}{qQQ&dhAXHo-HiIAND+DJexQeHC)#h za&BuWEZMBof=@sSP{OYA&QG3hgUAEr*gNIl=o5Q~V)k?0JfuEO;*C%LUf~m3>a*o~ z(5`K@N8uz2cz&pJ0~~FOL+6`=)Ar*-#SLI$Kn|Z=P>2H@UDN8~>h}PK1l8!3Y9HTF z3ByYrr|E`zKW)N#mzNKNRu*??R<0!^U;rSe6m&xu7MAj}81TufQ|YDPIP!a@bbr6l zS)$pCk`}X>$_RP2@a9QK9-iWObr=rmLk$FjJWqB4i#lHi>-H?8*2%@%Z}A@-4DCf6 zSm9Lj!B_SuYX>sXH^nr2V2ggZm4Wwu>em6;px0}T7gDGZjG{j75PUs9&ti2f6mk}? z^$@$*?h)!2%gR9Qpr~`Ah~t~xr~zI;b+OvuVsc*kJx8q`LMOQ9^e{**z@JJ(+tfS8 z3lA0?JZcPRSjK2AiK0xHzLXL#Mu@t&dbTaQ_{?tkonmI4AMORg+V2JF6R~P*r%fsz zD%ggu%*`{c?tl9x+q5Se%$-(z!`kGWHh>sLR^RRsyL#?_#06507}s_7)C|45_TYDx zgS>N3v;qUo3r0n=d!c91_%t}WjEri8IYwlVTeaIi7PI8`s6!{M1~)p~;5ZG)&j5p!mY*9CBR>Rz5%?d)sjE$oP$Fv_BrJp=Am z_H*TMNbqh zcUn=47K*Q4Ij1wUMA`Q2b76i<9cV4#$x;V-o2AyFp*Bo`>-Q zqeek$ZnhGRW}-1#B_~%{53PR)Iq{EP=G#MkTuZc*PIp;d#1r#CDmO^eVQ%%B(n|4y zrSeU>d~lpFk5=zE9m!*5KKznJ(t?=Z^Vy(t!JbG=#*XVhB`E!LH>a}p~hdjq6E@JHoI&pX||y8O}C*$~au1Hw4|ZssemI#}#& zJ_k<|8B{dwobEJDo%jT({Gw?D^P2{p_d;65%=uDxq8(ce@{8ZU%Z$ETz0XB+>`jGr zs&UAc^{g)<#&dzv3Wvb{VYfcRO+6^mCu)#o*sjqbuDeFi6v?2xq`Suh!EZV`11k$h zMg{JlF)by#tnS^RKqoO)`B_8DnbN=7Wl)XzIk|I3v}tGUz7sDYarx==>pGoDl!B9| zed2C}{Unxa_S>$5$Ep;;p~kBIlglMo>Aypg2OeHtL&}PeH+9KqASR-h*o80ueh-+y z4IZFLL_sFFH*FKHUjCtSOV->)&``>^?s!=hj-t{Wf7jPC{0fdDcZkTSPx^Q+Kea zQEq!~G$^xdZT>P`J}Bvt^Z0TIOZ7(~!r}R075_R?B?AP(Uf{{O8Csb5nqy17B)K-z zZr%EqUloZx!g;b69N^9^Hv*ar&L`Ob(E`eiAC6`I&^ntSYGg-wX%0>s5w2_N)=45; zF^yl$`%8IW4yq)nW#|+0zX#BN9}3{V*IDWLvgD%N<))GZ&%3V0bKkfl?A4#-<|^{s z9ZtP+?V3|mNvc3~!p?6!r+M!bF|S(?>^v_Zl9TyrTcW&oL066d*vR&sedNjYmQ8e% zcA~#m!h_+HZG!nh0a zgMxTl%FtcMKxqGYO8&!21z0?1W*&g%#{Churm>^@Fqh)xA|@AC3jq!L(wCYBTYwcp zp9pM%L-J;2xGNy7q{1;GbA;1mOhx7Mt|MY5x7d0vzY}o!igY~jZ(&g1RFD=HxwuOq zf{{1q19%`&9J7?H0fBOj(dhq5NiGczxx5K&xI<05i$2c6E<40hHF^X#kJ4UBw+JCTjf~=aW0Z_q1-_Pu(c#)Y(88dwFN?x_WiJJvuggS5x5Ff9) z>a_U5VRaI(+oR@h8y{alvbr)eWOQ(S0_&SVFi>l3>s$Mqq~u6w6>5^1YTv$E0O__c zY2a__x2hIyb!Bwav8>XpXCd^njEh0-2P-(O0j-~WKkWh#Z+4UIX{J5TA@QPb#5Bc; zBBMcYB|ml!()wU|wh`Q&bWQR!KdLv4cZ2)EGXoYEfU%YE;jX=T27r#-x8GX|`(`-z zTfib;Oqr^*1Mg$Nu%}gnG@UiMYIq@9@8pBx+2qv-FJqZm-0DU8Wasr*vFBnDu2TVV z@t`!N?a3t@3;cu*ShjTqYnK840^q$LH?ref#RpQ)^jddigHLO9`TOB0x z!xxT=C|#cEy4eI!Pa_QxX7!}qPK4zW1NY~0f;QSU85e{nn!M|a=A*2d+a1<&WYt}L z1}=l?6oSaUycB?-d-A0^i@$O9_i6f2^_!N=)=!KY+25czP350pl8PWJRE|rEb+>5G zx0^M$FaO>y*Ne9+0KjOk#|3csyphH_C?mQ7HOsHsW3bE!adDZ_%KqDO$)Jxq<$Cgt zU)$vTTfyS#4^--fJ2eV2NA}&C?d(~o`tgKxJVJi%qdWbYQFXfcYK?X@f%UA!vS@RZ z<*@rffpz|F*QK;kP5VXvf%2D&&`lHyQ}O&jV9Mf@B$>Rezb>{$S*m+%xy8(X1uIni z=`vZRR~-&1)AdiZUL9I0_j1u3&3(SN{?Yr+<3r*paK!r$fJV5QDH?b85zwff zZMA090Ew2m9h=&Z8ikO7gO#FEkE_0tw>!5K^whP5S>B1}yT^ABoRb6v@gR-@XyC7^ zd^vUN67dGvxhlKCV*6j=UEqlHu4}L^v|eVeB?V5R>s`{F-RAcO_a9bHxE~257Esh^5~ilizko>{_f&9s~ODElL=+*G?wZiRmXPoj~(_{!MU`J;>OlOga$lydGP`d1XkR0r_`FNFOWqQm4R2+bVNeJ%%{>YD|iWpCde5f#t7 zZOX6}V_6y~Fq4ysf8?a2W1oQ*tE}SV4xUEIg}O z1Q|YeY3+5TmaFu#N}CS6iRHIFega&l&+HS7yFAtu``mePaZYIQu#6>g-U44qC;et6 ziA*ykuxEGc6JTwQ+|sw~SepZU?KnU#8flgb5Waprkk7)tZahB1aUe@Y>qDWH+ICft ztl1e2px>jVAAdcBbGa4ZrqH#rsm>i>8S&umSuZ|uMxGwlnIYljfgIwxkaqgLE_$cp z&1+Z4o>C?dnb6stHCpKs!F+mYu=spImjB`hvF`@uxfq>_Kh~S&+{`$?pmSsmr>f|y znZ9-NWl>@&(NsesyLce#OaAGtN=auEA{y*aN*lO->~@tx)BHkz<4*lZ3RetuVx1}VQpiV#FHT+1Zo_N#nx_fb=rY(@QonBA24ORHfc{O zUD|<3t5PsWe}J9SDK)Oc3-VVmUI(10zm$=Rz($qc7vbOXaBg+`okMOg8pEQi(=Ou< z*|0=Hq-9jI4E}~ZXotWtNqlpudUit}A4q~=6DCP=84!gC55IpGn?v_?s!t%B=r`N; z+F$EZaia@6$1#jw&mGv@PZ6DA5Ng`k>4sNWNae8gV& z+KwJlwPowG+j0;Ub^9s=Q9%vE{e@f~=$QIG!AHh1Vm2Sxb@oxt*{1NhE6eIETQIo5 zPp$g*Vkkxpr^ET6Llw^-+VYMTiUR&B_ht<`0-y}|xP3x-wY_{)^Pnrd6<~F~Ee|2V zj2b5!wqS;&W%^M#4vY@m-MLmLz$upZfG|tlRv2@)D^(`Jj+7Z3!MHs_*=@aSi`^J7 zWd|cPH|!dO#}z*!T(_j>V@{0Kt9tbbBtXbC=^#e7bOR}gnnqE6kKwi)Kt9sd1 zjd1A~6gNE-_6i8E99oHJ9$>j%fW`|C2S~ZVD~2Z=;zA|)LxNE36%?yIyF;4;H6_}|obv*l*;wM1bk(@y}sc#-%9HVfCEK0x-lJ&FYNAPlzQ`;AhXa7a}mnl$LM z@o=}olMg-IkoXX07ATgDpEk@d)>qz4{NwC-D5a2=n*jZ|iDreXR+}`LHbg}lXc-;g z7et*xDVsS2VmH)Gp5kah{Y;-n@lB`@H(FAFf4Wi^ulJPplM_`fnwg8BJ z!)$%|uL}X=x$DRbJ-va7rrq%79~1TDkB>cS4S!*(ObLr82RXK2%1{yt+@AfAv?LEn zOE5;GwhLba!*yw=F#J@DR)w-dF!LBa%Fs`UFZPpbDiJq(*U$kA-1)nSbqSQCZ;*5n z(!#(QZ$x<}yrD&kg7t?V9!v1R)Ql40dIy(XLK$&zld5oZosOi3tA8`&ZVuEZH5Bk{);p#&jbceqA2|BJQq zxgod{>gkcmeb5< zB{wVBVDxUiG>aXoYA;mEf!^R9I-@!x@^HKN|;;cD2NQDDqOl<~-#7;P$G^ zKv4zqHv?q+31UqQ&Pooadp`&~dApmlzH2I<{NmbMJiW(-zMJnYD~o&?R$>%PePPmJ z6KE2av+qs1_5sf$?ATrA$>uZ#s;R4n;t1&w^&SR`Azp@N^6lXRkIFCl%HMVj zUX1>HNMyZ0fsP(xD1{(wfsaw;qfYr21>=_K{GUNBDJqhb6l_vk_kYcXE?*9}9~llW z>I1K0HZ_~xr#)fRg?sVsdA7ur`UZl8<@_`7V3;4DxiKfAu$TR@YYB+>CUs>R)&OJs z>>1I5hKMafKNOEuB!bhK8D7W)d`H<`BHN)Grq=SIM#w*7 zIjLE+iYb2b{|gnmD|T2gy7H!TR+|%wLXhT2``PcAT|66wU@m}KDMe?X_aD(R+|0(= zOxQLE9R?aZK~bi_EC<^0fMjn!`HaNrlz7^(p8U`3wH4d!y)dDQcm!Oc|@TM|J<8~ho6O$gb^OspB5o<5voBA+{u z--Qo5D^i$e+Otv>sTEguwbu#=G(Z@aoTpW^_OL9}?k8)tt-N8PahA1n(yN7({zW3S z$`lY?DYKFR025AAb9P34Ni}bbFfqfU(`mIGpjJB2i_ur`a|8Tliw;>eX_YMslw;_K zIyS2L!uS?tIOj8AZ4o%T2I-)Y0`m?z$@c(RuIU3JvSo)mF(N`sc zuYeEO@Ak1}aMb4R3-R+q=QGDeSE0)wd#@+&%)@{3{(Pl4vqtE#qc=>en}(B;3mv{U zG%Mv*1<&-IP@v-kG_3=|nRTnr!KAXJrGltZ$~NnhajIW)Vju5bO=94bOzBB{Dqz&} zv){jJPXwTVGc}vc>Zm5A4Sfs~Fu&+n75NIO3t}=}&ulv^5S52~pt7W4nKRL$>lo4r#f|Q0T=VtiRr5SJ&Sg~zpZQO(h^SOePfD7CLyii z#Dwh$@OeFQtv>x5S@s4xPxmj18-y+XoM-^In2Ca5Bs&jb%z#zccWL-On@b?e9QrX_ zO_x6Q9!8v&Lw~itKyr7cgFMg^z#?e5NEe$DzeP-}J1$A+)v*2;^x!V78Hu%6C}vs* z!luURy|i^75r~>XWJ>%>UDx!@L6PTJ=>Hm@_R#&+q5pNUUDe_@-P&+_8>>xO3$=73NX&7&>fV_FU?sYKxTb21Gn(=Is%6B;th z##dupv^*cYsnjocNxda0+_XOB$=l&r2PpW|+L8;AG{)3B*|d2^g0vssJ)I_$2nPrE!WmJm+}i0U}xoizwuT(sg*bWqF%^D zEJ)yi|FQ+lsUa!Y$-tQ$$WT&i^c=un`eYw2$|=z%)1Lzg05YqlOBJLzKm>>nE2ZvN zWHiL<0O7>B-%pboQByB7*rGVn?K+p$Z*9)LCHy}zPIoMscXUF7My0xB<7FrsDLRo(??>(fB@Zk3TV(tq3>cw%0JU?*) zeoA5>L3p=Gu2>QZ^AvJpI>^+FoCuKd=yT*Jx8RhTM~6D@(@$9yR6(J{U$^SUUeePmS~*UFL_$sxf-SwuNZluT5LD- zdL*+$2Tj4hxxfA4xMx@2jkUA}@ZEE5zWO0h zuo)kEz)ThFoxic($su&i{mbR0%)Bj9m&?8R?Lv}l3_cNLx4~S); zovj=c!Bw18NU5kA0lXd$jsZhQQAkS+grP_vFkF`qnrxX8tK-{fS-yOP{S7^A&4)vVPP9Au#GaSTIN%b(-&gqLc^R| z!MQ~W_=jiDouv}NYP0p{Tb0*Q)soNX*Op1hB4B%rR2Q|j~&Vy>+*|RR;whO;`ZH4 z20Bu*s37+KzSA}=M|4XzZ|nWNte&Q8RXx@GWVmK=yit5h8^E7l8k^DXzCj}Yd{4HR z`hku~^32B>yxb$`tf?Qxb-nSKW_I6H>lSa2Laz865oMj$P60mldaT0n*qYZyx1c)m zZQ=eDpaz+s+Emf5eUzm9SzUMwGp(v|hqht7j>R4F zm|tnDW*Z#LIcs8}ryE`k{F{_*nOwOyu|DGY>qB!tog!|8%J6HiE^^YRSip{1P=Y#n zS1@#ii1tmt=CnEG@N+epA)xZn6P{XR4+8Xj%Ab^0QxSKk=`FIJ_1?tHFmD8=hCx`H zWAD@Qex<`=kIzjLF3V9>| zKt0=a2FS5xDR@{IdRW@|zc?_A6lWbMY3F~K*_7?XpKsAi zfk+7z)vBe#MEL-3u(4EnRZCom1u3gD?V~C|EeP|bVPks?p6LLekTYqfyk!iF!O=jp zA&+3iJ20kR-G$u6z({PMZN1e{X-jWZ;&TKp>d-XH_eH^DgK1E|HY$l3QmD~9PcT?t zq|w4qt`AVk5{FsZ(;Uhwm$n;G?@{*%D;c(O4k2WeCnjeAI);btzeJP z=MP=+bwjgUmsYgfVTaNKc__Cd#`1jelF5ra3lvIcSu!B!O(ZF{a%T@s-iJR_9o@K` z>*?pW%uth|d$j)-a(#>ZwY~%8hn?LAh7f~G-B+R(7C2R8bu0e5A>k=at2>U?E3@`I zxeb?2*%&tL_V9orh2@a3XMA_Mf#sNF^Uk#w%`m~Y1d8b3%jZ+ViA|>V$O@0ZNy#w^dHwvnv zZL{1??w|h0)4$QWi6#EVDI=s6jj7s1d)EAIuHcPQbm>q7zY;*Bd@rq7T|}p1zRK|I ze`QIl@M#*Sk{YUb>dH>kfTqi+gJfufD=}NW6;COmyqOp$8u8`?D!5)%E4Z$XW;Bo@37iW@4G z(8?6239{?HJbk{3k5=XfTA58ZL$E_2EC@9`OLHhNJjV1){Wy|vPxnKwyIt%B_R@xG zIV5AiVE$%^#FnvYqfXF7|KE|B$^8_f1C--qJ3zI3w6qkuZsCPM_&Mm=x2S~8av|8Q zG)?ipBT!fPks%W}txkWT0;)nGVfkmIsfjsHOZqN#Aq4A38*$i2=z7L)aDnPA3wY#^ z1G>ZO1n8Q7K>C@O+2g3|E=lS=1tK05;oy!Q8TI<~dF%@62)A}L`rJN&P==QwYWK#n zi?xH~&!Q$lbSh+F=8wceSQU~j|B2Xn+`;32I*RQCZvL4EblUj- z2kBN|(->(K<}?GOGuQDNKqb(I#QFFej94>TyA097j`e~{4mqGY{EbJo-ue_OiKUII zYBZ;-GT?$#1$4oVbEsz=JWrp;G|8jB+e9lN8~Pr*8}$r!2P&cLkls_w5N+gcm=GN| zxWh6GRbqAzDx&df2o|^C$8hiLD!BYX$UIWSv} zKQMk-+S)u!2`gm>6%JtB=21ub(L?!IPg)~t&;zgfK%KqVP_wJ{ZHDLEL0R&J&!alC zpj{OX2D#pWi4R9j)!PR$HHD;DU%Ehm3SFDgU#42FjjBSjR%Y{BES7Gl*-gnfi4}N? zCk&B0!poy9(UsJtIWwz+C)bSX^7leci|4k_L4y3wqT3x$}T`D>K{yx5^VXEGpp8kwT7y^uuiSxnP-R&+Oxi!?nSh}34=_sSisjdVV;&ge(G20 zJUy0Lz&^%iN}ixtXK+;-RO@k5&J;Zy4R6+8D<(&RBog2)h9v_hP)$mW*w37sosMTO zCN4c3*RPhp>ixhhcRp>^^!qdso9dw5`R#%OY=LoTkj|dgdy30qPQ-V>uB`veY=J)C2|g!jJAU3qh`lI>o>_2FIR-UqpUQ6Hg z+}~xO@V7^()2{NOM(7!teB+R&$VWE1#KT$)&eAz@n{I z?m6WsMW<{@@#G#$Q3N>jy8@?Qb-2%GmUtGCtVUAH>P^Os8ZvAd!8&ApV|%JT*H!E+na)bxE3V?+=si z8>g1dxs(!lAIg0CFjjyWqdkcM8S}}e?2Dt1>_M^KJ^{=^sR>k-0$J@eu!5%L2^tGl zTRdNN7~sy?FHJ39W{^lVh8TU2R;y1aNYN~iX@VeDGC|_>V0XqX*P)Q`(6g10gM@+Z z6*xCH-V6G$U(-GHQko8gOF*EhUX2Q6wyS&H{mSdmb0?gYUkqG+@WH_nstk~yIWE{Q z)g@x*Bk;!6HZtmJ@s8*)7d*?#}g?Bee#%QYas-!&EGN_rA@i+AL zjlAZDz!%#CM2dvb_mqq~G_PP^1Co$N!X;XT{6(n|c3j2^S~#8x_jW#HxUQp-9Tn?5 zt+jI-N2jrTd+$>FO23yJaZv2Cw+6awM9D0eoG+ zj`uOX6?RrqUeKwYg?sPv@7OMOds7(O)XuzHNf))oofX_U85-7Hydis(9nYbiy8#0} zz<2l5oZTkNA{ZCowFCymi=`Sr$aV7Bqtu6$ujk&2IYdoN+01UIXL)-JyEdEHGwcpY z8|%$_hn{dd>b52k4zE%YS|^T$?k^5~AN=kv#4ZLXfyAHKqxRgYkykG$HG#ZEb~(}G zt&e->%dX<=uLii6ibO+-&J2jEgj5k~`NsE_6l*eWRll)5<$%i-=wOQWAG_jxpk{3O zGQ>a(GlwnAijYUvTsRIQ%^e+-FyI&aO5wDkpp1XHZ=B8EQYONSx6Buk+d*%x)t#Ts z&bp^swgHCcMZ(HrUgZ?eee(vq!QOSqZwStfDBUlR9{SZTpliB(J;L`bNj1-r*f!|; zsCTkVQF(QMGKGZLjRo%)4wa3x87yloDxD7w9(YutQ`o0pmvVn}vSsz;2Z>yWw;p3T zy;UuLU&*Valsy<+HqBMdzsl^#oy_I{koDoHe71$)-C%T>en*>G_nF6Q3ofn^63EV+b8c|xOMcJOa(M~cDVC1f2-&{ZM++>!^AhS;CTkj*Bif9qgHlOtyBUDO zw(dxH_+B&YJMoTq=R#|-h88hYXS79_@o=lXI*k_vI8{? zT6^@eT8-Lv@8FP!RSdugWcu1+?;Ld<)PEGDKllIMDLbWh*u0huX4EsjY;Bh0HvOep z!Rv07UK4QLDFk8~j2us~njp!Kt4el|7$>^_)pTUMru0nicEj3Hofe3LX>OnEiZs)k zyN_k~?hFe!tcIxhb0Bt{44D}8VY)zA)3+-(3+JDT1PW>$2-$WfafDd|@(xXeN<#kD z+x8-Yg4CLZ?yfJ@kU6GlfUgc^twD zBKSjyb2Z{^SRCj-LBUlc3e%k2CG#5iXknb@-(6mFwepz-22tV*;8+tUZ3U(J=y zBFk-kBZBwm+uqw8$u2Y7OYF9ZKCO4X^^@3Ezn*tK8ICv?7N$PiCzc)EOOE~5w1%fFITEme1% zgbg4j<^mcWiqM5dq9&H=AzQA4Xf_Aat_4TCuh}L$;Z1zC)VpQ+Zrifz*qakFj)Nfu zlC})PyHO#)g0~kaB)xClzDRU5DUcf#SQ5dnJEzFl;kP%H6i4hSN@V%dO{k8&xCq5)X?K3E(fgr&D_ELKTDBJO(ZE*2L(Tm@1n!ahXneoRcR zUtzpXSOz%{-%*=#xV4(c13x+1*Cn8Zzqrx~vSkpAuD6zz!NpkxGwF)Az!Qg@Lb{x(!IBOKGB|2I zL;K>E`+1B_$+y38Cf-e$ZfiPFKwV)~pJ|UCFZ;1YJzK{nrl+vu#b-NHFu>-x+=;Sb zr(0XoY4TYp4Fbl^8b;XXD!|PX18-_M3=U4~CkBdZ$OK;t;CttrDZ6HTiIVRb+mzSm z*6(jy?*3hG?g#ch?A^g@8nqd1l-j#ajEZ^pxJ^Gj7;ihZt_-s`N9NEOlZtMBA=BQ} z^F+P?J|=$Uu(#u%=W!CZRjs=c7ec(@GJ>|x{);8kIR8~3scJti!|-eE!0Dp`0y5m`F4nR zJ}eXt&Nl|^MtI@@0TJoiAMAJm+4b6YiEMF~M_=dkw6B!jl`!tzr#08UJ7e&>-?a6qveVj=(9m#8_1Am$&Tf7I z#_={9{O3dGc+I~XtYDa$qYN2FbKd|fF20+3Ki{_JIcS>0u|%i*B_s&CyKs?D z^jx|!Y}Z9)l3k0PmkV$DNkpQus*n>$+##PQAyqRAEny#V?e!v0CO9PdN-Gau)Gy~K!il(huMe|pf3>vrqBp$jWo#s}V zo|BsjH~^b4&XFekw@N!FJ9+O`T6_IKbBA9b{y`k2?<)oaze8VOcS9AbFp*HjA>@jR zxpevdr(DJzPXSTjL&AX@_w(r=%d+I~Q$e$H!yn%51GIj}W>oh-r*}zcy~7LCI4=&= z7_VKRB-b8=s-}asselL!T);}uiYTP1gEa!6;78L+!-b=hvD&wGm%0615^|ubvoMo!=mwnaX{*HT&PxGWoYd)ht*ay7FFWvZdAh7 z_X8KaY|tY%4zidKP^W7({Oq|yoTg5v`y5rZ%Gg5tB~qtTrK!{DB0>Y>#|5_86ZNW_ zF*-A2EP0SRooc|2DUCtMbKqx-nvM0O^;OJz&@l~s8wP{fK)`fQlzaHmRPk`hG~lQM zq~)HW&VZl@+9Nq$?%qj{YL44Lmhxb{IryTsW0lcMbnA}K^}CO(HOA{U?MeBdJ@=kg z#2@&o6}0CH(5Qxp5LBiY%gf!>v;q0Y*SZYg7Tp81hiqVEh47FuTKDWYNoyk=ub{3O z>K;rf8gMwa_}o)fv?3>I-r8H`D_-t4vQc|qH+ZZDFatQ~qoIv?%1x#CXIq z{ZE-}G+#uoYpVaZz}-1oElLCgYugu~eqJ;y;`ZwxbKJ}^sNT>CS_c%Kgnrt09=c+~ zaeeF6=cDeNFQ?8Yq+HLQ!@i47sG>-4hG4KzzewF_;)tF0)#06Pf2^*X-s>s zm~3WdiwQiKFMe7oFCp%BQ0W+u?rfuZ^qy>7VO7c}2UFHio0_*2cPP zpGFgd=2?&NdYl$OUojO7pem~m37o1)H%piS7Y;as|bOKIG~&d`IVYVQlX;)oAS!6RSyyzr`h*EUt6x@l*`GRnVz$< z1=Tc+?ukttU;*5$-*-xWpx1P2&m)ejs})agk{?uYDH^Km&7ixo0^8F$X*slf8 zh_>vXmr*?}T5IXJ3HiD;-?{OwgTK=~#ZIb7s%W8jJQf4U`v>oUrNH`nu7wuGi2s0q z)+zjxgmV5~^QGnJ`Z1OeOpi>rM4Q#J zymLySbsfz-ZN2KBd!fI=s(FQLvYo9%s}SdZwSZch^3CV0oOf@P`P9ATHo1rkL@w~D2M@9^_Htd3VJf8M`1ZZgpqAvXEm!uKqj^S9Nx=a*N$bY%-K zcpsm-@qI*lGuT-lnuq$((a`;a-po9QO;hCC#Bm5H+Jhh-z+VFnW_Nj&IV!c#Q0|c5hTcyt|6!GL-ND(m zn!2O8dP?LrDh!4K(R{1#+g$q2#Xbz%Lcf>fY*qi!JX*h+ufIZWPHxI&YNTxG>*Y+1XMQ9O2)pYxWIcPCMSN>|mVxAo1syzk>tkDMxz4{Z5jJ@q^IuN zc3iEIRa-H>DU0|+l~-Fi)*V6zBc{Y4;3w>HmTFc51u~D`g9t%J{y%|RTYJ`{kf7v~ z>$|MPxL&x`q#y&n`bo;yFSzd7MWjrpo!CDc8F&W%| z$WV-z<>u1g*Xb_1W420h)h3w>e&14B)O;S*Zdf=H%oz6la07AE)*$etSX|e?!RI}@ zJrKToxjNyUcmq7%0u^Axx5G;AWuGhP%wd1sdAD!Gd9PNBGGp9Q-TTt>;L&k?XDbSC z;y&;!PXVOtTo1>2&`OX2qOWZ0CT+n}4u>&Isv!seB~B^08AT}>@*bOaIsDdpGsYp> zOYsUc-DB&sylU&mm|xrv)q)dtLy8}nBFtBicWbjyez(g0m7$0CPBzamL+rt*sAEs} z@wGde2>ldI?lrRWZlk|(_pajDl{>c?w;kWgv@;;^wH|YOUrk?0f9|AU&4{=piR>*K z{z7D~mQ}ZsQcHF~%FlBFIy*4aRwDd`5D~@16%LT>fR9`1R~`uFlx5E-MV>OpW>HjW z!`5fZa?4oE(pbm=%``g9E_Q`;AbEEgcmEW)%(z9oQSC<|s1^=y;DGV~Z57bxUsPCA zFKI&$`0%+o2@ zd7B2W&ygG~2&Pk(s^Q^L{pX#ASAOtDH2TIt+tkfalT_&{V(n+gRX0>$w0xNU0~bS;zLopdMmfoL+ng$r)zc?^ zd)+H)Lkh4b^lEyu5+f{2Z_6Fklod)r3qHmYI9jhs74q+2f+vGTBBy)&FW{e8{7%(R zLZT=p1*1dmqDF0YF2v}|@_}?lXHBnn=JN8U>)ab*S6}LSV@e{wh;#R3gP0E$Yd+1w zc0mR5M3i1b;aW*VB^7TqN|mu&CwT`YKWfXr{8|XsEI5cGjOD65JDH8`CY^%Bdezx@ zR+Y#L9UzZKIW-rr9evt~`|s9q8=>M3D=W+E$M=a3eWaM?rYpVJr|NjdapIfnd5J@Z zPOa5c?4|F;N2rMxz!D1Y1?0lrO3fhQ6Xa_=EM?rn>@LguyBHT9EMsJvX<^&-_B+UG zy|}d49X-p-&DvV1`u3H~n@sU#4>4KQB3l=D&eB&G)4~KR$ds9GpFfQMB0(55ycx=h zgfv2|Mi!Qg+X1z`qr~~J0#Beim{^UyM-RrPz&zcRH+ajGx=NDYmCx*#bNwBUf2O$j zz8CXsXY#EIl-#v1$OrI+Os#ii#}@Y%kx37*QHt+`wTc6tZ!dfD6_*x}9 zi;0+t1KaB7F$ z5sriV=Prd{*_Xew?BVj}B)B)rP*4la%veTe()0Z*#hn z8XqwlX08^0hTqQNU^+1nFMCG2DMEI0ariW)j_R6f)?jK1e*9kr5A-ZRoZSquJ45a4 zC%eBhL5!N49iJrFjrH81lMgs~8<>)I(UQNiO?m>8 zrnc;ivm-=?7!$=FT{><7UbYi24757L8*hBPbt_cdNzSR_i}NHiOr_0`)*o}cFkSCD zb>jUTKAb!OJ#Zsry}9D%HUF!+b)5_B&JwyxcPu9YD`PsSI z{_-&NZMtjnJAnr|#yx6aQauhlvTcbWVj}vI(GNw0X35A#dRmApjX-ShvqLI zKYzx=^`{v@==E`XZU!TD{F+$b<*u8DkG|KUfc3g+y!pb_L#wUQ5|4y}MYLPTMHQr1 zzcWV{t7q8u$TvtkcJgvh7AlO$Rjquke6>0k8}p?BaiHjDhb^7G!6ORyZfZYiMOXlPqakxR~JGJei?4 z@l(I9Ykh`Fm>0SoRaPcMcQ@&dxJq%fdf{SiPDOI{z!+E;N49Eov=pG%*D|C8TNrDUD zG}^t5Kk8r~9VSLOjqmr(z`s83wWL6o(NsMeUP#iilR9V9>Faa2#c8T~bv6;XcfEiu zAIq6mPW#2hc z@!W_`dAi8`nWr8Eo4n=ZF%f;LiDP(d4aj84Sk9|}DrP-@gRJe6_FfU$D*hA#c_<@g ztGAMCu<)=aOLJU<<76aNclPu506tq|y9y}w60;NeNV*m7+*HlZMl`)MWr#6fV%$}! zuPui=cdvP`kBvI0Q05kwcf0QXc~Ucda!$sbZZAs*F(7^}V~+8~rL!kY1eNmd&MN~< zoO#XNo!pnRNF>X$zqs_~EO)$haU&Wh(y1{OJvJMLC^GZ=W!S zyEsxV(zoXd8+MB+UBPF$V4FFQw9VPzIFz%l4-b@k3p`ktvwqiTy`^-0OOCIQTC`)< z&CoX>8X7_B*%L-t>`5e7nlV`;s_xxJUP#K_Ot6} ze|D{@=)KbXxhhV)0u67{XZf(P$icMj$9I2WI@`i@DKBK57%t!W7u&Hz3%DIM@-D&I zdb$9Tdc}zLKa)Q)O%&gW3r%-^pHxOq6~)Ue#U3IxysIc0Q)hMOWYNzGX3 z{6GdAef7h)(fD*V;cgL`?Da3T>+0(KrHJe#58RWA!c-Z`sPB*78a~B=FE36Q6bv~a z1PCG-Fhlm@IJ-ZM@i-bo@Zpp)aH_q>5+66>?2FQk%lv@Q_Kd}3XQ&e6=eU#&sE|17 z{P{GqxJ$gwfTlHXs+7#fES!ZoA}aao)QT3(Stb4~~=GDx9l$tjm(xQzPtk=WtAUN?*ysYEH64 zIi+06ro-IjyRxpmc=(%1lRW{Kd%oG{Hnb%W7Ct1RInp)yFp(k~J2|f>GAqic~u*xtKKTrpNW;CD-?8Z zk1=x5OnK3JJzB=T&*f2XpwC;}nG*f?-o-g;^y~t)_AWn#`NhpSr7em*+0Ng~oym42 zS>2{JvFj;E=8k^EI<==ug(|XUf$j~4axs?zLz8^Q7cghE9Nfmz+cP?INJWlqsY64N zP@vMy(4~#0@L)$?Z4RwqWQ&YQ?Cap$lW zLKJECuIHN6Zfk4%ZxNPwJY5T|?fSW<=1%p|is`!cH*xkE+V|oyQ*XzVY$)E}!_BI3 z%bs+8<>sqbiMQ#0)`-dBDz1=SYrStkX~Oq>+S6@2TERHj6UK*bRd_ZfFxu%Ryt2bX zBgHa^`%l75xMvMw&W|#Wsj5id)gglqK(R?UHio8U-P`(o1%I6jMfGe_#p@cYL#~dMdj!8PjUS zpNX&LQ}mqd%ylbLVO=8nu)3`yRF}`Y&VMHoP-ozM-UFeEYeWUc5o6d+w+y=Yh$BfSi2{knmQfh|A~LHH~}0 zB$Z5nIEjWRF0*@cdeTs|KCFm{5SRj5qlBi0Tj>+YVLt#s$!9dd`Ll1T8`I6Y=M21e zhL5|0lW6?Q6AppW4w}R-j)Q$Bd%UL|scp?Ai{<`U)$4m3qDALsIYMH_woDvMpmK1Z z?d~)Ul>njv8RF8J9x61?t3;7Si9ArWsc}-FXFM z1^D_);gP^G*dui z9s04t-aTKN)`c6M!~Af_>M?R+d@IECSpHgGheO)^WMw_zrXoUD>J}`X+4fgRpUm4}h$#2u0 zq!jBuINTvhM7k!E3$L*t0AIWq(P_g7n6Bkl|!cDb9td9QEZ#3!WUb4JeFp> zCcsa5qE<5Eia*d%R%jd^CD58RVI-fU@EBKSj2>^!oaE17v}nW%6DkY2-hZ_-7%yl3 zw)ea|c$LHf8@PTeKkfG+j_9rA%U>>Wa6Xp{&i9X|>zu49_sPfV<{0-bOg8wHd`~Ew zL4|@e5;2{)gW<|a2kpxk<7p-K_;p_Mlg^Bf3FDpe=XV6a^l(Z6M`_39C=Sal=H2{b zw=x>BM)?NQu~6wNY_*q=`%;&Mf2ZQ&_xt8fPO}~{#A({IE!@vQ#W20@$x1r>$gy-O zvZal0QM1?2cek#Y%c0EG3A~Mz4cW(}rD%PWNcN!%CArylE_J0y2z&*1P$coQ$g^iI zg!Y)r5ox7!ltS&NsEItWo}8(cTnvx0XH6J7aE~}4>rl;}B-TWAM(g3*Eg748BrGh> z>ydVI7JGY#(~?jF_AKMiRxQau3u*tQ3rk(N`MBy;lu1a^Ub`gkff=cEy}*BMgv%s$ zp^!6CA|klO5JsdA*GJbe%P*P6vFDP+k4q|8keTO z=4hkulh#s=KH7G_PJKBY;+0r?Sg=v_^XJccZp9K2E@w{4$}+|$I1%yj@hv=brFmP` zIHmD+aZ5C$0FJAJi>>Z2Wgpg=re9*~v4?JmW8;glU+t@ePx+xz){m7|7?XX`ehc+F z@~S!Y4-1to13%}QJ;t3b|AJu`Q=aa(`SnZu_U+pT!_~p$r>sFiG`3l;Fm!1AKT9)o zPd<%O6MU<=PG`on>ZIQ1$m@b@eHUBVjcre76u`IJmq}H&VlE~FTd7=1`&C)lDw&-) z&Opv+F3tLw&tmhOMyQoxf$iH^sfE&a&R8`n$IV3>LUpK26oROh|EBfNVuFj5rZNI5 z%J(vRsewtJ_Fi`%fOBs$xpdQI?=+adE1b$iN&VtENuOIdcEKmRiD;AH<>k(#^0!LX zUDj#w+iaH>8rZyj=!RT1;akN{RXdJc`<-Dx?yjNo6jWC~X|rr*47IU;m_DB!w#SZ* zZ(rlJe9o*d$GM#SXow8|?mD1N@(6X`zaKc1hVMI@?KL+TGR~S2z%}lb@f!c6Qbw}t zEiwNxM!$01(?{t{%HXns8#|b@T*JH5zd7;T>@XSC*ROtfmK8bnmX5edi7?0Uz!i+c z>te|^;^nrS%XwN8Tfc2PZqE#iacT@;GzX|HwVMsmVmU@w3qUsi zRId5jPy#LS>z zx^FfJ7yLP~I{6AlV61FT){;k1m*G(!{I+$RX3ehcCLG9g1B*YI{xD|dzj6x4(; zEk?hzw4lNdUTL2AE!L?O6Jdjo5_f|Rd09>}?@NAe8Y70(=W(I4Cei0??YRSbyHYQU z7VXIc!9}!&d3|Jvpt;MhU$U+z8?sZ1N1485@J+rzPtmQsmA`?PRklE-AWWX0a! zvX61xQ%ib0*j)jac^q2L5NN#0GZ&efdbBAS$ygqkay$E-MOPeqW|my>HkF@=zICIW zP!N(evC@lhGD0U!D%JhD_i#=qS1QX);eQ z>m6&}Ifo`J=?#NaaGdg?vFsca=P`Y~jT|_!Dp;m}5_@pmpnNZFcy<_L+g&0B{!Gij zN0XqX*(qj{!bl}Sv*libr|GY$Hiue`LZZBDPveIVO%P*AVB(#jdw+p~Gm}e_=#Af3 zXBK19BijQb_S#^Zg9<{CG0qE`yDYnGIVPBe`M6GXF!rLqjjkYpDv6yTY*!l}DA-Bs-ZSEEI_Tj{CGwoU#( z9-9b(!_(4S6HP>MMM``Sx!ucFo(WH~;w44|Awb(&?K@ful9sFzNwUwClG= zA0@m!IVy*YeagJ@%RqG~dvJzLEJ6g7$LB(^xI6iy3%+MMs^2{N*`*d~SlHl5xLzGJ zVSG-!CLie|*Ltz{`NfZ8;Tk^iEa&_(6s1If?W*;~8i%GEf0-`K6i$aDP_{TO-@w^- z?9uNxGbwD$@vQiXu54OhPU%jURI2X-w3)@{0N2X?;Mw{1*-tyQ&M$mlv%oYbKJ8kK z1(SsjbRHh+$zu)c=H!wgBuJ(JarssuxsyG{XDlx+l#g!4PfR~5q!-$DD>eK9|4poP z@%wmnZSg-}xQ{n2wQxNMZi;cOEF5%bOr0ah6Ub2?I#u`|8S&1$`&nha7 zMFg6-PT&#G*j3|_kz0EtD}!vf<%R`ZOqe<-0-{_PLkfoYaewo z*zu8cTA@;3DFfeWx{#?WRnV-|i};u7Es2=ngkwS_5(EMa#nA&A-!7?3FG9zNgL76` z-KKHi|9ROQv^c!zfGwMAkx8NLExGz# z_xjU9=CQehyB2lLdf_hafthOCHjAvs0B z?jCtsNMsJhFg8cP^;#MqPt)$?BY}qEk);mtXK8NgL4rwq95r#aV!@G+hL3k{v!i2( zZt7nyF$>bn8Lz;j*|c%@vzuMZ;F|Mfx%~n)6|3Zox_0dv!H=hO{MF`Ob9$i=xO(SM zm6l*XS*E{Zpx3AfW*0{eMSdNw??}H}W=xP1)jXf7F%jJ@@5H(^5wd^wY7+aBKaa2? z%ovZ#(1rQI`8`59q31In^h&1{$bG!RqxPdm)Zli(ht$;dfn;*iVzMl5VG>;|Wiu)J z#f{Eqg0`IR%0Z;ZZldFydBcZ*HF+~vNR9?EZ3YSRL}pnzV}S`=Zn~NJizzp`c+w)do@67qmH!Ma&dcPvUETOGG=$)ZBUkxA2`O};xg-vfYXkhQ-S`NHr zf`-_jQTcUjtmmK|UG3DqL*eQT5g~!7)VXduFK`HBhg^$?iQpy%3!cbV4OYZ(Z1&Ht z@>Ap4t8gx`Q|OZsw)*Mw-pyEQIp=e>7SSNv_N_hDJHAC^oSaBl7?vUOCf7rjhQRvX z_BQFDSAqhzf*)Tt-?6-|x8^<-TrH}PyoF~-`~1u5w0Ljt5i~@>$Gu)VEfraB{JwJIm&!kBjuw*OOLwkG6dM zFdhD3@7$;ACwk>;UfhPDLnAI}_d`AAl(yGEmk+<|iHUH7-{8(uU2erh8g1ng+P^T| ziB(>%+}whK{8$YSbvK%SG&CwB#KxmJR>~$Nj_q2pn^T;1eR>8%qIEHa(TQ~r+&nh& zDlOpju;?#yOY8kR5@rVDU6keBh(95dpip~G0+$`{;zw5L3WjfTH5z z7YDDrachdCs7jeq1b#+P3p`9juGq2V5x$<px{hi43-FY6tVv(Q9oWqa-|mm#QCfx=q)%C#(CD-twlLUja?X9 z1=yb7N>P+p%jz4!Yq-J!oaN%T=bKghG;GPVj@W3nv`qcX>?yD>rW=2&k30b_RJkxf z0iu~SGi;lQ`^b~JLC$`8m%(a{PJ)ZxO_&>ycSsC78s9Z&=jtV`>15t4hl6;R`takm-P}Ix=G`$cL@q-WG?Yzyrcd2E zOI`|{t>U_XAJRqy;U?8h*_+8|wk%YK@QX6Mp9RTb8FoT z+C+%J%-CkU!mp+Lop3AT^gDIX%s|CzQ9>x17&6UrJ>A2BTK34CWs2yNotJ_};J@3W z6g`>i5_r)!5(jqFl%c_9ew;l>rRz{D+gWt2?N57&$ zY{~^jr0;e~Tlu(%GR!hP^T_jZ1mqLNMu83+xyPzAl?a{_u4n(Eb-4I1=92&MvikN_ z2mTki-I*kp2~WLW<>S#cvlIDTVPU2i-D>uht$xDBpLgU>7=KH?zyx@|b}n8b7cUFt z`W2k*fAgmF&jg*@#N~6%;`uFA06z?01z?Xo08F&HQg5#Ijo(bx(rTOI;(8v6Q0f*P z6ghq7)rM8y@im## zL9o?C{;3qbkLy6bv*f4WO2O4ex*zXKkeeQPFtY#<3&Wp*$6mz#Gb~1)v!Fe*mg~VG z!Nyk!n7k2${hWw!mG21L^s^`f;Xc2x_XG1@P|puS`U(?zrJsw5(QSD^{gBr_bBx^% z^z_Fw&!xYK;js`uv}@;Tu60LJZf*Sl5Q!N8I#JKQ|FF&X=Yfdu{40LNJ9b{%w90om zyv~Z8tit7c`GClcAiy(iIyH8G%HkOU2mvfo*af&RaME8;f4SaS9YCLz8v*)s;pg^k z)h7V5_56+189szUef44BX;#0v`sZ4a(`x~vvT0<^10YW4efAW#3vieOGZk zt2vNH=k3Y!Pt7VBaQe%r@;nZKFeBIB*MD=-yzKZ*K%{Y9c)x<+hu{2zdU|$I_u85jhL&dtz=})c z^f^2SIZ0dx4v4InlYf0uUG*Qb^`9$nW%$TH7^)313IC9-Kl>Ni`rj|!CbvSi{_|gC z>j!R^z5@`{g{iI_OZmbbU0e04*=t&xvetaHQX%_H?FNJ!(lK%P%zF{8o4%pKKLP)= z7NL|-S5F2Ep{9^}CA^P~2z5%>{mXt_7Yw(<@jtvDUd4q2SGg^XyG~(11wXsR5=v+_ z!kOSv*EWJ;c@9ex$xT5Zl3__tEkhF`5MC*+0B}LL!agCuNUq}-TGYZ_%vOHxh;;0P zxv%{ECHc(?-jMui53*;qK?r6MBabVKtgEa86@MO~m7Y1(olBOt@K~a0Q|sv=9MDX%|-X0aNASJZ5N0C@9>3iU(Gb~*^_*r z=S`C=Zy*Hh%4=aI$n{s$kU#w!Ch^}y3i<8-ChDtda|ytsxYoT>N!X*}Ro$0cj{Nnn zkcTzAj?mUrDi}m&O^2%k=1Ub#z{1#EY}_>qFY+fPKazaW)GB@owC-+hmSeq^Jhkp4 z@@gJ{XU64gC~Z4EY9+Tf;PSl$$J>&Ejh22(p|uYue*H+9%|$>Hm3$z%To=TcAJjzptWyc_(t3MGWD7>@E4bf;5WUlJLkJmznOZB}6ld)ygZU5vxAO5DeX_{Z$; zo#7P9=3(mSLSSLGiLY#9@n_3W9~JD}bIL4Z1g6A&?n%^1p{THM>TXHz{R%?GODt)M zC+{4O2`z)wiirLF8sJ_XDKGQCj7(R1M9OtlBK1Md{6#QtaDo4peZ^3|xlzq$*Z0Av zK01rhs{#wyWW0g{<+|`<-*4;f`Ie1>SQx3vQDjxWxi#3CeV5)i#~bfGJ|jD zlY`qQpKFrzJ^~k4V9Kb65=Z-|Vsdy>Y`oh8=F--2i`mZy)~ID0V3m4cIH&pZSHp9R zUJXr6+1XFkDY(UxI|3k7bsCT%343|BbqV?~U0XsWFs}+i9a?M~Kjq}1vlFP4!kww5 zG|y1}HcN-@uft)UuGwQwV~$OQN$81=tTJW6zKKDfISfN;N5FoUX*M|#qwDY73^Qug zd8im&_Up?>j@V5xZsE3Hs%ebFKCXBX>_yR@$Xv)0D@%5UkxVEC{je8C7#2UULb#*8 z1&X>R&fRtrsrV2v$aF~qk_cV`hBNVFX0SZiNR}G&e9q_Y;#dt!ysWg1!YM1)&z<)- zWBjw}%R(lSPA02qdHut&ls>kT z7xyMMcAwEQ>Sv_Gu^S!(-CoV(zn~O0oH{WjBr_6spL`<1^2S>Qv!36=RIkMX!&1)M z*g?l$gWRT zXqhBP+I4-JNrK2bA?l=FP&S5|mFR5I)Kuy{UAnnfZPP``WSicp{Lz7uZxb~k#PCK@ z<9wGT-n?Xrv}MBUKr(uiXxV0j^KhPJxhb-`kF7bk^oLxwex!qi9~Hj}*t!I$`~ppP z&=NcV`dm+B1sgfK$B?5Nw%3PaSNA!saPRqniqCm!A#q*w%IKQmr4vUr;`dcri)z`i zdknM$QSN@{%&+U^+@efs+EGiWBcrK+FzPye=22VqhgC3{z1O@xS}BjU@G|>CzEYlf zu4z>=99OkTLnZwZm(SYw62by4mtFglC+v%C`zp&#Fv>6^lA5Fc`QjJrp_k&?+S=k} z$#bJQUZEWO?-52+QIm4RFH)b18~a)KA@MrB!K2M@3KaJQUp`117hawf2*pTv{3>jF z;j_$`$O8U{lymj*^p$rFr6b6#ZlMYMhFR^GTIz`DQ@4(YYqsRj!``6>MfLWGE*0vX zgm-`1N-OrfRFft5f`HKPPv7j^?%A%7=A`Rpc~8!0;P%TO*bxxKHeH74#r4smI|a5S zcFjV{tA1pFUp}#Sq}m`msGv9AqaJp}%x068gY#^H8)=(eQa3vv_(+u*wSg^F<_)?- z^(zYqdy?{0aJ*f4u_94CMoe3-r0Y}Ndq@J^>`XJpOwf4Ul8B@K&Pf;}mF_vG+ud5nbGsoa)BdQh^{uE`wY)fAC0F<8ii(vVTOBtZ{v{)I2 z;%+s3@S^yPJW-RTfe|4AMx_Jen@#x)5_=RjY>=_LQ6I%jsxx{0S=(YQCCcQdiZu)IyMv!ss8C8J|tZQg25* ziPOk=eL7Tja=V&Tw}(GWV~7&dJ}JKRA68#`T<6s{7zW){6&V>xkh^lNK3ctCKIrXJ zF`;^HFl60d&F>{TdFQiedL$Up?KodM(^93arJVb)Zbz|KiKMxQb^T(it*CLS`xFuR zI@_QVw@(|DJS-9JD>1h*o?np^$T1<3!vFEwmB2lO0y~5JGTX6N_rBSzjq@@3VpXVl ztN2>ga0B~gfm#SBvzpZK=Nxj5o^VW(`LeFqcy)XZU;I@-`0Tgdd;8XFH9<>DSlmdR zO|O`-=bKY>Obq5~eUv!lnM@YJNFP}XBzY^`?6SP|$i5pI8o-}z!+?3BT)wMU{O278lro$3 z6mk+p+Wk+ht4*i)61r{Yw+BrqnJ zUzYveD@pMqqc}Hd9E8zbz(g|LeP#eTg*}PVv>K}v*SKiwYEF=FH%@IN>jc)sE{l87l|NJ37$SLJAUOX^aTJJ?EkNc;TqO%*!m<217qN(N-g6 zv#GBAQ~M_x7qU#}8r;D?dC`?m$t94c66}S!=d`E1yI_}38|OZ0T1T87y zZL&qiDhcerdc171bxPM&emXHtH=;t|@_>%?6h?QlOe;%F#w4+hhpy~oU{5;+tN*#K zS7NN%zdZ(_g`8Ols1Fx_|G=KBZa^7hXv*SBxx*m`4(5Hb&O1t7a4)yW8h<;foqPMa zl^G@0^%8gRCf!8h$dG#c39$Qdd8o)O)dhoXV2CoY1r0~^jGgWwJaX=w zhHQnLrnhMisaF2N-Bz`qLf6j=DtQhqzHK9C8WzhPk^N{}d``+{%47O~YiyxaM>=gG zfVH$B1T&^(d+bRw^OD`S!l6S z0`hCBgO&{$;|mXQiIk_rRVDT?~u}1%q$gbg%t-^vPTcT937I<5DU4`}T_J^;l4aB^9!E zU(pC?oF!>#oG&V}7F@NrNOXI@Fw3|MwHS7`1vOm1TgwKW9Jdz_AVDF?KY=Q1%4@v~ zZP*?&pb8!`Pj4P!MdzP5u><-|(V?muJWUIZ@cw3F|K3L@+t6_~6ssPmewrd*P@dXw zL{|3aD%XXCvuv-GHxnztYPra?2GxP7_%+DEdQxIt5=Dw)dZmhKQi@jkgT& z9?O{v{<|CWrr_PlQ;Yk5>xw2Har>bpF%q)1XY&XLMa3k(ku}qV^$Gb5G@}7X&gEc3 zUeLq8QId}k6f2+X;}G4nl@=f=a({(*^umMa_;{z;TtU4YV}XFn*P>6K9iJeAqYzYC zCS&Zud7kZ%nwqN0$Hyuk0<{-^ZX)o8k`q2b%NxQbz#dVaop2+~xYI*TURCCz>EgA^ zJ0QN5T`|&!U%!4Ha!+=*J@gYrfosc1 z^NE)|W`&Q>O-bODkrfz+<3SYM4==}gr8#RywY8`mVh`-mLlHt~KNNX$kJ^qOSO;2T zb=p2@x%u9W5u8Vz4fwdyyhJpXQaYQ$>#6L-aSm7i07rYP)2|Bsx;PnbWEu|i82a8= z3C(s?Pp#K;#v}?0x=P&piW<5Vd??_)MdKuzoakl|6DO8)=kw2>&jZhKejm~zdcd-8 zBuQuZ_?7S~J6aat6X#sc9MUdN60(C*p^$SIf3Z^|?9O_M`SqAi#i8$pvcQUYvuI^= zH)SO%F0G?9^A!Xhez{dZdOZb0azz8t{K4>Au@pebe`eW-@*Q-XglSCv--@m3hxk>z zS}Q*{8SGD(NCSb}B&Toq2Hy zXNI#ny&B&rc>!L_|96J7M$Gk48=_=MMMsu_7e=nAvxYUonY97b7Ie@p6%a89j;K@Y4f#dU<}39b-%! zTi_U*WOk9NRqCqMOwrTCG%bZ?Q-Dai%=B*5E{FXIu%ya@?+)HoTsGFL?~TLLgtQxp zXU%7WK-5a9{k^UGkNFea=f3eKc`ecIJ3>^PronQop6>>K!s{@%(ir$3Zsj6&R{7=) z(d4AD1vWM*^}~nC>?CDsCu7cs((9#e>oPy_ljKm=&jwXdIaTa3HVdK_%1@)g1TpH; zfS(4BLzo9sG<#An*gQ?96U4D2x%fn}~9@bwv`82Lo@TlXgTU&_|?Vhgvus=b0bL$U% z8{M3;>G+A(hqk#TxV8+4lSifxE;{51J$}AHh!PX|ee%v}Om`HytatGF3~B2d(9uW&4RSjz8V0}^HdG;a z#0m=SZp5Y9C7QrFx!*Oy^L6$7%ItS;B@-Oy-a}wI_SgxNlDqwr%H^zkzT6sA#w-TN zpVG0tZC#&v&%5 z`*(;P9E$tPNj^rqj1*||d&EnZM$gs=@*Bl7=avKIO@wVVQdr$tkQNhQnR!D>aDymf zaV~t?D%_iK@j38}|8V7XpKg(Fwsmy`i4KrAjmoLk2oem*Oe9*b_-QEN6sXuDO32 zPHlHW4}$w^HV_VZp_4Q}>P5X&XhA(>yd5+CZHz}ve z7%1qqo{}?hq^$$>u~)|8X9XQ7EnB*77stDq5&NF&8M(C_;f&t-`Y<3j1?K^;TgJAl zh;>=pGW9J>EKqyEuIG*9JLj2 z-c8VU650|MpK5FTh4K!xSh1JgZ1sJDcsu7o6X+h6(7IcQLfdNekJ)LK&rJy= zQzUwm3IHE;OxWXWNs(>$tNVq9W7VRZa_RFev*s9uxyn<$TKNxa0#FU#eJcFU=hB$1%(V+}dEbp~`uBCv84#A_KZc=>nQ%8e8q!j{o(9|s5XW^k5I zh4%FgCyE@}PlU-!(z@$KDQ1HL%E>QJWiCsjqzt2wx(srbCFN!xwoAIvJcDb4ie z1f~Rnt@k1<+h(zHQ4j(gRE$w*gOYW2q$w^zt% z-1&6K7Jwk(w*N}`SQlt6E-~MsYm8(n*IPV+WK`-2YT)IAM)oBN8mspOT+S{X`6(h2 zFJ-2d^*{*(YqFziqy#)AqDSwc7S8dLy6MwY4r+|a_+=|>w;U6ZU2dzk{n7JH!$f!b z+cmsB;`-XKYvI3ioz=?AxTELy+bos2I7ELU@dnoM{Vndv7_OcHu z$e`S%B?yU2THO(EQUYYG_vnl~i80N15j^3F9_yFmW>Ip^f^m!7bP-hF=l6c9Wi-`L zD=!dC0;d)SM|>Je04!OThlGd%dyTkmNHfKqLefk%kY?(9er@ci9fZ=TJZ3jTeV_F! zk+$DbsonQV-DecWRiPMT%6C2L8i#0Mgcm|foDg1~%jo-(Vw$ta!3@6b+N15gC*jPw z;2lR$eQ$RhVWUJnJm22U2k8!krVeOyKwQxvu|%hyjc^Wk23!`yEiE_XC@G`xT_#tJ$w9xEf&sz4Wm@5PmI1_#;)S$MyNLt1R|rxf1M z0%$cv+FTOo;(FziJyH|Nlq5_n#){?FHu>c~+o7)R1XjVJ9Ds8b2;Cr+`G8IGNEKnNhe)*)6z1bP`Oew@(r;$Du%7|Oa@|e zn!pFqgUgIGh6)yHJBJ)C!0jl^G{N;pPf!Ip!yiUXDP@n8<|`A5U8gsTjk*6gBIrB; z9_WShD`~rn<27%_22A}~K}}w!ltKa3%#<`UxNKp+M#98BG+>xH7Q8& z{d`%WQnv?wiaNig$6v7J%nnP`glV38ghb(Ns17;a<4PD0k_f`&C>TOlin@I-pp7B_ zl#H>*jXg0`R)U!1<%*~I0b+Dbx5NTo;#kxaTTR&O@-HFTfd(->f-JasV1%LLLnHP) zEw;fy_^gXBh*!cLb4`;rfJyfIYLd{E)RF**& z#pnwj-TUQMsPghIxAPy{H~wf|v&6%pI?INiOtC>#Z^1#D?2Xjygac=P1hmpOlCkm6BTc@wS*A z8*x{TYd^K63ThHtmTWe(N%F{-svx=X%D3PPX7&wbT6sL0!!O}jq+a3T$@)1>+u}nP z#g4<^)CNy79G5fDOabe19UqfFSpnu{A##K)bZ~SzYT&gnDv*!IenG2Z0fj$V)hX04@Ghn*kdH%Z z;Qc6n$2wCnUB_eOx%>WMCpZ+RWMl&udaxD{`pXUH3v!|$HCeeb66M+NZ$@Il3A$&} z;RGe2l`7tld&FW4J(`}&=ZFI^Jb~Wlez~psM{MiI>lAxTthCLneJI(cBR#QBY4<6e z+J3d!i$18qBpD;!GSzP`GFe7>_M`7^{TS19aCSOc)6MZkD~+{f%{-t1Y}&B+s|prz z8y1I#k=QLIK|ng2K10swOgB2TBL+@}1P%ZNT+jWGM6SpOur4U|L9kfj)mmz z7t7(3QD0j=R)pG0KK!i)QYx(IwA?u63>^#!uj6kQ7()LUU12dyuE{{srhVx{Jm#?Y zkb%sj-(7inBpDOTM`lsW&S3x9?LI;N4kAu{WZg{8i3% zd10b>Fy^;}_~dX%nEn(CACW}gx7SX%v(&nfUb4p}^yf#ySWGiSQ~3Z8rps|tOnxaI zypH6#?Bb!sbPP+BhwOobfzf^==fNy+Xjvcm(T~AjP?M5V6mVlqF+t!zS~5LrWoTY5 zn|e0O(Van#2cE3t*)yU0)=o9f6C;O&5>KnlLgZWRnzSGr3k{KnLLZ$*u$Uq{U%-e! zuCM9Cj+RMaW<&u=@F2xg%0@^0ZhB>GyGD^2fx8H`T}|l zK9df4N0|R`ASDYbsioktiWe272!KA~npwf{JZzuNErSI0?C_faWsamndwo0DXTT8@ zs(nk}D$s6&n(T)R2IMXxv7pSjR**DY4|PDvi9=2=P+Y!K6c*!KsgsZ3fL5*{VdTM( z>whvlsqgu(@0@Y(jBsjc2&VdiW|b1YQi+V{=(W%OKJkAAmASBduKqYzSdju8NV784sSzV#(@(@)^Z)+mJCaHb_kZBu5Nmf>)m%``reL6 zxZS(3WnE1T094{bq1JX7iNY=%=r45rZXbZo_^vDh@BIDk{{;kRMK=DAz)pbx|No0c z-oXFYIM)yEDsFIF-_oyuVU+E*19W6D;Sl^}Qz8;e`CdGAY-18Y5xL%dSt&HZZ~kGg z+mtuCd-X|xbaNfAT>Eco%J-tZ+dt#@cG>^?&Ryt_q5U(C@A<#R@%@A0+;sOpkKfxLJS^c(y{81ZMzInrndxiYwuSyp&M2YSBJE(7EavJiRzvtt^ z=y3qCb8V1-v%YdY`%5gyRh;4&qho(0%r)vDm9ohFFduWlH*={!>ZJXi|Cb<9a_L>s zzaUXUhVBP!IegFmB}g>c3fT%@+f<<8%sdKea?>@{(1R~7aRUw%UWl)I;haPFWx%4w ztJ8BYBixiLT00>ss_ zupU;P5GSnR3TU3&0_FqR+{4v>lGkc;8LqA5OieB~K7Kvw?0s>8> z3T{wJ^=;fus)E|kth?z?aM7JYpBTwyIeu+Y_awJ}b2S!~5 zGT;k_u&}oXFmwsq zBL_G2)zfw2p;O~&)aixaZ|TS8G@(Gv!>?rV=TCUVQO+0Bs`{ZwQLj5$eeZk-x@r06 zIeik41AH5m7qnl34XuRuMMuqRv(Y8o!jD@Rf?{$xmmuOhR}6J{u2w`*a82I(rkGw} z+T0)}cg)}9dwh~l@#J{#i0Gn}ex7^XSK~5nn(%TJ)c_&8vgJzPJg8q55iehwO3^CYby_n~&J3D)fi-95vl_L& zDjS}5m*?t>zRH0c2T&CBFu7fjwmmk>it#2)D_wYmT(=_Q`M<<1wnu%ut_&^~E- zD39;(z=XN)Z8g&JrBgq+EwFlXe9I`^w2Y3-yVyB+_f4Ig2_jI^q3CalTXXe+u+LM~ zzd<)gGcDp4Q07qF+27Dg9)}`c*WWV3g=lcEA$WNcbB!jLPZU%EgA=Ut1P@514$g?cRY!m` z6Q+&FdWOtY@m(##_w4eW)Ei?G_Y&rD-&iW?dG<~ClS`_aNwUZEZGHM~6%t%rBUJrUZM)CW zW7dh|i0D6I;Vl|C@q4Xvb5Hn^NM{NEVtZ+iF}a!kFkpL1c?ooAcRFF+ae}#6wSHxi;d6XAe9WD6_{Ua%dzcx!#**aZI)~LmwW_aT*6R3 zs$4ja9+?aZacMK0vpta=s-#}{UvRm!L4Zn=;71&<+ zWsmy(K%RQ@Z*%HLX14-GKXdq$?s`h~R$hXKzZ~}zUp_~_ST1F7|E@fP!#h6f35kz${9^40v2FS`ZK)sL8I}A_`W7UA{p!_j4|8L;(;dKx_;jIp*bie7apYQM zzQi)_w^gpiyF2SUp^y2y7y|LEJq5?}h~TrIX^ttEc$G$dt-QMU%n%Lj)IJVW9WS%3 zfq>{tE>PimOq3<6096kGV>*|Ta-a{mcumdnY%^{;))ZSbC1U4zfFx$S!S@&k!N6~7 z?e!{N&04t0(u&D9QSJ21Xsjh5Tko#~<_ZU3$&>L5mX`(Mq>lvem+<-iCmfjOG~B#f zfckSCr6NvpLr)(0!_E=&O9^XGK_!gI%>X}<4z7*U(c2$v;S5A*qoN%w?3OvYFC;Fn=Meo`S@##@_GFz4 zDxtpz(4}#S<6x?=B`4nF7~abD_AhoO{tt%eO^+0|fDE3dre>m&bF)Svf#X3s@Pmia zn;6Y#fyb(qT>DBFaEfFXIhx&enhiOB=9pl{ zEi*icPc)!_dyA0l{pngO#HhaY9-ri~Q~-hjQ1*L_CXohzT&nGjl(Fr>TC$AA8##O7 z$Qr&wTIKE+CbZ>hHCA=37CIHgr~9?`~&ZPQVi53P^)L$ z`8;4P8dsAo%jwH&CD{ETQw<%h$vxj5MIJXU1+I`7!^aE1e5k^AEIEdyV{R!SufQW*KfQW#I(tC@7^b(4Iw4k6OqJSX1sYsEk^d3QwPNa82 z??rk|a`(Y^{xkF5HQ&r#-}=6L=g!2n6hm^7bI$L#%kw;Y@2zr=ff;wFUbt!MP|z-x zs&4HvY{%;CIfcz9Sr;@%JEy_her$Q#Rwcx&nue z=S0vN7XY3m8}%yEOh3>gQKC{MMo#vMa#tG%C-=Af0-pJ&R1o>;|1bm)`AYx46~P^m z#XL#4`zyn({q=u7xG~FoIn-+&cF8G=K4bOBtB@*>WA>0OvQi^}z$;zk_7C?oVYQbH z#R2F1>)g|I!_1s;Q7+`uckPyYZJ9~c72NcJy4Mr20# z=1rJXrE~y!16jpnVCy#JT(=YsAr=55&wM?;FtvN{p(6JmV|f0fV*>v3^fLhai9G(` zJjhRH{+DMW{O3E_&ozmSx`&FOn;F@tuav?aXWl5fban8*VeMvQvzQO+l`(3b+Ih{qKzHVZ}^MMRaJgL|L5qr5jaX9!|rL58+AlO zNycU-%#1b}$p(GWI@WQCxEY z`JCHlK>`a+skO2mbyqGVV){}^pBFq2IE62_@HPqyYfZd5v=@=t#~ljvaZ5 z8^BBz`amBgW~;g8>;;%-VS;%MG2y&=@%Uy;kE7eB?*n6ipqQKxA>9JJB->l#-F3PvBVC_Zm)wT*Ve~5_ zU0J`tohf1Mc_}WFrmZQ~&Ve!zFiaXkL)A}jC8cEh*KIrd#d@v^?>GZi1#8VSd~GCG zcpzkX9zNg*(slxH&zL50K{G|bLzZJyRaEFN?hq0>2Z{+9a|ur%W-ic_J8y}eRHw$tVd#BakW$ZV*_n>p+T(Y; zR?eC1Damr7EIvME4ZBBi^7%mT32E{@Q+r<{HfuXaH02fpNKBSb!YFhyuZ;fz`d7j z`_GP|sJ@y;*Cv@9s`A(e_rv0fD6x%-Wq#RxMeZ5*73(Xr=?uZ*HJ9iN+>P(Fgh>!~ zdN<@$;~jgK*Q_^A5ggnCW?Bo{dK_mK3MQHrG}pVnK2%+)c}Pm$>6pQ(f6=q6`Cevx zH|#YFljy@bU)~<-(@U7^an2hp4gnphx~UJ!_d3qBxi5D62yTPK<xO1wF zQJ5H!njqVM{VKX_F-3)Q-4XX(Q6f%o=!aquv-{vs8EmEc$pn*zEyZ}c-oq|#x4)8o z!}RwU`C#ewMYW1eR+SfMuFbNB#3#Xc3eR>o)bOheOeq*@=63PZ!a4WrTjTjJ zs9z-YsnVL*jDmf5ba2;d3PGs}ewlPPtnRn{_bPc$GyLMqb{NZ$Gcw=rR@85g$6wm~58vzpM?(Jo{9MHvaBV71cySm_1GxawXG-96U|}PI$l*kBVGTY=ic<-vP4>`Z0HKqdZ#G~}# zX6_H#)Q-)sJ-I0;+uAtgzEPgI1PL~nlS7~u#xHL+NYGX5R5KC!u%r{|0H2F*ge3Lm zU`;?Y1YfzfjNfx}wW8V$zZ!5p!G-X1~`oJuzM5}qSJ|NM(W3wo>*lEH4QJ)~e zpm=(#S0&M##~NQYlA!4m>)d=*m)I5Q%Lv;dP-NGbN}1wf#S|q-({zg1<4orGy!IjW z)X$_tarfd*v{k*Pmov>&Rk&WZ>3jdvYO^e}z*5YfkPGT}Iua#IdlqQtp!`1qM41^@ zQ%xT59NyziQTT}|hIq%=8!mhnz0+?sV`G=6CRrIg@^*YguzWFvgMPHtu(n7x z3-mX9ZObb-X~mcB$)J(Tkl4L@83ucbofpP=J$Kf&U*k-hm{-QXvW60vqR*=qwe{!s zhsXL^Z5quiU^AHnhvFG1OHMIaDP=lcuU1M{DhH+CPPuHHcD{{Noa{W`G1fSX>@7!2 z#nWP+x6?~m3X){of1H=SJYPCwv_9X@n9e%m(HRoc!z~uYtr%+$rD_*+i|pcEnfa~V zrn|$^6uY4JKMe80PYe|=k1jH6z^<0sohWSkRV}UK+S}~S5WsJ+CG~b%R(xPPLxy_#k*gZ4U5>Gt2>7S_gH=QeTzJo0tuhg1x1vH# zbIe_2IDV>qQ4vV4R*a04sSio*XxN^PGSlY}FN1c2wJ?vfwI9`p%JJCt-=r#=+rqig zG(CYOQ1NFw+!k-GG+CzjFs=r_x1Dh>nL@Va5M^V<5q}W ztIw+SViEGj;0zyMhF0@gA42@n!TXF()4%eZ8mHfdw|ymkTOV*~{oxTC zAntBAIw{94t9Z9qo=}v#P&^aI6M$Xmi+5gib)Rysw@{N<`bN2M!%T_-&=cleyQiVE zInrl^y|q>}_3}c1`1GrR0P*74BvgxyHmr=)%z};i-l7v1wb;hG;lkcySss^Ugdt%! zpCI`GS&iXDtmCwHQru2=1An6X(x%r7dCbmK=l!TWtKKp(Polf@@Cd+VS|gJdjZs%c zCel>zhMhNGgSXQBX_KYRj~=*@BqTv>8?TOniOWy5b{*m%x(`#onvb_HHHV8*!@Trp z9j+1bcq;Y3R6z^x_?s4N_b7kIvwkzwW46Y;?XT&F72-q}zkD2mSvx8eA7vN8<{u2F6O^cNVBpxK+UtP`UQi~3Gl z9gk{c)Hsx`)~qfW@18i#m!FNe?YZ?6=2y&=GS}W{lYBc?XFBRq$^?vm{~D6)FElE? zbGZJW-^q7HdU@73Q!s6n`7{jX%Zz?Vuo5x6>(Ctyp=Dw0F1dRq z3--vm>>Iz17l%%i6zI>)vMA4+Htm5MX@nf)h*ToxxVaDl_BN7vV zM-}SLpgOag;Z4XD0iW8;je0_?l5|_2zdz!Cs(rd5b=+h1eh!Q9@ao9vjz*<*FhF8! zk4TyZo^BIOF+8}R)eHuCwp)0GD&n}HV(g88)v}p7g*m~aN6M~G#u${w-4)V=t_Nkw z)~S`1m8nGo;$y+5YHgg2lh!;~h}cJzMz&37l2YyZdp^YCv1)n#FC(P6);CbuKsv!z>z8{^zi!*JcK?JG0_2z8$;@=0Z*zmi6=sB#Vyc zupRidv!1MM$Y;{%=WGmZ@o&R&10|j#X8tCMMEMOGI{($M4_! z@-;Km&N%!ydE@aDC1>Kyt~`?!hmc zRYjfWT-j^cTBkDHSmjqY{F#08NqBZCJaaDAAB|lP!?FlmgWX3)>CFpKxZx{anS)8% z4&%9{D_dqB5ZaWjwFJ8?&2ICJ{8pwb!uMRzK{;+p2S_}2PU%&H1{I_H#q!1i(wj$QSsg1)S*hiFme8zp;Z3Cit$1Mv^w((tZZ0k^nVE!T2_AzqvtRI9 zUBAj|*~@0I>{kOMoR>o-KDj-^h`AYlgUOS4LX@;T&Z3n^OJ6h1>>Vu2uBB*tSr$7j zh#fJT)>WecN!S~E#k-;3OF`2Ly2Ne&o>$sUk=-DvvN z2ko>*kx`mFP;S4H)Iekw-Ls`fN4&P0Vud-Vam3<*`8E?tF$aa|`p)Zm?!;2(0X2xV zj&Z)uNB3r#2Jn@Cf#Nt>`*FsLszr~KBsOXU<(wB9ZmYmhLzy?RC-)o8HAx7^%e5E( z__=@T0SwBLU?HtRWS_2DEaUDzw6nR)s-8X#H#d^ldC|$!YmoQM!;vr)Ka+@SOY%2X z3R6#lwaZJ2H4dEz?wjeI9+ zg>=1AF7tY=D8wdsbKuL1F2Q2mYKUDnR*D-~%DSS%hblYYKGKO=4l_t^vT5FKHjQ6p zrCd`hv2yq3j`{VZD_KHwgxbToZPG5dH{aSty4tC_BjsJ;!^0R$yh>pcbFXpEwy9v* zfoaNx;@s(nA*y*iIvn~uJ+p-{MF9`iq?u zwwC&`6^cn8lTDOIoc*<#IB55BO4zeJf0@CZF@2^pT|d(%{f)sxm!RBmUIj6MAZ=PP zVjnpJO4xqov)Og64>zB|eRu7t+xmqGZd?tE1 zV}s}uclmLy@Jkxn>86;=+3&3_gI;*lzI=~?39&2ShT<4y(-3@qt0W{e$|8s_%F1=cl8iW1kWN&yGYiTe!q1NBdo}S zYgn5TrROEiPfei2hT8JXQID$qE7e#nHtJ>;ZX4eGr*-=0cIZ1TZsJxL3tStEAm2;E z5Et8Uv;%Wc8?nB<6w>TE`<%y!`<`zHL?CW~TPE|=LgpBQYI%Mbq0nlA zDYSnP=ea4SgWvv6r?@_)&QbOorjIU{chRy7uyr5--XPm9+|iw8J9KN`mY9=Wk`1_t z>-+OX32k&fC1S%$YmI%3eFf&rFj8c5_yRi7HLrJdJFn~>NhR-sXl}qGjj|FKO6n&m z_qS73`}MBC2%grnPh=r{XrJ`-;|fSuHyX;9XYc0y>*KyvL0TV3P%!H;+vw#-yx3bI z&b!BPL2j!hn?U+0PvA)4ukPKP+Pu=Lwjh9k}-i5{7n1u ziiMJ?C-rN3U&ZZ1`H!*VHS8%|qFP{a!{R)z9Q%=F2SFei4aEh>6P||u%CRGKx5`kn zUVXUq9#>}Y8<5BX zP1ol)HY&_zowZwphkXG<@~3Zq~u$mX5HuNslCqQ>5?*NN%1m^8f!vJ#9$QJL$XsOFrGjti-mbb$$OOTO$`%WJZj=r!p zO=Q{Y@$U^T>I83OHL%@9(3U_^YK-M=B^2OHdH$Ri5!({TzDtPOe|-M@?e1cQnqITk zrImjK+tFuHP6%`MG))sS2vlgprEH&|-OS?AcB6vhdV707X^G!%@u3bUmIT|+L-wfDOzmwnWixF#kc z`<>`QRHi|;5Ng03hNf6{g#lI4 zhC^qDE{q9Yny6o2jrL8D4@uKXxBK;AEWjbyvAfV=;+M0;NztK^DtSy-fw@EX<%CFK z%Ra)(3zi+%roUG+-4S`o(`r)kdui|mp07WmAQhQUdOc_Ev3YMnL4g`N2h5Z6%eN5% zGZJ{x@7As7)BqEzpI5)O`8iQo&v_HMovrb8fwVs{AUPg4^N@_nmOsu>yda2cPILsO|QRxw-`VXM72!aTbCH*QM{H0Z1KmA2@Q0O3@9ez z?ykruV|H1NcjXTTuf12gum z{g8)7TT}y)RE!pfJ_Q9Aj>uAUJZAZq;Gqf5K)!lwfP>*Z_2@~&DQ#sDTUo@7xycY~gM zm^qDaD&8o96z8$I&bqEEXmAPNtD{@m6ipNFQN}B7fC}88h27WJH%xCJo%FQ)OCscj zk6^=TUrou`O|NJ=Aia{BdT<)ri*`EnIt`$ZCdgo89UuB+l&9~LxVXJpAz%FY9yFt@ zfh8=_#~lK53dm}vkj-|JuesDT(^!IVEL}Ic#cK9-YZ`L*?nPfRx5(i`W!&>qRlK*|(Qi|T2Ks7SwAjX@ z0$e(cdjroZl6={0LGl$`Rstziu=GpwYu}XLxu=urW*Q^Cd#L5${7yph5b45Heac&phMCum-)scJB} zt<-$hQzrJ^9geBMGVPp|{)a|hVE`8+*gWf7H_PsdDL{HRH{Ty66|Hvw2x{7%+=6s0 z7>eh*Jp=AfuG5a?l^tD@d$yVR?<|0qWy%B}z`NwjVy|OHKfsx>L~j8RvM%$6%0Pke zc)XK}o}7QCEkj_VJt@pxY}MyQoWjXf82~_M`-_F;p&*9ri0bZbwF$hkT9`dS?Xt8p z78XOFBt$hG;Xu^8(@CuOT>J)8fG0@vTLiDA2hS_%0AwTZ!$5RqB^a>^tf&H;m`L0W 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

aW&us3g)cz6`68|? zoN;O5B!aR;mMh<#=CX6g@Ww(QN!J{#KsP4r-rF&K>f2TuW&Qy3nOUNd%`WKW!%P-00k-J*MXxIh6q$Y4#6im6*b~rv^#Gr2#FJo1S+2UZp-ATDf-pEE$DPGV%8EanWgzB~1c7TZV3_fZ9Vs}016tBYQND#Cu)(c0$UWMcJ zVFVp65R0$l%1J~PLHI2?F72(RD{Hi3vWDFBT$3MhpQ?mzkZUATLe5%-T;saKg0~CE zkCe+zy4wbUG#~=m?gj9h$uIG4y+8eWyJKE?e`lZMsDOjT)49FU=Dh=vgBbqp%G#s?gsmkV2AQQ z4D)m~BpGWB*L_{HZd$RIo6mOlcRM(4IGM$s4V#j}@;77cq$c(^desvSN#^egu;H85 zt>NGq=k!skT423joAGLmlg__fv$h1BPXk`sch|D6;EvqHdFvLP6uG?j0oS%0EY}L3 zHcq{qpCAKQPKM zb4rQ5Wz`{|j0P~b$N_T-;+UlPqSTyX#9>K#Ans_sf#jQ>^BcPk8}P6_`1|1A!HoPl zcLIQ`OuaQrtiAYlNx6IaB%hAR%Dlht*)r{t7aE=ae+TZ~+v*x?2t2@l!OE-v30Yn{ zKeoExf3ujojvhOxCvx$CtmL-4&)ut!9QES-_(pj3A{R4*?j`waZ=RLV37=vx?X-tw zgl6)*l1=Y&)UU*s?!ESNKjYoWEBTrmYb2xs{@OmYHtStnzC*d3Q{t&>Yniwh*YXX2 zQnY$kZLf4Pe8776{;HK-oV&8WUar3jtm`4EfRRZT*tvn7T&sVZL3If*4LoKC9hZd; zqMdjti)Z$oB5gOo)YJl8CsqOE9`uu?Hci@3sNC0FdBr$>05W2?ZKg%>^ zfwxpWUko{(5TWxg@FZREu_M5SNog+7dTjQ_tcyu{QQ!<{1V6!DCizpp_1SX(jNfS4?1TN0iFVHHUN7h zH7^CHcI!@4dtqQuEe3`j@U~JU@JV8V8S8@d6gC!Qf2;I|Ro0L1xc=%%0_{Dm;5cN5eXD93=I>qkF2 z2cf@vJ1i972kD?|Mjv}XXl{Q8)r>Y0fo=kNUm0P7my{{ML&^a5L@jO;LQpw1VH7NFvAsK%dg@$FgG#) E0FOAav;Y7A literal 0 HcmV?d00001 diff --git a/ontology_platform/docs/phases/PHASE_INDEX.md b/ontology_platform/docs/phases/PHASE_INDEX.md index c5ba6f5..8ef51a2 100644 --- a/ontology_platform/docs/phases/PHASE_INDEX.md +++ b/ontology_platform/docs/phases/PHASE_INDEX.md @@ -63,39 +63,39 @@ FILE: ./26_05_22_semantic_page_classification/phase_04_001_evidence_scoring_clas PHASE 5. Analyze Strategy 및 LLM Policy 분리 FILE: ./26_05_22_semantic_page_classification/phase_05_001_analysis_llm_policy.md -1) PageClassificationResult 기반 `decide_analyze_strategy()` 추가 [TODO] -2) PageClassificationResult 기반 `decide_llm_policy()` 추가 [TODO] -3) `should_analyze_page(result_or_page_type, analyze_page_types=None)` compatibility 구현 [TODO] -4) Category/Search/Board 계열을 무조건 skip하지 않고 strategy 기반으로 처리 [TODO] -5) Login/Checkout/Payment/Captcha/AccessDenied 계열은 SkipProtected/Skip 정책으로 처리 [TODO] +1) PageClassificationResult 기반 `decide_analyze_strategy()` 추가 [완료] +2) PageClassificationResult 기반 `decide_llm_policy()` 추가 [완료] +3) `should_analyze_page(result_or_page_type, analyze_page_types=None)` compatibility 구현 [완료] +4) Category/Search/Board 계열을 무조건 skip하지 않고 strategy 기반으로 처리 [완료] +5) Login/Checkout/Payment/Captcha/AccessDenied 계열은 SkipProtected/Skip 정책으로 처리 [완료] --- PHASE 6. Crawler, Cleaner, Extractor, Discovery/Relevance 통합 FILE: ./26_05_22_semantic_page_classification/phase_06_001_pipeline_integration.md -1) `site_crawler.py`와 `pipeline.py` metadata에 semantic classification payload 저장 [TODO] -2) `ExtractionPageContext` 또는 metadata를 통해 analyze_strategy/llm_policy 전달 [TODO] -3) `HybridExtractor`가 LLMPolicy를 우선 사용하고 legacy page_type fallback을 유지하도록 수정 [TODO] -4) `page_cleaner.py`, `domain_discovery.py`, `relevance_engine.py`의 legacy page_type 기대 경로와 신규 semantic type을 호환 [TODO] +1) `site_crawler.py`와 `pipeline.py` metadata에 semantic classification payload 저장 [완료] +2) `ExtractionPageContext` 또는 metadata를 통해 analyze_strategy/llm_policy 전달 [완료] +3) `HybridExtractor`가 LLMPolicy를 우선 사용하고 legacy page_type fallback을 유지하도록 수정 [완료] +4) `page_cleaner.py`, `domain_discovery.py`, `relevance_engine.py`의 legacy page_type 기대 경로와 신규 semantic type을 호환 [완료] --- PHASE 7. Unknown Pattern 저장 기반 추가 FILE: ./26_05_22_semantic_page_classification/phase_07_001_unknown_pattern_storage.md -1) UnknownPage 또는 low confidence 페이지의 evidence payload 정의 [TODO] -2) text/html/link/schema/button/form summary와 fingerprint hook 추가 [TODO] -3) DB schema 변경 없이 metadata_json에 저장 가능한 초기 구조 구현 [TODO] -4) 향후 clustering/embedding 확장을 위한 hook만 추가하고 실제 clustering은 이번 범위에서 제외 [TODO] +1) UnknownPage 또는 low confidence 페이지의 evidence payload 정의 [완료] +2) text/html/link/schema/button/form summary와 fingerprint hook 추가 [완료] +3) DB schema 변경 없이 metadata_json에 저장 가능한 초기 구조 구현 [완료] +4) 향후 clustering/embedding 확장을 위한 hook만 추가하고 실제 clustering은 이번 범위에서 제외 [완료] --- PHASE 8. 테스트 Fixture 및 회귀 검증 FILE: ./26_05_22_semantic_page_classification/phase_08_001_tests_regression.md -1) 최소 10개 이상의 HTML fixture 추가 [TODO] -2) ProductDetailPage, CategoryListingPage, SearchResultsPage, ArticlePage, QAPage, FAQPage, ForumThreadPage, DocumentationPage, JobPostingPage, LoginPage, CheckoutPage, TermsPage, SitemapPage, UnknownPage 단위 테스트 추가 [TODO] -3) legacy `classify_page()`와 `should_analyze_page()` 호환성 테스트 추가 [TODO] -4) HybridExtractor LLMPolicy 회귀 테스트 추가 [TODO] -5) pytest 또는 현재 프로젝트 테스트 명령 실행 및 결과 기록 [TODO] +1) 최소 10개 이상의 HTML fixture 추가 [완료] +2) ProductDetailPage, CategoryListingPage, SearchResultsPage, ArticlePage, QAPage, FAQPage, ForumThreadPage, DocumentationPage, JobPostingPage, LoginPage, CheckoutPage, TermsPage, SitemapPage, UnknownPage 단위 테스트 추가 [완료] +3) legacy `classify_page()`와 `should_analyze_page()` 호환성 테스트 추가 [완료] +4) HybridExtractor LLMPolicy 회귀 테스트 추가 [완료] +5) pytest 또는 현재 프로젝트 테스트 명령 실행 및 결과 기록 [완료] diff --git a/ontology_platform/docs/semantic_page_classification_codex_spec.md b/ontology_platform/docs/semantic_page_classification_codex_spec.md new file mode 100644 index 0000000..124c388 --- /dev/null +++ b/ontology_platform/docs/semantic_page_classification_codex_spec.md @@ -0,0 +1,2265 @@ +# Semantic Page Classification Layer 설계 및 구현 지시서 + +## 0. 문서 목적 + +본 문서는 온톨로지 플랫폼의 `page_classifier.py`를 단순 URL/텍스트 기반 페이지 분류기에서 **범용 Semantic Page Understanding Layer**로 확장하기 위한 작업 지시서이다. + +현재 시스템은 다음과 같은 제한적인 page type만 다룬다. + +```txt +ProductPage +CategoryPage +SearchPage +BoardPage +NoticePage +BrandStoryPage +PromotionPage +UnknownPage +``` + +이 구조는 쇼핑몰 일부 페이지를 분류하는 데는 사용할 수 있으나, 범용 온톨로지 구축 플랫폼에는 부족하다. + +범용 플랫폼은 인터넷에 존재하는 다양한 페이지를 다음 관점으로 분류할 수 있어야 한다. + +```txt +Page Domain +Page Archetype +Semantic Page Type +Main Entity Type +Action Intent +Graph Role +Analyze Strategy +LLM Policy +Confidence +Evidence +``` + +즉, 목표는 단순히 `ProductPage` 같은 enum 하나를 맞히는 것이 아니라, 페이지의 의미적 역할을 여러 축으로 해석하고, 온톨로지 그래프 구축에 필요한 분석 전략까지 결정하는 것이다. + +--- + +## 1. 현재 구조의 문제점 + +### 1.1 Page Type이 너무 적다 + +현재 분류 항목은 대부분 commerce 또는 게시판 중심이다. + +```txt +ProductPage +CategoryPage +SearchPage +BoardPage +BrandStoryPage +``` + +하지만 인터넷에는 다음과 같은 페이지가 존재한다. + +```txt +ArticlePage +NewsPage +BlogPostPage +FAQPage +QAPage +WikiPage +DocumentationPage +JobPostingPage +CoursePage +VideoPage +ProfilePage +LocalBusinessPage +RealEstateListingPage +PricingPage +CheckoutPage +LoginPage +TermsPage +PrivacyPolicyPage +APIReferencePage +DatasetPage +ResearchPaperPage +``` + +현 구조에서는 이들을 대부분 `UnknownPage` 또는 부정확한 기존 타입으로 분류하게 된다. + +--- + +### 1.2 URL 휴리스틱 의존도가 높다 + +현재 방식은 대체로 다음과 같은 구조다. + +```python +if "/product/" in url: + return "ProductPage" + +if "/board/" in url: + return "BoardPage" +``` + +이 방식은 다음 환경에서 쉽게 깨진다. + +```txt +SPA +Headless Commerce +Dynamic Route +Query 기반 페이지 +다국어 URL +짧은 URL +해시 라우팅 +CMS 기반 자동 생성 페이지 +AI 생성 페이지 +``` + +예: + +```txt +/p/12345 +/x/abc +/node/987 +/view?id=123 +/ko/contents/123 +``` + +이 URL만 보고는 페이지 의미를 알 수 없다. + +--- + +### 1.3 CategoryPage, SearchPage, BoardPage를 너무 쉽게 skip한다 + +현재 구조는 보통 다음 흐름이다. + +```txt +classify_page() + -> should_analyze_page() + -> analyze_page_types에 없으면 Extractor 실행 안 함 +``` + +이 때문에 `CategoryPage`, `SearchPage`, `BoardPage`는 기본적으로 분석 대상에서 빠질 가능성이 높다. + +그러나 범용 온톨로지 플랫폼에서는 이 페이지들이 중요하다. + +```txt +CategoryPage -> 카테고리 계층, 상품 목록, taxonomy 관계 +SearchPage -> 검색 의도, 결과 후보, query-result 관계 +BoardPage -> 게시글 목록, 질문/답변/토론 구조 +ListingPage -> entity collection, relation hub +ArchivePage -> 시간 축 기반 콘텐츠 구조 +TagPage -> topic-entity 관계 +``` + +따라서 “분석 여부”는 단순 boolean이 아니라, 페이지 타입별 분석 전략으로 분리해야 한다. + +--- + +### 1.4 UnknownPage를 버리면 안 된다 + +현재는 분류 실패 시 `UnknownPage`로 두고 사실상 분석에서 제외될 가능성이 크다. + +하지만 범용 플랫폼에서 `UnknownPage`는 새로운 페이지 패턴을 발견하는 출발점이다. + +예: + +```txt +UnknownPage Cluster A: +- 향수 노트 비교표가 있음 +- 여러 상품을 향 계열별로 비교 +- 일반 ProductPage도 CategoryPage도 아님 + +새 후보: +PerfumeNoteComparisonPage +``` + +따라서 Unknown은 폐기 대상이 아니라, clustering 및 taxonomy 확장 후보로 저장해야 한다. + +--- + +## 2. 목표 아키텍처 + +기존 구조: + +```txt +URL / title / text / html + -> page_classifier.py + -> page_type + -> should_analyze_page() +``` + +개선 구조: + +```txt +Raw Page Snapshot + -> Signal Extraction + -> Evidence Scoring + -> Domain Classification + -> Archetype Classification + -> Entity Type Classification + -> Action Intent Classification + -> Graph Role Assignment + -> Semantic Page Type Decision + -> Analyze Strategy Decision + -> LLM Policy Decision + -> Unknown Pattern Storage / Clustering +``` + +--- + +## 3. 핵심 개념 + +### 3.1 Page Domain + +페이지가 속한 큰 의미 영역이다. + +```txt +Commerce +Editorial +Community +Knowledge +Corporate +Local +Education +Jobs +Media +Software +Finance +Government +Healthcare +Transaction +System +Unknown +``` + +--- + +### 3.2 Page Archetype + +페이지의 구조적 역할이다. + +```txt +Home +Landing +Detail +Listing +Collection +SearchResult +Profile +Article +Thread +Form +Transaction +Dashboard +Document +Media +Error +SystemResource +Unknown +``` + +--- + +### 3.3 Semantic Page Type + +구체적인 페이지 타입이다. + +예: + +```txt +ProductDetailPage +CategoryListingPage +ArticlePage +ForumThreadPage +FAQPage +JobPostingPage +LocalBusinessPage +CheckoutPage +LoginPage +DocumentationPage +``` + +--- + +### 3.4 Main Entity Type + +페이지가 중심으로 삼는 엔티티이다. + +```txt +Product +Service +Article +NewsArticle +Person +Organization +Place +Event +JobPosting +Course +Question +Answer +Review +Dataset +SoftwareApplication +MediaObject +Recipe +RealEstateProperty +MedicalCondition +LegalDocument +FinancialProduct +UnknownEntity +``` + +--- + +### 3.5 Action Intent + +페이지가 사용자를 유도하는 행동이다. + +```txt +Read +Buy +Subscribe +Reserve +Book +Apply +Download +Watch +Listen +Search +Compare +Filter +Ask +Answer +Comment +Review +Login +Register +Pay +Contact +Navigate +Learn +Verify +Configure +Manage +``` + +--- + +### 3.6 Graph Role + +온톨로지 그래프 안에서 이 페이지가 수행하는 역할이다. + +```txt +EntityAnchor +RelationHub +NavigationHub +CollectionHub +SearchHub +TransactionOnly +PolicySource +ClaimSource +ProfileAnchor +MediaAnchor +ReferenceSource +SystemResource +NoisePage +UnknownPattern +``` + +--- + +### 3.7 Analyze Strategy + +페이지를 어떻게 분석할지 결정하는 전략이다. + +```txt +AnalyzeFull +AnalyzeStructureOnly +AnalyzeEntityOnly +AnalyzeRelationsOnly +AnalyzeMetadataOnly +AnalyzeDocumentOnly +AnalyzeDiscoveryOnly +SkipProtected +SkipNoise +``` + +--- + +### 3.8 LLM Policy + +LLM 사용 여부 및 사용 범위다. + +```txt +LLMFull +LLMLight +LLMForAmbiguityOnly +RuleOnly +NoLLM +Skip +``` + +--- + +## 4. Page Taxonomy v1 + +아래 taxonomy는 초기 버전이다. 구현 시 enum 또는 문자열 상수로 관리한다. + +--- + +## 4.1 Site / Navigation 계열 + +```txt +HomePage +LandingPage +PortalPage +SectionHomePage +CategoryPage +SubcategoryPage +TagPage +TopicPage +CollectionPage +ArchivePage +SitemapPage +DirectoryPage +IndexPage +SearchPage +SearchResultsPage +FilteredResultsPage +PaginationPage +LocaleSelectorPage +LanguageRedirectPage +RedirectPage +NotFoundPage +ErrorPage +MaintenancePage +ComingSoonPage +RobotsBlockedPage +``` + +### 주요 신호 + +```txt +many internal links +breadcrumb +category tree +pagination +tag links +archive dates +search form +sitemap XML or sitemap-like links +locale links +error status text +``` + +### 온톨로지 역할 + +```txt +사이트 구조 파악 +카테고리 계층 파악 +내부 링크 그래프 구축 +탐색 우선순위 결정 +``` + +--- + +## 4.2 Commerce / Marketplace 계열 + +```txt +ProductDetailPage +ProductVariantPage +ProductBundlePage +ProductComparisonPage +ProductReviewPage +ProductQnAPage +ProductManualPage +ProductSpecPage +CategoryListingPage +ProductListingPage +BrandCatalogPage +SellerStorePage +MarketplaceListingPage +SearchProductResultsPage +DealPage +SalePage +CouponPage +PromotionPage +CampaignLandingPage +SubscriptionPlanPage +PricingPage +CartPage +CheckoutPage +PaymentPage +OrderPage +OrderConfirmationPage +OrderTrackingPage +WishlistPage +GiftCardPage +StoreLocatorPage +InventoryAvailabilityPage +AuctionPage +RentalProductPage +BookingProductPage +ServiceProductPage +``` + +### 주요 신호 + +```txt +schema.org Product +schema.org Offer +schema.org AggregateRating +price +currency +availability +add to cart +buy now +variant selector +quantity selector +SKU +brand +product image gallery +reviews +rating +shipping +return policy +repeated product cards +filters +sort control +pagination +``` + +### 온톨로지 역할 + +```txt +Product 엔티티 생성 +Brand 관계 생성 +Category 관계 생성 +Offer / Price / Availability 추출 +Review / Rating 관계 추출 +RelatedProduct 관계 추출 +``` + +--- + +## 4.3 Editorial / Article / Publishing 계열 + +```txt +ArticlePage +NewsArticlePage +BlogPostPage +OpinionPage +EditorialPage +InterviewPage +ReportPage +ColumnPage +PressArticlePage +MagazinePage +GuidePage +TutorialPage +HowToPage +RecipePage +CaseStudyPage +WhitePaperPage +ResearchSummaryPage +StoryPage +ChapterPage +SeriesPage +AuthorArticleListPage +PaywalledArticlePage +SponsoredContentPage +``` + +### 주요 신호 + +```txt +schema.org Article +schema.org NewsArticle +schema.org BlogPosting +headline +author +publisher +datePublished +dateModified +articleBody +byline +section +tags +hero image +related articles +paywall marker +``` + +### 온톨로지 역할 + +```txt +Article / Topic / Author / Publisher 엔티티 생성 +about 관계 생성 +citation / source 관계 생성 +temporal coverage 추출 +claim 후보 추출 +``` + +--- + +## 4.4 Community / UGC 계열 + +```txt +ForumHomePage +ForumBoardPage +ForumThreadPage +DiscussionPage +CommentThreadPage +QAPage +FAQPage +ReviewPage +UserReviewPage +CommunityPostPage +SocialPostPage +TimelinePage +FeedPage +UserProfilePage +CreatorProfilePage +GroupPage +CommunityPage +PollPage +PetitionPage +RankingPage +LeaderboardPage +ReputationPage +BadgePage +``` + +### 주요 신호 + +```txt +question +answer +accepted answer +comments +reply +thread +votes +likes +author profile +user avatar +posted date +edited date +review rating +FAQ accordion +Q&A structured data +``` + +### 온톨로지 역할 + +```txt +Question / Answer 엔티티 생성 +User / Author 관계 생성 +Thread 관계 생성 +Claim / Opinion 분리 +Reputation / Vote / AcceptedAnswer 추출 +``` + +--- + +## 4.5 Knowledge / Reference / Documentation 계열 + +```txt +WikiPage +EncyclopediaPage +GlossaryPage +DefinitionPage +ReferencePage +DocumentationPage +DeveloperDocsPage +APIDocumentationPage +APIReferencePage +SDKDocumentationPage +ManualPage +SpecificationPage +StandardPage +ProtocolPage +ChangelogPage +ReleaseNotesPage +ErrorCodePage +TroubleshootingPage +KnowledgeBaseArticlePage +DatasetPage +DataCatalogPage +ResearchPaperPage +PatentPage +CitationPage +BibliographyPage +``` + +### 주요 신호 + +```txt +definition +table of contents +code block +API method +parameter table +version +endpoint +changelog +release notes +specification +standard +citation +references +dataset metadata +``` + +### 온톨로지 역할 + +```txt +Concept / Term / Definition 추출 +API / Method / Parameter 관계 추출 +Version 관계 추출 +Dataset metadata 추출 +Reference graph 생성 +``` + +--- + +## 4.6 Corporate / Organization 계열 + +```txt +AboutPage +CompanyPage +BrandStoryPage +MissionPage +VisionPage +HistoryPage +TeamPage +FounderPage +LeadershipPage +ContactPage +LocationPage +BranchPage +InvestorRelationsPage +IRPage +FinancialReportPage +PressReleasePage +MediaKitPage +PartnershipPage +FranchisePage +CareersHomePage +JobPostingPage +RecruitPage +CulturePage +LegalPage +TermsPage +PrivacyPolicyPage +CookiePolicyPage +AccessibilityPage +CompliancePage +SecurityPage +TrustCenterPage +``` + +### 주요 신호 + +```txt +about us +company +mission +vision +history +team +founder +leadership +contact +address +investor relations +press release +careers +privacy policy +terms of service +cookie policy +security +compliance +``` + +### 온톨로지 역할 + +```txt +Organization 엔티티 생성 +Founder / Location / Contact 관계 생성 +Policy 문서 분류 +법적/계약적 문장 추출 +채용 정보 추출 +``` + +--- + +## 4.7 Local / Place / Travel / Real Estate 계열 + +```txt +PlaceDetailPage +LocalBusinessPage +RestaurantPage +MenuPage +HotelPage +RoomPage +VacationRentalPage +TravelDestinationPage +AttractionPage +ItineraryPage +MapPage +MapSearchResultsPage +RealEstateListingPage +PropertyDetailPage +PropertySearchResultsPage +AgentProfilePage +OpenHousePage +ReservationPage +BookingPage +AvailabilityCalendarPage +TransportRoutePage +FlightPage +TrainPage +BusRoutePage +``` + +### 주요 신호 + +```txt +address +geo coordinates +map +opening hours +menu +reservation +booking +room availability +travel dates +property price +bedrooms +bathrooms +area +agent +route +schedule +``` + +### 온톨로지 역할 + +```txt +Place 엔티티 생성 +Address / Geo / OpeningHours 추출 +Reservation 가능성 판단 +Nearby 관계 생성 +Availability 추출 +``` + +--- + +## 4.8 Education / Learning 계열 + +```txt +CourseDetailPage +CourseListPage +CurriculumPage +LessonPage +LecturePage +TutorialPage +AssignmentPage +QuizPage +ExamPage +FlashcardPage +EducationQAPage +MathSolverPage +SchoolPage +UniversityPage +ProgramPage +DegreePage +CertificationPage +InstructorProfilePage +LearningPathPage +``` + +### 주요 신호 + +```txt +course +lesson +curriculum +instructor +learning objective +assignment +quiz +exam +certificate +degree +program +tuition +syllabus +``` + +### 온톨로지 역할 + +```txt +Course / Lesson / Instructor 엔티티 생성 +Prerequisite 관계 생성 +LearningObjective 추출 +Question / Answer / Solution 구조화 +``` + +--- + +## 4.9 Jobs / Career 계열 + +```txt +JobPostingPage +JobSearchResultsPage +CompanyJobsPage +CareerCategoryPage +ApplicationFormPage +RecruitmentLandingPage +EmployerProfilePage +EmployerReviewPage +SalaryPage +InterviewReviewPage +BenefitsPage +InternshipPage +FreelanceGigPage +``` + +### 주요 신호 + +```txt +job title +employment type +salary +location +remote +apply +requirements +responsibilities +benefits +company +recruiter +deadline +``` + +### 온톨로지 역할 + +```txt +Job 엔티티 생성 +Employer 관계 생성 +Location / Salary / EmploymentType 추출 +Skill requirement 추출 +``` + +--- + +## 4.10 Media / Entertainment 계열 + +```txt +VideoPage +VideoWatchPage +LiveStreamPage +PodcastPage +EpisodePage +MusicTrackPage +AlbumPage +ArtistPage +MoviePage +TVSeriesPage +TVEpisodePage +GameDetailPage +GameGuidePage +ImagePage +ImageGalleryPage +PhotoStoryPage +MediaGalleryPage +DownloadMediaPage +StreamingChannelPage +``` + +### 주요 신호 + +```txt +video player +audio player +duration +episode +season +album +artist +track +movie +trailer +live +stream +gallery +image grid +download +``` + +### 온톨로지 역할 + +```txt +MediaObject 엔티티 생성 +Creator / Performer / Publisher 관계 생성 +Duration / Episode / Series 관계 추출 +License / UsageInfo 추출 +``` + +--- + +## 4.11 Software / SaaS / App 계열 + +```txt +SoftwareProductPage +SaaSProductPage +FeaturePage +PricingPage +IntegrationPage +PluginPage +ExtensionPage +AppStoreListingPage +PackagePage +RepositoryPage +ReleasePage +ChangelogPage +IssuePage +PullRequestPage +DocumentationPage +APIReferencePage +StatusPage +DashboardPage +SettingsPage +AdminPage +LoginPage +SignupPage +OnboardingPage +BillingPage +UsageReportPage +``` + +### 주요 신호 + +```txt +software +app +SaaS +feature +pricing +integration +plugin +extension +repository +release +changelog +issue +pull request +status +dashboard +settings +billing +API +SDK +``` + +### 온톨로지 역할 + +```txt +Software / Version / Feature 엔티티 생성 +Dependency 관계 생성 +Release 관계 생성 +Issue / PR / Commit 관계 추출 +``` + +--- + +## 4.12 Finance / Legal / Government 계열 + +```txt +BankProductPage +LoanPage +CreditCardPage +InsuranceProductPage +InvestmentProductPage +StockQuotePage +CryptoAssetPage +FinancialReportPage +TaxInfoPage +GovernmentServicePage +PublicNoticePage +RegulationPage +LawPage +CourtCasePage +LegalArticlePage +PolicyPage +FormPage +ApplicationPage +PermitPage +LicensePage +PublicDataPage +ProcurementPage +TenderPage +``` + +### 주요 신호 + +```txt +interest rate +APR +loan +credit card +insurance +investment +stock quote +financial statement +tax +government +regulation +law +court +policy +permit +license +tender +procurement +``` + +### 온톨로지 역할 + +```txt +Regulation / Policy / Law 엔티티 생성 +Obligation / Prohibition / Permission 추출 +Institution 관계 생성 +Form requirement 추출 +``` + +--- + +## 4.13 Healthcare / Medical 계열 + +```txt +MedicalArticlePage +ConditionPage +SymptomPage +TreatmentPage +DrugPage +SupplementPage +DoctorProfilePage +HospitalPage +ClinicPage +AppointmentPage +InsuranceCoveragePage +ClinicalTrialPage +MedicalFAQPage +HealthCalculatorPage +EmergencyInfoPage +``` + +### 주요 신호 + +```txt +condition +symptom +treatment +drug +dosage +side effect +doctor +hospital +clinic +appointment +clinical trial +insurance coverage +emergency +``` + +### 온톨로지 역할 + +```txt +Condition / Treatment / Drug 엔티티 생성 +Symptom 관계 생성 +Medical claim 추출 +Source reliability 분리 +``` + +--- + +## 4.14 Transaction / Account / Protected 계열 + +```txt +LoginPage +SignupPage +PasswordResetPage +AccountPage +ProfileSettingsPage +NotificationPage +MessageInboxPage +CartPage +CheckoutPage +PaymentPage +SubscriptionManagementPage +BillingPage +InvoicePage +OrderHistoryPage +UploadPage +DownloadPage +FormPage +SurveyPage +ConsentPage +AgeGatePage +CaptchaPage +PaywallPage +AccessDeniedPage +SessionExpiredPage +``` + +### 주요 신호 + +```txt +login form +password field +signup +reset password +account settings +payment fields +checkout +billing +invoice +consent +captcha +age gate +access denied +session expired +``` + +### 온톨로지 역할 + +```txt +대부분 분석 제외 +개인정보 보호 +크롤링 중단 또는 제한 +거래 흐름만 메타 수준으로 기록 +``` + +--- + +## 4.15 System / Technical / Machine-readable 계열 + +```txt +RSSFeedPage +AtomFeedPage +XMLSitemapPage +RobotsTxtPage +ManifestPage +OpenSearchDescriptionPage +JSONEndpointPage +APIEndpointPage +GraphQLEndpointPage +WebhookEndpointPage +FileDownloadPage +PDFDocumentPage +CSVDocumentPage +XMLDocumentPage +ImageAssetPage +VideoAssetPage +FontAssetPage +ScriptAssetPage +StylesheetAssetPage +``` + +### 주요 신호 + +```txt +content-type +xml +json +rss +atom +sitemap +robots.txt +manifest +API response +file extension +download headers +``` + +### 온톨로지 역할 + +```txt +크롤링 정책 파악 +사이트 구조 파악 +데이터 소스 발견 +문서형 리소스 별도 파서로 전달 +``` + +--- + +## 5. Signal Extraction 설계 + +`page_classifier.py`가 직접 모든 것을 처리하지 말고, signal extractor를 분리한다. + +권장 파일 구조: + +```txt +ontology_platform/ + classifier/ + page_classifier.py + page_type_taxonomy.py + page_signals.py + page_signal_extractor.py + page_type_scorer.py + page_analysis_policy.py + adaptive_page_classifier.py +``` + +기존 프로젝트 구조에 맞춰 경로는 조정해도 된다. + +--- + +## 5.1 Raw Page Snapshot + +분류 함수 입력은 다음 정보를 받을 수 있어야 한다. + +```python +@dataclass +class RawPageSnapshot: + url: str + final_url: str | None + status_code: int | None + content_type: str | None + + title: str | None + text: str | None + html: str | None + rendered_html: str | None + + metadata: dict + open_graph: dict + twitter_card: dict + json_ld: list[dict] + microdata: list[dict] + rdfa: list[dict] + + headings: list[str] + links: list[dict] + images: list[dict] + forms: list[dict] + buttons: list[str] + inputs: list[dict] + tables: list[dict] + + breadcrumbs: list[str] + source_zones: list[str] + screenshot_path: str | None +``` + +초기 구현에서는 모든 필드가 없어도 된다. +없는 값은 `None` 또는 빈 리스트로 처리한다. + +--- + +## 5.2 Page Signals + +추출 결과는 다음 형태로 관리한다. + +```python +@dataclass +class PageSignals: + # structured data + schema_types: set[str] + og_type: str | None + twitter_card_type: str | None + + # commerce + has_price: bool + has_currency: bool + has_cart_button: bool + has_buy_button: bool + has_variant_selector: bool + has_sku: bool + has_rating: bool + has_review_section: bool + has_product_gallery: bool + + # listing + has_repeated_cards: bool + repeated_card_count: int + has_filter_panel: bool + has_sort_control: bool + has_pagination: bool + + # editorial + has_author: bool + has_published_date: bool + has_modified_date: bool + has_article_body: bool + has_tags: bool + + # community + has_question: bool + has_answer: bool + has_comments: bool + has_votes: bool + has_thread_structure: bool + has_faq_structure: bool + + # knowledge/docs + has_code_blocks: bool + has_toc: bool + has_api_endpoint: bool + has_parameter_table: bool + has_version_info: bool + + # corporate/legal + has_contact_info: bool + has_address: bool + has_policy_terms: bool + has_privacy_terms: bool + has_career_terms: bool + + # transaction/protected + has_login_form: bool + has_password_field: bool + has_payment_fields: bool + has_captcha: bool + has_access_denied: bool + + # graph + internal_link_count: int + external_link_count: int + product_link_count: int + category_link_count: int + profile_link_count: int + article_link_count: int + + # text/layout + dominant_language: str | None + keyword_hits: dict[str, int] +``` + +--- + +## 6. Scoring 방식 + +단일 if-else가 아니라 evidence scoring으로 분류한다. + +예: + +```python +scores = { + "ProductDetailPage": 0.0, + "CategoryListingPage": 0.0, + "ArticlePage": 0.0, + "QAPage": 0.0, + "LoginPage": 0.0, +} +``` + +--- + +### 6.1 ProductDetailPage scoring 예시 + +```txt +schema.org Product +0.40 +schema.org Offer +0.15 +price detected +0.15 +cart button +0.20 +variant selector +0.15 +SKU +0.10 +product image gallery +0.10 +review section +0.05 +URL product hint +0.05 +``` + +--- + +### 6.2 CategoryListingPage scoring 예시 + +```txt +repeated product cards +0.35 +filter panel +0.20 +sort control +0.15 +pagination +0.10 +many product links +0.20 +breadcrumb category +0.10 +URL category/list hint +0.05 +``` + +--- + +### 6.3 ArticlePage scoring 예시 + +```txt +schema.org Article +0.35 +schema.org NewsArticle +0.35 +author +0.15 +published date +0.15 +article body +0.20 +headline +0.10 +tags +0.05 +URL blog/news/article hint +0.05 +``` + +--- + +### 6.4 QAPage scoring 예시 + +```txt +schema.org QAPage +0.35 +question block +0.20 +answer block +0.20 +accepted answer +0.15 +votes +0.10 +comments +0.05 +URL question/qna hint +0.05 +``` + +--- + +### 6.5 LoginPage scoring 예시 + +```txt +password input +0.40 +login keyword +0.20 +email/user id input +0.15 +submit button +0.10 +signup/reset password links +0.10 +``` + +--- + +## 7. Classification Result 모델 + +분류 결과는 단일 문자열이 아니라 아래 구조로 반환한다. + +```python +@dataclass +class EvidenceItem: + key: str + value: str | int | float | bool | None + weight: float + source: str + message: str + + +@dataclass +class PageClassificationResult: + url: str + + primary_page_type: str + secondary_page_types: list[str] + + domain: str + archetype: str + main_entity_type: str | None + + action_intents: list[str] + graph_roles: list[str] + + confidence: float + alternatives: list[tuple[str, float]] + evidence: list[EvidenceItem] + + should_analyze: bool + analyze_strategy: str + llm_policy: str + + is_protected: bool + is_noise: bool +``` + +예: + +```json +{ + "primary_page_type": "CategoryListingPage", + "secondary_page_types": ["FilteredResultsPage"], + "domain": "Commerce", + "archetype": "Listing", + "main_entity_type": "Product", + "action_intents": ["Filter", "Compare", "Navigate"], + "graph_roles": ["CollectionHub", "RelationHub"], + "confidence": 0.88, + "should_analyze": true, + "analyze_strategy": "AnalyzeRelationsOnly", + "llm_policy": "RuleOnly", + "is_protected": false, + "is_noise": false +} +``` + +--- + +## 8. Analyze Strategy 정책 + +기존 `should_analyze_page(page_type, analyze_page_types)`는 유지하되, 내부를 확장한다. + +기존 방식: + +```txt +ProductPage -> analyze +CategoryPage -> skip +SearchPage -> skip +BoardPage -> skip +``` + +개선 방식: + +```txt +ProductDetailPage -> AnalyzeFull +ArticlePage -> AnalyzeFull +BrandStoryPage -> AnalyzeFull +CategoryListingPage -> AnalyzeRelationsOnly +SearchResultsPage -> AnalyzeDiscoveryOnly +ForumThreadPage -> AnalyzeFull +ForumBoardPage -> AnalyzeRelationsOnly +FAQPage -> AnalyzeFull +QAPage -> AnalyzeFull +TermsPage -> AnalyzeDocumentOnly +PrivacyPolicyPage -> AnalyzeDocumentOnly +SitemapPage -> AnalyzeDiscoveryOnly +RobotsTxtPage -> AnalyzeMetadataOnly +LoginPage -> SkipProtected +CheckoutPage -> SkipProtected +PaymentPage -> SkipProtected +ErrorPage -> SkipNoise +NotFoundPage -> SkipNoise +``` + +--- + +## 9. LLM Policy 정책 + +LLM은 모든 페이지에 쓰지 않는다. + +```txt +LLMFull +- ArticlePage +- ProductDetailPage +- BrandStoryPage +- ResearchPaperPage +- LegalArticlePage + +LLMLight +- FAQPage +- QAPage +- DocumentationPage +- TutorialPage + +LLMForAmbiguityOnly +- CategoryListingPage +- SearchResultsPage +- ForumBoardPage +- ArchivePage +- TagPage + +RuleOnly +- SitemapPage +- RSSFeedPage +- RobotsTxtPage +- LoginPage +- CheckoutPage +- PaymentPage + +Skip +- ErrorPage +- NotFoundPage +- AccessDeniedPage +- CaptchaPage +``` + +--- + +## 10. UnknownPage 처리 + +UnknownPage는 버리지 않는다. + +분류 confidence가 낮은 경우: + +```txt +primary_page_type = "UnknownPage" +graph_roles = ["UnknownPattern"] +analyze_strategy = "AnalyzeMetadataOnly" +llm_policy = "LLMForAmbiguityOnly" 또는 "NoLLM" +``` + +저장해야 할 정보: + +```txt +url +title +text sample +html fingerprint +dom fingerprint +schema types +link pattern +button labels +forms +top keywords +embedding +classification alternatives +``` + +향후 clustering 대상: + +```txt +UnknownPatternCluster +``` + +새 page type 후보 생성 예: + +```txt +Unknown cluster 12 + -> repeated comparison tables + -> product attributes + -> no cart button + -> many product links + => ProductComparisonPage 후보 +``` + +--- + +## 11. 구현 단계 + +## Phase 1. Taxonomy와 Result 모델 추가 + +### 작업 + +1. `page_type_taxonomy.py` 추가 +2. PageDomain enum 추가 +3. PageArchetype enum 추가 +4. PageType enum 또는 문자열 상수 추가 +5. EntityType enum 추가 +6. ActionIntent enum 추가 +7. GraphRole enum 추가 +8. AnalyzeStrategy enum 추가 +9. LLMPolicy enum 추가 +10. `PageClassificationResult`, `EvidenceItem` dataclass 추가 + +### 완료 기준 + +- 기존 `ProductPage`, `CategoryPage` 등과 호환되어야 한다. +- 기존 코드에서 string page_type만 기대하는 부분은 깨지지 않도록 compatibility helper를 제공한다. + +예: + +```python +def get_legacy_page_type(result: PageClassificationResult) -> str: + return result.primary_page_type +``` + +--- + +## Phase 2. Signal Extractor 추가 + +### 작업 + +1. `page_signals.py` 추가 +2. `page_signal_extractor.py` 추가 +3. HTML에서 JSON-LD 추출 +4. OpenGraph 추출 +5. Twitter Card 추출 +6. meta 태그 추출 +7. button text 추출 +8. form/input 추출 +9. link pattern 추출 +10. 반복 카드 후보 탐지 +11. breadcrumb 후보 탐지 +12. price/currency 후보 탐지 +13. article author/date 후보 탐지 +14. login/password/payment/captcha 후보 탐지 + +### 완료 기준 + +- 입력 HTML이 일부 깨져도 예외 없이 동작해야 한다. +- BeautifulSoup 또는 현재 프로젝트에서 사용하는 parser에 맞춰 구현한다. +- 없는 값은 빈 리스트/빈 dict/False로 처리한다. + +--- + +## Phase 3. Scoring 기반 Page Type 분류 + +### 작업 + +1. `page_type_scorer.py` 추가 +2. 주요 page type별 scoring function 작성 +3. score normalize +4. top score와 alternatives 산출 +5. confidence 계산 +6. evidence 기록 + +최소 구현 대상: + +```txt +ProductDetailPage +CategoryListingPage +SearchResultsPage +ArticlePage +BlogPostPage +QAPage +FAQPage +ForumBoardPage +ForumThreadPage +BrandStoryPage +AboutPage +ContactPage +DocumentationPage +APIReferencePage +JobPostingPage +PricingPage +LoginPage +CheckoutPage +TermsPage +PrivacyPolicyPage +SitemapPage +RSSFeedPage +ErrorPage +UnknownPage +``` + +### 완료 기준 + +- 단일 if-else return 금지 +- 반드시 evidence list를 남긴다 +- confidence가 낮으면 UnknownPage로 보낼 수 있어야 한다 + +--- + +## Phase 4. Analyze Strategy / LLM Policy 분리 + +### 작업 + +1. `page_analysis_policy.py` 추가 +2. PageType -> AnalyzeStrategy mapping 작성 +3. PageType -> LLMPolicy mapping 작성 +4. 기존 `should_analyze_page()`를 compatibility 형태로 유지 +5. 신규 함수 추가 + +예: + +```python +def decide_analyze_strategy(result: PageClassificationResult) -> AnalyzeStrategy: + ... + +def decide_llm_policy(result: PageClassificationResult) -> LLMPolicy: + ... + +def should_analyze_page(result_or_page_type, analyze_page_types=None) -> bool: + ... +``` + +### 완료 기준 + +- 기존 호출부가 바로 깨지지 않아야 한다. +- CategoryListingPage는 기본 skip이 아니라 `AnalyzeRelationsOnly`가 되어야 한다. +- SearchResultsPage는 `AnalyzeDiscoveryOnly`가 되어야 한다. +- Login/Checkout/Payment는 `SkipProtected`가 되어야 한다. + +--- + +## Phase 5. 기존 Extractor 연결 수정 + +### 작업 + +기존 흐름: + +```txt +classify_page(...) + -> page_type + -> should_analyze_page(page_type, analyze_page_types) + -> Extractor 실행 + -> HybridExtractor 내부에서 LLM skip 판단 +``` + +개선 흐름: + +```txt +classify_page(...) + -> PageClassificationResult + -> decide_analyze_strategy(result) + -> decide_llm_policy(result) + -> strategy에 따라 Extractor 또는 relation/link extractor 실행 +``` + +### 전략별 처리 + +```txt +AnalyzeFull + -> 기존 Extractor + HybridExtractor + LLM policy 적용 + +AnalyzeRelationsOnly + -> 링크, breadcrumb, category, repeated card 중심 추출 + -> full LLM 금지 + +AnalyzeDiscoveryOnly + -> crawl candidate, result link, pagination만 추출 + -> content claim 추출 금지 + +AnalyzeMetadataOnly + -> title, metadata, schema, canonical, link relation만 저장 + +AnalyzeDocumentOnly + -> 법률/정책/문서 구조 추출 + -> 필요 시 LLM 사용 + +SkipProtected + -> 개인정보/계정/결제 페이지 분석 금지 + +SkipNoise + -> 저장 최소화 또는 제외 +``` + +--- + +## Phase 6. Unknown Pattern 저장 기반 추가 + +### 작업 + +1. UnknownPage 또는 confidence 낮은 페이지를 별도 저장 +2. DOM fingerprint 생성 +3. text fingerprint 생성 +4. link pattern summary 생성 +5. 향후 clustering을 위한 embedding hook 추가 + +초기에는 clustering까지 구현하지 않아도 된다. +다만 데이터 구조는 남겨야 한다. + +--- + +## Phase 7. 테스트 추가 + +### 단위 테스트 대상 + +```txt +ProductDetailPage +CategoryListingPage +SearchResultsPage +ArticlePage +QAPage +FAQPage +ForumThreadPage +DocumentationPage +JobPostingPage +LoginPage +CheckoutPage +TermsPage +SitemapPage +UnknownPage +``` + +### 테스트 샘플 + +각 page type에 대해 최소 HTML fixture를 만든다. + +예: + +```txt +tests/fixtures/pages/product_detail.html +tests/fixtures/pages/category_listing.html +tests/fixtures/pages/article.html +tests/fixtures/pages/qapage.html +tests/fixtures/pages/login.html +``` + +### 테스트 기준 + +```txt +primary_page_type이 기대값과 일치 +confidence가 최소 기준 이상 +evidence가 비어 있지 않음 +analyze_strategy가 기대값과 일치 +llm_policy가 기대값과 일치 +protected page가 분석되지 않음 +UnknownPage가 예외 없이 처리됨 +``` + +--- + +## 12. 분류 예시 + +### 12.1 ProductDetailPage + +입력 신호: + +```txt +JSON-LD @type Product +price +add to cart +variant selector +product images +reviews +``` + +결과: + +```json +{ + "primary_page_type": "ProductDetailPage", + "domain": "Commerce", + "archetype": "Detail", + "main_entity_type": "Product", + "action_intents": ["Buy", "Review"], + "graph_roles": ["EntityAnchor"], + "confidence": 0.93, + "analyze_strategy": "AnalyzeFull", + "llm_policy": "LLMLight" +} +``` + +--- + +### 12.2 CategoryListingPage + +입력 신호: + +```txt +repeated product cards +filter panel +sort control +pagination +many product links +breadcrumb +``` + +결과: + +```json +{ + "primary_page_type": "CategoryListingPage", + "domain": "Commerce", + "archetype": "Listing", + "main_entity_type": "Product", + "action_intents": ["Filter", "Navigate", "Compare"], + "graph_roles": ["CollectionHub", "RelationHub"], + "confidence": 0.88, + "analyze_strategy": "AnalyzeRelationsOnly", + "llm_policy": "RuleOnly" +} +``` + +--- + +### 12.3 ArticlePage + +입력 신호: + +```txt +schema.org Article +headline +author +published date +article body +tags +``` + +결과: + +```json +{ + "primary_page_type": "ArticlePage", + "domain": "Editorial", + "archetype": "Article", + "main_entity_type": "Article", + "action_intents": ["Read"], + "graph_roles": ["ClaimSource", "EntityAnchor"], + "confidence": 0.91, + "analyze_strategy": "AnalyzeFull", + "llm_policy": "LLMFull" +} +``` + +--- + +### 12.4 LoginPage + +입력 신호: + +```txt +password input +email input +login button +reset password link +``` + +결과: + +```json +{ + "primary_page_type": "LoginPage", + "domain": "Transaction", + "archetype": "Form", + "main_entity_type": null, + "action_intents": ["Login"], + "graph_roles": ["TransactionOnly"], + "confidence": 0.96, + "analyze_strategy": "SkipProtected", + "llm_policy": "Skip" +} +``` + +--- + +## 13. 하위 호환성 요구 + +기존 코드가 아래처럼 page_type 문자열을 기대할 수 있다. + +```python +page_type = classify_page(...) +should_analyze_page(page_type, analyze_page_types) +``` + +따라서 처음부터 모든 호출부를 바꾸지 말고, compatibility layer를 둔다. + +권장: + +```python +def classify_page_legacy(*args, **kwargs) -> str: + result = classify_page(*args, **kwargs) + return result.primary_page_type +``` + +또는: + +```python +def normalize_page_type(page_type_or_result) -> str: + if isinstance(page_type_or_result, PageClassificationResult): + return page_type_or_result.primary_page_type + return str(page_type_or_result) +``` + +--- + +## 14. 기존 page type과 신규 page type 매핑 + +```txt +ProductPage -> ProductDetailPage +CategoryPage -> CategoryListingPage 또는 CategoryPage +SearchPage -> SearchResultsPage +BoardPage -> ForumBoardPage +NoticePage -> PublicNoticePage 또는 NoticePage +BrandStoryPage -> BrandStoryPage +PromotionPage -> PromotionPage 또는 CampaignLandingPage +UnknownPage -> UnknownPage +ReviewPage -> ReviewPage 또는 ProductReviewPage +``` + +기존 이름은 당분간 alias로 유지한다. + +--- + +## 15. 코딩 원칙 + +1. 단일 if-return 방식으로 확장하지 말 것 +2. evidence를 반드시 남길 것 +3. confidence를 반드시 계산할 것 +4. PageType 하나만 반환하지 말 것 +5. Category/Search/Board 계열을 무조건 skip하지 말 것 +6. Login/Checkout/Payment는 보호 페이지로 처리할 것 +7. UnknownPage는 폐기하지 말고 저장 가능한 구조로 만들 것 +8. JSON-LD, OpenGraph, meta, DOM, link graph를 모두 signal로 사용할 것 +9. 다국어 키워드 확장을 고려할 것 +10. 기존 호출부가 깨지지 않도록 compatibility helper를 제공할 것 + +--- + +## 16. 최소 완료 기준 + +이번 작업의 최소 완료 기준은 다음과 같다. + +```txt +1. PageClassificationResult dataclass 추가 +2. PageDomain / PageArchetype / PageType / EntityType / ActionIntent / GraphRole / AnalyzeStrategy / LLMPolicy 정의 +3. JSON-LD / OpenGraph / URL / DOM / text 기반 signal 추출 +4. 최소 20개 page type scoring 구현 +5. CategoryListingPage가 AnalyzeRelationsOnly로 처리됨 +6. SearchResultsPage가 AnalyzeDiscoveryOnly로 처리됨 +7. LoginPage / CheckoutPage / PaymentPage가 SkipProtected로 처리됨 +8. ProductDetailPage / ArticlePage / FAQPage / QAPage는 AnalyzeFull 가능 +9. UnknownPage가 evidence와 함께 반환됨 +10. 기존 should_analyze_page 호환성 유지 +11. 테스트 fixture 10개 이상 추가 +12. pytest 통과 +``` + +--- + +## 17. 최종 목표 + +이 작업의 최종 목표는 `page_classifier.py`를 다음 수준으로 확장하는 것이다. + +기존: + +```txt +URL/text 기반 page type 분류기 +``` + +개선: + +```txt +Semantic Page Understanding Layer +``` + +최종 파이프라인: + +```txt +Raw Page + -> Signal Extraction + -> Evidence Scoring + -> Domain Classification + -> Archetype Classification + -> Main Entity Classification + -> Action Intent Classification + -> Graph Role Assignment + -> Analyze Strategy Decision + -> LLM Policy Decision + -> Unknown Pattern Storage +``` + +이렇게 해야 온톨로지 플랫폼이 특정 쇼핑몰이나 특정 사이트에 종속되지 않고, 인터넷 전체의 다양한 페이지를 의미 단위로 해석할 수 있다. + +--- + +## 18. Codex 작업 요청 요약 + +Codex는 이 문서를 기준으로 다음 작업을 수행한다. + +```txt +1. 현재 page_classifier.py를 확인한다. +2. 기존 호출부와 테스트를 확인한다. +3. taxonomy / signal / scoring / policy 레이어를 분리한다. +4. 기존 단순 page_type 문자열 반환 구조를 PageClassificationResult 중심으로 확장한다. +5. 기존 코드가 깨지지 않도록 legacy compatibility를 유지한다. +6. Category/Search/Board를 단순 skip하지 않고 strategy 기반으로 처리한다. +7. protected/transaction page는 안전하게 skip한다. +8. UnknownPage는 evidence와 함께 저장 가능하게 만든다. +9. 최소 fixture 테스트를 추가한다. +10. pytest로 회귀 테스트를 확인한다. +``` + +--- + +## 19. 주의 사항 + +- 기존 엔진을 대규모로 폐기하지 말 것. +- 현재 parser, crawler, extractor 흐름을 먼저 파악한 뒤 최소 침습 방식으로 확장할 것. +- page type enum 확장은 허용하되, extractor 전체를 한 번에 갈아엎지 말 것. +- LLM 사용량이 늘어나지 않도록 `LLMPolicy`를 반드시 적용할 것. +- protected page에서 개인정보나 계정 정보를 추출하지 말 것. +- 분류가 애매할 경우 억지로 하나의 타입에 넣지 말고 alternatives와 confidence를 남길 것. +- Evidence 기반 디버깅이 가능해야 한다. + +--- + +## 20. 향후 확장 방향 + +이번 작업 이후 다음 단계로 확장할 수 있다. + +```txt +1. UnknownPage clustering +2. DOM fingerprint 기반 template detection +3. site-specific learned page archetype +4. screenshot 기반 visual block classification +5. multilingual keyword dictionary +6. schema.org type mapping 강화 +7. page type별 extraction schema 자동 선택 +8. crawl priority와 page type 연동 +9. graph relation confidence와 page evidence 연동 +10. admin UI에서 page classification 결과 검토 +``` diff --git a/ontology_platform/ont_platform/api/main.py b/ontology_platform/ont_platform/api/main.py index 4627c13..429b3d6 100644 --- a/ontology_platform/ont_platform/api/main.py +++ b/ontology_platform/ont_platform/api/main.py @@ -156,7 +156,7 @@ def create_app() -> FastAPI: # ─── /health ────────────────────────────────────────────────────── @app.get("/health", tags=["meta"]) - async def health() -> JSONResponse: + async def health(request: Request) -> JSONResponse: """Liveness check for the HTTP service and optional LLM readiness.""" settings = platform_config.load_settings() if _startup_error: @@ -172,7 +172,7 @@ def create_app() -> FastAPI: }, ) - ctx = get_app_context() + ctx = _request_app_context(request) if ctx.tools.llm is None: return JSONResponse( status_code=503, @@ -192,13 +192,13 @@ def create_app() -> FastAPI: # ─── /info ──────────────────────────────────────────────────────── @app.get("/info", tags=["meta"]) - async def info() -> JSONResponse: + async def info(request: Request) -> JSONResponse: """Service-level capabilities (mirrors OntoCast /info semantics).""" settings = platform_config.load_settings() phase = int(settings.phase) storage_backend = settings.storage_backend if not _startup_error: - ctx = get_app_context() + ctx = _request_app_context(request) phase = int(ctx.settings.phase) storage_backend = ctx.settings.storage_backend @@ -449,6 +449,13 @@ def create_app() -> FastAPI: return app +def _request_app_context(request: Request) -> AppContext: + override = request.app.dependency_overrides.get(get_app_context) + if override is not None: + return override() + return get_app_context() + + # Top-level instance for `uvicorn platform.api.main:app`. app = create_app() diff --git a/ontology_platform/ont_platform/api/product_backend.py b/ontology_platform/ont_platform/api/product_backend.py index 274a3d5..922f085 100644 --- a/ontology_platform/ont_platform/api/product_backend.py +++ b/ontology_platform/ont_platform/api/product_backend.py @@ -82,6 +82,6 @@ def _remove_route(app: FastAPI, path: str, methods: set[str]) -> None: for route in app.router.routes if not ( getattr(route, "path", None) == path - and set(getattr(route, "methods", set())) == methods + and methods.issubset(set(getattr(route, "methods", set()))) ) ] diff --git a/ontology_platform/web/frontend/src/lib/api/crawl.ts b/ontology_platform/web/frontend/src/lib/api/crawl.ts index 00c9ca0..9130870 100644 --- a/ontology_platform/web/frontend/src/lib/api/crawl.ts +++ b/ontology_platform/web/frontend/src/lib/api/crawl.ts @@ -86,6 +86,26 @@ export function isCrawlTerminal(status: string): boolean { return TERMINAL_CRAWL_STATUSES.has(status); } +export const extractorModelsResponseSchema = z.object({ + ok: z.boolean(), + error: z.string().optional(), + models: z + .array( + z + .object({ + id: z.string(), + owned_by: z.string().optional(), + }) + .passthrough(), + ) + .optional() + .default([]), +}); + +export type ExtractorModelsResponse = z.infer< + typeof extractorModelsResponseSchema +>; + export const crawlApi = { startByProject: (body: StartSiteCrawlRequest) => apiClient.post("/crawl-site/by-project", crawlJobSchema, body), @@ -99,4 +119,9 @@ export const crawlApi = { `/crawl-site/jobs/${encodeURIComponent(jobId)}/cancel`, crawlJobSchema, ), + listExtractorModels: (provider: string, baseUrl?: string | null) => + apiClient.post("/extractors/models", extractorModelsResponseSchema, { + provider, + base_url: baseUrl || null, + }), }; diff --git a/ontology_platform/web/frontend/src/pages/CrawlPage.tsx b/ontology_platform/web/frontend/src/pages/CrawlPage.tsx index e7b60fe..5091da4 100644 --- a/ontology_platform/web/frontend/src/pages/CrawlPage.tsx +++ b/ontology_platform/web/frontend/src/pages/CrawlPage.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { useForm } from "react-hook-form"; @@ -36,7 +36,7 @@ import { useCrawlJob, useStartSiteCrawl, } from "@/hooks/useCrawl"; -import { isCrawlTerminal } from "@/lib/api/crawl"; +import { crawlApi, isCrawlTerminal } from "@/lib/api/crawl"; const startCrawlSchema = z.object({ source_name: z.string().min(1, "소스를 선택하세요"), @@ -150,7 +150,53 @@ export default function CrawlPage() { const sources = project?.sources ?? []; const sourceName = watch("source_name"); const extractionMode = watch("extraction_mode"); + const provider = watch("extractor_provider"); + const baseUrl = watch("extractor_base_url"); const usesLlm = extractionMode !== "rule_only"; + + const [loadedModelHint, setLoadedModelHint] = useState(""); + const [modelLookupStatus, setModelLookupStatus] = useState< + "idle" | "loading" | "ok" | "error" + >("idle"); + const [modelLookupError, setModelLookupError] = useState(""); + useEffect(() => { + if (!usesLlm || provider !== "lm_studio") { + setLoadedModelHint(""); + setModelLookupStatus("idle"); + setModelLookupError(""); + return; + } + let cancelled = false; + setModelLookupStatus("loading"); + setModelLookupError(""); + (async () => { + try { + const res = await crawlApi.listExtractorModels(provider, baseUrl); + if (cancelled) return; + if (!res.ok) { + setModelLookupStatus("error"); + setModelLookupError(res.error || "모델 조회 실패"); + return; + } + const first = res.models?.[0]?.id; + if (!first) { + setModelLookupStatus("error"); + setModelLookupError("로드된 모델이 없습니다"); + return; + } + setLoadedModelHint(first); + setValue("extractor_model", first, { shouldDirty: false }); + setModelLookupStatus("ok"); + } catch (e) { + if (cancelled) return; + setModelLookupStatus("error"); + setModelLookupError((e as Error).message); + } + })(); + return () => { + cancelled = true; + }; + }, [provider, baseUrl, usesLlm, setValue]); const selectedSource = sources.find((s) => s.name === sourceName); const progress = job?.progress; const visited = progress?.visited_count ?? 0; @@ -385,9 +431,30 @@ export default function CrawlPage() { + {provider === "lm_studio" && + modelLookupStatus === "loading" && ( +

+ LM Studio 로드 모델 확인 중... +

+ )} + {provider === "lm_studio" && + modelLookupStatus === "ok" && + loadedModelHint && ( +

+ LM Studio 로드 모델: {loadedModelHint} +

+ )} + {provider === "lm_studio" && + modelLookupStatus === "error" && ( +

+ LM Studio 모델 조회 실패: {modelLookupError} +

+ )}