From bfa5b9a82cea989651085ec0eedf44dc2663e682 Mon Sep 17 00:00:00 2001 From: Tong Date: Tue, 10 Feb 2026 13:57:45 +0800 Subject: [PATCH] Add Paper2Poster feature with all components and workflows --- .../postertool/config/poster_config.yaml | 218 +++++ .../prompts/GPT-4o-image_generation.txt | 19 + .../config/prompts/classify_visuals.txt | 39 + .../prompts/extract_color_from_figure.txt | 21 + .../config/prompts/extract_keywords.txt | 100 +++ .../prompts/extract_structured_sections.txt | 63 ++ .../prompts/extract_theme_from_logo.txt | 57 ++ .../config/prompts/extract_title_authors.txt | 27 + .../config/prompts/layout_balancer.txt | 115 +++ .../prompts/narrative_abt_extraction.txt | 22 + .../prompts/spatial_content_planner.txt | 286 +++++++ .../toolkits/postertool/fonts/Arial.ttf | Bin 0 -> 367112 bytes .../postertool/fonts/HelveticaNeue.ttf | Bin 0 -> 794452 bytes .../toolkits/postertool/pyproject.toml | 106 +++ .../toolkits/postertool/src/__init__.py | 0 .../postertool/src/agents/__init__.py | 0 .../postertool/src/agents/balancer_agent.py | 147 ++++ .../postertool/src/agents/color_agent.py | 349 ++++++++ .../toolkits/postertool/src/agents/curator.py | 440 ++++++++++ .../postertool/src/agents/font_agent.py | 339 ++++++++ .../postertool/src/agents/layout_agent.py | 805 ++++++++++++++++++ .../src/agents/layout_with_balancer.py | 94 ++ .../toolkits/postertool/src/agents/parser.py | 435 ++++++++++ .../postertool/src/agents/renderer.py | 752 ++++++++++++++++ .../src/agents/section_title_designer.py | 131 +++ .../postertool/src/config/__init__.py | 1 + .../postertool/src/config/poster_config.py | 12 + .../postertool/src/layout/__init__.py | 9 + .../src/layout/text_height_measurement.py | 126 +++ .../toolkits/postertool/src/state/__init__.py | 0 .../postertool/src/state/poster_state.py | 144 ++++ .../postertool/src/workflow/__init__.py | 7 + .../postertool/src/workflow/pipeline.py | 166 ++++ .../postertool/utils/langgraph_utils.py | 280 ++++++ .../toolkits/postertool/utils/src/__init__.py | 0 .../postertool/utils/src/logging_utils.py | 105 +++ dataflow_agent/workflow/wf_paper2poster.py | 229 +++++ fastapi_app/main.py | 4 +- fastapi_app/routers/paper2poster.py | 179 ++++ fastapi_app/start_backend.sh | 3 + .../src/components/Paper2PosterPage.tsx | 3 + .../src/components/paper2poster/Banner.tsx | 94 ++ .../components/paper2poster/CompleteStep.tsx | 152 ++++ .../components/paper2poster/GenerateStep.tsx | 77 ++ .../components/paper2poster/StepIndicator.tsx | 48 ++ .../components/paper2poster/UploadStep.tsx | 335 ++++++++ .../src/components/paper2poster/constants.ts | 9 + .../src/components/paper2poster/index.tsx | 421 +++++++++ .../src/components/paper2poster/types.ts | 17 + frontend-workflow/vite.config.ts | 8 +- script/run_paper2poster_cli.py | 295 +++++++ 51 files changed, 7286 insertions(+), 3 deletions(-) create mode 100644 dataflow_agent/toolkits/postertool/config/poster_config.yaml create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/GPT-4o-image_generation.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/classify_visuals.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/extract_color_from_figure.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/extract_keywords.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/extract_structured_sections.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/extract_theme_from_logo.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/extract_title_authors.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/layout_balancer.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/narrative_abt_extraction.txt create mode 100644 dataflow_agent/toolkits/postertool/config/prompts/spatial_content_planner.txt create mode 100644 dataflow_agent/toolkits/postertool/fonts/Arial.ttf create mode 100644 dataflow_agent/toolkits/postertool/fonts/HelveticaNeue.ttf create mode 100644 dataflow_agent/toolkits/postertool/pyproject.toml create mode 100644 dataflow_agent/toolkits/postertool/src/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/balancer_agent.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/color_agent.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/curator.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/font_agent.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/layout_agent.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/layout_with_balancer.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/parser.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/renderer.py create mode 100644 dataflow_agent/toolkits/postertool/src/agents/section_title_designer.py create mode 100644 dataflow_agent/toolkits/postertool/src/config/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/src/config/poster_config.py create mode 100644 dataflow_agent/toolkits/postertool/src/layout/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/src/layout/text_height_measurement.py create mode 100644 dataflow_agent/toolkits/postertool/src/state/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/src/state/poster_state.py create mode 100644 dataflow_agent/toolkits/postertool/src/workflow/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/src/workflow/pipeline.py create mode 100644 dataflow_agent/toolkits/postertool/utils/langgraph_utils.py create mode 100644 dataflow_agent/toolkits/postertool/utils/src/__init__.py create mode 100644 dataflow_agent/toolkits/postertool/utils/src/logging_utils.py create mode 100644 dataflow_agent/workflow/wf_paper2poster.py create mode 100644 fastapi_app/routers/paper2poster.py create mode 100755 fastapi_app/start_backend.sh create mode 100644 frontend-workflow/src/components/Paper2PosterPage.tsx create mode 100644 frontend-workflow/src/components/paper2poster/Banner.tsx create mode 100644 frontend-workflow/src/components/paper2poster/CompleteStep.tsx create mode 100644 frontend-workflow/src/components/paper2poster/GenerateStep.tsx create mode 100644 frontend-workflow/src/components/paper2poster/StepIndicator.tsx create mode 100644 frontend-workflow/src/components/paper2poster/UploadStep.tsx create mode 100644 frontend-workflow/src/components/paper2poster/constants.ts create mode 100644 frontend-workflow/src/components/paper2poster/index.tsx create mode 100644 frontend-workflow/src/components/paper2poster/types.ts create mode 100644 script/run_paper2poster_cli.py diff --git a/dataflow_agent/toolkits/postertool/config/poster_config.yaml b/dataflow_agent/toolkits/postertool/config/poster_config.yaml new file mode 100644 index 00000000..e6a4aaee --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/poster_config.yaml @@ -0,0 +1,218 @@ +# poster layout configuration + +layout: + # dimensions (inches) + poster_margin: 1.0 + column_spacing: 1.0 + title_height_fraction: 0.18 # fraction of ( title height / effective height) + + # spacing + section_spacing: 1.0 + element_spacing: 0.2 + title_to_content_spacing: 0.4 + + # padding + text_padding: + left_right: 0.3 + top_bottom: 0.3 + + # visual elements + visual_spacing: + below_visual: 0.3 + side_padding: 0.3 + +typography: + fonts: + title: "Helvetica Neue" + authors: "Arial" + section_title: "Helvetica Neue" + body_text: "Arial" + + sizes: # points + title: 100 + authors: 72 + section_title: 64 + body_text: 44 + min_font_size: 36 + + line_spacing: 1.0 + paragraph_spacing: 0.0 + +colors: + # defaults + fallback_theme: "#1E3A8A" + fallback_text: "#000000" + fallback_background: "#FFFFFF" + + # color variants + mono_light: + saturation: 0.04 # 4% + brightness: 0.94 # 94% + + mono_dark: + saturation_range: [0.5, 0.6] + saturation_default: 0.6 + + contrast_color: + saturation: 0.85 + brightness_start: 0.50 + brightness_step: 0.05 + brightness_max: 0.90 + wcag_contrast_ratio: 4.5 # WCAG AA standard + + complementary: + hue_offset: 0.5 # 180 degrees + intensity_reduction: 0.7 + + # adjustments + saturation_adjustments: + light_increase: 0.3 + light_brightness: 0.25 + dark_decrease: 0.2 + contrast_saturation: 0.6 + contrast_brightness: 0.75 + + # hsv bounds + hsv_bounds: + saturation_min: 0.2 + saturation_max: 1.0 + brightness_min: 0.2 + brightness_max: 1.0 + + # srgb gamma + srgb: + gamma_threshold: 0.03928 + gamma_divisor: 1.055 + gamma_offset: 0.055 + gamma_exponent: 2.4 + + # luminance weights (BT.709) + luminance_weights: + red: 0.2126 + green: 0.7152 + blue: 0.0722 + + # color constants + constants: + max_rgb: 255 + white_rgb: [255, 255, 255] + black_text: "#000000" + white_text: "#FFFFFF" + brightness_threshold: 128 + gamma_linear_divisor: 12.92 + # perceived brightness weights + red_weight: 299 + green_weight: 587 + blue_weight: 114 + brightness_divisor: 1000 + +text_measurement: + # binary search + min_height: 0.1 # inches + max_height: 20.0 # inches + precision: 0.001 + + # margins (must match renderer) + margins: + left: 0.3 + right: 0.3 + top: 0.3 + bottom: 0.3 + + newline_offset_ratio: 1.0 # font_size/72 per newline + +pdf_processing: # for marker PDF converter + batch_sizes: + recognition: 4 + layout: 4 + detection: 4 + table_rec: 4 + ocr_error: 4 + equation: 4 + + max_section_words: 1000 + +rendering: + logo_spacing: 0.5 # inches + logo_margin: 0.2 + debug_borders: False + slide_layout_index: 6 # blank slide + default_shape_fill: "#FFFFFF" + +# spacing presets +spacing_presets: + tight: + text_margin: 0.03 + visual_margin: 0.05 + section_margin: 0.1 + element_spacing: 0.1 + + normal: + text_margin: 0.05 + visual_margin: 0.1 + section_margin: 0.15 + element_spacing: 0.15 + + loose: + text_margin: 0.1 + visual_margin: 0.2 + section_margin: 0.2 + element_spacing: 0.2 + +# column balancing +column_balancing: + target_utilization: 0.9 # 90% + overflow_threshold: 1.0 + underuse_threshold: 0.7 + max_adjustment_ratio: 0.3 # 30% + +# height estimation +section_estimation: + base_title_height: 1.5 # inches + bullet_point_height: 0.8 + visual_spacing_ratio: 0.1 + +# validation +validation: + max_section_count: 8 + min_section_count: 5 + max_title_words: 4 + min_text_content_items: 2 + max_llm_attempts: 3 + +# utilization thresholds +utilization_thresholds: + overflow_warning: 1.0 # 100% + overflow_critical: 1.1 # 110% + underutilized: 0.7 # 70% + high_visual_density: 0.8 # 80% + low_visual_density: 0.2 # 20% + +# layout constants +layout_constants: + title_padding: 0.3 # inches + section_padding: 0.3 + visual_padding: 0.3 + default_logo_aspect_ratio: 1.0 + section_bottom_margin: 1.5 + text_margin_renderer: 0.3 + +# powerpoint +powerpoint: + slide_layout_blank: 6 + debug_border_width_pt: 2 + text_frame_positioning: + default_left: 1 + default_top: 1 + +# indentation +indentation: + secondary_bullet_char: "\u25e6" # ◦ + secondary_level: 1 + primary_level: 0 + +# llm +llm: + temperature: 0.7 + max_tokens: 4096 + max_retries: 3 \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/GPT-4o-image_generation.txt b/dataflow_agent/toolkits/postertool/config/prompts/GPT-4o-image_generation.txt new file mode 100644 index 00000000..900829d5 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/GPT-4o-image_generation.txt @@ -0,0 +1,19 @@ +You are an expert specializing in designing automated academic poster. + +**Primary Task:** Analyze the provided research paper and autonomously design and generate a complete, professional academic poster. + +**Key Guidelines:** +- **Fixed Dimensions:** The final poster layout must be exactly 1536 pixels wide and 1024 pixels high. +- **Content Fidelity:** All content (text, figures, tables) must be extracted or summarized exclusively from the source paper. Do not invent or infer information. +- **Visual Design:** The poster must be visually appealing. Apply a clean and professional theme consistently across all elements. +- **Layout Design:** The layout must be well-balanced, effectively utilizing the available space. Actively avoid element overflow and large, underutilized blank areas. + +**Required Structure & Content:** +- **Header:** Must include the full paper title and a complete list of all authors. +- **Body:** The main content area must be organized into distinct sections. These sections should feature a well-balanced and carefully arranged composition of: + - Concise text summaries. + - high-quality figures from paper pdf. + - Key data tables from paper pdf. + +**Output Format**: +The final output must be a single PNG image file with dimensions of 1536x1024 pixels. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/classify_visuals.txt b/dataflow_agent/toolkits/postertool/config/prompts/classify_visuals.txt new file mode 100644 index 00000000..f5d8552b --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/classify_visuals.txt @@ -0,0 +1,39 @@ +Classify visual assets by column-aware poster placement and research role: + +Available visuals with captions: +{{ visuals_list }} + +Classify each visual into exactly one category based on column-specific poster design: + +**Column-Aware Categories:** +1. **"key_visual"** - Most important method visual representing core research innovation (max 1, middle column) +2. **"problem_illustration"** - Visuals showing research problem, challenges, or motivation (left column introduction) +3. **"method_workflow"** - Method architecture, system diagrams, algorithmic workflows (middle column method) +4. **"main_results"** - Primary experimental results, performance tables, key findings (right column) +5. **"comparative_results"** - Baseline comparisons, ablation studies, validation charts (right column) +6. **"supporting"** - Background concepts, supplementary analysis, minor details (flexible placement) + +**Classification Guidelines:** +- **Problem Context**: Figures showing "what's wrong" or "why this matters" → problem_illustration +- **Method Core**: Most important technical diagram → key_visual +- **Method Details**: Architecture/workflow diagrams → method_workflow +- **Primary Evidence**: Main performance results → main_results +- **Validation Evidence**: Comparisons with baselines → comparative_results +- **Background/Supplementary**: Minor or supporting content → supporting + +Consider: +- Visual content and research narrative role +- Optimal column placement for logical flow +- Visual impact and audience comprehension + +Required JSON output: +{ + "key_visual": "visual_id or null", + "problem_illustration": ["visual_id1", ...], + "method_workflow": ["visual_id1", ...], + "main_results": ["visual_id1", ...], + "comparative_results": ["visual_id1", ...], + "supporting": ["visual_id1", ...] +} + +Ensure every visual_id appears exactly once across all categories. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/extract_color_from_figure.txt b/dataflow_agent/toolkits/postertool/config/prompts/extract_color_from_figure.txt new file mode 100644 index 00000000..e992ead6 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/extract_color_from_figure.txt @@ -0,0 +1,21 @@ +Analyze this research figure and extract a professional theme color for poster design. + +Look for: +1. Prominent colors used in key data elements (lines, bars, points, regions) +2. Colors that represent important data or findings +3. Professional colors suitable for academic posters +4. Avoid background colors (white/gray) and overly bright colors + +Choose colors that are: +- Professional and readable on white backgrounds +- Suitable for text highlighting and accents +- Representative of the research content + +Return ONLY a JSON object: +{ + "theme_color": "#RRGGBB", + "color_name": "descriptive name", + "reasoning": "why this color was chosen from the figure" +} + +Default to professional navy (#1E3A8A) if no suitable color is found. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/extract_keywords.txt b/dataflow_agent/toolkits/postertool/config/prompts/extract_keywords.txt new file mode 100644 index 00000000..bdb55dfe --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/extract_keywords.txt @@ -0,0 +1,100 @@ +Analyze poster content and identify keywords for strategic visual highlighting using three distinct formatting styles. + +**Input Data:** +- Enhanced Narrative: {{ enhanced_narrative }} +- Curated Content: {{ curated_content }} + +**Core Task:** +For each section, identify keywords and assign them to specific highlighting styles based on their semantic importance and role in the research narrative. + +**Highlighting Style Categories:** + +**1. BOLD + CONTRAST COLOR (will be rendered as `**text**`)** +- **Purpose**: Core method/methodology names that represent the paper's unique contribution +- **Criteria**: + * Novel algorithms, architectures, or techniques introduced by this work + * The main methodological innovation that defines the paper + * Must be unique to this research (not generic terms) +- **Limit**: Maximum 2 per section, prefer 1 if it captures the main contribution + +**2. BOLD (will be rendered as `**text**`)** +- **Purpose**: Important quantitative results and core technical terms within each section +- **Criteria**: + * Performance metrics and numerical results (e.g., "95% accuracy", "5.2x speedup") + * Key technical concepts central to understanding the section + * Architecture names, dataset names, established method names + * Word-level emphasis, not entire phrases +- **Limit**: Maximum 3 per section + +**3. ITALIC (will be rendered as `*text*`)** +- **Purpose**: Defining terms, single-word emphasis, and foreign terminology +- **Criteria**: + * Technical terms being defined or introduced for the first time + * Single-word emphasis (e.g., "This was the only experiment") + * Foreign words, Latin terms, or specialized vocabulary + * Word-level application only, never entire sentences +- **Limit**: Maximum 2 per section + +**Critical Rules:** +1. **Word-Level Only**: Never apply formatting to entire sentences or long phrases +2. **Mutual Exclusivity**: Each keyword gets exactly one formatting style +3. **Semantic Appropriateness**: Style choice based on semantic role, not arbitrary assignment +4. **Conservative Application**: Better to under-highlight than over-highlight + +**Output Format Requirements:** +- **Output ONLY pure text keywords**: No formatting markup in the JSON output +- Keywords must match EXACTLY as they appear in the content text (without any ** or * or tags) +- Case-sensitive matching: use exact capitalization from source text +- Include technical terminology and proper nouns as written + +**Output Schema:** +```json +{ + "section_keywords": { + "motivation": { + "bold_contrast": ["DP-CutMixSL"], + "bold": ["Vision Transformers", "privacy leakage"], + "italic": ["federated"] + }, + "method": { + "bold_contrast": ["CutMix", "differential privacy"], + "bold": ["95% accuracy", "ResNet-50"], + "italic": ["only"] + }, + "results": { + "bold_contrast": ["TransformerNet"], + "bold": ["top-1 accuracy", "5.2x speedup", "CIFAR-10"], + "italic": ["a priori"] + } + }, + "formatting_summary": { + "total_bold_contrast": 4, + "total_bold": 7, + "total_italic": 3, + "sections_processed": 3, + "formatting_strategy": "Semantic-based highlighting with method names prioritized for contrast color" + } +} +``` + +**Quality Guidelines:** +- **Precision Over Quantity**: Better to under-highlight than create visual clutter +- **Semantic Consistency**: Same term type should use same formatting across sections +- **Technical Recognition**: Each keyword should be immediately recognizable to domain experts +- **Visual Balance**: Distribute highlighting styles evenly across the poster for visual harmony + +**Implementation Notes:** +- **Bullet Point Independence**: This keyword highlighting is separate from bullet point formatting (• **Key Point:**) +- **Exact Matching**: Keywords must appear in text exactly as specified for proper highlighting +- **Style Hierarchy**: Bold+contrast > Bold > Italic in terms of visual prominence +- **Readability Focus**: Ensure highlighted terms enhance rather than overwhelm content comprehension + +**Final Verification:** +Before finalizing selections, ensure: +1. Bold+contrast keywords represent truly unique contributions +2. Bold keywords include key quantitative results and established technical terms +3. Italic keywords are appropriate for definitional or emphatic use +4. No keyword appears in multiple formatting categories +5. Total highlighting per section stays within specified limits + +Return a JSON object with the exact schema above that maximizes research impact through strategic visual emphasis. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/extract_structured_sections.txt b/dataflow_agent/toolkits/postertool/config/prompts/extract_structured_sections.txt new file mode 100644 index 00000000..26e860f6 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/extract_structured_sections.txt @@ -0,0 +1,63 @@ +Extract structured sections from academic paper text for poster creation. + +**Paper Text:** +{{ raw_text }} + +**Task:** +Extract all major sections from the paper and organize them with their content. Focus on sections that would be relevant for an academic poster. + +**Section Extraction Guidelines:** + +1. **Identify Major Sections:** + - Introduction/Background + - Related Work (if substantial) + - Methodology/Approach + - Experiments/Results + - Discussion/Analysis + +2. **Content Processing:** + - Extract the main content for each section + - Keep section content under 1000 words + - Preserve key technical details, formulas, and findings + - Maintain important bullet points and lists + - Remove excessive citations and references + +3. **Section Classification:** + - **foundation**: Introduction, background, motivation, problem statement + - **method**: Methodology, approach, algorithm, system design + - **evaluation**: Experiments, results, analysis, validation + +**Output Format:** +```json +{ + "paper_sections": [ + { + "section_name": "Introduction", + "section_type": "foundation", + "content": "Main content of the section (max 1000 words)", + "key_points": [ + "Main point 1 from this section", + "Main point 2 from this section" + ], + "importance": "high|medium|low", + "contains_figures": ["figure_1", "figure_2"], + "contains_tables": ["table_1"] + } + ], + "paper_structure": { + "total_sections": 5, + "foundation_sections": 2, + "method_sections": 2, + "evaluation_sections": 1 + } +} +``` + +**Critical Requirements:** +- Extract ALL major sections (don't skip any) +- Keep each section under 1000 words +- Preserve technical accuracy +- Identify which figures/tables belong to each section +- Classify section importance for poster layout + +Generate structured sections that provide comprehensive paper coverage for poster creation. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/extract_theme_from_logo.txt b/dataflow_agent/toolkits/postertool/config/prompts/extract_theme_from_logo.txt new file mode 100644 index 00000000..0c639834 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/extract_theme_from_logo.txt @@ -0,0 +1,57 @@ +Extract a sophisticated theme color from an affiliation logo that will work well as a poster accent color. + +**Core Task:** +Analyze the provided affiliation logo and identify the most prominent, meaningful color that can serve as a poster theme color. This color should be: +1. Representative of the organization's visual identity +2. Suitable for poster design applications (text highlights, accents) +3. Professional and readable when used on white backgrounds +4. Harmonious for academic poster contexts + +**Color Extraction Guidelines:** + +**Primary Color Identification:** +- Look for the main brand color of the organization +- Ignore pure white, black, and very light grays (background/outline colors) +- Focus on colored elements that define the logo's visual identity +- Consider text colors, graphic elements, symbols, and emblematic elements + +**Color Suitability Assessment:** +- **Too Bright**: If the main color is very bright/saturated (e.g., neon yellow #FFFF00), generate a more subdued version +- **Appropriate Saturation**: Aim for colors that are vibrant but professional +- **Readability**: Ensure the color provides sufficient contrast on white backgrounds for text + +**Color Adjustment Rules:** +- If original color is too bright (lightness > 85% or saturation > 90%), reduce brightness by 15-25% +- If original color is too dark (lightness < 25%), lighten slightly for better visibility +- Maintain the color's hue character while optimizing for poster applications + +**Output Requirements:** +Return ONLY a JSON object with the following structure: + +```json +{ + "extracted_color": "#1E3A8A", + "color_name": "Professional Navy Blue", + "adjustment_made": "reduced_brightness | lightened | none", + "original_color": "#0000FF", + "suitability_score": 8.5, + "reasoning": "Extracted the primary blue from the university emblem. Reduced brightness from bright blue to professional navy to ensure readability and sophisticated appearance on white backgrounds.", + "usage_notes": "Excellent for text highlights, section headers, and accent elements. Provides strong contrast while maintaining professional appearance." +} +``` + +**Scoring Criteria (1-10 scale):** +- **Contrast/Readability**: How well it works on white background +- **Professional Appearance**: Appropriate for academic/research contexts +- **Brand Representation**: How well it represents the organization +- **Poster Suitability**: Effectiveness for highlights and accents + +**Fallback Strategy:** +If no suitable color is found or logo is purely monochromatic, use #1E3A8A (professional navy blue) as default. + +**Critical Instructions:** +- Focus on MAIN brand colors, not decorative elements +- Prioritize colors that appear in text or central graphic elements +- Ensure final color has minimum 4.5:1 contrast ratio with white background +- Adjust overly bright or saturated colors to be poster-appropriate +- Provide clear reasoning for color selection and any adjustments made \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/extract_title_authors.txt b/dataflow_agent/toolkits/postertool/config/prompts/extract_title_authors.txt new file mode 100644 index 00000000..c63cb831 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/extract_title_authors.txt @@ -0,0 +1,27 @@ +You are an expert academic paper parser. Your task is to extract the title and authors from the provided academic paper text. + +Please extract: +1. **Title**: The main title of the paper +2. **Authors**: All author names using initials (no affiliations, emails, or other metadata) + +STRICT FORMATTING REQUIREMENTS: +- **Title**: Use proper title case where each word has only the first letter capitalized, EXCEPT for established acronyms, technical terms, or proper nouns that are conventionally written in all uppercase letters (such as abbreviations for organizations, technologies, or methodologies). Keep such terms in their original case. Example: "A Study of Machine Learning Methods" but preserve acronyms like "Using LLM for Data Analysis" or "CNN Architecture Design" +- **Authors**: Use initials for authors' names. Convert full names to initials format, preserving middle initials when present. Examples: + * "Kevin W. Jones" → "K.W. Jones" + * "Yann LeCun" → "Y. LeCun" + * "Mary Smith Johnson" → "M.S. Johnson" + * "Robert A. Peterson III" → "R.A. Peterson III" + Separate multiple authors with ", ". Remove all affiliations, emails, institutions, departments, addresses, and other metadata. + +Input text: +``` +{{ markdown_document }} +``` + +Return ONLY a JSON object with this exact structure: +```json +{ + "title": "Title With Proper Case Formatting", + "authors": "F. Author, S. Author, T. Author" +} +``` \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/layout_balancer.txt b/dataflow_agent/toolkits/postertool/config/prompts/layout_balancer.txt new file mode 100644 index 00000000..db10d4f0 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/layout_balancer.txt @@ -0,0 +1,115 @@ +You are an expert academic poster layout optimization specialist. Your goal is to achieve optimal three-column space utilization through conservative within-column content adjustments only. + +## Current Column Status +- **Column 1 (Left)**: {left_utilization} utilization - {left_status} +- **Column 2 (Middle)**: {middle_utilization} utilization - {middle_status} +- **Column 3 (Right)**: {right_utilization} utilization - {right_status} + +Available Height per Column: {available_height} inches +**Target Utilization**: 85-95% for each column + +## Core Optimization Principle +Prioritize content reduction over content expansion. Better to have 80% utilization than risk overflow beyond available space. + +## Column Content Rules (NEVER VIOLATE) + +### Left Column: Foundation & Context +- **Purpose**: Introduction, background, prior work, problem setup, supporting context +- **Content Types**: Motivation, challenges, related work, problem definitions, supporting materials +- **Reading Role**: Sets up the research problem and provides necessary background + +### Middle Column: Core Methodology +- **Purpose**: Method details, algorithms, implementation, technical innovation +- **Content Types**: Core methods, algorithms, technical approach, key innovations +- **Reading Role**: Presents the technical contribution and methodology +- **CRITICAL**: Contains key_visual (importance_level=1) - NEVER remove method sections + +### Right Column: Results & Impact +- **Purpose**: Experiments, evaluation, findings, conclusions, future work +- **Content Types**: Experimental results, performance analysis, conclusions, future directions +- **Reading Role**: Demonstrates validation and impact of the proposed method + +## Within-Column Optimization Strategies + +### Strategy A: Conservative Text Content Adjustment (for 80-100% utilization) +**When to use**: Column utilization is close to optimal range (80-100%) +**Actions allowed**: +- **MINIMAL text expansion**: Add only 1-2 short phrases to underutilized columns (75-85%) +- **Aggressive text reduction**: Significantly shorten content in overflow columns (>95%) +- **CONSERVATIVE APPROACH**: Prefer slight underutilization over any risk of overflow + +**CRITICAL TEXT LENGTH LIMITS**: +- **Maximum per bullet**: 25 words (count carefully) +- **Maximum sub-bullets**: 2 per main bullet +- **Expansion limit**: Add maximum 10-15 words total per section +- **Reduction target**: Remove 30-50% of content from overflow sections + +### Strategy B: Section Management (for <80% or >100% utilization) +**When to use**: Column has severe underutilization (<80%) or overflow (>100%) +**Actions allowed**: +1. **Add sections from structured_sections**: Use additional content from paper sections that fit the column's purpose +2. **Remove less important sections**: Remove sections with importance_level=3 or lower importance + +**Section Removal Priority (CRITICAL RULES)**: +- **NEVER remove**: Method sections with key_visual (importance_level=1) +- **NEVER remove**: Core experimental results or main findings +- **Remove first**: Supporting context, minor experiments, supplementary details (importance_level=3) +- **Remove second**: Secondary analysis, additional background (importance_level=2) + +## Strict Constraints + +1. **NO CROSS-COLUMN MOVES**: Never change column_assignment for any existing section +2. **PRESERVE READING FLOW**: Maintain left→middle→right logical progression +3. **SECTION ID PRESERVATION**: Never change section_id, section_title, visual_assets, or other identifying fields +4. **IMPORTANCE RESPECT**: Never remove critical sections (importance_level=1 or core results) +5. **TARGET UTILIZATION**: Achieve 85-95% utilization for each column + +## Input Data + +### Structured Sections (Available for Addition) +```json +{structured_sections} +``` + +### Current Story Board +```json +{current_story_board} +``` + +### Column Analysis +```json +{column_analysis} +``` + +## Required Output + +Generate an optimized story_board with within-column adjustments only. For each column: + +### For Underutilized Columns (<85%): +- **Primary Strategy**: MINIMAL text expansion (5-10 words per section maximum) +- **Secondary Strategy**: Only add sections if utilization is <70% and no text expansion possible +- **Conservative Rule**: Better 80% utilization than risk of overflow + +### For Overflow Columns (>95%): +- **Primary Strategy**: AGGRESSIVE text reduction (remove 30-50% of content) +- **Secondary Strategy**: Remove importance_level=3 sections if text reduction insufficient +- **Emergency Strategy**: Remove importance_level=2 sections if still overflowing + +### For Optimal Columns (85-95%): +- **Action**: NO CHANGES - leave optimal columns unchanged + +## Output Format + +Output the complete optimized story_board JSON. Each section's `text_content` must be an array of complete strings only: + +```json +"text_content": [ + "• **Point Title:** Complete description text here", + "◦ Supporting detail in complete sentences", + "• **Another Point:** Full explanation without truncation" +] +``` + +Preserve all original structure and field names. Only modify content within string values. + +**CRITICAL REMINDER**: Only modify content within existing columns. Never move sections between columns. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/narrative_abt_extraction.txt b/dataflow_agent/toolkits/postertool/config/prompts/narrative_abt_extraction.txt new file mode 100644 index 00000000..9f58c029 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/narrative_abt_extraction.txt @@ -0,0 +1,22 @@ +Extract ABT narrative structure optimized for poster presentation: + +Input: Academic paper markdown text +Output: JSON with poster-ready ABT structure + +Guidelines: +- Each section (and/but/therefore) should be 1-2 concise sentences +- Focus on visual impact and poster audience understanding +- Emphasize key contributions and results +- Avoid technical jargon where possible + +Required JSON structure: +{ + "and": "Current knowledge and established facts (background context)", + "but": "Specific problem, gap, or challenge identified", + "therefore": "Your solution, contribution, and key findings", + "poster_hook": "One compelling sentence that grabs attention", + "key_impact": "Why this research matters (practical implications)" +} + +Paper content: +{{ markdown_document }} \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/config/prompts/spatial_content_planner.txt b/dataflow_agent/toolkits/postertool/config/prompts/spatial_content_planner.txt new file mode 100644 index 00000000..7f538b4b --- /dev/null +++ b/dataflow_agent/toolkits/postertool/config/prompts/spatial_content_planner.txt @@ -0,0 +1,286 @@ +# Spatial Academic Poster Content Planner + +**Role**: Expert Academic Poster Designer specializing in visual-dense poster layouts with strategic spatial organization. + +**Mission**: Transform research papers into spatially-organized poster sections that maximize visual asset utilization while following human design patterns. Prioritize visual impact over text density. + +**Input Data:** +- Paper Structured Sections: {{ structured_sections }} +- Enhanced ABT Narrative: {{ narrative_content }} +- Classified Visuals: {{ classified_visuals }} +- Available Images: {{ available_images }} +- Available Tables: {{ available_tables }} +- **Visual Heights Information:** {{ visual_heights_info }} +- **Available Height Per Column:** {{ available_height_per_column }}" (CRITICAL CONSTRAINT) + +**Human Poster Design Patterns (CRITICAL REFERENCE):** + +Based on analysis of successful academic posters: + +1. **Left Column Strategy - Foundation & Context:** + - Introduction/Background/Motivation (priority placement) + - Problem definition and challenges + - Related work and background context + - Method overview or workflow diagrams + +2. **Middle Column Strategy - Core Technical Content:** + - Primary methodology (highest priority content) + - Technical details and algorithms + - Theoretical analysis and key innovations + - System architecture diagrams + +3. **Right Column Strategy - Experiments & Results:** + - Experimental results (tables and performance charts) + - Key findings and validation data + - Performance comparisons and analysis + +4. Visual Assets Height Management + +**HEIGHT AWARENESS RULES** +- **Available Height Per Column:** {{ available_height_per_column }}" (DO NOT EXCEED) +- **Visual Height Impact:** Each visual consumes significant vertical space - see height info above +- **Space Utilization Goal:** Maximize column space usage while preventing overflow and blank space + +**CRITICAL: Oversized Visual Exclusion (MANDATORY)** +- **Exclusion Rule:** Any visual with height_percentage > 50% in visual_heights_info MUST BE EXCLUDED from poster +- **Reasoning:** Even with 80% shrinking, these visuals would still exceed 40% column height +- **Smart Substitution:** When excluding oversized visuals: + 1. Find alternative visuals from same category with height_percentage ≤ 50% + 2. If no alternatives in category, convert to concise text summary + 3. Prioritize logical content flow and narrative coherence +- **FALLBACK RULE:** If only ONE oversized visual (>50%) is selected, allow it to proceed + - For multiple oversized visuals, only select the one with SMALLEST height_percentage + - This ensures poster generation continues even with challenging visual sets +- **Examples of Exclusion:** + - If figure_10 (91% height) is classified as problem_illustration, use table_1 (32% height) instead + - Convert excluded results tables to bullet points: "Performance analysis showed 15% improvement over baselines" + +**CRITICAL: Visual Asset Strategic Selection Process** + +**Step 1 - Key Visual Mandatory Placement:** +- Identify the "key_visual" from classified_visuals - this is the MOST important visual +- **MANDATORY:** Place key_visual in middle column, top priority section +- This anchors the entire poster layout around the core research contribution + +**Step 2 - Column-Based Visual Distribution (MANDATORY CONSTRAINTS):** + +**CRITICAL: Enforce Balanced Visual Distribution Across Columns** + +**Column 1 (Left) - Foundation & Context:** +- **MANDATORY MINIMUM:** 1 visual asset required +- **Purpose:** Express core research problem or contradiction visually +- **Selection Priority:** Choose visuals that illustrate problem context, background concepts, or prior work limitations +- **Maximum:** 2 visual assets + +**Column 2 (Middle) - Methodology:** +- **MANDATORY:** Contains key_visual from classified_visuals +- **Additional:** May include 1 supporting method diagram +- **Maximum:** 2 visual assets + +**Column 3 (Right) - Results & Impact:** +- **STRICT MAXIMUM:** 2 visual assets ONLY +- **Selection Criteria:** Choose the 2 most critical visuals that directly validate main claims +- **Priority Order:** + 1. Primary performance table/figure showing main results + 2. Key comparison chart demonstrating superiority +- **Text Conversion:** Summarize minor results in concise text bullets instead of visuals + +**Step 3 - Visual Distribution Enforcement:** + +**CRITICAL VALIDATION RULES:** +1. **Left Column:** MUST have 1-2 visuals (NEVER 0) +2. **Middle Column:** MUST have 1-2 visuals (key_visual required) +3. **Right Column:** MUST have EXACTLY 2 visuals (NEVER 3+) +4. **Total Visual Count:** Should be 4-6 visuals across entire poster + +**When Too Many Visuals Exist:** +- **DO NOT** place all performance tables in right column +- **DO NOT** exceed 2 visuals per column in any column +- **INSTEAD:** Convert less critical visuals to text summaries +- **Example:** "Additional experiments showed 15% improvement (see paper Table 3)" + +**Step 4 - Column Space Optimization Strategy:** +- **Core Principle:** Balanced visual distribution prevents overflow +- **Height-Aware Distribution:** With 2 visuals max per column, height is naturally balanced +- **Content Adjustment Rules:** + - **Visual-Heavy Columns:** Minimal text, fewer sections + - **Visual-Light Columns:** Expand text content to fill space + - **Balance Goal:** All columns should reach 85-95% utilization + +**Visual Height Planning Guidelines:** +1. **Large Visuals:** Place with minimal text content +2. **Medium Visuals:** Can pair with moderate text content +3. **Small Visuals:** Safe to combine with other content or multiple per section + +**Core Task:** +Create 5-8 poster sections with BOTH content organization AND strategic spatial placement to achieve perfect space utilization across all three columns. + +**CRITICAL RESTRICTION: DO NOT create any conclusion, takeaway, future work, or impact sections. Focus ONLY on problem, method, and results/experiments.** + +**MANDATORY KEY VISUAL PLACEMENT: The visual identified as "key_visual" in classified_visuals MUST be placed in a section that has: +- column_assignment: "middle" +- vertical_priority: "top" +This is non-negotiable and will cause validation failure if not followed.** + +**Spatial Planning Requirements:** + +1. **Strategic Column Assignment:** + ``` + Left Column: Foundation content (intro, problem, background) + Middle Column: Method content (approach, technical details) + Right Column: Results content (experiments, validations) + ``` + +2. **Vertical Priority System:** + - **top**: Most critical content within each column + - **middle**: Supporting important content + - **bottom**: Additional validations, supplementary experiments + +3. **Content Balance Strategy:** + - Distribute sections to achieve similar column heights + - Ensure all three columns are well-utilized + - Place content strategically based on reading flow + +4. **Section Importance Levels** (MANDATORY DISTRIBUTION): + - **1 (Critical)**: EXACTLY ONE section - the core methodology/method that contains the key_visual from classified_visuals (MUST be middle column, top priority) + - **2 (Important)**: 2-4 sections - main results, key problem statement, supporting methodology details, primary findings + - **3 (Supporting)**: Remaining sections - background, supplementary info, additional validations + + **CRITICAL CONSTRAINT:** importance_level=1 MUST be assigned to exactly ONE section only - typically the core method section containing the key_visual. + +**Content Organization Guidelines:** + +1. **Section Requirements:** + - **Section titles**: Maximum 4 words (e.g., "Our Method", "Key Results") + - **Text content**: 2-3 concise entries using different rich hierarchical formatting (see examples below) based on section contents + - **Visual integration**: Each visual assigned to exactly ONE section + - **Complete content**: No ellipsis (...), write full bullet points + +2. **Rich Text Formatting Options (CRITICAL for Visual Hierarchy):** + + **A) Nested Bullet Structure:** + ``` + "• Primary concept or finding", + " ◦ Supporting detail or sub-point", + " ◦ Additional supporting evidence" + ``` + + **B) Bold Headers with Indented Content:** + ``` + "**Key Idea:** Novel approach combines efficiency with accuracy optimization", + "", + "**Example:** Algorithm achieves 95% accuracy while maintaining efficiency" + ``` + + **C) Ordered Lists for Sequential Content:** + ``` + "1) Data preprocessing and feature extraction", + "2) Model training with privacy constraints", + "3) Evaluation on benchmark datasets" + ``` + + **D) Mixed Hierarchical Formatting:** + ``` + "• **Core Innovation:** DP-CutMixSL applies patch-level randomized mixing", + " ◦ Masks random patches using Dirichlet distribution", + " ◦ Injects Gaussian noise before server upload", + "• **Impact:** Reduces privacy leakage without accuracy loss" + ``` + +2. **Spatial Assignment Rules:** + - Each section MUST specify column (left/middle/right) + - Each section MUST specify vertical priority (top/middle/bottom) + - Consider logical reading flow: left top → left bottom → middle top → middle bottom → right top → right bottom + +3. **Content Adaptation:** + - Use paper's structured sections as source material + - Adapt and reorganize content for poster format + - Ensure narrative coherence across spatial placement + - Maintain technical accuracy while making content scannable + +**Output Schema:** +```json +{ + "spatial_content_plan": { + "poster_strategy": { + "narrative_flow": "How the story progresses across columns", + "space_utilization_approach": "Strategy for filling all three columns", + "column_balance_rationale": "Why content is distributed this way" + }, + "sections": [ + { + "section_id": "unique_identifier", + "section_title": "Max 4 Words", + "column_assignment": "left|middle|right", + "vertical_priority": "top|middle|bottom", + "importance_level": 1, + "content_type": "foundation|method|results", + "expected_content_density": "high|medium|low", + "text_content": [ + "• **Key Innovation:** Core contribution with bold emphasis", + " ◦ Supporting technical detail", + "• **Impact:** Quantifiable result or benefit" + ], + "visual_assets": [ + { + "visual_id": "figure_1", + "visual_purpose": "How this supports the section", + "placement_rationale": "Why this visual belongs in this spatial location" + } + ], + "spatial_rationale": "Why this section belongs in this column/position" + } + ] + }, + "column_distribution": { + "left_column": { + "focus": "Foundation and context", + "assigned_sections": ["section_id_1", "section_id_2"], + "content_strategy": "Build problem understanding and motivation" + }, + "middle_column": { + "focus": "Core methodology", + "assigned_sections": ["section_id_3", "section_id_4"], + "content_strategy": "Present technical innovation and approach" + }, + "right_column": { + "focus": "Results and impact", + "assigned_sections": ["section_id_5", "section_id_6"], + "content_strategy": "Demonstrate effectiveness and validations" + } + } +} +``` + +**Critical Success Criteria:** +- **Full Space Utilization**: All three columns must have content +- **Strategic Placement**: Follow intro→method→results pattern +- **Balanced Visual Distribution**: MANDATORY compliance with column visual limits: + - Left: 1-2 visuals (NEVER 0) + - Middle: 1-2 visuals (key_visual required) + - Right: EXACTLY 2 visuals (NEVER 3+) +- **Height Exclusion Compliance**: NO visual with height_percentage > 50% may be selected (unless only ONE oversized, or multiple oversized then select smallest) +- **Overflow Prevention**: No column should exceed 100% utilization +- **Content Quality**: Concise, hierarchical, scannable text with rich formatting +- **Text Density Control**: Maximum 3 entries per section, prioritize brevity +- **Visual Selection Strategy**: Only most critical visuals, convert others to text + +**Example Spatial Assignments:** +- "Background Challenge" → left column, top priority, importance 2 +- "Our Core Method" → middle column, top priority, importance 1 (MUST contain key_visual) +- "Experimental Results" → right column, top priority, importance 2 +- "Performance Analysis" → right column, middle priority, importance 2 + +**Visual Distribution Example:** +Paper has 8 visual assets → Poster uses only 5-6: +- Left: 1 visual (problem illustration) +- Middle: 1-2 visuals (key_visual + optional method diagram) +- Right: 2 visuals (main result table + key comparison) +- Remaining 2-3 visuals: Convert to text summaries + +**Text Conversion Examples:** +- Instead of table_3: "Ablation studies confirmed 20% improvement from key component" +- Instead of figure_5: "Scalability tests showed linear performance up to 1000 nodes" +- Instead of table_4: "Cross-dataset validation maintained 90%+ accuracy" + +Generate a spatial content plan that achieves perfect poster space utilization through strategic content placement following human design patterns AND visual height constraints. \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/fonts/Arial.ttf b/dataflow_agent/toolkits/postertool/fonts/Arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ff0815cd8c64b0a245ec780eb8d21867509155b5 GIT binary patch literal 367112 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≺9Wiv@#qpl#qL zQ1Fc160r=hyl**aQ7o#>S!yBrB9&0-Hc(7$JFe8Cr*Dd2#nKOwdPhxBt7uAdLf|o> zJ-5(dy8u0yMjQV^9`8+H(y9Pp$FXLy!`z2`ZiKh--EQFd60Zr|AxYTJe1e0mdvOFw z%Oo}M0m;Bucjr$R#tP97SkCc|pd@bEeiT$`jmFxJ9_{J@`iKa3mz>k^h*a3{p|tYi zQBJWPiHheF)*bR=DOx=ZT79k2iWTh>oOr^v*h6ThnJk5k+u=Em0c%i15q>dE6tk$X z+;cKzfJ|^@!xqH=%V^7Xi&SM{4v0fm~c}5v70y;`E zkx)yCHad8?;vK&sGETQqC+gCwoV8BTDVjlM5D}ydaWc2%Wait0oYciskr3nr2B0Y? zFe2nQfniET%YY+8@%n!Oy6U2CIYzI}g z2X_X=TI_xD^d;Ec;Vj3u*TG;vLe7KVXlDtd4kd0$$MMg60zlz{+JU%5%Uxokc>+FA z*eViC6xAv4J)k7vdQqR)g$P37C82Ew(JYnPgotz&BbGk#*Y9kM%QlT}gpr%1+`r9H zLLzVIf6P&mSOX6GU$T@u$Okx=g+P_qj|?&n_NUzjV`oY30tcpV>RtX)c*A|8+E9># zc$4T2KYd&u$fTb>R$HSWx5Aq%PcAUDHpN`>BsNJm$^5yFB5Wm{L2onySXyVq>f{%- zwFM-Tq9XIa!31eEBqPAv5hV~cnLQ?xSpep?=s01wi41$Sr?fpaGw(-4ssz>6$PI4< zNHvCl8SZj&3xCu*zGu9w=*cj_fP z?DS(Y4AEq0uox}!{>JmrTFx^*8*)Qj4IG$NqcJPk$$%F|{^u_SJAt2u5mWI$h@BGn zsRCI6kqtBkr5EGx{=hN^tJjQTp)cZlE|(IUOqcp4daRgp%O+OWP!DLYCdp5;*NT*007#@vO>^s8;!%7%hZ0CBcb=fOoXF!>RXm6CJ&XAJ}v6yoJrh&cUJk@G* z=b3xk$?+CWxO{t-W(1p#1~`tjY-T9H!-gtAc5;Y6^5o@Cm?-?Jx@Z79+;yO$om)A*!bbM zz#Tgh?B?IIu6v$Ny!~-vb7IG1PqO--S+~R+XA;*v`&f!sfJxdt?8_jaKk5W~MS zS$}6&q4UUW8>XRaYV}7j>>(_%?_LkkT?7pktClL;7|_@zN4Oi5MfIG64-~2Vx?YMZ zJNt_gFm7ohQ}d&hIS4s=me1dsQ#=2e@3=d#)D?wFN79ccMM2EUr(=B4Kq)!k#m-j^ z6S;Nf7BWdkLfF#se(iAo|M^F?e8D{@q`>MC+rFfd43Q8EYy znIUXL+E0Ooq6aB~c%p>&u>oVSAQ3Rx*$M+^&vt?z6Krz$gHVg}(DNnnK(f z#|1dv$&b77 z;29SA25F=`M3GELKLsI9W6nt>Nl_5BVo(HlZX@Z{kC+r7C-I2(yjm^_#Z z`0uUw?@(>w!4Itw;cX_5(P%;ia2FSu!6b+V6Q#}Ak636Uce}xyMh6NUMR?vFK`F)! zlopgOOp%%#xXI+vG#eB)PX~qnOzznrHu-K7q46O(#Eu^%R31c7*(2quf$&Gs8 zVhdOU8N{$4>Kd&epu-(R1WF z6(kuhan~uSrWWqix~Rb2qtL^eZ#6HZbbl_3@y*Z3l|(8(yaVA1g_~l6Ay+7&#sH1x zl*)q=qed1@CS{SkK>vpWAZGTYP=+@R&GJ~{BF2JPpR{|@?H`wyK&dCnE7nUt;rSi` zO_8k=&j;ih+zQ)`@?)T}S@=Zl`m>RhOXWtq1SPn}c#yXiAubfB@{3wdzl&UX z7sDna)GFjAGa_a|l(BdSn??AaB4iWaQ22rw8CJfGa-Y+7^;Z2E3sUX9pw=lir}zINWY1=b{eCBrb#A z8P&lZ?y|-fE|<@Yu(hZUildgZ7KQIP@1Sr>P3OD=OIop2waTiMG|f%c?bb%C4oV5U z{Se1>FmN;=Z4aD6Y?l-Ochwu6r3jEYuX676L3kj1nP-Uh!8s5?%zWjEI1231*9d;( z*U=__#I1hKJx|G+g^@+;drcza0A*7C5b-z*KK?v?43a98lh2()0XOCd&ZUQrpFH$G zU%nY%dnmCx@qw~GG3W1ZxZq{?qV+w-*e!{%@p@CD3p=bsibDubCfo>WKS+8Wb{s|| zwY*{SP~`^e2+ttzQ2)??rtz8oTYb+L{#P2_|F!x?%Yl~an<=Tj!7B3av^GAB9d2fu zGCIN{|39d0JW>3Z3?^hmGsKMN!x%12t6)uOYc>*Gp|sKd#BY=}44(f=QM>U!DQW*% zLBm**G2xeSUlYuq@N~NqQKw;{mF8>mPuYkS6GBDdyJjG#efY{Xd5!QIG+((pSruwP z7_!KmW^!*4MNf;Y@yTqqJZmEP1Th{p1}pG+jOBFr`<%)=hvfh{^NFlQigfPN!t=iI zs~{uL+B?X@N%OVO%?}}Zh~+jpn^4;}BqmGW(fMK^c|P5RJa0S>?s?O~v4n` z7MNX74bg^dY6CmRbNyO(LGhB{hsCQ!CkVGAH&!={GmlUN4R=^aPfyPc_KEf>!6_Nz z^X8iu1Q%qiGj9mqYqhqru$~3Oa-T6gkCm&#WGj8e`mR+J^f{9dHDmRL97P9<#G>?& zJ}2bXGq+i^S-oBs$f+<5ptY?yNHyl?v_%N0IM_iFjZmOaIH-CkhoA$YTMkFmAvxN$ zjqu!JSV+-W6M1Y5ob7QPW)t`+)4D~3Ln_{Ru2y`Tj88)zVt2%69=Y^T*xfIP-mtREOk8}|)Q6X+t%-l3ta|3a;&0Zie%$T+ z_>pH5KS}dy=Z{@EcHTXS>CZp5{JABQo*?i?AqcMd2L5LTmR7$J98YSX*^ZQ(B9}2Z z{y~MoNF0pq2Pk%=LL-2!LG5lsHcpm{)bN4;-5Yy1vYqmCB8v#@^q623y$xm$+Rjl7 zCZt9|%5Aw(Cp04bFxQ}WIdKc{5hiaUx1Qfj52FVEHo-%Y@bd*NRjvR9?3DhTURL#N zCwLAg3LL7V*0jl_sFb+A@!(6|w9>*^MAW1;5|aofi68(EXv-7-HGY0c1n{D((=ZAe z)Z`Fycs47Y%{nKh7ak@^F=UJk2ieZxYpj43?@ipYN6u?_MXJ1fA~BiWOLXjsc(A#c zmm|UtYSa)61gFWj=~nBWl%EOc)1+&qL6X!#T9C0JLlVPSnNLyO4!a@bH-&p5_cL=i zEZb2Do?c)XEj*;#60pLuWW)L}@TaD92;$KYOVE^CUXeZ^eRTTL^o{Ad^j1+YtTy+a zjTOS}HCe_Yv9Jbj2&{w3hkq1Y$GH|dF0#%dcUxHGFpS7_0tU@*3s4ZDL*{ql?TMcf zTc*u_XvNrh56^1%bb0^j_uk)^4f!E4Mga;){F~GBZZ+8omJYk|@oS!RFDSUmCCjt+ z&pFF}-3D@SiG~OC-eXP*Mr-ss5SoVI zRi{s%E0@VVt)A&m(Lg?&j~P_ z=nUc6kty70%aINC904nBP}#$253N0!>{aH;US)1y=1M&=B`*-C@&Yj~FA&$F0CJJ& z#wwnJ`AKp+x!p-*IHX^?hqFtIQ5JZHOabEq)Q6!G@4RCLp07}VlMvbXx#fiCgcT^Q zW(2M#qR`IWq<@0O4#Y8j-6Ab4zJXLHH58+O7JFFh5i*Y3kr{R3(@bubmM-&eN`8? z4Jn$vN8=#PQl}YuG>n&I^EE4v{97vzcm-*~E1)2gA!pq#4lkfZl{exZW;UFn)3ji6 zSg%_|m0v})@{6oHvLafCOT*xxI$5r@-lseb^UT{a!pfDe3Krb)Fj$b)C+&x2cz~6D$Lm6)qo9x zTY~4peDH-VIXuDA4!R!75M`3|l>C&UGa!3QKq^KS^ZNvnKL){K##1UVQV>CWq~z!= zlrK9)c2dBob2@UW^Pi+#GLA_ynjtYo7O?X!GFZ|)@;$;mGIE;Hei ztlG$AgY9e9nE2>*w*HaV#hllrw1%%`7ke7WAC9>!O~ zBQfL7gw$$<9p`q&Ok-XT`w;sIJJ1Qr&0m|Pb@CeBdh-U$n(PPj-Zme%7$(aTbyLk# z!t*Wj!@5jxeLbd0OruBD%#3JhmLaqqOlZt#6$tt5j!=e447Fkbzuyy4a&q@Jo`tzV zHy8yimJEgSSPMfU&B$GvE9T}#(nB7;vFPz|Ik&g*D}DvU(pNlTc_b;KGI3Xrrq#oSd2U8e}kx-sMOINtl_EyyfvNtZ>W9w;rCgf8NaAC-$|ysrtD@ zk3DzZx$LV?l@IQ|arpCh_kX8$%spOPw?#cy?h~KV4{bZaUCid*f4-ZmzGnFw)GIu8 z8PUZ$id}~ITmj9#5_7f{cuy8}99U|q`5oyK=~wZBL75Vm5*(9WoBp(JpQ0Nb94k%H zO*4+QPxI=kq|wS~W0ifhSLx&^b9F$r@?MS}t{%Q#fg#cj%24Al3-X&=)?4frlVJ0N zOlDh1);pb6e-2n4z8#R?dK+zR;E)iv!1|=h252Z0>&L)#13SqMKvPKib|>MB&M%_b z0%b(slS*s0K@-JXO|u0*rXFvayOUxAqosM4ZU$>QOA|$Mo}hlx^rU1$YubXC<>uMo z30xgc;=jR$U-9FYUod+j{=wl}SoVrX9$LNT+1=p%Rje(`O8oJcUlZ>xPRNRS zy6D{KYFPn(D;7+4DU_*qyIj^V9wm@t<&FYYzU>VQPXnhN3L2lIa1O>F-Cz{pAxRUj zm8D#%+MPs5AAR4M2#K;TCv2dA!7%hpdZ)<*e*Mt4!ZHyv?56Gr^T{?`fk5MS+07bF zOA>;~5r@~z=M-;=TjN6Rcz$i1WC~hc_RKDk& zTM0p(_j~{Ue}Ba0R&`f*)jju~O2e0#;-M}NP%E`QhsBNwa;JmecQsNaB0ZR;PuMVc*UmMvJw z$f)w2Ibf(Z6yYmloOg$Bk2tdNCVjl~bbXrh0)38iBiBG^k9%jtSH@N7orou= z&t{UCbJjbFf+%jm1@`bKyI#u_ePWV9nd177{DP59>RZEfux*P z=rB|jWhUcj2qEq)jDtD7uI1Lr$6efW^;a)0dFfca(00Rr-8$jo>FQZ+x9<96{vYA$ z5lR?)KF4}RnK`Ro75A%KUAxtGm)=WlbOG%5c;iNqx4-uym*Y|GVb>aCop+1+s`0Ap zHSgbCKWjg^y-sh?p9JnWz-aI~41sz!E(-PVDozhfO9x(D3UX$U&gv$+(d(C@4Lu6r z{np*k$A502cQE)7rLyp@JMYl|`2s9v8`KSz!r=)x-S{pjj(0nhg&vM)AR^JgETwkg zK}Xh+gOmPlzsE~r53wSi94gX{fc5onI34kSO^OXl#BZ^Gh=D9=MzY_6Qy#Wex*@`swfPJ|pSWOHQv2k{GFAzN}OC0Yp%V;SEW3;w{Sz4w+ zvk#ZV+a7F(dOxaEU5~FUhO)ttBgM=$k&4{Lxz`xTg5emTbQ#qRDHcj`u6SGVj$*xd zR7tLMdg)yFvUijkO&BbKQ~R4z19&fD>EzNpux4uxf_@um(GoMD&yi(LxCr&rJyey| zoVcq(Pp$rv)xGYyuH~w`>sKH9#h+W|zji}U%*HD zVd|2SS=mb}=cg7_t|;s-B$NW23XbsbV#n|tRBW#|rz9}>#n3VnH2+C-_=8QaB$H`i zCR#-)u~D@NFc#VR5jf{C*&a_t%uKT)fmj``?1D0a?9|7xoKy@xXJwY7dAflo=hD5> zDg>^Q4k0MMS9(QyciJHjOq75$(!IAAM1g4GAx@34W>)am6K}3Ch`>1BZ z?vxuZ7Y){yIg3tzXXPhig!L)fi2P)I_02b;e7|tPBmGyXBC3IWKviO!H!oJY;JgQ+ zo62wDyb{Nx>lw#XZbq6g>U^0&Rm`B0Oc@2W*nstRAf>1w)3;L_B23k;;J4cl$ia;FJ1$g2&lFaP)G?6=)*ktb`9%kC%^&0 ztb<-4=Ab+CpSrJL_a+P750+c~ zPq+U4#wzRGvIp}kueo`{sck14e$euM_(8`~RMy9XtX(ndOt zbdOA&sGZVdBR1ds_IFW zhBX5&Q-KN|@j}d5h@pNm#ca5WatJ6aIz%l%9o!2D6MO@b5|p7zm+8#u9f5s_mTv|t z-)T>N2U^0Gi%dk>$s!S1lt_n+)a9Z{wJfJZWr$AFsg{+iPHkM<_;O&JJ-)T$w__%kA4hGUZ>qO?%( z`b#rvF=7ak6#7*faYI5BGpjGIq#aPqvA!^EFrN^dc3Cf^7h|2{_%kya0Cz5C9C$A1 zP+U}2U>$~JH3qhR4y4@?VlAe3bs$$n7(2`8BF5N}Tr|)O$B&NrsNzseB@)ICsiMuY z6XAH+HO#VLN&cBPPhiv7U3(CHEvrV`y9(WUNivX+qfEbBocjHTlW*GceA`QH zU)Nke%{-;7SNY+GYqyK5r(JSV^Sv)xt;YJco2PG{y5OB-4S$>e-|t?OdNOwUGrDWv zm)$O!G=2^krAjds&MlxxOv#F&W^IkjmyL?jY}OkKtMSr+*A)XD;4OzD80WCKI4p9E z86QXCGa$jla^fr%as07aPEsU(64AK&%x5S=z=PKo=vPNvi^bpV?l+pmhzaY0ZG}JEoeI{SIxP zWwiYc%m7MH;5co32>KKlVX0Q)DxjuuzPONd7xfb*8eY=QL_Z~Cl-lf&uKy+dP^}GA zjCK;PLLVrG{q^&OcWl|%_LsJ=Q5QP0Nt|=(oaW;ndH*XS*swn@Sors$>iumK=}0|) z-ea}#Bp2v5t2$+0>ynfcz)iN zrk00IEl-T*3}@d2*=WQ}3ddjajA5{Y>4Cw!GP2Rb#hyK4Biu-%Sfxr+eHy4xY6#V{ zDN?!}DpWidi~Uk^y^rr?$wf8Xd06lD-o<|{S$oTvROBj`**k{!#RdrwS3xEE_BsfeOOD~WdzWr9#W17R>w zkPk7_A-@PBlw_`dhhKL)RMlCk>qwfQ`cyl~u!W7x;Y~Q+W%i-{Olf+$rv4jKqIMXs__SeClP8L9AKK>JkYM=`bOEi*yPLQ$L4WvJn{ zTQ!dWStGxigUOUed&EYC06d%T;46u@E6k5Y_E3rv!eTkfph_?D3 z(N@EL8HWkZhp1&8RcDm|aORz6yxOIgrcwb78z@*Ba3Od+N($V!NMz?ioxl=kTHOo< z;SF1!!0vX3+&Q=A?!CQ8K%O9Do~#IrwP5al5^>h4vr%9$Z;L%rXKPM(GApp5E(jV- zhz^|rg_XgaiX91W!I_U2;1`3Y=DfJ z>-y7Q{;F-$CUNz>_nxxsMGLWM%dNpjZ@q5%i8+@ooN61UpDg8w0s?F|eb(L%ff0ETss2f^-GP*icAw$8uP|@)0ojj5Tpu(Y#!! zvfC=76h4I=6dD0<1vjP8kYfk04iX~x`7qdR_M{DIsYXBkrFF1>nrYs2#MpHkOb;)u!WgS3a*+Qf<0 zU$GJniqHkGc0!jJZ){M8h=0jKxqJPg3J*Q@-R$kY`gG`>{5fv9EFYI=4 z4@XtH|G7DTJ?-Le@%7~u!}<=2X~vSiJIJ&0`Hi_IQJ^I* zOS1qFb2!n9vqFQ8iFHv9x0hBS$SYEX|087T}6V6@)&F1p6 zH!Zs8IQ3B>4msqur56;c|6!%X&G%i|cD(w>GaiXq=Znv_SLM!Ges6WP`lvekqFY~? zqN-PtwKob?;ID+WR}cwv%&7Fsn(D|72n;Jdqij~`Ls^G2J+kza(%)Ez3W-RaadXu3-3DA1vXK+|1k~5I!ulZSRZ_6O%nI@I_KT{X3SprSoVtJCfz)J?IGR8 zTi-0(Iy3vi{O6Ds&79xJfxo)NK+{v}70whw8Ym#_Gh|C*)S&ivq8o%0Q4s2E_)kf_ z;~XjHF*I*ZWGLWu6wRrINc)_sA>Rw=30N|ngNy1w;$&jb)&)bkxYi z0P$F?t00nDYAk#y=`c`Tz$X!1fxV^=2x8x=xlVD^839gB6j?Wwxjqm+QeVM9Ci!6S z(;C)N26#HMPA&YMIx?}w8#V1xVUC1 zX{X@BWx{P9aYOp*jOuZgID0s2D=theaNbnv92gxK?_Z)hP_aH9MQxBMS{J&!APE4d zG};@c)5X~gmCcXFL&+pbv(?#bS%|hmnR^bZW@R#Eu1s-SD{|<`cvQUU&bd`RAShc6Ra%hsS1TN1u7r&DV>b-~M>U zb?1U8ZI_?*@&TT;{ZB#>B};pvWp_|g_-7+?;@R05C|3pF z5<$IBymIU~y)Esm2n#PHG!8V~et?y<-Qd!fzDpYLMEfR3d7=s6pg#xJHjqNV)POcR zU=8HdIo+;8$Q|h+!p>k1>O29)14V+=2)LU%0YKr_Zr{`umyl@>2T%xF*T2j;0Tyvk zM$a$vKbGNrvW}cei_HJ#G^E5rsuoi4E}dn}Of5BZ6n8;viyAVJMB{Dt9PJ{1prXR% zGTaQg+=%}*kS;=HSZ+h5axnqRd;)5|N5W~yrdkBHAbgZUN;w%Ug_XiBMP&UZj&Pw` zIT)a>gB)=#7^NoJL8H84>dE2J;CUGlVGq36_WoH{&l&l5L*w%XpR68?J?sdv4g=z6g~;cB1hi@ zjo>rlrPZDUVTsZ{!C;S>p^F@>&m-f+p@tljI0$Qp!$4j3mypdB^`yNj1>crZk}~2a zXrGe9o88&_>@YQ0k8R#p$nzy!@tlq(G9rg8CF=VTk_9gZrP-EzXcm;%vUS&3K z6DWI0ai)ra4s?}NCC)&u2W-1Mq&|WH)Rk*QN({9&TmM*NwOS9u*T3P}zrSr=|MZTJ zo-sVnJ{z>Q?%Zy@7JBYEkLdQpkD_o-o8o?L#gkh+uFX%acnvv0jA1+idLd95S3R36X0mx;~U*!+jwq32Fpn zIgUSKc!&mOmgd{Z94zNt>Rf>iD!Ox|AJ7Ja7notWe=(4<1_LQ;ctGYA29kh0pzp(A zpTwIeG7eiCI>G>Ip+ans|42m*!#2u$q(7hn3OY#G0WyV5C^n*&65?>pllvdC5r^;F zo<-<0Jf@JvEi4s)l%B25Ru`yR!i5wqY%v5YggrntK=bQ*?1hL>E$&afZxS?vCL?BoNXQ+3DoMT;svv zyddO)c$%v@nv02CtSL4rHX|mx<8_@7yFDIxk+2|9yKtBE6a@^wBkwo7{S==w0G*U1 zgVJ195!Nd@OG2XxWVlXm*<|g1`K~WUZ(1>D>&Kha(Wfo^aFtkLoxb~y@#+?mq(BtV zlbKMka&vSLnN%|Xg1vz3{BQiwBC*2IStkV2cPCNm<+vs<<4`sp28NCEMZDF5#IvFN zjrLyQU5G9AjQHJZhm(NOzq1U*K(-*nK*C-aP*4xUq@;-Q;NQFy>BFdsgKuo|fC&qe zyJ4awpZJ{#SwgX!oP8+QBJ6trp7c$clNKP3W&9Ao!Le7Swn$TR+6--(wo&^AhW-q{ zXqH@n*4hEM3sSig2BS3y1qd~73H!1aAuYtR`!|VC>F-`3$&7n3_C+&lo$VZm84ZeY zX5I`>56?g;lx1Ng1Y_6w9q7~;boojb1(pR?qSsX5|M~oU&D$FD^H#@1?J9FZD`$|>uMXAd$FgG|IA6EVm_JIF)~BI6$9LnH=XIg+0lb&z&zFepZI zB{~f(`ajJ-6B6_N9p4`YpP8lfWtxLP6jKx5K;UUPZ93E78_l5|fF9cp%s6R9U5Fw1 z0kZ<)1>_<)h!D&XI*2iU`My{ea!AHN=#T3Ecu0hB$onv_vbu_nBv8XI^Vy=5Jaqtn+uc-pe{1TwbWjCj^(b{qcvch0$H{ACrCZ~Q1` z=Nzn9j}lW-qOTdD`GF4>F<;)&6v9DBAj_Hx7<|Z990q^xkTV~fRV<=4qIQ!*kk40Tw1QB5o?T<`VeH;9^%JJTzSPz1O7u;Ng`nV@9{DJ{7s2H$fY83r583R zd1~0ps&<{5hcGWcemLnf>*cn$FfV_6Gof@e68)DI+p{viXf-yS+k!b z?oPThj*@shlgwn|C3$DTTjMXpyC=IthaDCho*GefRB2Oud~!l&Ov#+U4S_%CMO2KW z1!X)b-xbY#5bekV5>o&@p4yQ6G+yof8OQ zNt4%uAbC4%g*XY$$f_k6NGkIg`VtH*-X9pq0(cmpEFEn-_k_7Qkpr`s1IGKV^s{TM zp5Pc7G0l+1T`ZU}bBz{_ZB~tWJq<34GT=4{6z0-x)m?g5xhlAtMtFwh zhgXdYj0=yAkIx>LpHSr+k`nG*!CjG5>cm2$xJb#NdvO6xSd?4E-6fUXIU}k&uT%(q zI~9_85yR=v!5XXzuznSUyO=`(WCknV=yd#}IuNm-prF!yIW%_d-JST-5#*!mF1pX{ zE-EUMoDY@ce5fQxc_uj@D#^8dk|>^rUMj4KBst(O*_c$5y=4-DoDJ0AA*b{KJ-G%T zFN@8_T|Y3AOC8=|u2Bj?GJrrS;Ovyn3agE5;DSmksZT$RD^AN0K<$>L-Vql(y8VHp z^r36c|Eq{x|J;8)_vQ>yBC4P1qu#r4$pfpey5noRw zfEXfIpO8F7OqsSDk()s!tyG9UsQ-Wh-s&)yD^vmeBveyT5lq)8 zj-r~NCtit~m3U->Q6~fJ9c|YQVLV=12|nD)q80;!x|uUeQHC?HaA+lYxu+J6Z5Ju! z5`_@wsd;;E&kN*+K!c&_$2eV-w|h`abq~SHOh-ibu!`5A@=4|&JhHN5--7ucaEM}W zN+`WkQ6cPH&N#fIb!u4@mCAF4h%=rMNfj@}2sRRBZoI@CVKk9T=&6h-@ntef)>EEA zYE@`32s@aA28hD*u;*>hDZ%F;Sy_~$G(j(T&j4R=;_-E2>0L|CX>1&My65E$R$0r& z3r-w*(W1?}?mAyPeA=w{^+Mfs6OWl$NG~|`j$75UQX}e4IJ`|e>ZH1p5dBINQojU+ z3}uSx)j$h`UOIJ3zSz^k(bi^HrBisy@b(X^+tSW8VfA4TV+rH6Glb$uM;DV8 zWuXYu>u{J}r=D&dhYYwSt@FsHPe{Qa+Yqf-{0Nu3v()6l%f-mbBAw=0_920P+R2M%#_L9rjhb<{C|| z)$IU*MnzpUGBlpnI)v5_QfO^=i=bPOUo{dM%&Hd!OCBgIO3Q)J0Ql^ryGE`(9I^uQ|y&K(;FbRgMC5Y}5oo=nfx( zYcC&LSONxq=OwT%R zFYj<bun$wH0MKt++fA3gD+a$wW-c5GwZgTLLGRj=j~N8 z`ToURDG{-J-?b3&F_1nPiuPlvg~3m(T4M0C=_mRk(ofcQq;Dx1T`OuISIQTaZ!6cD z%2$@}MtSD)9rRCm-GI=Kpyp1hM@uB+>~{*noJp=z={?0iY*|zF4T>%S!bZX$ep&Xf z{)U_NAn)n{KdWr43!`u*YF?p>C-?*YtE-Dwl{;-0YqX1tRjY`0dRWVy^|pr#&guc;n7eAe{Mn_nDs@{nf+pFHTr&9BUu)nuB9bWxqZIz4sl5&aH7 z@+8E7*B`$0j_%!-h#Vh6#FRs=xcG9&88lv(&7bsOgWoTfq>r0>?@;ju z))^w5Khq{7XR3h8In8goMW}jg$z1o)l2=3;!$X!#z zB%I|+$i=mI?`n?71ZmZ=W|3G}v=Rm1*Qw*-Hl8>BhG9oVDnQAW4dQ6qe%pYIx7m!fRPc|WLZX3M$0mqBk0PAT%t6il*jTJ5yfuDqJV{9yHd$% zBa0Oy@Hc|VGeL(+d6R!#s}|djqN=pSE<8=EaAM@q-pfB289?e zT&HuxI#>m}NUg>(b5)(O0iET%?jQ+{PyE0+6d1J1I6$4_0Cmxh$gfc>+mjRrh(I!R zhIcMP%P1?$@Tz%mQrU2m1~MPZ%~{&=nC$`i;m|Xtr`pJWRSzDyr=8||K&)%13p%}c@g2ejRB$^Q;c_&V8*lHHXys3CnEA~FFpiHk54aWa-{wcpnNWllImd1qXfO(s0G(piF` zv@;orrkQNX-EJ`pj@Occ8e zXfj%zFHnr6w|tDZ1UAv1q&lMlU*t_?uU8c=AwGujM4Fb$nif9)RSW5-7|5tV3~W!3 zs?)lLRs)fw@=iez<0vk=z~Qo}^sbr=s4t7HjBSiLVn8TphDou*V4Ku^A_#}XF=O{Q z`)>w8F!+ka9|ltA#y}Pb#b5_QDDk7CBNHRjBQqk~BSvI{&lihcDjU=i2@a$*l5ZC~ z$`*h`IQ$_yCA5=NLg>nop!D$OgYHNMKHflvk$gCLZSSRY@-J=y>p_JZfgJrn`lPsSjkDMzXLYA}p$D@XP@nd^;?W{% z#tGk%Pt#Dpc9=L?JJNNu`$X3%?yJQ@ZJukPdz;v5_ayinsHyOUhKZk zy;$6%Eq2}Geo#E2wTKPc8rRF>4Q;b4f|5G!7~(Gzu8ez$xJ$iTTjILU?G;3>II20i zy&kN2H>yfeePLprG{tldgC8Yu*uhUdPF3@Qqk7Sh3|v)pyM$&qyr?G+-Uv?(u~@yB z^c5U`#RS7Z?kWr{vy8Tt9fgvkq67Mh$Q& zyq`CdfrpoqVIZ#(WisiQE5{fdlwg#Tg^sg(%u>R!4MtC;ZE5g^F+@9T%u$?4ogmTT z-|bgtpmv@t%Z$1f%#u1RAyy%H>XP((3d2aYNu-hO$e*TNi2>?aQI;hh#%5rY^X49ju9-1dTlrv*AiK z9k#?MmaHtE-Migt*4$`C76PF?8J$G7lRyih-_(tn=lETQ9E@SIw497h*K`Y(G#{i;1z5>?be40Y0+%gN&!Lu!int-MgwiXzJ&KQh=%T! zN$wPotRM!LPCsBNnPa2m;tt)VGFRm5g$BE$j5CxI=*_a;$#a(*K%cpZnM^UbY9^&m+7EmM6wuj1>0vYbpD71jL`6a50b)T!2> z%S%AB*(v+BNVH(EgBL9Zc03Yd{XrTW1AGBRFp!`J24AlwZs2g&us4RTr-5WA&T6_0 zG4HqrX91hzqfSyMLyH_@5s!QkEx%vfx|t9X?N*7B(B3~1vxov+N>tfu zMv7f7;SUZ+;D~VeJZ@heo-|vD^5kf@dl(|d*?qi{$4k9K2&pBC7IBnxDpqx*=W}QTEmn?}II<;s;kYv&XlZ$P(d>1H>xC^>&N``|_$LI- zlYQr`ItR0H6L6uAcnw`@<|$WxhF{B}?CfZ+IlGL5C0yj*mrKh@c3G!a#}1FPi@FgP zptXTdP^~Kl!}c?gai&e;XuV{f3o+c4Y^gaZ>4j=6%|IZX!~KkS`DqjA6mi|JSTN89NL;gc##qV7)VpxrW2Q z53Q0*v_k^`>dYDd7q2i_3~? z@xi~o|L~n{))4DG@xgOXE}HY$J5YsBdv3wat6>3(F%wRh0PW@m@F>(3!6<;7)tnj4 zx*Rphq-LPhd`%#rd7_ng64(u-k90EZ_j$ka8*rvmsMR8m8uW-s967Ynqa&3Stsanv z2fdhiJ(S{)rJI0egSBOtbC@r@0sRFNg8_;Q(aZ?0tS#6%AV#H)AlY&7Mboz-y%JaB zSjGurKu9ISVYb3cWfgP!Hhl-WTaH3zsx9IGe{`l5cMaLVYyt+6iNtJPCtPu)=w(FQ zg_npolu=^tL~$a3jcS^cSFZ)>zA~&w1!)DZvS@6N7kV&&pmPLx$7|9`{7Tr zPFsHG{O1;*Fz(26A&ahtg!~Hg?LkdYXck$QS`&?;>XH|$G+5~f(A;1_w(^u<@NLJ+ zgp-9=CbLYuvC(WG&8|xdb{36cC&sUcFO9E=zYyOZcLn1j7+=Uof5GuLac5k3NtW7k zd7x4l{|MgbY{Ai)=0}2p*XnPX6J6>u5xg|>{El!W-q^buvB_n)M?w!H2nJw_W~dkiTEe=heTO%C6H0eXXYb1MPMFP(*iJrUOjcsF;c};3)-x7Pg@t07}Y% z7gDg{4GXD2*xLb~!9bva!al;h)9T5uwg7c=mIGanB5L_E^Hh&6`lgRcpW>Q`t|nvR zW6~2dLsR`HeiSMovSm*_ecxtjNt%BlW=1l*#|&Y zsicltg)}!oB>`<)U_s0Ksa?#*5|?%aLl&KIp+ z)=uI2x7A&H=#8}>{OP$jw{8W6v)FrYVDClH%{^xp(Amh<*EiHR-gScSZJ%?tS5&%u zs>k7SF^7^}RmjdV5&sBl3JGTD6@orf=z!((Wopo(B~}x00CNKPh`c9vl$D;2&4tKy zsH=3jjPBs@%eX%j?u`RW+)_U7f6?aEUcs-|LoQ@UdO# zo#1R8DlG#{9Vs^*88<)`(cOidU-%;dT~c#X01#9DblQ)aIPq{YgG!x68O85Qgkord zUIPaUvpLE;#H^Piw@^C1sNkYeCW%m|y|H@g#O87LZr?QS$n&(nl5 z@|t>}Dtt55pC{!H)dJCHM#+o*sPcfSUU_f5cbM1c7dbL|N%n>;wnZXQR2&OZ0vkAE zX-!}CZM59+>xfwKJ1g^^Bth=Z93bD4d=>v-6}w(S)wGYut%}!9KrF;iRfwG~IBNr9 zA=V8-FY;{Rjd1wM>m%D z&DA!}oO$}wtMwNzy7J14tS^op@yx&4@?T#Yy(`f82la3B=3W1G+Xk|sfkLWZ8k^vs zX$H|ykN;vtp&C#q1!ULF7gz@$XkUQK7AYT_1GB|PrpD@HQ|I{3^`9HMz!8 zS<(5CC6Ps`U~HjmZyxuCUFE%;CW>G#qc%2SFX!+NFU|EWf|ln^7Kfb%qJdEOUyWDB z?sisYfp#<$7pav2uI7k#F<`Nftq`sOuI3m3a0gKU{fv8swVG@+!nY361~`BS$gdjc zo#`tvdbF+X(8bW@&u-GmUC_H^hSm_0-;o+hvreUfz_X%Bz#9&=fx^!cNhjQqF!<(K z3&OX|+u3bp@t4nk{If%-+gE* zZUox)6r*h?GWv!&7lXNe&oO-L1`P)CK6{60aPyxOC2NL}!H^>*i(5e;@d&*lY)6^w z@X-E%b(}!-IVugI3I=#(w0)oBXYk6jQVw33jq7nos8SO(<>hW~O&T#s?r2RUf(&;L z@^NA0z`~<7?q-;jj#;W33gO&{BK9S|A8J%@JSzSjRPhUR8t)fyKFoqT`$Z93UF~zfxLN7qa z*i?+}gK~_wqsz;K(YsN~vjZn!II9EAk^#Opx0R>?6@=^1!9nLv1*S8_juWQp;nI}o zRfRtEUmt$|^2gSpmcMHH)RO5(RX0{^)7hnoTYols3>PuEaiI%ZJ7|1#As$Zj61}U0StyWQ~9DVMH z1YWX?Fb;T;k4=C${j`tOb06bSI7@+O2bcVp8Ux<4xg7c-`*OZ*z8$z`6hvF6#z6Yy zfr7NOu_OVgGBcz8QfCJ<;Qy^Z)gaZ(siqQ-5X)ng7o%Uv$p; zchqwqzGYquIR!BNa1gYfHTs0Z&mdU?ErDcBMwFTn%@_0KUG=VEF5{BO^$}I)vb%jC zUovkSMMco4qQxF(Fy+y62(}32OIWm&uxRnKXz{aXfy>19wfLF$`&qQ$tSwsnEL!~R z-}kd<@r#Y9NH&V6nneqh-6x=5u+0buC2;4WwvE@zti{XdJAgXD@WQ4SU-X#PQ*jY{@ZRCN&|Ei62)5k~(5(qp1} zzZ4sgDa6&-Q_qrP%0ZH&v_o>>GmOiV_g|qLNAmuo+@aE1I`*)j~;~r*?>4=i(nulX)%xyk{IkpW(L^IMC6-Xfk0+7*Rla$L{xk$ zxg6CcMbrj;mfb+`Rf4y8*$srV2!H|u!{A3|U>N*tB2f&d7)JLpmAy=5uV_a?oAju~ zf9+9Y52o}$V@pa}(?HT1-Nf;;@I*k3z?0!O@t#y8FtBNTkU88H@%>Hr4=d)h(QLDr zuwQnRQ0fx?SLZIV?j_Hf^`-!9K!6P3GwhoCv1^`mHo@z2quEpFrB2o1Qc5*;mQx5I zCL5|V!eF9g;cGI%M{~K29Bf&cDvbfzFg8R(EDUF4VjTu;42EOS&O8MJ87S@;0H>DC zn>*vc8M)p?nh)Q1MObZL-nJI06XN!^=a6-^9(N4Msrig&amRO<6~GK?sJ^a}w{Mws z1r&p!TaNK9%i2pgB;<<~g&aZ@=@Ig{8A&9%D@hx~g5a5veG1w*xa1Swlc{AGe7}Yy znd8V`+`7%;F!wNty4?IlORQdS!QtlLX`K#1fV)3TyzbnHpes#@nQm0YRG%=ECv>!Y z`?o@+rla*`@xz=~h}Unq1rQk`z7&^F&{EE6VFD^RwW3 zcL|4zRysNI83RH_zy)3zd>CcI>8z5B!0c?}UH{#taP zM;ME)x!NfcA&`x_J)^v_YQR1Lm z?z0F@2~Jn6O)6X?_O@7`89lyh(H6I!t1Z6uR(gfLBZPIlc&z=;KqO0)-s^DYt+g)G zj}F$Z;B)F*N>Y6pAdRlRwI<^;i!yzEc3Zu+KD9M~n+#4GB8MWk2}mA%D8{A=i9{iV z*P3pf!(M&pR6d!^r?T~LcaAH2AqJt;I$piezMJmoaX3sleN|}?ZKK~Zz4@elWBqIB z&P=5@?yaZ#)~fn?)Tnu@MgLc3a2W=xhgSa!#cJL%-5I*$OlJ5|WGmFPSy-bX3$e zh84YgS%1#f_o~FFdWg&A`|*6yLDLbfDw1DP*{eQ_QSXY%UT@cQtLV*>CEtw|iZEB2 z(i?L%8*_#J<3L-QT0&C-0h+0`4x*pK5nhj3N~tfe2?T;;-EobkBvd@nEv|t2Z=x}q z+l?+XG&9ZT^UU-?6*Z=7AL44APl~7RXJ8rGvt&PeKQ&+7qepdRuSCJB6ipA}NqSV{ zp`ulN>a*GU-W8aJ^QTUojC;=3@v$yf4&pl$dMs02WS?tB#Rr~$PI ztvl#>M12KqjCfuy*xz`jB{N0SIe>J3FRq+^6f4A=cMgh<((6eH43+c98(1EHxdpO}jb3goRD0l?d`d>Cddg4JvMT04v6;74rKX`r-CL_Q ztpv4?u#PQ!Ii8hQ@IlM6%c|`6W@$exxcOij zqjXn>%ilNMF?&%JKZ}Q|1YvU6an;o*)OOH)^X zTep4?A3>a*^@>{Beh8i?_%u2-AgT@6OsBBEQQT_1GIc7r{*8Fr()P*FORAsNra084 znC+KMuVFZ5!EhHye4z)as|{gaaQ!hT3ii?w#f!wPH(SR)I(6!!3h1xjCmu6~f&Mw> zqAel7BB*Nc*4ixkDzETqzS^0f7I%O;_<6-x$qTUEdl|z(3HhiMy>a&;>p1o9_N|DR zD20TYyiN&${HatGEebQ@GV2HQb(v*(yts*FXKBkUVXQUw-G%@eT=I9;sx z)VH42pC~S_?MV-{2N~RZzzJ(;%R>jH_4F%NNc^try8XrBl+HVk6@>Qyi9}p-Fv~O(jNBb(^e=o1XS|ILUi#TY56pON{Q|m0aiG*^Q zHebCB*+uZpJ+15&+Sl|!+PS3NU8W|q`OBc#Va4d5pi<08`MD`VJFn~Ku(0$`u(0sC zH`~7wrvWt4lnlCLq9L~W+A1xltW#fA^w6F*XpRIHQY(Tt7sibEzAqJ_dG-6W)y7en z0q_uK#|$VQx|7alCuswgtWE4z6RFBn^zLUIRi8^#7WJ;^)&u!5x_)2#lLvo?2j8UG z-=SgtDBX^};?e3JB9Tvl1<+Tpw82*Z1Hq(;YoH6E2aZx?`jo-K7_4hf#W`5#!h5(I zsrS~!HQ1%=wr<_3joZ4l^${TdLOB~s@X?sbxbnGqN!nHL^%n!xL9RjW0lq=;;o?|z zgzH%M2;Z^svD%656MbiCSGX>S-RQnDHaGr=@9)ar;zcgCTeLbpL~V@Eb1#fP?0Y}% zruxc?>h@qN(JH|s(5yqmeZsAK9Mq6J9P)Y`!B9juoNm<@N9?$GMxC^FE^bE&<2UE-T!FG33 zHHDI8KvX`HrORr@$$->dH8j*ghj;2ne`TF>YPe=|P3fwiz7!`M z+B=ZmoC-~xr4FgP$GQa_7?o4R1S{X|tP9`y;HIaKqIHAL-g-B^H}Izm%^pT55jr7s zdg$Yjq3C;&1iaUezkbi&pwr0V(=pN*MG@(n@aWo!s{$>0=ve(z3*Pq={PVOQH|^Kg zsc$H#ZH4`goUdZlLPl9er~1vPGjMGhWkz{Tg(%+R3ufAs?GHG^i7TQjPp$M%<;^3 zEHWPR`q5E)y-?93UNzwEaCy*#+hgb+m+*atje&04dIFgYaE0%UIb-3y38&%lxuUPc zVorF600AI|$Cne@Qgwy;0^AqW!g3FKQPVsiUCJ@G7JOu#`kImfyj4@v=d#*Va~-&M zU2Xrmx?0MHp$wTin0z4frQmtZsa*?}1W zOH{9!ykW$g;|INT!pO}d(kC7@q*vgG)2>_8SN)^4-nvuhOQt_~>v)koaa=#ooryD- zV18gS=6`B-xl%j!VAX=fC-fBVxAG0JD*y%G4Wl`vVzS}qWX z1fv2L1+pXJ5ymHS5rOA?1y#gkn;&SHRBe{TDpnW63C-+8O(x3nFiiMR6%-HF{3qtA`e6{Z19Utb<5lCK8S%k-+3$Gd)qb9+*G?!enDJ3~T~9 zW@MMj6UmJaijcvbi0cDh==+CT$DaMdyQ^RRX0qBi>zd;Ntyk%RiVHSAN&EiB_D`_F z2Els#gW0V%E6&Nx$*5W+8mWkA)PwMx`i;K0TIAT3&S-ZM1TO0KlJ@v8dw3( zPXOsovOs=qTp<7PwbcL#06}yHRDRPDvLS64=zo`kXl`BvOfh=q8VP} zuI6Ui$rS6vs6oH_`o5B{K@fIo$v3{R{G9XWS6@4E^x$(JxpC3x?JMs7j$2#oaf&!iY-8$q97<(PkTto0TvX_u-a$1OO zAHb1~@2s|_YFF}3J@x4t&mfPgt#9A0=$NOdGk}fiP<(q;jIafHr+#N9DN=wCAG`wk z!)uNfy+Pa$VPW_&B;=A$(q?$Qd-X@!1MfXOjGvc;uD*M&=q?g3jC#WAO+ER(p(=p~2P#^Hvkim8P)ML8$?RVS@b-f4oNVh%xyq>pyo^iub!+&?_;|u3q z*?3I<`?6g_CUF?j2K4RA{$u&Yb zbuis2uqJQ~IbfIyr%9ql?oh1vBC4Q+ycw4(-c9cpKSe*qINO*OaVsHq4~+Erf=P(^9NH*B_lqY{g93C& z=2A*5l>&X^T1rIs!pDos`+HH8IOT!Wkc^{NfJl|nBQ?V3sHRduDsg7d0mT(^td8WI z9@;S!>4ArWLRgcot4%=zByEs_)u`f$okY~BAaIOFiupY@6)o4OR+qHnXh;;xnQ&;7 z%KXEF8%EW>cEKf2HMM;tCMPEjpK)))$QMuWsnf)UFV0$c+3s(xLzan#mG__Vsr89< zk+^RV=I0)3>H%37_#g8adI;h%U1iB8LW-=4H_y|i3d~X zf_(8Jjxz)&iB~5<^9}hK9b-}16w?*vHpqOI>nYTRUkLvttc7XvAnzGYr|E;5)wz{v zV#+#agS1H!De7QL5r-9x?bMoxdSR03V?q-m6B1)mkGLQ8e=0tA1j9u3y_z#tKp4O68h5g5TppAA$nF@=qL2VvC#(og z2KYC-kMKe1D91qV3k>8&hxWDE^kf2vBJ_2{7?se)ztJ3;)p3?vG+_`Gu1yr=iP)m0Qg0wPE2>>ix5o+1f1MEdK(fFXLo<1lC?-yudZUda`_s)_R@ zGD^V^8} z+FlJc7-H}N*9QA}hpR{FC&PIX68gD{FNE5*K2-_0U8sXkrXnr%B6?0yN#C^)u4_>X z)B6gf83{Lb!fx1OxuDvpPE@Z@bro8HdmUyhXu|{j$w)-_3te4G~4 zz8eNVR<>${#W-u@8$uavdP-g`E3v-A({xi8w|!H4!D%93ZMD8TyLA_y(gV45ChydH z)=}wVvzV5tH|EFvIsLWKfyO}3aL9#NahIirA0S_sv|U z&9}NWTz0`q;^4RA$$!QZqE;bvuXL!0^ezq1lT^K+c(GF#H~oWIOnVaDmp~#fXC&eN zBU~4p^^qT0GXtG|TuZZrYR>8g^>yeCN%fOei3Hf~=d7_{@I4#R7|2)vwhm;^7{DA- zMA@2`)Lt6NY5m)}R}}MfyEeI7ef{w-R2@2~Cet<{w3gJbnG1#wKX1hN(V6tPYnz80TWY%LxM_0ZWl3k{oAR`|t$ zny~yrmnYf!8@hZKJG%PrdE)T4=MPi-|s^g7R}DyXe=mQ zkSz{qsO`45*qd;cIiOSiY;wA7f|*Ylzq)cxXIUbLrgfX2t_WyKu8hQBdFY3>K7FvG zh<8E&^4g<=I--C`Mv{mhV(EZ#Ql$0MhH|J>Dpw6_qM$p%(;km+OgV~se@etc^~+hqYg|D^TPnbQ`F5^L4ilP8bxoqOf1bx(*_t&2Xg-e2>yXhL2$ z+56S)KkK(amXso2_Lvdz5s6dcX9Q;j4e=R>x3|O-@i1! zb!k)(r|FP}Pkor-w?29&ft|9Ve05phAxHK-@v`vFFTX~elox96TQey?>-VRo7eAly)R61nnfypD^9gYg9Bgb|Om+A}|dAh5N5)2($)f zvRKbK89jjt)W#c%2Rs*K1jsOoHYhWsXUc>{Sd$dEqMh`T^|}qNFu?Nb-}N~Dmwva_ z)^LCMyV9P<^Qs4)chuAB|Ju(I%lO6P(ogcw0?t(*6bpEk)22_u8gZzD#T4yHAm-rw zu>1kDM6t9_nY?ukK0433g7sbXLABMUO)s-Z(NTn6H|$F%60>j&Hl{eA1p3}esD}Mr zRF(;MgRevJHBD^AcUrN|FXk_2x*K2OyZ!JcPBYyJlx7c#U<7EB?whMT zj*@4wOq1$1=m~#qfu*G?>v5o|e_b681wt=i98~`br^GhJgGB&q3C<(@KEJR(gOgVg zB!bXrn>0`hh&u3}b7T;9IG8G&=lZFS4jW~aJ*qx>!=kp=9~IkA9{lKaw`oc1F!9G@ zk7%8y=a;n3P`9>i8g;nlX#M;GEM2voz@}5#uMtv4v4?G~^T|-q6LOGCw51l|L1^so z+A2ToMTrj4K*E6`R_m}6UxnTxVHnIJtfY{I9T#SwlB0q{7>Ky+ug}-^7V})& zTf*1%FnyvaxG1PD3a*6uO~GV7`0wnmA)wLzmYU|7_2}D%3hIn%6jYiMr+T}E=wun2 zm&p_ghY68fr+y%R_*b7-s^sUfFz@{50A<8eYA+;Cl5fH3YCd97V(=4yk3+ygzc9kboDJ@Zs& zceT5tySuw*usX_7xk+fG(xsM`!N(Pp7470_MC@Sq*HHf-(x!n#nzp4#%j z*M857n$N1X{sg6^b@mbBZ{l}EAC{5EFwm7eV3=9$GR$m|=@+AW3Qy0Ti3BFMe4YA{ zoLr*DudivJ)G%y*88isL(e(oQ zjkB#+$ODJxSjNAxSoyN!o{}j?Sgw$NbgmG5{`iAFzvRH@(?$IG^g6ZU^WY2zJbZb? z?T$I%xib!S={XPf_c;%C209P8_lypYpHBWY4q^u0hCw;`xqGZc^S~m9=O7>8`rq~e zmeK`fN+OrIBC#UzLc+*Wle0F1E=qU+S{9UKbR**-j6_kg_a z@57X8l$|px=T@q@%BIRil`AVZR-%bvNtjjU2A<-2ibHQ(Rar?pg>$ z6oc*?tgV>|GeM?PQ>PyWqDikI)Jl?yf}zC9O?S({hirYKAbm;JOc}U=IJZ3N*YUjp zZXwT7xpFfSoh!4IO=7api)n$Dgb?-wPg7MFPZO5_Wq%XJwbqcu8emvI!0!YQ2HSUZ zKm-GS32aBLq^KE4_6tjD{CtY8({9wAWkQJb2v4(?N3RzfTkk>>WY zBkUS~Z7PP8Ghq*7etbZwVCSiwq+}S~CS^65fxk`A2t`eRpm07ALH$h7AME^iP!uK< zV>cw^5p@Kb!ocVtDFv-bf|4?~hoX#nRAcY`T5@AYMV^roHysJM@I(;x_QE9oYkN&F z15e0(@Z+D9>Ze3G1#-e}$K97tDxXoVDdicz6IX+B9ow*muJ7<$NC}T$%MMT)o)Tpw zsmTtZ!CDg8N*SGmzCe}D}58$Fq=N;I; zPe?I74`Uv3@Xq$hhzRTblt7))k2?yEZd{8W4HYjchH3uA+TysX;d`L0bUq2`1lmDZ zZna38WwqT8#&2B*gS$><`ROZ)mKLeGqU}X$EiwOO2gu9(J(4YqE~pa=3kypNTA>j5 z{}cJ`{{I&FMLBF6?>!j#1(Mi|NHE~Pb}s|olg}n=D#Z zMyRX5TLjf`l5iauuOQZbN(y7x&GBEs~lp z;aLpqnCTE-5n_0@7H~5owB41Qml0Y!p@UU!-_X4+FN&i7!`^#<$5meI!h6r2s_DJ=su|6U zq#0=>S!JtO)x9@iFvb`g3^v8|5IP~$6hcBMfrJnexRxw82r((7!AT<|ISB`n1Lx04 z022ZvU|YWL`u2>9Z5d3G|2+3T7o%yK8SQVa^{utORo?afQypKvavciX;!aQ*D#4np zL~?-^cU!}My+?uE3-6dW{vhgf-EpdU#v4JY$*69YdqK1w8`q_RWzm;P%^2UM9;h*Q zwCHV*Q*mDg7<(b2W`@NgGGaJd%n(g8nGX>K&VN7@I432+CZoVCSMdgw3ss`uAgol} zSxM7=U^KWazmldserVWIWlwgkyIWQT3fIP>b+yM063cF|UUS0$C>*P$H<4a0M^d4w zc9k{N8Aop6GP`-7g{%bh)f*yf@#lO#ji$2?ZL6fCBwbAb7vAw$(6$>TY_=CkGQU1Ir;>r*1j{2NdxFzt8|4{LRh+?Ee%h5o5=N^2g zWHCZJcudND13>;@Aa{)Ez{SX>#OZR}ufwpnA{g^ce|BSgLTTOQ9NZPI2qnkPR9KdOwF27Df85jUYz#rxix%Eje|w^yyQVm zkM3c3$z*`9b|S!sGM|Y6-|%73fYcoGmRaW}O03FReR7IFIN(>Y&19TEIQl1;ATlwk zrT&$oE9O_lvA72|4v&jAACXjp7j>RGx%X8mM*nzi_;ufCNhl!aK1}_s38w za_Xdlmt0OhJVm2J;+WU37{WTp>sQIXz@gKRi-`{2CR*%86f4moBO#KJzKU_eZEFe7(MEwt0)X{L;Q00x#~}-uXa^Qr$HEq zKZ>*1xzLS7q*Mlq)R&Qiy+9p_Od~h2Dp2iv1^~4ijRvK|YGb9KZWDT`Crd$XAygOr zNHlses1WT027O4ULsMKi-3Qf%1`!Mrq(C)X#Y$x;YD01Cqi7qOK3%B}MUmh{btvaT zJqP*LG~umM3JNFj{FXF z{xO9HvZmiD6SzlNF)spY3a3^!S2oum<8`m< z_3~FyPl3X4LlK40zZUh1s#i72S2ZdTuOI~Y>s<=9*wInMwg)<)gNn%&T7^L--g0YE zCazwCn?yBkaOl8zf{4aeRN!0j9eOd7Epl+U_sCulH5&E|{U!TkFL2r;{~;PPg`!q# zcvObJuY6TS*RTs8z+`uU-l8f$g;K%icPk=zyFwv@waL7K$=|~n(`)!g73z~uxjgb% zq-MboR#syI`T~1f=CxMSYoH5254Tz2;U`PUlC$JgIaSG6|Mhi`K3ey+uhH%GQ&5~*;n+n(SkR3{?HQ)GUyi5?vUcI^wyc}N$UPjsVTq@>tqNb|It6o)aLvJni%B%8i!lN45 zqX^$_)9~1^RrnoVm8<`V6Xc#F|1nAzMy%Aci<3QCMc;rzm){^m`cCG!7m9v>qb@W9 zB8EXckT4wW8-Mqvy5Hb>d0d*}-mB|g_*LE2w3{DAZsm31lc+oB-k~J`oKd5hA##nO zR2uNodt|TeMy49^OeK!x`^RuFLqK~E@4JrJ484c{QF={0rEF07OojmgPK*Ws4h{eM zf{wWxR%DiiX9Y{Y;U8#Na{K1boL6cqHKzI+8*5=R@8=!-ALK9N3jEyg^lLyQM>+-S^2x!kSa zC;JN;5#QSFCYf`)>u5n4EXXDM%PzM&mBV`WU~NVfCRY|!s;j7EBN9pNlfBO6_}F!M zXf>8aL^7L|Zb*yEpu&lKXAmDAvQ1S!6iYy$cAL|IDps2+SuB-M$V#QG6uX+bZrMGt zYO%g+i&*SjoE8n~sy1FRc%^P==XDo4Ap2ITu9E zy0mK%Z>cIab)9EedF~A(Hyt{=FfdqO92kUDUBZ1z_D7+>#kjl1Fc-~S#6kCE(TE35 zt4lQ4i!PThiX6oO?A`slHTojYN2?GDIWXe$MR7NV>^SCY?2-Lh)JLN(Aj$I(R-UHh zQGC6ss8pB?MkpKf%={Jl%K_?u2nEU41wH5=Nu{Nk^bhlSrBDi78;Mdhx&k##kW^OR ziwA{z5K9FbQExsGu2J^K+Rv@qIvmtHtnLd6soM4h3y12osbXB!maN^_nqPaf%>7Uz z-?-eIOGdn1kyL2O`tD^JP3{^u%48zd34f#;E8GV_)vxksZGh(wv%am68U%1H82&C-i;sbUwY3d zg_g&6xga!<(_0LZCNfxxK}a?j*i7pnLn4Vjs##E`MB_4uxzIr1IQuP?xzO)uxk{RC z1j)y8qu{PI`2usQh|%;5ddM~edqG8IFcR1KR~-(6MYSx~(ziS%2l~9tqOz&9wp=73 zR|&H_%qCAV)8I|?p()y;2N*AHp^hVm28;3@7CW1gg3FWBgt!q~2a>=+Iw z1woUf)#&v|TmuPS;GBASQV7I24&?^#js^liYL>k_qR}uph=KneUol2F| z9^QW)`46;W2nFugG#ioysCyCxl6WQ{k`OTdlK@D}mY5IOa5|C_3Wv?H4y7CPyg~G;T=IA#?DLyl ze!nF_&Oie5zIltqg$TquBXYTmh^>{qy<6q?*)3)cnZEaS#^ZhiGR5zWSS@=W8;EZjf1W8yq;LtQ|FE-wzscqZJfJ()pB1? z))h5q4KOvA^ZR8_3tvR$-7li!67sRs~Pw`4MsD0%@2WKa8i z)}^(frS@o~sW~D0e#g5gQoTbu&cz(R#= z8cR_nH(>O%sPz}&^zW4&S;bU^teJA-VNnAaJ^X*YtGLc}*Az3OxmV|Jzd8585 zVeD*#zI*9c{`Sz1*5;NBRd1F> zhq2O+W2N84N~^ig?zU5WROy39dtfvcb3qFo5Vg1Yc%RSWbh<2wP7T%^!jB6-7Vsp5 z)uK8ct+)rd1QeN5XTiQRn6JVK$>~CoISK`fPAAmWLGX{Y?OK?%EwgLbTmTKE-drLB z3u(eq4U?Ke_!!HF!$$sE66M2X8mOX05Mh!A1*)hj6>JXSyK7HxUSf-E9Eh9zL9Hv* z)Kk1>pxD~IXlZS=DWq;Ho@EOw6sKQtZ7kl@Jdo_We{08ucmIy}TzAIPuP>{qYpGwe zX7DSH0mxttsFG8RaT#vg=(QNFLkdA_E{1Twy9)PuJ?DA~Zi*9x;3Rit7yK`HVTd~& z8rADlP%DSvs;TzL4q+~4?z%kTGC*y>JQwQeJb?OW^1?C_$44}JjNBxCXNGxI1nYwz z3Iw5b3S6ec%P}u7Udi?!eopY;eLw3?BPx0>ySIOUl zR~6<&(PU$CPm%#}7<178p%`&GgHK@9a=d+f#B5gYlN|=cRk5sL$mEcQfoPZA?aE@{ zR;ZYdjgFU!z7eiE^TJrn7^ksp^Uj4xlQv=ccAY; z=X2ytve+w`c-!i8A8cte??R|21GkX+=7nmN-YpMRu;ny6}-Fp?0+Rk%QfMlbjZ2mc0c` z134;%v30d3^9&1{wywSSh9)}61Kn!VC>BR3SJ;Kq*OvfZEO?23X6!|40qb-+glA%( z{*O9UCX{aN*mC>IW%brV$E*civh&BkdpG}s!@u8l*F~4#$Oo?bIM39gDas2~8{{kur%b3B~91EcXcA0!QfwK0L!$_|f2 zB3{~Q3fbW?>9|)B)z@jqL4lG+VP{?H_?;9~HW8z&PuLO8VW(waC$e)K)MukGw{3mM z)6)|^=i`Bdxai!)nW$D}ix?ks1{buRx2`v^jDP=^ZMR>OWIdo(6@Sd@6F4; z`d`D1SH(M|VOtHFVj z{D{e9+#_(KI-Q>m_9IHAelMyD4N|u$oGuC)LpssSE``_2)<8O<$N4C4o#MvuJLi-d z=gujW=E%6i?dQmz?3vS48XRhDoTu1Znm50(VX(jN{p%H%zW=wzIdd8t=c9Uq=blD2 z*slQfX5*Uol8vIEjzvYM=v~PFDwP&3;ya>71;BnS=6V>JYlEXRMRcGe@IUBGrwZw) z+`tq!xzPNt62V!K!SrlrbzQuAsIhq&|M{f@vzo)DQpuf7Swk^+R0|*(qe6?YUhy_} zCU-vX+lx~8mq)dxVwA!G^?0CYL|s)if(llWz{DjVk%p zK=0C7r^+|?1)hYdHRES1mQtlJZr!?sjBlUp;8<`ozj^b#J=iPmD*BQ&bW^p4)n6{O zpSE$xyQKqvl>T^v{&)ZnIubPt3Vfl^+qYz?(Hsb>x2R4%ZR4!;mKu1K2f5Q^2X}82 z5ysiLv6=pG4Su%p;&u5~Uj<=aeHC6Y`OGvAu0Fq&TtaA3_DUhYm7dX&WO(Au6H__q z$TH>4_za8Q5U-O-6@_c)5j&zx)Hsyz9Ir}ZKE($IE1Z)j8|>fdryTr_xW!Jp<;RNh zsfX>0^)=y!!NIDFmc@O=O&T4>FNQ^QLX7-SQp5ogV}TH zt1eY6O!*tKF-OFuwM9b~hr?oWQJoGnJz%F4v@_wD1JmCeCt!b=?n5DA{~=Mq9ppmt z{U`NKu8~LPLf8sB1Y9Q6+=d8#!Qp4FfnJZ36kG$?8jZuE(*rZtgTmFrqxkC{(q3vl z1wVo8D)m&6a5Tg4K!LqRESENuWKZGpFfWg}3}CK=*)4PB`o1|(TZ)Fl#LL6dv2Y1SWJ_1E}P&9cwp#-c}k`r})D1RJF502I*`6PT`Y#}!t3@pv{ zI4IzbPVcw_*`R&MC&5vNxypEmjYa>OVY!*+x8i8vq$)f}JUJ`S^it~q!p^i!=tKdb zk1}`c-l0{4eTKEG+v>7)YDKs%H@wwf7zi%f*6#Fu;nG>NQ)!*15KTsU8s$HJ^Gm0u zAG{;rZPmflo^^rA*fga6)aUK~Q#Lb-Fe@wTgl#ij_(z2P+&MEXn2|Ej)veq z2kFKcb^y0Vm)3CPu5eGne)AxbM|K2(jWn5aoT@~VQx|rm@pgy95As+++VN3^B8Q{K zAz`cO`0usT8AsRvDNCuF6GTPncLj?2GEF~))8W8bHGEGsDE&j2t zpP#j+b8xe-)>pGKzqYOOOW$4Kn47BYT)yCz>RK^b*VC5ilmFzmKl|yfyDmO!yTKU` z6iaKj^8Qy2Kkp0`l7lx~es89G<)SkO#X%pe%a0*Pm!Uf~%3U&s)0Knr1~2czvWzBL z(t%w*pBu2b?8N1EbBJxxdE(EaT|g)psTTx>1YZ#q3B*=v{Ga#?oWDI0s{+W73FIKy({A|O&Xd?% z{}PS#FVJ#=6kk#;hu$r-Rh&dL^&Fuck%C zUqd7dRt0DR(dvv^VVDSIY2=kqmTLLYf%7lTscqEjBGyoIoyTv9siokSdq`EM4b@j? zmDald3nl7*R`OYn1p~1^Fvp_szJH(MG%3gOFW6Tfo(giVW&Cc%n6MwvZXx8!QrsJ3 zF%v310%!#t#eJ%LkNOE9h{KpTig4b;(a0V_HWrHo;>iRa0maWB4B&yNJ2%9?6yif6 zzRIHM)Ch8fZw{bq9A(?MN5*L+5)1DU__1g-9tipIXlF2(NG0)LcRa439GkThO^=)i z9sMTI1FN8jL!5@vHCmue8usCL3Ogqsu53-q{vFV)?l6Gdg#-~s&j-(>_0L)3?Uztj+ z&mMk;|BKH$G_T*{ZJJ7-w;#KxJ+tt^)rGku=vJyw260$W>cdO-|Li;ET;upWc}Tbr z-dQbIWg*6@j{^?SDPh{ z=ktwCB|H$F4fu{?L&I(Gpe%teu`Yl_9%5~%ht%C zPj7f6mg`w}=~sSr_9@!?Qni~d`Tke0->};E*QvsWgBo$FK{$(R=emFwJjgeW^%AGV zGN%SBoC*-9^o&zM)D|E45^<_;pr80NIM~_IMGr)=dv-4#h{m7x@I5`ewMkuUtB%{O z#1%U@Ra=M@v&5-*yg+-j2wcQA+>?6j>Fp+t&7R%akGU=2SYMym)kz$)bchyrac#%P zI%FLkazj%A(4c}Knwpz$L&03ZYB$(y$b%!u^XBNB>T0GbePvFXUSX`nxrOnPMP1>& z3=>o9NgsmMP@7C)PGc*5g5FrpnHYP5Ju<}5@m}^Zc0;Oxba|@?6pjau~ zBC8J$-8BA%DWbr~S8YtTIAXWF)0O)UbTL)dlir#1=qU7lDJy+H4JjrHZAg* ze>+VyB)u$e6E@?N9FCD1U|k|v1z=Br4UkvC5{N|Y3B`tT4@~o-I522DJe?C2w*sC8OUsa> zPlSi@gRqwfiHtqLaan+(BMzwWBmDO%i!QxjX!e4(r2rc5x~=7^o39+n#k-pqC2L-q zd;cK6ao(4PI_G?8kdJS&}XR#!|D-SG;r*8WJL zd))tSRBxdBH$_y26anIDk=N)uwIH)j&~kAuCTOrVYVh1A`|~LL4Mb-Cx=XZJQW&EN zACTj`a4B-AIwMyOB^Bh##bPO~PwrICE0!OR4SMd3X4t_9gSa#e05s#oTpbs`_(VFC9F%^uQTs z=k@7G#D4y=ukgRv^u^V|RYm{T*RAT`@{Qi=2qtRQ1_I|_dBYu#HMf0g#d*Ocws}hu z=hTEHDyl956=!pY_j2hYFA%j*SoS7SD^JwJeNFkkmhKU`gUNqcwBx}n?`H2!Z9*`F z${K43?*xn?qcws%-!t*8w?Vm^8 z9yumY|*Nkg>_nY;oR+i=Ht_uQ(d>RJLgJF;bcoRU?EO+ zcQ&=gS2ZUJk1eS_t3w~C8(F^@JA!KBgd}+B=N{M#@GEIY=-7@>Z&u56v?G8I#dZSj z8D|(?6zv2R+KJ^d;2Ip@jNpsEQdBppR0${=#JFAYT#WOS8SQz@`4mFHrNn?wqwo}V zM2NHvLc2V107saL;G?l&Que1vJ_$Z)@fl@bNFMr>?7iblI}VyN3%EoDc>q*sb@1z$HOG1bv=*)iphBn_^e?(mZ2*f{RJ`_KmDkG95QOQ{C>CZ*O55jzigd<5eEQRF+gO9Q-F;mot zX5<5-!JzS^t&FG%8lzEQ?|evGlP=qucaE_&lN+^caPR`c*wQYQl;`jV7@tYjoX8HH zHc9yt7$il03SoiT0~<}_$zYv2dGF{CTKG;fJ){sjLU2r*iNYe?!1?;{rYm}4)76%0 zO_qo?O-;#_!*fEUZ)k8G{OL$HkIH=P|%J-EdxamqHq!DkG z|3)W^o>ss7)D@YA1^u&6{p}CO9~n7iL&TF4TGJifk9_gs`)>Sqx9?Axu2SpL4QF=E z5kjGEL$-LvaLH;FOq~a>xp?-_T^qM8U#r||KJPn2mtI<1z0GUYwbyl@f5nnB0L{ST zSQV6y$rRWnx98iCUo<}@7`O&Jr&f@J zphHn5m)|4kc8YR&fTMFm6OzVsZh&u0r#81cK(w<@p`DAxCD^$^A{;>y;1EGgFcR^2 zmI|dB5&WYx@dVW-V(#qZkcbk2D>YOF`Pk#1|H5!}?ZR4%|FY}HfBdVD-5@&Gr4sSx zt1kWJZRcDch9ndS zW~~`Al-*v1&4`|-RjW=z%6nHdir$g1m$KhB8+Brcn07kU&|ANF$^5~gj^3dmamf-< z?43{VsITv(Z)isE3udgIR<%4joD2slT~W(vmsb^+FCRt^jHpYB8dEWu3>Z*ePA^mi z0u4ih-C{>>38m2&FCJ>`pftKD4pAC?P)egCSkBVugEOSj5lTBjD;1TOKyw_MT*rsl zQSaCuEA&3F!hKZ|X9LVxk$S8qTCApYSRo209F>D_oT-0AsPyHa#E1WpT<nbN{W_?QLYajYrUL!dwP|{>rlyv? zm=iUwVlLNIPcIgWO(Zmp5E@ImzCPC|##6;cRlx7CS~#>*y|*)w2pCX-_TGrqihR_2 zoL>?J8iq_275*7SVWOgfIh<161ej0#b;l6`92$>e9;(-7D4;;AT)Fl_x@X-$sG+dh zh&QZ;!fefW^k(~H4TZ6|@`srvzbdT4t@8hyQ`ox{ zkgJI2fQA2o`{^wB^(|iG9Vg>$Z?6tK*wQ3j?YMB);%|s zr0{F#A4?b<)0l}pG^M|4W)kyX0==?}{%f*0rA*jk`mB_DbGhh(bamtl5M@@A0#Tk) zlQKn?A-|&hH~bD&4o=4)wBKvH{Y&IVEvI%6dFGKTgMzJj^OgYp7+UBZ(QhS!+&3*mmEbYEXb9_2*uLGn9@((MwZ+sl-0pMla$vq65Ls))8MpEi~3(`tnv@)T+% zX=iU{z7j=7Nr{00h;U4;qJd9hg9|G zrbEGzt?n&*%Am3PttvR@mA&!{rl)p%kd`uNMX$dIRi&A#s)(&Qu+@}K=SU~z{wX@C z+-%A!x&Dc&sM3%qnTM%mT$3G%MkpV2L0>VHZ_w$P%7^lS;YVX)xa1j})cJpe(xE=- ze@Qh2Lkr;_m;W3Nt!WHxjtX9ufAJYEpMOpQ3<=v~{roTFHxtxEA5I?(X(CpBzXI?g zf;|6R`TaZwnMBQ)rud6~`OSUrdlmO0;_Lu2#h-voq2enO@auzi`Jef3^o{@i=10l zg5xolKw9y0&;o7w)>gp4#ryH5$&#D z{c6{)OD?&XG8q+$>baZyVL{kBSD?tO~Vu-eX zdgdA4@XQ1eKHql~6^vZ9Xi>At96+N?U;f$`_LsjG-(C4;eD9R+e*T$> zF9*A%Z=a-*AV~qptCDk7yb97FuPW1IQVNJ`0t`4^@I!q6_?}*38*y#?^ZYl;jGICS z1!vnWKoT&jgrDFUqooiQKt_BTB&^}j9{==|Pbtx7t5qoFG62XZdAW=}Nqk^TDGPtp zYGrJw@OykQar}4V%ej~;$*Q;fqE03gRG7Q2Nr3xBT89c3@$!@X$}PA4eY+a-$c}`{*Dr^} z>y&bbT!t_U$S2GH8|@wTDQ=jq8#p*ms*-=JRo!%J`R~vblcrGca)FoUU&IHVV++L? zNOSC&@wf2y?S1$&(E5YipXFgRLtrj3_f652uf|{)gV6!}PN&gq((r=J5eDSQlYoyk z1NO`=+cOfZw(jB28dIoq!1JVEsPGFxwnucts}-7@vDPRWuQtk!?U8CjdsRCU_-Bb; zU$w^><~#WL{4E&L(e7&J+M7K6o}YLG&mMk!ETvH0dx;CZG5kCr)y;k7mA8ihwsZKE zS6;^hZm#Kd=@m?>r{7>}lDE{%23*hsxT3>WY)V9ToY2&${`7oBR53bJn%jY{E-@4}Na*=Fi=A_U6wCPv5xx=KlVhx8JzsiYvF= zxc!p@1E0j>E3dfX?9Y7;zel&U3Bd(SgH}8ZI&07k?nazBij+E4mGyA_+#GHZw~{-R z+sKcLM; z9Ox95&DtLtb0SZEYaQA-PpSA>Ex`oEA>+a&@J$%g-I=JBH^EuN@YKhm*?| zr1*TQBQ-xIr1HA?$ZzoV1(jFGt9^2mE}dy=J!L_XHzwyN*CvJgl6)vxn-r5ma*?(- zGJkGqD72_?FgW+L^O~<}zP(uxn-?^n+AIW{`R3&E+Ee&bg2`_sWkG!Q+~j@YhU81h z14(5vwlsT2Ru<1TWM^lE?Be?}d}giXTulC6wIIgFoVOeJa}6KE=)kb5QPU6=IOvin zuMKlm(M`2y@MoM$l~%@%AX=v9cgQ zC^3C*o9U<0i_e!|G`+BO__^nYpL=Hb`K`|thKEhh4{v>O8|)Bbx7a27TU%em4?YhC zjo0YS`(OO&GZVjnw#GNTfUkz?*t+$(X47}~o3MZBt;1XKQ-+A92kbRIN~5I}FmM>? zS>SDu$Py|~fSOMceEbv|@G3?$7V06h4n7J6LNAA>VimBD;xz?XhystET|4Alx{I5l z5wodKujbaj#CIQldi^|D?XV|3e~# z|BvtgH}Re4J~qBsR;%pCjMRRr%tM2)xrp-Ox2Z87(>z|@Nsaj^?^ljsg5n<8`y&Pe z5Gmgu0S?Swbn{uLS{uNHhtbI0K>&D^bXT#GPqTz@QOUFbpry8EW8uu^!NHad4eN7f zH?>B5O}_D~vRBNz_pw)a#rrSsxOed-={NrL-dk^f`-`6)qB_E1T%7?|w_La!b4s}V ztU2RD?-V)GMREBrlp)Nd&vTb^H}LbtC{8};UEt%{Ty-q&4_L#dcs#%gSOOG|3dZxg$(yz;t%fdvb;pMLsv*Ddefj2!JqL&I{qYimQe2VD*d zkmfyL`C8*KeU8F8*=*c{0=f4_fbN95-C{g`dh@C?*HZbk<@D3HFF5ne+9g+C-8*pQ z6{38}9K1ZTV8Id!_8`ej_bh$3WJzzsmfG|2+g+jU+iPoY>Sg$Yh~O05c@Ir2qz)7S z5V`@Y;$%Rod5I|rzV>S7rlwvDmxv(e_n)neRg#&;){Elj!@PPHwGXRuwtO*T|ly^hGNy@&_ z*RbZzk^muMASvi{r5EX&CSRjh6cn(M+FoUc?e2oUQ4^2bg9`H#4b{%LQ|Ata5f_vN z{2_Z@>C`F>31lwSZUrAvsBQY~bJ}vLrrM6q%N(im8qT}+m51b7rxkg9yF=IAoGT<} zsRR{X&^VnjQz+Txiz-@FGL_Tjmj_}d@1ZxWD{{rCqg3x}RV-AuH5jt#ShFs@seiLp zk4o&utR<_{)kc@5lqr?9+M7_?4m}tT)+gLi->e?Ldrs@Dxna+eU(PWWjgfRDv1rj{ zn@Y9rR^A-4CC$-vBwpCQ?dt=HTsFy@(^b{RNG2X}-|*0qTb<{Ig3%^TRT%rDf-~qq zCY8=O1`HJbit>x77|(E@6b+osAv!wHWoxqO)M(?`zYEVW9u?T+e;HA$0rC46QH$`f z5#iya&l`IZUqcmfUcrd|ZU+v781NR`Bbat2lR=-?>)b1txFCAFsV5bEPmrlX0fWCt z4hfqHb>b|nC`A}iF-{VQI|vHnH`RelND3q|kO|6(sFIYomLdK~7*ZCega3-pUtL?D zJzc4D8MSV$Goe{ukKU+Wzp>sTD8fzy##TB_bq0&_qLA5T3}etvOk)d~oCoh;FqB$e z<)5S9$Y1#5%dV=~kli+Z!F|urDH#}qFEGkvx!VB*o5>Pove{%N8YIkLq6`o?kW=`} zNHCbe-EJ=t#_QElql6w*AtEDPEn2c!XT%waMv?JHWev^#+ap+jl!K9dZ*pi|!cGH) z(AEtAiK+B?z2miVi>5@DN$OBxY9g5Y!)Xw0_SgH7#Thrw_0S#-vtaPUVn$rooL`C`;-?B z8Yh}%QFVF@&7LaLtPyVvL%5Ejo2UojYDms%YO+~09#}@|>O%XdJ_6*MDr%q`MgJ!V zhzSixQ}8vS-v^TKxU$HnW}x4*#}`KB%tU3e#=)p>~Wp5*RQ%f~q|v zs2TKSyiVvlpz1U_Qwsq@xM0Z?>~HqJlv$CgO{V~5vHdL>!^RS}HW@flg?1IBS(0F; z5>FuB!iAUKIMUTySk&2RZn~`Q(sPzB&CI`{drocBvgL_Dha>1s`l?sVoq=8aXN~`GgoXlWBx6QQ{$nyudcu!nNj{>aVlJL2-h)-lRYBxixjUh zt#Kcdd!)(CMM==ndi0K1<#hUqL4LoaD{RFO#`;2S?1p+(C@P9Y(2nL29N9yrhja&O zS`;X~R*Y)3sS~RXN|(S3MQWdEj$txGV8ZZGoZvEwkEA(f&p^t|F`A<^BjIFc&Y(D; zcdek{3!tC_6;zKyYe~e|))n z>zvLypAX$i3eiy~qE4}n05j|Aj4t^vEn=%f7i68C0f;(N*w*Xq#5ux3G0__sY&8 zrbHGmUP%;Qxe|lLIy=$SdcwlLCxwZ^KT*4|d)~Zdt*y&CJNrmnmo1AGP{?*{G2rkF z#eh&QBj;-7y1OPqNBz^9lLQ z>JNoCuzQwqzu(I>OZ-NIANCO{5$BZVwJ&K!ar-->8OeL%@{%R3tshvR_~c}PqNttI zJ}|JbR9e{DiauM#=)#2onBwCUEv}fMXmOIqF4j6C6)hfz!P80@;XO{xTaVl!DU9%xPQ zdztlW{T2Wmrk|9mj*Jh&W-=GYH4CKsTaG+1fhlswUd{y1 zdjdK{!U-7*%?uDC!Gi1#29H4liJT-FNTs7)f&i(sL-WU$A5Vw;m=WsZ@OS1>3+_x1 zABPX$vE)vM>``97L%5B+vm^VCJiw4Wbjafk?`GS_s5hW%854f^qj$`R!KA0oWTSEV zMzK_S1!0YFT%%Z1Wqr_KcnJ2f9>K|NK^?|ZMSlak{7Eq%cjJOdp3B$g5bnVB0&y1D zb2W+(i>telr@egy*<)&H=Xp71JqtiKz_@dT!Vw@;I$IzP)T{%5UW${WuY;pM0WYEe z%A>&3EXGK{W4DSbdQxW>&VhpTCK6ra^Ey< z9THgmOq*> zW(AGaP$>M#OiG_K`TdSPLe)qrg*fDavD;~u21@r1py%p1L_*PhCaQL%l6tDl9N!%> z`gy-Uqy8p#YaN#ntk~vO9M(;*y21Qm&tWGD%3L^cdZy897&Ie~rF>|oYD$Tkpc`+gRW&io2TwkBeoW6zo7l=xAtu0&F2KWODOUX zxE4OH7*i;joW;1EdpTEGQv}Gu98FqnnY1B`$IOt0f*@oFrp9x8g6@{f^`THO=q=+3 zsX@jBV2G%l0sRlu&R{k>s12H7-Ap#29|uop3X;%Na#EDNOwSW372%~a5rtD{01=Y! zDAVoGr88+4ocb#CatNQnJ{8J#Xc?oQjk|2O;W%U)V>{I-*(B80%t$K@aAJ*GGRs6L z2d7~jw#NYgVzijP9jB0Cidp6lRCeEOQ|zyTuPik^sfnO9CsyMS?qXUlBxqlvkj@dXGvSGX5HSc( z0QZEAgu)YOsxeeqNGM4=F(j#ijbx6+qS0Vkj0henjVL6EkzEoayWK-#WS-Vd|ITs5 zh+Iup6)N=>!L6z6%}Etby<8+!A5OA7Q_&%26fec;Q=uU~gp45xCEQJ1khr3xxnaZw z7dLV=7sLrnDrv(Whx%hiVAX4mfulMR$xjB3szTB!GC7T$)2TUCK+{vH$4`^e(PG-N|)M)aj|b4iY1?HQaCiVq08Nr1RgFP0!UwZJ_h zTMz>xkkuh~5<<*~N`*RSVBQ0}Ng|Jk5X^0IUharM29cDh*J}MFY#9=U(xlQJ8quU90Zkhd&5?sY0^~;?lFC;kdv` zogE_4tP309FP~spgA-uPR_k6)~GeUa2sQ?c)lK znMp;S4S9p(LtLE@1BqDl4`3gCV(tTTPagAV{J-v8dZ*;6J~@GPv}WXl_(dlGEAj!X zh@crJ!HNh5fc5W8Y)qWr5NxGztJJ7NsYD5qXl5uPVdz01>>Uk3bjj_^>xLIwzINe0 z>`H!OSJrSBiiTq#)@Xjg2cV~krrYo}6>zlN%;0FSh*O24A_yn5(M|^H>;uuwDyx_F z*Zs%YT?|p_Bw)!#Plz@qe((ljPQz3p!98Us7Sc-p*pB(=yXE9J3Mfk!vAjoGM~=ny z5&=Rz9lFakWj9Rh1IWnncfgF&e~jRleWo(n)`OFlNa2UIuEn&6nJf{V<#u7<{Qo}| zXyS1CQ4Emmp}7wX`9HJ)lK%iF+QVP?Km#P%>;^`uF7Df+Awo7A8GhL8D38gB4A@U{ zXhaNru4~mbb!MwwPBPAJ7;Gdyo9f75S67$Fw{AkkeJAcQ|D$ZUF$P*~X)Wp0RApjn zYr8GMCrVDY#pP-$l`!t;&C#B0)NFmu zFd6!kjgE`WtJPYk*6&L5*VMP)Vf;ovPEK9fM0>p2VjMl^#_YG3?)&Up6qlN~HsKMb zE!cCV723kXox6L3^8%+#5_u>GhgNGYhjlPoY8vsYWHP%J9k+I!nU)~O5`4fD!xFSd zEx|>#6*%IsI1a63!u+#9#0+cVADMUm0RQ;$7N+>-9n0=GXqkC+SdBw?lyQQg-wEdd zd2pMk{jdOo$HfoaISnE(bTmXDF{+FRNT#3t$AY>nHZ_@So(leV0>Hl$Vf+ynE9-Iy z-(XynQ2t2gN4Psht&^Y>9R#JQM)HNA6jkMW06|DlioR)Q<$&45#z_Q#nP_UUQHCDP zSd&`J9|!=Xvcl<@*>o&GB6E!^G??IVnG&?;C_sM#YAlB4;hSg1KrC;+nXwNi=)!j5 zDJ%z`>w9A&LAn9c`eo6B!z}SNWTna>R z2VMK1&Rei&0U|=$9pO5TqD@A@JSy+3E7G*T2AoRFpl(A$rzVv$CWA>?G8uhBP#{?X zxN6Y|d<~7J)7RD2LCMTEgbx&DRO^1u&B6x=cTp4yQ)po$Mk%_thc*xbcy0;Wn#B-? zS+p0MC)0|s9zCO7m3bS%KN`o-LB)fJaCcyk5A84<{cu+nL^26UB7Jm%0~GF?idHg- zNGTzqq4tSvz;Qr_<-m^>tiKT&-}?A?zToGViNHXh2^1Yrrrj zw#xMub9Fl6v3R|W>2wL@Yx~fsmS@~Uqx%7jykL09X4#*2$?Ma4Z=#y`m!{GO1Cmya zPRvYspYt+)Vo;Q~(OfDuqW!wq*jT?0OoNWz(PoxXRGF#dCnm5$P2z)8#ffPl#00vP zI3b1QC)j{sHAP)3uyazO8I_qy2q?#)y}VuwnSP_ zIX9CCdz#v-O6Rm^d$vk34LQ-(0YRi30HeF25`A05pLI_2mB3}qW6?&|6$ z#W0Hr80BM-v0~uq{t2J`IN@KhO08}%wKuwx^$jFqjgs1EZ0w36lk+~8EUOLt4S#oc z7paY|u69xzkg6R6{u8MU%H13zDKqJjnPg>JbaO&bPF~Ll;c3$GpC3W%94!|gNe3}W zz~KpTRp=n~4`IRUfXfav4IA7S1JsO@G>ngKFueP~NH#m+z8LK&FjR4^c$MQKq(cbU zif~00f_e9>dY-v5C_~uAMaLw%s~DgQ2x-->~Ae zPx}{j4z9eZr{hbPE$Uy{aoRvX|JfIKrqDo`6q7{SAyQ~5kQ$0p_zKWDLoTHst1tvkG zAq7JRHP{x1n9Z!$K=|1NGV)cJvjX7;=@2a=<4D?$XmqSWWPJ+9(gu`Ke(&JC#=3ZY zddV7Q234x+Xj|usC0j3Daa(9%*Wij9XNwPBx^VriThHU4J7+x~w-|zD6A1s}#=-fC z>W&Sz2?}&KHz%grgT zYXp|e>W1j3I1#U61{p~q%~p03sU|F$SjBN2jfzMl9L5k7#V$o6fqZ&nSsrnuLR+tu z$s^56ggja-$4ylpEsrjyQCPHX(%`Vt%!+Yg`r;oGPh}owWug6}%BXxjf;5NDK50Rf zyg~I3!54?{P2!WpH^!%G)XQI5jvY|MChl-*40@+CE~$t*l2k7^qEHy<;bh7WjY4&r zv=wLF_eY&hJ;p~Jq9g5&M*TGDognOV5uP~gu*kwm3bTBG=omUFi7pfGgT=Zc)r?x- zs_bg{!^)LF6>H{h*~cBTa85^ecXt`?Hft_`ArBY>FfoO_{ zOR6f~>k8OxX0yv>q9S;-Y2j|Ps*2B5HvKF_J6Qw+0WJJr(UaKk*zj~xZY7d+6d<_N zQ&5fqBPdg%-lQ@>ej>@bP;d@G83LY2V2hPRft}4#FY8MA!w0Q*_sr^9W^vez0h6a) z<#m~w^8=_gR|WLZEasR$UiaxuH*~k%d)B&vwewbV&gMs7Lok)M*c)oj$Z!7mDIe=v z8*DwVnD^LKXEs&y8u^8PThg~Y*m;JtcYgnMvO+`1lZ#}^J~GkIAw12MwFaZ-ai2@l z$$l@ug0*pDd$}k^MS$StxT2otv(?&$S$3N*n2iwaU7QcJ&w}<14YOuV33^d(T6A-i z!{)epUv+$z)}RRbA}*KR?(^A*7m-Muc!9y~^%W8BKtyatUNAqE=6_I3`e>d^h_&R0 zeq`4B-&97N?RLV_6RqeJ8`$a1+1aR>*NRyY~u(<2Zn$Y8QuF0zagr1=cv%US;) z^C4)kj+5*s+awH~pPlGS^3dU*Zu{Qm8xp}5U+<~$MJqSl(K%2zxbDpB7Og-3w9D47 z-Lx(J(>41}|JbHAqqqJpe@cG*orlf-<>x$m`RNP$BeQFxb1&Mo;lhNwMQ;uzo7+k` zYhxnqyJul$#hQz5xMg9l-$|XxEcYh-r*J-W@(xk+M>($u!7m0q_fb3w^n4cQKur6r z@>a=GLA_v&a)_xgGLD%{POH@kLXDxe%<04=#sfH-{aG{?K}WpV>x~8VdJBzl_pstL6PB(9t}@!S+wG% z(fJFFku<}A#Z{yPFK8?L=Z~J){Ov8bG^CfLHdn>%9=F-+CJFKJmrV=RNdu+3>E?&|~@SO&8tY z>RxBITHEUDF3F=kvAmk3umTl5n?#){=2WCOtJUXpQYp_Ewv5l0BAd-|T4H?_v0f1~ znPM@=g3whVSt!I2v#A8c44vhq@-Pv$r|}A;-v!G1@7YriUElvHIv054vxbJ5pywV&O{aRdc0wl zTwaqYtC>uu4MT2pIOigcr9*UnW;IiG8>i`-Nh3h$(&XTwjqFTV3V(?`%hEW0QCC(9@`anC~osd)`)AW)xaAW;8VmIBuryoPel zgPcZhP1GznlXAdaGOCZ+Y+k1m6WN$D@_Lzaubv1OhyW5q6EFym&jo|2DC!9@Q(V$Z z(WpZ%Pm!p$lts17gcIr|sC_A7G$Fxd^)$hZijq2p9Uo3n$(GOg(vU2FQre1{;`e^` z;Z>G&f)u{PI1uJg1MY#iPXuf**Mk(5+3s*qr7LupnMW!~4!;{Zj4F$(f+Y8o#fr@T z0ks`LJLa#!av1D()YL~2IOl+cpgCHZRZc{~_mRfOkQ4LBh_w2eQkF64g>S>gZwArxZS zSv#Rtq`87|<$T5Ypb24DJwC=pPhs%Ev!lpXA?g0|*hJYc&eg#f+e(lc%!)EOjI3-k z1p);jDbxi%nQO-x4ilSVz(D@%NG20QSl5Jj4xOTFF(!#BHI1M&oM)raN{K9%r<@Yi zA+-nE!R%F{wbU{Ir(uF@@C>AbGno-d12VvOd6>$WCag#j#rLc=2)GD0F8b19e&eCd zzxep)=PxV7Evbx;5AiLs-(OhjXzyKmdQE(z)tQfks{;!Er&rv0aKsbrpLhMr?F&=R z<*Vb@UKvW)_6={^e&MEh}6H*dV)TlfBwm&fAu+28_;bfS`Z6c1yy4lWG;L95mA z?#W0nLQ<4!AM<+A?t0W(AtQk*xf5*{y3s&D;jAn(IOKOVlHU*5jF@b$v^rS_E@8q%wr_Uaa2YQ9e~bo;5FJb2|} z8l&4$fALwvXI*{fC*=#0Lp6ap9u4v>y+_WJKdjh}m8n?F>1U%$s(4M=YoHSet8xxg z+qL8~Of+L4q`@jtT3P^^a$r;x?Y1WoexiJ(j>VhGqh8Cs7+Sf!k=iyAjZsVuIy~Ce z=8cw1o2l@-2j>{tFg9t!zyPv52s#&z$%Bxah;37r4Y*;XuC-**~m!B>nj!IN1l3g{MDB(y*3f;O#5wKopH;C@Bi}t zy(&#&ZgNGbyQOpGg*`3zd9=QCZMG%u$tohZOLOrKzVOV(;RVYdz3A$TFShhH4mNam zT;1N>yYLf*tkYso)tUb1CWz_LN zCtXkZ8{R*;ODD(#$)ysLv0%`E9ZRa|IDIj@&^u&Mdo4tfNJQhUP$W4)k%@g<7Qv~T zcR~Q!4z5t+1iSda(kqsoHUF~3{0%d2<&Ryz=(<~OTzLJ#PtCBMaRSJqrs*fj0!}#t ze0(q01ot1744bJ+)a21W?(2_Qz~!o4dDMj^`UL`kF``jV2Pl*JmbTWOzIs4W9~kKr zd%lI3P=TvQ?y3bOO5;Fe_Zhv=2gp@(Mzu;r8e64mBmf0b6QVZrP^b}yq{EccpmY^5 zq>OEioqJ>lMQunF+uBfdn#U?C1OYXMGFyvKpIzh$~?8*VEQVBDcPgXr1F@ z)EbT817b0vfNA zR^hZeuWcL5E;qX(^R4H9IpXvfdfm~-PqogDw}$K%Lt`<`Z#f*8I(Sfa#TBT-F!rDA z)YV=j+<4B#<|;2nbav4aL>M^S=-`I<+g=P zhu(z7sBqsQ{H79tVsi!^0*=5^BysXN;w62YL9U0il(_pP)Di?Xa9Cjz_%J;R1@h3? zz7X7_STt8>swc@vCUS6zw452urWn8p(NJP8&Oxy%kwCvnT|F?@!C_2%2z(1{q!d>( zAXN`iJ0`h8h_euTtN8d-_D`@KO|G@L7$q3owumcF`{T&(zU{hxOCqk(Tl7`EVvEHw`m?Kl zO1ip2Nr&(vbTz9N;lB#XTDYxyISb7&_4$iv(luEG%(Osph+0qkO91&qmMz4bOzaZ1 zTA`4e%z8a$ESsRT(XR{)R?yIf7z-%I_QDimd0t0s+k?0^NxT$tK#K+xZ$&aCQds$~ zj$8Pfwv()N))!3L+KUj1o)93Lt$v%2Nf2c=*mXOEmuMYabbOv{r|h?gd)&AeQ#@ZD z^#!T0>+hn~>@MDHz1bxTd4q(59}GGHa&|z}cty7d8p4^T3>5NpY;`(8i7W>fq-;kh zq@dZtyJ~bgi{^i`_a^XBRo5T*yYIc(_kAYIESbz?nItnwCJ70Uyg-1kNI(L}5`==dj_G z{u|iIuC}DfsGk=V)+wf77*5uF5*O}w!MlsnFbfL8zzmYYj0SEG3qo$v*;5d9x%?Uf z)hl??;ei4*AO?(@KE5NCn`kg_LW>%9g>4|dR>#z<3PyHSm5c2G9#BUMHDw4dB_tw{ z2&v?v@tx;RY5MHi2ku`msiAW0ycy#slr?p87W z_T`;xCi$91C2PzPPfba)E~h&%R+mRJ##2av0l;sB;9Z;S_K#lHkWDy}C8|l*FK*kWy!~VyD3qiG;%iS?iFNQzzt4 z@`IDj6d^NmIfdPEUJWn1oI5 zaCp4gckkXE%uCIxE0v2k&$+E{`_bjAPuTBXcFy#sLo>gA8#pD09k2AiIZi?Dz8BcC zV`tkq6bT8um`GC0SY2kFr&$Yak0@%)2ya=@ptMgnDKa{nBdCTF;^9Imq%i5Yt*BtUy|| zgp$Q!OTNzRlv8ZARo zwy-OevS7gklc|ZUuBIjn3Q-9New$#~OO8@n-I7JaS2-m2Kn3~9@lVwNIG7sW0!Pq` z>d*L%HfX@uBRnkGC1X9J3USE|7d|D%2Au_v03R_5^eBG8LPv5Jmz0#Px^U9ky73F< z&o7(SnwM7~nU}gFg%c`lA?4hwCoRfsgZH^=##ISV;LTCd+OpV~u{9pEojuny>8y0B zYMjgeZ41u33HTj$@3*4)`lQ=EtDs@*+PgpVg&Pxr;Mhdj_=3FPv(YKZy6V}!P|yo+ z6L!=Gu9Hfnm8c{|JL|xOdsT+x0A_k1CEWXyeb%uTdOQ6 z$Rg3U7T&romU0^uZa=Ed@yVsU+{Rt^^@5G%Lwr#EfhB12JA|Z-oUN||56u;rFr}ezH)I?s(38P+^tkL`h&`q=U*uv>5rDzHH{w~ zN>=4>VtY{qJ~5`SZb5T<>Dt8$>y!=tD70_GgqhQmqi3D}aQnBrW?Z05xpeF~4UzHR zSiGomc_3cV|6a%BG4>Uc=D4AGc@-|njn#6waQW_`0%_)4fwYs?K>Lnb0}X2T#DZrP z!wa5)3sLaw9bWJZ zI6YBlm9)E0zW~(Eu`O87u6YV_Ex%?#m?Zea|{=|azfO4?m{IF^!h2cq+K zj%sQk!ZkLIX&#G{oFM~JE-bLkgtnV4X;ozU1Z&o z_9nf}cUD$oo`bl6CNNt^QZQFTIqRv460vh6tR1A_Cpon;b6(e~`3o1U?P8~Yd}ZIy z=S*7Ef&Z$uUNcx(#x1N@Ys)xXaF&SOZns)w=1Ejpv7fTeOt;PEbi+Dkd$2t`qB4{B z#DX(JxI{z(p^r-dz9nr$tDQk>N6Pu0hFd(EoR=v!Wb|a(vW!U9&wx4_uk?RhYbe5l zvK7^0+l1-D1uUhwI`wm=h#gBWprWxCT(EfQg1PgF1@USA{8@{sXzbj%OUaW`GHX`V zn9<;`siCR{S_gRAae$5{YMtuX9A#1RqDG@tQ$?E31Yv5+e(^0FB=r{7$7D85#gyi{ z;DV0%9rG6~2t~^q+I3SsK8K<@P+D5Xj2X>DK^P5})J{?44s##v`avpiQlg`L0%kwO zVM1^fomgc;t=|ika#p^Vd63)zv?aJv0j2{-j#xv2VadM0KNP_kUb7Y}OYBIfQ)Qxy zW=UTo*p@ChAJg;&^ z{1KNWXg7J2WtGKwdUIjf^a-=4PF_}-93SvD`aC|l!aw!6qcC_y)4H13ndeSkI9D^V zyKuox*WS8mVrfe&=6HX;%QCHX!Cf~rjMs1|@Ap(L1)L zUZOytGJ3}XiVkGwfj|oiZb^u!SA0x~f#wOyxGJB5m$FX0loEHf%$iM1I(v4*VZCP0~|_W&0r~BrUbiS-1voa zkF)EC8BNW2>q1T7+$6|(gqy%nk1AjB)dLRZtP{bI+DKh7_>gA761;OwOWL-!_7prO zrDXl66<1BP1>N~glPgA-wcr2EwVT;j#&*_@)h(Gi@4;I$-OO^sFIU_c@J8H@JRgb% zTb;#z|JZ)l$=OOuxeGk&Z@ecRt!SElPRoJ|Hhrys?t&FZ?e)6MJ4@Hb!v!-(FS`2P zpPu*Fyw2*PEsuWYh6k5kTVH%)#bya>VrVH)gS6BNrtA}Df-fq-E?irkrWWc(IPlae z;uBQQt*Yw8xvFnH*>V1|IhS^J(zjGE@zP6|q1@i?Mda^Y^c_@qCT&H!%5?smbI)Dg z(XqU>rcUUpH{!!b804&gjoZH zvQ_ibk(v%Cf2x}9{0`Dqi$Gw-wrts@RO0p0OO?(oog!&4rQGC0$ydi|>O*do(L9*5 z%1)-|Y|wL#e~qHc9p*7y(|x3cc0%puGp^}AuIlp{GSt3w3XVHtiY_zbqj+!%cnN-z>84vRdz$Quax#x>KwzO=m=B&G@8iN_B_w)LM$nuQP0Yogtlb#&iqqmrWr{ zDXT%=`7~?3%2Vi#PpS@feNxd^K6VLrignwEM4NjmKfO8g>CKf-DWISlb|rD*8)`97 zeB2p1>knS)iJJ4+1KMf?lfKQp))VDl;qzF0ev@|F&U~Mz-zGr^Xl80HfabkH=yqrW z`24qj4s__V9esXFdn@{QXRy!z)y~J~xBfYOeqxO5&_ZOf`%SwHgrOa}x%iB&tK4Vp z3-~;B=(7&=l-l`cMg9%$ufpdk{BsJ=Kd-w2pC^5i(NRwWzhn;x4+Agnsy$`i#peb1 zOrFbsDd+sB_cN;}{)5l|;PXt)Isf6M|M1d(cq!tDMR4dik{SMueajd`Em8CeU9IKlf(0PUi|BytEft zN3MNhuMnWEPBqqt=d>qUuqq+PsMZsuZDVW|Q6z-KkFQm)*^l!Qn!LteXd zJzdjI|22i<*F95k_s!Sd-}L0Qm1DaW_BG&#n%XHa>zME?;Co&yLbZDD_mEKVI%0eO z3f}4!v`GZfP_*XoE}rjbsGoLL-Kgp8%k>@88}J|Z3J1}~A$cy^@CoJnsFj_PB;6LC>$_xa4SJ?N0k!I&fm3k|-~fWD%_8F%E_?c!`l z)MV1mb`+S+c=aMHb+*H7v*C4=-Hum>K8~E1KXucsxHyJDQhxD=ZnHW24Ly&a{)lh* z#jCi7U;F}3@rxeCW3r@$01F85h@S2bM_6QOrTyKmL~oKd_4psmN!be?}||W;iL`q4m-KcblO;5Erp`$5FjSX(V}9p&fZWTsgWsmri3Ln-}<{_x7^Wt z`CUh^|D4?O{djtF-tNqv{m*6gef0MK3=0x5L$=D(7HMY8!Y}BgjbU0!3VkbzTY6QcVLR zy>JrXos%Gqi!zl21xTbVi0R~lLen4#!W_vdj&P@mknhkJ6T%gT%?AAXIlAp86UX(N zIfTA|NHLDtmvXp%Pf3}8ejyMJhyf%YD8;dK#B4%9H;S@Y(1-g?KZdD6J=$E&Y9zV5a^-gwKyxBT#Tw=K_WLxh*>hnFr} zcG*w%U$X3iOFvJfnbU5yWp2N*b@RPU&r0rGxB0Ti%jeG~o8zmHmg_W62{9JiZ6o}f zxvbzK?q@g|Jx?fLVn}p}IQ{HtrQT|Y#YC$CI1=N`X*7z6J|Y}2J>i1|2{){b@Wk2( zZ;S=wVU%MN3i7>3U6Nd5mhsd$S^Lj2)`1~fP5iV4!(S>5Amh_&u6AU2E z#xDK4yfuD7jp5>bE@9aVt$Gi^f^XjB4Z0E~vEc%7rx0RpO0hHDBB(tQ8>#Y=xvliqm!ieYyEt#>}h#eeLx#&SsvQ{w#I$?fh=nyrt(ZV>W4e#$~^> zd>zr|ddN+o92bgN0rVJ@f}dzJ3wq4T^_VLV#?c-ikT$4wX${6e0S>eTU4on z|M%KE1}5kdnDHw1Fv@ji8^xz2A11w7d)Q5ibXXFlec}>9O!jv5_X_J<@(vMrQnaM@ z>FZv3S$oGY{*U)@~IR!f6Oo8`~5TlOp6b zDQ*_Git=`GzbJ}|!JZbeq8Wm8uefCQD)9;YhDca~7m*{Y*QiChSX8Rb1n+v~O|6Of z1(xZ=$iK^BZdEfpY4Bh~s(2)B6bK2@z}veFPDJye3-P87;V6_oA%k&bBnGjOV70nv z=65f@a-A;0@$oC|9T|nUJ&L#eDcYna`xj-KWc{B3ZeHWK>D+a{$oTX^faWkHZVIs^ zG#Xwuv#m_t&h|5r5r)_)z#opAE>@_mAf#GS3%KCnda4jKjs8&N`+O5o*pLQc2*NZGJABs!; zSdv@@x6$aD%kMFeMc`iL7TuUupr8;fizO-W>hE3uB1sLX=RcA-N%+81{4pq7V>-XWMVfPRNo9N&3Pw?i=m(n4b1 zh`~_wu20U6Wxul;Wsgca^<$i-;`5kRBR$@weMB~SEe4B5YSl0{zs2fB?K;-)(7c*C z`2P_a_5bqYX*9Kq)2Q!4?PdKR{2SA#KXCdq`m%PiFj|*_Z)Wjs%x)-@L~~t(!Ic*2 zlOVidX66Yx-5W>=m>@|Z!%>5{8He+cuCH~@z>dviXX^@GzX zpJ1UY5TxImcSN0V^Po@oOxkr4%zW^!ikY^t=5sk_#sf3goV}pJKk@O3!fC)v-x{rH zz^;7@nEA{w%Gp0mIZ}1$NF2_#K@uhnEe0tG6o{OR2Bp6FBWXEEOr*km1U36Ua}sKr zhEp^1OU;X{K)XzE31jyOMpP^ChSD;s7Ifp?#ODfEv=p=3aUIibv`glVSP5*DvL3VE z)pHg75>v(0fzaupHtX0v_I&Cx_yj|-XfA!T^XN#Gq2c93e8P-85%Dj!4!M3o&DAXi!?Tyojsg%^nz_4~v>Yb*fbuDGCVbJ_YUnd{bXb#&g5`CFsb{P(vduUI}ae09w& z{f_>h*hc$;XN_7Rtq?Dox6F6Rtf#LmE&trPtrI93CIC#{&M{enO67-#V>00Pd!4cd zRSi%S>)c%qhrvsjEC41Az@#Zom`vB!rdk#HejL6};d^hricf#o?1Y)3@s|Yxnlc=* zRjOEu+-1R_83=BZ1cjy+C(>k;s?u>yRb@^4OKZ#0C8f!?38#MqXC*k3oq%NU9!D~; zOPKvwM8{48zYLZdC6uViNwmu6{uxx$_o%2BANfe6e{j%xd`o`p*71tx^P}G1GJWFc z@`q-`*>#*4$4*56$$Z`Ri-Ki|6{&IdUyrVzKYL2ux~7uPf{Qax%8v+R!B*V==E**AiV4?B!=*E^7|JT!wWnKbCpzOtn2|i}S_-xn6#3 zU?Xq6b=bOyU}l>(V=eG;>!7!39h8M!!YXJZ7D4i3SOj5~djyaN&rsWgD=gkP%gh4C z^@x}92p91+#2$l>mJl8?Dt4LSs(?c6Hsqz9?!DqOr@c66Ig;pq5o*AZv#Fg54tC1g z)Z$4O2!B3_?Wrl%IODWFSjN`}Q?K#WTuC-H@Nw|}U6@b4s5z;@d{Urc#r;S-IkSvg znU@T+Ra!r6s|=YaurfOat;`M>Xj0bB+~{Nq_gzRcc;%U{)ufDb7H2;!&i;?GQ9k(b zNoL{qF$l`|o@#tlI(WS^pNWKJjs|_N|eh8L(>}!~W>9S5*dlY%ROn&B~=H~if zG`(icC}aaB!Ml&i&t%&FP2m3Eo2L)=#eiG??*jKFrwRAKK;N60r~AJ*aI@%>*Z03c zv66l3@y(R%H&@d)9~{X%-S?RKP2cbMJ>SPYcV_Rw*%i3w3%KWk>^=7(#*+2_1uLfW z{%QU@nz_D`bKhZByaB!S5v#ngr zzc~lr#IoPap>O)O;Hj?cQ+M)vJox72>^&}iPX)N>@7a6GiHrJN@JKwtJrXPa5sw7I zLk#4@HJ<1;XgP(OK&_}h+=0^PT1EboK`((a^TS>OCuZI!{vBqBKG(<15FgwJ%%=Y( zm_5-o^}**=a0gNQAqNZtw37iXdCvaTHcb}PQ+v^bo58qau%jgj8x*BOvqiH_^Ms~H zb5wI&qZ2eC%__}C&DQK!$20?|rVc-@7Q7kLglRKY(9#BzfDI-mnEJxM{-) zpZmJa*z?21>#&ls*CYsG;TSp_+KWX!K=``4)~v3@zR=Cxa{PneLIMZ+Gf!*gX`T|X z*9Hi6@_GqAJt4e9w9`yqHzrN*JDt8X?PS^=I=Pi<2h<^+eoE$Pxj=5llWppg;*ap8 zT``KGMkX{iB^z*S7w#PBM;^#LUBzG@Yo*7tcW#KHN@5Wcvv=a0+*joSt!1#y8#y#h zJH%;#qTA`z&ZY|`--;n_nZ{O4+c-^}F>T4TZPT8Zc5K@5Y1(Nxk>V#i+7sw`^%@Rm zw)ceEyHFxuBi?}!1D(8@S7}V`kq!qK#T-z>-cWfu;1t>uqTp}?EYYC^O4AN3j_O#V zjy4373s~BodHjBrb*h=pdrm;}xL%2L~G%NU7 zt0hXFbkxgmn5frv%28ktpuCFflZ@hSsS=}@r%aGqlz45rMezmGEo08qAQIH~NRAjr zlgp(S(RcL@2`TVBN?~Cr{X`iP=wGSR)tV!Uorq%35e2^7VdEh#13wO<%38`K5zbSL z(#Bb=W7dXQ;w);s*_odfW}Q8HOzW8;4spgQd2Op^3}8qpMeu_chSOff?MvIeOz?(@ z$xg~^FscW6P5agfqq<7QJS=o7t&-5v(IN^hlbgn#k&&oeMp{98(Fro6YKOWV5?=>E zJJ5SpJ18!nAL?OfG{)hQlcf>q49$TPMzfylj`2!L3MoubTA@2mhbpXjpIC&VcMx|~ zM!JS^*N}`{E#h?XL5WZAkf;jbuGVpBdRP37bpxm`mRh!GQIH0;qa)tgo;(_#9<{~U^^57#L!K3`AWVNRYo=H(IC(t67!>QN2Qy4NWi>tII)`~x zu16~d>52ND`or~7JyD>%CQa{(FH)Ko>g!ZdI0*p~i8Uvc@EoLTIi%yjJu~JnnZITJ zw)wI!-#$Mzf7Ser^ECoqdgdRd@8*%7Jq0mH$DTxjb0gTQnE`B6C?V;2j#4Q}Q&;6F zVIDS943pj*#8=4=ptZyfX(El^gB=55;*6HYQv#ROnp`TE4N7GWwn3>ZCagj#>3vWt zixEpkQkg}paTsTV1Ncn9rE>3}ROX;mr82H~rO+hQyKX0`JQemxLLNjruX08XrzYu zOs=-<#>jcg!mrph>|((Shy}Bsnr4U?kEj}kAmM#z9>e{-58+qBarA-vMIl&@c10H4 zCq6TDzuG=YHrnU&+&8nf2W%oCwMRTmlK|uUMr3<$>@+mQ&c1er}_Y!GLh3jP(+^XM(D#6%aiWNogHOFZftaEUf}j_ju#0-0ok zSUkxX?v|?1>P%&<6jK}y?d%xYA2G5&Vnv^NAXy$C!9&9+ak=y=`mEj|#tCVK1>y7) zaVF5en9bgLa#G|h4wV+9?MBigm5>ZfAG zFFxU7f~(N#I0f*W?^RhLt70VNs#P&Tsg;CSM@$rA$#C@3ft%$Y(g@s+CO_vv3eetrKd7avrSw(sy(e|d+{V`F^yJ`a$4*f+%=is z1$l;CuV+^gJcZ52O##1M!1Ypz1?;1wPYSj0+!^Mbd}y z5Xrp|j0n0`F-ZC__#u7BA>g_M5O95XjF0dh=`4J1gFY-~G#x5s(1*o^)La2Ay0#WD zp&&%fh6<7e;_(8u7$dbx~wJFmoc@D-hew^&l)S=)q_xDjtmvL`546 z%J3;c&*{Na!G1TLI3bKzs-*~NzzAu;Nbr+`uFi`is5%Vim&;4g3)WiP2IHEq9;blf zUtKT)gW+UI&uKmta?*Swv94;qX^KhesM}C?wC;^M8AoEEkQC{@x^!W%^-N-atL8@- zL0IwNaI(r_Fc%V|6y_L(q(tRY(sv`_RrOu7QYi_Mj)*8k5(S}82qM=|Tnf3K8_Cz} zxioSJi(?S9A*@2l4YD$akR+7rxRDU9=aO2c1SFvdDHtaJ$HK$38dd=`YlGt2$4QQ5 z_+6P!xPv_lt0n|F7E)|w>Uc^_#R3onRykv;AIdWCTz+N#(<6|0I-EcFT9s?-_L>v-~~@Lm^Jt*jEm zRjDemDn|TI5TC5q3AwS#q_YCt>YLHZHneVOeWJCeRTf&6SZuh~(g<9K^HIvG)*?M8 zw6ZO@|8T1`@(DgR?FYGDU?={R%~b8a%0{$29FEf zW$xtKhZpW~+)utVoaG}_B?}7yJlCMmJQmB{ShuQ#B}*2UY%Y;X@_aC$ zS$v4GVRDj8@Qeb^*_UNG`xU^Gk8yUCZYdQ@17qm9*dTkUKC%z@Jf7W%o+FBrZ75?a z%h=X3R+b0GMEvkjkFcUo)}zYR0maOY;rOV4ISXf&3r^aftm2obkxXq&9j58G-W?i- zV@)CFV?HMEG2ys)2jljp-RsxRp3%6iQQSf=jc{mmZiI=qDvrvnB_5Im&W&2!J&|)cylb4x$#+c_mDMJgaTljU zBr{WbopU(+8T>AiExN0q!0F80rG<}rBIj(it+mpVxC`glu*1G%K2h)$N`_p&yhYC2 zYKu2gwI88%2TOv1yZt~rzi@lh3&m!`VkVSal@zxmwIfQ7GM^GnPa9?Ku(Y22UnP)5Xh z?(g>rM_D~vtZFhhtvW@9%h)J#9v7149x2|QCqeaU27dxfJnXGb!0 z`>?gOYS&N?m~*KIb|5#BNDwxvNK@mmk#HM;j|4L;-7ow?#T0yK1+;4T(Ar(qb<{rT zI%~jIpeuO^uMl z(JJ*sn2qP@F;UDJ3(2l7G}=`MgJBSo^dKablR*M&%VFB}3aO^RExMcJ@?!r^bn*{BkQ zZg87H7>Ox1cbd^rkSz@7SJ4jv{D4z&2?2}{z^syzs7OmV;0?bv!IQ6%^@ImK;XzM$ z&~rTKnV#c;-iey@PI#bq;6XnU4?sfWONlHh2oZ@R6k4B1*y$Y@!6iSo2Pi4gA@k1H zAaOcx+7x{7)(1W}v*Tx*Hfer+&yRQPIPW|l2(iprUd&PZKED(Hiy0E9g;z zATJG?$c^#p4a0_MlK23L&Kez!Peun6Ee_NrUr_u<>rt@x)t@_idhd zi;H)W)G5x!#rvQqw&ZnPR-+h{aSR7?fJL32&fP-eJp8cKt+8aBH}qd1e(47BOMnM4_Ja5t;sq?&xioQjL`@9v@MK;` z763n`p6Yn&sg6em=%xdhgiI`|SnMw3w*st$MT@GHDp-kA!NoHORJg>~GBaO!rTdy| z#HG?*nRjmJ&xqm;Y#TwP%PiL|&^#?nL^k{4QPr%Wcv7*bcl+Jq1Pd$EHfqJ~DLkRgJz+xIxHkQS>SQw9GS=PFGPY%GqFxLO z6B7Ec5fKdHY$J`7Qm1i|;W^H@=vQhf!`c{6Ru{_^4Z-^IK+D*C*%S=t zf)0&@+5yILal*u) z-1%RGU{K-={^Bc75i+rGJN@rCdQ^Umvrq~?6cHbE^G|f)<>JpzvI?tF3BuspJ#V|p=y5r z+2XfrD!(NY*kcZ- z+X1q>9c9KshcT6ewfnZ>qx+Mw(T(oWqZ>yzR@8~HajjqlFh_QT)=;s%uu5?}KG3dR8^IKc?DICgT73w*Vj8TS@_KUGvW zdGC~Txcd7Cf4Fkp{7T0tcWRWSG;ncQW0k9{(NVp0@A)a`>R8jdan;j;rjl5GeEQ`p zFPofsfmO1}GsD#x4|^>Ynw8nZChrTCO)J=38)Tm|JEn%uyV*C6{WMe8>SxxHv7cjN znRV&n;+o>nzTJ@XuV$9Z4?@mMgbx&(FUD?hGrf!5qGgc^{g^3bWFG@^MbSvG8Y#Hc5+m| zuAsCBiAOBz#{Y>?Ruqj%aXpYsv0g5cD|;+d=njPnLxq-r7=!QpI1ZLUa99{_hEj_@ z#!;D7sqZTeE>Jw0%&6tULf-!6qjnhj)h5A4O z*!P>Gu_8-C#lAKMAv16x8;=EK0 zPQYzU`XCjmTx7)}M;J~P5CxNA&!I$(gXX%#ru9EyeB$d;$wQyJs#6h~>M+s8G3jw7 zh8I4gon%gvAAIwjrsS2i6Am1hRDESU*^pO1y?x$?WQ5(hcueLXd(^K=h>hKo`EBcp z>&nlmD5c3MCnrGRO)xySKuStk`pM-U=8Z-W$n&}~#R4}=G^SE&e}ugjVOt|dBO(sq zbZJUJDm_UHiwPwlRS8^48oO3&!t?^tY%knjC>B1C#>-LYh2x$`hl{Mln7G84xWwRF zRZwuD3JNazl+h$8CRI>OVN=Q^nWmRTBZk6+*IHmH5#obHN(?8G7DR&7oPtOYpAQj< zwAU}!99%N#{Gk=AfE1}bGkg$$M2BF9*5jYG!a?KC@a${}HN809=U%8i(Wq%8+~ ztd6D8M0a;(WU0qLT)N7N%IYs(#U}d$FR=!D#zUfIWNklBG!B!li%L_0g6{yS4`-HZ zz7Ff!CVX3Qo8+(+rXH^}Bp7+zDmGgQk>YGzyrtG-vGO`O{Ii#48>^8x-|9f>?4VJu z%FYO*oLh?c=5IV878h?R9wNK0%Wev4G+MJkv|^UfW@ibc6DNBICk9}a*Ob7DF@c0g zWIB@?a*)LidmaC4HD7=Hfqw0Q1LFG!ZXzp7+|_>;^!X#={P+J41A1S=mouNWg>nD2KxVAkUTp}oXiF5+QY^BxHG$6;JSardSUOt|0!XP9~BT?SSRYH z+f50MDy+iOk_{>VcS<- zdtC1maaKsr1)g@H?uVoYc8G5NAgad#&CBUY3u2sARM z=Bd8D{dbCMr1t*4*%KNsW*^XM%AHv*^@3Z>!b>!66o|5cWYF6H7Q_E*w*j=~co<8T zmVwuc;&`wT2bp7o*pP|xS{o@KZH!}sP!W@n49rn+obv!i{GM7cOy+&aMuUO>tQIQ5 z&lx43Bg7z^u|o!fUrx(y*i*Yf*2vh4O15u9NxhjB z-I>b{9H|NwRv)4Ga}ppq-hcmwD=xc5yl^-tIEA0@LlG5l0^o<6{B@uy1|Ic;XA z-j1)GdSVV|SdgL4Wur-FGn+YAm}TM$bJ(PFn{)<~j>%3@ki$C87Z3=QFL06N3mxYR zeD32iMHh;Pnm~)9At>u~TBk`cizEo@=xKF7goFOyAFOpY+JApAiw9aZs-`4o4}8ip zh`RQN2W=ReT*78&&hO5gi?@r1u}gpBz5QPm7vC#BJIF9Y{Nfb;qPXIgiI#Pin=EqN zG10Nkag#&lc;YN%m4$HevNDNS$Ob{6S7H~ANzO>lEF%GdoRQ3UoY>1`beoI@ z69}(iF|Cm^6HG#tnQ)P1CL{07$eD>-j4pcIXfqPlw30r7`ArMn0n$b?5572Z5KfvC z`G-V`7>FtyuwiH$;v_aM^S$oOciH$69Cbscm$_~j!Bc_(a}OeF1Ru5=1UrbHPbze| z#M(S-JvVry$tLEtFs;=Lo`O;RRySSX7)j_;x-#kMRh>)sh+&`481Un^R}~MuR$4#3 zm^^mbXqJq6ml=WBV_Hza0Y`l%xcea4o3Es_2DfDP7~Ecq-RSbdJLrWNJu};FH=1R-fC}`Ov@$FRvqkg@$+)wrhtWuS&iY0P#uf1952@5N;CQKw#?>0 zN!pp&@@KIjV}6AhJBunOv62`1``NeG^BK=n+&sshVPc>7z0A#5jGerQ-PnIt|0B?6 zHmqLWgg$d2kj6u7d6Pqm%M)es937*NA}Z`*b|dDKOUYQn=U*%86;EVQ8Bf;OCA~vq zcN)xEo712}g%G`Da6%Ejr`Sj#7-D+Kt=CIp3=ZXfrI4110_Rywt>ALub552*ZnE8` zvBSamo)V;|G%>Bst<~BV+gIAR+9kVLyA5tqWV8SZ)u~4pN*-T2p=ym8KLHe*-k^0R zB&`N9p(7EFiLkb|_DC1dPRqy~-n+VJG9={FH-vp`WD`GgcJ5-_O~g3n;R~v7Xdui> zZ{9mO^ViIuf6H#j-2dMXm4~BMyMC3qixpqUC(MU3U1BNA{9S2Cw|5%36vSuptzoj@HxmA|T1S3i z7;bl}6^Pn~wDd8NMMjkk`DfJ$haX;5d?Z24NK*xKQag;7hQx0frIK1>ygVceIl?yF z1r_e5rfjGiiq|{>#O9`ydGNGh%+fbd zD&jz9lDk>_F{nZXJ|2P$1R(=K(l6o#9u|=UKv8C>)!`Gh>ipN8lIogu~qc-zB{7%anM zYCF~fZeepG;M+c>iF&tssTC`CGg$r9zqNo`=&&xfiq;T$_v{6EzJwmg*K6^Y*|iMo z6*yRip`JUq87=Cwe}MX~p$|FK_dql_>N)07m@RwatOKQ4bB<9$z4TD`iu0Fx<}EtE zIMQu!wp5H>I``^s_IQ!`rNa%Q&zpA%^Zs~kqB9xMGf(CaM52{SiGqnKsnV;t+i+u?5FFmU4eFdbskj%iwzp<*^+5}}L4NJcF(~S+ z!)3@wFQ|c$ZjfRSNK_@ zYqCqc!N%6v*u`cRFf(I*918a@+^ojMUx7ZXW{45F2HrdH8b>I;`9CF294Rb}+T)G_ z)InwXr9}lnhdpU$2D`x?vIad;C@34K$|$XGlXO}wEyTKdU+m3RC++_s#{uMY@DFq1 zAmVUI+))>SPaQQ#OH>y+yy{ZK>#VJDYQCZS+GCloWgdBKt9-fn@@sybd1lu4Ms2(Q z_dnYD(AkrI*f-78_reQ(VsB>GZ;l=N1?yb&`)hB=9I83I>XP%8c7HMRhj%kCvmkIa z8A5Uhd=JmRe`_E{HO=(^M;PO-p+G|D1gs$~nbY^lU%OU!R7 z#`yn~!x1c4FbKZ+OAcA8!vNpBrA(qqzJjjEQS1y98+jF8qZ{-4Y-0ia5;C?JJB*Ss z9SJ11nzoxnr^Dt5Ikq~sJ7kl?dr^@Bi9E_Z_!~A6RnPZ+&d;7w*b@;imByozn@H6P6%K?6;a11qV1S3RxUA zuZZOpF>i2AP`tsT`T@Bv+w7>zwqLxwts_l zzWDNyU%d6Z>mRu1$~PW={r=Os?D-N_oAY`K-4V`a;XY?+qL*0TBH#iD2r6h{?ezo_bhAeQ6hq6NN85_q|2 zAntfhYG28rQZ)|n(_gYUZHW5wiuHP`6Ri(ZlX^_lc;$7X^_a@3jxk9*b{_kb3etCa zEVu9)COU-lE&2|!7aU?&B~59Qw7JHtu(fn|ITudE*@7#r=2bCwJa+&#ZQ_hzdh*z4tw;3;m^g zKL1}+F1TRIf8G1Vb62cfg4v{r#WcI69-%RT|8r|{KvF~qodwcB z@UXZ053)B4TvMmFJM&TfeqD27=0gi=&)O-7)T>x5FTm^^5vJ`!nN+i4z1_<$@m}o} zy_&*85gnU%2~p9pS9}9CS;TYyaq zu%-Yj3ow6x-QZ#CJPdZ|91ojoztDb#UAoc6<{Ft^%R1TlY%P;wd&Pdmb!!#7rix9i zT2OUKl~fh1t8?Xp8J<*xF|viBI^PG134U9W|pg7LGgkJ*WsUptc4g9ya*RWCpK zy>Djz_vlqO#G|d{h3itQp3>C0t1n!;?dDxOnr&rO(NM9CEX}VB ze3jh^`$`fDcS8biPgHM$!`Bek+-uO#l$4KpmUyLd&4dsB)&(n%K6Z5x*j?C0;uy*SUVhfLDeR)@4^C~J z_TZHIyXV}Ud2h>{&D${yjKGc&OG_m_kkC>jsJ`2@;r4jr@$L`mCL$^5K&uj(w^9lK)a7pHI zwkeDI=A9~JyR<4WsLUsZQH@+BGfrR{0Y(;ggvUSNzltvElg$H-52HV#ab_p_66Aru zXJ*2&ta6tLwgX~-n#{~#4w%c#61E#Sj%;-%rZss@@nLAI(=mje=;DKD^MLSrTN4VW z+87lKmz>Q(f zJR>+_@uIH9#1tdgVmNcqXo;&EN*a9Zr(lp5viwoHZQ`SxN1n*?hzqIT(Adu**1JTz zO^69q!Xt_|F2qtXCAJE2o*GnBNqGZyyOoy~PwT8{cR;aPbQPrrce+BO3w7i#&KL9Z zQ*Vd^ph>`jO&GV=W)Im#ot$An4^)aA z&frB|KciI*aX$7Cl3lfjYHAYXmiuAekwb_|3!t2<{V+!FKg4IS+$k7PWmwZ-F2!t* zOSL2>U*vdnRHIa@tE~}B`X8O#GRcLo7@eh1@6w0eVbLmEwQ-%Ootf93x^~)Vf)}{p<9}%E+@jTc4u5Y+BdY9i->bl5v zrR!#w*6DJ@%qFYBpjBv{*5O#}kX@1^hPj9z1p!tm0p>6vHe?MA6j#N!+<>fMD;7&3(@-WWe{j27?$W@rDG`%GLNqkq7 zWU)tLbrO>$w^S@i(r?(G+21i|XtAf>BrubZFVGPZibgml9mk0g8#UNYI)qBxJuHyS zJB0CIKFGd7Ak^qn_Sc(7-8}cKvozoR)1Pj?{e+%1f6}~*C>c$U%<5z&%Wk~&B_HnGt-*cE9SqMMeHNYmspw9C{326-%0Gp5_?)=_eTKbSLxWfI+oHYx*1TwTQ%D?`!y1w=f$prYu2m* z*|A6BpegicSjb~bq-(YM2S2V}vxdPI8cuHZh;sIrbzWE4R8{M^vAiy=`Niav)zX^6 zksVB!qd5Y}Fd~n6EudkIw1LL#+gj2HIP*C(k4JbcGs<&3)1tNW(Vw?G@kI z)d6R0mPuiW*CyyJ25#xpzypg9P<8-MWkFqf$ijsVgD&F+F4<>nMaWbB)cGO12Mp&f zG@C-j-b7c#>(VX@xGgrNDr&d6Jm9!|ueH!w;56IP5{G9-K>I%m=7Hzo39iw877M>hB~P^Hh0+F{Bx(emK?;d2;$m?F&MF~N z)BJ!foSK@KXgWx^+>qY7v{c{VtVtT=qzf_BkJe9>V~%Us#CUaPC%k($IH94j#d_%u zpvS98!^hXUQ)E1g!01I5U6IFPZ>9QOyKqzhoa(4Ff(wKcTfxS5!ExMn+^!RG+7>c9 z;H$+p1phn?9C%aGc*X&q*nmVEM?+b-wH%oaKHWPbx zS?y_hSDbody3OMOt>9v?H!W_GFcQi($=2K$cn2-L#9N|KP)h<@3Mn22Z;p)yp{3dm zW9(xVkC6Zhf0kzl-NTIHqG2#J3db`q3W;vED$K&vx5?^GUmk`RyH$X5r)RgJIxVmo zj0W5JK&G05=)yX^epvsF!jI4jvMq_RcIAcBoWblCWN{SPi^L0xijZZ*P*tDOcd}V* zH3Lg!uY3^L=;dQ*6u;j89n?rFLmqL;FSLq_Q!JHIQX5i|Ek&t~Qfi~qlTImKA6`&y zHU-O3t?87_;`?W{*sH=QG-x=C%m;Pxqs&raiQ<$c;k@(wrL9?*WobI$um;IXOQtj1 z^sUpkPv1XXp8g5O0`mu=ff3;qJfn{3UkkybnmL-QfCF$Dc&$--HM2@6L6&aMn8Ra^ zkCE1oK^kH!TRd;;yyxdh^AyyJo<~U+JXMSK7>Wl%@^0xSv{0XIA>4P35L5ENp$&0M zE3A>LS_$!gGiV!w4(AG zeDY9IJY|h~{ZvnJ4-{4g=&KBUc{R1@$)lJ=7P6u~5jsKH5jEM4v={lSPW$dGMDpM` zs@dC`D+R1Bpf#frK7?=)D9kHGFiVZsv)d7d~`sts9KTXl>MnqV>^f|(}_?~#q2g?P& zVuE%^#Ju^fvXtH{z9zJ&LnPk(q)!YyB`DyQIq2i_Y9B)BU?2G&gC2bpkLcr*KXC$o zrZ|6w6eneyat6gkxTvK_RC$y$=}Ectw4XeI(^8yQOHj)Kefmh`aIwzHA7PRiCZ{f6g3(F^0o)W?O?S&m1AkHDUpzDvO^Xu@lL)j-Q&}WSjL|FoGL@P_Bm9%I}C)115E7M!knzZ6{rBQ{qXBP|* zI>U&HV*m_wraDt?skor|MN)B5%_=az6w`bx)K&u-keZrsjaWmFSR83sk0dHIr9t;` zeDJ4Le5g+&y&6wX7!QPqtc{E)1D>?Eh1>Ud2ka@FVnIq4@B8VLs4; z-V4G78w;cYLI;Zdav%y+lOhYnnQ2AEgmn2JCa^am{3tui)m8@x6TGlsje-^GFf@?P z;CPUh<5?9CRj3o#EsRzQza)MWjzyfZuziBKm0pAiEmo>MptNN%qcf%3P{TP5%#fLc zF@er?UECrWm?n>vEB;vT^&!=TG3{B=e*Ha?}n${}B=gdOo}nWgR72-;q2*K@;Y3Fr0}tPN07c zdzf_!jY^!Rtd&jdXcLyQBoUv_e>7jDFO&65sb5vUzyA4p8CW3>1`n&Od~%+sVOChj zYn55__%teGJ54F8#EZk5Mx}4tw9vH0(^gJoHXaf~w=Hg8*}k=1655mP``e#y zKiaObwTIeM?QgUXv}@Xx^!RkU5)7wR^xD&eUecOt2pG5ws5Zd=!`_#`$5~u?R()Te zYDwL#R-cmkkXqe3yLGhg>yvEDvL#zSge_l42HOZ5BO81X2v&~C35%1>kdVy8o`hrw zlZn9s69^M)X9yD#3?>jZ2^c&xnFKOJFf$1W0eA2Jy{~oHVRm-{%f2f|q*>r^Hlf9DuP1J)bUyzBBc9uXSF zHt_+m@?Hh%Xg|^dUToj>Dg{__7ermr!cP~#HJ*r`ee5ZT{A5ov|9TNHVRp)TQc^GT4KPW_r1{0Wm%0dzy6wKD$DG&l312iCsH1-FkYoK(qZG=4oZX?VX^nCZh z;-?ts=c-Yg)nC$PMpZ0zELE0LahATLrlhKHd-C4X|DB~8BR*s4sq=F}tb+7PY7s@& zm1reXB{)3S*`TNRC=FWJ0K&+X$0L_6{j=l8yND?>bP>NKm|tc`P;R(?YXk+)yo0n% zi^pgCf-xz!nKaQc4Ix&7?t8-Kz|8JN&010di&Ti@-MW05B$3J9Fzzquf}P|QZ`0~r z{GMQKy##BWs6bhhyizP?lUXRBgPV*bj}?*!&8FMUoF96qm%V$KmR(Y&2C)id>V}>K zNyq=Ld6;nY%N`yN@4;|Ll98!s#l|ZLs9QMZDM@y4q!IeP!n-`vuf9w>P3m9jvRpz5 z12ZO?2Zus#l6`vNa$RWR;osXOc~{aKU32+2%Oja}u-avnt)WmL&?_Tox|4QS${vvs zo`OR#f*zdjACfNpruwqFXEs0Vl6>ZOQSgkD>q`TdJYFhiumOgAr=2d|L!QpDrLfsR zL$cl^#52p^MNB_7Uy27pl2P^v!2G{ zrBtEH*x9oGJbcC51C#lUlMmqI$^Cp5BAT*mi1u4Sqg^cD2P`M?0}79 z|I4uX-y$dPxazYSqAraBOxOR|Jaw9Jo;nXR{i&Yv$b3E541s-75pEH#C$|XIb9Hj{ z`0Aozi%@X{9N0@3AD9|2V6$Lu8-+RYousB+7}Iw+Z@u1n->KB{DDRFYR2+eJ z>gBvM+MaBO8v;JT(nl4P;N8Mu_;b?+(Eq?s2q#srxq`cM5rim_5ZC9 z4e*$RVZEo#Ttp~C-O>RcY*XDwyN`DpyOA$#sC9z{x6qam%`||E+ClvrQw_@c{Vc9S z#$&`sgsY-72PRjs0T%CxkH@FthWN#N#Hr(4lE-Ijijt&stFO>F4^wJvu20c6KW(yO z?T2YkL$cv`gNl7sp7dmyLJ@KB)v)>l=tNbCPiWpNV8M5lQ!aMOW~aQtC_iqLE?3z5 zE#+TDT!d8zZm87ck{W+*IAW8+=74iwn;k0tT8?=S_7RnE*cI)y;l4!??tSD68=y$XJxUwQ}xf%b)aK}NvC#Bz7!Nmqcgl?M6UwGh4jeOz3 zH2l`Cr$6xd;dPDW1r^oBGA!GbzuVu^)7^jBl{MuPE^o3lQW=!xfzZIpk8C)&y287D zQ~8H)4p-GJ-LmuG{wwa!U!QEPEXVF6_0o9e&xjs4A%2LdTWf#`VbOH2QcbPtEK1Sy zgw>AK_TOr`xR#B%NDa+JYUn)#P7MnjQpVwN=v~G~Ga9-BgYv;Q5i}5LQMxd61Vpqn z4@JR6EjK$QqoR~$i^4pIbhw3rbSUzIbcJD@7r})ErK4#)r3=lc)9GO>)9E2-4S@L= z#7?wWt*uY%Pe23aD^p>7|C^uf~N$;|R)5 zx(p+_a-N{;C3!B=D%B|G8I6+1BoPkgfJ8^(+JnxX=u%y(?CnTTxylr2P}(e9e;sqq#Nky+Wn1S0}4iRgYI2&{?K%Kf#%*ru~y@;wybjoR@@3fUy!+ z64rkP)<#|}K@#fN9PwmaL(33%`hqDur)bp#xj2grmE^w5^YZz=J3B8&iP(oo0f;V| zs==*@siRp!U6$inS&St#73^KcMRT-^`fME(l`2R(Oc6ENI>xCqTtoCft{ImGfKLYQ zxTx6>%B1Z@UWjaYLZm4KNkHpfg{C~(tQ^{dr}+p49`S!y*6 z+d6Y$kgF!AJIq}3XEW4}*|8QJMtSKRrsvhedGS?@63UBNjq?l0<{rNb&Jn_p6? z!?<6r`B3a#Jw3>d%D*_dSX(^4c+X-ZPC)g(mTf&f-#;+DfbAf({$b;lP{O~3?p}&% zQCox?d;faEW5L}iRr8vSHaM&*y1_03_9}b3UA02p8<+fWwXx_Ul`>FSRoPytTH){_ zH$+z#PL;zbWo|LO&q)>?#kCoWxjJ|5uI7b?#~X0}izW+g1-R)&K|lcLv0rF-;lks% z!$~(^^xLgoOa^$4P#!Ih@kF7e#SN8go+IEgjDar19Deh%?_d7eRJlb?8d}OX_okmt zr_-5@AKtzHi5H*xaR0u=j^UsFRPJoQsZExbcYJN>uENrihq~g$?G5z>8|&OGA|P)F$ejVXAs`0>vNa(6flAzK_Ao(mE05M5uRT?(*4BD(#)ZqFNnH1U zEjWjVF4g8hU#t;N3~Z!1*6>Qtg(v2SrPGP#QJ@trb|5fEF*2h;`r&lZHBPtqFQQ(! z3Dc_b>^y6pd_+1=W25=NjhElncHfby1L?L|D$2K{W#Y4GZIiZW_kq()!!Ik&KR$HB zsh$tX@|B_e8wa#`LROa6Z!4^>1tIsW&JwaYc4MEWZPV`*t8v3ixF!3^`$l0S1Q)}^ z2@!IGlA13^>CBb3+@joSTpYEx!Qu4PxZ$9hi8PV@emMd6%W4~Z2Ojkv_nz{qU0!MT zhP+9y>h-D)e0Bd(Fk^}Ot%Y;ZS&D7h(uNyWI)f39$s`OPoO$IDo{!?PEeH~SJC^cz z)%aWgRe7WA^72=~L$me&(>((%Rr$DV+a9+!xHc@TZAT=O3=X!Fsw_!Cc(8m4^Xl8R z{0&Z7p~zfS4f;i8kg8nbvQCxCeWkLgR7Sxt;h4=`?e1`^ZeM;5)kyOee>*IXhL4Ap z?l4X*Lg6G%Ey6i|yu0rxdSVV=zXpHAP-%6JQ(nn-DzF6^hMeP(Y_%W3L>wGKcC)}F z%p$mMOpNjNG-zxz1mCy+b9*=LNRP;eUR&MxHw#Gd;7HxB(Y6oD^1mK$ss2WNFyN@X zlpy7m-ks}d#MR}?i&z!$yiNJ7;fYMA=!AzzNj>37^aawB5w*26e}g-lp1R|8s-rGU zPURL3B7lzR@eVOAP=3|CfdhlYGYo%%G4@49+2mPQ1O;Q zs(+{~MNiF-rCCETm=A|Qj!;i%ICMB<2x-mTyr`i`HHy!-6y6)GI?c_NIhrS7_53EW zSr+cn3#%=tZeL>Cp$hkzE-klafdgaTB~(+17KHsE$+yohTdA-V$%1w zL3`H5;N~VS=T`WS&NWNHr)Jy5bS=(#-@q9aY3IILfvt=Rta=dci4S9Ob!x#@22D)R z=ifO7QHwqAg**;7lURpkXV)Vu6Fe&#)^JKXOhm-&dYE_^`Db@y-Z=)E->Y%%yE=c? zu}%QWfVvBwp(B79I+lFdGUzMwxiY+S47&6*okv?hr+uNE16Q@4YJIX*ZDpAR^9p%r zlVnFv$MFu;(Gl*L=}&lEZZ*rL)vF;rfp?^5 zJ~A_+5Tj39ZG2th_ob&nGKp1I{AY;TGwmFQDo~V7_slF%s)IKg{UtdK9;at)K%}I59$;=XENw$+Uw2d(HJfZ~jfQ zsw!O+@9)f{j&u1(0!|P>uy|(`N`g7|IV*P43{4+2A`S5RsQG#`IC0KXQx|wzA z*t*GeideU5-S|3n9iLfI36@@50`@UF-%Gg!++L>LLVywf>{;e?`4?RDBD?n%rfRCd=W z5~~v9FdxF_$|tKbseK`dJt=I(>h#gaA8-IX^JUj~XnnfJ$gQ6(-^WlsDDF*B)kuL) za}@UETwnwe6sTbP>8Jk-5(zs&)Opuh!7{otGybBP2k!wf;A1P3zeUK+O(RxYq6cne-^#@a= zBl}{nq?3ztIIsXds8Koe;|xC3^%d)fyPaM7DS1wR25*-&^^(Aun%)M1LxrfnlAh-t z2-c+zke^VfUE_R!57F^p5rha*yQQDhw!HVjR8@Y) zYV{|oO21JXTmjuQzDW_Av`wovsbbS6h%F4%FKM{9ow6*G=H=T~>|61`FpO#|FK(1$ z8z(oO+o*1lsnv=2nTrcqyhqQ3l=>bnv3-ALk%>&rZf`r>)+KGau$S?T^SDGbm* z*6Kw)FRJY99A$y@yEgM0+Vf4SYa^j<&!q62nZ|UDpYb;RiAvIM4eo59*1oE794^rt z8zBR+?R18?AfA23=70Zox+G5V=d>8=Ul@0W(mfKO4{x}H(gRm&mZ0AFHYeMNWTz$ z2}Rfg8j*#`G(U5@NaiwCq~x93RYOt?X+x`qjtm_ex@X7)?T4x9j*PAa0W#tD%yhh6 zS2f82oy5=(q%ZiE>7r$yJ@dbrE{H#;RTEvbsHT`Ywsmgn+Sa|Vb6?lK?vvWjdS36L zN%o6_a%^yN@Z6v}I7^&CA`bl`F5xGL!*7W=gCNcz334V53G`_Y2Tvvro;qEX_tpcS~L=j%zqDYjePp>OE}+_*b3Maxl3UZEaZ4 zfhA_9%b6vn=n0nKXBBMgO%x544wgTN8@lWyZUf~T+ZqLzr*81&v4^asTty90H#D zA)n=WCGd`VVz~{nEar$oySZ%- zcl4Pyqi7q)4|THbaND`I^W61kPK-7|0?eFP!;k6ZgDLtsy?7}b6K+H<{^eH;I$u6>s4sqOXtUYq&8>GM)W+q>i{>=P5YYZ57Xp1?$c zh8DLAZU=e`r`BAFZXaKra%u4^-__2p#nIbgj?ZF%%}+<+p2A~=_Y}?)8b#qaeyEd$ zhYQaYo-Z^MQlUnh__2l`#3A&PIE15n^|zh;(5&E)LgJ7@nt$v6E@28p(%u(1CA;qe zY54!Clcg0s=Bab3+%R3M)R~t_8|f0!8vjIp6EFD_b^6jjUZX$VUVfg)DM-QY?fu=| z7}zmz|909}L}G=X7`XX~fqORo4}E11n-mrkGaWywS&!oQ1VIdjtW|5Hh)4l~jml`fS-rfV~g zVD<2lmIG!A7s;6-SwxN0+>zp^w}hW3pf(0$%l8)*SuDNp=6pj7&Wj+FV61qu_*}8N zs(8G3Px1L;17C**hr)CA?;I5TNzh*_X=9%vTR$)fr_0-(_V@}rm z=c9mFn%-i_<8v6EhnOa1O=h1s^Z*(_bUV70Z)Tp=V%^=O8-#73rA=L0XK$)Yt8Y%p zQ(aGXz1XFm>4Jj$nl-#XbOIj`%g{IU#NwKtl{Ng-tf43pW7^1@NX(SbK4gy6bvdx3 z^nYE6Xa`(A%rv6$+GDKy5#4t3f<*AW$D35MH!-o@q~FBMZlCjb_D)iZCFwPWCc^>D z75CS5n!A)(tUKWBQ)=>fW&MwGaK^!W;iJ+LcRz`JrN67|ME zBpq}dmSnCmG^y)FSlp#)?<@L5k+Q2uE-Ttlq*N5O7AYU|$SO~}NBOWz9&pL+F1gMn zKVp{$@xM*(SL9mdN<~?WyNV^ExY!4+2q==4!s<0ElERJ)nF58jFk3sfh+-UAm#9`) znahJE=tBHjUv<_ z{_&2{mF=fj-}OmqS)Cq=#{_fEv%gKNlxF&kHGiWV$=m}Ss~km+m+mROr&KK^)^S2p z$zB?9`f!HpD6N~dl>>o^!S-Fnlm6&Jp2i9F$Q$>FZY@_;rmCfGc&L{7!^V5`bgV)< zg1Gu)OQ}kV1W4+es#Ek}yoc~$(ZL-3p5V>eBbw!BoT$%QFoKetmsna=!WZ53{`aTQ z+l(})vu%`wWs*+lQIZ_4mgKt0QC)5!DGVo`j;dspT7?dc>CT+osr_}A7)ym@8lq&{d3BuqQ zN)C+=9UVF~bOw8FRB~Mkk!*!^7s|6z&r|#WDXSiY!RLR}iptAz&Sr2#lhG+$i#ruP z6Fna_M@c~yH{`&US-J7fafoJE7xb~rvT!-tL}xlzY&i+@wa3VOEvDAxNz8k`r?r)r z;{;zRp9+UlN|;{c1H^QL1*~%8MBWSwW@ZQ))mtDhkC? zE&LJ3?GELR{IBIJpUjsV46@ZQU{G#Q<%BAQCpXVRx=D7@mOqh~E11_GZMg6}Z2zBj z%sUf-QVy#lu_5O;{MC?VmKqr7+oH7^!;wWhmUbon_Nlg!&5Jr^dDGHvW65pX-d`eL z+q#RS3zr852b)c}vhf^(PR8Tw)SOA1jNXWy9|Ymuz{Pwe2_)UV3J?ZSb<&E`d;HX@K*Vlz3Q+dhKBB zco?;-bHGsR2Jh8gW!x$A)Dl&(8C=m=Q8CTDPvWcM;+zV2TA0R3Lh>OMlMhwBPc++d zYM}LXqP{*!iebeumphtdOKhd^dnSTVlsONjq+q@+hYV(%$jQn7mYRb>)uLa@fbS3= zym3MEYwvZiGOimNhd(rOJkbbEI8wr-KR6_WpGvaP3)9lz|eu6Db#F ztw(3$pjb$rDxA9gXm$VlK6aw7zkRTJz4Jg{&5hTrS!r`R5}R+Zxr4U44)>u=!BD6q zkp4wo>$)%W#8xknTfg$9;v>Q^A*lTRpnMfuV3pD}bW9R(rTsu|oiiL+8wZ zUajA#=9{nYKDPbF)w5+&el71z|1H^K0&{ov!Ne)fmo%Im!7fs6s*$H~+=ZwgGY7w; zv{{>>kO3XaU099Oz!no|QC!>$4b?pmeWY_|tko>m6i*YNaL*!cRto4PcsH;tY@e2Y zt9@9}fZHc|IH}l^JG# z$QrHUfL7vg-5%JZHR4VI@eU0`^K$Q9#&_5_&)am%v`qBTxg;xH_^q&?nS@3X>4iH| zWDQPDrjDl+jIg>1IC`R8@l|#S&qbY;(eDXv(tFMPx#7p^3DGQ`)#{eTWP40*kMEBw zAC1XP1LO688y1EtD;2}^Y%d?>6~3;l(ag=&)g<$t)p2AN3W56g{4cFyB4!sDEiZnCwQo64bu4n=h=LuesVhS8ivBMC>tkMjq2 ztsfs9Uv*<&UHZaz(x=m(C=FE>{0cr810R(AhmNk@`^BbTBzjspFWYg|e^JBsE4FUm z(h{>-dei?rb%l&iTsN^Ya&y=1M%&Ln`>Q&CLw|XwH?ipY_m6C6s>8}I?1nds?`g%p z25D}P%@O&bu-q2j7gpAV<&rR5nM$?(TWT(ph2tuGE7=S-slpXQNVIz4$A=bcg@I^5 zQ34YFw?d$-mgjQ`xJXqXDvU6bjlm~hv&(urT)8^zVY`Z}f%%$agI^B#WgB#~y}qJA zpm|mcn@CMI)lZWrmn}W`14YS`-#pDha`Ft>=0mLG6$cdl#VoDK4{DgaGm&~ad=v1v z!_)+s=UiRQF8DBODl6q-sL^o$@$~n%wC_o}O1^nG^WaT)X$6U2$g+w+ecRXf9lve& zN9>j==b~oM{$C7Uc3hTMMDk2ld-)3^9j!xO-uJ=i;0;~37gn#^x%^0Xm8U3KV1Wk# zgWC5GOT8?a!QF;hNDWf*#@R1yLGPhkA-E;#=ppC6(HzXNy2rW|+zTaXs-Lt**$VP@ zq|>b+Bi)6&*k<>UmSZhvTGZB-mShqs+j`oRwgoBCpRSX?GW;4T|23PV1y)MxwWuoC zNVq!bJ?vGIxfYP6c$YE;tko2ofibH2vN_kXOo)Kfz;l@$GGcahg1?*+#6EhLL(Tg$Wu zJ97@vdQy=y-DhZHZbq|rYXP#ob_)qWz;--=Uw) zwj(fV=^wyuBUy27!~Y#_QeLNn`sw9Ed|*GVE#>FQ+UC@mcDz#aA%N!h>$qLs#%?h* zp`cZowOd?3T38qF_wZza+Vl@kD;m;wT|}R~*wujMHJya?qY5XiJ`5)RtmXE1f<}l8 z^-3lTOz!Cfvd$ zsG4;DW^wZV)M?XU3Z!(5hPV;(nKiKZs#PA1~(~xmROMYrayT1hD0y~uJ zO^4;v!Y7t#_K!Q|(%kjASLLe0YY!BXfX^`&I1Z49FHb&QCvo69iBEVClBx;98)GEu zhTAi^&+Rxfqk9+0Uf$+fh)AQmEG%g-jJS;-%oaRYQe3}B-lu%&pa12;`gGNPls3H{ zrR}_8f6c%)x%M0B&+M!%v7$dM$)H`;UtqPVv2<&bHE*30jrU5Ntj*kyh4-0C`OVB; z%~M(Fa`no|#L)!Q8F3VsplP$d1O%I4B1ZFOuC4lcVC&VfsV}{C1pCaeH6JW9(w%`| zGB_4ggS4)Pv8%iktj1@TzCQ4!yROc?OVZr2h6n?tNN1vQZ z-z7(J4+vLp(v^mo{E68k>P5Twrw2t<=Dbz`&8I>K?ki*`H=fpp+}wt$igMK+moYV7 zrbS8vMZOT}YiS{~D-|l$e44o+<@1($%F3J#^;V}y$|z=a8qMjnAT-QV@ru@>5WX-* zL;x$ufGTUsJgu5hf=uXIZeJ=1uT!{d6w2$#8_PSKcQntK_f5H;JO`bA1bpk53HZ*E zOZc`Vxbksto8$4eN0^UK<2Trs7(99USvaAR@XQ5>J7!orBK!hAXlOW1UbLN9B~k|< zUNB*rqccE+HZL&QX;kB>7B4w$hMN)>-7adOD`pLt2F*LEl0QjrFD)uta^@yYzgIA>T*5=!n_k3B# za=TlM#d(UeBVtMave8>svd&QVmmih&CH2^XGNiwRR=E|eq6)KU!QRI)ZBd2A7fRV3 z@P1-udbLnpBFg$n|nvGg#w8|LOT;5bP2sd!>04G%=ya7>8KBqTj zmZ~R!+>OP;4W4j2gIKH3%M!OgwW@9$3l^2`Qz>;V)JDG4XL}E_D8&mSp)6XNgv^XPnV z7QM5;3wFZlq*`Wuxq+?Tj*}WwaTBJ2`fdXzh3<$x509uk{iDgEv`1Hz1@R|ab(X5S z`j&8FmZcK^nqyBm))WTn+QNbKhc_iR%LtQFQzTe^UCSVL*$<)D%&r`72kPmOr*K4*MM_XUY;V6lwJm1Xx zKr1Oprkrj&=G{4N&8?Z8DYqM2)F!t#*Qvq1&5Y(ooD)LXVho8MSUEim_hLqY9((5O zGtRar^u{0|{0s<=VTJl7ZuWtGI@w&VSY3(Qs5LFj~TH zD2qD)qEH{z_5~xUhywuI&2u6PU-w{UN>@)6C76@%D@~^IeTdD;59BL3`L3WbCl(62 z%5oIAi-Mq&s-}|UQ`Jy;kvHhdcZLk*Pln`F2>0z)g^q>PP{`P095Ws^9yP)NnA}AJ z%OmjGce>5-NJGQfM;bw2-KisuC*=O?^drwSKz1OWM+`h!T4bAqKf){ty}w#gLyU@f;MHoBbAk;qt0SzdEq!4(6q z$SX&Udk3nQq@P>4xozy$F>9S#(Bv$$napdQo@KW^BGk;MLETBCi^m6>xcxz4gg$Ob zf>bwutF1*qu>jbt$sB2ir*MnesE-h)It&o2;7ZP-N_~jH+|UB@S>XE82yzn@ODa;T z5$-NS)*kDa^|1A*)d+W&Th78cYgW8MuwrQ}NpwDYn*7^2p1DqcGGwB_)feay$DbE} zljTEY`S|O`pW(9*RW`3&?%-OaV9@(;`!SM(g1#mp-c*KeE#g`16eH27; zf`PKqk9Z8b)g%ZTXg&ho;fW1K7w{K+XA+a?=f+4#w;SlXGh`(1BQRspMosp-m}V#L zMxLj5J(#CtCoFFH!B}H;w6|ko>BM6(o8Q&)rOg8y+A6%(+>X^|m&IIJ=B){Pj5fn> zBaz9Dicc@QyeMVeyXa6jzVx#GD`KIlFcpv2bC*hU(stxUxT4Mjzwi_pR8%&p_>Ut6~k&yO82y@=m;?|8z$`^;HChRwT zWSgh(^1)zTSVqE9_n~t|;Igi|^_Q;1VKQgAjf4JpLTdwf zw~fYN1oE26ogWc95(dF}0}MiyNe+l9ptm^^_TovKIv~7Ek-+7{`)1n2ftS7c2uX+e zz!HxTz^LYSNJ0@IATCN8@iaD+FGy1`8pvC<`- zbFt}_iEucXh=dc*KJ)5p&$K1O;Y1=FNf@8oJbJXGtTp~tMZC4Fz>{rMkW9QVWL zm8*0FiN@W#U3wW3Z~gUikAC};j><~MC%^sZbLpP+k0>lF(%W?8iTvGDdI6I#!_|;} z%yOgIh2zBncu)7im1a;xL{wmZMRbUzvQ%4=TU15nlihVUcHJ*!=j(p4^9}7s{ z^Lx}Ii#*jH_q8iY&F`rZHQ^e?q4MTUGkn|D)Rh==%M6`;VY@{- zRg2Yxa}8%@rDo1cRW|pPIdWxgUQSf=6~;w897j?pM$TxBNE&ae6=92^XGw|OfTRW^ zF4Ox9s;en!b)#4!`@>75V~MO=a%{=DB`U6M^0e|SCP9uFed$8uN`vDCZyQA-JQu%( zJS09rlHm70q@iUlehV#R>4;1JM@Gq{bVj6%IOm?ui2k2+N~5<$n!Pe^#s~O`@8ZsK z;&GjyJqsDua%1{?=>hybmR^>AOt#1e@YgKA`MXIONxx|9Pro2b(=S{&ar*JM`cI!$ zAA0<>x+lHw!c*z}@{>wZ-Xgt^U-+lP8#hi(ZQOWxaHOMS?b?ox5#^T`;bW{6b73jt zd{IVz_YmP91j=vef9Wdu$@KmUX9%(MolfsKt>ZkrQAas~UE}*P{tX%)hLgsCh6$-P zr1q#|>S6ULY;S<@r_ufE>s$+JI#?45)zF_|ul}q7mXpA;-0%=aQDDIgVximPc`TTn zF8|DD46)B(q7Q+Cuq6>$A)GpqT2pRb_EqhWCX zZA-Hw^q z9u0{K7&}pO#EcOYut*@^zU1XMJ}Zw|-jW+&5adtWei*UkDxOm3MAb;p?DH3eJmrfT z+Z=A=)Z)-J(NIaXdEmOvyvb0mHDq*^NO1t@w;8Zep2LU zix#I~HVAu2*qH$xkAjX{4VxjMuF#5&IZB?vY!@24xV3BLo3Qytj&6SITTO zYUR}_<0W2Du~UJCXm)iQWAzqmtWX=wgCnAVA8S3jr0z82 zSo1^}pTe)(b*_4aLpn0o1wY9#g?ha)* zREJi&0MF>J8}Amy;>3f(4Q{{2TZE>O`KCO(-C{3D9krhVuiNah&~6vSe$9}z!s9l& zec09Yx{I84OURP6sBVMBff$pe$Y$3d_w7#fUkxa1GvhwzL$L-da0ra$LZ02C2o-V;73uK#Qoe&qC0hc06p`O_sSgonpFR8RX$V4)1O$1OoR~Mzzh`}j*m8CYVln;4 z^DItYL7e1izk}bM-SRf?>gysAms6Dz3p^>kPIDygY%ybQ6t}8gJoIpjH*WSi8=ZzP zy!qLm{!~dRO+URo?N0}Oa7?}W*u?GW#@pc%ER}vdefnm(t9&&5=IBqp`qi&2KPipM zkW`h{3*Sv&xNx63EPs*qymH}V4?Lh8dgU+P`iUC*3;F)^hbZMOZ~cp!f6LYjKINsY zFTQy9-K#G&C{N)0Yc%~0aaSfSy{3&AeLg0FC#2x9G#@_FLQ*>95qS!J=4m2{GbQY) zjDm~rG9KVn{~_GeFdHRqZDCbQyyq;9r|f9Vq)=f5&!lKLCCq5~o}!c@3<@ppv9_lV zefV$~v!zM+vNtajV>IQVjdmV^z2Hn;deg|Phx9RuR`j6RUHCVFe}*TrAvzD-mj0CZ zQ}HlH)YUwq7HT=dN<-?DRa$ve)qPN~t$wx@e6J7!)>{p*{Et&<-FkG725(gAG?wNVLnlL&vPJ+bwdx=LAR=a1lUtSe9HizHDllVVQ(u0GED20(H>sYFtu>_dW;Ra=76^ zoC^OH)4$fZ73~q#oa${$$giOh`pt_;W&dK6>7*QhQ!BPR{)eWf+L^w?sZZ&7L$_K8 z*bG)hOOqEFH&e#grRBQ!1j&mYa+@4=Vp8JunXOa&uR_ZlW_e_Q{#ChsMSf|DCa9^Ll3@URu;wS`i-EwrE|o zHSr<8G2UES87nDWl>R{aDtSlxDgpUhmR_mcr#uJS`&ci* zI~qv#JIxvn8%3(FL1T*-1+@3rAWPMTnuM0nykY%fgVkzHC9Ju*RwIyuH@n`HAY=r8%6$jFdefiQ zCT;lvf1NkFYjX779(!Xd67-cOg0Y@;-QA5%fyVSt$D|)_%|h{IeYbxe*T)*xuKnWb zsle37BLOIbR1`YmC4;rg6S2jS;q(`Eipo2xb2I0D6J_fYyZ@`;UIq9QS_ z1%F&1Z!yXDo8(5*PLqNI+C0Bs3X4UA%+d^-obWAz{U18;wy1__ufsEEQ?rJ&xn6j@ zkuK;s&RlrnI#O}qdDi2npTLF+?WNGUxPJWx3r&@`0cq!tCR!f(s|%0H*NR<(D+daS zZflOUMv89nTz(4<(D(P$torh%#uXB475;&)Mps86I6Cpi<6wx>*mq=0#Zd2m#^Nnant(5o!^lDg5#gt z+qt55?5)4MglZz0*(V=`M5c4^l;+ouw}ql$nzP3!jYrYcI7Fs75zZePl6y~IM>FU~ z`b8%a^>yW#otW__A8kI;x(I)*SJzzqQT$P_?MQ!LKAHIuW4DPHwG>YI6h(t5$DH4Z z83)b>21Zgs>skVXT_&r|l9R)4bMQ9DqET@S)Dl4?5xfg%(o9;zl9WmFMN%e{CC6gb zcYCHIu@vw6msd?j>}rF{9CoGZ)pTF_~RIq9)EpoDA?xOs}BcrD<8f za*@sm=YNpu=cOOi*BL6}TaH%MV{7{UhCqZ)`-SZaYxACb39WxL!jm1fy5*GUz7x~jm87f48*fk&Z5KypMJ z6UqmKTqVZE9+Xc}EC!PuoM1M~+bv(UDElpcWKsGp>nuAgYLi8JEHR6cW3gM&VA+E8(O^afQj`R25KfVC`%lbB|85ixd64=#`&|9Vv$Gs*G@l*+%J?c$NZ@8)bcq6c4(GrVNiWaH{z@Z)*8wY_i)3HTt zk_KMVaWZHy(FPl=s?PSOM5A8SvOrnNZk8z(tU=w-N*@sqXh=p)FI8Ip+=o~ugT6&W zJ%`(0|49u>eQaSI_HEF)^ggDqgXkx=cPI+f(tl8EXM^*Uixc%eQ@W#cG5);x3-p)t ze*k}l_@glo_R6qLK$c1|XkaCHEo?cyA#{%`7N}*LNz<^WdANBB9*5cAu)fOC*EnqL zj8i9mFSS^;3MR`a_3-fU)bOcc1MG`t*GPKmFNhcA<%V*lS@{~JRz8=xEBzYsh9|## zGc+D0HQKbZfE$lI8X8FDj3<}aVfwM*A7q8`XChBT9>#R!D25)ha&+1vEVc*n3*TON zVFt=~FF-Te)o8+i5{oy|5oPmV-e|w$@YEgl8}rxpuU>2X+5128M>j8C)QdwKAw$Z; z@}uA>$Nef!qqjkmgvM;#GIKUX+;|t7m;lwjAVcbUE;+ASOb5glkiGVxu%W=1kCUMz zEr7r(%POnlusEzoEJv&cMObr8vRAR<^+{aa5?GUhCR`;tX~jJK*Wyctd~*=(@g_>+ zF=7i?3}Qu6t0vT>tJalpB~4IJ`q6Z*hi<3x6LW8V;yMaHaoEI9tiOMK-=<9m4)oH3 zf;wFFURn$MTKtRQ3C`oKxjf*VM1*tduro5AW8mWFSOcjXOaP>V@eB^`*g<#_(8^Be ztFN`0s3G6@{cKsiDC>9Ms1XCC$Na66+qOaLP??|>goY@dQzt@A^z%eJKQvcwUrL*h zt0vA&D0LIs#Q6zzLL~HC;!F|Hc{y@;g6}6%NhybI$e|yrCHvrDEY_=xX7S@m_~|F` z(?iEUDp!r38CB{=wbApV>gc8T*Alf&eRDNvV=dnGC%@Y8XoI4gX@x4{2%#&+T}v?% z9??crfn5M4JW_}79&86388MN)B-hArLuc=oyT9D?WldEs*I-WKa!^Wl%?)d4>}Osq zC)#t4dX3uTIp_^JYVnc95F@W?xr=+; zb-lN{zY1rC++a2v8cbQKSqD-pDPuiv-t%s%roK+KEoMt!#9Pq7SL$Ht>xz37*cF`7 z967nERm0=MO8)RLUHn>&$Z6Q#;wNlx(G#|}=z%?b*xp)Q2bXNeR>M2n9t4iS;;nHU z!BeZ%)wE;82Ha!t>gNyMC6bAF9!4V7TDi63kDLFR|( zCz&7O=wAJ8r~Ve!ht{Ae^nV};%dRNP0p=RS22ywuQ4zQU>${@u#Un{SV!R} ztfSDAt)r}=OS5Z8jMG21jzU{G`gox8$Q)Hrl2KTM*+JfX?91dgGmmQiWsATd_&o+f zoa<9pF=5X48Mxjk06$Rxexd;UL;>i@1?Zy!^u0|1sDGrtwNReH8p*FR@c%{k#<+*% zLp8N-SQ}Pu9v-&YAPgb7vn5B$1#-$XsXUC7r6-V*)EM)7dVD@A_Hr^6znnU!e(ARf zW6oaO!Tx*W{n#b><^8@eW*uQH&89sO{nCPyFE8Ay`DjblDsiA|_u5NBCCL&s&rlKy zgDmGxT0@vd^5jBuVt%WZ+3g`aR0r&#NCb``-aL^#0Jh~~{bs`ng3aS3M)7DVJbyyB zHt6^LcP3a=w=SfEOIOJ5 zjrV@w`agN#kNyavPW+{KUcDDIE*86B49t;Vn96rJLu5|yCC!0aD{kpAKyNuWWw63a zL`KWeOcpzKQrt!|fOvmyXUc1}6D1v113g60nsmSy#xq0#IwwYzlh1-64Xoo%)Bs%y zO?;-vdl@awuEs(-LN@8==<2m6te3=TJAn$=Bg?hrJJye z$WqVFWBqKO@)&2oUqs)3_P(JZhhzSG;38@X_h!shZ_O3LYF&xBP&9KJU`ysXz)phl zHHwjMFnp7sA{kogt&+pg4p<2L&J*Bl6>p=!K;brq?V0-!?&RIuR8E$5H67iM7 zo+$xzGNdx#U;(L;j3>!>lA;}7CK*psZ05Ho@ns{vd=Ai_{w<)BVH96BaV?sV_Bn*x z8B&d~ieN}Nwg?9>v~a#HqJ(3D3<*OE?po3Ji#evB;Q+%S`Nw%=A5BZWDyFjqBSEY`5X&gahBS z0~>`)I2>dc#h2~CMsR>*hS0|Cz((I+#&DG3=FBfeC)1&m>DCFHixETA>jci*0E3wu z0jY$YT*6M^q;IJ1oxn-qwfuI3!=s#P1K={T47n^5Cq=oqjLUo(m-aHm42cbhnE-SG zZsfNc`7N{_5VM)%?-%z2!%60WlVTl*PXa!o)Mmy3n;8xE_0G$No zZ^fN}Z)6q&zDW>#OE8eR3otH5Wewgw2lysIyd{{E`8J>(uoiE>BWpPZm*EkUlnt4G zkV&OD^JBnh<}tuq5Yr$N43iA&88#AB91Oh-!wgFq#u!!uHZsme#@Wa?8yV+oxP$jY z`I@Xn8D3M26jrR63BVkNpcTR%l=(FUtq&Ll{56;Mb)>yjzK*m66PbR%dWMY*e=F`r z%p1V)I_eIHx)U_g_ex&oi+}|jMCRv!Nrv?d8wnyUzCl}1*vrt*FvKv-FvhTwVKpGeSm2bDyCNxf zK+qo$^arHejl@5IZ{n?y_y-XD0|;(W%)sy*pgsLNKqo<>IUs1RV9g6?LF<1}v7p7j zs95=XEAcSG;9w3Yl#6~Z}OiyW?X z4x~yyVyNypBvk+jXAbIeDt{F ze*$_q23(3Tl|M%TmjZ%I0l}q!ad876xKznSjwb+<4C@&-5(H%k`ZGTU40AZfu##al zU>@4{DL`;IF5Of6+PN-vu8W=Pf{WkC#m;rHqb_$NOf6#Px?t~@!dw?S*Tv3tv2$JQ z)YtHqYGLPE*tr&Vu7#cY8se!IUgUKUFo`d{$dSSgnY#fSDU7-hEI2<6dR7t2 zOt6$8^{*n7oFMhDVqp6_z$C+ZhK(psF|Z*X7zlyqM*QI zN)!|To8tnDrdLf#G(ByYWpYa6Sy!&0&pUFUKswH=W3Z-VQPx zLQOl73&l{$JCVy*0V$VG%nfb@+`#ddbJ`sYui+S~OQ$l)a4*N)fN&R6xQi*=C5XaZ zOyMp;6z)RV5QDN2?B$px$fZl^M@_p>HVO|S_b$%2OWDXVn;Bltsm2&y!7P#?VhSWr9-?m3kGTd@r|eFQ@HQhLCSBC{OX!zSv9R z7;4SMoY!LheldT)m`l4DUp}NP;qR9yn~>KMWjA0y$Mgfk%Lr2$`js(;RF{5b7eoEa zz5LBV#0)U+4KSY!D8wfNT+RWMio(Nag#j+r0NR3LE@w!bHo)z^9HZ6ymE{jKp0ykl{wm-E!-M?&4R|}qH5%j^4KfV}kr%~NUW43rgUE$qi021^|5iZEgaJoD z+d=MAgG|FgWgKlfs1U`5z||#ySZ4u#4fzhCjs%IThmh~XfZYr=&~}J(A42Z*b^!Gn zLXGGfqT~?jLNS{O1L|@s;1wL+#&A2o-NE4r)OSd^n#07^L*Pb&yBSV${Phg?Gd#fX z5W^er%?h;9c|a#aYNHk0Mk}}$D^QC&5px1{T*2+N0<}O4x6}%z-U^ieVZ>1RSAagi zz_nPRY~nEW%@xWPPDQP=0yR1aIL_a1<+oSx+bcO{8;7^^H#<0d6+`N|D^OF)eJ8_R z95cz`Jq)j7cs;{I45=@#K=2yaIjhPigbT(4p9 z9>q}YhEcnR0IBB=gThZMtC(k2fgfs>wagW3(c@~-+i8p#0nUe&bv$aU<1(yc-dhK5 zM?CYuI+W)jg!_SQ9b;RE94S1MX#}KRwhkp62PApE4mj^r)^lCf1JBP9rqO3T*9(5S zfNed~e?9ub!w8QHFCf)xy+ZPNy+U$$lzDO#c)p4-_3lw%xD${@nNjX>qfDhyF2gAI zf>Ge4Z-@g&8QVr>E56^zm-w zT+Yp$*JjRZGjh2T-%u`_nKE0@mrcqR^kqQg^)w*WVheJiFx7Vp@Kbn#;Vy9qeI}UN6I`AN9uX!O!%lqv zl(Lh*+=(wALYU@1JNe6<{N>K(-v-N3e+G3;jg?`Ax^8P9IceK+IT%^bBG*nW=h zcOsYFjB__rd$&Sdx|_M^TBg#qOqpvr?X_ITYq^fsa_z3=FDE(QN&bG4bDU(#Omdkg z8UG~GzN}1gE|Z*g4}ZCbzud!L?%^-5=lJV6=6bH_0i+#Q4j|P*3@*Rc8I?}#4US>zdXbgIK*Eb;x7+zc|OAQ{0P(YW88y2#y#j`Jnlm; z8m;g#j49)QcQd4s@fL|49zg8v0Ag=Pxdn56g4o*u#NG}d_I3cVw*!d19qhgJt1AIj z{0Wg}NMR{*WH+7^Rz$w>g=|w_sT|-h}VBX2WK2MZrWiY!NOOU7w_XRjwtVOVs)H>6i04OWzb+DH%UZKQ|wHqyg-8|h)ajr6eIMtWFpBR#CQ zksj9DNDu36q=)r3(!+Wi>0!N%^swGWdRT8G3g=M0vh}rbU6ykBa~H(tQ`ozn;~fa+ zd#~cK3*iFqehwEd_}-1MBa73sAl{E~zW1a2eGz?=#aXi8o6v%Al)wLD{=SOCU*>Qv zhwr7ZWkLBZ3-Zcc5T83+ml1ITw6eB~9b&7v63?*s8vaJa1cz6MN!$^i6#KGYg~cNL zx(+D_Zbkgn{6!cs*C2fYX%}<+)^~_0i8AOV3**#%64>|8<#s)AFGIQX{K#fVo2V1D zY(1n6y1Z11UZl7N&owCFRjAEAL8;cDR@dY2I&lDS8`tJqyxT5z&(-NVax1*WUK zD>;9{LvOCeZ_0Ha(ohM)*>qHCCL29bQcBG(EUC+7E8%np0pL+TC!IhrHA|V-32 zJJoA@7B`iaV)mmHH*j0c^V=l13sFUHy?tC#;DPR#(ytph^}odvvpwhfxw=qJyP3K=XXqFw#jb2= zsojZ+R0rY(>SOaX--eW1!C@4ur#}d)6JJov5dE(~+f%Lg;hQkNyqc*tk72e%L<4Fo zoja&CiC1*KB78dbt-wYSK<7s4Rok;QS;*Zwg>{bH4n0%7WeDRn++V0Au0yGGnLv4l zS*8#j^e<*P=wf+8^;lRxDiu-V3dTUKK|H>YH@AzupxZ2EiMMC@pK>JLCQ9gK)O+tf z{HE5u3UBmQC;IC$jQSGwWW6_0Zp54Ol1+b0efKK-y^quDJV*R|C8wS3Z?m~m3tkV5 z)Jv$}>b027oBG;8eovIwsYWHBKBQBTN=s5kFYzpPD&ZveNP17)K^(V&L-P{4{UVvP z2KcW+{#26da9X)8o8PR|ZUlxp{1+A#z(hPjdCc~s$_2PqKpxNY!#9v(1mEiYo~Uyj zxO=v5jxd*of3Ix+tI;D2EL2{qz21xUw%6NiR;FBr@gNM_CDcY?++fLB zou%0SXzxwHqbR<;;qI=g&c?ndvdG9HdzhKbOeX9}NZ1KNBAW}7WReUdnUI+f0xl%7 ziy$f}pvWehxUne8BCe>2qKF$RD!Zs4D4=Zbuez&x;_|=$``+(+-uK?``QXX)>FTO; zPMtb+>U4FV(_Ar9%F|FXOi9CeveE~u zMjHMP!rx%juc^cuf4rCGtdOf?WZubg(^{G%XO1<3#*`+XS7xvHdjHoEYGcT(5IjaC z#jQd7KWN3@DVs9kvYvq6bC1Rcs-~^v>nWGJxgPuzZ7%&Ra2K)Xa^xdpVOlR!*Lk1# zn3$^sr^;;-mn`>Xcn|p6P`xMrH0FGL;ksz9;ig5BbouP((v-cs6ptP3C=Zuz+$@EJ7$ZMiLs_zC}+(KqRs7&s56ukq&+g%|G5TrvF0&f zWs*_96aLyNUVKX<5pPo2@aw=?C#;z+W95v&J$9BdK-9G3ssmSCIOlL8-knM`T6yrc zRFd(>*AIR_5=Ji(V~YRf#{YO@ZLfZ}6>rF*=x751!9Yb0y_k#4Q6KfnoTKtQ≪P+Tw+*$qa@!i>|Uj$m6(YG+< z@59k=oQ05SlCJ>f-BY|(^Z#86{O*I_m-6+4ul^i6=jXppMXvRofu*|bv~Xuul=$;} zIeyzZTV{dZHYive45P@F8Z0ddmioehV6m;FFel#D+ZXozn@XKIGTX3VVHs~0vh^!Q zJ4aHIy%T<%@wVi`Lfge{neAN9`N{Wu+C!UdH7XoZv6@p?l#{zb{;bOT0l&8M+wa#6rP5uxYT6S5{aE z(BKv1i-I5$D9$Ylg^jL;!WD)7>XP7t6XI0-rA2{a2m=*^Oc3ia+;_Y@@+d+Yx z(jXtBc1Ep1nZ{wQEwdD3U*szt$9v3&Sz`O^^gv(op@e?u8|RIWN7gXg5MS7Kvn_Lw zEh8^4-eAmM81k1Fpj!OkjLd%N{Zf-N`(+HaWu)5%_DfA0JS@$Y+-GQ7+Mu+-nKff; z#%2~^D5Rvh9&yCz9C{r#M#16-GcTB5>MJRzFz9gQ=W@!fuvG-hc*`8Fq2R8pIM>iV z=mZqX&}-;K0NRY|zWh=@hP*f&ZySkb1wN=wFq=<3v<&}=87{4Iu7Z9{9bn82l=^eR z(2YFEJ|ZVR?7@7@7gRAOnbi)%360M#3j;OS3}O~S$g)FiLXs&czaM#!s7fFYL*a#l{!GY_N54FSL8Eir;*Br!!w5p7VJma|rNyELrGjsxa;P9! zR+tN2oe=Ps8@lwjfj8=5B>k`&Vj^>$v-$|O3}c)VwuZ{+m``vmEa%_!i4UP1Tbr;I z0uku=!d-ZUtYOKvPPVpQS7JL`qQl$Cjt>dN#AFRXq21wdx$v8qkZ8l#Vv^iRHDe3H z;gT+$JC~Q2#}|oZD?TS!WRWpequ!;yaxM!@K`;eOLxb6vp@U%~gD~(N`6Mk3h%3b|J!};cJQiWO*j>1@+pTu9}`Y<>S=5084T5`!^@&egGUd7+bpf0i@ z)<>*CL*+VT5pRTibd8lJi1lcO+y~9!|J|gtP+B6wpf&be+Q1)fhpZVLu=mvoK2>MK z({;krb-};&z~A-4TkL||pWT%1N)Ke3?FFV&u-nobJ1FVcPw9(2mj3XW2P%Wm)eLx` zw_uND7)IKGdOXWUx`Fht`Z$|6HRCAe!U zHSU?pAhvSsPF7&2ZnAQha<_61^4m^PDwQhbK4q#hO_{FDP-ZH#l-bC7J4bmynXAlG z9#rNl4=E2Tk0=Y2g(_7ZQx++URi-?SJV;Ab9r5eSl@-cLWtH-jvRYZAti>~u^~%$T ziFsCePI+E=LD{HmQZ_4F@NWG}%2wrN zJIcGtd&(Z=ePyrmf%2iUPx(mMuY95$P(D>YQ$AO|P`*?SDqksIE8i%Gly8;ql<$?p z$`R$La!fg{oPc8fpqx^ERDM!^R!%EtlwXvy$~om%k4`QLk4UsW+&N)h23FwV8UO+FZ3E$7l<+ zrP>NvT5nd{sBP7DYJ0rx-x2Tb$K!2%yXwHZ`3b5^btAWEqUu$X)GlgQwVT>q?Saof z^g`HiikhnSR*_Ft?W6Wp`>Fla0qQ_?kUCh+P=~0us6*9ZYNncnv;o8M6^oJTD0Q@Y z8@{=8hkBR5H0TBsJO#cB`IP?xGts>{^n>I!wGx=MXYU9GNB*Q)E(_3G2=2K5>BS@k(g z#TV3#>LzuwxIdqFNUiyi`mwrS{X{*WeyV<^ey)C@eyJW*zf!+ezfljV->ToK->Zk!BkEE0 zn0j12p`KKKP*15psz0eetEbg7h+jCXo>PBSe?z3f1@$5#0sc@gsh8C&>Q(g`-o{ro zO(Pn`8}mBeh>ynmD-oCD>)xvwub+o!#J*~dhKx?Qxsa?n4VaB`2jqwI?Q>~eH zBi`$^X*X#tw3b>c+G`!Oj#?)zUhAycHHYTZ5_qaL#GWT=UM&f4 zv3A89pLlx{Z$|dQ8;dDgD&AF0!yATu@J3)iype~u>+ts0V7xswM7u>Big%_mwJiQ- z6W%5oi8qHv;~gBlZG(4V#^7z1Y%K@xpZM{{NxoK~1@L~zIK0V$cP;QHM2R+DE7d|; zSS!Q34dvQItwNimP1f$x?$++n?$xGfm0Fc{pEgySrcKvoXfw50+HCE9yg~4QHdmX6 ztSq)NL#Ee(H_^H(3WaXYRk0c+6pAwT%|pwt=86PYqfRS zdhKa#gZ7N}toEGty!L{&5ve#gYg@DzwU@N5+RNH2+BR*wwnN*gy{hffUejLJ-q7CE z-qPOIc5Clw?`rR9d$jkpz1j!bhuS{vBkf~tzxIiCK>JktO#58>LiB{BDa#^ zWCR&WMv>9vHgY?;1DWl{5Fg1VIm!-_OZ+5{wOF*4tkknyCHgh&`) ze4Rkb$wX2?CXvbHE^;@y2YH02kV;ZT?juvlG%}scAT!A}w8Y$Th=X0nC6NM1tvBJK)oBirE=?1XEui@Zi&CvT89$y?-YvYWg^-X-smJ>-3| zmwZ4zB>Tumo^rOn`uG)Kahn`jH#lD49) z>CLnaZA;tH_Ot`-NITJZ+L_wnvN&l1b>Um!9-2tKG>LYhU1>KsF+GrCwiivNDKwS# zrfD=Cu1#OskM@UqGms9VgJ}j*%iKbT(qS}{X3<;ea5{pHq@(C)dK0x?=9;L_Vae9KDq(9J8^hf#={h6MoXXr2VEImhm zrN7bh^a8y|f2V)YOY}0mLa)+mOhJkrjS)uisSF)?eWFscdq18dBhu%@gTyAf$=Z0si1g0*C=SZj7OYs1>IcC0X=~kd?6UtdxaVn3b^!tej0`6>Jil% z_p>?d0XCP-V-K?V>>>6rdxR}u3)!RWF}8>;W=q)P>)F$61AB%&%bsJ;vlrM#wux2CAO8l%wA#J*mkyq?PRaAUF=Sl?eab##pR+I6m+T<>iha$#VTaha z>^t^7JIs!-qwE+v&Q7qC><4y={m6b|KeN;94Eu$hW#`zh>^F9vU0@g4@9YnDiCtz_ z*j08-S9Dd^bfQxvu+@V3VU#~aPZ_pd- zP4uREGyO)rxo*>M(p%^)^;UXo{bs$5-d1m?x7R!99raFnyxv*2>ki$iC+IHSt$XxD z-K!_*UG%PcH@&;w1IcrH>B)MEo~rlO)AV$`kKR}Br}x(f=mYgZ`d~dnAEMu)57me1 znR=Fft3F&Gp^wx@>7(`A^xO42ka~BF?$fjN96eX}>v?*_v>@? z2lTltz8Kqvb&7+OlzwR>*QOQB<75c|T`OKr-#LD<@OqRqSQzjvOl!J`(nok&=QyO>^6T z3meE|{1bBueMKB94wYe}E)Xo$OR&Eg_Qm*0OM~Tw{=9IM0hN`+8b@Pi$-J10y&)6I z4u%U%sH`NnxQ1wuTbv#8$70vCfRBllceq53tm&9yzi#K;$9klQmB~fK1*@eNJaZwmUeq`oZVV-#`4U6+| zr~sSJ%=nGU9cLV4@}TL^uHeL26XJWVQT%~Hep!imEEVUu#pZcoo}LpZ%_;Q91d1nQ z^JflW4vDf5w(*U}K2V?u)(Huf73+D}@GkUI{==}rp6jPMg=N{S01pYmQFzFJt+w2_ zqOy=sDu1nNFtlFl*Ix^ajVtz*;K2rVstdRUD&~_JT8gGIzPv!d<8ZpX67nYLeKF#R z33^|L*X=S7ZijJ}kPwT_?qZYwsASW)MfuEQTq^HPSy5i0e_~ut1g5EcGUwnYDowON zpSW4n(@ZPqHx4w7*Yo2iu1}OFxsBfN7EY31b^Dk8%AY7~{r9;OGI8k8uL1F^+HA7Z>8W zM<6G9puAitfx!}hRWJ-DNh{7L{^IC0mKc9un`xEz%-M0 zILteoWp)^k|9FS91b#fOGlZXI;x98hoFzJ3COSMkf-$bV8a%QZToHj8>~MZ477uEQ z^9>UYTPne*t&BG?;WZsxiZdTllg*W zfHl(0^~yMjPQ!BuUOlE?P(U>@iui-CVzY8qwaT#>MgDxVdffo3|A_)KD9{uvX{@)g zE($ty6kjw!hjJ2Z03I#+;3pJi=lZlkW!m5}ZA1WCXVBD!1jx{WARA^ZrJ266C_$g3 z76izUP@o3KA?el@7v*`Zu_~K>>KTad?s5-rFyxxnmBl4Tyd1z9va zl7_=&;d5A692ORbg~e%M!H0Ocf#=*yEOw{GpVPwUwD@ycn4K18r-eDe!kl1XPOva1 zSTabkXe3xP5-b`C7L5dpMuJ7dWzoPy72LZl8ZL{5%c2pHi_4cC@>nerEv^zRUJ@-{5-na5EzF4)=0po~qJ=rp!tAv$d#(O@EgD{nhS#Fu zwP<)P8eWTr*P`LIXe3!Qk}MiY7L6o}Mv_G%$)b^D(MYmrBu21E8j!CTEr(rRb=V~h zhh5Te*d+~zUD9yaB@KsN(s0;iKOA<8hQp!};n^+A>`7(|D7$FuaU{5%@ZJ0qe6cXX zzPyk>KUipjB{(mLGfKz9g9(RNL7+4+o`vzo3tTN;kr{P#c^MBVi}dkjct#%5bA9># zPys9Q!-Z!>zVW_1TI$R5qeaL+K8im{hL-}v#1GMUT#NFu@f5329)Yc6`2oDi!E$jP z)(ZS&f^PzwWLgFenU;Y=re)xeX&E?VVRoDI92^K6#vzF%LD(=}Cb1+48^+5dmIPrfc$vki zuwkGkY#6QztBf*_Y1cdn4zX5nu4G%>Dhau`#p;Kvf)|g|E3R_L>?Max{yZ++g&S=- zBxxjB(nt`i0l#WW4Q(y1+`^uMQ?XhB5~~%5One-Y5>F887B7<$PY~-C%ESr*?ya`C ztv37SbXu}^3!Ck6CW$f*iO~WiYp<~;PXI0=J;|*j36MvUjn|2 zV2)ryqR=|@O-Ry%JrT2)pdmaSl!>(rW!9)B39p4;mH52E??jpK+yDtr3s6Lxq?SOY zqAegx*M!f&C2sbTw~ataQDwyer`?$>jw#~UTO8BGG1WYJ(xQ#}p7gGwKs5BEhzqIm zf`K93ZZ|66Xkf1PfrzcOcHwS!9J9jCx9f!Nm8OvS21@0$=Q)4yjZlA z^9hodW0hph#p;lSSxN=kXU#>qJ%TbhE=j`g0F6jJVbyq9q@IOY&J$dyy8!aOEBK%o0uq<(+ zWr-6lOY9Q&d!Q@UR}NV^6j>j{-5|eejkH*Yd6_kC;$D%LSsaKJnU|T|qaWf<5;jV# zzWk~jOKkee@s-vO^<*!-;!cCNHKoh(MXpK-d8I8uJxgCK8xgU|5sU4u=EunKwXCz# zYt19Cm_49t*%zy+YeLJ}F(VrD0x6cfCS8c|EBcUQ2VV z)x#-Q4_?obhPcN^nKe_qLYsI!Ia*$!5xmSA4>9^Ela|nFtxJI9Jn}|HH8LJzR{*0W zb_FyK`OCH(Mq5c0`XK1L5@kC`D#7Zps~YU+lpt$kJrnKRk{*1)YIVKU;KT?FNkwoc zRfFBtU}uC5Rs}%^D}aPdioCZH8;2!z4toSP4$IzfSW@9IsK_2eQWEBpioj?qslwI^ z`ib&7*C|&uNkw2sCu@XZ-DNwktP4p+>Uyiei4ho*iquJ}2D_`l&IldYbwLOAT0$m8 z-dl-{!;(6OJpvntWp6kvsc;xns!2-1Tv8DjZ6#G$a6uoI*@XDckA&nn@|_=9CZ)`G zeq@=P8GPqQmdT#+ogZ0d(SZFFWw5vsvS`3dk!2PQ*jZU-(SUW8Wfl$CUQq^{Dj|yo zEUqlGXke|DWfl#mWm8;sYnI~9H==KVT`Z#@Sc=zAjNdHdw~YTve3tFN#+6m(;Vw2j zWqC{#=SlVO>;Z4j<2g$~FgVVajkgTUOAfm@CWs?8$2kgzaJn7t23Aw!;gI=2LsG>0 zAo}O>nhl+)(YgEq4|aW`@x%my7Nxl{;c`3_2M{vrL`DtwN20ykEv}^t2AtyP5=YS| zhv<_-&~q5~BVbtEH8{jwgTuT_usZ}kr|76tbkOOHbj)}bWOgi4XgoqP3k3(g>sq3~ zUR}1oFj#J0aSGu%1uy2kQM%nJcyWq8I7J_wqAyO-7pIh+xWjP@-kpN?1i?F2%4A77 z#wVfJWNS=geHK_JIr7NO=t>>mUkj?$FeFgDhEdRBWT2a)U2XZosw8a*LDNW*h5V;4^p-?F_h<*-nzJWj2$i zG5iU$F~TwYF|z^1rddd1{T8UF8R&Gsaj28_S0N)@Nj~Z}hoM>xQ|i@fm{PA+!y?n5 zS}m)vIyIAgwOU3&{c5;mKk8SjB+Fv^Sx93878uh{UXKY_P=*BsB@_!=C9Fy;43+@v zWc;=3!M_$%t6|EbS`AYc)oNIX8&s=h6;`Ka%A#5=Qx?^5NzUt6t0c>KZ%WPgo_KF0 zXp|aEnWY9;%P6&&sAbf*PEAY(akGs9)->8kYBh}}@(eFLNxdtRP%Ny!lrEM42^wpH zp;EEN!eD|%smY~LYI13mT1{&iSFBTxzZ8*kc=B&zGPyKLB@Z=?Ch{z1qy<$-D0XB7 zVTA?iBMoGFg>m545-W>g<#05t9FB&SvpaelRt`tQLgQ$x05}@f6-UF0;%Hb=91Saq zqhUpHG^{9&h84!qSP^hEtT2wLVy$uFUe#Q6u+?KhawWpXjlriY$)xW}GU>aLOnR;) zlb$Qd#P3Qn@w<|YB@>Sh&HlNPMf+sYKH2QAE7|O?E5+=uE5+=uD@D{#5%p8d{DbaF-{` zq$iYsyF5{bdpikPG;kj$%Pbm}zmkw(%GcvI`{{9; z=bhjZEwL9P=(q&VM0b=?;xfkwpP{vCm{Rgset3d~*UOAH#;AJ|je6-R9&>F@@tA9K zibu9L{frd1xi+VG%(XeiBe^u!{1mfy=_zLKaFiTMElj}9l;9paP7;z-ddm{*GKp)E z{wK=*OCF4K@ND`SDIP(~D|mBDo=m4M#cgV+2m40?H+G05Wa)xeVzEZkx})IFb7XzN zu~+bb4^eUlG9^*S&6KCz;}yJ_yyLn&msBjxv+fr7Zlp;C&sfaS@k;D@CKcI3ue>g( zdL>s_p9VESb#W*^ZP(?3fwxxsn5#9(@tb`SQz1m~u2 zh!TTZdWu)b-m*d1r!zUTY!P=SAyUbyJrG#g5VXqW3og@61!xwM9hMSL=z-t zOA6K=i3`sbL_0aZk}Sz!UrAoG=*c;jBsH4v_=sBA=aG=)Txv9biYKpG{gbmJDb2cO z^#Z%ZvcBZrlDC|7$re5A6^q)~4VI9QOtRo5+3Kk^^IUi$CTdIjlWbwKW}eHkI4)Cv z?Ve;g=foWI2;K3BaZa`*haFr&!J2n2uW9o=$>tqFibu?7lLyQa$+0C3uW98y$(B@- zguP6*#x$Z^5uHjh_yoV!m_{@wqA^JlyBt%zE-ScpW2e>R-))y%i+N$L%;_oS%8aAX z=wvyX{7IZ_E9H#Wh)pd|u_$0)RMfKW(%lZhx4BBDroE<6F*yA~lz=CHs5|Vt&`Rq1VK;V(H(v4>`qP8^~-R9b4_oRw7DOt?PRH5Oi zqNl0CuBBT2lye}}Xpx?hCR>O(Bm6v1su)w@2YONsPN9v4rhu|B#%M1o$ob-yc0E-{ zqPLJts?|qn=~FF@#&Z$TN6Xf`O&bqNmL!Dl=rMg;(3X7=yr&5Z-P@X5QWH(@H$6po ziyqSpPEQfuqDOec9y!;97wnO}7hbSON=JCX9x099!ansjy;6_tbDGc+DdjXVE>ddv zBE6yAW>4&%G@*O4C&CN$q=^}oW_qojG()ziFX*OA>Eo%kkfg`*CGp;bNhMucD~~n5 zJeDWvk)9-;1e;@lC+-#`X8@j;3S5%1SiPmqO%{5RZ1G{Ob{=bA++*!@d91nRvDQ0} zwcdG5uQENwA#9^VYK-u6aYbr}$C_UrYkqmG)egBbWM8b^Z;!S6?Xl*V$C_gvYsK^6 zS*MT)o^?vdl8v?Md8}0rUbn1gd7KfC+mo2UGd&PwbkLB)LB-cCk^fmy25GOh(30rQ ziqh*#_6p8L9wM9ghc8%PQ+i&znmlyiP`e$qI2N=+MhNqtrrdyt<1YR z;d_?RBpSc5qy~QLk$MV2yl@l1%}ERVwjmz;_8|jMju>3P_mX=R4RN?r09TSZfFB^g z0{#u(?A3ULs$xW^;uo>0_^nBSlgFdtcOV^%Ox*btS;|>^y--mR>ov>Zk@Fdgyb>!E z6={~T(f3$I9h5xOhMX1nfH`tpsE`IRa$WFq9i?Uo1soj+1q&6Y@$1FTYgp-l*YW~N zZ~n%c(%<+UQW(hhDYus5fcz7tWcV+q%rWs_WaGdux`1DXU(Lv@!OuVg*)-ZJ>FQb% z%QB;uM(;u?|IbGW64Xoi89P+1w1z?u+t!Rcj51=z-c`H$tdfan>~^FxzUh1p5zO-u zt-J&g$}16-ya|!V+YoL11|p32AgXvjB8d+odiXFRhEL)DIU{OwAfhcZ5n*{7qAGI{ zNr@LD5jQyzv63qg+qfR_j2jWhxE1l8I}o+_79th*lKnUyKuqG-h(kPz*u$R?Z}=Nx z46h)rkRg_^CL5?XBsU>qa2(?Qx*=vSTh9a6nb3zeh!S@oGJF=|tQR1z`U%8RKZSVd zEr^lcfw<_m5DUE*@y`bk^ZYg9oR1>5`4ssDF{T|^e?*54MMUT*M1f`_@^dVrJxdYc zISCP&s}O~`0g;!R5pl_5Enh`^3BUN9GfFvu?u1h$LP6#k#Gydx7&#e@ziq=7ycOHz?UKRdoAL-w<4x{7vi|z zLG1QE#A|j^)X}tw;tRoS->O;J005PiL5tmwlSk#q>9eo<{ zqMHyW`Z8+nL{#Y8hy?wBe1hYri23{mah}Hz+xau%InN`8^D5#tb;N4cf`qRlEfA4e zi1^Cxh>6V6^Z#c`SZ$%qB{pOc=t$!6ZE_DH^QR&ze#9f+PEJgjWZBkJRA|lcOr^7ACbdBL<^TALik=p2H%IM;2DSrz8}%R^VodE0WUxd z@FK+jK7rWZ<%s!Rhd5t+@feZ4uOOy(7vgx|LG126#O!{8SlzGm5F&F=AR6}!B5*IV z%ZRt7h_S7KxY~M%scnQu?S|7a%Gw&r3pE6TVP zB8=N2y0{}Ei|vRib|IR$3!;d7A%gfXbM^mwnuJL2|6h~-D>nVVrb!gpulQQ5sv10p z#>m3DQQ3~nO#6^`=?HQvT}0`1$a{4&@>@BP%L?CkM7F9S@MQ?B{txC+Z%%%L4^u@h z;CCwd9lta2J#mf9)hFW9xIOhr_)XUD!f&cR6TjUJub>g|wnFYKJMv_8Bj*ha7Yz)5 z7#O%;G*_=MFibWu+-+c(Wnh56q2I%6fPboU-^zrhSWu+}Raww|7Btm@rU@vP=NaMo z0*qV%JWl{}1i-6_G9`p8UR+Z6@(OZ;HCA}G^^WlSH0>AC2ft@YU;LgU{qXxM>5t#v z;QeVD|I&@BT`+tjctnPmRs&f0Kc<}_P0VZ_#<}Skalc7voR5+QMyb;HPJ313(Rxh# z>3yePsHsM2%c>d=L{VRSJlIjoUPF&IuV{=Z_Az>F2VJFVRidWSWkc;l>>aC>G+lAy zl%~i<#{Xv^j~LHV%#*P3tkOOBf4l9^_-LI~X?wRnc4TJyAJ3e=nECyfmdmOdY`0fw z{I9iEr~eHfd*@V*Z2Hvgp*tJi{?$r*O^Z(z-^a06E_F1wH`7TLjjewj@?r*t;h{TH zUm_!^ZLlBD+)KwfuD3Vj72@jGk`+1{*lz2yOeQ>uVx0AmVnM2|N$rsQ>;QsC=@z%#o>$R6YQ?&(bO@mHqLyGX-~b>=a+w z^aXw6nz)zh)*Sxju+Pg5znjp0<0t21M!U|PeDG>ajeQ53jCy(R@$)lZcw*O#)~D_s zQ71HZ;-2vhue?3te7mPd+_8{e>6Be}L}kC{pLaaPyXDs z#WS}qy62|H3#aeu-{;Y>n^$`dT#o6qe{<3jjX$R;LDd)tH|Bql)Y=Nl zW3?((Rd!AC%{aAj4asTJp|S6qDK9l_w(R}~yKigr(9{M=r>1?-?jb#|?<$h>OTXQ-cn|r=pqrD|_hrIFA!fm|{?reP` zCF|4k)6VM0?_bo^agNmfWZ>hi+JDug$-Js_&!1j1=x~EI-_HAVcfsqv5$j4nxoGd3 z@kQrgj_r$C?^R8HeZcm%Z&el?KUURiLwc8GzxVX)9k?wsWz;19 zPTAe~!kY<|mG8D+aOvJVy3Ba6!NK?A%g&x2cdYxmF*{S#^%?6&ukG2w@npS*zlWCJ zSam<`@I$&buxMWMA@K_aw4bO?4R@bEuVWvFF_l(UZnal#vG>xWVdEK#QdJ78XSd69 zyE?s<$Q2sQ36;eEX;64cXPz&%EM$+tpfszGNubz!bI?Y++xa-hjhWt8oqjP*1!{YH zds~TEQ?G0KAC0!XKF89U*09IQCM4P(#|vvyN;G{}^}!WZpwqdGoG~36efe9f+Cw+h zIJIee{&L$J z*wJ3Y-(sy#JojAPvFna@-E*?#`A6E_-Ye_eQ^THk$I~Ur9~}yo7=h>Jwm%eXu_)2o@*oCkH^{|TlVOoLONKJWvw{A1*e$?Z9&X0$B{e@wB ziKBzP9Xf<{szoZ2=$7(0d#>d?33;N;%JOVvZ;p4|Xm4s(ZusXbBJH{3CVO*!oz!m> zxz3j{TXGrluapMD6=G@PX;X|`A(+)pyTh4)#fi`IQU4b>`gfCbownn(l4D)Z4sO!+ z$ww#NVgF&px(8a{dGYFkfh%9S`os!bkGpPJv1G-(G0t%xrQ}xpykWw-nO~kg_4xFr z^PZfVx9P2Mld@ZW+N|3*wbh4CEPV6TPI-$L7u>vPUzd)r*4Q%Q=GW4X$M*0p?6|IN z(%K*U-IsEBYVB={3$uJ1s_t4orc?RAlZ!Uzc3nKAsUx~ogD2M=pWmU;vF?xMG#E32 z`JZf-ICRE^HK!lZ-fpu0)vUBlv!=Y-<;ToN20wdc&7`96;O82>zc8llP0H{G#{?3$ z4X78@?bd6fFRjXpjb8n6<*ma{zu5JT>nh9Xm*;mrJ7vMu=l96*r+w{?4O`w$BRHgf;8Rc-ZodEIljjd4D?G;U81Hh<>4ce@Fk-| z4|m+Mtj{~yr!Rl@e%G#})_F1mS6dbJeE0qJ->|#Bc0ADi$vP!tw_UB5(I~L%^1jr= zbw}AUe#oBu-1-~d>5$mE(@y{Ldb3;C&RKaOv+3_Qz58jyb3->20NW((Ri9(16Y_S7#^z9pMS|N6q$?+pLh-*5NO%ojJ4w)L(( z`01JGdG~C6^sT28J06*IWNrE33ComyV|%{#v1j(T$@SK{$2J*z(EZ&fP3e)fY4n{@ z3EtvCO>1Vq6uV;1{sWmk)Au&bT3vFmUY8jUmp!@W<7Kc4@4`2DLHGt^;}&J?QodPV z_mj_iEnd6x*nbPNV22%mSumD+zSz4R4mhypsl9TwBhE1JRIjgP4Rh4D*X5Qbx_<0% zB;JDCj64vII`&$;FsgpkP=7AZx+4u%Z2f;>u>O_xk{`cxG_r`@%`fDdoMrn zYTxqmXXkuz?1s07Z*II}^UHT?%hSdtjr{%PHjj52wDj_dBi`BG+!iT^Uhdrf!uas1E_i_6n)%4`rd@heZU6bH8FQM>8BlTOmVSTS;S6+Xp7~7KphLOG?cEOM_UnD= z(wj|F#vfbOJ?-al%99&XcDzz|)2&A?9az!6^7H0{S7hyMGp}Uziozz>GG|w9uN<&? z`3rfI)?L45kG`wVsnwfKIvNh^-k!dCE!6j```e^m&N=aOs~MwrdOkYg_|5sn9fv9= zy<*=GnBM==oVu?zc_4G7y^7U_F}q+IvshnL-Be>w!Bt&YeB0oEjM3n?I!?Qr=WKJk zU0!be5@7uB=7*i1+AEj;pSFI^zga)w`;mWPN-?4T<9nU;i*_WfZPe!14&CDh_Pnb+ ze$AdOAI+)xdYABL4{!N)*?^uS@Ax1sV{t{hU;4e@xX;g7uSfT&XSibG>Z|1yD9w7dMqt?$k29X%~;_MUfYrw_>5GiPCW{~0INCF{Gd)jU}+Jg4-H z!0^qfA3D3(ziM*wKDS_a;mCN)0=iQ*mFF;SIq9~=4)9Wq^4}%+vN7= z&pB!LdPkeBiCQynkEx+4zq|x15`>0QKcyq*_jk5~x zyt2RJo58IuH`ct??QGq&@YxuBQKPSeyQZs+>NV?d-E+5|_9ra=A%F0%1FD`rS^F#X zk3(bb&Fgdfo{lB&Pagb*zO{HxjjP!=ru_c!T`QiBUAnJjoo5G4ZZki4^Ui`lR`-0e z<*9d`*fzsqm_!zb%~O6a{XfOi5xj^h+9*uA$8QFbw)+eXZDZ&xt~3G*@4e@PTyxATdjEw$8Gje z%j{F)jn8qI-!QY`+ZO!mk^BpH|KdBV%Ws|{_bQB!to%u_@qrTg#i8mt3>T4BsmkEQ z>%VWDxM*aXxOX3Ie`?6LKJC+%)B8Sg=8+wXnvHp_eV^xEnm5wR&aJxd(FK!#p{=5a zy9gxC z9N0Im=CwQDnBDbM*)h!p)?|#$z#pgB-JlXBLAqyX!c45e(&t^94`Plps^-{jfoHTXGDyOIS zuBR`oTpHc*`pX4b%Z7Cu@zdMwe_ed{UVF-%=}iCl?W0W=pZ?9cZ~v@A+n+3Z;DaR< z*&Y69(4qdORX0Yj8s2lx$UiQ<^~dx3FE6jsu>Y_1jf|4+sM3;91 za_2wj)9P`pyMCYf@pBiBC(fIn@tHEbu4mcG%oFQl8pgixeQi3?yYJ-AZ(@7SNq+44 zjw8C>`rE$L-uu64dh_~8$4|HW=Ej-5f@2>{IaF_Qy%$~?-(c;jH7je)3Y{cVHZOdm z&e3Cs6DBPA^7uVPKYANFUc2(+O=D+eULLalYW4$OmUm{N_i$zNadSI#bk5)U`L(Fn zsj~(y>{;~r6VrTMZ(h`6Tj zK4xrIM$v|_c#_sOf*xb@CS>-o7o>4n@uz>?vK-<2K;pREsbe2?XEYYO z!wK;YjmXX%KV{#m_k1Yw@luf;OS7{wGGCq1_YLGNK;DJf6tu5$z$ITqzG3$GqA6EQ zzKgmJ$ZU{#O;*8#0gEoJClVee;wI=qCmrlqSpOral*CCOr?L{J^^YaRenm3D~zcZ$Y zT$Y?)kd^;H)j%6~qmkF2AX@s#6{M>LJ4z+xNThm4stM){`%E5?aLE>16!ju#sjz`) zYN^+2g3Y9E*z>0@IWxn1)09;FgWHsVj4K+-sH&ZRwyNnPhGO-_=_ZnG5vvcu8|S@g zUqCh-;UO6&)P{mTza>c~p~Us|XgfnJ7Y&V0ok^pV1-0dfWqD<>wML?wS+78&q-Hbg z4a9YocG67Z3eR`D|FPBI?dLI73euVC#J_5i68?Pf698pnkNpat$f6) zcQ$SxkUWH(Yk|nNKgsxNuqQm7N-Y ze*LP;4ppvPkhXr#{9&_qy!PVz4c0w=??s=lZJD$Cy6ji$Roy@DTix)TZA)6*6<#lY z_CLSvI`o?zPZzgny7>pM`|^*2_iowo(Y%Ir2ITEqKjoqKYv|EiH%}a9B_%xaQSDLJ zec9-RgKvJFRr%@NJx^cNvU{snYMttO`4iKt4Xd+vf79NZziPa?-pD(D**dyU!cEif zefR5~E0XK=8T*Usf7LzVRcp>Xup)7F=Z9KvT=-Vu^_y;+ab@3!uAZ9Sp?2@P-~4Fx z{kOFK@yA73ZKqwa?auW(GrGmy>t25P*O%+fU%uqCAHG@|bN80><8vOX@zOohZg{lU z{0Dm7bYevFD$i_Aukz1M&mSJ}?Cme^PXDZRms_Ts=vP{K(1zX52I>vlx%jmA?LCv4 z9_YAUUwmEZn_Vvm%iXlQ+pmY7Xjy&8y&uj=TQ~9jxyLg;kLo!)bLz)?AAIc=^<%*c zZ!EgG+VmlFyS6&m^sW_>)^OvQs%yLS?APemZC{T%IBL-QGh438to+fsRW+T~qx2nb zY<+3j$j+0Vk91GnseTeGv3>Ic+&J%dTyZa#QS@7`|+*M ze!4&U2Wx!CtJg=4{kZgayZ4S>ziR)r&H8=wPHET4`v;F7cVYCkPhA`_bI|k^qXRSM z41clyeZ6~Ze{0#6x(|224JE1H8VMhi_Pk}?HGGW~yk$)fiG7(FqeqQwj=LrW0zGqj z6kF+JR1yVE<4NhHK(At*&}(p7gW-WWfjO6C&I$AiWM^a++X;S5Mb@0*Ed#|eBrS(< zXj*)6%J4d8lUc)ucSMeDcc`(h9CnG!{^K~GRdh%@x|-r z%&9Ynp7xW-w%QL-l5*6=M{>wn0?G5?8$YyU?UKL4zy=UBK7 zI-hSWT=%SnQ|c7US*OLqGydSR@-Kb(ziaZ?3MM!E24{#Q_CbdOM;QBcqI3!_ChQXY zkg#j;2w_TaHQ`mk?+8cwVY(l_N_lfRFF1yg16ic0LHtdRqy9rZ+n+S*b;c&lp1Yrui6A7cyDg_B99gnst zXktQRpA;mRwCP=n3_@B8a!mSizc$UU9pR_1Lc{*jAIbgYRjDq+k-wPG^mI7#O}a0& z!=;}eruyN4;6X|*^XZ5AC253L`Te@e@7GAuTVy2ZEt2k+r~Bov$Sc7oXz2=Ce^su8 z>s3bi2~~~5QCC7o+7d=cd&2sDx~KFd-B0=x4v;>C15IdMW@@cre)@7hOp_6+5puc^ zI?{$PLfR45_tQP)64L!7m2iOcCLCx&C5(~nwT`RQ+b$`U{P)(=nm;b}iS zV?rf7)p~ic3Vk$wR*w&Em*2vP&V>c zSw99#)GE@))hpJo!SB>-XuD6XCp<=Yns9@4FZ3HIDIxrk);Ca28l8`*w|oh2!F!Cf zk^Gh~`E5$}sV%;oExw$0e44GkoUK*~ZEf}CypM!Z^}b)bLsnD%vFPA#LRJI9mzdWg zjjZ>}uRB!r(Ej0vRmg>|N0fLfP?pw`pc=3RQYA; zaH*+>mZc-CHu~zabR~(gA1zBqN`n1jC{5!v?OkPQOKRAqWoaeh4l^Dtg{!_Or%GAc zmg-KuvNZZQ$z^F*syH3W(w;;+z0K9DZLVlt=Sn|qt}3fI8GhO$9qHux>2R+18#>pQ zrJ)Ib+)r16CMx_{KOJf4!(a2$QGWRrKW(l~Bf>xP)7444;a~dc^L(1G{d6?x$ncYX zx~54-IDWb|=_(P`{B*2e9%s^FzRnTNOghq{JS?J>pN{ZpI$WHWKeZrdTy{|)aZHmy zs}Aj3C7H0bAGYzs4uOmbnG|*)o0>BruV`w17KzaX83j`Vy~mI46UZwFKfst+(H0)2EQMyn@0czi52MRHPLJMjNd{8f0ZA1t!v75lH>C-bH?VB6^_ZxGy0%&Q9;Ip!m(Ke1!O1Z6lLd4EbT3D1dzA$hJwk^odD=?!J8jZnb z^a}%n%SVF|o0L_QGbST2AZudQ;H+^Ib2AFgE$kF%mE0mZv(1HBtvUr-C%0Q5cs)&x}EHCIrSX zx*5b*Pb|nO%*+{6l#@4sk;|GgCU;_C&Ln*6ckjq9$eTDW`>dy)%|GJ)D$PSf0)b3^LZ8=xdppGcKcOBE7gcZ~XYY3AjR8eqer? zS3o?=K1arJ!?Z{OTwINjCd93{3~Eo9bT-|(Lb^?bbO$Ihke*pa*@4R| z!DP$o`|e=5S^~ zlS|zgB#fsOqel*W#@awaPC;5_Fa0ri(q4eMAXe>1j6d}vVHhN|u z)wGc5(+7O(je*|S)bJRI8PsObn_R!75bCkWm`s_e4Uh}5UYW6{Z^4W;ouV}T56LwZjlZG7(k-l8GT`}ec3{n^>pfkz6) zLS}ZFd1gi?6HP+49fG|JeT~Nx2jmhoH-1}y<|ZtkOBLtFV0syv`-WpMy)}OJ``j=k zc-@}cCflTU4$wl-$#DqnU;k{Q2>vT`fRvFq8b z?0$A{y9;55iZvtK-@b9+5VwQd*lp?dtytq9tIg3GM2a1Gg5(S`p3I;mLMlrvox6du znbxh=?bf~4gVrO~Q`R%q^VZAOtJa&=9_wc-sA{QzYNI-+u4<^tP}ivOYLdE1-J<5G zyVbpFfqGaiREyOTJzD4KiTVaTN6*#w>G}Ezy;MJ=U)AgM`}!vxv`5+F?Wy*i_I>uF z_S5zTd$aw4{h58zv7Ga&ToiRY>bF=cHaxaUY;^4Tv2n3i#*T{3j-3!&7&|fcy4dxx z@6@}o-YxYWs`p5}AL{*7?_^w!xY)R!asA^ij~gC$W!zP9)8kgft&Q6lw>9pgxZQDI z#FfN-A9pP7RNR?BSYS*bFK}((uE6}jGl3O>7Xz;ZUW<3*!{aN*pBG;%{`~m*@r~n~ z#kYuW9p5RwM|{8d0r5lQN5$V5KdZi~@71qfzefG@>({H_tbU*R>GiW3yx*`vf=-A` zh)Re~h)JlEFgxL$gbx~ZXw<3E)s4nC%4_m-(%7Wjq)9DmwTNBfEs0!GZOQpd;*W1U z5&X>#J`r3TToMdoe{)YSGy?Im$hz4dfjg`RtcR^ft$$c6tQQ%9b=F4fbL$r#e8s3n zs-5bnx~X9*ixJ3EQ`Ag#o0`iA%=bs&G4&7ij2@$l^mTd`BXAcZaKCh=0Z zeT*k!qwRcqu079wz+Pl8vo|pU+w5KT87GPn*yfKw7$Z?8UKH#b(4_9eb@m z0&m1_tS9wm)VsCb!}S)``?21!IEjmi3&iz_8&oy|qvB@7t&V#w?(Mku;y#J{JZ@jy zw{btl9gjO5kU)6g>Og*=C@?RuDDcm~^MN&iweeCm0yX1n#|PpY#W(RspksVDMxcNE zkoYU()8l6{0&e}Pj6m(PBarEjfG`486V6Mh^_L@%o-{6LVhd?ecZnlgt!I|59E;K|_8;FrO#ctH89b)R*Qh;zO_GJfDBGGBI>r1ds+sCOHy^&~@QsIW5IH;r6oNc(_2C?mFX29j&+Y&1@C&B3^1lP) z4~^bGxI9OF`vVQ3Yv}w) z_ZSbap+^rr`uBhT=laj=eK|JwT9p*@?TOiPyL=@N%l9%z?v=ac33*nQau4V(*(O*ALOX~L!OuSEb7_vItmCfnsh zDV3|`Q`x~&@)tNneJl6NF4-xcu^pa}@8nLlVsn7G);~lnW|K9?k4YRergHGOPOg`q zWSZO{)8$6FiCt^0JS{WjW|<|o$Zv8?UbnWX2y45lWNl!#+GxFH?NC*$PgIokv8rl) z%Khq{s=BpHMO(X74Qr38X}xW2vOZJiS)Z#~)?O83eW7Yw`_%c?epSahpz2x&RXyvF zinG2{vDQ~AU>%m-s+a0*9Z~hIuT=xp&^oFTtP<7O`iA@0->O78B41mZtu5B~s;Tvz zYNDE{Y&Fg*RY}$ls=4)}Y9XuSMeCSKwvMaT*3YVy^^Wx}YkC{&gla3l$gkFKs-5*K z_p(o`4%QjfksY@aD}Lv&B-KSJc3rJ5;=2XiRG8`^Z&+Kc_pJA=59FkrQoGze&JE6u zx{j`ERk2SyGh~^2wNuId#Xe!5(P?_PRn>~}TIg6^Psh0{bwJ1K`c^fox|irR_L}Gh zx}k2Q6ZGZ!d1lrNdX;`rul8Dc$@(R|M!&3IVfS9EU(>I9NnUgP20QtBy+OaJK6PKv z8}(b(hbq$gNL99eQZ22M>H_POYVR&|AJu#H7w#)6-Ys;C+*R(2?&t1acbU7|eaT(p zzU=<${^ow+?sNCM2h``fmX2|%sy$8>Cra(M&U26J2wlnj#jB~cQ_Y#HZKt|(o^z{? zbY{9a+R>hU(mw7~c7Jdpof^(9+STDsOÊ^^U9xIel->B`P+&MaL;S9MQ#=j$k4 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 z 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�@BY@lIp@Cm{!^ino%^*+B1YiVBzGB8bt1F@UiO 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.2.45", + "langchain>=0.3.0", + "langchain-openai>=0.2.0", + "langchain-anthropic>=0.2.0", + "langchain-google-genai>=2.0.0", + "langchain-community>=0.3.0", + "docling>=2.7.1", + "docling-core>=2.3.0", + "python-pptx>=1.0.2", + "Pillow>=10.0.0", + "opencv-python>=4.8.0", + "PyMuPDF>=1.24.0", + "pypdf>=5.0.0", + "pdfminer.six==20231228", + "pymupdf4llm>=0.0.17", + "requests>=2.32.0", + "beautifulsoup4>=4.12.0", + "urllib3>=2.0.0", + "torch==2.7.1", + "torchvision==0.22.1", + "transformers==4.52.4", + "diffusers>=0.25.0", + "accelerate>=0.30.0", + "easyocr>=1.7.0", + "numpy>=1.24.0", + "pandas>=2.0.0", + "datasets>=3.0.0", + "scikit-learn>=1.3.0", + "python-dotenv>=1.0.0", + "Jinja2>=3.1.0", + "pydantic>=2.0.0", + "tenacity>=8.0.0", + "typing-extensions>=4.8.0", + "tqdm>=4.66.0", + "imageio>=2.34.0", + "ffmpeg-python>=0.2.0", + "jupyter>=1.1.0", + "matplotlib>=3.7.0", + "seaborn>=0.12.0", + "aiohttp>=3.9.0", + "aiofiles>=24.0.0", + "pytest>=8.0.0", + "pytest-asyncio>=0.24.0", + "jsonschema>=4.20.0", + "pyyaml>=6.0.0", + "markdown>=3.5.0", + "json_repair==0.35.0", + "marker-pdf @ git+https://github.com/Hadlay-Zhang/marker.git", + "pypandoc", + "qrcode[pil]", + "fastapi>=0.104.0", + "uvicorn>=0.24.0", + "python-multipart>=0.0.6" +] + +[project.urls] +Homepage = "https://Y-Research-SBU.github.io/PosterGen" +Repository = "https://github.com/Y-Research-SBU/PosterGen" +Documentation = "https://Y-Research-SBU.github.io/PosterGen" +"Bug Tracker" = "https://github.com/Y-Research-SBU/PosterGen/issues" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src"] + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.black] +line-length = 88 +target-version = ['py311'] + +[tool.isort] +profile = "black" +line_length = 88 \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/__init__.py b/dataflow_agent/toolkits/postertool/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dataflow_agent/toolkits/postertool/src/agents/__init__.py b/dataflow_agent/toolkits/postertool/src/agents/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dataflow_agent/toolkits/postertool/src/agents/balancer_agent.py b/dataflow_agent/toolkits/postertool/src/agents/balancer_agent.py new file mode 100644 index 00000000..45acbafc --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/balancer_agent.py @@ -0,0 +1,147 @@ +""" +column space balancer +""" + +import json +from typing import Dict, List, Any +from src.state.poster_state import PosterState +from utils.langgraph_utils import load_prompt, LangGraphAgent, extract_json +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error + +class BalancerAgent: + def __init__(self): + self.name = "balancer_agent" + self.balancer_prompt = load_prompt("config/prompts/layout_balancer.txt") + + def __call__(self, initial_layout_data: Dict, column_analysis: Dict, + state: PosterState) -> Dict: + """optimize column space distribution""" + + log_agent_info(self.name, "optimizing column balance") + + structured_sections = state.get("structured_sections") + story_board = state.get("story_board") + + columns = column_analysis['columns'] + left_rate = columns['left']['utilization_rate'] + middle_rate = columns['middle']['utilization_rate'] + right_rate = columns['right']['utilization_rate'] + + log_agent_info(self.name, f"utilization - left: {left_rate:.1%}, middle: {middle_rate:.1%}, right: {right_rate:.1%}") + + agent = LangGraphAgent("layout optimization specialist", state["text_model"]) + + variables = { + "structured_sections": json.dumps(structured_sections, indent=2), + "current_story_board": json.dumps(story_board, indent=2), + "column_analysis": json.dumps(column_analysis, indent=2), + "available_height": column_analysis["available_height"], + "left_utilization": f"{left_rate:.1%}", + "middle_utilization": f"{middle_rate:.1%}", + "right_utilization": f"{right_rate:.1%}", + "left_status": columns['left']['status'], + "middle_status": columns['middle']['status'], + "right_status": columns['right']['status'] + } + + MAX_ATTEMPTS = 3 + for attempt in range(MAX_ATTEMPTS): + prompt = self.balancer_prompt.format(**variables) + response = agent.step(prompt) + + log_agent_info(self.name, f"attempt {attempt + 1}: response {len(response.content)} chars") + + try: + optimized_story_board = extract_json(response.content) + + if self._validate_story_board(optimized_story_board): + log_agent_success(self.name, f"optimized on attempt {attempt + 1}") + return { + "optimized_story_board": optimized_story_board, + "balancer_decisions": self._extract_decisions(response.content), + "input_tokens": response.input_tokens, + "output_tokens": response.output_tokens + } + else: + log_agent_error(self.name, f"attempt {attempt + 1}: validation failed") + + except Exception as e: + log_agent_error(self.name, f"attempt {attempt + 1}: json extraction failed - {str(e)}") + + log_agent_error(self.name, f"failed after {MAX_ATTEMPTS} attempts") + return {"optimized_story_board": story_board, "balancer_decisions": {}} + + def _validate_story_board(self, story_board: Dict) -> bool: + """validate story board structure""" + if "spatial_content_plan" not in story_board: + return False + + scp = story_board["spatial_content_plan"] + if "sections" not in scp or not isinstance(scp["sections"], list): + return False + + for section in scp["sections"]: + if section is None: + log_agent_error(self.name, "null section found") + return False + if not isinstance(section, dict): + log_agent_error(self.name, f"invalid section type: {type(section)}") + return False + if "column_assignment" not in section: + return False + if section["column_assignment"] not in ["left", "middle", "right"]: + return False + + return True + + def _extract_decisions(self, response_content: str) -> Dict: + """extract optimization decisions from response""" + decisions = { + "text_adjustments": [], + "section_additions": [], + "section_removals": [], + "optimizations": [] + } + + content_patterns = ["expanded text", "added detail", "enhanced content", "increased content", + "reduced text", "shortened", "condensed content", "decreased content"] + addition_patterns = ["added section", "included section", "new section"] + removal_patterns = ["removed section", "deleted section", "eliminated section"] + optimization_patterns = ["within column", "column optimization", "adjusted in", "optimized in"] + + for line in response_content.split('\n'): + line_lower = line.lower() + if any(p in line_lower for p in content_patterns): + decisions["text_adjustments"].append(line.strip()) + elif any(p in line_lower for p in addition_patterns): + decisions["section_additions"].append(line.strip()) + elif any(p in line_lower for p in removal_patterns): + decisions["section_removals"].append(line.strip()) + elif any(p in line_lower for p in optimization_patterns): + decisions["optimizations"].append(line.strip()) + + return decisions + + +def balancer_agent_node(state: PosterState) -> Dict[str, Any]: + """balancer agent node for langgraph""" + try: + agent = BalancerAgent() + result = agent(state.get("initial_layout_data"), + state.get("column_analysis"), + state) + + state["tokens"].add_text( + result.get("input_tokens", 0), + result.get("output_tokens", 0) + ) + + return { + **state, + "optimized_story_board": result["optimized_story_board"], + "balancer_decisions": result["balancer_decisions"], + "current_agent": "balancer_agent" + } + except Exception as e: + log_agent_error("balancer_agent", f"error: {e}") + return {**state, "errors": state.get("errors", []) + [f"balancer_agent: {e}"]} \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/color_agent.py b/dataflow_agent/toolkits/postertool/src/agents/color_agent.py new file mode 100644 index 00000000..82daa4cf --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/color_agent.py @@ -0,0 +1,349 @@ +""" +color extraction and palette generation +""" + +import json +import base64 +from pathlib import Path +from typing import Dict, Any, Tuple + +from src.state.poster_state import PosterState +from utils.langgraph_utils import LangGraphAgent, extract_json, load_prompt +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error, log_agent_warning +from src.config.poster_config import load_config + + +class ColorAgent: + """extracts theme colors and generates color schemes""" + + def __init__(self): + self.name = "color_agent" + self.logo_extraction_prompt = load_prompt("config/prompts/extract_theme_from_logo.txt") + self.figure_color_prompt = load_prompt("config/prompts/extract_color_from_figure.txt") + self.config = load_config() + self.color_config = self.config["colors"] + + def __call__(self, state: PosterState) -> PosterState: + log_agent_info(self.name, "starting color analysis") + + try: + aff_logo_path = state.get("aff_logo_path") + + if aff_logo_path and Path(aff_logo_path).exists(): + log_agent_info(self.name, "extracting theme from affiliation logo") + theme_color = self._extract_theme_from_logo(aff_logo_path, state) + else: + log_agent_info(self.name, "no logo found, using visual fallback") + theme_color = self._extract_theme_from_visuals(state) + + color_scheme = self._generate_color_scheme(theme_color) + color_scheme = self._add_contrast_color(color_scheme) + + state["color_scheme"] = color_scheme + state["current_agent"] = self.name + + self._save_color_scheme(state) + + log_agent_success(self.name, f"theme: {theme_color}, {len(color_scheme)} colors") + + except Exception as e: + log_agent_error(self.name, f"failed: {e}") + state["errors"].append(f"{self.name}: {e}") + + return state + + def _extract_theme_from_logo(self, logo_path: str, state: PosterState) -> str: + """extract theme color from affiliation logo using vision LLM""" + log_agent_info(self.name, f"analyzing affiliation logo: {Path(logo_path).name}") + + try: + # encode logo image + with open(logo_path, "rb") as f: + img_data = base64.b64encode(f.read()).decode() + + agent = LangGraphAgent( + "color extraction specialist for academic institutions", + state["vision_model"] + ) + + messages = [ + {"type": "text", "text": self.logo_extraction_prompt}, + {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_data}"}} + ] + + response = agent.step(json.dumps(messages)) + result = extract_json(response.content) + + # add token usage + state["tokens"].add_vision(response.input_tokens, response.output_tokens) + + extracted_color = result.get("extracted_color", load_config()["colors"]["fallback_theme"]) + suitability_score = result.get("suitability_score", 0) + + log_agent_info(self.name, f"logo analysis: {result.get('color_name', 'unknown')} (score: {suitability_score})") + + if result.get("adjustment_made") != "none": + log_agent_info(self.name, f"color adjusted: {result.get('adjustment_made')}") + + return extracted_color + + except Exception as e: + log_agent_warning(self.name, f"logo extraction failed: {e}, using fallback") + return self._extract_theme_from_visuals(state) + + def _extract_theme_from_visuals(self, state: PosterState) -> str: + """fallback: extract theme from key visuals""" + classified = state.get("classified_visuals", {}) + key_visual = classified.get("key_visual") + + if not key_visual: + log_agent_warning(self.name, "no key visual found, using default navy color") + return load_config()["colors"]["fallback_theme"] + + # get path to key visual + images = state.get("images", {}) + visual_path = None + + if key_visual.startswith("figure_"): + fig_id = key_visual.replace("figure_", "") + if fig_id in images: + visual_path = images[fig_id].get("path") + + if not visual_path or not Path(visual_path).exists(): + log_agent_warning(self.name, "key visual path not found, using default navy color") + return load_config()["colors"]["fallback_theme"] + + # analyze figure to extract prominent color + try: + theme_color = self._analyze_figure_for_color(visual_path, state) + return theme_color + except Exception as e: + log_agent_warning(self.name, f"visual color extraction failed: {e}, using default navy color") + return load_config()["colors"]["fallback_theme"] + + def _analyze_figure_for_color(self, image_path: str, state: PosterState) -> str: + """analyze figure to extract theme color""" + log_agent_info(self.name, "analyzing figure for color extraction") + + # encode image + with open(image_path, "rb") as f: + img_data = base64.b64encode(f.read()).decode() + + agent = LangGraphAgent( + "color extraction expert for academic poster design", + state["vision_model"] + ) + + prompt = self.figure_color_prompt + + messages = [ + {"type": "text", "text": prompt}, + {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_data}"}} + ] + + response = agent.step(json.dumps(messages)) + result = extract_json(response.content) + + # add token usage + state["tokens"].add_vision(response.input_tokens, response.output_tokens) + + return result.get("theme_color", load_config()["colors"]["fallback_theme"]) + + def _generate_color_scheme(self, theme_color: str) -> Dict[str, str]: + # hex to rgb + hex_color = theme_color.lstrip('#') + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + + # generate monochromatic variations + # mono_light: medium/high saturation + brighter variant + mono_light = self._generate_enhanced_light_variant(r, g, b) + + # mono_dark: medium saturation + darker variant + mono_dark = self._generate_enhanced_dark_variant(r, g, b) + + return { + "theme": theme_color, + "mono_light": mono_light, + "mono_dark": mono_dark, + "text": self.color_config["constants"]["black_text"], + "text_on_theme": self._get_contrast_text_color(theme_color) + } + + def _add_contrast_color(self, color_scheme: Dict[str, str]) -> Dict[str, str]: + """add contrast color for keyword highlighting""" + theme_color = color_scheme["theme"] + hex_color = theme_color.lstrip('#') + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + + comp_r, comp_g, comp_b = self._generate_complementary_color(r, g, b) + contrast_color = self._reduce_saturation_brightness(comp_r, comp_g, comp_b) + + color_scheme["contrast"] = contrast_color + return color_scheme + + def _generate_enhanced_light_variant(self, r: int, g: int, b: int) -> str: + """generate light background color""" + h, s, v = self._rgb_to_hsv(r, g, b) + light_s = self.color_config["mono_light"]["saturation"] + light_v = self.color_config["mono_light"]["brightness"] + + new_r, new_g, new_b = self._hsv_to_rgb(h, light_s, light_v) + return f"#{int(new_r):02x}{int(new_g):02x}{int(new_b):02x}" + + def _generate_enhanced_dark_variant(self, r: int, g: int, b: int) -> str: + """generate darker variant""" + color_params = self.config["colors"]["saturation_adjustments"] + bounds = self.config["colors"]["hsv_bounds"] + + h, s, v = self._rgb_to_hsv(r, g, b) + + s_range = self.color_config["mono_dark"]["saturation_range"] + enhanced_s = min(1.0, max(s_range[0], self.color_config["mono_dark"]["saturation_default"])) + enhanced_v = max(bounds["brightness_min"], v - color_params["dark_decrease"]) + + new_r, new_g, new_b = self._hsv_to_rgb(h, enhanced_s, enhanced_v) + return f"#{int(new_r):02x}{int(new_g):02x}{int(new_b):02x}" + + def _generate_complementary_color(self, r: int, g: int, b: int) -> Tuple[int, int, int]: + """generate complementary color""" + h, s, v = self._rgb_to_hsv(r, g, b) + comp_h = (h + self.color_config["complementary"]["hue_offset"]) % 1.0 + comp_r, comp_g, comp_b = self._hsv_to_rgb(comp_h, s, v) + return int(comp_r), int(comp_g), int(comp_b) + + def _reduce_saturation_brightness(self, r: int, g: int, b: int) -> str: + """optimize contrast color for readability""" + h, s, v = self._rgb_to_hsv(r, g, b) + + font_s = self.color_config["contrast_color"]["saturation"] + font_v = self.color_config["contrast_color"]["brightness_start"] + + max_brightness = self.color_config["contrast_color"]["brightness_max"] + step = self.color_config["contrast_color"]["brightness_step"] + required_ratio = self.color_config["contrast_color"]["wcag_contrast_ratio"] + + white_rgb = self.color_config["constants"]["white_rgb"] + while font_v < max_brightness: + test_r, test_g, test_b = self._hsv_to_rgb(h, font_s, font_v) + if self._calculate_contrast_ratio(test_r, test_g, test_b, *white_rgb) >= required_ratio: + break + font_v += step + + final_r, final_g, final_b = self._hsv_to_rgb(h, font_s, font_v) + contrast_color = f"#{int(final_r):02x}{int(final_g):02x}{int(final_b):02x}" + + return contrast_color + + def _calculate_contrast_ratio(self, r1: int, g1: int, b1: int, r2: int, g2: int, b2: int) -> float: + """calculate WCAG contrast ratio between two colors""" + l1 = self._get_relative_luminance(r1, g1, b1) + l2 = self._get_relative_luminance(r2, g2, b2) + if l1 < l2: + l1, l2 = l2, l1 + + return (l1 + self.color_config["srgb"]["gamma_offset"]) / (l2 + self.color_config["srgb"]["gamma_offset"]) + + def _get_relative_luminance(self, r: int, g: int, b: int) -> float: + """calculate relative luminance for WCAG contrast calculations""" + max_rgb = self.color_config["constants"]["max_rgb"] + r_norm = r / max_rgb + g_norm = g / max_rgb + b_norm = b / max_rgb + + def gamma_correct(c): + threshold = self.color_config["srgb"]["gamma_threshold"] + if c <= threshold: + return c / self.color_config["constants"]["gamma_linear_divisor"] + else: + offset = self.color_config["srgb"]["gamma_offset"] + divisor = self.color_config["srgb"]["gamma_divisor"] + exponent = self.color_config["srgb"]["gamma_exponent"] + return pow((c + offset) / divisor, exponent) + + r_linear = gamma_correct(r_norm) + g_linear = gamma_correct(g_norm) + b_linear = gamma_correct(b_norm) + + weights = self.color_config["luminance_weights"] + return weights["red"] * r_linear + weights["green"] * g_linear + weights["blue"] * b_linear + + def _rgb_to_hsv(self, r: int, g: int, b: int) -> Tuple[float, float, float]: + """convert rgb to hsv""" + max_rgb = self.color_config["constants"]["max_rgb"] + r, g, b = r/max_rgb, g/max_rgb, b/max_rgb + max_val = max(r, g, b) + min_val = min(r, g, b) + diff = max_val - min_val + + if diff == 0: + h = 0 + elif max_val == r: + h = (60 * ((g - b) / diff) + 360) % 360 + elif max_val == g: + h = (60 * ((b - r) / diff) + 120) % 360 + else: + h = (60 * ((r - g) / diff) + 240) % 360 + + s = 0 if max_val == 0 else diff / max_val + v = max_val + + return h/360.0, s, v + + def _hsv_to_rgb(self, h: float, s: float, v: float) -> Tuple[float, float, float]: + h = h * 360 # convert back to degrees + c = v * s + x = c * (1 - abs((h / 60) % 2 - 1)) + m = v - c + + if 0 <= h < 60: + r, g, b = c, x, 0 + elif 60 <= h < 120: + r, g, b = x, c, 0 + elif 120 <= h < 180: + r, g, b = 0, c, x + elif 180 <= h < 240: + r, g, b = 0, x, c + elif 240 <= h < 300: + r, g, b = x, 0, c + else: + r, g, b = c, 0, x + + max_rgb = self.color_config["constants"]["max_rgb"] + return (r + m) * max_rgb, (g + m) * max_rgb, (b + m) * max_rgb + + def _get_contrast_text_color(self, bg_color: str) -> str: + """determine appropriate text color for given background""" + hex_color = bg_color.lstrip('#') + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + + constants = self.color_config["constants"] + brightness = (r * constants["red_weight"] + + g * constants["green_weight"] + + b * constants["blue_weight"]) / constants["brightness_divisor"] + + return (constants["white_text"] if brightness < constants["brightness_threshold"] + else constants["black_text"]) + + def _save_color_scheme(self, state: PosterState): + """save color scheme to json file""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + with open(output_dir / "color_scheme.json", "w", encoding='utf-8') as f: + json.dump(state.get("color_scheme", {}), f, indent=2) + + +def color_agent_node(state: PosterState) -> Dict[str, Any]: + result = ColorAgent()(state) + return { + **state, + "color_scheme": result["color_scheme"], + "tokens": result["tokens"], + "current_agent": result["current_agent"], + "errors": result["errors"] + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/curator.py b/dataflow_agent/toolkits/postertool/src/agents/curator.py new file mode 100644 index 00000000..c60eee27 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/curator.py @@ -0,0 +1,440 @@ +""" +spatial content planning and story board curation +""" + +import json +from pathlib import Path +from typing import Dict, Any, List + +from src.state.poster_state import PosterState +from utils.langgraph_utils import LangGraphAgent, extract_json, load_prompt +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error, log_agent_warning +from src.config.poster_config import load_config +from jinja2 import Template + +class StoryBoardCurator: + """creates spatial content plan and story board""" + + def __init__(self): + self.name = "spatial_content_planner" + self.spatial_planning_prompt = load_prompt("config/prompts/spatial_content_planner.txt") + self.config = load_config() + self.validation_config = self.config["validation"] + self.utilization_config = self.config["utilization_thresholds"] + + def __call__(self, state: PosterState) -> PosterState: + log_agent_info(self.name, "creating spatial content plan") + + try: + structured_sections = state.get("structured_sections") + narrative_content = state.get("narrative_content") + classified_visuals = state.get("classified_visuals") + + if not structured_sections: + log_agent_error(self.name, "missing structured_sections from parser") + raise ValueError("missing structured_sections from parser") + if not narrative_content: + log_agent_error(self.name, "missing narrative_content from parser") + raise ValueError("missing narrative_content from parser") + if not classified_visuals: + log_agent_error(self.name, "missing classified_visuals from parser") + raise ValueError("missing classified_visuals from parser") + + # prepare visual height context for spatial planning + visual_context = self._prepare_visual_context_for_curator(state) + + story_board, inp, out = self._create_story_board( + structured_sections, narrative_content, classified_visuals, + state.get("images", {}), state.get("tables", {}), + visual_context, state["text_model"] + ) + state["tokens"].add_text(inp, out) + + # validate height distribution + validation_result = self._validate_height_distribution(story_board, visual_context) + if validation_result["warnings"]: + log_agent_warning(self.name, f"height validation warnings: {validation_result['warnings']}") + log_agent_info(self.name, f"column utilizations: {validation_result['column_utilizations']}") + + state["story_board"] = story_board + state["current_agent"] = self.name + + self._save_story_board(state) + + # log story board summary + sections = story_board.get("spatial_content_plan", {}).get("sections", []) + total_visuals = sum(len(section.get("visual_assets", [])) for section in sections) + + log_agent_success(self.name, f"created story board with {len(sections)} sections") + log_agent_success(self.name, f"selected {total_visuals} visual assets") + + except Exception as e: + log_agent_error(self.name, f"failed: {e}") + state["errors"].append(f"{self.name}: {e}") + + return state + + def _create_story_board(self, structured_sections, narrative_content, classified_visuals, images, tables, visual_context, config): + + log_agent_info(self.name, "generating spatial content plan") + agent = LangGraphAgent("expert spatial poster designer", config) + + template_data = { + "structured_sections": json.dumps(structured_sections, indent=2), + "narrative_content": json.dumps(narrative_content, indent=2), + "classified_visuals": json.dumps(classified_visuals, indent=2), + "available_images": json.dumps({k: {"caption": v.get("caption", ""), "aspect": v.get("aspect", 1.0)} + for k, v in images.items()}, indent=2), + "available_tables": json.dumps({k: {"caption": v.get("caption", ""), "aspect": v.get("aspect", 1.0)} + for k, v in tables.items()}, indent=2), + "available_height_per_column": visual_context["available_height_per_column"], + "visual_heights_info": json.dumps(visual_context["visual_assets_heights"], indent=2) + } + + max_attempts = self.validation_config["max_llm_attempts"] + for attempt in range(max_attempts): + try: + prompt = Template(self.spatial_planning_prompt).render(**template_data) + agent.reset() + response = agent.step(prompt) + + story_board = extract_json(response.content) + + if self._validate_story_board(story_board, classified_visuals, visual_context): + log_agent_success(self.name, f"successfully created story board on attempt {attempt + 1}") + return story_board, response.input_tokens, response.output_tokens + else: + log_agent_warning(self.name, f"attempt {attempt + 1}: validation failed, retrying") + + except Exception as e: + log_agent_warning(self.name, f"story board attempt {attempt + 1} failed: {e}") + if attempt == max_attempts - 1: + raise ValueError("failed to create story board after multiple attempts") + + raise ValueError("failed to create story board") + + def _validate_story_board(self, story_board: Dict, classified_visuals: Dict = None, visual_context: Dict = None) -> bool: + """validate story board structure and constraints""" + if "spatial_content_plan" not in story_board: + log_agent_warning(self.name, "validation error: missing 'spatial_content_plan'") + return False + + scp = story_board["spatial_content_plan"] + + # check sections + if "sections" not in scp or not isinstance(scp["sections"], list): + log_agent_warning(self.name, "validation error: missing or invalid 'sections'") + return False + + sections = scp["sections"] + min_sections = self.validation_config["min_section_count"] + max_sections = self.validation_config["max_section_count"] + if len(sections) < min_sections or len(sections) > max_sections: + log_agent_warning(self.name, f"validation error: need 5-8 sections, got {len(sections)}") + return False + + # validate each section + for i, section in enumerate(sections): + required_fields = ["section_id", "section_title", "column_assignment", "vertical_priority", "text_content"] + for field in required_fields: + if field not in section: + log_agent_warning(self.name, f"validation error: section {i} missing '{field}'") + return False + + # check column assignment is valid + if section["column_assignment"] not in ["left", "middle", "right"]: + log_agent_warning(self.name, f"validation error: section {i} invalid column_assignment") + return False + + # check vertical priority is valid + if section["vertical_priority"] not in ["top", "middle", "bottom"]: + log_agent_warning(self.name, f"validation error: section {i} invalid vertical_priority") + return False + + # check section title length (4 words max) + title = section.get("section_title", "") + title_words = len(title.split()) + max_words = self.validation_config["max_title_words"] + if title_words > max_words: + log_agent_warning(self.name, f"validation error: section {i} title too long ({title_words} words): '{title}'") + return False + + # check text content is list of bullet points + min_items = self.validation_config["min_text_content_items"] + if not isinstance(section["text_content"], list) or len(section["text_content"]) < min_items: + log_agent_warning(self.name, f"validation error: section {i} invalid text_content") + return False + + # check for ellipsis in text content + for j, text in enumerate(section["text_content"]): + if "..." in text: + log_agent_warning(self.name, f"validation error: section {i} bullet {j} contains ellipsis") + return False + + # validate key_visual placement if classified_visuals provided + if classified_visuals: + key_visual = classified_visuals.get("key_visual") + if key_visual: + key_visual_found = False + key_visual_in_middle_top = False + + for section in sections: + visual_assets = section.get("visual_assets", []) + for visual in visual_assets: + if visual.get("visual_id") == key_visual: + key_visual_found = True + if (section.get("column_assignment") == "middle" and + section.get("vertical_priority") == "top"): + key_visual_in_middle_top = True + break + if key_visual_found: + break + + if not key_visual_found: + log_agent_warning(self.name, f"validation error: key_visual '{key_visual}' not found in any section") + return False + + if not key_visual_in_middle_top: + log_agent_warning(self.name, f"validation error: key_visual '{key_visual}' not placed in middle column, top priority") + return False + + # validate height exclusion compliance if visual_context provided + if visual_context: + visual_heights = visual_context.get("visual_assets_heights", {}) + oversized_visuals = [] + + # check all visual assets in the story board + for section in sections: + visual_assets = section.get("visual_assets", []) + for visual in visual_assets: + visual_id = visual.get("visual_id") + if visual_id in visual_heights: + height_info = visual_heights[visual_id] + # extract percentage value from string like "91%" + height_str = height_info.get("height_percentage", "0%") + height_percentage = float(height_str.rstrip('%')) + + if height_percentage > 50: + oversized_visuals.append(f"{visual_id} ({height_str})") + + if oversized_visuals: + # check if only one oversized visual is selected + if len(oversized_visuals) == 1: + # only one oversized visual selected, allow it as fallback + log_agent_info(self.name, f"fallback applied: allowing single oversized visual: {oversized_visuals[0]}") + else: + # multiple oversized visuals selected, only allow the smallest + selected_oversized = [] + for section in sections: + visual_assets = section.get("visual_assets", []) + for visual in visual_assets: + visual_id = visual.get("visual_id") + if visual_id in visual_heights: + height_info = visual_heights[visual_id] + height_str = height_info.get("height_percentage", "0%") + height_percentage = float(height_str.rstrip('%')) + if height_percentage > 50: + selected_oversized.append((visual_id, height_percentage, height_str)) + + smallest = min(selected_oversized, key=lambda x: x[1]) + invalid_visuals = [f"{vid} ({h_str})" for vid, h, h_str in selected_oversized if vid != smallest[0]] + log_agent_warning(self.name, f"validation error: oversized visuals (>50% height) selected: {invalid_visuals} (fallback: only smallest allowed: {smallest[0]} ({smallest[2]}))") + return False + + return True + + def _prepare_visual_context_for_curator(self, state: PosterState) -> Dict[str, Any]: + """prepare visual assets height information for curator's spatial planning""" + config = load_config() + + # get poster dimensions + poster_width = state["poster_width"] + poster_height = state["poster_height"] + + # calculate available height per column (18% of effective height for title region) + poster_margins = 2 * config["layout"]["poster_margin"] + effective_height = poster_height - poster_margins # effective height after margins + title_region_height = effective_height * config["layout"]["title_height_fraction"] # 18% fixed region + available_height = effective_height - title_region_height # remaining height for sections + + # calculate effective column width for visual sizing + column_margins = 2 * config["layout"]["poster_margin"] + column_spacing = 2 * config["layout"]["column_spacing"] # 2 gaps between 3 columns + total_column_width = poster_width - column_margins - column_spacing + column_width = total_column_width / 3 + + # account for text padding within each column + text_padding = 2 * config["layout"]["text_padding"]["left_right"] + effective_width = column_width - text_padding + + log_agent_info(self.name, f"visual context: available_height={available_height:.1f}\", effective_width={effective_width:.1f}\"") + + # calculate height for each visual asset + visual_heights = {} + + # process figures (images in state) + figures = state.get("images", {}) + for fig_id, fig_data in figures.items(): + aspect_ratio = fig_data.get("aspect", 1.0) + visual_height = effective_width / aspect_ratio + height_percentage = (visual_height / available_height) * 100 + + visual_heights[f"figure_{fig_id}"] = { + "height_inches": round(visual_height, 1), + "height_percentage": f"{height_percentage:.0f}%", + "type": "figure", + "aspect_ratio": aspect_ratio + } + log_agent_info(self.name, f"figure_{fig_id}: {visual_height:.1f}\" ({height_percentage:.0f}% of column)") + + # process tables + tables = state.get("tables", {}) + for table_id, table_data in tables.items(): + aspect_ratio = table_data.get("aspect", 1.0) + visual_height = effective_width / aspect_ratio + height_percentage = (visual_height / available_height) * 100 + + visual_heights[f"table_{table_id}"] = { + "height_inches": round(visual_height, 1), + "height_percentage": f"{height_percentage:.0f}%", + "type": "table", + "aspect_ratio": aspect_ratio + } + log_agent_info(self.name, f"table_{table_id}: {visual_height:.1f}\" ({height_percentage:.0f}% of column)") + + return { + "available_height_per_column": round(available_height, 1), + "visual_assets_heights": visual_heights, + "column_width": round(column_width, 1), + "effective_width": round(effective_width, 1) + } + + def _validate_height_distribution(self, story_board: Dict, visual_context: Dict) -> Dict[str, Any]: + """validate spatial plan for height constraints and generate warnings""" + config = load_config() + available_height = visual_context["available_height_per_column"] + visual_heights = visual_context["visual_assets_heights"] + + # extract sections from story board + sections = story_board.get("spatial_content_plan", {}).get("sections", []) + if not sections: + return {"warnings": ["No sections found in story board"], "column_utilizations": {}} + + # organize sections by column + columns = {"left": [], "middle": [], "right": []} + for section in sections: + column = section.get("column_assignment", "left") + if column in columns: + columns[column].append(section) + + # calculate estimated height for each section and column + column_utilizations = {} + warnings = [] + + for column_name, column_sections in columns.items(): + total_height = 0 + total_visual_height = 0 + total_visuals = 0 + section_details = [] + + for section in column_sections: + section_height = self._estimate_section_height(section, visual_heights, config) + total_height += section_height + + # calculate visual contribution for this section + section_visual_height = 0 + visual_assets = section.get("visual_assets", []) + for visual_asset in visual_assets: + visual_id = visual_asset.get("visual_id", "") + if visual_id in visual_heights: + section_visual_height += visual_heights[visual_id]["height_inches"] + total_visuals += 1 + + total_visual_height += section_visual_height + section_details.append({ + "section_id": section.get("section_id", "unknown"), + "estimated_height": section_height, + "visual_count": len(visual_assets), + "visual_height": round(section_visual_height, 1) + }) + + utilization = total_height / available_height if available_height > 0 else 0 + visual_density = total_visual_height / available_height if available_height > 0 else 0 + + column_utilizations[column_name] = { + "total_height": round(total_height, 1), + "utilization_percent": f"{utilization*100:.0f}%", + "visual_density_percent": f"{visual_density*100:.0f}%", + "section_count": len(column_sections), + "total_visuals": total_visuals, + "sections": section_details, + "status": "OK" if utilization <= self.utilization_config["overflow_critical"] else "OVERFLOW" + } + + if utilization > self.utilization_config["overflow_critical"]: + warnings.append(f"{column_name} column serious overflow: {utilization*100:.0f}% (visual density: {visual_density*100:.0f}%)") + elif utilization > self.utilization_config["overflow_warning"]: + warnings.append(f"{column_name} column minor overflow: {utilization*100:.0f}% (visual density: {visual_density*100:.0f}%)") + elif utilization < self.utilization_config["underutilized"]: + warnings.append(f"{column_name} column underutilized: {utilization*100:.0f}% (visual density: {visual_density*100:.0f}%)") + + if total_visuals == 0: + warnings.append(f"{column_name} column has no visuals - add visual assets") + + return { + "column_utilizations": column_utilizations, + "warnings": warnings, + "overall_status": "PASS" if not warnings else "NEEDS_OPTIMIZATION" + } + + def _estimate_section_height(self, section: Dict, visual_heights: Dict, config: Dict) -> float: + """estimate total height for a section including visuals and text""" + total_height = 0 + + # section title height (from config) + section_title_height = config["section_estimation"]["base_title_height"] + total_height += section_title_height + + # visual assets height + visual_assets = section.get("visual_assets", []) + for visual_asset in visual_assets: + visual_id = visual_asset.get("visual_id", "") + if visual_id in visual_heights: + visual_height = visual_heights[visual_id]["height_inches"] + visual_spacing = config["layout"]["visual_spacing"]["below_visual"] + total_height += visual_height + visual_spacing + + # text content height (rough estimation) + text_content = section.get("text_content", []) + text_lines = len(text_content) + bullet_height = config["section_estimation"]["bullet_point_height"] + text_height = text_lines * bullet_height + total_height += text_height + + # spacing between title and content + title_spacing = config["layout"]["title_to_content_spacing"] + total_height += title_spacing + + # section bottom spacing + section_spacing = config["layout"]["section_spacing"] + total_height += section_spacing + + return total_height + + def _save_story_board(self, state: PosterState): + """save story board to json file""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + with open(output_dir / "story_board.json", "w", encoding='utf-8') as f: + json.dump(state.get("story_board", {}), f, indent=2) + + +def curator_node(state) -> Dict[str, Any]: + result = StoryBoardCurator()(state) + return { + **state, + "story_board": result["story_board"], + "tokens": result["tokens"], + "current_agent": result["current_agent"], + "errors": result["errors"] + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/font_agent.py b/dataflow_agent/toolkits/postertool/src/agents/font_agent.py new file mode 100644 index 00000000..6254f31f --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/font_agent.py @@ -0,0 +1,339 @@ +""" +font styling and keyword highlighting +""" + +import json +import re +from pathlib import Path +from typing import Dict, Any, List + +from src.state.poster_state import PosterState +from utils.langgraph_utils import LangGraphAgent, extract_json, load_prompt +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error, log_agent_warning +from src.config.poster_config import load_config +from jinja2 import Template + + +class FontAgent: + """handles text styling and keyword highlighting""" + + def __init__(self): + self.name = "font_agent" + self.keyword_extraction_prompt = load_prompt("config/prompts/extract_keywords.txt") + + def __call__(self, state: PosterState) -> PosterState: + log_agent_info(self.name, "starting font styling") + + try: + design_layout = state.get("design_layout", []) + color_scheme = state.get("color_scheme", {}) + story_board = state.get("story_board", {}) + + if not design_layout: + raise ValueError("missing design_layout from layout agent") + if not color_scheme: + raise ValueError("missing color_scheme from color agent") + if not story_board: + raise ValueError("missing story_board from story board curator") + + # identify keywords to highlight + keywords = self._identify_keywords(story_board, state) + + # apply styling to layout + styled_layout = self._apply_styling(design_layout, color_scheme, keywords, state) + + state["styled_layout"] = styled_layout + state["keywords"] = keywords + state["current_agent"] = self.name + + self._save_styled_layout(state) + + # count total keywords across all sections + total_keywords = sum(len(kw_list) for kw_list in keywords.get("section_keywords", {}).values()) + + log_agent_success(self.name, f"applied enhanced styling to {len(styled_layout)} elements") + log_agent_success(self.name, f"identified {total_keywords} keywords for highlighting") + + except Exception as e: + log_agent_error(self.name, f"failed: {e}") + state["errors"].append(f"{self.name}: {e}") + + return state + + def _identify_keywords(self, story_board: Dict, state: PosterState) -> Dict[str, Any]: + """identify keywords using story board content and enhanced narrative""" + + enhanced_narrative = state.get("enhanced_narrative", {}) + + # extract keywords using LLM with external prompt + log_agent_info(self.name, "identifying keywords for highlighting") + + agent = LangGraphAgent("expert at identifying key terms for visual highlighting", state["text_model"]) + + template_data = { + "enhanced_narrative": json.dumps(enhanced_narrative, indent=2), + "curated_content": json.dumps(story_board, indent=2) + } + + prompt = Template(self.keyword_extraction_prompt).render(**template_data) + response = agent.step(prompt) + result = extract_json(response.content) + + # add token usage + state["tokens"].add_text(response.input_tokens, response.output_tokens) + + return result + + def _apply_styling(self, layout: List[Dict], colors: Dict, keywords: Dict, state: PosterState) -> List[Dict]: + """apply styling with proper bullet point and bold formatting""" + styled_layout = [] + section_keywords = keywords.get("section_keywords", {}) + + # process all elements with enhanced styling + for element in layout: + styled_element = element.copy() + + # apply element-specific styling + if element.get("type") == "title": + self._apply_title_styling(styled_element, colors) + + elif element.get("type") in ["section_title", "title_accent_block", "title_accent_line"]: + # these are handled by the section title designer + pass + + elif element.get("type") == "section_container": + self._apply_section_container_styling(styled_element, colors) + + elif element.get("type") in ["text", "visual", "mixed"]: + self._apply_content_styling(styled_element, colors, section_keywords) + + elif element.get("type") in ["conf_logo", "aff_logo"]: + # logos don't need text styling + pass + + styled_layout.append(styled_element) + + # sort by priority for proper rendering order + styled_layout.sort(key=lambda x: x.get("priority", 0.5)) + + return styled_layout + + def _apply_title_styling(self, element: Dict, colors: Dict): + """apply styling to title elements""" + element["font_family"] = "Helvetica Neue" + element["font_color"] = colors.get("text_on_theme", "#FFFFFF") + element["font_size"] = 100 + element["author_font_size"] = 72 + element["font_weight"] = "bold" + + def _apply_section_container_styling(self, element: Dict, colors: Dict): + """apply styling to section container elements""" + element["border_color"] = colors.get("mono_light", "#CCCCCC") + element["border_width"] = 1 + element["fill_color"] = "#FFFFFF" # white background + + def _apply_content_styling(self, element: Dict, colors: Dict, section_keywords: Dict): + """apply styling to content elements with keyword highlighting""" + # determine parent section for keyword lookup + parent_section = self._extract_parent_section(element) + keywords_for_section = section_keywords.get(parent_section, {}) + + # ensure proper bullet point formatting first (before keyword highlighting to preserve formatting) + if element.get("content"): + element["content"] = self._format_bullet_points(element["content"]) + + # apply keyword highlighting to content (after bullet formatting) + if keywords_for_section and element.get("content"): + content = element["content"] + original_content = content + content = self._apply_keyword_highlighting(content, keywords_for_section, colors) + element["content"] = content + + # debug logging + if content != original_content: + total_keywords = sum(len(kw_list) for kw_list in keywords_for_section.values() if isinstance(kw_list, list)) + log_agent_info(self.name, f"Applied highlighting to {parent_section}: found {total_keywords} keywords") + elif keywords_for_section: + total_keywords = sum(len(kw_list) for kw_list in keywords_for_section.values() if isinstance(kw_list, list)) + log_agent_warning(self.name, f"Keywords found for {parent_section} ({total_keywords} total) but no highlighting applied") + + # apply base text styling + element["font_family"] = "Arial" + element["font_color"] = colors.get("text", "#000000") + element["font_size"] = 44 + + def _extract_parent_section(self, element: Dict) -> str: + """extract parent section id from element""" + element_id = element.get("id", "") + + # extract section id from element id + if "_" in element_id and element_id.endswith("_text"): + # remove the "_text" suffix to get the section ID + return element_id[:-5] # remove last 5 characters ("_text") + elif "_" in element_id: + # fallback: remove last part after underscore + parts = element_id.split("_") + if len(parts) > 1: + return "_".join(parts[:-1]) + + return "" + + def _apply_keyword_highlighting(self, content: str, keywords: Dict, colors: Dict) -> str: + """apply semantic-based keyword highlighting with three distinct styles""" + # use contrast color for highlighting + highlight_color = colors.get("contrast", colors.get("theme", "#1E3A8A")) + + # define highlighting styles based on semantic categories + style_functions = { + "bold_contrast": lambda text: f"{text}", # contrast color (bold applied automatically in renderer) + "bold": lambda text: f"**{text}**", # just bold + "italic": lambda text: f"*{text}*" # italic + } + + # apply each style category + for style_type, style_func in style_functions.items(): + keyword_list = keywords.get(style_type, []) + for keyword in keyword_list: + if not keyword.strip(): + continue + content = self._highlight_keyword_in_content(content, keyword, style_func) + + return content + + def _highlight_keyword_in_content(self, content: str, keyword: str, style_func) -> str: + """highlight a specific keyword in content""" + if f" str: + """ensure proper bullet point formatting""" + if not content: + return content + + lines = content.split('\n') + formatted_lines = [] + + for line in lines: + line = line.strip() + if not line: + continue + + # ensure start with '•' or preserve existing '•' + if line.startswith('• '): + formatted_lines.append(line) + elif line.startswith('- '): + # dash -> bullet + formatted_lines.append('• ' + line[2:]) + elif line.startswith('* '): + # asterisk -> bullet + formatted_lines.append('• ' + line[2:]) + elif not line.startswith('•'): + # add bullet if missing (for content that should be bulleted) + if any(line.lower().startswith(word) for word in ['the ', 'this ', 'our ', 'we ', 'new ', 'key ', 'main ']): + formatted_lines.append('• ' + line) + else: + formatted_lines.append(line) + else: + formatted_lines.append(line) + + return '\n'.join(formatted_lines) + + def get_styling_interfaces(self) -> Dict[str, Any]: + """return interfaces for renderer to properly handle styled content""" + config = load_config() + font_params = config["typography"] + + return { + "bullet_point_marker": "•", + "bold_start_tag": "**", + "bold_end_tag": "**", + "italic_start_tag": "*", + "italic_end_tag": "*", + "color_start_tag": "", + "line_spacing": font_params["line_spacing"], # from config + "paragraph_spacing": font_params["paragraph_spacing"], + "font_sizes": { + "title": font_params["sizes"]["title"], + "authors": font_params["sizes"]["authors"], + "section_title": font_params["sizes"]["section_title"], + "body_text": font_params["sizes"]["body_text"] + } + } + + def _save_styled_layout(self, state: PosterState): + """save styled layout and keywords""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + + # styled layout + with open(output_dir / "styled_layout.json", "w", encoding='utf-8') as f: + json.dump(state.get("styled_layout", []), f, indent=2) + + # keywords + with open(output_dir / "keywords.json", "w", encoding='utf-8') as f: + json.dump(state.get("keywords", {}), f, indent=2) + + # styling interfaces + with open(output_dir / "styling_interfaces.json", "w", encoding='utf-8') as f: + json.dump(self.get_styling_interfaces(), f, indent=2) + + +def font_agent_node(state: PosterState) -> Dict[str, Any]: + result = FontAgent()(state) + return { + **state, + "styled_layout": result["styled_layout"], + "keywords": result.get("keywords"), + "tokens": result["tokens"], + "current_agent": result["current_agent"], + "errors": result["errors"] + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/layout_agent.py b/dataflow_agent/toolkits/postertool/src/agents/layout_agent.py new file mode 100644 index 00000000..1ae38c77 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/layout_agent.py @@ -0,0 +1,805 @@ +""" +precise layout generation using css box model +""" + +import json +from pathlib import Path +from typing import Dict, Any, List, Tuple + +from src.state.poster_state import PosterState +from utils.langgraph_utils import LangGraphAgent, extract_json, load_prompt +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error, log_agent_warning +from src.layout.text_height_measurement import measure_text_height +from src.config.poster_config import load_config + +class LayoutAgent: + """creates optimized layouts using css box model""" + + def __init__(self): + self.name = "layout_agent" + self.config = load_config() + self.poster_margin = self.config["layout"]["poster_margin"] + self.column_spacing = self.config["layout"]["column_spacing"] + self.title_height_fraction = self.config["layout"]["title_height_fraction"] + self.title_font_family = self.config["typography"]["fonts"]["title"] + self.authors_font_family = self.config["typography"]["fonts"]["authors"] + self.section_title_font_family = self.config["typography"]["fonts"]["section_title"] + self.body_text_font_family = self.config["typography"]["fonts"]["body_text"] + # layout constants + self.layout_constants = self.config["layout_constants"] + self.column_balancing = self.config["column_balancing"] + + # debug configuration + self.show_debug_borders = self.config["rendering"]["debug_borders"] ## enable to see section boundaries for debugging + + + def __call__(self, state: PosterState, mode: str = "initial") -> PosterState: + if mode == "initial": + return self._generate_initial_layout(state) + else: + return self._generate_final_layout(state) + + def _generate_initial_layout(self, state: PosterState) -> PosterState: + """generate initial layout without optimization - direct curator mapping""" + log_agent_info(self.name, "generating initial layout from story board") + + try: + story_board = state.get("story_board") + if not story_board: + raise ValueError("missing story_board from curator") + + # organize sections from story board for layout creation + sections = story_board["spatial_content_plan"]["sections"] + optimized_layout = self._organize_sections_by_column(sections) + + # create layout directly from curator output - no optimization + layout_data = self._create_precise_layout( + story_board=story_board, + optimized_layout=optimized_layout, + state=state + ) + + # generate column analysis for balancer + column_analysis = self._generate_column_analysis(layout_data, state) + + state["initial_layout_data"] = layout_data + state["column_analysis"] = column_analysis + state["current_agent"] = self.name + + self._save_initial_layout(state) + + log_agent_success(self.name, "initial layout generated") + return state + + except Exception as e: + log_agent_error(self.name, f"initial layout error: {e}") + state["errors"].append(f"{self.name}: {e}") + return state + + def _generate_final_layout(self, state: PosterState) -> PosterState: + """generate final layout from optimized story board""" + log_agent_info(self.name, "generating final layout from optimized story board") + + try: + optimized_story_board = state.get("optimized_story_board") + if not optimized_story_board: + raise ValueError("missing optimized_story_board from balancer") + + # organize sections from optimized story board + sections = optimized_story_board["spatial_content_plan"]["sections"] + organized_layout = self._organize_sections_by_column(sections) + + # create final layout from optimized story board + layout_data = self._create_precise_layout( + story_board=optimized_story_board, + optimized_layout=organized_layout, + state=state + ) + + # generate final column analysis to verify optimization success + final_column_analysis = self._generate_column_analysis(layout_data, state) + + # validate final layout + validation = self._validate_precise_layout(layout_data, state["poster_width"], state["poster_height"]) + + state["design_layout"] = layout_data + state["final_column_analysis"] = final_column_analysis + state["optimized_column_assignment"] = organized_layout["optimized_layout"]["column_assignments"] + state["current_agent"] = self.name + + self._save_final_layout(state) + + log_agent_success(self.name, "final layout complete") + return state + + except Exception as e: + log_agent_error(self.name, f"final layout error: {e}") + state["errors"].append(f"{self.name}: {e}") + return state + + def _optimize_column_distribution(self, story_board: Dict, poster_width: int, poster_height: int, config, state) -> Dict: + """rule-based column distribution for optimal space utilization""" + log_agent_info(self.name, "optimizing column distribution") + + # calculate available space + effective_height = poster_height - 2 * self.poster_margin # total height minus margins + title_region_height = effective_height * self.title_height_fraction # 18% of effective height + available_height = effective_height - title_region_height # remaining height for sections + column_width = (poster_width - 2 * self.poster_margin - 2 * self.column_spacing) / 3 + + # handle new spatial content plan format + if "spatial_content_plan" in story_board: + sections = story_board["spatial_content_plan"]["sections"] + column_distribution = story_board.get("column_distribution", {}) + else: + # fallback to old format + sections = story_board.get("story_board", {}).get("sections", []) + column_distribution = {} + + # create precise spatial layout using css-like calculations + optimized_layout = self._create_spatial_layout( + sections, column_distribution, available_height, column_width, state + ) + + log_agent_success(self.name, f"created rule-based optimized layout") + + return { + "optimized_layout": { + "column_assignments": optimized_layout, + "strategy": "rule_based_intelligent", + "space_utilization_target": 0.90, + "column_dimensions": { + "width": column_width, + "height": available_height + } + } + } + + def _apply_adjustments(self, adjustments: Dict): + """apply critic-requested adjustments to layout parameters""" + if adjustments.get("increase_spacing"): + log_agent_info(self.name, "increased spacing: adjusting layout constants") + + if adjustments.get("reduce_sizes"): + log_agent_info(self.name, "reduced spacing: adjusting layout constants") + + if adjustments.get("poster_margin"): + self.poster_margin = adjustments["poster_margin"] + + if adjustments.get("column_spacing"): + self.column_spacing = adjustments["column_spacing"] + + def _save_initial_layout(self, state: PosterState): + """save initial layout data""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + + with open(output_dir / "initial_layout_data.json", "w", encoding='utf-8') as f: + json.dump(state.get("initial_layout_data", []), f, indent=2) + + with open(output_dir / "column_analysis.json", "w", encoding='utf-8') as f: + json.dump(state.get("column_analysis", {}), f, indent=2) + + def _save_final_layout(self, state: PosterState): + """save final layout data""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + + with open(output_dir / "final_design_layout.json", "w", encoding='utf-8') as f: + json.dump(state.get("design_layout", []), f, indent=2) + + with open(output_dir / "optimized_layout.json", "w", encoding='utf-8') as f: + json.dump(state.get("optimized_column_assignment", {}), f, indent=2) + + # save final column analysis to show optimization success + if state.get("final_column_analysis"): + with open(output_dir / "final_column_analysis.json", "w", encoding='utf-8') as f: + json.dump(state.get("final_column_analysis", {}), f, indent=2) + + def _generate_column_analysis(self, layout_data: List[Dict], state: PosterState) -> Dict: + """generate detailed column utilization analysis using exact column calculation method""" + poster_width = state["poster_width"] + poster_height = state["poster_height"] + effective_height = poster_height - 2 * self.poster_margin + title_region_height = effective_height * self.title_height_fraction + available_height = effective_height - title_region_height + + # calculate precise column x coordinates using global constants + column_width = (poster_width - 2 * self.poster_margin - 2 * self.column_spacing) / 3 + left_column_x = self.poster_margin + middle_column_x = self.poster_margin + column_width + self.column_spacing + right_column_x = self.poster_margin + 2 * (column_width + self.column_spacing) + + columns = {"left": [], "middle": [], "right": []} + + # group elements by column using calculated column boundaries + for element in layout_data: + if element.get("type") == "section_container": + element_x = element.get("x", 0) + # use midpoint boundaries to categorize elements + if element_x < (left_column_x + middle_column_x) / 2: + columns["left"].append(element) + elif element_x < (middle_column_x + right_column_x) / 2: + columns["middle"].append(element) + else: + columns["right"].append(element) + + # calculate utilization for each column + column_analysis = { + "available_height": available_height, + "columns": {} + } + + for col_name, elements in columns.items(): + if elements: + max_bottom = max(elem["y"] + elem["height"] for elem in elements) + min_top = min(elem["y"] for elem in elements) + used_height = max_bottom - min_top + else: + used_height = 0 + + utilization_rate = used_height / available_height if available_height > 0 else 0 + + status = "overflow" if utilization_rate > 1.0 else "underutilized" if utilization_rate < 0.7 else "balanced" + + column_analysis["columns"][col_name] = { + "utilization_rate": utilization_rate, + "total_height": used_height, + "status": status, + "available_space": max(0, available_height - used_height), + "excess_height": max(0, used_height - available_height) + } + + return column_analysis + + def _organize_sections_by_column(self, sections: List[Dict]) -> Dict: + """organize sections by column assignment for layout creation""" + columns = {"left": [], "middle": [], "right": []} + + for section in sections: + column = section.get("column_assignment", "left") + if column in columns: + columns[column].append(section) + + column_assignments = [ + {"column_id": 0, "sections": columns["left"]}, + {"column_id": 1, "sections": columns["middle"]}, + {"column_id": 2, "sections": columns["right"]} + ] + + return { + "optimized_layout": { + "column_assignments": column_assignments + } + } + + def _create_precise_layout(self, story_board: Dict, optimized_layout: Dict, state: PosterState) -> List[Dict]: + """create precise layout with exact positioning using measurements""" + layout_elements = [] + + # poster dimensions + poster_width = state["poster_width"] + poster_height = state["poster_height"] + + # calculate layout dimensions + effective_height = poster_height - 2 * self.poster_margin + title_region_height = effective_height * self.title_height_fraction # 18% fixed region + available_height = effective_height - title_region_height # remaining for sections + column_width = (poster_width - 2 * self.poster_margin - 2 * self.column_spacing) / 3 + + # add title element (still uses actual measured height, not fixed region height) + title_element = self._create_title_element(state, poster_width, title_region_height) + if title_element: + layout_elements.append(title_element) + + # add logo elements + logo_elements = self._create_logo_elements(state, poster_width) + layout_elements.extend(logo_elements) + + # process each column + column_assignments = optimized_layout.get("optimized_layout", {}).get("column_assignments", []) + + for col_idx, column in enumerate(column_assignments): + column_x = self.poster_margin + col_idx * (column_width + self.column_spacing) + column_y = self.poster_margin + title_region_height # fixed at poster_margin + 18% + + current_y = column_y + + # process each section in this column + for section in column.get("sections", []): + section_start_y = current_y + section_elements = self._create_section_elements( + section, column_x, current_y, column_width, state, available_height + ) + + # calculate section height from actual element positions + section_height = 0 + if section_elements: + # find the bottommost element + max_bottom = 0 + for element in section_elements: + element_bottom = element["y"] + element["height"] + max_bottom = max(max_bottom, element_bottom) + section_height = max_bottom - section_start_y + + # create section container for layout structure + section_container = { + "type": "section_container", + "x": column_x, + "y": section_start_y, + "width": column_width, + "height": section_height, + "section_id": section.get("section_id", "unknown"), + "importance_level": section.get("importance_level", 2), # importance level for background styling + "priority": 0.1 + } + + # add debug border only if enabled + if self.show_debug_borders: + section_container["debug_border"] = True + + layout_elements.append(section_container) + + layout_elements.extend(section_elements) + current_y += section_height + 1.0 # 1" section spacing for stability + + log_agent_info(self.name, f"placed section '{section.get('section_id')}' at y={section_start_y:.2f}, height={section_height:.2f}") + + return layout_elements + + def _create_title_element(self, state: PosterState, poster_width: float, title_height: float) -> Dict: + """create title element with exact positioning""" + # calculate 2/3 width (2 columns + 1 margin width) + column_width = (poster_width - 2 * self.poster_margin - 2 * self.column_spacing) / 3 + title_width = 2 * column_width + self.column_spacing # 2 columns + 1 spacing + + # extract title and authors from narrative content + narrative = state.get("narrative_content", {}) + meta = narrative.get("meta", {}) + poster_title = meta.get("poster_title", state.get('poster_name', 'Title')) + authors = meta.get("authors", state.get('authors', 'Authors')) + + return { + "type": "title", + "x": self.poster_margin, + "y": self.poster_margin, + "width": title_width, + "height": title_height - 1.0, + "content": f"{poster_title}\n{authors}", + "font_family": self.title_font_family, + "font_size": 100, + "author_font_size": 72, + "priority": 1.0 + } + + def _create_logo_elements(self, state: PosterState, poster_width: float) -> List[Dict]: + """create logo elements with exact positioning""" + elements = [] + + # get aspect ratio of logos + from PIL import Image + conf_logo_aspect_ratio = self.layout_constants["default_logo_aspect_ratio"] + aff_logo_aspect_ratio = self.layout_constants["default_logo_aspect_ratio"] + if state.get("logo_path") and Path(state["logo_path"]).exists(): + with Image.open(state["logo_path"]) as img: + conf_logo_aspect_ratio = img.size[0] / img.size[1] + if state.get("aff_logo_path") and Path(state["aff_logo_path"]).exists(): + with Image.open(state["aff_logo_path"]) as img: + aff_logo_aspect_ratio = img.size[0] / img.size[1] + + # calculate logo heights based on fit in 1/3 of poster width + column_width = (poster_width - 2 * self.poster_margin - 2 * self.column_spacing) / 3 + logo_height = (column_width - 1) / (conf_logo_aspect_ratio + aff_logo_aspect_ratio) + # widths based on aspect ratios + conf_logo_width = logo_height * conf_logo_aspect_ratio + aff_logo_width = logo_height * aff_logo_aspect_ratio + + conf_logo_x = poster_width - self.poster_margin - conf_logo_width + aff_logo_x = conf_logo_x - 1.0 - aff_logo_width + + if state.get("aff_logo_path"): + elements.append({ + "type": "aff_logo", + "x": aff_logo_x, + "y": self.poster_margin, + "width": aff_logo_width, + "height": logo_height, + "priority": 0.9 + }) + + if state.get("logo_path"): + elements.append({ + "type": "conf_logo", + "x": conf_logo_x, + "y": self.poster_margin, + "width": conf_logo_width, + "height": logo_height, + "priority": 0.9 + }) + + return elements + + def _create_section_elements(self, section: Dict, column_x: float, start_y: float, + column_width: float, state: PosterState, available_height: float = None) -> List[Dict]: + """create all elements for a section with precise positioning""" + elements = [] + current_y = start_y + + # enhanced section title with design styling + section_title = section.get("section_title", "") + if section_title: + title_elements = self._create_section_title_design( + section, column_x, current_y, column_width, state + ) + elements.extend(title_elements) + + # calculate total height used by title and accent elements + title_total_height = max(elem["y"] + elem["height"] - current_y for elem in title_elements) + current_y += title_total_height + self.config["layout"]["title_to_content_spacing"] + + # visual assets first (after title, before text) + visual_assets = section.get("visual_assets", []) + for visual_asset in visual_assets: + visual_id = visual_asset.get("visual_id", "") + # apply same padding as text elements + visual_padding = self.config["layout"]["text_padding"]["left_right"] # left/right padding + visual_width = column_width - (2 * visual_padding) + final_visual_width, final_visual_height, scale_factor = self._calculate_visual_height(visual_id, visual_width, state, available_height) + + # center the visual within the section (important for scaled visuals) + section_content_width = column_width - (2 * visual_padding) + if final_visual_width < section_content_width: + # center horizontally within the section + visual_x = column_x + visual_padding + (section_content_width - final_visual_width) / 2 + else: + # use left alignment if visual fills the section + visual_x = column_x + visual_padding + + elements.append({ + "type": "visual", + "x": visual_x, + "y": current_y, + "width": final_visual_width, + "height": final_visual_height, + "visual_id": visual_id, + "scale_factor": scale_factor, # for renderer to apply proper scaling + "priority": 0.6, + "id": f"{section.get('section_id')}_{visual_id}", + "font_family": self.body_text_font_family, + "font_color": "#000000", + "font_size": 44, + "line_spacing": 1.0 + }) + # use the already-scaled height for positioning (no double scaling) + current_y += final_visual_height + self.config["layout"]["visual_spacing"]["below_visual"] + + # text content (after visuals) + text_content = section.get("text_content", []) + if text_content: + combined_text = "\n".join(text_content) + text_padding = self.config["layout"]["text_padding"]["left_right"] # consistent with layout positioning + text_measurement = measure_text_height( + text_content=combined_text, + width_inches=column_width - (2 * text_padding), + font_name=self.body_text_font_family, + font_size=44, + line_spacing=1.0 + ) + text_height = text_measurement["optimal_height"] + 0.1 + + # apply text padding to match measurement calculation + elements.append({ + "type": "text", + "x": column_x + text_padding, + "y": current_y, + "width": column_width - (2 * text_padding), + "height": text_height, + "content": combined_text, + "font_family": self.body_text_font_family, + "font_size": 44, + "font_color": "#000000", + "priority": 0.5, + "id": f"{section.get('section_id')}_text", + "line_spacing": 1.0 + }) + current_y += text_height + 0.3 + + return elements + + def _create_section_title_design(self, section: Dict, column_x: float, start_y: float, column_width: float, state: PosterState) -> List[Dict]: + """create section title with colorblock styling""" + elements = [] + section_title = section.get("section_title", "") + section_id = section.get("section_id", "") + + # get section title design from state + title_design = state.get("section_title_design", {}).get("section_title_design", {}) + + # find specific section application + section_app = None + for app in title_design.get("section_applications", []): + if app.get("section_id") == section_id: + section_app = app + break + + # extract styling information + title_styling = section_app.get("title_styling", {}) + accent_styling = section_app.get("accent_styling", {}) + + # create title textbox positioning + title_padding = self.layout_constants["title_padding"] + title_width = column_width - (2 * title_padding) + base_title_x = column_x + title_padding + + # use font size from styling_interfaces + styling_interfaces = state.get("styling_interfaces", {}) + section_title_font_size = styling_interfaces.get("font_sizes", {}).get("section_title", 64) + + # calculate rectangle dimensions (same as before) + rect_height = section_title_font_size / 72 # convert pt to inches precisely + rect_width = rect_height * 0.618 # golden ratio width + + # apply user-requested coordinate modifications + rect_y_offset = 10 / 72 # 10pt converted to inches + title_x_offset = rect_height # offset by rectangle height + + # create rectangle background element with y offset + rectangle_element = { + "type": "title_accent_block", + "x": base_title_x, + "y": start_y + rect_y_offset, # user modification: y + 10pt + "width": rect_width, + "height": rect_height, + "color": accent_styling.get("color", "#335f91"), + "priority": 0.7 + } + elements.append(rectangle_element) + + # adjust title content (add 4 spaces prefix for rectangle_left template) + display_title = " " + section_title + + # create title element with x offset using precise font-based height + precise_title_height = section_title_font_size / 72 # pt to inches + + title_element = { + "type": "section_title", + "x": base_title_x + title_x_offset, # x + rectangle height + "y": start_y, + "width": title_width, + "height": precise_title_height, + "section_title": display_title, + "font_family": title_styling.get("font_family", self.section_title_font_family), + "font_size": section_title_font_size, + "font_weight": title_styling.get("font_weight", "bold"), + "font_color": title_styling.get("color", "#000000"), + "alignment": title_styling.get("alignment", "left"), + "priority": 0.8 + } + elements.append(title_element) + + return elements + + def _validate_precise_layout(self, layout_data: List[Dict], poster_width: float, + poster_height: float) -> Dict[str, Any]: + """validate layout for overlaps and overflow""" + issues = [] + valid = True + + # check for overflow + for element in layout_data: + right_edge = element["x"] + element["width"] + bottom_edge = element["y"] + element["height"] + + if right_edge > poster_width: + issues.append(f"Element {element.get('id', 'unknown')} overflows right edge") + valid = False + + if bottom_edge > poster_height: + issues.append(f"Element {element.get('id', 'unknown')} overflows bottom edge") + valid = False + + # check for overlaps (simplified check) + for i, elem1 in enumerate(layout_data): + for j, elem2 in enumerate(layout_data[i+1:], i+1): + if self._elements_overlap(elem1, elem2): + issues.append(f"Elements {elem1.get('id', 'unknown')} and {elem2.get('id', 'unknown')} overlap") + valid = False + + # calculate space utilization + total_used_area = sum(elem["width"] * elem["height"] for elem in layout_data) + total_poster_area = poster_width * poster_height + space_utilization = total_used_area / total_poster_area if total_poster_area > 0 else 0 + + return { + "valid": valid, + "issues": issues, + "space_utilization": space_utilization, + "total_elements": len(layout_data) + } + + def _elements_overlap(self, elem1: Dict, elem2: Dict) -> bool: + """check if two elements overlap""" + return not ( + elem1["x"] + elem1["width"] <= elem2["x"] or + elem2["x"] + elem2["width"] <= elem1["x"] or + elem1["y"] + elem1["height"] <= elem2["y"] or + elem2["y"] + elem2["height"] <= elem1["y"] + ) + + def _create_spatial_layout(self, sections: List[Dict], column_distribution: Dict, + available_height: float, column_width: float, state: PosterState) -> List[Dict]: + """create precise spatial layout using css-like calculations""" + + log_agent_info(self.name, "creating spatial layout with css-like precision") + + # organize sections by spatial assignment + columns = { + "left": {"sections": [], "total_height": 0.0}, + "middle": {"sections": [], "total_height": 0.0}, + "right": {"sections": [], "total_height": 0.0} + } + + for section in sections: + column = section.get("column_assignment", "left") + if column in columns: + columns[column]["sections"].append(section) + + log_agent_info(self.name, f"organized sections: left={len(columns['left']['sections'])}, middle={len(columns['middle']['sections'])}, right={len(columns['right']['sections'])}") + + # calculate precise heights for each section + for column_name, column_data in columns.items(): + for section in column_data["sections"]: + section_height = self._calculate_precise_section_height(section, column_width, state, available_height) + section["calculated_height"] = section_height + column_data["total_height"] += section_height + + + # return layout in expected format + return [{ + "column_id": 0, + "sections": [s for s in sections if s.get("column_assignment") == "left"], + "estimated_height": columns["left"]["total_height"] + }, { + "column_id": 1, + "sections": [s for s in sections if s.get("column_assignment") == "middle"], + "estimated_height": columns["middle"]["total_height"] + }, { + "column_id": 2, + "sections": [s for s in sections if s.get("column_assignment") == "right"], + "estimated_height": columns["right"]["total_height"] + }] + + def _calculate_precise_section_height(self, section: Dict, column_width: float, state: PosterState, available_height: float = None) -> float: + """calculate precise section height using css box model""" + + total_height = 0.0 + + # section title height (if exists) + title = section.get("section_title", "") + if title: + title_padding = self.layout_constants["title_padding"] # consistent with layout positioning + title_measurement = measure_text_height( + text_content=title, + width_inches=column_width - (2 * title_padding), # account for padding + font_name="Helvetica Neue", + font_size=64, + line_spacing=1.0 + ) + title_height = title_measurement["optimal_height"] + 0.3 # title margin + total_height += title_height + + # text content height with fixed line spacing + text_content = section.get("text_content", []) + if text_content: + # join all bullet points with proper paragraph separation + full_text = "\n\n".join(text_content) # double newline between paragraphs + + text_padding = self.config["layout"]["text_padding"]["left_right"] # consistent with layout positioning + text_measurement = measure_text_height( + text_content=full_text, + width_inches=column_width - (2 * text_padding), # account for padding + font_name=self.body_text_font_family, + font_size=44, + line_spacing=1.0 + ) + text_height = text_measurement["optimal_height"] + 0.2 # text margin + total_height += text_height + + # visual assets height (fixed aspect ratio) + visual_assets = section.get("visual_assets", []) + for visual in visual_assets: + visual_id = visual.get("visual_id", "") + if visual_id: + visual_padding = self.layout_constants["visual_padding"] # consistent with layout positioning + visual_width = column_width - (2 * visual_padding) + final_visual_width, final_visual_height, scale_factor = self._calculate_visual_height(visual_id, visual_width, state, available_height) + # use the already-scaled height for section sizing (no double scaling) + total_height += final_visual_height + 0.3 # visual margin + + # section padding and margins + section_padding = self.layout_constants["section_padding"] + total_height += section_padding + + return total_height + + def _calculate_visual_height(self, visual_id: str, visual_width: float, state, available_height: float = None) -> tuple: + """calculate proper visual width and height based on aspect ratio with auto-shrinking for large visuals + + returns: (final_width, final_height, scale_factor) + """ + # visual width already accounts for padding (passed from caller) + + # get aspect ratio from state data + images = state.get("images", {}) + tables = state.get("tables", {}) + + # better default aspect ratios based on visual type + if visual_id.startswith("table_"): + aspect_ratio = 1.5 # tables are often wider than tall + elif visual_id.startswith("figure_"): + aspect_ratio = 1.2 # figures vary but often slightly wider + else: + aspect_ratio = self.layout_constants["default_logo_aspect_ratio"] # default square + + # handle both formats: "figure_1"/"table_1" and "1"/"2" etc. + lookup_id = visual_id + + # if visual_id has prefix, extract the number + if visual_id.startswith("figure_"): + lookup_id = visual_id.replace("figure_", "") + elif visual_id.startswith("table_"): + lookup_id = visual_id.replace("table_", "") + + # check in appropriate collection first based on visual_id prefix + if visual_id.startswith("table_") and lookup_id in tables: + found_aspect = tables[lookup_id].get("aspect", aspect_ratio) + aspect_ratio = found_aspect + log_agent_info(self.name, f"found visual {visual_id} -> {lookup_id} in tables, aspect={aspect_ratio:.2f}") + elif visual_id.startswith("figure_") and lookup_id in images: + found_aspect = images[lookup_id].get("aspect", aspect_ratio) + aspect_ratio = found_aspect + log_agent_info(self.name, f"found visual {visual_id} -> {lookup_id} in images, aspect={aspect_ratio:.2f}") + elif lookup_id in images: + found_aspect = images[lookup_id].get("aspect", aspect_ratio) + aspect_ratio = found_aspect + log_agent_info(self.name, f"found visual {visual_id} -> {lookup_id} in images, aspect={aspect_ratio:.2f}") + elif lookup_id in tables: + found_aspect = tables[lookup_id].get("aspect", aspect_ratio) + aspect_ratio = found_aspect + log_agent_info(self.name, f"found visual {visual_id} -> {lookup_id} in tables, aspect={aspect_ratio:.2f}") + else: + log_agent_warning(self.name, f"visual {visual_id} (lookup: {lookup_id}) not found in state data, using fallback aspect={aspect_ratio:.2f}") + # debug: log available visual data + log_agent_info(self.name, f"available images: {list(images.keys())}") + log_agent_info(self.name, f"available tables: {list(tables.keys())}") + + # calculate original height from aspect ratio + original_height = visual_width / aspect_ratio + + # check if shrinking is needed (height > 40% of column height) + scale_factor = 1.0 + if available_height and original_height > (available_height * 0.4): + scale_factor = 0.8 # shrink to 80% of original size + log_agent_info(self.name, f"visual {visual_id} too large ({original_height:.2f}\" > 40% of {available_height:.2f}\"), shrinking to 80%") + + # apply scaling to both width and height to maintain aspect ratio + final_width = visual_width * scale_factor + final_height = original_height * scale_factor + + log_agent_info(self.name, f"visual {visual_id}: orig_w={visual_width:.2f}\", orig_h={original_height:.2f}\", scale={scale_factor:.1f}, final_w={final_width:.2f}\", final_h={final_height:.2f}\"") + + # return final width, height and scale factor for rendering + return final_width, final_height, scale_factor + + + +def layout_agent_node(state: PosterState) -> Dict[str, Any]: + result = LayoutAgent()(state) + return { + **state, + "design_layout": result["design_layout"], + "column_assignment": result.get("column_assignment"), + "tokens": result["tokens"], + "current_agent": result["current_agent"], + "errors": result["errors"] + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/layout_with_balancer.py b/dataflow_agent/toolkits/postertool/src/agents/layout_with_balancer.py new file mode 100644 index 00000000..1b9ac560 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/layout_with_balancer.py @@ -0,0 +1,94 @@ +""" +3-phase layout optimization orchestrator +""" + +import json +from pathlib import Path +from typing import Dict, Any +from src.state.poster_state import PosterState +from src.agents.layout_agent import LayoutAgent +from src.agents.balancer_agent import BalancerAgent +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error + +class LayoutWithBalancerAgent: + def __init__(self): + self.name = "layout_with_balancer" + self.layout_agent = LayoutAgent() + self.balancer_agent = BalancerAgent() + + def __call__(self, state: PosterState) -> PosterState: + """execute 3-phase layout optimization""" + log_agent_info(self.name, "starting 3-phase layout optimization") + + try: + # phase 1: initial layout generation + log_agent_info(self.name, "phase 1: generating initial layout") + initial_state = self.layout_agent(state, mode="initial") + if initial_state.get("errors"): + return initial_state + + # phase 2: balancer optimization + log_agent_info(self.name, "phase 2: optimizing with balancer") + balancer_result = self.balancer_agent( + initial_layout_data=initial_state["initial_layout_data"], + column_analysis=initial_state["column_analysis"], + state=initial_state + ) + + # save balancer decisions + self._save_balancer_output(balancer_result, initial_state) + + # update state with optimized story board + initial_state["optimized_story_board"] = balancer_result["optimized_story_board"] + initial_state["balancer_decisions"] = balancer_result["balancer_decisions"] + + # phase 3: final layout generation + log_agent_info(self.name, "phase 3: generating final layout") + final_state = self.layout_agent(initial_state, mode="final") + if final_state.get("errors"): + return final_state + + # update token counts + final_state["tokens"].add_text( + balancer_result.get("input_tokens", 0), + balancer_result.get("output_tokens", 0) + ) + + log_agent_success(self.name, "3-phase layout optimization complete") + return final_state + + except Exception as e: + log_agent_error(self.name, f"3-phase optimization error: {e}") + return {"errors": [f"{self.name}: {e}"]} + + def _save_balancer_output(self, balancer_result: Dict, state: PosterState): + """save balancer optimization results""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + + with open(output_dir / "optimized_story_board.json", "w", encoding='utf-8') as f: + json.dump(balancer_result["optimized_story_board"], f, indent=2) + + with open(output_dir / "balancer_decisions.json", "w", encoding='utf-8') as f: + json.dump(balancer_result["balancer_decisions"], f, indent=2) + + +def layout_with_balancer_node(state: PosterState) -> Dict[str, Any]: + """layout with balancer node for langgraph""" + try: + agent = LayoutWithBalancerAgent() + result = agent(state) + + return { + **state, + "design_layout": result.get("design_layout"), + "optimized_column_assignment": result.get("optimized_column_assignment"), + "optimized_story_board": result.get("optimized_story_board"), + "balancer_decisions": result.get("balancer_decisions"), + "tokens": result.get("tokens"), + "current_agent": result.get("current_agent"), + "errors": result.get("errors", []) + } + except Exception as e: + log_agent_error("layout_with_balancer", f"node error: {e}") + return {**state, "errors": state.get("errors", []) + [f"layout_with_balancer: {e}"]} \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/parser.py b/dataflow_agent/toolkits/postertool/src/agents/parser.py new file mode 100644 index 00000000..0aa8f559 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/parser.py @@ -0,0 +1,435 @@ +""" +pdf text and asset extraction +""" + +import json +import random +import re +from pathlib import Path +from typing import Dict, Any, Tuple + +from marker.converters.pdf import PdfConverter +from marker.renderers.markdown import MarkdownRenderer +from marker.models import create_model_dict +from marker.output import text_from_rendered +from marker.schema import BlockTypes +from jinja2 import Template + +from src.state.poster_state import PosterState +from utils.langgraph_utils import LangGraphAgent, extract_json, load_prompt +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error, log_agent_warning +from src.config.poster_config import load_config + + +class Parser: + def __init__(self): + self.name = "parser" + config_data = load_config() + batch_config = config_data["pdf_processing"]["batch_sizes"] + config = { + "recognition_batch_size": batch_config["recognition"], + "layout_batch_size": batch_config["layout"], + "detection_batch_size": batch_config["detection"], + "table_rec_batch_size": batch_config["table_rec"], + "ocr_error_batch_size": batch_config["ocr_error"], + "equation_batch_size": batch_config["equation"], + "disable_tqdm": False, + } + + self.converter = PdfConverter(artifact_dict=create_model_dict(), config=config) + self.clean_pattern = re.compile(r"") + self.enhanced_abt_prompt = load_prompt("config/prompts/narrative_abt_extraction.txt") + self.visual_classification_prompt = load_prompt("config/prompts/classify_visuals.txt") + self.title_authors_prompt = load_prompt("config/prompts/extract_title_authors.txt") + self.section_extraction_prompt = load_prompt("config/prompts/extract_structured_sections.txt") + + def __call__(self, state: PosterState) -> PosterState: + log_agent_info(self.name, "starting foundation building") + + try: + output_dir = Path(state["output_dir"]) + content_dir = output_dir / "content" + assets_dir = output_dir / "assets" + content_dir.mkdir(parents=True, exist_ok=True) + assets_dir.mkdir(parents=True, exist_ok=True) + + # extract raw text and assets + raw_text, raw_result = self._extract_raw_text(state["pdf_path"], content_dir) + + figures, tables = self._extract_assets(raw_result, state["poster_name"], assets_dir) + + # extract title and authors from raw text + title, authors = self._extract_title_authors(raw_text, state["text_model"]) + + # generate narrative content + narrative_content, inp_tok, out_tok = self._generate_narrative_content(raw_text, state["text_model"]) + state["tokens"].add_text(inp_tok, out_tok) + + # classify visual assets by importance + classified_visuals, inp_tok2, out_tok2 = self._classify_visual_assets(figures, tables, raw_text, state["text_model"]) + state["tokens"].add_text(inp_tok2, out_tok2) + + # narrative metadata + narrative_content["meta"] = { + "poster_title": title, + "authors": authors + } + + # extract structured sections from raw text + structured_sections = self._extract_structured_sections(raw_text, state["text_model"]) + + # save artifacts and update state + self._save_content(narrative_content, "narrative_content.json", content_dir) + self._save_content(classified_visuals, "classified_visuals.json", content_dir) + self._save_content(structured_sections, "structured_sections.json", content_dir) + self._save_raw_text(raw_text, content_dir) + + state["raw_text"] = raw_text + state["structured_sections"] = structured_sections + state["narrative_content"] = narrative_content + state["classified_visuals"] = classified_visuals + state["images"] = figures + state["tables"] = tables + state["current_agent"] = self.name + + log_agent_success(self.name, f"extracted raw text, {len(figures)} images, and {len(tables)} tables") + log_agent_success(self.name, f"extracted title: {title}") + log_agent_success(self.name, "generated enhanced abt narrative") + log_agent_success(self.name, f"classified visuals: key={classified_visuals.get('key_visual', 'none')}, problem_ill={len(classified_visuals.get('problem_illustration', []))}, method_wf={len(classified_visuals.get('method_workflow', []))}, main_res={len(classified_visuals.get('main_results', []))}, comp_res={len(classified_visuals.get('comparative_results', []))}, support={len(classified_visuals.get('supporting', []))}") + + except Exception as e: + log_agent_error(self.name, f"failed: {e}") + state["errors"].append(str(e)) + + return state + + def _extract_raw_text(self, pdf_path: str, content_dir: Path) -> Tuple[str, Any]: + log_agent_info(self.name, "converting pdf to raw text") + document = self.converter.build_document(pdf_path) + + # create renderer and get rendered output from the existing document + renderer = self.converter.resolve_dependencies(MarkdownRenderer) + rendered = renderer(document) + + text, _, images = text_from_rendered(rendered) + text = self.clean_pattern.sub("", text) + + (content_dir / "raw.md").write_text(text, encoding="utf-8") + + log_agent_info(self.name, f"extracted {len(text)} chars") + + raw_result = (document, rendered, images) + return text, raw_result + + def _generate_narrative_content(self, text: str, config) -> Tuple[Dict, int, int]: + log_agent_info(self.name, "generating abt narrative") + agent = LangGraphAgent("expert poster design consultant", config) + + for attempt in range(3): + try: + prompt = Template(self.enhanced_abt_prompt).render(markdown_document=text) + agent.reset() + response = agent.step(prompt) + + narrative = extract_json(response.content) + + if "and" in narrative and "but" in narrative and "therefore" in narrative: + return narrative, response.input_tokens, response.output_tokens + + except Exception as e: + log_agent_warning(self.name, f"attempt {attempt + 1} failed: {e}") + if attempt == 2: + raise + + raise ValueError("failed to generate enhanced narrative after 3 attempts") + + def _save_content(self, content: Dict, filename: str, content_dir: Path): + with open(content_dir / filename, 'w', encoding='utf-8') as f: + json.dump(content, f, indent=2) + + def _save_raw_text(self, raw_text: str, content_dir: Path): + with open(content_dir / "raw.md", 'w', encoding='utf-8') as f: + f.write(raw_text) + + def _extract_assets(self, result, name: str, assets_dir: Path) -> Tuple[Dict, Dict]: + log_agent_info(self.name, "extracting assets") + + document, rendered, marker_images = result + + caption_map = self._extract_captions(document) + + figures = {} + tables = {} + image_count = 0 + table_count = 0 + + for img_name, pil_image in marker_images.items(): + caption_info = caption_map.get(img_name, {'captions': [], 'block_type': 'Unknown'}) + + if 'table' in img_name.lower() or 'Table' in img_name or caption_info.get('block_type') == 'Table': + table_count += 1 + path = assets_dir / f"table-{table_count}.png" + pil_image.save(path, "PNG") + + tables[str(table_count)] = { + 'caption': caption_info['captions'][0] if caption_info['captions'] else f"Table {table_count}", + 'path': str(path), + 'width': pil_image.width, + 'height': pil_image.height, + 'aspect': pil_image.width / pil_image.height if pil_image.height > 0 else 1, + } + else: + image_count += 1 + path = assets_dir / f"figure-{image_count}.png" + pil_image.save(path, "PNG") + + figures[str(image_count)] = { + 'caption': caption_info['captions'][0] if caption_info['captions'] else f"Figure {image_count}", + 'path': str(path), + 'width': pil_image.width, + 'height': pil_image.height, + 'aspect': pil_image.width / pil_image.height if pil_image.height > 0 else 1, + } + + with open(assets_dir / "figures.json", 'w', encoding='utf-8') as f: + json.dump(figures, f, indent=2) + with open(assets_dir / "tables.json", 'w', encoding='utf-8') as f: + json.dump(tables, f, indent=2) + with open(assets_dir / "fig_tab_caption_mapping.json", 'w', encoding='utf-8') as f: + json.dump(caption_map, f, indent=2, ensure_ascii=False) + + return figures, tables + + def _extract_captions(self, document): + caption_map = {} + + for page in document.pages: + for block_id in page.structure: + block = page.get_block(block_id) + + if block.block_type in [BlockTypes.FigureGroup, BlockTypes.TableGroup, BlockTypes.PictureGroup]: + child_blocks = block.structure_blocks(page) + figure_or_table = None + captions = [] + + for child in child_blocks: + child_block = page.get_block(child) + if child_block.block_type in [BlockTypes.Figure, BlockTypes.Table, BlockTypes.Picture]: + figure_or_table = child_block + elif child_block.block_type in [BlockTypes.Caption, BlockTypes.Footnote]: + captions.append(child_block.raw_text(document)) + + if figure_or_table: + image_filename = f"{figure_or_table.id.to_path()}.jpeg" + caption_map[image_filename] = { + 'block_id': str(figure_or_table.id), + 'block_type': str(figure_or_table.block_type), + 'captions': captions, + 'page': page.page_id + } + + elif block.block_type in [BlockTypes.Figure, BlockTypes.Table, BlockTypes.Picture]: + image_filename = f"{block.id.to_path()}.jpeg" + if image_filename not in caption_map: + nearby_captions = self._find_nearby_captions(page, block, document) + caption_map[image_filename] = { + 'block_id': str(block.id), + 'block_type': str(block.block_type), + 'captions': nearby_captions, + 'page': page.page_id + } + + return caption_map + + def _find_nearby_captions(self, page, target_block, document): + captions = [] + + # Check all blocks on the page for captions + for block_id in page.structure: + block = page.get_block(block_id) + if block.block_type in [BlockTypes.Caption, BlockTypes.Text]: + caption_text = block.raw_text(document) + # Look for figure/table keywords and check if it's nearby + if any(keyword in caption_text for keyword in ['Figure', 'Table', 'Fig.']): + captions.append(caption_text) + + # If no captions found, try previous/next blocks + if not captions: + for block in [page.get_prev_block(target_block), page.get_next_block(target_block)]: + if block and block.block_type in [BlockTypes.Caption, BlockTypes.Text]: + caption_text = block.raw_text(document) + if any(keyword in caption_text for keyword in ['Figure', 'Table', 'Fig.']): + captions.append(caption_text) + + return captions + + def _cleanup_unused_assets(self, output_dir: Path, name: str, images: Dict, tables: Dict): + valid_paths = set() + for img_data in images.values(): + valid_paths.add(Path(img_data['path']).name) + for table_data in tables.values(): + valid_paths.add(Path(table_data['path']).name) + + for png_file in output_dir.glob(f"{name}-*.png"): + if png_file.name not in valid_paths: + png_file.unlink() + + def _extract_title_authors(self, text: str, config) -> Tuple[str, str]: + """extract title and authors via llm api""" + log_agent_info(self.name, "extracting title and authors with llm") + agent = LangGraphAgent("expert academic paper parser", config) + + for attempt in range(3): + try: + prompt = Template(self.title_authors_prompt).render(markdown_document=text) + agent.reset() + response = agent.step(prompt) + + result = extract_json(response.content) + + if "title" in result and "authors" in result: + title = result["title"].strip() + authors = result["authors"].strip() + + # validate format + if title and authors: + return title, authors + + except Exception as e: + log_agent_warning(self.name, f"title/authors extraction attempt {attempt + 1} failed: {e}") + if attempt == 2: + return "Untitled", "Authors not found" + + return "Untitled", "Authors not found" + + + def _classify_visual_assets(self, figures: Dict, tables: Dict, raw_text: str, config) -> Tuple[Dict, int, int]: + # combine all visuals for classification + all_visuals = [] + for fig_id, fig_data in figures.items(): + all_visuals.append({ + "id": f"figure_{fig_id}", + "type": "figure", + "caption": fig_data.get("caption", ""), + "aspect_ratio": fig_data.get("aspect", 1.0) + }) + + for tab_id, tab_data in tables.items(): + all_visuals.append({ + "id": f"table_{tab_id}", + "type": "table", + "caption": tab_data.get("caption", ""), + "aspect_ratio": tab_data.get("aspect", 1.0) + }) + + if not all_visuals: + return {"key_visual": None, "problem_illustration": [], "method_workflow": [], "main_results": [], "comparative_results": [], "supporting": []}, 0, 0 + + log_agent_info(self.name, f"classifying {len(all_visuals)} visual assets") + agent = LangGraphAgent("expert poster designer", config) + + for attempt in range(3): + try: + prompt = Template(self.visual_classification_prompt).render( + visuals_list=json.dumps(all_visuals, indent=2) + ) + + agent.reset() + response = agent.step(prompt) + classification = extract_json(response.content) + + # validate classification + required_keys = ["key_visual", "problem_illustration", "method_workflow", "main_results", "comparative_results", "supporting"] + if all(key in classification for key in required_keys): + return classification, response.input_tokens, response.output_tokens + + except Exception as e: + log_agent_warning(self.name, f"visual classification attempt {attempt + 1} failed: {e}") + if attempt == 2: + # fallback classification + return self._fallback_visual_classification(all_visuals), 0, 0 + + return self._fallback_visual_classification(all_visuals), 0, 0 + + def _fallback_visual_classification(self, visuals): + # simple rule-based fallback + classification = {"key_visual": None, "main_results": [], "method_diagrams": [], "supporting": []} + + for visual in visuals: + caption = visual.get("caption", "").lower() + if "result" in caption or "performance" in caption or "comparison" in caption: + classification["main_results"].append(visual["id"]) + elif "method" in caption or "architecture" in caption or "framework" in caption: + classification["method_diagrams"].append(visual["id"]) + else: + classification["supporting"].append(visual["id"]) + + # select key visual from main results or method diagrams + if classification["main_results"]: + classification["key_visual"] = classification["main_results"][0] + elif classification["method_diagrams"]: + classification["key_visual"] = classification["method_diagrams"][0] + + return classification + + def _extract_structured_sections(self, raw_text: str, config) -> Dict: + """extract structured sections from raw paper text""" + + log_agent_info(self.name, "extracting structured sections from paper") + agent = LangGraphAgent("expert paper section extractor", config) + + for attempt in range(3): + try: + prompt = Template(self.section_extraction_prompt).render(raw_text=raw_text) + agent.reset() + response = agent.step(prompt) + + structured_sections = extract_json(response.content) + + if self._validate_structured_sections(structured_sections): + log_agent_success(self.name, f"extracted {len(structured_sections.get('paper_sections', []))} structured sections") + return structured_sections + else: + log_agent_warning(self.name, f"attempt {attempt + 1}: invalid structured sections") + + except Exception as e: + log_agent_warning(self.name, f"section extraction attempt {attempt + 1} failed: {e}") + if attempt == 2: + raise ValueError("failed to extract structured sections after multiple attempts") + + # fallback empty structure + return { + "paper_sections": [], + "paper_structure": { + "total_sections": 0, + "foundation_sections": 0, + "method_sections": 0, + "evaluation_sections": 0, + "conclusion_sections": 0 + } + } + + def _validate_structured_sections(self, structured_sections: Dict) -> bool: + """validate structured sections format""" + if "paper_sections" not in structured_sections: + log_agent_warning(self.name, "validation error: missing 'paper_sections'") + return False + + sections = structured_sections["paper_sections"] + if not isinstance(sections, list) or len(sections) < 3: + log_agent_warning(self.name, f"validation error: need at least 3 sections, got {len(sections)}") + return False + + # validate each section + for i, section in enumerate(sections): + required_fields = ["section_name", "section_type", "content"] + for field in required_fields: + if field not in section: + log_agent_warning(self.name, f"validation error: section {i} missing '{field}'") + return False + + return True + + +def parser_node(state: PosterState) -> PosterState: + return Parser()(state) \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/renderer.py b/dataflow_agent/toolkits/postertool/src/agents/renderer.py new file mode 100644 index 00000000..f5668856 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/renderer.py @@ -0,0 +1,752 @@ +""" +powerpoint rendering using python-pptx +""" + +import re +import qrcode +from pathlib import Path +from typing import Dict, Any, Optional +import json + +from pptx import Presentation +from pptx.util import Inches, Pt +from pptx.enum.text import PP_ALIGN, MSO_AUTO_SIZE, MSO_VERTICAL_ANCHOR +from pptx.enum.shapes import MSO_SHAPE +from pptx.dml.color import RGBColor +from PIL import Image + +from src.state.poster_state import PosterState +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error +from src.config.poster_config import load_config + + +class Renderer: + """powerpoint rendering with styling support""" + + def __init__(self): + self.name = "renderer" + self.styling_interfaces = None + + # load configuration + self.config = load_config() + self.layout_constants = self.config["layout_constants"] + self.powerpoint_config = self.config["powerpoint"] + self.indentation_config = self.config["indentation"] + self.typography_config = self.config["typography"] + + def __call__(self, state: PosterState) -> PosterState: + log_agent_info(self.name, "Starting Rendering Process") + + try: + self.styling_interfaces = self._load_styling_interfaces(state) + output_path = Path(state["output_dir"]) / f"{state['poster_name']}.pptx" + self._render_presentation(state, output_path) + + # convert to png if possible + png_path = self._convert_to_png(output_path) + + log_agent_success(self.name, f"rendered poster: {output_path}") + if png_path: + log_agent_success(self.name, f"generated preview: {png_path}") + + except Exception as e: + log_agent_error(self.name, f"rendering failed: {e}") + state["errors"].append(f"{self.name}: {e}") + + return state + + def _load_styling_interfaces(self, state: PosterState) -> Dict[str, Any]: + """load styling interfaces from font agent output file""" + styling_path = Path(state["output_dir"]) / "content" / "styling_interfaces.json" + if styling_path.exists(): + with open(styling_path, 'r', encoding='utf-8') as f: + interfaces = json.load(f) + interfaces["line_spacing"] = 1.0 + return interfaces + else: + # fallback to defaults with 1.0 line spacing + return { + "bullet_point_marker": "•", + "bold_start_tag": "**", + "bold_end_tag": "**", + "italic_start_tag": "*", + "italic_end_tag": "*", + "color_start_tag": "", + "line_spacing": 1.0, + "paragraph_spacing": 0.1 + } + + def _render_presentation(self, state: PosterState, output_path: Path): + """render complete presentation""" + prs = Presentation() + prs.slide_width = Inches(state["poster_width"]) + prs.slide_height = Inches(state["poster_height"]) + slide = prs.slides.add_slide(prs.slide_layouts[6]) + + # TODO: generate QR code if needed + qr_code_path = None + if state.get("url"): + qr_code_path = self._generate_qr_code(state["url"], state["output_dir"]) + + # use styled_layout if available, fallback to design_layout + layout_data = state.get("styled_layout", state.get("design_layout", [])) + if not layout_data: + raise ValueError("no styled_layout or design_layout found") + + # sort elements by priority to ensure proper rendering order + sorted_elements = sorted(layout_data, key=lambda x: x.get("priority", 0.5)) + + for element in sorted_elements: + self._render_element(slide, element, state, qr_code_path) + + prs.save(output_path) + + def _render_element(self, slide, element: Dict, state: PosterState, qr_code_path: Optional[str]): + """render individual element based on type""" + element_type = element.get("type") + + # handle QR code elements + if element_type == "qr_code" and qr_code_path: + self._render_qr_code(slide, element, qr_code_path) + return + + # get appropriate renderer + renderer_map = { + "title": self._render_title, + "section_title": self._render_section_title, + "title_accent_block": self._render_title_accent_block, + "title_accent_line": self._render_title_accent_line, + "conf_logo": self._render_conf_logo, + "aff_logo": self._render_aff_logo, + "section_container": self._render_section_container, + "text": self._render_text, + "visual": self._render_visual, + "mixed": self._render_mixed, + } + + renderer = renderer_map.get(element_type) + if renderer: + renderer(slide, element, state) + else: + log_agent_error(self.name, f"unknown element type: {element_type}") + + def _render_title(self, slide, element: Dict, state: PosterState): + """render poster title with authors""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + log_agent_info(self.name, f"rendering title at ({x.inches:.1f}, {y.inches:.1f})") + + tb = slide.shapes.add_textbox(x, y, w, h) + tf = tb.text_frame + tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE # Make sure title fits in the fixed-height textbox + tf.word_wrap = True + + content = element.get("content", "Title\nAuthors") + lines = content.split("\n") + + # separate title and authors + title_lines = lines[:-1] if len(lines) > 1 else lines + authors_text = lines[-1] if len(lines) > 1 else "" + + # add title lines + for i, title_line in enumerate(title_lines): + if i == 0: + p = tf.paragraphs[0] + else: + p = tf.add_paragraph() + + p.text = title_line.strip() + p.font.name = element.get("font_family", "Helvetica Neue") + title_font_size = self.styling_interfaces.get("font_sizes", {}).get("title", 100) + p.font.size = Pt(element.get("font_size", title_font_size)) + p.font.bold = True + p.font.color.rgb = RGBColor(0, 0, 0) # black for readability + p.alignment = PP_ALIGN.LEFT + p.line_spacing = self.typography_config["line_spacing"] + + # add authors + if authors_text: + p_authors = tf.add_paragraph() + p_authors.text = authors_text.strip() + p_authors.font.name = "Arial" + authors_font_size = self.styling_interfaces.get("font_sizes", {}).get("authors", 72) + p_authors.font.size = Pt(element.get("author_font_size", authors_font_size)) + p_authors.font.color.rgb = RGBColor(60, 60, 60) # dark gray + p_authors.alignment = PP_ALIGN.LEFT + p_authors.line_spacing = self.typography_config["line_spacing"] + 0.1 # slightly looser for authors + + def _render_section_title(self, slide, element: Dict, state: PosterState): + """render section title with enhanced styling""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + section_title = element.get("section_title", "").strip() + if not section_title: + return + + log_agent_info(self.name, f"rendering section title: '{section_title}'") + + # create textbox for section title + textbox = slide.shapes.add_textbox(x, y, w, h) + tf = textbox.text_frame + tf.auto_size = MSO_AUTO_SIZE.NONE + tf.word_wrap = False + tf.clear() + tf.vertical_anchor = MSO_VERTICAL_ANCHOR.TOP + + # use existing first paragraph to avoid extra newline + if len(tf.paragraphs) > 0: + p = tf.paragraphs[0] + else: + p = tf.add_paragraph() + p.text = section_title + p.font.name = element.get("font_family", "Helvetica Neue") + section_title_font_size = self.styling_interfaces.get("font_sizes", {}).get("section_title", 48) + p.font.size = Pt(element.get("font_size", section_title_font_size)) + p.font.bold = element.get("font_weight", "bold") == "bold" + + # apply color styling + font_color = element.get("font_color", "#000000") + p.font.color.rgb = self._parse_color(font_color) + + # apply alignment based on design template + alignment = element.get("alignment", "left").lower() + if alignment == "center": + p.alignment = PP_ALIGN.CENTER + elif alignment == "right": + p.alignment = PP_ALIGN.RIGHT + else: + p.alignment = PP_ALIGN.LEFT + + def _render_title_accent_block(self, slide, element: Dict, state: PosterState): + """render color block accent for section titles""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + # use 'color' field from layout agent + fill_color = element.get("color", element.get("fill_color", "#1E3A8A")) + + log_agent_info(self.name, f"rendering title accent block: {fill_color} at ({x.inches:.2f}, {y.inches:.2f})") + + # create rectangle shape + rect = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h) + rect.fill.solid() + rect.fill.fore_color.rgb = self._parse_color(fill_color) + rect.line.fill.background() # no border + + def _render_title_accent_line(self, slide, element: Dict, state: PosterState): + """render underline accent for section titles""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + # use 'color' field from layout agent + fill_color = element.get("color", element.get("fill_color", "#E8E8E8")) + + log_agent_info(self.name, f"rendering title accent line: {fill_color} at ({x.inches:.2f}, {y.inches:.2f})") + + # create thin rectangle for line + line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h) + line.fill.solid() + line.fill.fore_color.rgb = self._parse_color(fill_color) + line.line.fill.background() # no border + + def _render_section_container(self, slide, element: Dict, state: PosterState): + """render section container with optional debug border and mono_light background for critical sections""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + is_debug = element.get("debug_border", False) + importance_level = element.get("importance_level", 2) + + # create base rectangle + container = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h) + + # apply background fill based on importance level + if importance_level == 1: + # critical section gets mono_light background color + color_scheme = state.get("color_scheme", {}) + mono_light = color_scheme.get("mono_light", "#e6eaef") + container.fill.solid() + container.fill.fore_color.rgb = self._parse_color(mono_light) + log_agent_info(self.name, f"applied mono_light background ({mono_light}) to critical section") + else: + # non-critical sections remain transparent + container.fill.background() + + # apply border based on debug mode + if is_debug: + # prominent debug border + container.line.color.rgb = RGBColor(255, 0, 0) # red border + container.line.width = Pt(2) + log_agent_info(self.name, f"added debug section border") + else: + container.line.fill.background() + + def _render_text(self, slide, element: Dict, state: PosterState): + """render text elements with enhanced formatting""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + content = element.get("content", "").strip() + if not content: + return + + log_agent_info(self.name, f"rendering text element: {element.get('id', 'unknown')}") + + # add text with margins + margin = self.layout_constants["text_margin_renderer"] # reduced margin for better space utilization + self._add_enhanced_text( + slide, content, + x + Inches(margin), y, + w - Inches(2 * margin), h, + element + ) + + def _render_visual(self, slide, element: Dict, state: PosterState): + """render visual elements with proper aspect ratio and scaling""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + visual_id = element.get("visual_id") + scale_factor = element.get("scale_factor", 1.0) # default to no scaling + + if visual_id: + # layout agent already calculated padding, use exact positioning + self._add_visual_with_aspect_ratio( + slide, visual_id, + x, y, w, h, + state, scale_factor + ) + + def _render_mixed(self, slide, element: Dict, state: PosterState): + """render mixed elements (text and visual)""" + # for now, treat as text element + self._render_text(slide, element, state) + + def _render_conf_logo(self, slide, element: Dict, state: PosterState): + """render conference logo""" + logo_path = state.get("logo_path") + if logo_path and Path(logo_path).exists(): + self._render_logo_with_aspect_ratio(slide, element, logo_path) + + def _render_aff_logo(self, slide, element: Dict, state: PosterState): + """render affiliation logo""" + aff_logo_path = state.get("aff_logo_path") + if aff_logo_path and Path(aff_logo_path).exists(): + self._render_logo_with_aspect_ratio(slide, element, aff_logo_path) + + def _add_enhanced_text(self, slide, text: str, left, top, width, height, element: Dict): + """add text with enhanced formatting support""" + if not text.strip(): + return + + textbox = slide.shapes.add_textbox(left, top, width, height) + tf = textbox.text_frame + tf.auto_size = MSO_AUTO_SIZE.NONE + tf.word_wrap = True + tf.clear() + + # enforce height constraints to prevent text overflow beyond textbox bounds + tf.vertical_anchor = MSO_VERTICAL_ANCHOR.TOP + # add small margins to ensure text stays within bounds + tf.margin_top = Inches(0.05) + tf.margin_bottom = Inches(0.05) + + # get font properties from element + font_family = element.get("font_family", "Arial") + font_size = element.get("font_size", 40) + font_color = element.get("font_color", "#000000") + line_spacing = element.get("line_spacing", self.styling_interfaces["line_spacing"]) + + self._format_enhanced_text(tf, text, font_family, font_size, font_color, line_spacing) + + # debug info for formatting + total_runs = sum(len(p.runs) for p in tf.paragraphs) + log_agent_info(self.name, f"created {len(tf.paragraphs)} paragraphs with {total_runs} formatted runs") + + def _format_enhanced_text(self, text_frame, text: str, font_family: str, font_size: int, font_color: str, line_spacing: float): + """format text with enhanced bullet point and bold support using 1.0 line spacing""" + text_frame.clear() + + body_text_font_size = self.styling_interfaces.get("font_sizes", {}).get("body_text", 40) + effective_font_size = font_size if font_size != 40 else body_text_font_size + base_font_size = Pt(max(effective_font_size, 36)) # minimum 36pt + base_color = self._parse_color(font_color) + + # split by single newlines only (treat as simple line breaks) + lines = text.split('\n') + + for line_idx, line in enumerate(lines): + original_line = line # keep original line for indentation detection + line = line.strip() + if not line: + continue + + # create paragraph for each line + if line_idx == 0 and len(text_frame.paragraphs) > 0: + p = text_frame.paragraphs[0] + else: + p = text_frame.add_paragraph() + + # handle indentation by checking if line starts with ◦ (sub-bullet) + if line.strip().startswith(self.indentation_config["secondary_bullet_char"]): # secondary bullet character + # set paragraph level for indentation + p.level = self.indentation_config["secondary_level"] + else: + p.level = self.indentation_config["primary_level"] + + # add formatted text content (don't clear p.text) + self._add_formatted_runs(p, line, font_family, base_font_size, base_color) + + # set paragraph properties - force 1.0 line spacing + p.alignment = PP_ALIGN.LEFT + p.line_spacing = self.typography_config["line_spacing"] # fixed 1.0 line spacing + + def _add_formatted_runs(self, paragraph, text: str, font_family: str, + base_font_size, base_color): + """add text with all formatting as separate runs - following pptx best practices""" + self._parse_and_add_runs(paragraph, text, font_family, base_font_size, base_color) + + def _parse_and_add_runs(self, paragraph, text: str, font_family: str, + base_font_size, base_color): + """parse text and create separate runs for each format type""" + # tokenize the text into formatting segments + segments = self._tokenize_formatting(text) + + # create runs for each segment + for segment in segments: + run = paragraph.add_run() + run.text = segment['text'] + run.font.name = font_family + run.font.size = base_font_size + + # apply formatting based on segment type + if segment['color']: + run.font.color.rgb = self._parse_color(segment['color']) + else: + run.font.color.rgb = base_color + + if segment['bold']: + run.font.bold = True + + if segment['italic']: + run.font.italic = True + + def _tokenize_formatting(self, text: str) -> list: + """tokenize text into formatting segments with precise position tracking""" + segments = [] + i = 0 + + while i < len(text): + # check for color markup: text + color_match = re.match(r'', text[i:]) + if color_match: + color_hex = color_match.group(1) + opening_tag_end = i + color_match.end() + + # find closing tag using absolute position + closing_tag_pattern = r'' + color_content_start = opening_tag_end + closing_match = re.search(closing_tag_pattern, text[color_content_start:]) + + if closing_match: + # calculate absolute positions + color_content_end = color_content_start + closing_match.start() + closing_tag_end = color_content_start + closing_match.end() + + # extract content between color tags + colored_text = text[color_content_start:color_content_end] + + # process colored text with automatic bold + if colored_text.strip(): # only process non-empty content + segments.append({ + 'text': colored_text, + 'bold': True, # all colored text is bold + 'italic': False, + 'color': color_hex + }) + + # move past the entire color block + i = closing_tag_end + continue + else: + # malformed color tag, treat as regular text + segments.append({ + 'text': text[i], + 'bold': False, + 'italic': False, + 'color': None + }) + i += 1 + continue + + # check for bold: **text** + bold_match = re.match(r'\*\*(.*?)\*\*', text[i:]) + if bold_match: + bold_text = bold_match.group(1) + segments.append({ + 'text': bold_text, + 'bold': True, + 'italic': False, + 'color': None + }) + i += bold_match.end() + continue + + # check for italic: *text* + italic_match = re.match(r'\*(.*?)\*', text[i:]) + if italic_match: + italic_text = italic_match.group(1) + segments.append({ + 'text': italic_text, + 'bold': False, + 'italic': True, + 'color': None + }) + i += italic_match.end() + continue + + # regular text - find next formatting marker + next_format = re.search(r'(\*\*|\*| list: + """simplified bold/italic parser - only used for nested formatting""" + segments = [] + i = 0 + + while i < len(text): + # check for bold + bold_match = re.match(r'\*\*(.*?)\*\*', text[i:]) + if bold_match: + bold_text = bold_match.group(1) + segments.append({ + 'text': bold_text, + 'bold': True, + 'italic': False, + 'color': color + }) + i += bold_match.end() + continue + + # check for italic + italic_match = re.match(r'\*(.*?)\*', text[i:]) + if italic_match: + italic_text = italic_match.group(1) + segments.append({ + 'text': italic_text, + 'bold': bool(color), # force bold if color is present + 'italic': True, + 'color': color + }) + i += italic_match.end() + continue + + # regular text + next_format = re.search(r'(\*\*|\*)', text[i:]) + if next_format: + regular_text = text[i:i + next_format.start()] + else: + regular_text = text[i:] + + if regular_text: + segments.append({ + 'text': regular_text, + 'bold': bool(color), # force bold if color is present + 'italic': False, + 'color': color + }) + + if next_format: + i += next_format.start() + else: + break + + return segments + + def _add_visual_with_aspect_ratio(self, slide, visual_id: str, left, top, width, height, state, scale_factor: float = 1.0): + """add visual with proper aspect ratio preservation and optional scaling""" + visual_path = self._get_visual_path(visual_id, state) + + if visual_path and Path(visual_path).exists(): + try: + # calculate proper size maintaining aspect ratio + with Image.open(visual_path) as img: + orig_width, orig_height = img.size + aspect_ratio = orig_width / orig_height + + # get allocated space from layout + available_width = width.inches if hasattr(width, 'inches') else float(width) + available_height = height.inches if hasattr(height, 'inches') else float(height) + + # always use exact dimensions and positioning from JSON + final_width = Inches(available_width) + final_height = Inches(available_height) + centered_left = left + centered_top = top + + slide.shapes.add_picture(visual_path, centered_left, centered_top, width=final_width, height=final_height) + + if scale_factor < 1.0: + log_agent_info(self.name, f"visual {visual_id} uses layout-calculated dimensions (scale_factor={scale_factor:.1f} already applied)") + + except Exception as e: + log_agent_error(self.name, f"failed to add visual {visual_id}: {e}") + + def _render_logo_with_aspect_ratio(self, slide, element: Dict, image_path: str): + """render logo with proper aspect ratio preservation""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + + try: + # calculate dimensions while preserving aspect ratio + with Image.open(image_path) as img: + orig_width, orig_height = img.size + aspect_ratio = orig_width / orig_height + + available_width = w.inches if hasattr(w, 'inches') else float(w) + available_height = h.inches if hasattr(h, 'inches') else float(h) + + # fit image within available space + if available_width / aspect_ratio <= available_height: + final_width = Inches(available_width) + final_height = Inches(available_width / aspect_ratio) + else: + final_height = Inches(available_height) + final_width = Inches(available_height * aspect_ratio) + + # center the image + centered_left = x + (w - final_width) / 2 + centered_top = y + (h - final_height) / 2 + + slide.shapes.add_picture(image_path, centered_left, centered_top, + width=final_width, height=final_height) + + except Exception as e: + log_agent_error(self.name, f"failed to render logo: {e}") + + def _get_visual_path(self, visual_id: str, state: PosterState) -> Optional[str]: + """get path to visual asset""" + images = state.get("images", {}) + tables = state.get("tables", {}) + vid = (visual_id or "").split('_')[-1] + + if visual_id.startswith("figure"): + return images.get(vid, {}).get("path") + if visual_id.startswith("table"): + return tables.get(vid, {}).get("path") + + return None + + def _parse_color(self, color_str: str) -> RGBColor: + """parse color string to RGBColor""" + hex_color = color_str.lstrip('#') + r, g, b = (int(hex_color[i:i+2], 16) for i in (0, 2, 4)) + return RGBColor(r, g, b) + + def _generate_qr_code(self, url: str, output_dir: str) -> str: + """generate QR code for URL""" + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=2, + ) + qr.add_data(url) + qr.make(fit=True) + + img = qr.make_image(fill_color="black", back_color="white") + qr_path = Path(output_dir) / "qr_code.png" + img.save(qr_path) + + return str(qr_path) + + def _render_qr_code(self, slide, element: Dict, qr_code_path: str): + """render QR code element""" + x, y, w, h = (Inches(element[k]) for k in ["x", "y", "width", "height"]) + slide.shapes.add_picture(qr_code_path, x, y, w, h) + + def _convert_to_png(self, pptx_path: Path) -> Optional[str]: + """convert PPTX to PNG using LibreOffice""" + try: + import subprocess + output_dir = pptx_path.parent + + import platform + system = platform.system().lower() + + if system == "windows": + libreoffice_paths = [ + r"C:\Program Files\LibreOffice\program\soffice.exe", + r"C:\Program Files (x86)\LibreOffice\program\soffice.exe", + r"C:\Users\%USERNAME%\AppData\Local\Programs\LibreOffice\program\soffice.exe", + "soffice.exe", + "libreoffice.exe" + ] + elif system == "linux": + libreoffice_paths = [ + "/usr/bin/libreoffice", + "/usr/local/bin/libreoffice", + "/snap/bin/libreoffice", + "/usr/bin/soffice", + "libreoffice", + "soffice" + ] + elif system == "darwin": # macOS + libreoffice_paths = [ + "/Applications/LibreOffice.app/Contents/MacOS/soffice", + "/usr/local/bin/libreoffice", + "libreoffice", + "soffice" + ] + else: + libreoffice_paths = [ + "libreoffice", + "soffice" + ] + + for lo_path in libreoffice_paths: + try: + cmd = [ + lo_path, "--headless", "--convert-to", "png", + "--outdir", str(output_dir), str(pptx_path) + ] + + result = subprocess.run(cmd, capture_output=True, text=True, timeout=60) + + if result.returncode == 0: + png_name = pptx_path.stem + ".png" + png_path = output_dir / png_name + if png_path.exists(): + return str(png_path) + + except (subprocess.SubprocessError, FileNotFoundError): + continue + + log_agent_error(self.name, "LibreOffice not found - install for PNG conversion") + + except Exception as e: + log_agent_error(self.name, f"PNG conversion failed: {e}") + + return None + + +def renderer_node(state: PosterState) -> Dict[str, Any]: + result = Renderer()(state) + return { + **state, + "tokens": result["tokens"], + "current_agent": result["current_agent"], + "errors": result["errors"] + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/agents/section_title_designer.py b/dataflow_agent/toolkits/postertool/src/agents/section_title_designer.py new file mode 100644 index 00000000..572aef2a --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/agents/section_title_designer.py @@ -0,0 +1,131 @@ +""" +Section title Designer +- Fixed style for current version +""" + +import json +from pathlib import Path +from typing import Dict, Any, List + +from src.state.poster_state import PosterState +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error + + +class SectionTitleDesigner: + def __init__(self): + self.name = "section_title_designer" + + def __call__(self, state: PosterState) -> PosterState: + log_agent_info(self.name, "generating section title styling (code-based, Style 2 only)") + + try: + story_board = state.get("story_board") + color_scheme = state.get("color_scheme") + + if not story_board: + log_agent_error(self.name, "missing story_board") + raise ValueError("missing story_board from curator") + + if not color_scheme: + log_agent_error(self.name, "missing color_scheme") + raise ValueError("missing color_scheme from color agent") + + title_design = self._generate_colorblock_design(story_board, color_scheme) + + state["section_title_design"] = title_design + state["current_agent"] = self.name + + self._save_title_design(state) + + log_agent_success(self.name, "generated section title styling") + log_agent_info(self.name, f"theme color: {color_scheme.get('theme', 'unknown')}") + + except Exception as e: + log_agent_error(self.name, f"failed: {e}") + state["errors"].append(f"{self.name}: {e}") + + return state + + def _generate_colorblock_design(self, story_board: Dict, color_scheme: Dict) -> Dict: + """Generate colorblock design""" + + sections = story_board.get("spatial_content_plan", {}).get("sections", []) + + # color mapping from color_scheme for rectangle_left template + colors = self._map_rectangle_colors(color_scheme) + + # applications for all sections + applications = self._generate_rectangle_applications(sections, colors) + + return { + "section_title_design": { + "selected_template": "rectangle_left", + "design_rationale": "Code-generated rectangle_left template for modern, design-forward appearance with color accent", + "color_palette": colors, + "spacing_specifications": { + "title_left_padding": "4_spaces", + "rectangle_to_content_gap": 0.15 + }, + "section_applications": applications + } + } + + def _map_rectangle_colors(self, color_scheme: Dict) -> Dict: + """Map color scheme to rectangle_left template colors""" + + theme_color = color_scheme.get("theme", "#1E3A8A") + mono_light = color_scheme.get("mono_light", "#335f91") + mono_dark = color_scheme.get("mono_dark", "#002c5e") + + return { + "theme_color": theme_color, + "mono_light": mono_light, + "mono_dark": mono_dark, + "title_text_color": "#000000", # black for readability on colored background + "accent_rectangle_color": theme_color, + "background_color": "#FFFFFF" + } + + def _generate_rectangle_applications(self, sections: List[Dict], colors: Dict) -> List[Dict]: + + applications = [] + + for section in sections: + application = { + "section_id": section["section_id"], + "section_title": section.get("section_title", ""), + "title_styling": { + "font_family": "Helvetica Neue", + "font_size": 48, # this will be overridden by styling_interfaces font_sizes + "font_weight": "bold", + "color": colors["title_text_color"], + "alignment": "left" + }, + "accent_styling": { + "type": "rectangle", + "color": colors["accent_rectangle_color"], + "dimensions": {"width": "golden_ratio_based_on_height", "height": "title_height"}, + "position": "same_row" + } + } + + applications.append(application) + + return applications + + def _save_title_design(self, state: PosterState): + """Save title design to json file""" + output_dir = Path(state["output_dir"]) / "content" + output_dir.mkdir(parents=True, exist_ok=True) + with open(output_dir / "section_title_design.json", "w", encoding='utf-8') as f: + json.dump(state.get("section_title_design", {}), f, indent=2) + + +def section_title_designer_node(state: PosterState) -> Dict[str, Any]: + result = SectionTitleDesigner()(state) + return { + **state, + "section_title_design": result["section_title_design"], + "current_agent": result["current_agent"], + "errors": result["errors"] + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/config/__init__.py b/dataflow_agent/toolkits/postertool/src/config/__init__.py new file mode 100644 index 00000000..b5a4b81e --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/config/__init__.py @@ -0,0 +1 @@ +# Configuration module for Paper-to-Poster system \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/config/poster_config.py b/dataflow_agent/toolkits/postertool/src/config/poster_config.py new file mode 100644 index 00000000..d664f017 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/config/poster_config.py @@ -0,0 +1,12 @@ +""" +configuration loader +""" + +import yaml +from pathlib import Path + +def load_config(): + """Load configuration from poster_config.yaml""" + config_path = Path(__file__).parent.parent.parent / "config" / "poster_config.yaml" + with open(config_path, 'r', encoding='utf-8') as f: + return yaml.safe_load(f) \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/layout/__init__.py b/dataflow_agent/toolkits/postertool/src/layout/__init__.py new file mode 100644 index 00000000..1abea2e2 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/layout/__init__.py @@ -0,0 +1,9 @@ +""" +layout module for precise poster layout with css box model +""" + +from .text_height_measurement import measure_text_height + +__all__ = [ + "measure_text_height" +] \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/layout/text_height_measurement.py b/dataflow_agent/toolkits/postertool/src/layout/text_height_measurement.py new file mode 100644 index 00000000..7603b301 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/layout/text_height_measurement.py @@ -0,0 +1,126 @@ +""" +text height measurement using binary search overflow detection +""" + +from pptx import Presentation +from pptx.util import Inches, Pt +from pptx.enum.text import MSO_AUTO_SIZE, PP_ALIGN +from typing import Dict, Any, List +from pathlib import Path +from src.config.poster_config import load_config + +def get_font_file_path(font_name: str) -> str: + font_mapping = { + "Arial": "fonts/Arial.ttf", + "Helvetica Neue": "fonts/HelveticaNeue.ttf", + } + + font_file = font_mapping.get(font_name, "fonts/Arial.ttf") + project_root = Path(__file__).parent.parent.parent + font_path = project_root / font_file + + return str(font_path) + +def measure_text_height(text_content: str, width_inches: float, font_name: str = "Arial", + font_size: int = 44, line_spacing: float = 1.0, precision: float = 0.001) -> Dict[str, Any]: + """find minimum height for text to fit without font size reduction""" + + config = load_config() + + prs = Presentation() + config = load_config() + slide_layout_index = config["powerpoint"]["slide_layout_blank"] + slide = prs.slides.add_slide(prs.slide_layouts[slide_layout_index]) + + min_height = config["text_measurement"]["min_height"] + max_height = config["text_measurement"]["max_height"] + tolerance = precision + + while (max_height - min_height) > tolerance: + test_height = (min_height + max_height) / 2 + + textbox = slide.shapes.add_textbox( + left=Inches(config["powerpoint"]["text_frame_positioning"]["default_left"]), + top=Inches(config["powerpoint"]["text_frame_positioning"]["default_top"]), + width=Inches(width_inches), + height=Inches(test_height) + ) + + text_frame = textbox.text_frame + text_frame.clear() + text_frame.word_wrap = True + text_frame.auto_size = MSO_AUTO_SIZE.NONE + # use same margins as layout agent for consistent measurement + text_frame.margin_left = Inches(config["text_measurement"]["margins"]["left"]) + text_frame.margin_right = Inches(config["text_measurement"]["margins"]["right"]) + text_frame.margin_top = Inches(config["text_measurement"]["margins"]["top"]) + text_frame.margin_bottom = Inches(config["text_measurement"]["margins"]["bottom"]) + + # process text exactly like renderer: split by single newlines + lines = text_content.split('\n') + + for line_idx, line in enumerate(lines): + line = line.strip() + if not line: + continue + + # create paragraph for each line (matching renderer behavior) + if line_idx == 0 and len(text_frame.paragraphs) > 0: + p = text_frame.paragraphs[0] + else: + p = text_frame.add_paragraph() + + p.text = line + p.alignment = PP_ALIGN.LEFT + p.line_spacing = line_spacing + + # apply font to each paragraph + if p.runs: + run = p.runs[0] + run.font.name = font_name + run.font.size = Pt(font_size) + + original_size = font_size + font_reduced = False + + try: + # Use direct font file to bypass cross-platform discovery bug + font_file_path = get_font_file_path(font_name) + text_frame.fit_text(font_file=font_file_path, max_size=font_size) + + for paragraph in text_frame.paragraphs: + for run in paragraph.runs: + if run.font.size and run.font.size.pt < (original_size - 0.5): + font_reduced = True + break + if font_reduced: + break + except Exception as e: + print(f"fit_text error: {e}") + font_reduced = True + + if font_reduced: + min_height = test_height + else: + max_height = test_height + + # cleanup textbox + sp = textbox._element + sp.getparent().remove(sp) + + # calculate newline offset to compensate for pptx rendering discrepancy + newline_count = text_content.count('\n') + newline_offset = newline_count * (font_size / 72) * config["text_measurement"]["newline_offset_ratio"] + final_height = max_height + newline_offset + + return { + "optimal_height": final_height, + "text_content": text_content, + "width_inches": width_inches, + "font_name": font_name, + "font_size": font_size, + "line_spacing": line_spacing, + "precision": precision, + "newline_count": newline_count, + "newline_offset": newline_offset + } \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/state/__init__.py b/dataflow_agent/toolkits/postertool/src/state/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dataflow_agent/toolkits/postertool/src/state/poster_state.py b/dataflow_agent/toolkits/postertool/src/state/poster_state.py new file mode 100644 index 00000000..cadb3c98 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/state/poster_state.py @@ -0,0 +1,144 @@ +"""poster state management""" + +from typing import Dict, Any, Optional, List, Tuple, TypedDict +from dataclasses import dataclass +import time + + +@dataclass +class ModelConfig: + model_name: str + provider: str + temperature: float = 0.7 + max_tokens: int = 4096 + + +@dataclass +class TokenUsage: + input_text: int = 0 + output_text: int = 0 + input_vision: int = 0 + output_vision: int = 0 + + def add_text(self, inp: int, out: int): + self.input_text += inp + self.output_text += out + + def add_vision(self, inp: int, out: int): + self.input_vision += inp + self.output_vision += out + + +class PosterState(TypedDict): + # core paths + pdf_path: str + output_dir: str + poster_name: str + + # model configs + text_model: ModelConfig + vision_model: ModelConfig + + # processing results + images: Optional[Dict[str, Any]] + tables: Optional[Dict[str, Any]] + narrative: Optional[Dict[str, str]] + poster_plan: Optional[List[Dict[str, Any]]] + poster_width: int + poster_height: int + wireframe_layout: Optional[List[Dict[str, Any]]] + content_filled_layout: Optional[List[Dict[str, Any]]] + final_layout: Optional[List[Dict[str, Any]]] + + narrative_content: Optional[Dict[str, Any]] + classified_visuals: Optional[Dict[str, Any]] + structured_sections: Optional[Dict[str, Any]] + story_board: Optional[Dict[str, Any]] + curated_content: Optional[Dict[str, Any]] + design_layout: Optional[List[Dict[str, Any]]] + section_title_design: Optional[Dict[str, Any]] + color_scheme: Optional[Dict[str, str]] + keywords: Optional[Dict[str, Any]] + styled_layout: Optional[List[Dict[str, Any]]] + + # poster assets + url: str + logo_path: str + aff_logo_path: Optional[str] + + # metadata + tokens: TokenUsage + current_agent: str + errors: List[str] + + +def create_state(pdf_path: str, text_model: str = "gpt-4.1-2025-04-14", vision_model: str = "gpt-4.1-2025-04-14", width: int = 84, height: int = 42, url: str = "", logo_path: str = "", aff_logo_path: str = "") -> PosterState: + """create initial poster state""" + from pathlib import Path + + poster_name = Path(pdf_path).parent.name or "test_poster" + output_dir = f"output/{poster_name}" + + return PosterState( + pdf_path=pdf_path, + output_dir=output_dir, + poster_name=poster_name, + text_model=_get_model_config(text_model), + vision_model=_get_model_config(vision_model), + images=None, + tables=None, + narrative=None, + poster_plan=None, + poster_width=width, + poster_height=height, + wireframe_layout=None, + content_filled_layout=None, + final_layout=None, + narrative_content=None, + classified_visuals=None, + structured_sections=None, + story_board=None, + curated_content=None, + design_layout=None, + section_title_design=None, + color_scheme=None, + keywords=None, + styled_layout=None, + url=url, + logo_path=logo_path, + aff_logo_path=aff_logo_path, + tokens=TokenUsage(), + current_agent="init", + errors=[] + ) + + +def _get_model_config(model_id: str) -> ModelConfig: + """get model configuration""" + configs = { + "claude": ModelConfig("claude-sonnet-4-20250514", "anthropic"), + "claude-sonnet-4-20250514": ModelConfig("claude-sonnet-4-20250514", "anthropic"), + "gemini": ModelConfig("gemini-2.5-pro", "google"), + "gemini-2.5-pro": ModelConfig("gemini-2.5-pro", "google"), + "gpt-4o": ModelConfig("gpt-4o", "openai"), + "gpt-4o-2024-08-06": ModelConfig("gpt-4o-2024-08-06", "openai"), + "gpt-5.1": ModelConfig("gpt-5.1", "openai"), + "gpt-5.2": ModelConfig("gpt-5.2", "openai"), + "gpt-4.1-2025-04-14": ModelConfig("gpt-4.1-2025-04-14", "openai"), + "gpt-4.1-mini-2025-04-14": ModelConfig("gpt-4.1-mini-2025-04-14", "openai"), + "gemini-3-pro-preview": ModelConfig("gemini-3-pro-preview", "google"), + "gemini-3-pro-image-preview": ModelConfig("gemini-3-pro-image-preview", "google"), + "gemini-2.5-flash-image": ModelConfig("gemini-2.5-flash-image", "google"), + "glm-4.6": ModelConfig("glm-4.6", "zhipu"), + "glm-4.5": ModelConfig("glm-4.5", "zhipu"), + "glm-4.5-air": ModelConfig("glm-4.5-air", "zhipu"), + "glm-4.5v": ModelConfig("glm-4.5v", "zhipu"), + "glm-4": ModelConfig("glm-4", "zhipu"), + "glm-4v": ModelConfig("glm-4v", "zhipu"), + "kimi-k2-turbo-preview": ModelConfig("kimi-k2-turbo-preview", "moonshot"), + "moonshot-v1-8k-vision-preview": ModelConfig("moonshot-v1-8k-vision-preview", "moonshot"), + "MiniMax-M2": ModelConfig("MiniMax-M2", "Minimax"), + "qwen3-max": ModelConfig("qwen3-max", "Alibaba"), + "qwen3-vl-plus": ModelConfig("qwen3-vl-plus", "Alibaba"), + } + return configs.get(model_id, configs["gpt-4.1-2025-04-14"]) \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/src/workflow/__init__.py b/dataflow_agent/toolkits/postertool/src/workflow/__init__.py new file mode 100644 index 00000000..75a5685c --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/workflow/__init__.py @@ -0,0 +1,7 @@ +""" +Workflow module for paper-to-poster generation pipeline +""" + +# from src.workflow.pipeline import main, create_workflow_graph + +__all__ = ['pipeline'] diff --git a/dataflow_agent/toolkits/postertool/src/workflow/pipeline.py b/dataflow_agent/toolkits/postertool/src/workflow/pipeline.py new file mode 100644 index 00000000..97993a56 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/src/workflow/pipeline.py @@ -0,0 +1,166 @@ +""" +Main workflow pipeline for paper-to-poster generation +""" + +import argparse +import os +import sys +import json +from pathlib import Path +from dotenv import load_dotenv +from typing import List, Dict, Any, Optional + +sys.path.insert(0, str(Path(__file__).parent.parent.parent)) + +# langgraph imports +from langgraph.graph import StateGraph, START, END + +from src.state.poster_state import create_state, PosterState +from src.agents.parser import parser_node +from src.agents.curator import curator_node +from src.agents.layout_with_balancer import layout_with_balancer_node as layout_optimizer_node +from src.agents.section_title_designer import section_title_designer_node +from src.agents.color_agent import color_agent_node +from src.agents.font_agent import font_agent_node +from src.agents.renderer import renderer_node +from utils.src.logging_utils import log_agent_info, log_agent_success, log_agent_error + +env_path = Path(__file__).parent.parent.parent / '.env' +load_dotenv(env_path, override=True) + +def create_workflow_graph() -> StateGraph: + """create the langgraph workflow""" + graph = StateGraph(PosterState) + + # add all nodes in the workflow + graph.add_node("parser", parser_node) + graph.add_node("curator", curator_node) + graph.add_node("color_agent", color_agent_node) + graph.add_node("section_title_designer", section_title_designer_node) + graph.add_node("layout_optimizer", layout_optimizer_node) + graph.add_node("font_agent", font_agent_node) + graph.add_node("renderer", renderer_node) + + # workflow: parser -> story board -> color -> title design -> layout -> font -> render + graph.add_edge(START, "parser") + graph.add_edge("parser", "curator") + graph.add_edge("curator", "color_agent") + graph.add_edge("color_agent", "section_title_designer") + graph.add_edge("section_title_designer", "layout_optimizer") + graph.add_edge("layout_optimizer", "font_agent") + graph.add_edge("font_agent", "renderer") + graph.add_edge("renderer", END) + + return graph + + +def main(): + parser = argparse.ArgumentParser(description="PosterGen: Multi-agent Aesthetic-aware Paper-to-poster generation") + parser.add_argument("--paper_path", type=str, required=True, help="Path to the PDF paper") + parser.add_argument("--text_model", type=str, default="gpt-4o-2024-08-06", + choices=["gpt-4o-2024-08-06", "gpt-4.1-2025-04-14", "gpt-4.1-mini-2025-04-14", "claude-sonnet-4-20250514", "gemini-2.5-pro", "glm-4.6", "glm-4.5", "glm-4.5-air", "glm-4", "kimi-k2-turbo-preview", "MiniMax-M2", "qwen3-max"], + help="Text model for content processing") + parser.add_argument("--vision_model", type=str, default="gpt-4o-2024-08-06", + choices=["gpt-4o-2024-08-06", "gpt-4.1-2025-04-14", "gpt-4.1-mini-2025-04-14", "claude-sonnet-4-20250514", "gemini-2.5-pro", "glm-4.5v", "glm-4v", "moonshot-v1-8k-vision-preview", "MiniMax-M2", "qwen3-vl-plus"], + help="Vision model for image analysis") + parser.add_argument("--poster_width", type=float, default=54, help="Poster width in inches") + parser.add_argument("--poster_height", type=float, default=36, help="Poster height in inches") + parser.add_argument("--url", type=str, help="URL for QR code on poster") # TODO + parser.add_argument("--logo", type=str, default="./data/Robustness_Reprogramming_for_Representation_Learning/logo.png", help="Path to conference/journal logo") + parser.add_argument("--aff_logo", type=str, default="./data/Robustness_Reprogramming_for_Representation_Learning/aff.png", help="Path to affiliation logo") + + args = parser.parse_args() + + # poster dimensions: fix width to 54", adjust height by ratio + input_ratio = args.poster_width / args.poster_height + # check poster ratio: lower bound 1.4 (ISO A paper size), upper bound 2 (human vision limit) + if input_ratio > 2 or input_ratio < 1.4: + print(f"❌ Poster ratio is out of range: {input_ratio}. Please use a ratio between 1.4 and 2.") + return 1 + + final_width = 54.0 + final_height = final_width / input_ratio + + # check .env file + if env_path.exists(): + print(f"✅ .env file found at: {env_path}") + else: + print(f"❌ .env file NOT found") + + # check api keys + required_keys = {"openai": "OPENAI_API_KEY", "anthropic": "ANTHROPIC_API_KEY", "google": "GOOGLE_API_KEY", "zhipu": "ZHIPU_API_KEY", "moonshot": "MOONSHOT_API_KEY", "Minimax": "MINIMAX_API_KEY", "Alibaba": "ALIBABA_API_KEY"} + model_providers = {"claude-sonnet-4-20250514": "anthropic", "gemini": "google", "gemini-2.5-pro": "google", + "gpt-4o-2024-08-06": "openai", "gpt-4.1-2025-04-14": "openai", "gpt-4.1-mini-2025-04-14": "openai", + "glm-4.6": "zhipu", "glm-4.5": "zhipu", "glm-4.5-air": "zhipu", "glm-4.5v": "zhipu", "glm-4": "zhipu", "glm-4v": "zhipu", + "kimi-k2-turbo-preview": "moonshot", "moonshot-v1-8k-vision-preview": "moonshot", + "qwen3-max": "Alibaba", "qwen3-vl-plus": "Alibaba", + "MiniMax-M2":"Minimax",} + + needed_keys = set() + if args.text_model in model_providers: + needed_keys.add(required_keys[model_providers[args.text_model]]) + if args.vision_model in model_providers: + needed_keys.add(required_keys[model_providers[args.vision_model]]) + + missing = [k for k in needed_keys if not os.getenv(k)] + if missing: + print(f"❌ Missing API keys: {missing}") + return 1 + + # get pdf path + pdf_path = args.paper_path + if not pdf_path or not Path(pdf_path).exists(): + print("❌ PDF not found") + return 1 + + print(f"🚀 PosterGen Pipeline") + print(f"📄 PDF: {pdf_path}") + print(f"🤖 Models: {args.text_model}/{args.vision_model}") + print(f"📏 Size: {final_width}\" × {final_height:.2f}\"") + print(f"🏢 Conference Logo: {args.logo}") + print(f"🏫 Affiliation Logo: {args.aff_logo}") + + try: + # create poster state + state = create_state( + pdf_path, args.text_model, args.vision_model, + final_width, final_height, + args.url, args.logo, args.aff_logo, + ) + + log_agent_info("pipeline", "creating workflow graph") + graph = create_workflow_graph() + workflow = graph.compile() + + log_agent_info("pipeline", "executing workflow") + final_state = workflow.invoke(state) + + if final_state.get("errors"): + log_agent_error("pipeline", f"Pipeline errors: {final_state['errors']}") + return 1 + required_outputs = ["story_board", "design_layout", "color_scheme", "styled_layout"] + missing = [out for out in required_outputs if not final_state.get(out)] + if missing: + log_agent_error("pipeline", f"Missing outputs: {missing}") + return 1 + + log_agent_success("pipeline", "Pipeline completed successfully") + + # full pipeline summary + log_agent_success("pipeline", "Full pipeline complete") + log_agent_info("pipeline", f"Total tokens: {final_state['tokens'].input_text} → {final_state['tokens'].output_text}") + + output_path = Path(final_state["output_dir"]) / f"{final_state['poster_name']}.pptx" + log_agent_info("pipeline", f"Final poster saved to: {output_path}") + + return 0 + + except Exception as e: + log_agent_error("pipeline", f"Unexpected error: {e}") + import traceback + traceback.print_exc() + return 1 + + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/utils/langgraph_utils.py b/dataflow_agent/toolkits/postertool/utils/langgraph_utils.py new file mode 100644 index 00000000..46d445d4 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/utils/langgraph_utils.py @@ -0,0 +1,280 @@ +"""LangGraph utilities""" + +import os +from typing import Dict, Any, Optional, List +from dotenv import load_dotenv +import json +import json_repair + +from langchain_openai import ChatOpenAI +from langchain_anthropic import ChatAnthropic +from langchain_google_genai import ChatGoogleGenerativeAI +from langchain.schema import HumanMessage, SystemMessage +from langchain_community.callbacks.manager import get_openai_callback +from tenacity import retry, stop_after_attempt, wait_exponential + +from src.state.poster_state import ModelConfig + +load_dotenv(override=True) # reload env every time + + +def create_model(config: ModelConfig): + """create chat model from config""" + # common timeout settings for all providers + timeout_settings = { + 'request_timeout': 500, # 2 minutes for request timeout + 'max_retries': 2, # reduce retries at model level since we have tenacity + } + + if config.provider == 'openai': + openai_kwargs = { + 'model_name': config.model_name, + 'temperature': config.temperature, + 'max_tokens': config.max_tokens, + 'api_key': os.getenv('OPENAI_API_KEY'), + 'request_timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('OPENAI_BASE_URL') + if base_url: + openai_kwargs['base_url'] = base_url + + return ChatOpenAI(**openai_kwargs) + elif config.provider == 'anthropic': + anthropic_kwargs = { + 'model': config.model_name, + 'temperature': config.temperature, + 'max_tokens': config.max_tokens, + 'api_key': os.getenv('ANTHROPIC_API_KEY'), + 'timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('ANTHROPIC_BASE_URL') + if base_url: + anthropic_kwargs['base_url'] = base_url + + return ChatAnthropic(**anthropic_kwargs) + elif config.provider == 'google': + google_kwargs = { + 'model': config.model_name, + 'temperature': config.temperature, + 'max_output_tokens': config.max_tokens, + 'google_api_key': os.getenv('GOOGLE_API_KEY'), + 'timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('GOOGLE_BASE_URL') + if base_url: + google_kwargs['base_url'] = base_url + + return ChatGoogleGenerativeAI(**google_kwargs) + elif config.provider == 'zhipu': + zhipu_kwargs = { + 'model': config.model_name, + 'temperature': config.temperature, + 'max_tokens': config.max_tokens, + 'api_key': os.getenv('ZHIPU_API_KEY'), + 'timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('ZHIPU_BASE_URL') + if base_url: + zhipu_kwargs['base_url'] = base_url + + return ChatOpenAI(**zhipu_kwargs) + elif config.provider == 'moonshot': + moonshot_kwargs = { + 'model': config.model_name, + 'temperature': config.temperature, + 'max_tokens': config.max_tokens, + 'api_key': os.getenv('MOONSHOT_API_KEY'), + 'timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('MOONSHOT_BASE_URL') + if base_url: + moonshot_kwargs['base_url'] = base_url + + return ChatOpenAI(**moonshot_kwargs) + elif config.provider == 'Minimax': + minimax_kwargs = { + 'model': config.model_name, + 'temperature': config.temperature, + 'max_tokens': config.max_tokens, + 'api_key': os.getenv('MINIMAX_API_KEY'), + 'timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('MINIMAX_BASE_URL') + if base_url: + minimax_kwargs['base_url'] = base_url + + return ChatOpenAI(**minimax_kwargs) + elif config.provider == 'Alibaba': + alibaba_kwargs = { + 'model': config.model_name, + 'temperature': config.temperature, + 'max_tokens': config.max_tokens, + 'api_key': os.getenv('ALIBABA_API_KEY'), + 'timeout': timeout_settings['request_timeout'], + 'max_retries': timeout_settings['max_retries'], + } + base_url = os.getenv('ALIBABA_BASE_URL') + if base_url: + alibaba_kwargs['base_url'] = base_url + + return ChatOpenAI(**alibaba_kwargs) + else: + raise ValueError(f"unsupported provider: {config.provider}") + + +class LangGraphAgent: + """langgraph agent wrapper""" + + def __init__(self, system_msg: str, config: ModelConfig): + self.system_msg = system_msg + self.config = config + self.model = create_model(config) + self.history = [SystemMessage(content=system_msg)] + + def reset(self): + """reset conversation""" + self.history = [SystemMessage(content=self.system_msg)] + + @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) + def step(self, message: str) -> 'AgentResponse': + """process message and return response""" + # check if message is json with image data + try: + msg_data = json.loads(message) + if isinstance(msg_data, list) and any("image_url" in item for item in msg_data): + # vision model call + return self._step_vision(msg_data) + except: + pass + + # regular text call + self.history.append(HumanMessage(content=message)) + + # keep conversation window + if len(self.history) > 10: + self.history = [self.history[0]] + self.history[-9:] + + # get response with token tracking + input_tokens, output_tokens = 0, 0 + try: + if self.config.provider in ('openai', 'zhipu'): + with get_openai_callback() as cb: + response = self.model.invoke(self.history) + input_tokens = cb.prompt_tokens or 0 + output_tokens = cb.completion_tokens or 0 + else: + response = self.model.invoke(self.history) + # estimate tokens for non-openai + input_tokens = len(message.split()) * 1.3 + output_tokens = len(response.content.split()) * 1.3 + except Exception as e: + error_msg = f"model call failed: {e}" + print(error_msg) + + # provide more specific error information + if "timeout" in str(e).lower() or "read operation timed out" in str(e).lower(): + print(f"⚠️ Timeout error detected for {self.config.provider} {self.config.model_name}") + print("💡 Possible solutions:") + print(" - Check your internet connection") + print(" - Verify API key is valid") + print(" - Try using a different model provider") + print(" - Consider increasing timeout settings") + elif "rate limit" in str(e).lower(): + print(f"⚠️ Rate limit exceeded for {self.config.provider}") + print("💡 Consider adding delays between requests") + elif "authentication" in str(e).lower() or "api key" in str(e).lower(): + print(f"⚠️ Authentication error for {self.config.provider}") + print("💡 Check your API key configuration") + + input_tokens = len(message.split()) * 1.3 + output_tokens = 100 + raise + + self.history.append(response) + + return AgentResponse(response.content, input_tokens, output_tokens) + + def _step_vision(self, messages: List[Dict]) -> 'AgentResponse': + """handle vision model calls""" + # convert to proper format + content = [] + for msg in messages: + if msg.get("type") == "text": + content.append({"type": "text", "text": msg["text"]}) + elif msg.get("type") == "image_url": + content.append({ + "type": "image_url", + "image_url": msg["image_url"] + }) + + human_msg = HumanMessage(content=content) + + # get response + input_tokens, output_tokens = 0, 0 + try: + if self.config.provider in ('openai', 'zhipu'): + with get_openai_callback() as cb: + response = self.model.invoke([self.history[0], human_msg]) + input_tokens = cb.prompt_tokens or 0 + output_tokens = cb.completion_tokens or 0 + else: + response = self.model.invoke([self.history[0], human_msg]) + # estimate tokens + input_tokens = 200 # rough estimate for image + output_tokens = len(response.content.split()) * 1.3 + except Exception as e: + error_msg = f"vision model call failed: {e}" + print(error_msg) + + # provide more specific error information for vision calls + if "timeout" in str(e).lower() or "read operation timed out" in str(e).lower(): + print(f"⚠️ Vision timeout error detected for {self.config.provider} {self.config.model_name}") + print("💡 Vision calls may take longer due to image processing") + print(" - Consider using a different vision model") + print(" - Check image size and format") + elif "rate limit" in str(e).lower(): + print(f"⚠️ Rate limit exceeded for vision calls on {self.config.provider}") + elif "authentication" in str(e).lower() or "api key" in str(e).lower(): + print(f"⚠️ Authentication error for vision calls on {self.config.provider}") + + raise + + return AgentResponse(response.content, input_tokens, output_tokens) + + +class AgentResponse: + """agent response with token tracking""" + def __init__(self, content: str, input_tokens: int, output_tokens: int): + self.content = content + self.input_tokens = input_tokens + self.output_tokens = output_tokens + + +def extract_json(response: str) -> Dict[str, Any]: + """extract json from model response""" + + # find json code block + start = response.find("```json") + end = response.rfind("```") + + if start != -1 and end != -1 and end > start: + json_content = response[start + 7:end].strip() + else: + json_content = response.strip() + + try: + return json_repair.loads(json_content) + except Exception as e: + raise ValueError(f"failed to parse json: {e}") + + +def load_prompt(path: str) -> str: + """load prompt template from file""" + with open(path, 'r', encoding='utf-8') as f: + return f.read() \ No newline at end of file diff --git a/dataflow_agent/toolkits/postertool/utils/src/__init__.py b/dataflow_agent/toolkits/postertool/utils/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dataflow_agent/toolkits/postertool/utils/src/logging_utils.py b/dataflow_agent/toolkits/postertool/utils/src/logging_utils.py new file mode 100644 index 00000000..47b40dc0 --- /dev/null +++ b/dataflow_agent/toolkits/postertool/utils/src/logging_utils.py @@ -0,0 +1,105 @@ +"""logging utility for all LangGraph agents""" + +import inspect +from pathlib import Path +from rich.console import Console +from rich.text import Text + +console = Console() + +def _get_caller_info(): + """get the caller file and line number, skipping this logging_utils.py file""" + frame = inspect.currentframe() + try: + current_frame = frame.f_back + while current_frame: + filepath = Path(current_frame.f_code.co_filename) + filename = filepath.name + + if filename != "logging_utils.py": + line_number = current_frame.f_lineno + + # try to get relative path from current working directory or project root + try: + relative_path = filepath.relative_to(Path.cwd()) + except ValueError: + try: + current_dir = Path.cwd() + while current_dir.parent != current_dir: + if (current_dir / "README.md").exists() or (current_dir / "requirements.txt").exists(): + relative_path = filepath.relative_to(current_dir) + break + current_dir = current_dir.parent + else: + relative_path = filepath.name + except ValueError: + relative_path = filepath.name + + return f"{relative_path}:{line_number}" + current_frame = current_frame.f_back + return "unknown:0" + finally: + del frame + +def log(agent_name: str, level: str, message: str, max_width: int = 15, show_location: bool = True): + """ + centralized logging function for all agents + + args: + agent_name: name of the agent (e.g., "parser", "color_agent") + level: log level (e.g., "info", "warning", "error", "success") + message: the message to log + max_width: maximum width for the agent name padding + show_location: whether to show file location info + """ + # clean agent name for display + display_name = agent_name.replace("_agent", "").replace("_node", "").replace("_", " ").title() + + # color scheme based on level + level_colors = { + "info": "cyan", + "warning": "yellow", + "error": "red", + "success": "green", + "debug": "blue" + } + + level_color = level_colors.get(level.lower(), "white") + + # create header with fixed width + header = Text(f"[ {display_name:^{max_width}} ]", style=f"bold {level_color}") + + # add location info if requested + if show_location: + location_info = _get_caller_info() + location_text = Text(f" [{location_info}] ", style="dim") + header.append(location_text) + + body = Text(message) + + console.print(header, body) + + +def log_agent_start(agent_name: str, show_location: bool = True): + """log agent start with separator""" + log(agent_name, "info", f"starting {agent_name}...", show_location=show_location) + + +def log_agent_success(agent_name: str, message: str, show_location: bool = True): + """log agent success""" + log(agent_name, "success", f"✅ {message}", show_location=show_location) + + +def log_agent_error(agent_name: str, message: str, show_location: bool = True): + """log agent error""" + log(agent_name, "error", f"❌ {message}", show_location=show_location) + + +def log_agent_warning(agent_name: str, message: str, show_location: bool = True): + """log agent warning""" + log(agent_name, "warning", f"⚠️ {message}", show_location=show_location) + + +def log_agent_info(agent_name: str, message: str, show_location: bool = True): + """log agent info""" + log(agent_name, "info", message, show_location=show_location) \ No newline at end of file diff --git a/dataflow_agent/workflow/wf_paper2poster.py b/dataflow_agent/workflow/wf_paper2poster.py new file mode 100644 index 00000000..e8045a57 --- /dev/null +++ b/dataflow_agent/workflow/wf_paper2poster.py @@ -0,0 +1,229 @@ +""" +Paper2Poster Workflow +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Converts academic papers to aesthetic conference posters using multi-agent LLMs. + +This workflow integrates PosterGen functionality into Paper2Any: +1. Parser Agent - extracts and structures content from paper PDF +2. Curator Agent - designs narrative-based storyboard +3. Layout Agent - creates spatially balanced three-column layout +4. Color Agent - generates harmonious color palette from affiliation logo +5. Section Title Designer - applies hierarchical typography +6. Font Agent - applies typography and keyword highlighting +7. Renderer - generates final PPTX and PNG outputs +""" + +from __future__ import annotations +import asyncio +import os +import sys +import time +from pathlib import Path +from typing import Dict, Any + +from dataflow_agent.state import Paper2PosterState +from dataflow_agent.graphbuilder.graph_builder import GenericGraphBuilder +from dataflow_agent.workflow.registry import register +from dataflow_agent.logger import get_logger +from dataflow_agent.utils import get_project_root + +log = get_logger(__name__) + + +def _ensure_result_path(state: Paper2PosterState) -> Paper2PosterState: + """Ensure output directory exists and return path""" + raw = getattr(state, "result_path", None) + if raw: + return state + + root = get_project_root() + ts = int(time.time()) + base_dir = (root / "outputs" / "paper2poster" / str(ts)).resolve() + base_dir.mkdir(parents=True, exist_ok=True) + state.result_path = str(base_dir) + return state + + +def _import_postergen(): + """Import postertool modules dynamically""" + try: + # Add postertool to path if not already there + postergen_path = Path(__file__).parent.parent / "toolkits" / "postertool" + if postergen_path.exists() and str(postergen_path) not in sys.path: + sys.path.insert(0, str(postergen_path)) + + # Import PosterGen modules + from src.state.poster_state import create_state as create_poster_state + from src.workflow.pipeline import create_workflow_graph + + return { + 'create_poster_state': create_poster_state, + 'create_workflow_graph': create_workflow_graph, + } + except ImportError as e: + log.error(f"Failed to import PosterGen modules: {e}") + log.error("Please ensure PosterGen is installed in the parent directory") + raise + + +@register("paper2poster") +def create_paper2poster_graph() -> GenericGraphBuilder: + """Create Paper2Poster workflow graph""" + builder = GenericGraphBuilder( + state_model=Paper2PosterState, + entry_point="_start_" + ) + + # NOTE: We don't import PosterGen modules here because we need to set + # environment variables first (based on the state), and LangChain + # initializes API clients at import time. + # The import will happen inside the workflow node after env vars are set. + + # ---------------------------------------------------------------------- + # Node: Run PosterGen Pipeline + # ---------------------------------------------------------------------- + async def run_postergen_pipeline(state: Paper2PosterState) -> Paper2PosterState: + """Execute the complete PosterGen pipeline""" + log.info("Starting PosterGen pipeline execution") + + # CRITICAL: Save the Paper2Any working directory at the very beginning + # before any directory changes + paper2any_cwd = str(get_project_root()) + + # Get API credentials from state + api_key = state.request.api_key or state.request.chat_api_key + api_url = state.request.chat_api_url + + # Update postertool .env file with user-provided credentials + # This ensures pipeline.py loads the correct credentials when it calls load_dotenv() + postergen_path = Path(__file__).parent.parent / "toolkits" / "postertool" + env_file_path = postergen_path / ".env" + + if api_key and api_url: + log.info(f"Updating postertool .env file with user credentials") + env_content = f'OPENAI_API_KEY="{api_key}"\n' + env_content += f'OPENAI_BASE_URL="{api_url}"\n' + env_file_path.write_text(env_content) + log.info(f"Updated {env_file_path}") + + # CRITICAL: Change to postertool directory BEFORE importing modules + # This is required because load_dotenv() executes at import time + try: + os.chdir(str(postergen_path)) + log.info(f"Changed to postertool directory: {postergen_path}") + + # NOW import postertool modules - load_dotenv will find the .env file + postergen_modules = _import_postergen() + log.info("postertool modules imported with correct .env file") + + # Ensure output directory exists + state = _ensure_result_path(state) + output_dir = state.result_path + + # Get paper path + paper_path = state.paper_file + if not paper_path or not Path(paper_path).exists(): + error_msg = f"Paper file not found: {paper_path}" + log.error(error_msg) + state.errors.append(error_msg) + return state + + # Get model configurations + text_model = state.request.model + vision_model = state.request.vision_model + + # Get poster dimensions + poster_width = state.poster_width + poster_height = state.poster_height + + # Get asset paths + logo_path = state.logo_path or state.request.logo_path + aff_logo_path = state.aff_logo_path or state.request.aff_logo_path + url = state.url or state.request.url + + log.info(f"Paper: {paper_path}") + log.info(f"Output: {output_dir}") + log.info(f"Dimensions: {poster_width}x{poster_height} inches") + log.info(f"Text Model: {text_model}") + log.info(f"Vision Model: {vision_model}") + + # Create PosterGen state + from langgraph.graph import StateGraph, START, END + + poster_state = postergen_modules['create_poster_state']( + pdf_path=paper_path, + text_model=text_model, + vision_model=vision_model, + width=int(poster_width), + height=int(poster_height), + url=url, + logo_path=logo_path, + aff_logo_path=aff_logo_path + ) + + # Override output directory to use our custom path + poster_state['output_dir'] = output_dir + poster_state['poster_name'] = Path(paper_path).stem + + # Create PosterGen workflow using their official function + graph = postergen_modules['create_workflow_graph']() + workflow = graph.compile() + log.info("Executing PosterGen workflow...") + + # Execute workflow (already in PosterGen directory) + result_state = await workflow.ainvoke(poster_state) + + # Extract results + state.poster_name = result_state.get('poster_name', '') + state.structured_sections = result_state.get('structured_sections') + state.classified_visuals = result_state.get('classified_visuals') + state.narrative_content = result_state.get('narrative_content') + state.story_board = result_state.get('story_board') + state.optimized_story_board = result_state.get('optimized_story_board') + state.initial_layout_data = result_state.get('initial_layout_data') + state.optimized_layout = result_state.get('optimized_layout') + state.final_design_layout = result_state.get('design_layout') + state.color_scheme = result_state.get('color_scheme') + state.section_title_design = result_state.get('section_title_design') + state.keywords = result_state.get('keywords') + state.styled_layout = result_state.get('styled_layout') + + # Set output paths + poster_name = state.poster_name + state.output_pptx_path = str(Path(output_dir) / f"{poster_name}.pptx") + state.output_png_path = str(Path(output_dir) / f"{poster_name}.png") + + log.info(f"✓ PosterGen pipeline completed successfully") + log.info(f"PPTX output: {state.output_pptx_path}") + log.info(f"PNG output: {state.output_png_path}") + + except Exception as e: + error_msg = f"PosterGen pipeline failed: {str(e)}" + log.error(error_msg) + import traceback + log.error(traceback.format_exc()) + state.errors.append(error_msg) + finally: + # Always restore to Paper2Any directory + os.chdir(paper2any_cwd) + log.info(f"Restored working directory to: {paper2any_cwd}") + + return state + + # ---------------------------------------------------------------------- + # Workflow Structure + # ---------------------------------------------------------------------- + nodes = { + "_start_": _ensure_result_path, + "run_postergen_pipeline": run_postergen_pipeline, + "_end_": lambda s: s, + } + + edges = [ + ("run_postergen_pipeline", "_end_"), + ] + + builder.add_nodes(nodes).add_edges(edges) + builder.add_edge("_start_", "run_postergen_pipeline") + + return builder diff --git a/fastapi_app/main.py b/fastapi_app/main.py index a882a10f..10fa6c5d 100644 --- a/fastapi_app/main.py +++ b/fastapi_app/main.py @@ -7,7 +7,7 @@ from fastapi.staticfiles import StaticFiles from fastapi_app.routers import paper2video -from fastapi_app.routers import paper2any, paper2ppt +from fastapi_app.routers import paper2any, paper2ppt, paper2poster from fastapi_app.routers import pdf2ppt, image2ppt, kb, kb_embedding, files from fastapi_app.routers import image2drawio from fastapi_app.routers import paper2drawio @@ -51,6 +51,8 @@ def create_app() -> FastAPI: app.include_router(paper2any.router, prefix="/api/v1", tags=["paper2any"]) # Paper2PPT app.include_router(paper2ppt.router, prefix="/api/v1", tags=["paper2ppt"]) + # Paper2Poster + app.include_router(paper2poster.router, prefix="/api/v1", tags=["paper2poster"]) # PDF2PPT app.include_router(pdf2ppt.router, prefix="/api/v1", tags=["pdf2ppt"]) # Image2PPT diff --git a/fastapi_app/routers/paper2poster.py b/fastapi_app/routers/paper2poster.py new file mode 100644 index 00000000..dcc4e7ee --- /dev/null +++ b/fastapi_app/routers/paper2poster.py @@ -0,0 +1,179 @@ +from __future__ import annotations + +import os +import tempfile +import time +from pathlib import Path +from typing import Optional + +from fastapi import APIRouter, File, Form, UploadFile, HTTPException +from fastapi.responses import FileResponse + +from dataflow_agent.logger import get_logger +from dataflow_agent.state import Paper2PosterState, Paper2PosterRequest +from dataflow_agent.workflow import run_workflow +from dataflow_agent.utils import get_project_root + +log = get_logger(__name__) + +router = APIRouter() + + +@router.post("/paper2poster/generate") +async def generate_paper2poster( + paper_file: UploadFile = File(...), + # API configuration + chat_api_url: str = Form(...), + api_key: str = Form(...), + # Model configuration + model: str = Form("gpt-4o-2024-08-06"), + vision_model: str = Form("gpt-4o-2024-08-06"), + # Poster dimensions + poster_width: float = Form(54.0), + poster_height: float = Form(36.0), + # Optional assets + logo_file: Optional[UploadFile] = File(None), + aff_logo_file: Optional[UploadFile] = File(None), + url: str = Form(""), + # Optional metadata + email: Optional[str] = Form(None), +): + """ + Paper2Poster API endpoint: Convert academic paper to aesthetic conference poster + + Args: + paper_file: PDF paper file + chat_api_url: LLM API URL + api_key: LLM API key + model: Text model name + vision_model: Vision model name + poster_width: Poster width in inches (default: 54.0) + poster_height: Poster height in inches (default: 36.0) + logo_file: Conference/journal logo (optional) + aff_logo_file: Affiliation logo for color extraction (optional) + url: URL for QR code (optional) + email: User email (optional) + + Returns: + FileResponse: Generated PPTX file + """ + + try: + # Validate poster dimensions + ratio = poster_width / poster_height + if ratio > 2.0 or ratio < 1.4: + raise HTTPException( + status_code=400, + detail=f"Poster aspect ratio {ratio:.2f} is out of range. Please use a ratio between 1.4 and 2.0" + ) + + # Create temporary directory for this request + project_root = get_project_root() + timestamp = int(time.time()) + temp_dir = project_root / "outputs" / "api" / "paper2poster" / str(timestamp) + temp_dir.mkdir(parents=True, exist_ok=True) + + # Save uploaded paper file + paper_path = temp_dir / paper_file.filename + with open(paper_path, "wb") as f: + content = await paper_file.read() + f.write(content) + + log.info(f"Saved paper file: {paper_path}") + + # Save logo files if provided + logo_path = "" + if logo_file: + logo_path = str(temp_dir / logo_file.filename) + with open(logo_path, "wb") as f: + content = await logo_file.read() + f.write(content) + log.info(f"Saved logo file: {logo_path}") + + aff_logo_path = "" + if aff_logo_file: + aff_logo_path = str(temp_dir / aff_logo_file.filename) + with open(aff_logo_path, "wb") as f: + content = await aff_logo_file.read() + f.write(content) + log.info(f"Saved affiliation logo file: {aff_logo_path}") + + # Build request + req = Paper2PosterRequest( + chat_api_url=chat_api_url, + api_key=api_key, + chat_api_key=api_key, + model=model, + vision_model=vision_model, + poster_width=poster_width, + poster_height=poster_height, + logo_path=logo_path, + aff_logo_path=aff_logo_path, + url=url, + ) + + # Build state + state = Paper2PosterState( + request=req, + messages=[], + agent_results={}, + result_path=str(temp_dir), + paper_file=str(paper_path), + poster_width=poster_width, + poster_height=poster_height, + logo_path=logo_path, + aff_logo_path=aff_logo_path, + url=url, + ) + + log.info(f"Starting Paper2Poster workflow for {paper_file.filename}") + log.info(f"Dimensions: {poster_width}x{poster_height} inches") + log.info(f"Models: text={model}, vision={vision_model}") + + # Run workflow + final_state = await run_workflow("paper2poster", state) + + # Get output PPTX path (workflow returns a dict, not an object) + if isinstance(final_state, dict): + pptx_path = final_state.get("output_pptx_path") + errors = final_state.get("errors", []) + else: + pptx_path = getattr(final_state, "output_pptx_path", None) + errors = getattr(final_state, "errors", []) + + if not pptx_path or not os.path.exists(pptx_path): + # Check for errors + error_msg = "; ".join(errors) if errors else "Unknown error" + log.error(f"Paper2Poster workflow failed: {error_msg}") + raise HTTPException( + status_code=500, + detail=f"Failed to generate poster: {error_msg}" + ) + + log.info(f"✓ Paper2Poster workflow completed: {pptx_path}") + + # Get PNG path + png_path = str(pptx_path).replace('.pptx', '.png') + + # Generate relative URLs for frontend + pptx_url = f"/outputs/api/paper2poster/{temp_dir.name}/{Path(pptx_path).name}" + png_url = f"/outputs/api/paper2poster/{temp_dir.name}/{Path(png_path).name}" if os.path.exists(png_path) else None + + # Return JSON with file URLs + return { + "success": True, + "pptx_url": pptx_url, + "png_url": png_url, + "message": "Poster generated successfully" + } + + except HTTPException: + raise + except Exception as e: + log.error(f"Paper2Poster API error: {str(e)}") + import traceback + log.error(traceback.format_exc()) + raise HTTPException( + status_code=500, + detail=f"Internal server error: {str(e)}" + ) diff --git a/fastapi_app/start_backend.sh b/fastapi_app/start_backend.sh new file mode 100755 index 00000000..2be31708 --- /dev/null +++ b/fastapi_app/start_backend.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Starting Paper2Any Backend..." +uvicorn main:app --host 0.0.0.0 --port 8000 --reload diff --git a/frontend-workflow/src/components/Paper2PosterPage.tsx b/frontend-workflow/src/components/Paper2PosterPage.tsx new file mode 100644 index 00000000..539303c9 --- /dev/null +++ b/frontend-workflow/src/components/Paper2PosterPage.tsx @@ -0,0 +1,3 @@ +import Paper2PosterPage from './paper2poster'; + +export default Paper2PosterPage; diff --git a/frontend-workflow/src/components/paper2poster/Banner.tsx b/frontend-workflow/src/components/paper2poster/Banner.tsx new file mode 100644 index 00000000..33cc67e1 --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/Banner.tsx @@ -0,0 +1,94 @@ +import React, { useState, useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Github, Star, X } from 'lucide-react'; + +interface BannerProps { + show: boolean; + onClose: () => void; + stars?: { + dataflow: number | null; + agent: number | null; + dataflex: number | null; + }; +} + +const Banner: React.FC = ({ show, onClose, stars }) => { + const { t } = useTranslation(['common']); + + if (!show) return null; + + return ( + + ); +}; + +export default Banner; diff --git a/frontend-workflow/src/components/paper2poster/CompleteStep.tsx b/frontend-workflow/src/components/paper2poster/CompleteStep.tsx new file mode 100644 index 00000000..238006a9 --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/CompleteStep.tsx @@ -0,0 +1,152 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Download, FileImage, FileText, RotateCcw, CheckCircle, Github, Star } from 'lucide-react'; +import { GenerateResult } from './types'; + +interface CompleteStepProps { + result: GenerateResult; + handleReset: () => void; + handleCopyShareText: () => void; + copySuccess: string; + stars?: { + dataflow: number | null; + agent: number | null; + dataflex: number | null; + }; +} + +const CompleteStep: React.FC = ({ + result, + handleReset, + handleCopyShareText, + copySuccess, + stars +}) => { + const { t } = useTranslation(['paper2poster', 'common']); + + return ( +
+
+ +

+ + {t('complete.title', '生成完成!')} + +

+

+ {t('complete.desc', '您的学术海报已成功生成')} +

+
+ + {/* 下载区域 */} + + + {/* 分享区域 */} +
+

{t('complete.share', '分享获取免费Key')}

+

+ {t('complete.shareDesc', '复制文案并分享到社交媒体,联系管理员即可获取免费API Key')} +

+ +
+ + {/* GitHub Stars */} + + + {/* 重置按钮 */} + +
+ ); +}; + +export default CompleteStep; diff --git a/frontend-workflow/src/components/paper2poster/GenerateStep.tsx b/frontend-workflow/src/components/paper2poster/GenerateStep.tsx new file mode 100644 index 00000000..14bcd755 --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/GenerateStep.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Loader2, CheckCircle, AlertCircle } from 'lucide-react'; +import { GenerateResult } from './types'; + +interface GenerateStepProps { + result: GenerateResult; + error: string | null; +} + +const GenerateStep: React.FC = ({ result, error }) => { + const { t } = useTranslation(['paper2poster', 'common']); + + return ( +
+
+

+ + {t('generate.title', '正在生成海报')} + +

+

+ {t('generate.desc', '请稍候,AI正在为您生成精美的学术海报...')} +

+
+ + {/* 生成状态 */} +
+ {result.status === 'processing' && ( +
+ +

+ {t('generate.processing', '生成中...')} +

+

+ {t('generate.processingDesc', '这可能需要几分钟时间,请耐心等待')} +

+ {result.progress !== undefined && ( +
+
+
+
+

{result.progress.toFixed(0)}%

+
+ )} +
+ )} + + {result.status === 'done' && ( +
+ +

+ {t('generate.done', '生成完成!')} +

+

+ {t('generate.doneDesc', '海报已成功生成')} +

+
+ )} + + {error && ( +
+ +
+

{error}

+
+
+ )} +
+
+ ); +}; + +export default GenerateStep; diff --git a/frontend-workflow/src/components/paper2poster/StepIndicator.tsx b/frontend-workflow/src/components/paper2poster/StepIndicator.tsx new file mode 100644 index 00000000..c0febecc --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/StepIndicator.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Check, ArrowRight } from 'lucide-react'; +import { Step } from './types'; + +interface StepIndicatorProps { + currentStep: Step; +} + +const StepIndicator: React.FC = ({ currentStep }) => { + const { t } = useTranslation(['paper2poster', 'common']); + + const steps = [ + { key: 'upload', label: t('steps.upload', '上传配置'), num: 1 }, + { key: 'generate', label: t('steps.generate', '生成海报'), num: 2 }, + { key: 'complete', label: t('steps.complete', '完成'), num: 3 }, + ]; + + const currentIndex = steps.findIndex(s => s.key === currentStep); + + return ( +
+ {steps.map((step, index) => ( +
+
+ + {index < currentIndex ? : step.num} + + {step.label} +
+ {index < steps.length - 1 && ( + + )} +
+ ))} +
+ ); +}; + +export default StepIndicator; diff --git a/frontend-workflow/src/components/paper2poster/UploadStep.tsx b/frontend-workflow/src/components/paper2poster/UploadStep.tsx new file mode 100644 index 00000000..8261490e --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/UploadStep.tsx @@ -0,0 +1,335 @@ +import React, { ChangeEvent } from 'react'; +import { useTranslation } from 'react-i18next'; +import { API_URL_OPTIONS } from '../../config/api'; +import { + UploadCloud, Settings2, Loader2, AlertCircle, ArrowRight, + FileText, Key, Globe, Cpu, Image as ImageIcon, Ruler +} from 'lucide-react'; +import { PosterConfig } from './types'; + +interface UploadStepProps { + selectedFile: File | null; + logoFile: File | null; + affLogoFile: File | null; + isDragOver: boolean; + setIsDragOver: (isDragOver: boolean) => void; + + config: PosterConfig; + setConfig: (config: PosterConfig) => void; + + isUploading: boolean; + isValidating: boolean; + progress: number; + progressStatus: string; + error: string | null; + + llmApiUrl: string; + setLlmApiUrl: (url: string) => void; + apiKey: string; + setApiKey: (key: string) => void; + + handleFileChange: (e: ChangeEvent) => void; + handleLogoChange: (e: ChangeEvent) => void; + handleAffLogoChange: (e: ChangeEvent) => void; + handleDrop: (e: React.DragEvent) => void; + handleUploadAndGenerate: () => void; +} + +const UploadStep: React.FC = ({ + selectedFile, + logoFile, + affLogoFile, + isDragOver, setIsDragOver, + config, setConfig, + isUploading, isValidating, + progress, progressStatus, + error, + llmApiUrl, setLlmApiUrl, + apiKey, setApiKey, + handleFileChange, + handleLogoChange, + handleAffLogoChange, + handleDrop, + handleUploadAndGenerate +}) => { + const { t } = useTranslation(['paper2poster', 'common']); + + return ( +
+
+

+ {t('upload.subtitle', 'PAPER → POSTER')} +

+

+ + {t('upload.title', 'Paper2Poster')} + +

+

+ {t('upload.desc', '上传学术论文PDF,自动生成精美的会议海报')}
+ {t('upload.descHighlight', '支持自定义尺寸和Logo')} +

+
+ + {/* 文件上传区域 */} +
+
+
+ +
+
+

{t('upload.fileSection', '上传文件')}

+

{t('upload.fileSectionDesc', '上传论文PDF和Logo图片')}

+
+
+ + {/* PDF上传 */} +
{ e.preventDefault(); setIsDragOver(true); }} + onDragLeave={() => setIsDragOver(false)} + onDrop={handleDrop} + > + + +

+ {selectedFile ? selectedFile.name : t('upload.dropFile', '拖拽PDF文件到此处或点击上传')} +

+

{t('upload.fileLimit', '支持PDF格式,最大50MB')}

+
+ + {/* Logo上传 */} +
+
+ + +
+ +
+ + +
+
+
+ + {/* 海报配置区域 */} +
+
+
+ +
+
+

{t('upload.posterConfig', '海报配置')}

+

{t('upload.posterConfigDesc', '配置模型和尺寸')}

+
+
+ + {/* 模型配置 */} +
+
+ + +
+ +
+ + +
+
+ + {/* 海报尺寸 */} +
+
+ + setConfig({ ...config, poster_width: parseFloat(e.target.value) })} + min="20" + max="100" + step="1" + className="w-full px-4 py-3 bg-black/40 border border-white/20 rounded-xl text-gray-100 focus:outline-none focus:ring-2 focus:ring-green-500 transition-colors" + /> +
+ +
+ + setConfig({ ...config, poster_height: parseFloat(e.target.value) })} + min="20" + max="100" + step="1" + className="w-full px-4 py-3 bg-black/40 border border-white/20 rounded-xl text-gray-100 focus:outline-none focus:ring-2 focus:ring-green-500 transition-colors" + /> +
+
+
+ + {/* API配置区域 */} +
+
+
+ +
+
+

{t('upload.apiConfig', 'API配置')}

+

{t('upload.apiConfigDesc', '配置LLM API')}

+
+
+ +
+
+ + +
+ +
+ + setApiKey(e.target.value)} + placeholder={t('upload.apiKeyPlaceholder', '输入API Key')} + className="w-full px-4 py-3 bg-black/40 border border-white/20 rounded-xl text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-green-500 transition-colors" + /> +
+
+
+ + {/* 错误提示 */} + {error && ( +
+
+ +
+

{error}

+
+
+
+ )} + + {/* 进度条 */} + {isUploading && ( +
+
+ + {progressStatus} +
+
+
+
+

{progress.toFixed(0)}%

+
+ )} + + {/* 提交按钮 */} + + + {/* 提示信息 */} +
+

💡 {t('upload.tips', '提示:')}

+
    +
  • • {t('upload.tip1', '海报宽高比建议在1.4-2.0之间')}
  • +
  • • {t('upload.tip2', '推荐尺寸:54" × 36"(标准会议海报)')}
  • +
  • • {t('upload.tip3', '生成过程可能需要几分钟')}
  • +
  • • {t('upload.tip4', '输出包含PPTX(可编辑)和PNG文件')}
  • +
+
+
+ ); +}; + +export default UploadStep; diff --git a/frontend-workflow/src/components/paper2poster/constants.ts b/frontend-workflow/src/components/paper2poster/constants.ts new file mode 100644 index 00000000..a3d85845 --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/constants.ts @@ -0,0 +1,9 @@ +export const MAX_FILE_SIZE = 50 * 1024 * 1024; // 50MB +export const STORAGE_KEY = 'paper2poster-storage'; + +export const DEFAULT_CONFIG = { + text_model: 'gpt-5.1', + vision_model: 'gemini-3-pro-image-preview', + poster_width: 54, + poster_height: 36, +}; diff --git a/frontend-workflow/src/components/paper2poster/index.tsx b/frontend-workflow/src/components/paper2poster/index.tsx new file mode 100644 index 00000000..8f17669b --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/index.tsx @@ -0,0 +1,421 @@ +import React, { useState, useEffect, ChangeEvent } from 'react'; +import { useTranslation } from 'react-i18next'; +import { API_KEY } from '../../config/api'; +import { checkQuota, recordUsage } from '../../services/quotaService'; +import { verifyLlmConnection } from '../../services/llmService'; +import { useAuthStore } from '../../stores/authStore'; +import { getApiSettings, saveApiSettings } from '../../services/apiSettingsService'; +import { uploadAndSaveFile } from '../../services/fileService'; + +import { Step, PosterConfig, GenerateResult } from './types'; +import { MAX_FILE_SIZE, STORAGE_KEY, DEFAULT_CONFIG } from './constants'; + +import Banner from './Banner'; +import StepIndicator from './StepIndicator'; +import UploadStep from './UploadStep'; +import GenerateStep from './GenerateStep'; +import CompleteStep from './CompleteStep'; + +const Paper2PosterPage = () => { + const { user, refreshQuota } = useAuthStore(); + + // Step 状态 + const [currentStep, setCurrentStep] = useState('upload'); + + // 文件状态 + const [selectedFile, setSelectedFile] = useState(null); + const [logoFile, setLogoFile] = useState(null); + const [affLogoFile, setAffLogoFile] = useState(null); + const [isDragOver, setIsDragOver] = useState(false); + + // 配置状态 + const [config, setConfig] = useState(DEFAULT_CONFIG); + + // API 配置状态 + const [llmApiUrl, setLlmApiUrl] = useState(import.meta.env.VITE_DEFAULT_LLM_API_URL || 'https://api.apiyi.com/v1'); + const [apiKey, setApiKey] = useState(''); + + // 生成状态 + const [isUploading, setIsUploading] = useState(false); + const [isValidating, setIsValidating] = useState(false); + const [progress, setProgress] = useState(0); + const [progressStatus, setProgressStatus] = useState(''); + const [error, setError] = useState(null); + + // 结果状态 + const [result, setResult] = useState({ + status: 'pending', + }); + + // GitHub Stars + const [stars, setStars] = useState<{dataflow: number | null, agent: number | null, dataflex: number | null}>({ + dataflow: null, + agent: null, + dataflex: null, + }); + const [copySuccess, setCopySuccess] = useState(''); + const [showBanner, setShowBanner] = useState(true); + + const shareText = `发现一个超好用的AI工具 DataFlow-Agent!🚀 +支持论文转PPT、PDF转PPT、论文转海报等功能,科研打工人的福音! + +🔗 在线体验:https://dcai-paper2any.nas.cpolar.cn/ +⭐ GitHub Agent:https://github.com/OpenDCAI/Paper2Any +🌟 GitHub Core:https://github.com/OpenDCAI/DataFlow + +转发本文案+截图,联系微信群管理员即可获取免费Key!🎁 +#AI工具 #学术海报 #科研效率 #开源项目`; + + const handleCopyShareText = async () => { + try { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(shareText); + } else { + const textArea = document.createElement("textarea"); + textArea.value = shareText; + textArea.style.position = "fixed"; + textArea.style.left = "-9999px"; + textArea.style.top = "0"; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + } catch (err) { + console.error('Fallback: Oops, unable to copy', err); + throw err; + } finally { + document.body.removeChild(textArea); + } + } + setCopySuccess('文案已复制!快去分享吧'); + setTimeout(() => setCopySuccess(''), 2000); + } catch (err) { + console.error('复制失败', err); + setCopySuccess('复制失败,请手动复制'); + } + }; + + // 获取 GitHub Stars + useEffect(() => { + const fetchStars = async () => { + try { + const [res1, res2, res3] = await Promise.all([ + fetch('https://api.github.com/repos/OpenDCAI/DataFlow'), + fetch('https://api.github.com/repos/OpenDCAI/Paper2Any'), + fetch('https://api.github.com/repos/OpenDCAI/DataFlex') + ]); + const data1 = await res1.json(); + const data2 = await res2.json(); + const data3 = await res3.json(); + setStars({ + dataflow: data1.stargazers_count, + agent: data2.stargazers_count, + dataflex: data3.stargazers_count, + }); + } catch (e) { + console.error('Failed to fetch stars', e); + } + }; + fetchStars(); + }, []); + + // 从 localStorage 恢复配置 + useEffect(() => { + if (typeof window === 'undefined') return; + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (raw) { + const saved = JSON.parse(raw); + if (saved.config) setConfig(saved.config); + + // API settings: prioritize user-specific settings + const userApiSettings = getApiSettings(user?.id || null); + if (userApiSettings) { + if (userApiSettings.apiUrl) setLlmApiUrl(userApiSettings.apiUrl); + if (userApiSettings.apiKey) setApiKey(userApiSettings.apiKey); + } else { + if (saved.llmApiUrl) setLlmApiUrl(saved.llmApiUrl); + if (saved.apiKey) setApiKey(saved.apiKey); + } + } + } catch (e) { + console.error('Failed to restore paper2poster config', e); + } + }, [user?.id]); + + // 将配置写入 localStorage + useEffect(() => { + if (typeof window === 'undefined') return; + const data = { + config, + llmApiUrl, + apiKey, + }; + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); + if (user?.id && llmApiUrl && apiKey) { + saveApiSettings(user.id, { apiUrl: llmApiUrl, apiKey }); + } + } catch (e) { + console.error('Failed to persist paper2poster config', e); + } + }, [config, llmApiUrl, apiKey, user?.id]); + + // 文件处理函数 + const validatePdfFile = (file: File): boolean => { + const ext = file.name.split('.').pop()?.toLowerCase(); + if (ext !== 'pdf') { + setError('仅支持 PDF 格式'); + return false; + } + return true; + }; + + const handleFileChange = (e: ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file || !validatePdfFile(file)) return; + if (file.size > MAX_FILE_SIZE) { + setError('文件大小超过 50MB 限制'); + return; + } + setSelectedFile(file); + setError(null); + }; + + const handleLogoChange = (e: ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + setLogoFile(file); + }; + + const handleAffLogoChange = (e: ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + setAffLogoFile(file); + }; + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragOver(false); + const file = e.dataTransfer.files?.[0]; + if (!file || !validatePdfFile(file)) return; + if (file.size > MAX_FILE_SIZE) { + setError('文件大小超过 50MB 限制'); + return; + } + setSelectedFile(file); + setError(null); + }; + + // 上传并生成海报 + const handleUploadAndGenerate = async () => { + if (!selectedFile) { + setError('请先选择 PDF 文件'); + return; + } + if (!apiKey.trim()) { + setError('请输入 API Key'); + return; + } + + // Check quota + const quota = await checkQuota(user?.id || null, user?.is_anonymous || false); + if (quota.remaining <= 0) { + setError(quota.isAuthenticated + ? '今日配额已用完(10次/天),请明天再试' + : '今日配额已用完(5次/天),登录后可获得更多配额'); + return; + } + + try { + // Verify LLM Connection + setIsValidating(true); + setError(null); + await verifyLlmConnection(llmApiUrl, apiKey, 'gpt-4o'); + setIsValidating(false); + } catch (err) { + setIsValidating(false); + const message = err instanceof Error ? err.message : 'API 验证失败'; + setError(message); + return; + } + + setIsUploading(true); + setError(null); + setProgress(0); + setProgressStatus('正在初始化...'); + setCurrentStep('generate'); + setResult({ status: 'processing', progress: 0 }); + + // 模拟进度 + const progressInterval = setInterval(() => { + setProgress(prev => { + if (prev >= 90) return 90; + const messages = [ + '正在上传文件...', + '正在解析PDF...', + '正在提取内容...', + '正在生成布局...', + '正在渲染海报...' + ]; + const msgIndex = Math.floor(prev / 20); + if (msgIndex < messages.length) { + setProgressStatus(messages[msgIndex]); + setResult(r => ({ ...r, progress: prev })); + } + return prev + (Math.random() * 0.6 + 0.2); + }); + }, 1000); + + try { + const formData = new FormData(); + formData.append('paper_file', selectedFile); + formData.append('chat_api_url', llmApiUrl.trim()); + formData.append('api_key', apiKey.trim()); + formData.append('model', config.text_model); + formData.append('vision_model', config.vision_model); + formData.append('poster_width', config.poster_width.toString()); + formData.append('poster_height', config.poster_height.toString()); + + if (logoFile) { + formData.append('logo_file', logoFile); + } + if (affLogoFile) { + formData.append('aff_logo_file', affLogoFile); + } + + const res = await fetch('/api/v1/paper2poster/generate', { + method: 'POST', + headers: { 'X-API-Key': API_KEY }, + body: formData, + }); + + if (!res.ok) { + throw new Error(`HTTP error! status: ${res.status}`); + } + + const data = await res.json(); + + clearInterval(progressInterval); + setProgress(100); + setProgressStatus('生成完成!'); + + // 设置结果 + setResult({ + status: 'done', + pptxUrl: data.pptx_url, + pngUrl: data.png_url, + }); + + // Record usage + await recordUsage(user?.id || null, 'paper2poster'); + refreshQuota(); + + // Upload to storage + if (data.pptx_url) { + try { + const fileRes = await fetch(data.pptx_url); + if (fileRes.ok) { + const fileBlob = await fileRes.blob(); + const fileName = data.pptx_url.split('/').pop() || 'poster.pptx'; + await uploadAndSaveFile(fileBlob, fileName, 'paper2poster'); + } + } catch (e) { + console.error('Failed to upload file:', e); + } + } + + setTimeout(() => { + setCurrentStep('complete'); + }, 500); + + } catch (err) { + clearInterval(progressInterval); + setProgress(0); + const message = err instanceof Error ? err.message : '生成失败,请稍后再试'; + setError(message); + setResult({ status: 'pending' }); + setCurrentStep('upload'); + } finally { + setIsUploading(false); + } + }; + + // 重置 + const handleReset = () => { + setCurrentStep('upload'); + setSelectedFile(null); + setLogoFile(null); + setAffLogoFile(null); + setResult({ status: 'pending' }); + setError(null); + setProgress(0); + setProgressStatus(''); + }; + + return ( +
+ setShowBanner(false)} stars={stars} /> + +
+
+ + + {currentStep === 'upload' && ( + + )} + + {currentStep === 'generate' && ( + + )} + + {currentStep === 'complete' && ( + + )} +
+
+ + +
+ ); +}; + +export default Paper2PosterPage; diff --git a/frontend-workflow/src/components/paper2poster/types.ts b/frontend-workflow/src/components/paper2poster/types.ts new file mode 100644 index 00000000..e77aba79 --- /dev/null +++ b/frontend-workflow/src/components/paper2poster/types.ts @@ -0,0 +1,17 @@ +export type Step = 'upload' | 'generate' | 'complete'; + +export interface PosterConfig { + text_model: string; + vision_model: string; + poster_width: number; + poster_height: number; +} + +export interface GenerateResult { + status: 'pending' | 'processing' | 'done'; + pptxUrl?: string; + pngUrl?: string; + progress?: number; +} + +export type UploadMode = 'file'; diff --git a/frontend-workflow/vite.config.ts b/frontend-workflow/vite.config.ts index ea1dce26..c1ab04cb 100644 --- a/frontend-workflow/vite.config.ts +++ b/frontend-workflow/vite.config.ts @@ -4,12 +4,16 @@ import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], server: { - port: 3000, + port: 5179, open: true, allowedHosts: true, proxy: { '/api': { - target: 'http://localhost:8000', + target: 'http://localhost:9000', + changeOrigin: true, + }, + '/outputs': { + target: 'http://localhost:9000', changeOrigin: true, }, }, diff --git a/script/run_paper2poster_cli.py b/script/run_paper2poster_cli.py new file mode 100644 index 00000000..24f183e2 --- /dev/null +++ b/script/run_paper2poster_cli.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python3 +""" +Paper2Poster CLI - Convert papers to aesthetic conference posters + +Usage: + # Basic usage + python script/run_paper2poster_cli.py --input paper.pdf --api-key sk-xxx + + # With custom dimensions and logos + python script/run_paper2poster_cli.py --input paper.pdf --poster-width 54 --poster-height 36 --logo logo.png --aff-logo aff.png +""" + +import argparse +import asyncio +import os +import sys +import time +from pathlib import Path + +# Add project root to path +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from dataflow_agent.state import Paper2PosterState, Paper2PosterRequest +from dataflow_agent.workflow import run_workflow +from dataflow_agent.utils import get_project_root + + +def parse_args(): + """Parse command-line arguments""" + parser = argparse.ArgumentParser( + description="Paper2Poster CLI - Convert papers to aesthetic conference posters", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Basic usage + python script/run_paper2poster_cli.py --input paper.pdf --api-key sk-xxx + + # With custom dimensions + python script/run_paper2poster_cli.py --input paper.pdf --poster-width 54 --poster-height 36 + + # With logos + python script/run_paper2poster_cli.py --input paper.pdf --logo logo.png --aff-logo aff.png + +Environment Variables: + DF_API_URL - Default LLM API URL + DF_API_KEY - Default API key + DF_MODEL - Default text model name +""" + ) + + # Required arguments + parser.add_argument( + "--input", + required=True, + help="Input PDF paper file" + ) + + # Optional arguments + parser.add_argument( + "--api-url", + help="LLM API URL (default: from env DF_API_URL)" + ) + + parser.add_argument( + "--api-key", + help="LLM API key (default: from env DF_API_KEY)" + ) + + parser.add_argument( + "--model", + default="gpt-4o-2024-08-06", + help="Text model name (default: gpt-4o-2024-08-06)" + ) + + parser.add_argument( + "--vision-model", + default="gpt-4o-2024-08-06", + help="Vision model name (default: gpt-4o-2024-08-06)" + ) + + parser.add_argument( + "--poster-width", + type=float, + default=54.0, + help="Poster width in inches (default: 54.0)" + ) + + parser.add_argument( + "--poster-height", + type=float, + default=36.0, + help="Poster height in inches (default: 36.0)" + ) + + parser.add_argument( + "--logo", + default="", + help="Path to conference/journal logo" + ) + + parser.add_argument( + "--aff-logo", + default="", + help="Path to affiliation logo (for color extraction)" + ) + + parser.add_argument( + "--url", + default="", + help="URL for QR code on poster (optional)" + ) + + parser.add_argument( + "--output-dir", + help="Output directory (default: outputs/cli/paper2poster/{timestamp})" + ) + + return parser.parse_args() + + +def validate_input(input_path: str) -> str: + """ + Validate input PDF file and return absolute path + """ + path = Path(input_path) + if not path.exists(): + raise FileNotFoundError(f"Input file not found: {input_path}") + + ext = path.suffix.lower() + if ext != ".pdf": + raise ValueError(f"Expected PDF file, got {ext}") + + return str(path.resolve()) + + +def validate_poster_dimensions(width: float, height: float) -> tuple[float, float]: + """ + Validate poster dimensions and aspect ratio + """ + if width <= 0 or height <= 0: + raise ValueError(f"Poster dimensions must be positive: {width}x{height}") + + ratio = width / height + # Check poster ratio: lower bound 1.4 (ISO A paper size), upper bound 2 (human vision limit) + if ratio > 2.0 or ratio < 1.4: + raise ValueError( + f"Poster aspect ratio {ratio:.2f} is out of range. " + f"Please use a ratio between 1.4 and 2.0 (width/height)" + ) + + return width, height + + +def create_output_dir(args) -> Path: + """Create timestamped output directory""" + if args.output_dir: + output_dir = Path(args.output_dir) + else: + project_root = get_project_root() + timestamp = int(time.time()) + output_dir = project_root / "outputs" / "cli" / "paper2poster" / str(timestamp) + + output_dir.mkdir(parents=True, exist_ok=True) + return output_dir + + +async def run_paper2poster_workflow(args, input_path: str, output_dir: Path): + """Execute Paper2Poster workflow""" + + # Get API configuration + api_url = args.api_url or os.getenv("DF_API_URL", "https://api.openai.com/v1") + api_key = args.api_key or os.getenv("DF_API_KEY", "") + + if not api_key: + raise ValueError("API key is required. Provide via --api-key or DF_API_KEY environment variable.") + + # Build request + req = Paper2PosterRequest( + chat_api_url=api_url, + api_key=api_key, + chat_api_key=api_key, + model=args.model, + vision_model=args.vision_model, + poster_width=args.poster_width, + poster_height=args.poster_height, + logo_path=args.logo, + aff_logo_path=args.aff_logo, + url=args.url, + ) + + # Build state + state = Paper2PosterState( + request=req, + messages=[], + agent_results={}, + result_path=str(output_dir), + paper_file=input_path, + poster_width=args.poster_width, + poster_height=args.poster_height, + logo_path=args.logo, + aff_logo_path=args.aff_logo, + url=args.url, + ) + + print(f"\n{'='*60}") + print(f"Paper2Poster Workflow Starting") + print(f"{'='*60}") + print(f"Input PDF: {input_path}") + print(f"Output Directory: {output_dir}") + print(f"Poster Dimensions: {args.poster_width}x{args.poster_height} inches") + print(f"Aspect Ratio: {args.poster_width/args.poster_height:.2f}") + print(f"Text Model: {args.model}") + print(f"Vision Model: {args.vision_model}") + if args.logo: + print(f"Logo: {args.logo}") + if args.aff_logo: + print(f"Affiliation Logo: {args.aff_logo}") + print(f"{'='*60}\n") + + # Run workflow + print(f"Executing Paper2Poster workflow...") + print(f"This may take several minutes...\n") + + state = await run_workflow("paper2poster", state) + + print(f"\n✓ Paper2Poster workflow completed") + + return state + + +def print_results(final_state: Paper2PosterState, output_dir: Path): + """Print workflow results""" + print(f"\n{'='*60}") + print(f"✓ Paper2Poster Workflow Completed Successfully") + print(f"{'='*60}") + print(f"Output Directory: {output_dir}") + + # Check for PPTX file + pptx_path = getattr(final_state, "output_pptx_path", None) + if pptx_path and os.path.exists(pptx_path): + print(f"PPTX File: {pptx_path}") + + # Check for PNG file + png_path = getattr(final_state, "output_png_path", None) + if png_path and os.path.exists(png_path): + print(f"PNG File: {png_path}") + + # Check for errors + errors = getattr(final_state, "errors", []) + if errors: + print(f"\n⚠ Warnings/Errors:") + for error in errors: + print(f" - {error}") + + print(f"{'='*60}\n") + + +def main(): + """Main entry point""" + try: + # Parse arguments + args = parse_args() + + # Validate input + input_path = validate_input(args.input) + + # Validate poster dimensions + width, height = validate_poster_dimensions(args.poster_width, args.poster_height) + + # Create output directory + output_dir = create_output_dir(args) + + # Run workflow + final_state = asyncio.run(run_paper2poster_workflow(args, input_path, output_dir)) + + # Print results + print_results(final_state, output_dir) + + return 0 + + except FileNotFoundError as e: + print(f"Error: {e}", file=sys.stderr) + return 1 + except ValueError as e: + print(f"Error: {e}", file=sys.stderr) + return 1 + except Exception as e: + print(f"Error: Workflow execution failed: {e}", file=sys.stderr) + import traceback + traceback.print_exc() + return 1 + + +if __name__ == "__main__": + sys.exit(main())