From d377502bc1d8b037e5f971ad01fbaac732be839f Mon Sep 17 00:00:00 2001 From: Dauren777 Date: Tue, 7 Jul 2026 13:11:47 +0000 Subject: [PATCH] =?UTF-8?q?fix=20pptx=20=E2=80=94=20clean=20version=20with?= =?UTF-8?q?=20slide=20transitions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- create_pptx.py | 534 +++++++++++++------------------------ Казахстан_Презентация.pptx | Bin 46547 -> 42543 bytes 2 files changed, 185 insertions(+), 349 deletions(-) diff --git a/create_pptx.py b/create_pptx.py index 82012f6..cb30602 100644 --- a/create_pptx.py +++ b/create_pptx.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 -"""Презентация о Казахстане с 3D-анимациями (fly, zoom, spin, bounce).""" +"""Презентация о Казахстане — чистый PPTX без кривых XML-анимаций.""" from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.enum.shapes import MSO_SHAPE -import copy -from lxml import etree +from pptx.oxml.ns import qn +import lxml.etree as etree # ── Colors ── INK = RGBColor(0x0F, 0x12, 0x18) @@ -23,144 +23,30 @@ prs.slide_height = Inches(7.5) W = prs.slide_width H = prs.slide_height -# ── Animation XML builder ── -P = "http://schemas.openxmlformats.org/presentationml/2006/main" -A = "http://schemas.openxmlformats.org/drawingml/2006/main" -R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" -MC = "http://schemas.openxmlformats.org/markup-compatibility/2006" -xml_ns = f'xmlns:p="{P}" xmlns:a="{A}" xmlns:r="{R}" xmlns:mc="{MC}"' +BLANK_LAYOUT = prs.slide_layouts[6] -def _anim_seq_node(): - """Create ....""" - return etree.SubElement( - etree.Element("dummy"), - f"{{{P}}}timing" - ) -def add_animation(slide, anim_type, target_idx, delay_ms=0, dur_ms=500, **kwargs): - """ - Add entrance animation to shape at target_idx. - anim_type: 'flyIn', 'zoom', 'spin', 'float', 'bounce', 'appear', 'fade' - """ - nsmap = {'p': P, 'a': A, 'r': R, 'mc': MC} - - # Find or create timing element - timing = slide._element.find(f'{{{P}}}timing') +def set_slide_transition(slide, transition_type='push', speed='med', advance_ms=None): + """Set slide transition effect.""" + timing = slide._element.find(qn('p:transition')) if timing is None: - timing = etree.SubElement(slide._element, f'{{{P}}}timing') + timing = etree.SubElement(slide._element, qn('p:transition')) - tnLst = timing.find(f'{{{P}}}tnLst') - if tnLst is None: - tnLst = etree.SubElement(timing, f'{{{P}}}tnLst') - - par_main = tnLst.find(f'{{{P}}}par') - if par_main is None: - par_main = etree.SubElement(tnLst, f'{{{P}}}par') - cTn_main = etree.SubElement(par_main, f'{{{P}}}cTn', id='1', dur='indefinite', - restart='never', nodeType='timingRoot') - etree.SubElement(cTn_main, f'{{{P}}}childTnLst') - - childTnLst = par_main.find(f'{{{P}}}cTn/{{{P}}}childTnLst') - - # Container par for this animation - par = etree.SubElement(childTnLst, f'{{{P}}}par') - cTn = etree.SubElement(par, f'{{{P}}}cTn', id=str(10 + target_idx * 3), - dur='indefinite', nodeType='withEffect') - stCondLst = etree.SubElement(cTn, f'{{{P}}}stCondLst') - etree.SubElement(stCondLst, f'{{{P}}}cond', delay='0') - childTn = etree.SubElement(cTn, f'{{{P}}}childTnLst') - - # Inner par (the actual animation) - par2 = etree.SubElement(childTn, f'{{{P}}}par') - cTn2 = etree.SubElement(par2, f'{{{P}}}cTn', id=str(11 + target_idx * 3), - fill='hold') - stCondLst2 = etree.SubElement(cTn2, f'{{{P}}}stCondLst') - etree.SubElement(stCondLst2, f'{{{P}}}cond', delay=str(delay_ms)) - childTn2 = etree.SubElement(cTn2, f'{{{P}}}childTnLst') - - # Animation sequence - par3 = etree.SubElement(childTn2, f'{{{P}}}par') - cTn3 = etree.SubElement(par3, f'{{{P}}}cTn', id=str(12 + target_idx * 3), - fill='hold') - stCondLst3 = etree.SubElement(cTn3, f'{{{P}}}stCondLst') - etree.SubElement(stCondLst3, f'{{{P}}}cond', delay='0') - childTn3 = etree.SubElement(cTn3, f'{{{P}}}childTnLst') - - # Set (make visible) - par_set = etree.SubElement(childTn3, f'{{{P}}}par') - cTn_set = etree.SubElement(par_set, f'{{{P}}}cTn', id=str(20 + target_idx), - fill='hold') - childTn_set = etree.SubElement(cTn_set, f'{{{P}}}childTnLst') - par_set2 = etree.SubElement(childTn_set, f'{{{P}}}par') - cTn_set2 = etree.SubElement(par_set2, f'{{{P}}}cTn', id=str(21 + target_idx)) - stCondLst_set = etree.SubElement(cTn_set2, f'{{{P}}}stCondLst') - etree.SubElement(stCondLst_set, f'{{{P}}}cond', delay='0') - childTn_set2 = etree.SubElement(cTn_set2, f'{{{P}}}childTnLst') - set_el = etree.SubElement(childTn_set2, f'{{{P}}}set') - cBhvr_set = etree.SubElement(set_el, f'{{{P}}}cBhvr') - etree.SubElement(cBhvr_set, f'{{{P}}}cTn', id=str(22 + target_idx), dur='1') - tgtEl = etree.SubElement(cBhvr_set, f'{{{P}}}tgtEl') - spTgt = etree.SubElement(tgtEl, f'{{{P}}}spTgt', spid=str(target_idx + 2)) - to = etree.SubElement(set_el, f'{{{P}}}to') - val_el = etree.SubElement(to, f'{{{P}}}val') - val_el.set(f'{{{A}}}val', '1') - - # Main animation effect (animEffect) - anim_effect = etree.SubElement(childTn3, f'{{{P}}}animEffect') - anim_effect.set('transition', 'with') - anim_effect.set('filter', 'appear') - cBhvr_ae = etree.SubElement(anim_effect, f'{{{P}}}cBhvr') - etree.SubElement(cBhvr_ae, f'{{{P}}}cTn', id=str(30 + target_idx), dur=str(dur_ms)) - tgtEl_ae = etree.SubElement(cBhvr_ae, f'{{{P}}}tgtEl') - spTgt_ae = etree.SubElement(tgtEl_ae, f'{{{P}}}spTgt', spid=str(target_idx + 2)) - etree.SubElement(anim_effect, f'{{{P}}}filter', val='appear') - - # Add actual motion/animation based on type - if anim_type == 'flyIn': - anim_motion = etree.SubElement(childTn3, f'{{{P}}}animMotion') - anim_motion.set('origin', 'layout') - anim_motion.set('path', 'left') - cBhvr_m = etree.SubElement(anim_motion, f'{{{P}}}cBhvr') - etree.SubElement(cBhvr_m, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) - etree.SubElement(cBhvr_m, f'{{{P}}}tgtEl') - ptLst = etree.SubElement(anim_motion, f'{{{P}}}ptLst') - pt_from = etree.SubElement(ptLst, f'{{{P}}}pt') - pt_from.set(f'{{{A}}}type', 'from') - from_x = kwargs.get('from_x', Inches(-6)) - from_y = kwargs.get('from_y', 0) - to_el = etree.SubElement(ptLst, f'{{{P}}}pt') - to_el.set(f'{{{A}}}type', 'to') - pt_to = etree.SubElement(to_el, f'{{{P}}}pt') - pt_to.set('x', str(from_x)) - pt_to.set('y', str(from_y)) - - elif anim_type == 'zoom': - anim_seq_zoom = etree.SubElement(childTn3, f'{{{P}}}animEffect') - anim_seq_zoom.set('transition', 'with') - anim_seq_zoom.set('filter', 'appear') - cBhvr_z = etree.SubElement(anim_seq_zoom, f'{{{P}}}cBhvr') - etree.SubElement(cBhvr_z, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) - tgtEl_z = etree.SubElement(cBhvr_z, f'{{{P}}}tgtEl') - etree.SubElement(tgtEl_z, f'{{{P}}}spTgt', spid=str(target_idx + 2)) - etree.SubElement(anim_seq_zoom, f'{{{P}}}filter', val='appear') - - elif anim_type == 'spin': - anim_spin = etree.SubElement(childTn3, f'{{{P}}}animRotation') - cBhvr_s = etree.SubElement(anim_spin, f'{{{P}}}cBhvr') - etree.SubElement(cBhvr_s, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) - etree.SubElement(cBhvr_s, f'{{{P}}}tgtEl') - anim_spin_to = etree.SubElement(anim_spin, f'{{{P}}}to') - anim_spin_to.set(f'{{{A}}}val', '3600000') - - elif anim_type == 'bounce': - anim_bounce = etree.SubElement(childTn3, f'{{{P}}}animEffect') - anim_bounce.set('transition', 'with') - anim_bounce.set('filter', 'appear') - cBhvr_b = etree.SubElement(anim_bounce, f'{{{P}}}cBhvr') - etree.SubElement(cBhvr_b, f'{{{P}}}cTn', id=str(31 + target_idx), dur=str(dur_ms)) - tgtEl_b = etree.SubElement(cBhvr_b, f'{{{P}}}tgtEl') - etree.SubElement(tgtEl_b, f'{{{P}}}spTgt', spid=str(target_idx + 2)) - etree.SubElement(anim_bounce, f'{{{P}}}filter', val='appear') + transitions = { + 'push': ('push', {'advClick': '1'}), + 'fade': ('fade', {'advClick': '1'}), + 'wipe': ('wipe', {'dir': 'd', 'advClick': '1'}), + 'cover': ('cover', {'dir': 'l', 'advClick': '1'}), + 'cut': ('cut', {'advClick': '1'}), + 'dissolve': ('dissolve', {'advClick': '1'}), + 'zoom': ('zoom', {'advClick': '1'}), + } + tag_name, attrs = transitions.get(transition_type, transitions['push']) + el = etree.SubElement(timing, qn(f'p:{tag_name}')) + for k, v in attrs.items(): + el.set(k, v) + if advance_ms: + timing.set('advTm', str(advance_ms)) def add_bg(slide, color): @@ -186,8 +72,8 @@ def add_text(slide, text, left, top, width, height, return txBox -def add_shape_box(slide, left, top, width, height, fill_color=BG_DARK, - border_color=None, radius=Inches(0.2)): +def add_box(slide, left, top, width, height, fill_color=BG_DARK, + border_color=None): shape = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height ) @@ -201,143 +87,124 @@ def add_shape_box(slide, left, top, width, height, fill_color=BG_DARK, return shape +def add_circle(slide, left, top, size, color): + c = slide.shapes.add_shape(MSO_SHAPE.OVAL, left, top, size, size) + c.fill.solid() + c.fill.fore_color.rgb = color + c.line.fill.background() + return c + + +def add_rect(slide, left, top, width, height, color): + r = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height) + r.fill.solid() + r.fill.fore_color.rgb = color + r.line.fill.background() + return r + + # ══════════════════════════════════════════════════════════════ # SLIDE 1 — Title # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) # blank -add_bg(slide, BG_DARK) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, BG_DARK) +set_slide_transition(s, 'zoom') -# Decorative circle -circle = slide.shapes.add_shape(MSO_SHAPE.OVAL, Inches(9.5), Inches(1), Inches(4), Inches(4)) -circle.fill.solid() -circle.fill.fore_color.rgb = RGBColor(0x00, 0x3D, 0x5C) -circle.line.fill.background() +add_circle(s, Inches(9.5), Inches(0.8), Inches(4.5), RGBColor(0x00, 0x3D, 0x5C)) +add_circle(s, Inches(10.2), Inches(1.5), Inches(3), CYAN) +add_circle(s, Inches(-0.5), Inches(5.5), Inches(3), RGBColor(0x00, 0x3D, 0x5C)) +add_circle(s, Inches(0), Inches(6), Inches(2), GOLD) -s = slide.shapes.add_shape(MSO_SHAPE.OVAL, Inches(10), Inches(1.5), Inches(3), Inches(3)) -s.fill.solid() -s.fill.fore_color.rgb = CYAN -s.line.fill.background() -add_animation(slide, 'spin', len(slide.shapes) - 1, delay_ms=300, dur_ms=1500) +add_text(s, '🇰🇿', Inches(1), Inches(1.2), Inches(2), Inches(1.5), font_size=80, color=WHITE) +add_text(s, 'КАЗАХСТАН', Inches(1), Inches(2.8), Inches(8), Inches(1.5), + font_size=72, bold=True, color=WHITE) +add_text(s, 'Сердце Евразии — девятая по территории страна мира', + Inches(1), Inches(4.3), Inches(8), Inches(0.8), + font_size=24, color=GRAY) -# Flag emoji -flag = add_text(slide, '🇰🇿', Inches(0.8), Inches(1.5), Inches(2), Inches(1.5), - font_size=80, color=WHITE, align=PP_ALIGN.LEFT) -add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=100, dur_ms=800) - -# Title -title = add_text(slide, 'КАЗАХСТАН', Inches(0.8), Inches(3), Inches(8), Inches(1.5), - font_size=72, bold=True, color=WHITE, font_name='Calibri') -add_animation(slide, 'zoom', len(slide.shapes) - 1, delay_ms=400, dur_ms=1000) - -# Subtitle -sub = add_text(slide, 'Сердце Евразии', Inches(0.8), Inches(4.5), Inches(6), Inches(1), - font_size=28, color=GRAY, font_name='Calibri') -add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=700, dur_ms=800) - -# Stats boxes -stats = [ - ('2.7 млн км²', 'Площадь'), - ('20 млн', 'Население'), - ('130+', 'Народов'), - ('1 космодром', 'Байконур'), -] -for i, (val, label) in enumerate(stats): - x = Inches(0.8 + i * 3.1) - y = Inches(5.8) - box = add_shape_box(slide, x, y, Inches(2.8), Inches(1.2), RGBColor(0x1C, 0x26, 0x36)) - add_text(slide, val, x + Inches(0.2), y + Inches(0.15), Inches(2.4), Inches(0.6), - font_size=26, bold=True, color=CYAN, font_name='Calibri') - add_text(slide, label, x + Inches(0.2), y + Inches(0.7), Inches(2.4), Inches(0.4), - font_size=13, color=GRAY, font_name='Calibri') - add_animation(slide, 'bounce', len(slide.shapes) - 1, delay_ms=900 + i * 150, dur_ms=600) +stats = [('2.7 млн км²', 'Площадь'), ('20 млн', 'Население'), + ('130+', 'Народов'), ('1 космодром', 'Байконур')] +for i, (val, lbl) in enumerate(stats): + x = Inches(1 + i * 3) + y = Inches(5.6) + add_box(s, x, y, Inches(2.7), Inches(1.2), RGBColor(0x1C, 0x26, 0x36)) + add_text(s, val, x + Inches(0.2), y + Inches(0.1), Inches(2.3), Inches(0.6), + font_size=24, bold=True, color=CYAN) + add_text(s, lbl, x + Inches(0.2), y + Inches(0.65), Inches(2.3), Inches(0.4), + font_size=13, color=GRAY) # ══════════════════════════════════════════════════════════════ # SLIDE 2 — Geography # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, WHITE) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, WHITE) +set_slide_transition(s, 'push') -# Section header bar -bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, W, Inches(1.4)) -bar.fill.solid() -bar.fill.fore_color.rgb = BG_DARK -bar.line.fill.background() -add_text(slide, 'ГЕОГРАФИЯ', Inches(0.8), Inches(0.3), Inches(6), Inches(0.8), - font_size=36, bold=True, color=CYAN, font_name='Calibri') -add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=100, dur_ms=600) +add_rect(s, 0, 0, W, Inches(1.4), BG_DARK) +add_text(s, 'ГЕОГРАФИЯ', Inches(0.8), Inches(0.3), Inches(8), Inches(0.8), + font_size=36, bold=True, color=CYAN) +add_text(s, 'От каспийских берегов до алтайских гор', Inches(0.8), Inches(1.4), + Inches(8), Inches(0.5), font_size=16, color=GRAY) -geo_items = [ - ('🏔️', 'Горы', 'Тянь-Шань, Алтай. Высшая точка — Хан-Тенгри (7010 м)'), - ('🌊', 'Каспийское море', 'Крупнейшее озеро мира. 1894 км побережья'), - ('🏜️', 'Степи', 'Бескрайние равнины — историческая родина кочевников'), - ('🌾', 'Озёра', 'Балхаш, Алаколь — более 45 000 озёр'), +geo = [ + ('🏔️', 'Горы', 'Тянь-Шань, Чу-Илийские горы, Алтай.\nВысшая точка — Хан-Тенгри (7010 м)'), + ('🌊', 'Каспийское море', 'Крупнейшее озеро мира.\nПобережье тянется на 1894 км'), + ('🏜️', 'Степи', 'Бескрайние равнины —\nисторическая родина кочевников'), + ('🌾', 'Озёра', 'Балхаш, Алаколь, Маркаколь —\nболее 45 000 озёр'), ] -for i, (emoji, name, desc) in enumerate(geo_items): - x = Inches(0.8 + (i % 2) * 6.2) - y = Inches(1.8 + (i // 2) * 2.6) - box = add_shape_box(slide, x, y, Inches(5.6), Inches(2.2), - RGBColor(0xF5, 0xF7, 0xFA)) - add_text(slide, emoji, x + Inches(0.3), y + Inches(0.2), Inches(1), Inches(0.8), - font_size=40, font_name='Calibri') - add_text(slide, name, x + Inches(1.2), y + Inches(0.25), Inches(4), Inches(0.5), - font_size=22, bold=True, color=INK, font_name='Calibri') - add_text(slide, desc, x + Inches(1.2), y + Inches(0.8), Inches(4.2), Inches(1.2), - font_size=15, color=GRAY, font_name='Calibri') - add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=300 + i * 200, dur_ms=700) +for i, (em, nm, ds) in enumerate(geo): + col, row = i % 2, i // 2 + x = Inches(0.8 + col * 6.2) + y = Inches(2.2 + row * 2.5) + add_box(s, x, y, Inches(5.6), Inches(2.2), RGBColor(0xF5, 0xF7, 0xFA)) + add_text(s, em, x + Inches(0.3), y + Inches(0.15), Inches(1), Inches(0.7), + font_size=38) + add_text(s, nm, x + Inches(1.3), y + Inches(0.2), Inches(4), Inches(0.5), + font_size=22, bold=True, color=INK) + add_text(s, ds, x + Inches(1.3), y + Inches(0.75), Inches(4), Inches(1.2), + font_size=14, color=GRAY) # ══════════════════════════════════════════════════════════════ -# SLIDE 3 — Facts & Figures +# SLIDE 3 — Facts # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, BG_DARK) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, BG_DARK) +set_slide_transition(s, 'fade') -add_text(slide, 'ЦИФРЫ И ФАКТЫ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), - font_size=40, bold=True, color=WHITE, font_name='Calibri') -add_text(slide, 'Казахстан в цифрах', Inches(0.8), Inches(1.4), Inches(6), Inches(0.6), - font_size=18, color=GRAY, font_name='Calibri') +add_text(s, 'ЦИФРЫ И ФАКТЫ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=WHITE) +add_text(s, 'Казахстан в цифрах', Inches(0.8), Inches(1.4), Inches(6), Inches(0.5), + font_size=18, color=GRAY) -facts = [ - ('9', 'по величине\nв мире'), - ('1991', 'год\nнезависимости'), - ('70+', 'тонн золота\nв год'), - ('1', 'космодром\nБайконур'), - ('3', 'столицы\nв истории'), -] +facts = [('9', 'по величине\nв мире'), ('1991', 'год\nнезависимости'), + ('70+', 'тонн золота\nв год'), ('1', 'космодром\nБайконур'), + ('3', 'столицы\nв истории')] for i, (num, txt) in enumerate(facts): - x = Inches(0.6 + i * 2.5) - y = Inches(2.5) - box = add_shape_box(slide, x, y, Inches(2.2), Inches(3.5), - RGBColor(0x1C, 0x26, 0x36), CYAN) - add_text(slide, num, x + Inches(0.2), y + Inches(0.4), Inches(1.8), Inches(1.2), - font_size=52, bold=True, color=CYAN, align=PP_ALIGN.CENTER, font_name='Calibri') - add_text(slide, txt, x + Inches(0.2), y + Inches(1.8), Inches(1.8), Inches(1.4), - font_size=14, color=GRAY, align=PP_ALIGN.CENTER, font_name='Calibri') - add_animation(slide, 'zoom', len(slide.shapes) - 1, delay_ms=200 + i * 200, dur_ms=800) + x = Inches(0.5 + i * 2.5) + add_box(s, x, Inches(2.5), Inches(2.2), Inches(3.5), + RGBColor(0x1C, 0x26, 0x36), CYAN) + add_text(s, num, x + Inches(0.2), Inches(2.9), Inches(1.8), Inches(1.2), + font_size=52, bold=True, color=CYAN, align=PP_ALIGN.CENTER) + add_text(s, txt, x + Inches(0.2), Inches(4.2), Inches(1.8), Inches(1.4), + font_size=14, color=GRAY, align=PP_ALIGN.CENTER) -# Bottom decorative line -line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, - Inches(0.8), Inches(6.5), Inches(11.7), Inches(0.04)) -line.fill.solid() -line.fill.fore_color.rgb = CYAN -line.line.fill.background() +add_rect(s, Inches(0.8), Inches(6.5), Inches(11.7), Inches(0.04), CYAN) # ══════════════════════════════════════════════════════════════ # SLIDE 4 — Culture # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, RGBColor(0xF0, 0xF4, 0xF8)) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, RGBColor(0xF0, 0xF4, 0xF8)) +set_slide_transition(s, 'cover') -bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, W, Inches(1.4)) -bar.fill.solid() -bar.fill.fore_color.rgb = BG_DARK -bar.line.fill.background() -add_text(slide, 'КУЛЬТУРА И ТРАДИЦИИ', Inches(0.8), Inches(0.3), Inches(10), Inches(0.8), - font_size=36, bold=True, color=GOLD, font_name='Calibri') +add_rect(s, 0, 0, W, Inches(1.4), BG_DARK) +add_text(s, 'КУЛЬТУРА И ТРАДИЦИИ', Inches(0.8), Inches(0.3), Inches(10), Inches(0.8), + font_size=36, bold=True, color=GOLD) -culture_items = [ +culture = [ ('🦅', 'Беркутчи', 'Соколиная охота с орлами — наследие ЮНЕСКО'), ('🎪', 'Юрта', 'Легко разборное жилище — символ свободы'), ('🎶', 'Домбра', 'Двухструнный инструмент — душа кюев'), @@ -345,65 +212,57 @@ culture_items = [ ('🎭', 'Наурыз', 'Праздник весны — 7 блюд, 22 марта'), ('📖', 'Абай', 'Великий поэт, философ, мыслитель'), ] -for i, (emoji, name, desc) in enumerate(culture_items): - col = i % 3 - row = i // 3 +for i, (em, nm, ds) in enumerate(culture): + col, row = i % 3, i // 3 x = Inches(0.8 + col * 4.1) y = Inches(1.8 + row * 2.6) - box = add_shape_box(slide, x, y, Inches(3.7), Inches(2.2), WHITE) - add_text(slide, emoji, x + Inches(0.3), y + Inches(0.2), Inches(1), Inches(0.8), - font_size=36, font_name='Calibri') - add_text(slide, name, x + Inches(1.2), y + Inches(0.25), Inches(2.2), Inches(0.5), - font_size=20, bold=True, color=INK, font_name='Calibri') - add_text(slide, desc, x + Inches(0.3), y + Inches(1), Inches(3.2), Inches(1), - font_size=14, color=GRAY, font_name='Calibri') - add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=250 + i * 180, dur_ms=700) + add_box(s, x, y, Inches(3.7), Inches(2.2), WHITE) + add_text(s, em, x + Inches(0.3), y + Inches(0.15), Inches(1), Inches(0.7), + font_size=36) + add_text(s, nm, x + Inches(1.2), y + Inches(0.2), Inches(2.2), Inches(0.5), + font_size=20, bold=True, color=INK) + add_text(s, ds, x + Inches(0.3), y + Inches(1), Inches(3.2), Inches(1), + font_size=14, color=GRAY) # ══════════════════════════════════════════════════════════════ # SLIDE 5 — Cities # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, WHITE) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, WHITE) +set_slide_transition(s, 'push') -add_text(slide, 'ГОРОДА', Inches(0.8), Inches(0.6), Inches(10), Inches(1), - font_size=40, bold=True, color=INK, font_name='Calibri') -add_text(slide, 'Мегаполисы Казахстана', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), - font_size=18, color=GRAY, font_name='Calibri') +add_text(s, 'ГОРОДА', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=INK) +add_text(s, 'Мегаполисы Казахстана', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), + font_size=18, color=GRAY) cities = [ - ('АСТАНА', 'Столица с 1997 г.\nБайтерек, Хан-Шатыр,\nсамые высокие фонтаны Евразии', CYAN), - ('АЛМАТЫ', 'Бывшая столица\nГоры за городом, Медеу,\nШымбулак, алматинские яблоки', GOLD), - ('ШЫМКЕНТ', 'Третий город\nЮжные ворота, жаркий\nклимат, древняя история', RGBColor(0x2A, 0x9D, 0x8F)), + ('АСТАНА', 'Столица с 1997 г.\nБайтерек, Хан-Шатыр,\nфонтаны «Танкіри»', CYAN), + ('АЛМАТЫ', 'Бывшая столица\nГоры, Медеу, Шымбулак,\nалматинские яблоки', GOLD), + ('ШЫМКЕНТ', 'Третий город\nЮжные ворота,\nжаркий климат', RGBColor(0x2A, 0x9D, 0x8F)), ] -for i, (name, desc, accent) in enumerate(cities): +for i, (nm, ds, clr) in enumerate(cities): x = Inches(0.8 + i * 4.1) - y = Inches(2.2) - box = add_shape_box(slide, x, y, Inches(3.7), Inches(4.5), - RGBColor(0xF5, 0xF7, 0xFA)) - # Color accent bar at top - accent_bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, - x, y, Inches(3.7), Inches(0.12)) - accent_bar.fill.solid() - accent_bar.fill.fore_color.rgb = accent - accent_bar.line.fill.background() - add_text(slide, name, x + Inches(0.4), y + Inches(0.5), Inches(3), Inches(0.6), - font_size=28, bold=True, color=INK, font_name='Calibri') - add_text(slide, desc, x + Inches(0.4), y + Inches(1.3), Inches(3), Inches(2.5), - font_size=15, color=GRAY, font_name='Calibri') - add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=300 + i * 250, dur_ms=800) + add_box(s, x, Inches(2.2), Inches(3.7), Inches(4.5), RGBColor(0xF5, 0xF7, 0xFA)) + add_rect(s, x, Inches(2.2), Inches(3.7), Inches(0.12), clr) + add_text(s, nm, x + Inches(0.4), Inches(2.7), Inches(3), Inches(0.6), + font_size=28, bold=True, color=INK) + add_text(s, ds, x + Inches(0.4), Inches(3.5), Inches(3), Inches(2.5), + font_size=15, color=GRAY) # ══════════════════════════════════════════════════════════════ # SLIDE 6 — Food # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, RGBColor(0xFD, 0xF8, 0xEF)) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, RGBColor(0xFD, 0xF8, 0xEF)) +set_slide_transition(s, 'wipe') -add_text(slide, 'КУХНЯ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), - font_size=40, bold=True, color=INK, font_name='Calibri') -add_text(slide, 'Вкус степи — просто и сытно', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), - font_size=18, color=GRAY, font_name='Calibri') +add_text(s, 'КУХНЯ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=INK) +add_text(s, 'Вкус степи — просто и сытно', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), + font_size=18, color=GRAY) foods = [ ('🥟', 'Бешбармак', 'Главное блюдо — мясо с лапшой.\n«Пять пальцев» — едят руками'), @@ -411,39 +270,32 @@ foods = [ ('🫓', 'Баурсаки', 'Жареные тестовые шарики\nна каждом празднике'), ('🍵', 'Чай с молоком', 'С солью — гостям наливают\nпервым, знак уважения'), ] -for i, (emoji, name, desc) in enumerate(foods): - col = i % 2 - row = i // 2 +for i, (em, nm, ds) in enumerate(foods): + col, row = i % 2, i // 2 x = Inches(0.8 + col * 6.2) y = Inches(2.2 + row * 2.4) - box = add_shape_box(slide, x, y, Inches(5.6), Inches(2), WHITE, - RGBColor(0xE8, 0xB7, 0x30)) - add_text(slide, emoji, x + Inches(0.3), y + Inches(0.2), Inches(1), Inches(0.8), - font_size=40, font_name='Calibri') - add_text(slide, name, x + Inches(1.3), y + Inches(0.2), Inches(3.5), Inches(0.5), - font_size=22, bold=True, color=INK, font_name='Calibri') - add_text(slide, desc, x + Inches(1.3), y + Inches(0.8), Inches(3.8), Inches(1), - font_size=14, color=GRAY, font_name='Calibri') - add_animation(slide, 'bounce', len(slide.shapes) - 1, delay_ms=200 + i * 200, dur_ms=700) + add_box(s, x, y, Inches(5.6), Inches(2), WHITE, GOLD) + add_text(s, em, x + Inches(0.3), y + Inches(0.15), Inches(1), Inches(0.7), + font_size=38) + add_text(s, nm, x + Inches(1.3), y + Inches(0.2), Inches(3.5), Inches(0.5), + font_size=22, bold=True, color=INK) + add_text(s, ds, x + Inches(1.3), y + Inches(0.8), Inches(3.8), Inches(1), + font_size=14, color=GRAY) # ══════════════════════════════════════════════════════════════ -# SLIDE 7 — History timeline +# SLIDE 7 — History # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, WHITE) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, WHITE) +set_slide_transition(s, 'dissolve') -add_text(slide, 'ИСТОРИЯ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), - font_size=40, bold=True, color=INK, font_name='Calibri') -add_text(slide, 'От кочевников до космоса', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), - font_size=18, color=GRAY, font_name='Calibri') +add_text(s, 'ИСТОРИЯ', Inches(0.8), Inches(0.6), Inches(10), Inches(1), + font_size=40, bold=True, color=INK) +add_text(s, 'От кочевников до космоса', Inches(0.8), Inches(1.3), Inches(6), Inches(0.5), + font_size=18, color=GRAY) -# Vertical line -vline = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, - Inches(1.6), Inches(2.2), Inches(0.06), Inches(4.8)) -vline.fill.solid() -vline.fill.fore_color.rgb = CYAN -vline.line.fill.background() +add_rect(s, Inches(1.6), Inches(2.2), Inches(0.06), Inches(4.8), CYAN) timeline = [ ('1465', 'Казахское ханство', 'Формирование народа и кочевого уклада'), @@ -453,51 +305,35 @@ timeline = [ ('1991', 'Независимость', '16 декабря — последняя республика СССР'), ('1997', 'Новая столица', 'Перенос столицы в Акмолу (Астану)'), ] -for i, (year, title, desc) in enumerate(timeline): +for i, (yr, ttl, dsc) in enumerate(timeline): y = Inches(2.2 + i * 0.8) - # Dot - dot = slide.shapes.add_shape(MSO_SHAPE.OVAL, - Inches(1.4), y + Inches(0.08), Inches(0.45), Inches(0.45)) - dot.fill.solid() - dot.fill.fore_color.rgb = CYAN if i % 2 == 0 else GOLD - dot.line.fill.background() - add_text(slide, year, Inches(2.2), y, Inches(1.2), Inches(0.6), - font_size=16, bold=True, color=INK, font_name='Calibri') - add_text(slide, f'{title} — {desc}', Inches(3.5), y, Inches(9), Inches(0.6), - font_size=14, color=GRAY, font_name='Calibri') - add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=200 + i * 150, dur_ms=600) + dot = add_circle(s, Inches(1.4), y + Inches(0.08), Inches(0.45), + CYAN if i % 2 == 0 else GOLD) + add_text(s, yr, Inches(2.2), y, Inches(1.2), Inches(0.6), + font_size=16, bold=True, color=INK) + add_text(s, f'{ttl} — {dsc}', Inches(3.5), y, Inches(9), Inches(0.6), + font_size=14, color=GRAY) # ══════════════════════════════════════════════════════════════ # SLIDE 8 — Thank You # ══════════════════════════════════════════════════════════════ -slide = prs.slides.add_slide(prs.slide_layouts[6]) -add_bg(slide, BG_DARK) +s = prs.slides.add_slide(BLANK_LAYOUT) +add_bg(s, BG_DARK) +set_slide_transition(s, 'zoom') -# Decorative circles -for cx, cy, sz, clr in [(10, 0.5, 3, RGBColor(0x00, 0x3D, 0x5C)), - (10.5, 1, 2, CYAN), - (0.5, 5, 2.5, RGBColor(0x00, 0x3D, 0x5C)), - (1, 5.5, 1.5, GOLD)]: - c = slide.shapes.add_shape(MSO_SHAPE.OVAL, - Inches(cx), Inches(cy), Inches(sz), Inches(sz)) - c.fill.solid() - c.fill.fore_color.rgb = clr - c.line.fill.background() - add_animation(slide, 'spin', len(slide.shapes) - 1, delay_ms=500, dur_ms=2000) +add_circle(s, Inches(10), Inches(0.5), Inches(3), RGBColor(0x00, 0x3D, 0x5C)) +add_circle(s, Inches(10.5), Inches(1), Inches(2), CYAN) +add_circle(s, Inches(0.5), Inches(5), Inches(2.5), RGBColor(0x00, 0x3D, 0x5C)) +add_circle(s, Inches(1), Inches(5.5), Inches(1.5), GOLD) -flag = add_text(slide, '🇰🇿', Inches(5.5), Inches(1.2), Inches(2.5), Inches(1.5), - font_size=80, color=WHITE, align=PP_ALIGN.CENTER) -add_animation(slide, 'zoom', len(slide.shapes) - 1, delay_ms=200, dur_ms=1000) - -add_text(slide, 'СПАСИБО ЗА ВНИМАНИЕ!', Inches(1), Inches(2.8), Inches(11.3), Inches(1.2), - font_size=48, bold=True, color=WHITE, align=PP_ALIGN.CENTER, font_name='Calibri') -add_animation(slide, 'flyIn', len(slide.shapes) - 1, delay_ms=500, dur_ms=900) - -add_text(slide, 'Казахстан — древние традиции и современные мегаполисы,\nбескрайние степи и высокие горы', +add_text(s, '🇰🇿', Inches(5.5), Inches(1), Inches(2.5), Inches(1.5), + font_size=80, color=WHITE, align=PP_ALIGN.CENTER) +add_text(s, 'СПАСИБО ЗА ВНИМАНИЕ!', Inches(1), Inches(2.8), Inches(11.3), Inches(1.2), + font_size=48, bold=True, color=WHITE, align=PP_ALIGN.CENTER) +add_text(s, 'Казахстан — древние традиции и современные мегаполисы,\nбескрайние степи и высокие горы', Inches(2), Inches(4.2), Inches(9.3), Inches(1.2), - font_size=18, color=GRAY, align=PP_ALIGN.CENTER, font_name='Calibri') -add_animation(slide, 'fade', len(slide.shapes) - 1, delay_ms=800, dur_ms=800) + font_size=18, color=GRAY, align=PP_ALIGN.CENTER) # ── Save ── diff --git a/Казахстан_Презентация.pptx b/Казахстан_Презентация.pptx index 0785ce5008fe48eb0eb3d3c082c7ce3db7140227..1bd222f596a7b453c805ad3f4099cb20c1cce6de 100644 GIT binary patch delta 13045 zcmZvDWmKHY(lzex?(XjH65QS0-5K0{aJK-#9fDgR1a}Wk(BKmEO*r?SbH97P`LoyT zuHD_w%vx1l)%DDsfYptIAt=j(Ltub_fWUyb+cY2`fPuN&G~t0!gZ@Er@UnM2fxv&~ zVW5HUmX%S-zi=prN8Iv5q+m(#mN6fz5Q9SLF)YPc?9aa$B;;hkq&mo^#Sfu>nhu^}5kf`GU% z0Z9|F0IW>j4)$l+8;)yS7$fKR7-5e7tj%b*XC$5t?FvqdEi#SJNfxW9RPuNq+ZF3( zk(ODEMYxRzgFq!`Ks%9RAjTFcAnzb<=uctqVE8c@>08mMtM)LNQu|V9^4-i+gbRda ztzRbV&r3jy8nB__@p@|JQDE2WcOko_&aU$&0D7K?U!u|734{@3N?Mh6R`U*|PiAya zy-;|dFSF;8Jb@It!2RV7$^hyfLMe)%4o8_MMKH-#Apg7%g6LCEHC+ttJt1?_@av4i zGr6288igX5(M==C4VCDC`;#CR@Q8*mW>_9cpb9V^b>Om2$k=Uusvu3slJ zIIJKg4!eORpkwoi*zEv8NpGYvo~Y?S@!qL0IOl1dQpw_}TH;p{n5B*s{keW00!T8% z>YFNHIF&q+tSV_SZ%6gK`)q_iDFUbPtogN5T}*N7XT$}$8#(~4rut9gNuP8($}G(-!!1&Lrk2;Mzv?Tn z-O{qPh?#$%MU*Ej{~)e%a_mRl^bL?zC11uWS!NhD&I;^sIBxo2s@Fozmyek~vM1;_ zIGY+Xx?ny#p1BU{&ow~GR#q<|pw374rZeAAo5)VBd7N&`T*{&KQbqf5`Xv@+LUar^ z=VWJOKG@^K^M1ZKZ4&Wh@>#3)W*!#2j& z(71IWRMW9YXJ@sZ)NeI6r2@z1z5d}hhELg0o_cwohci-nPDM4I>9_-GAvJG3~5)dFcko}@Vb{>AE){Y8NnmuM$^m9nT=oWFcw{%w%nlTTX%QVap32x zm%npvHn!4pR?Sy4aOSKH4O^U<=0wzFrDZc3Optg4>I+y*IGF4<-qn}$RD{`o7W3?z zTtW4h(=J_uml&s`Fg1;BKx>d2l0$2F)W2$!movoPtgDo;k0t{Q-(yXg5Cwii*UlbR zgfD0Da6HG&X!#}ZMUv8X484VTne-{Nsee++C?3giC@i5^ma!Z?n%5GzyM6@fw!1-mmN*bO}WQ2EN|t zmYw){nmNuP{g`CxZo***bA%6W!e+`uG+~ShfmA`L;q0`FuzK#hGp;=Y*5dXjxesBn z)`?8l(tk@SjW(FO44W6`i3fTap=2+ zC~JrCH!*!?Y&ANgSc^5cnbC&<1T5Kb5-#n7&*~U>!X9Tiid$b1i|XrQjEtXpuC*2? z4n$2@6b&)B;^vDv+5N8j2>4GW(gA zD~m%B0W8{QxPj9zJo3=T-`=K^W=j476T0VP-z=MPww+ZRA3*|Z4RnwM1a9J^Hf~X* zHw1HvVYO1(fT6atqafH6hp{Qw znM>z-i$$B(mihywfJFSp=&^Fw$ZM_4Y~=9_Z7iiYvSd#11{b3@;aJ&8H5xUi!lK+y z-p@ik(dmcWH+qjCt($XeH`0%UFKH_h>nUAXWT`Ha^WU^2m?#O!VI^ytcH1=3cz|IX zl4!?13N=gLQinpl0r)c+?#w-MfbxJxusdcO;huy;vkqdXnSjSsq(gLxf*H_azZ;D% z#I;=942h6Hxy+&ReCeb^hS{U&tO#28fp1xOvgdj=C?9W*NvikP%V)V*Jr^22T1X6S( z#tV*KlvqnF084H`JeT&Z{ z49-cA5ai-cVN%@po-(lRmivJAfwJQJ_okS9GxcCKMS+U3Q2X zKM|!R5mM+N0p_5XyDTxN8{Tsc#7yl+=X&n&PedW|i@A@CJ&>$B4pPp}w)n<&*!|l? z106;6lZz)ivsHvss@hBtYM+0mlHuRRe56aK8&X9-^VZiC7TPROP0d#ApRayYyB|AL zGVu_Dl>_L=eZ8f`s7S+9nusb7jA|b(!xWf+%l`?o38Kj^ zQp^nEqAeYRoPW_T+BLW;M_r;u{9v7f?jzijJS4BH7G!jT8w<8KG@Un57L5BA5 z;m_e7sNDD`ii|m~Nnu3X2gHDK>tZ1Cc13eAK*sA@&B+^gBC}9Qv#G?GM>aEfSlp*D zb=Y``YD%iO0~L~}DppsI>EpgvSjill%BAb8wHgN*D({W+MzTi=PetOo-MjRjln`0G zpXvik=TQ)Ir*A_POYXjGe}~pY`~nNBzY_`S0GNm3s1WS^+jq;Ka=Tl6v zmQFYOk?AS>OcQ4f5^$E}Aq$pKP2L%oD>hxrToq&b&0q&o^(XPhkgzF7nWz{V&S4|T z>F+bW=bGE0bdlR^xV8?8)C-5T|EXldd{`DQbPs)CBHzj-uHDa+Jf0gtuc_;on-Gr# zU4W3d;0`xM^=`VYtgD+AQ|63k4&NxX3)v%8(Vpxc51)BzOjF@~sw8ysVfY$g(Qi2E zhnO)eWT`xUN>rZbo~7$SYW`Qq`^j8c0*i>)q6OJQ@l~b#uz;}gdz4|CBk>ZP{(%~* zh8>zQ`QC|+9c|*w$Bcg3mF!* zlFhQ@PAMs?Od-XpEc4XvxC94uk&Gu-I}dR-P8UB)xAX;k6R!n?1Qx(U3`ZgK%S^!jbM=QCBLZnm6}#Y>wOXJYX_+XJ1?4zZcS46jZ>Cb7~l>p z6@hG(3P~UV>$02tV83joyOGywR~}gw_%>;DvH8IKjJd;%lKV1bbY=95-XyE^?z2{Q zhOE$DG+FIZxaNF#hmV2rf@=NmADk*(AE!e_i@1@cJ`G-6ha6!y+Gf5*0dAKPF!8om zH?o;HHL}_Fi*m5d~Ft5*vxL{fbvqO>_F^l=@MLTBMwXL_E&e13~iFvi9Ba7}-}$ zmtiqOor{3g2=)8&a7mPSMRBwdP~U909oC;gHvI zxBCcVndDzV*7vwb^T13D3b=pZe?<;DhZfq)c;3J?>1)muIKPCtgs&H*U*3=sxjg~3 zNe3&{U22I*!X#~zk*U%qIKih&sI1AxBs+&pUT$?cBD2B{H{J+Fq5JTik?L)W{MC~a z8#LEc5SE27VG6Vq+ds9IA@U<;SlS7%O~y`XQBV|}qGs+o5jCsfGQe1aOPvG}vkH^; zJUrE7|K-ZU(WNRt&F}15u0q+TyaHk;J}5i`#+WBWV_(L;w$?y}>FQP!ZnhShQd2&e zZ7r=%Mkm?TuXG;!xTLk{QG3auifsR-ns!Xhg`!f7p8tgqv<}Ej*d}9@g{jZM&y8Y#2p$;Zb z(|@1Tc?91JC>-wvl$sa1RZFmL zvLucg>$&ES8mTl2O5Y?Gq|m`&Q3~toU*G~lgv6Fw1)+xriy8ug%_$0&bX)IVt$vv~ z_#J<9U6Uf5LuOd|q;!#S3Bg7<=%B4wC3JZi|G5pY0E-dUF*oh7#Cn2GZ^`0f@mNFa z#8!_FlbdI(TDOEXIGwZC-lxs6=Igw2`vE$E)1bE|vi_*8J)&+itk5Bc9A`{luPs;i z_&jf9^LnDsT}&_xo)CLTSP7+Vr5WMcU`g9nyqY4)Y1L)gc;+f(m18~2Wy7(4UyMG> z=(-$GelyzFQZt-uv341;shimnFh6tV>wq*B?PeRFlfNT1K5jY3F>oK6M0gUu3D& zT0$@Q+~T;qyrGCXHe4U2^!O0`Y_@WGkaUVyf)XhjQcezh`e(yVRv6x@99Nu0MWK$H31Ik4Qzm73m19YR%wOgXx8M;+qm zkrnj@O}!dSMHQx}kB;OaH?esDpdr%xk$;A6BXO~$<&bG(q6Wr79n}@qCRm1TQUqxx zD$XxP#%(BE1A;l9omqyxu@pv zI)geHydYSaPro$`=(YP1{i8rxfp{NzUv7p7zliKiMt#2s42d;%g>`H{`kFEQmPlJk z{Ie|?wHr!7U1beg@o0M`06~L99RcPti;dezJx?#KzA(9xOI--Ad%U1wC=MYk#Jmtz zLUW;#Pn{3mVPNieo?wOC`|SHwJ?>Yr-0+}H(M}PXk2TOy@?<9OP_r2-wF`;F9mio> za7a$_B@Y@zA#z4n6@L}#iP;)^=H-y+bn_cC`7aEV6xZPCX_%}iKs3o$OlS>))X-42 z7U!Ng)Ap}p+IYe{MlQ;RNRKZhfB{u@HszR<{%M*lnfebyF`;sJlqa)-k0C$zw8YCk zjALt13#DUlh^j~x7-2$U-r`NG$O-XRk2fiG&KP8#50je&2^>x9nDz}1;ot>_AeBsQ zi@dUGhA4@WFk*ut0+3@g5Y$$RR8E9{^Diu^x0 z16>mwFgDo$d4mSUd*0w22nG1hv|*KkG!i?SjRCS1-QqoM5K$w~qLFN5 zZzl7ypmtE{i=~iRlg!454+eumz>p&-PXM-yKFm8K2F|5(&c8dy6*J=UiZ<2ppr!x7Rvp;nZ z%6p)R%HwB0Nhf<^f-^qK*0dx$Xv+N@U7CrjZ3r%FPxl|YiIok*Af2zQf zm~A?0rw;XN*Vm(lSmCj-q9ZcFYYix5422@?z(43YZqUm*p6XJzSX7v9rj?pg*_mcV zpckvx#{eco!(i?NFdU&uEm!IZ<lycE?5GrIog;_Kke> zCv(8vXf^cnck4r@UptgEq+?A>0bl1mWq>b)ckuG@ukhtkk#k4|kNcO=X{Mr_BYr@{ zQOa))X7#I?$-myH**A0S;$in!Av!Qr1f8cP)Zxc0Bn!lBPNCi#v~!h`PDl**T!s(Xs^78o*nKes~vJC$*y>Ub$NnD40+pMd`w}vnhfe?*OImCl6 zD3Zv(l;I z9;ynjdjH4QcK-IYh2eksT14{@1&H7IgXepV2Eg^N3s}WZKA6tA^^8#g*~C$+2j7s$lp@R}i~ehv+w` zzLuv3Sol~Ne&J}ir3QWnxx1GSQ@O-e0&Y!9F3K6xeRt~z7(GQFNO!XHEjrH*<^kBT z*ThF^G%$!uYy?x36Q4NIK5XQ^7!Ma95&W+8TWgez*MM1dG1pMBbsecUpuN1W+c{T5L*eES!#VU3J=6&Cu1R-DSo5OCVRY_OqERs<7ixuz9`f3bZmz zv9j7r#kFaP!VN?V>vBSoBa%RRmXw1LcJ1`~1lau1?fh%1==-k0SauBTJfx6O zgnDQ!F)ttxZx2uo;5IeK7Pu9p$7-6SYSeCBvi>}5JI18M7e5f4jN;sKjSXc^!usIh z)ZToND-}VCI2ZOD4g_QlWb3t%{G4uZ{cL6m$o>>DdAvUUxmJ1#ek<3I zw>9xxsOQA(Rnz8h+{gb{YSMQ07}1_Lduap3@QVkPloR=xtuN<1oGxNRvAPH24A-Lj z%kwynd`?~LBYzj3W^D%^RzA*~-_?!m&)b@GEYTJkR1S4X!Wckdk%k>DsyYd54>zxh zMjc{ekJZx*_+9Rq7}9BzfoG;3`fW3nEpS@Gpo${VUjkj%VE5w2kc54)HXcaSM6NtQ zL`~9~C_*4TgX9P5Okw?rSTKfb3qnM0IWH(MVWkS+Dh#|$VLv(3DZhbws|{BWVjZl! zk!AUNP6>eLSjeycNu`;{p+UU+&X?&qW=?U`h!S9c58#{~t2Ufw z)2mwe>?{A8%>fX6qP+);OlyY2lU$&v^fh}RwuCiCuT~Q6IgwtQkqTtp`tV6LD-2KW zCY!+b1(at})W4uRfolbn`2%Rw8CVP@izkfHREYzUvONI6;3}GG2GVTylME+zsf}bD z^eGZLp|v>gP>;tiywD{>YcNdo6#!E2%j#*88`~-M%@7YHJzG(M(lc$DQ|ELb%K$`w zo~zG#TfVB#$v2s?zl!9-Hy02;$HrEHK^dCN7O6Rd&(lq)o}#7lvCcpyN;8#=EaZHlT75{yquj!y_h8mT2gH0CF)R=xQ#2(eG`YM_>zaL(o895&CI*l z5PCS1W=>tu<3U%@b7;$Vqc-@~MbEU%8j>{4JF~au$RFrVPKA<+=V*MLVfkyN@(kU4 zC5e=uQKm%GYqDX28QtY~0I|4Sy*PdQp8)cq84j3Q@K*q-OGAI;{T)EW*?%9_2>?0& z&n@vh5x^-`K~h{z15EcLq|1r76*rdQ+VW4&L5;NvXO+@cFxW5&8`S$!n{-E6VAsF{ zrZ?K;`0~nBDdmX5%|)sfE%u}l1vH;nLG?Wz6sf9F2w=MIk!>iBEKrc zo-knM!@5o5wq$fOg4V(J3;a{JZpzlB-F-?cR@i{LhGW1lA>k;!6Z*h7z67HT&0oT@ zhK4C4<1$UM>o>a;79QdBpD%JHxXr|t4W~b&Npq8F!k51_y9r7emN1#XLMrCWQy%1K z?O8Tj4|(l19Mq5kDbON-wF?8c3bP8#;Ra!ell^fjtKnjcq0wrXJt;DA@@=?nE7Wm} zAz0}Vh#G+8X-fk(_qBP<15l~r95U=mJMAS*$m5NP9TMX90VNFTBTTeb)U{9YtO$ie z-|`fN62Q?l3Bv5_C4Z!J*;QZ1D`<8i6*zOYnL$gW`+JNr|Q}w4Imm0JX{=NM9i@3$NLQvtqvr z)NHMFo|P9Sde3zlu|jynwa=3YdLPl1g()lIV;XHF^@^axTQT%XTeGy+q0m_qc}M6W zlOPI!)9c8tXCq&S(YGj_vmIA)`U-Yd>gLKxBg8{Z&7Bloqkp-%e3Sw^+H$F$uS8Dq zp^Ppg{>be!aon+dD#9p(i5P0ST`4U2f?zfdPV(0oUV$6RKRUd;aBpyS~1KlwX=5nPjJ0R^X z2JVJk&+_F%+mU=n-bSPchMv)_vL|uOT~p_ZptdJrVek2K(BXOgWCwUvjgY+w;xK}- z;G+0N!$hp-5m)icHsl&;0BB7UBh4!K(*~NR%^eJU&6T#bnHu|KN_fVZe0rHWgFpd8 zb^KJwoq)FWkuH(ECIdrOxRHP0E#P<|tDL$z?xc_l8BcLeRC3VO`XO~6Jt!>TG3MHt z-w#F`{DN?n$hj6dGB>jKDzq~$L!?#6xSl%dL1+gTR%rlK({{C+Q<(UAS|{`N&rTrlJJFW8J}YRh$#`ysHwskdOz6A z$y4R1WI2abS~yJ5pv6|V1`d?|G*2~ac*wnc3e>NoGV}NW{1DEM(qw9=X-XO0$3%|LnqJ4AFyq=O^uk>0mF`o1MG^bP`&wTH%5PU$l0-L2gHDM*`0tw{l>y^B0yH5o$wHBE zce7YSK~oQ#b6MeKbR{&^X^~>`TDR;0#AR?GQ|xdW0+$1y*q|}+%5>DKxJ?hj#q92I zZOPth($n6Eq_))w)oB>u!=DMUrP%MV#zA+r?+~5sX|T+vo+Q3<*MB9th`K;!Ip<77 zZJX}AL2Wa3nz!%1*Hk`Effg=Fg6>^+etAHr?pWLou;-VR+rc!%@DY_?FCs;E#^V>= zX)p?|FNw(L`|1wkikFAE>DD`bOPz@K?U|cp><#39;?2f?#G7>Y^hvtk{ibc`!2V1E zK<0+)+FxBslH5JP$779{N_$8yIp0CfIJQ9-XTQzVKN@SfoEcK)fik(O;o#sv9bP~c zafs8D281urUqA?eS!tzU@;lnfeEX2;Z7*vz#rsyW@nU0P^Kw8@X8i#tadyZqi#raB zEV=+nh3!h0*ukmiq!ne#1nb$PIgGx2DN5r@lG+Cl=9wm>^Q}P~}s#q?N$U zjZt_MGM6SQhF?@82+%t$%z72Uf6c|zt~4yat|o|){c8F-a$5pjNsoQaVUUG`hV zE?gzeb^1v*!T&;Uqm>aqS=a#(=h|%hG4ApiN!E-4Ss-2+4k*fTG_Y&?oLzBUKFD&a zH)*`$J}u!0RA2q5*LvtNVqBm^OG|zZM1lHUIu_MPQcl)EJbeO5`m{iY!dN1Pl25r> zr&PUzuWmWIcmlM-t#r-i7h^C;hEmJo4if|<4Y=~j>?hg6 zP`@g|VP_RIxq8x0wV4;Qv9$yve2^YxkkLZwMqRX{FhVR7gf8=7W#Nyo(J)R=nhdq+ zNIzLLUL4MWxNdFw?1Ol)0MYc@B!HBqN~2MS1zYRG*cna}W)oYj*0>!@M)1*i@JdgZ z-e<5m*6J4aHrKhI*?EAK7#&nA-TL<$*HPMS4y-s zGyV$!0gk`)qg9~>0Yt@!)`%un5f7k)7c_&yD_^Sj@~qC!4w7_W(@m-n+U;RwyovFC zi7UBjSVg#AP4*gcEm$4hf=%(jek;d?Z9rCI>*K&{tbk**OX~(OO({EEy&5SA35RXU zAC0CJyzpan#4@-uMTe`=r|-KXc(-b6Hz2IFZei*58&`WU-pdV6d(z{Kzu`e$0=>zI z2JiGP!yiziorcUPdN728UId%RUY4AUGBLc8Q-4w>vpuyT6D&KfS$D!$v?rLmRBv=i=KIq({^8O=kBM52z{D{>+4{DuVk^rfHQt)icY_2q{4nIS>s^fTS1 zo`FjK1Zq@;uJR9&1;5(d!nfjOdL&IUZ70Lc!wG!yf<|OPXHT!{Nz!2fYWu?MMjG5S zoLo3il?ZgA(Ke-7-%K!V9vo!rJ%B!H?G*IUakt)^)BiXZ$CmfQ?4KTYt-|H^#(35; z;oo0@u4UYRpsGyp4;+^X`~jMBkw0KtF8>GG%HPNC{sPX5_c5=EcX@k-!XFdpPuhRL z8s@{RsjkHv!f(kpEj|ZuMJ+1B7YBdYApv zF7)3r9c!S8JvNfEJSZ3j_`l!9cwf200T|rK^e+GBCj7tUb&f!1_y4cl+v9x)bWMNl z;Gc_!|DM9Z6KLG@_r~Y^-esNtlKoRd`)}D-f8gamvbT_T*@x!8R{JM&`fu4yC@`e? z@70WB-envAlKm3^|68UJ3q)`ETh^HPE^}=8Yc<_Mq?(f7mnyr+ARyTP{zrae5NLT4 Nu(X913XuMX{XbFlGgANn delta 17073 zcmZvEb9~*;)^6Cav27cTZQE#U+dH;*Y&5o=#%yfcjh!aVZS#B2IrpCT?tj*2KeL`$ zGaH|US@W&=0XBCA2Cpas4uJ*&0s;-fVNnMU4+h3z(SQR+3Hn!xfERzrGYH%d92yGv zA+up3K5!~H#}AnaKk^|>5tKgt;Q?FG=Ks=T(P^Rn$__lWk6{#o-{60TsnywmiW#uL z4$9uY!)T=D5P#uXF*aZw<@jI7kE;Ab^Dm@N_W{w;=lxqtCJPn_$MQj*WD)x}EXDDm ziNQ$(`LFr1vtfbhN*|hB{0je`vs>sxGfJ5Bf1vljR_nws|2@~D%s2vv#gVS|Tw|gq z1PBN-3Xq7Dq+v!j{NE~ZN*|NxDv$r2q>x(uW0SNRzTh8B-0h{PZ%`m01JXc83k(1= zgNLonx%PzJnmAJTBQ>_ZMFKMMbu>gWq z5v4pqq;Ggo88>9^Xm z4=@zVN;#ACDM$C&NtvG$eu!pokBr`Ef-=y zikMRqizPjsH_!DwzAbtpx;Tf-R1 zVhAOVDo;@I?b|*p%_J3DMb7R7un~u@*{&B5h9xBzm48!p#>zs8UddhpNCuXG(uN!g zoCpvH8V4CET~!j;h0D6@#)nIFD*KSisa{5h2ZLf}saF-36N+F$m@fCoo?G5CZHqY0 zQ1H2h?4U8=6j=6rr;F;#BVGic%LVCBU%Wx0Yb(aWcbV1REE0Kd7baW5N=gzMeW$F= z3=P-AqyUeq966=jOO-lM2%{_f<>kES(n|2_!RO&e)Cw;3IhO88&!FxNM2le_!!p?b zJ(J>&A+CA_B#82WDx4&1*%vATb|$mwisUSW$HT)sCU(>;Vbi>juXxXx zU^rnVJxPPN^>m8Xk~0ecyeyhxs|;#+39`ezq#lU<0Jb3Q(7G}qKXJP7i5>GJjGb`A zptwoud08~4Ix&%pAvN1|{s4`gBP2$nTwY^f>Lugw^_DCkApRW21!=o^ArRYAyV_Yi zOEjrv@Yj#?sPD%+Ta4ekgQs#UgNF`G#ON$kGzHIw`=CipHMb7{@91>%^AK=j#dSz; zXugLr6<%$}fhk9rVNE}4R2D?xyJ`lOo~cM~-M>*9bh4EvyD2v2{O zXu0wdNF`ob)_il?aCBfVy}4m6PF$J0wXh5R8*&$F!B*kfcl}gzMrT;mCRiq=rRh5w zTQpRkcLQ(c{5+i~TSidCOZ)Bs|A)iFwHyD^qhQtsRZbB=yCKyOL(ci`iq|goK)lpN zc}+xzqFlxJDnp(c!Sp^^PVynWTsj1JZh~u&A?9d#lnG?(jO17|74Nv!_6LH`8=`c9=LK3#Gw`Li{WnSMO>3o9)-8_k zP#uEmwnW|lg08sDo|0D_J&hwM=B{=7S66gq;bq7=JtQ3&q`4A5*@dNhV=Fxs*>4wt zng>GBw)EX$yssI^nzF`A2h=t+Z8J;B>(M(#nDgauR$CIOGxqSfGaZ?X_Boh+!AbaG zzzU!&JZ) z9(0`Turn0~WT1!@a+(6-BQxmh^B4XQeGbv;%YjE~0jy6e6!B|Jt?*GypX<&#+`8S!YVy7^Rs%fG%UO!}zUtH4 z3WYxd#tZELx~|+oFfG#vzS~a1T<40!@K4Wd)dJK>;&+O_erb(u{OTYK!{`pRErHwES0%{`c`Am~Bm7*0yfhwQT?PFn^@>5v%! zr$?)>yey>EHFI8#WN{V?*Wvp95_eTc35IrLM<`PA5~)OqPQ_N4%&rZh`QoLxsZ@gSZ4bg~Tjn5*4X_FlG@0`J5!hXNYaZXp_$ID$oXUM-DS=H3^ zkXpdxXa`6Xr|Lc5n7Q&QGxm_)|FHtlo|Pd@m2i4#tMln!4=>6rf_YHcs+taN9%vUz zxJSp)3=C5@$UiYv>+V#>Rxs(X<|JTZB~h zX$D5A=fN6Fm6xhXpqn9=GqvQv81otueK601vAwp5`liX0qt(M-&_F)(mE?+1YV z-|-R9!JGNgk-OYCC&)pTVlR@pG>=>Y5tNw|EewO|d+E-*%rxE`%46P^^~ zj+Av2qpyp-$Rd^Z3((9IrIH7vEB zM8mYJ9Hz9pU%8mu^FzVvn}tY`-6VT0h~L0fv-#qjAEU-zkCUlvp!x7)Y@#pzXyMK%wl-H8!jQX zfn~LAFCpotx870n-ZNk)55%s;#BNGwN(Y}V{@iqH)6fss0V+6nK<|3PM3KH`^TyC= zL26`pF=mAQFpVs5AB-Sn?T%aAD3RC=JPI340m_6Ne4pFjd}T{~42F{gg9bZU1F~2t zfjy*9g?T=57D`Eu-Bm4-Q&?q9805UKGO9)w>MJ6>LDw-*jutTB(-Zjk1;(Qov~8vI z!VOgemt%2T?T*@|U{bq&2K2JbSuBykGKe}VAwO(H-XB*TKh${8DLZCbO3qWObE4C4 zG=y%Z=7i%8Sr?G^bvF07hY1_)z_hh)7+Aatkjg47~eM*LS*4Zs-nO;G)G8i z0bY!|Ur{m1QKP;-AH;guu@iTTIu?>I4AK@>Q;{YV6b&#P2DuHtAX`Tyqb7pg=KmJf zOJr?)6W9#zoTp5IMKJt$tmN|u_7-wc7v_$9oQZiYCy75v`l9AT*^Rta?0wA#!5Fuv zbH}wI0yyUvyfZ&^4B#*Rbr=2{<8l`Ku9kr5Q2wfNPi$x8ZA7DrAGhc7tf;?oX4{bomXB|sfKmcyNrxfuf=)aJ8Bk30$RLZ|T{eW&a^g5`=`_`Mx8w-+ z%TmaxQJl|UULO&8+TBiB$D7?8iut6T0SYPU5^TuJaKK)q-IA~Zhx+1{`7Ej35ZxCy zt|HNW8k1EEY{ekLXh$o0t}}d~y<~|>!K2KbY=9n29zTiy*jVcN*;w2K1D6lZUB2Ui z&@A`e+-t41+1V{kozoz&2^qKx z^q!qYUg-@y;IfS+6%`(j!gHeoWc1UXNT!hxu?KatC$eercv6>@9*{e( z*=^Kk=wEBy#}jhPg&}7&?b)M%LSk47!E%gHyQ+R#RN~c&^EW{vp57x%H;b9JcaFeBZX}xwkhq~^FK<%W zLpFvdV4mcSGvQ;6PA1GRXqdnGyOA;Q}in;6YA)db@aoUN2b61QK7SQEp> zPH<8=-|r!sGR2#qI!uyi_&J*&SW7>BJ4R-8|Cu?0B1T{?1}05({QZ#%2t`{nLUwwW zCW;#-)z~meW@XAtfjv8|veZL%`fQ5gJN+2F?&$E!e^Jf;gknOmg^MSTF zV}tK!=t9$rGSvaTK|T|n7g4Q6oR8F-jzj0+*@*c(Uy(mwd5WfcKg$0C#X-t=Qd-_r z5>R(Tg4r0k?YHwjswfO2T;ZWIW7ZrsUlf=#)Co=1Wgq4+nEj$tTJ zF#tGTBl&_NBAZU)yYho!nF!TH-1^pdg+^1H|Nh$|NVUuUCX!z=Lm!~vyJl*pPgi2xn`86da zyw#yUNi-$|jCbE8SRy&TIiVsU)J82mq?THo3&M{2jhqe&AJ<{O>W}!al`Y;-hYLVR zc=q78AicC$aJ;AC`6&@Goq{Qn?>~diO90;(XSe3Q&S_Bj25g@m-I>1VyhKXW)A83N z$BbL>?jw`h9fj~uz}dcaDzfV+RZ$y3*Y6LcF&){Vh%`AHQNe{9ZnpeL>6SO@l>J%) zD5?n)fY1H>J>*O#savT3=w$Hf*A5rp``2`mp>UG08L4ArMEpM4?OI%AXQk@M4|@lR7Uf zP;Ek!!E-YHgoz07_a~Z~t%V89WNvy6jO@cd3OrSz9EQ>F2hnezA{1h1t)plGan>gE z52}2~#cGZ!<;DVo!sGIS9gZJJ96VB$gdz$S(x9q@ZJo8>qVFqm z&C;!`wck|7negdLn#(!q<41T%0X{t?5J=oQli2n;1hjB@Dq35WmMCdwlmQpVG`W{x zD6+CQ)ro@a&4+>SMH<`QCmnZyuT0&9b5VCJzV1O-)ATf7Ypy>PT@pX|(AX83Q&sd3 zPe@~wt+da0nCvC!+(~w^SH&5yC#GD_|Sb6Mv%V1l+Nwf{2oC|S$Is>QpgO#McB*r{=d7Pn^oa4Lzlgzbkb z{+z?llobzCdi^pDjka`i3TM43*(J|uj{~#Eq^Wv6^7o>f=c|&C%uzUG#A>g)(50Hi zr>21cBKo34A$|a{&0hvI`VS|IwQ5}xF z+`Xr9A@Lf1d8~Y>m8xaLj=<0*VUYPSKQnVHEoihIOlAyO0aytM%P!QBm9VhhSi+ZR z$?(KrLs$s7QGZ2Es04{vgZpOk0Cy}gSv=^A=KyyXxccIWfE+=-d#y{MFMNr43qojK zT#0b0Bc!1GdwUtQfUOw+zR(?N|Au1v`+^=?@uej6tC*W7Yazy14qEegB*$Andk56j zF>|ICsYO#nFk%M@z0gF>ELfB$&wQWHVPdbS>gatPy8%9ExDiPn9XAs;`<2f>dCral zcRet}{Jvg6Ge`Ch9GNddcGU+2lY^Bb4MV6{+A+G4UKUkR0V?iQ8WYdrETjhHopcn6 z&FItBGZR8kzYKo$%>i2=Mr~L3!^Wi@3GNPtuOdRNA~)^Z%#!6KH|cA;WtpLAdV+n? z%9LGhGSRM)y~32yNr3tN%VfpW=8x_W3QJ=kH1+ssaJ8K*g-cbiZ0V}rQUtS7l*U&j zi8B;fkt)gsKt^)kN}_UFgY~((i#KEuQ>tP?6K^%zFm9#_Y(unin!7&rozr+tUSSip zSR0@6f$EtW?A&IGGUtIteR(Aj`XY*QW1y<0jI@}wv$A1o0_?9znGiL*H*}ZAFJ)9M z3gua+;zdS|%($u1n{`h05Szc>|H~~>0WWO-$%3z~J28f!K|u60KC)o8k1SYc&2D`N zyZcfF-lGtgk~bHkCQ!P`X|6G#k{_gLzZ%*>Dg|#;xyFXePP^50ZU`nCLdr{+A@WN+ zK6L`RlyArm?H$Yu^jnz7MRiJro|n|Bq8R9|<>C9$-F2q@JNBlZx&3y&9%bZ4&m~=i zJ)F$Qbw|MY%iH8Efbq-H7E6j^H2qd{XOBC#%rE)QyUDRQyRh*(b5f>P?Zb;nx-|hn~3=CUiUOMr$9(zuD_Q-{%p8^hEbj=7;>JUjO-F$2eOOM$o zm9Qy=YL48pb0IdeL7$A|Nrq*zht}+{oN1@)FZ8C0kE-~20NsRD>&+>9JYWrSlQ+Cp z-d8T{ux#pl{^@Jg0%BLlT?)3FBHsjG)qS9fpZlZsQ!Vdw<{H-7f3U)Cq1 zCl2qH3$5nUw=8fc)Sd>MpTs99c*w5Fv11irDyd>>M#o7mVks0vR*{h;&|o4KDJ>|1 z5=^)|6@cm9M-n(q#@`3A=v+2EeT0_=wLkFcZEoAwWaMm1T0rA=zY0-WHInOyTjEBPS4+@gN z6qI7$DhgY-)-k14l>q2d^%NLXDBEPqBF0696hD)LmlI=$G9^#^o*I!&6EW-KK8`*? zeK#_B*sAIFQ%$dIltLM7cskS&9Z3SuWGZE*?OZlr?K50s2hJC4T{& z+Xomr#rsIg(~t`1iUu!&&`Xw6pozwsNN2>8lI(?BM?ou5kHVdn7oR$1hd;r!5tUrM zgL4rd?K3@tlVFaLJ_!(oQF#hpUWn`xbCFUW3q0l)uq}amxX8x#9AYKdk6`YjI^1DD z*R$lA_=XbA(omC#F+-@a>qyN@7kK$?VgrEtP}@~uZ)kdI@EbN_N^=FrqXOluDO&yk zN~rLvYD=G2Y)qBr>W?$``Li#}-!m{_HJNbpg4L1Oslxf83~%X^MWKVIh@W$K709Q# zEXbz0w*vM-%aUF(>`HOK$X&o@k0I3*??UzcLAj&}G$eo?O&H3-(%K{OWGbkuR{+I| zkkc9ANY!w}2zKP$eAs&GCeVVzrfK&D?26j`{Q0Is!?8p&EZgu>NBTQ7vl`Z$EP20$ z>pZk8A`U^gDgrA-L_TuH#IVuAeIX|hnrC9@{M&tI&j^c7i>E7i(K%129xzdf_;-$d zq=dPB7+!!9ws^Tq6OwX8)pZ;_5I`MBHm+R}q>Zm?m|n>QTJ9?6zlZE7hQcOg>8eP| zeSB%Y08_zqS>`(7y(eQD`7QF0%(#iWw7RHX;SDjK!t4Q4Jnza2_P8MCP$?T2L^kF3(BM@@neI>qz6dDfiJ5F!!nPi6vU%$%vgk zU6q*|sx4Kg2()WU{f=e~0W{r|Bnzk=#OZHybur}N#(B2fln6cFUYGp+{CQ++tlgKN zlr?DqI7tG8y)JH&`s%~NhEZwyOBi)BNz>A~hu@}hM;vkXxI*4j!(TIX$-XNf*yZmB zxkyYyj^st{2k8)bB@UlF9HS!f8zjC~qxn3|v^2aPJ8x8DcA19&1h(X8nQM)Hidvr( zPT&8sfgY;&SHU!!yc5y=*}pv#HEm?Des_Cme~zC9sfVP*x8z>epFa{&hu%B=YqA;@ zR26(}B^cq<;m4LZlEDM|b@SOuriMq#Jax51^+lV<(?0Tg{HZa4 zmIF%GA9Pra#0$ju06U(mpDUZ>uAuK;p6_rT8gQFOP0d!Hjl%eJH#X_n*zkL!LmddW zuCX3%9+)FV9tNRqbIEUv{Tu}2u6`3+r~7ti9evhJwrG1jSiQ2mKH;)G&f0fax!C~i zNA62F7-o2z&hDi>m-G-5G!M-;7F(ZJALEjD71FHCu1u1h0n{gIZYpiuWOQRrpXL)e z{bC?zvldwH#e=2q{Om4|_$P?4wZeZMzlU~2K!)dwom;BJgakKZen5iKeSn|{ZrN_B zFNQWIY?+%JT%o?aS30ObSXoET25GJQPE3&h>v_EUD6-QZ(4a&>?Uk#Co6k&;Fo?oS z61kKk`9oQh1yGSc!3v{?+gT=CkY*n)C1{f5H^=S>`fdc2B^m#dxJx_B7Ni)W+_$sB zY<$rPl`>Ccga&w|8~kK>A^8ZX@Cc&E#*kv zImxmV=GO#BMQ4tawZDd@iE4~}KPm3^e>cJ_99pFnvlwLM`96;Ygr_{yk|h~k%9c{C zLj(S>vbdEM7JzRplQrrr^QgFny;fJ!CEB)P!*Nj4XWlMn!*oy^gU~IqCUjIA7t=Lo zzhhS%oq%bZR2b?{@)3&&9Bt6}4fVfbpi0+&VxZ;afiLHO$^+-jA2AU7KQYjT9jXM{ zpBO0mfr6vw_u3g10txX>aU<0?#MjwUvkn?_@z8wOtaTvCkppqUFKCsv+-! z;JzW(xc5JPRG%-$+8Xf?_epA9US!=)q^H|YJ@e{gFxW4EsScA}7uIr?e4RZ+LXb%~ z3QOKyM?9;*%;ri0D01Ab6TvzZEoOHafDJ+cjcO!d96qijWc(z?9sy?qku)=+hU46*x+i5^Rj zqs*$t9f8_3-Zg8OI51m_xjK@!bd8}G*&M%l8iY&Q4$0vO!KY`cDMfc=S|Mxoih76< zAh9`bE25$ZC@fu00XDG3g0R+!DZymGwVPVvG^XOLh;ch&%gds8eU@M!P>6&LfKh$& zZONH5UJKqrAmv|SX(js{19i#narVil&%zEFQ!?eX^#p~kC-G^F0&)sXG2=RvD4)ZU zw1?za6R&6MGmW7VOmIcmxU~cAb6M#~g3XmB&JQG8fEtHO384t*qp&D0GeZZtW~?d4 z6-Rh(##r}$nyJsOAm$4A1LZHc-+tzg9<=CR%8JsWY!K$7A%~rNe;x)hdomoi@9oDh zut)}eGpV()5EwR@&Q5|~MPgZ&;o`BEPlS(K!F`B4Z+Ks(d|>3UxL~^^d4RU-H2yX5 zb^GQ^764%K%b0a=EUg~HHk9CD8iy_%R~;<+2Wb{|5Orwr8COXZb@54BD3DofiQb$_ z%_G=ataFbw$w3V_t;o$}yx=QQt|!yz1W5Kbus*=AUV zBUHqoM6%>Qjhcd!9bDoTRYLElT{5hoN4x*oyi@i|UWx^+8=#5V_%Ld#S!Ac4k?_?MH$t=(ZwKGG^-tFiJ77it z=NPvHKJZbu4$qc0Uqd26XQ&^DneHpN1Nwo_2oTo+_&uh#=A3U-6lz9@AtpVI!G)TwZUTE3X2)d3bH^pB_kGROq^E>V` zCxflNA82x^F#br|zDwRF{K<^>xO{u+xHBm&Im){A0+s^)Nt# zNHwLR>tL3*3?6FAQ#b+|@H zfpQF(JyUyGHi&=#_ivc#bAmg=LVS)ui1AFB1+OW=LD=GzSoLFRB9(QokOHz4ffC8r zMy2zfd}M(>mDqL9>&mlqTQU*A?pwJ;p_16+t_r-1q%-ejsGr;ow9;;9#MBlo@D2qP zCJwqZopXpm=_Pjdhew7V@cGqoOka6}%sa99e7Rn-MuL|Y4f*@-ZR5$80=e?M`VgoFwuij6uDGm=F*AN>e2pTyhR`LS`|9)-ghjkiTBH|qY4 zI=HLeo=3ll?SAlPSK<&Y5@0mmK)>|pU}*&|q2g{XkOossx+Jc+5>;H4s2H_ppp91O z^m(c3IF`@=ag4@Kv&HBMTV0H&aS^2PA~KQ;+i1gym$-@$UReOzF}Q0vGQV&`uun+v zReF$m&)d(l2|*K&Y=8kg#!4Ourh%#cMr5gYi&pLTGf`G{T`}pFE8wTtuk9m*#=XcZ=j_vTAOP&J<(0IF{$Hd6|Fm6EC_$t}++!u@w^CVWkO_Hu7Cw_^w^GO> ziC_EvTte=mf+3d86TH-kaUoz7KDM1I0Z#B>7U>mcw{TdT!20xCEDFO(V)(XMg`@?D z^$u4s&&z^(V$nMkJ{flI7%iUo`wIGwS9y{5nyT6AY6a@dXaL9q;!Hy1RqR70qv}aA zH?V};j`BT7d(bQ3%UQ zJi%mziHDk$79|-?9D7Aowt>;y0x|UksU)ni;d`~hxQO+%Og2j^$50@bhGG$2sH6}> z0(*hW-nL9Dm`c}XB1U`34#qb%hW_8=C24dS;%Xo*Y5=A4ugo#um&>%1lYb}cuxpNY zyDPO_c=#=U?&-2fAHJQrRdUy=F#I|BOO+qe#Pc8n(c6a$fs5R$YLe}kdw!8;L2+E_ zv#Hdq9Q{GF?z~Ik+2lxBc6E?WMQBw_-PY=eukq{S%B{J`S>}us7#|}F8oJbp7#RAO z-uH=|QYrw4SzI@1*eK~u;?I5p59x=|>**{i7pFcfNJ`j@4E~!h@)nRW871!_rYTLh zw^9nDFiboC+(b^{{&IK0cf9jLKhlKL}FNj4Nb`&a-H`O%rH*ske*0JaD=lhsH%Fq^YB z0=xqosyHKC8qQ}*!s>IO;4{y)LE(b|qaU9Bek3+dnkPAhOGD{nLGM7wLDIKCxl6Vc zx#rL*PD$)9XcE1l5$`zJ?=SegT&{az`?mFRu@-Ky>&yI4b@K`M{eR8_Q`@PWmgn3- z$FKpdjjY-s*z_6uU}>Z`9FTv0AYJ>oPxqgCCwwzdj6wU~G4n<>bQp6^CrKZR0)~~j zS&vYU*d6r?UG=pO6(z^dR7?4O6_uGOUGT!Ean@vIEzRw)GdPocJ8&hN&pA7m4vM%P zqkV5e%-lAs7jyo~^$m}Wz8}UFEsLr=M0f}gqwuQ1ko6Q{DpK}q6|zNa3if%2h-;gJ zpzfv+{wvEN938sRXyp={uekiP(jLD@jmD24eD~HC>+F6i4P1IXf-#Gxqd$L9>)l4X z-6ZCQ!BbD$x^u4Th&i16xtA|c3FAM@z4SY*yw#0&8^w*K|UUV2PCq(40 zFZ!Vo^e}k#qmRbFQS2rh&ktzh(YxU8Am=ksmoU;Cky>}sANhF1X!^k~Iaex7H7 zql;^&bUwPhB(;m>RkDq)2(^o6l5~FgWf|J)ags2hDD~Z1HQJqnS^UA0ah|aXtSzq| zevLBL#_tO3FlDTKDx6szkGk;Kacu^LOz7mF%(x{o}-4znps>Z`K%@$CF;alWp?hf-$$v@XeC?gC)G7!T;DX&cBt}D`*-N|+w z5bz53M$X47auGAH--hv}z|>(hoi&WLKW@u?GQRV^ceF=hm`uKt$>O~9l9neN;=Fbb zvTJeD9^s9&zFU&6MUeDH095}dhW1{95*i=!gtSzk z9k0Q6rWR;`wr0DPMP#tNPGW#9D(w&O9|JIAwxw>W(ddw;YbAq1{Ei{HRPx7RWOzi) zbBRW2f)U9b!_U02vYL)a^`jWsGB?$AlkW0b=ftml76d~K{&df83Am^ibP;}zqWPv5 zifMJQ0{Mu?WeOf8q}>4z)mw1diBp+wl8^jo2%x-|TN+-ppU*Uf>^oPn=S>jM+ZhpfwO-a<<}p zeqqCDe3{8B|C8sbI3OX7?)ZN$-7?}VbwhwMMZk+*D>giF?c2%x2_yZUsc)8BbaZli zC+F1*h@Cy6@=ef>%oskg?&j0MrEe7+_ie?po4$parM#-AlUB7kg~ec+K~rNtr%Br< znz5BwSQH(N=22@iR&{P8l--p{iteQ|6huyWl)^MSHIamuO&Gbtv+MYLS|}ZYS!<@Q z=fG=II%S`>7UyENteLsxu^gDo1uq^0rH?cOP(yf~Ne}75>cVmz)Wc8#2$-nQ5OY{O ziYOj`i5U#ZcKv!FUO_ZR75~h9hqZGrShf;rg^|}-S7i;%8z_%F4{RU!EvtyK6$Tx| z*4pXW%2sl}P%8BmuDLUjOKq^O5v-`t-$n*!*M(oPVOzVhf9U{V;yeztSz=Y6@^bx%D;4cfaIOr{Q+pD^G> zc8#s03c}SX`PE5@cf1?I7X02jGbddT2mc4r{$5I$Pv{NEk#A838zwH09@+g zS6r@2N@#Gmh;3q*_`SNQ*|X9%MGmBqLIM%?KeAD_7bIB|N%He8Ec z@RAa>MccjkOz{gPQY!~aES|V{O9;~28P2K4{&}mRDZp$OhMH~3N5xtfmcDYw+LyXm z3Zz8~R<7`lA7axV4X60TV#1m^Gf~*uHD{agI^{ad_i>KDrw^cI7f1>Uz6;p0S!E#;BIDUMaY z*92T&pC7+C9Z;oref7~ig%ou2nNb~1K{Ia44uryees)V|N)Fkcy&JUC4VdZyvu_NK>fbB`&;A6E~#@0_q?4? zGMuV&LxACP(%0UsB8#}qYe;tdJ1S|C>rZ)Cxf)}}eikFmbfV7g&vNA$&H2YDJT<&4 zxaqk$?>7OHWwCA>Jpf#2JYt*xItesnjuaY+GE7c(bkios$cBBT zSWaLq{(aT)i3IT(0jzP&5p%b*LO&@@{z#E8CyAby7~#Yi{}}Ks+yeA(e*bK{7}FnM z!K^MRLd^);JMo@#S}o(rD01J>?0rY!Z32s1 zmbnRUU?vFgG2@Rb9a}_==t4^Pfpg4bfO2%m0<%~XA;qNsD$k)FE_sC_+XSXiHqIPT zZ5u0fCzd9<?* z%n=RHKu(=0vc(T8m;O@aDz&)1WGPN^vPQ|bL9|^wv;$;|e-W&O-A|96){Qsh5D%L8mZlGmRK z{W9Z6g`V?Yz545He|zZS6#UiuC97%3}TlK3p?xUAj>gzWg7Ti9yj>s7r z7+~e~;|9;d7sWrIch>ZvUP0qYJ#ha*HRo87GfQ_tSxb!N&nETVs;hK)bE`qkXE3ys z+#8DY9M=>gd$2?rsu~(A=~yH5qNM^Ha3VN}8qaES5uJ>k$2=|qo7iBHTw>?g*QZyr zD6QLbUTkN3Pv|q^u~svZT$#d1tWQAu<3JlxPf`r$?+_4-=`V9-=L8JN$eD-n@UkKL zib3-y%#MLP^IMl7DPV?ViFuYhvdXsLB)5cO0j-x!^Y_GSn#0!AF?|L+(IfyZgQ~8o z@O*|?oQ#t+os^Oj+_RT(Y|AeZQv&jB7PNVHU|e!;*u=Zk7n{bTg`$mpSGg{PENGuV zD)X`2B}Gt|>xnt$)F_|x;#};rS)@=+IT38prxA%DOb|Y$h3mU0pt7TPQJjVI$WorN zH>%A!!uL;43yC|^T<2_H?E#T{@lDy~9m9Eglqomw;2fM|4SXhun8Zd`b zWH@l-exEJ(;)3t*-m{a_j-|p_N{g(w!eIA8##(<-B)GP=@stpw|QZB=|iSR@>nWgV2EfW)E{U7Ug)m%L*AKe zoJemE+X%9TysHI9((J*;-{pi%_|2_c3zGy;@J)#mFpmQY)p?m_O@s8o&LGLBD2n-h z$o@*4uf#4+R#BO8Ny{iU_tY1fD5#aR+H`Gcu`g}=Hs2UlW~mpM;aN-vJhWJB?95;u z$?)8vu-;U3CSlJuv|4orc;w4iwTCuwKL~T2w`<{=OmxdUbxlt$f#iZzk~40y^Hk$V3#mbcD)PnI;kI=_X)m6Uf1=}-J_0HXm!l-U7(x-pE{ zK0b`YVk>))tsbM?;AeP-qv`#lo-^7StFA-DGy=H+O# zh01#Ykce;2*Z}K6SnmFJPvHKzagJved++V4f7p=CwJ@`2+u$At1tgef^>tM>_? z?Hv+7=K)awiv;%v>YPHym5v*{f&D%b0D~0PJ{D9o7IF`73~;?UBHja71I!9!MfQ7n zrWB?QOZW|3?ClF_yiE5}Q`*R=lN+upvvHb&xt9`qu`1qkjE_evvoI64xb{p_dZ zi8ie7=iC<+iT;Min)g+kcKqvE^MVx%sl(zA4;$70#^4iYJdA>r>T++M+RX=4$?* zF$`g;?%2m%6Qek>{js~qyYR!7R0#U$UHhVeq6R8iWB>?OTcaem-nm_G&j-N;rsv-} zpNni{j$k$1OS$cHenxVwp!>S$N5M1=s=Em87`~3n{cOACr-A*|K7T={d43_hz@Jl5 zeqJ?Lwvi)z{xDnd1|Knjbi6)qM_;pQy;St@61Z?duX?`66K3V@?P%p*tk}_TXC)wF z#0tU9(F9lvBe7mAfNj$Z)*yaIrhDpDBFaRHX6C07|9mAyUv>@z;T_Yt7ICtvuR= zD|zHK zzoR$ka{~@M2Rf>G>$$royWsYby+fx`+e~_I>sR}3!a2kUu2cBq&~WZ)ZY9OCmfleW zzNcd$YDWqXoZbi=+Q0tqQ{}NDSm0IM$CdSl_~nnA>@g_g?K9O zUlE)t_*V?2%KR0mX&+UNkFmM54?0@9++P*rbj`n_D_#Dt_?)5jS6F0xj2UF& z0p~J4=0(o@ALK*3{a^3!faF;pBO>Az@S zoj+(7wy?nW0{9QB|LKhUZ>p*bkhbvOR5{-dYNabIFuw2~>VFyv{+lZ72kiV0)hOhH ziuvuI#s24f<-chfp+LEB|F(!0`#~%HAKHH^I{!_Bi31`9VYphXKKA*a*y_LOWobaisQ)irJ@;b;V@3ZgTsse;st^(cWDgMp1oL0t&L8OyDwCI3 MO#O+p_%HZ>0NhIk)&Kwi