From 8135d21160cc1a22613ebb063ae80edd0250fbd3 Mon Sep 17 00:00:00 2001 From: Irony <892768447@qq.com> Date: Wed, 20 Mar 2019 23:39:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=83=8C=E6=99=AF=E8=BF=9E=E7=BA=BF=E5=8A=A8?= =?UTF-8?q?=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 2 + Demo/CircleLine.py | 262 +++++++++++++++++++++ Demo/Data/背景连线动画.html | 208 ++++++++++++++++ Demo/README.md | 10 +- Demo/ScreenShot/CircleLine.gif | Bin 0 -> 796196 bytes README.md | 1 + 6 files changed, 482 insertions(+), 1 deletion(-) create mode 100644 Demo/CircleLine.py create mode 100644 Demo/Data/背景连线动画.html create mode 100644 Demo/ScreenShot/CircleLine.gif diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 4bfe9d2..b5aaf85 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,5 +1,6 @@ eclipse.preferences.version=1 encoding//Demo/AutoRestart.py=utf-8 +encoding//Demo/CircleLine.py=utf-8 encoding//Demo/EmbedWindow.py=utf-8 encoding//Demo/FacePoints.py=utf-8 encoding//Demo/FollowWindow.py=utf-8 @@ -20,6 +21,7 @@ encoding//QChart/LineChart.py=utf-8 encoding//QFont/AwesomeFont.py=utf-8 encoding//QFont/Lib/FontAwesome.py=utf-8 encoding//QGraphicsDropShadowEffect/ShadowEffect.py=utf-8 +encoding//QGraphicsView/WorldMap.py=utf-8 encoding//QListView/CustomWidgetSortItem.py=utf-8 encoding//QListView/SortItemByRole.py=utf-8 encoding//QMessageBox/CustomColorIcon.py=utf-8 diff --git a/Demo/CircleLine.py b/Demo/CircleLine.py new file mode 100644 index 0000000..76fe4ee --- /dev/null +++ b/Demo/CircleLine.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Created on 2019年3月19日 +@author: Irony +@site: https://pyqt5.com https://github.com/892768447 +@email: 892768447@qq.com +@file: CircleLine +@description: +""" + +from math import floor, pi, cos, sin +from random import random, randint +from time import time + +from PyQt5.QtCore import QTimer, Qt +from PyQt5.QtGui import QColor, QPainter, QPainterPath, QPen +from PyQt5.QtWidgets import QWidget + + +__Author__ = 'Irony' +__Copyright__ = 'Copyright (c) 2019' + +# 最小和最大半径、半径阈值和填充圆的百分比 +radMin = 10 +radMax = 80 +filledCircle = 30 # 填充圆的百分比 +concentricCircle = 60 # 同心圆百分比 +radThreshold = 25 # IFF special, over this radius concentric, otherwise filled +# 最小和最大移动速度 +speedMin = 0.3 +speedMax = 0.6 +# 每个圆和模糊效果的最大透明度 +maxOpacity = 0.6 + +colors = [ + QColor(52, 168, 83), + QColor(117, 95, 147), + QColor(199, 108, 23), + QColor(194, 62, 55), + QColor(0, 172, 212), + QColor(120, 120, 120) +] +circleBorder = 10 +backgroundLine = colors[0] +backgroundColor = QColor(38, 43, 46) +backgroundMlt = 0.85 + +lineBorder = 2.5 + +# 最重要的是:包含它们的整个圆和数组的数目 +maxCircles = 8 +points = [] + +# 实验变量 +circleExp = 1 +circleExpMax = 1.003 +circleExpMin = 0.997 +circleExpSp = 0.00004 +circlePulse = False + +# 生成随机整数 a<=x<=b + + +def randint(a, b): + return floor(random() * (b - a + 1) + a) + +# 生成随机小数 + + +def randRange(a, b): + return random() * (b - a) + a + +# 生成接近a的随机小数 + + +def hyperRange(a, b): + return random() * random() * random() * (b - a) + a + + +class Circle: + + def __init__(self, background, width, height): + self.background = background + self.x = randRange(-width / 2, width / 2) + self.y = randRange(-height / 2, height / 2) + self.radius = hyperRange(radMin, radMax) + self.filled = (False if randint( + 0, 100) > concentricCircle else 'full') if self.radius < radThreshold else ( + False if randint(0, 100) > concentricCircle else 'concentric') + self.color = colors[randint(0, len(colors) - 1)] + self.borderColor = colors[randint(0, len(colors) - 1)] + self.opacity = 0.05 + self.speed = randRange(speedMin, speedMax) # * (radMin / self.radius) + self.speedAngle = random() * 2 * pi + self.speedx = cos(self.speedAngle) * self.speed + self.speedy = sin(self.speedAngle) * self.speed + spacex = abs((self.x - (-1 if self.speedx < 0 else 1) * + (width / 2 + self.radius)) / self.speedx) + spacey = abs((self.y - (-1 if self.speedy < 0 else 1) * + (height / 2 + self.radius)) / self.speedy) + self.ttl = min(spacex, spacey) + + +class CircleLineWindow(QWidget): + + def __init__(self, *args, **kwargs): + super(CircleLineWindow, self).__init__(*args, **kwargs) + geometry = QApplication.instance().desktop().availableGeometry() + self.screenWidth = geometry.width() + self.screenHeight = geometry.height() + self._canDraw = True + self._firstDraw = True + self._timer = QTimer(self, timeout=self.update) + + def init(self): + points.clear() + # 链接的最小距离 + self.linkDist = min(self.screenWidth, self.screenHeight) / 2.4 + # 初始化点 + for _ in range(maxCircles * 3): + points.append(Circle('', self.screenWidth, self.screenHeight)) + self.update() + + def resizeEvent(self, event): + super(CircleLineWindow, self).resizeEvent(event) + self.init() + + def showEvent(self, event): + super(CircleLineWindow, self).showEvent(event) + self._canDraw = True + + def hideEvent(self, event): + super(CircleLineWindow, self).hideEvent(event) + # 窗口最小化要停止绘制, 减少cpu占用 + self._canDraw = False + + def paintEvent(self, event): + super(CircleLineWindow, self).paintEvent(event) + if not self._canDraw: + return + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + painter.setRenderHint(QPainter.SmoothPixmapTransform) + painter.save() + painter.fillRect(self.rect(), backgroundColor) + painter.restore() + self.draw(painter) + + def draw(self, painter): + if circlePulse: + if circleExp < circleExpMin or circleExp > circleExpMax: + circleExpSp *= -1 + circleExp += circleExpSp + + painter.translate(self.screenWidth / 2, self.screenHeight / 2) + + if self._firstDraw: + t = time() + self.renderPoints(painter, points) + if self._firstDraw: + self._firstDraw = False + # 此处有个比例关系用于设置timer的时间,如果初始窗口很小,没有比例会导致动画很快 + t = (time() - t) * 1000 + # 比例最大不能超过1920/800 + t = int(min(2.4, self.screenHeight / self.height()) * t) - 1 + print('start timer(%d msec)' % t) + # 开启定时器 + self._timer.start(t) + + def drawCircle(self, painter, circle): + # circle.radius *= circleExp + if circle.background: + circle.radius *= circleExp + else: + circle.radius /= circleExp + radius = circle.radius + + r = radius * circleExp + # 边框颜色设置透明度 + c = QColor(circle.borderColor) + c.setAlphaF(circle.opacity) + + painter.save() + if circle.filled == 'full': + # 设置背景刷 + painter.setBrush(c) + painter.setPen(Qt.NoPen) + else: + # 设置画笔 + painter.setPen( + QPen(c, max(1, circleBorder * (radMin - circle.radius) / (radMin - radMax)))) + + # 画实心圆或者圆圈 + painter.drawEllipse(circle.x - r, circle.y - r, 2 * r, 2 * r) + painter.restore() + + if circle.filled == 'concentric': + r = radius / 2 + # 画圆圈 + painter.save() + painter.setBrush(Qt.NoBrush) + painter.setPen( + QPen(c, max(1, circleBorder * (radMin - circle.radius) / (radMin - radMax)))) + painter.drawEllipse(circle.x - r, circle.y - r, 2 * r, 2 * r) + painter.restore() + + circle.x += circle.speedx + circle.y += circle.speedy + if (circle.opacity < maxOpacity): + circle.opacity += 0.01 + circle.ttl -= 1 + + def renderPoints(self, painter, circles): + for i, circle in enumerate(circles): + if circle.ttl < -20: + # 重新初始化一个 + circle = Circle('', self.screenWidth, self.screenHeight) + circles[i] = circle + self.drawCircle(painter, circle) + + circles_len = len(circles) + for i in range(circles_len - 1): + for j in range(i + 1, circles_len): + deltax = circles[i].x - circles[j].x + deltay = circles[i].y - circles[j].y + dist = pow(pow(deltax, 2) + pow(deltay, 2), 0.5) + # if the circles are overlapping, no laser connecting them + if dist <= circles[i].radius + circles[j].radius: + continue + # otherwise we connect them only if the dist is < linkDist + if dist < self.linkDist: + xi = (1 if circles[i].x < circles[j].x else - + 1) * abs(circles[i].radius * deltax / dist) + yi = (1 if circles[i].y < circles[j].y else - + 1) * abs(circles[i].radius * deltay / dist) + xj = (-1 if circles[i].x < circles[j].x else 1) * \ + abs(circles[j].radius * deltax / dist) + yj = (-1 if circles[i].y < circles[j].y else 1) * \ + abs(circles[j].radius * deltay / dist) + path = QPainterPath() + path.moveTo(circles[i].x + xi, circles[i].y + yi) + path.lineTo(circles[j].x + xj, circles[j].y + yj) +# samecolor = circles[i].color == circles[j].color + c = QColor(circles[i].borderColor) + c.setAlphaF(min(circles[i].opacity, circles[j].opacity) + * ((self.linkDist - dist) / self.linkDist)) + painter.setPen(QPen(c, ( + lineBorder * backgroundMlt if circles[i].background else lineBorder) * ( + (self.linkDist - dist) / self.linkDist))) + painter.drawPath(path) + + +if __name__ == '__main__': + import sys + from PyQt5.QtWidgets import QApplication + app = QApplication(sys.argv) + w = CircleLineWindow() + w.resize(800, 600) + w.show() + sys.exit(app.exec_()) diff --git a/Demo/Data/背景连线动画.html b/Demo/Data/背景连线动画.html new file mode 100644 index 0000000..e6d25d7 --- /dev/null +++ b/Demo/Data/背景连线动画.html @@ -0,0 +1,208 @@ + + +
+ +lmZJ0(TLZ5XA;c(md#;*Zex)sh~uu+N@UlH{(peX^Bs}yY zd)^lbXGP2OlIJql2@~=3e!-0B1r5%SeMDWeED>BvH;zU3w*xCnOl#YnxDovDSJrDdq}7QOdfHO!-Bo@TD=3>Z6^=| zg#zIb%3o?zO5UQt0!}pd@UAk443sOZcMSuIR$92 3QVNb@#2WE96!)exhP}Z zI%HD>D@i`h3)vDd8T+Ca$<=VGs_E4d-B0Y%P`&O+Sb*}QQ~#DXN}h1Pg64}vDt%V2 zQcIVDLYy(+9->Am!gf3t!XJPvOw{IU;ZURnvr!TkA6Ng0)P=#>XsI!oI9+X7mz!r! z&$~nslG=5Y+WWCYd$*WGySWy1^DKba4f{p9XpKd~MWWumoYt20G;Ypgul~pn28VnG z?cm6xpW(@ O3B79;7tzppJcEiz|}n5j$WuB$8qnbO8g zPPB8^H@-WtWE5SnZS==z!eo(j6$qPG6|eAmSMHFJ^HqW1rcqz3+$oK+OCCB?&j&7d zf!ynftMicLM|QjPrKCdN^0-@R1>y{zFY3kKwDk_GFyVH!UFuV|o{iXfCH0MpPPw}B z4Kvzb$*=v{Iq7`7vU|7Fg1Pnnwku0x2d2^%p*bsd+l}|F(%3Fy9m_GPD`~qjRN7jL zE|s15n7S(bu-M3E&Gk21x^+ZV%m%?CZ#Qj-t%Ke0<{A*xJAPah?Tfo+X~^9ouEb$S zLlTM4csI~=cg|&rvCS}>UqXjhmC$fRM8gv}sE2iFm3xGN9C0^n;$z8C3*6yO>MbAU ztxnl3CE}p%8E_iCOqnggU^~1U%cQ?xKf~A)^Xwh!IjhOSFC!G7O&$S)px |26%jjYyI{bFvz*5r@q?^&{sV0%D5(sCA z_U8I*XL=8T^|!Bji`~O5A)tyt*vJtdMbjMTOmJb`w^UP}l=-pI;(UuP3rn89h1uTg zGDaY}rYA998&*SesLfXqd7u z=o2?%w4(ji@WWb%l3VR1=4r^y&N?=0X}8+AO$0geCUVqKuVR*66gu+O)BC$$n(X#* zL&O{F&kess6)wVCym;6;t_fU5Z9N&Cx3bOeMtlP=z`L=inrrT3Npcn%Y+if6WnD+l zE1h68-}dMA=~Ma0z88{*zOVo{*Wmj*m6~~Hi=0aIwF#%{y(677)0CJW!J4SG%HFa* z9a(m{x^A>PJrKNkVAB>tgJtas@vxHyO*x-9$_)#hMf&C~mswr*Xy%(nJ{^j-f&Ik^ zyk YpU i6U%q}(=jtEHuAGtS&0p_V zZDNLP9 x%7hX` zhQcG&`P$VmU{cz^B@@|Q#9vXy7a>q?SQ<+d#ob;l=o>ir*(}JQkN~prCI5_dj26jq z?z FLL+zy zo;SQ-C8!6>goyRCN#6Qe(S;}VzaO3Wk`pa)gB|8fz@l#$mc{0uhe9BohZ R6P|Y#p1T)e`jei6I^?A&u#X@d2MpAkh-d|e4ECdcmUyLm z_G+a+@-wzQlRu0;-4rbh3e3<7qvj3xv`14d<1hn`tnGx?Zc*0+FWG*Em#IXQxP>PA z1s?W?SmQ*^7KUD+pvxOZp%q1MxZy5T$Y6%F zow!VBzADVo^0MZxbaVqVMA=-$S@nvX$2jpf#k+LVbcR`F91N5nacW5$jb*^d*l zKqRn7lqo`N;PBfG!eZ3+XP%EOo1;e3b|aFFD>-|~)0AL<4PrQtrnW#ZtcfSgjF+{D zm*k7Ll#Mrck2jM|q@Oq3FLe7dAA4+0L$dFr8J1AgnV?4>OPLjg4ME68O0t_zv~EhY z*iW<@fW<4$TV`m*IP(Rl6;VsNB@s6zdF`vh^#r{rsMH?RV9ydV00tC+!@|IksG&b0 zcAfaI;w+NPFF?gA2`Q*(sPhoLJ4h-(b%P5tS39{NEV;-c*%URY%-vNGKjpn_q_S8_ zkzq>1K5FxR(ybd#=N_Pq4~vXCwMRBJqA9tQFH~h96_GE+T?LXxkv7REI&G0g_ckWU zJ_6}&>Pi!MttdIxBHh6+y{t3+SX=vaA3_-xE{uY6?Vc(-kg@AdgMfzihA6Z3Qznun z4uk->c=z_fBK>&)?JYxAtz=dUVTSQ1G{Z0);=xqX;-sgdbc%ZvC|x%9KuU);T0kKT z$Gkr?-kl~1l90Tg%^HrfOqatsn6hb+Z9ITeS(Gygpm87g`I#tpR5DjG9H)O5$Q+aH zjGC)?k(Gjwrdo`uu9HUP%Aq!C7xKCn2F?F}tlec(oNL=H zYC<4s+}$C#1PJZ~f@^|1B)EkTT!Op1yG!HRxLe}{cL?sTy_(GVJoWBXd+%Bw)^F&l zuDZs3j$` CCKwz^dX7l!xbmeSjz~T<_?YJ+|z$}dxDeq;-D{xI` zTUX<377s$y_qm54)VP-4$Ch(=yT4&&`d;U59%9%B$nKE=_GuM0hLoty_}bUHfnC3D z5*7m)DpIoIzal2FudA2clphmT%vhAegqDl%#|wD7j8=OWniXhE1V5J)q97r_%4VYz zVdE~Em;s8SPeTwvRTO+#a70!9Ce^%vJWH8sbsD~=uSQo|wDDTm;uzKT3AyYCE+1}- zE7|w}3H-3}wEc)N3tHF$vZmvRWn-?<4V~eiv}+kdYk2wd$lS2yQ%xy(l4 oWd$!I*pNO4Qr9)wuqsmkX_STd#N2uIB+^>&iCRh}JsE*85e%eLui*8*Z>P z)cYk{?~V(h^C`vlw`??{cpdE4pzcQd15^_wi>JchWINoL$cP=8+GO0>6nD@R!PsoK z-jIjX80OYo^nhEc-Rw2lD235nfrMLS*&t}pT;~R|7OiO-ZvN#17e8FxHjGsvzWSKV;ewd;I7f+Wsbwk>f6 z-P)GnY4`aXj`*8TwQKgYTlhQMu4Hj;+ypjd+n-WfAw=!xi>-b99Y$wu>->!_iy%a~ zjvKdH5B7F3yH*V1R){toE^;#gQzyzu=Y1*`{$r=6cjF|e(buQr!Lkd9xNGvBhDnZr z ~`c?vW2`i>U7A zR_^-Tf+G~y!i7YyW`(7Z*4uZ}%ZbrvWaaiv0L#R^FX3&kU{#-0nv+dhhn>5({Zf}h znUA?nrAt}A8#31SrGD<4elMm0N2ZQ|Fb}7Z?qDm=&@e3Tr2$;-9z3SO5V-+njKPE! z+oZI?)Udwv7R;2#!JX>?1G%AM(;?%qA?ub}<&hyPydeg*p~^>#>NL#SrQkYZ^9HMY z5b<#QL)d 3@}$`HBrAB5y&TM;i^1kGC8##pXf-8(Vk~qtEGiF1L>Uy( zot93R!mgT oY@f=tx20Uvi_?5gs$uH z8$IDSYSnKmT?3nC^zS6I_nfoH%CnB?`V8qKZi1!;*5F^|W0I{yz9@54hmgU*r!nVr zbl29og_*es`HUFAyr6u4!qFsB`h1FfcN(*aH#27B(|i~8{9Cq#ymak?aOSx51-AMH zc<%)uiMEHwP)+z$hR5Q^@DcyAMNs-;TkCWsGkP`2QVi!(&+ 8(*XtO43q5uf#tZO{;&*US=Ej}F(c z+jN)YC-5`Yr*PJ OIckQl50RLKAEDlfL`{y~iS6D o?wr!(Frf*PYuQwOsu>+vo zspr7AA|3biBsYzan=Hq*0HQkT?N<4X%8InCsm~LJwuDBYh9B>qyxJum-kJCR8K<{r zXt%c$wU@F&>O#6x_;x=#V^>aeM;^RgC`6VPv1`G-*T}Lj|LWi~^Fa+MS>W*&k#t}g z@IbutK>g^T{du>Z<$F)YL7xp)o(*b2+u^?5c2^tH80yhP8w7Jo4|T@oXwUm-Q0zFk z{%BbNb5#L#o#l8}bPF+n@4JxkZpJZw)$zvo@v$c<-*LDx>&a)0!|PG>fzg?vwv%&; z%3EL>tnevB>D0pG6rd>Q%Tl}6dxWZwhGRR4WlIiof`*@YwpV$&mUTh`Ij-|Wr#RVP zin93$<4U=DK&wbjhK6xPdZC%{gF^7)_2-Kl&kLSRGge7gYQu8@;Y}f1z=Xwx2-#)B zsS9iWxh?aVWIJi+@sa%dD @fJAGS26v%B>+`0bQo=rtYDBg|P>T*!# zt%d@QuPwlX>?RO$9UJ*Y8Vyeb;z*%>IlORp*?H}(e7j+?DqVR~aB}yq9W$rmqU_|p zLZ77Q7ha8`ZR)QF=ZG84=sQov`?d a=I*77MR!f z?T}kE02TTFF<_G}tRh_Y0@wt8lxyInPq1}<0c<)zb-jIIK>ZiM1~OdP|Bql3O~=9t z6>OI2d}jY2f=x1T{N&=YzOgy2wd QQ9yHdLYSylYB|LsG( zB(}??5#-9$O@V0B_?}&Tw@8`_ OG`NMrFL*fg9d$|^uiN*A;a*24|@6T(|~`P&-=D>RN;UJ~1zzG0RU9$xn8 zZpcctJMYbfR<5Mv-^7- qvee5C_b@}eujwqJg;>IF?~v)H;wib9
ZOYCbpz8YhG7itX{jFy|?QsPYy|jVz?UxFNrN+HSmN@11*?3!z?3= zu-=*CZ(?i1;khwq$VIb7?#6e_ljkjjc)JA+Y^61#N2#SJg6=p8v_sS~8dT#Z{a*rG zOdMj=dH=?Vm|ggtZDaF#$$~hCmp%mEU|?D*x!wGBTEbcKaykp)OCKVvV3XEXE5L8l z#cy(+?gtYkVv=~`i(sQ{Sge`HDL CuK#pNsMLLIInW_=i73 z{&i)i!((fYGb5NtP{1Z<&uXGG=MD !eJjLW2qf;e=ZQ4C9wH2&zOU$o!CMOR0_IQB9Am^6d#&L z*HazYI564~ClmS@B1)NqtL@Yqz5YGSEH4ca1Q7b 89E9k)fSFqt01%C?}Q@S9A3N|T yQhiZe>*1Pa(>uvXmWmg>Ki)ewet3^HYg0yd$2-G59g!oneC-x}yN z;6)v)lfZ`?#ES*P7S}adf~ltF9~Q<_u4^SXtrDt37JfIY+2vbnS?S9zF1(Se^OP;K zb{f{6P^%ZLIf4o{j7&@WG>tv-z#sm>8p|v hj3QAQDp@I$Z z21{G>i(sRkJ_ $2SX{+F?*xiGK}qJ;bO( z1)IvM=S5Cf#@kNxl_+mj+;!+h_orJD*?{*W>!@O*oyox!fs%3?P_~PPh@~n-eIyC{ zD{>E0L{*sO;93TWb05#BU68JvA<4sSf1ZDpo;dOrB~dbyK-)|(BoZpvFn$} cA6=!0?x@($l(GPd+e zYU0Vrj!>fS=q^lc=39BQd%!)vF-vU@9+;4K@!eQhL~Y*tS9?U%u9Hcl92q3w7%|KH zDgWzBHt|+drPP$ccpIf(ir{@UC!gtRsk&0rbaPF}-DK@(9WZxbkMrbywu6hKOp)#I z^V^3xlKLy&@bE*E8m;-JgSwi+Wec;KfEU1qyocWU0Vj2S0rkeS{OHIg^kFIH*^y>6 z?ATE pj(mBy*`Eryy`v@%R@t{5X$Q9EBk%ye}mo8$wec#wcLHu3*o%_19 zACCu_C%|3yal^u `G8 GT_9ro}JMT}L#%WV8tlxU w@uycZRoqP#W^4xFrSEHS+jb &t*Um3~nCuOf~ z6-Y2t!EarrKy8PnpDgJ072O(zd$UV{t;hXOoq>?!=Nn{o4?JPC$Bi2`RQKJSKjCAK z>3=Bhx^3Gow~72kb3E?nB$?Ug8%GY^$Uq$BdpG?Mo%k5Y;}ECt{p_#DpVg43`sKFs zbw$Xm8YE)2qWyV_Pih0oh$&IKF~NDk1!=Aa%EBjk#eVwIROp2YP;b2P!fe!lO?o@b z?Tt?-+hxjsm*`D8pqh8%P1z`q$Kyj&BvbC>!?3GN(dfg{C`-Nj>phR}ajXxAv+wP+ z4^N|SBDSx u Eje&UY z0!;=2y>|7yd4j_70{xtW7B>Tf8iQ!Q28P`R`2d1rG(Ls!1SjCXk8lo7nWGPA49?Kt zioXrc0Wc-=gcJnPq&tU{Bn9R-h5+f_mEVR`(@_=kgx2%C&vp)NHlwL(gbFqvQEo%K zoY|Xr!uo<#)t$qJ@Pmiv!g`XzM)AY5CPODR!rPR?pkb^@e)v*QFvToXu#uX^kJ#cN z*wl#Fb;hqtiZ~q5Ke~;W0)(IPL}FftUphw)+y>q@Mn2m`Jl;lrtcrl)jVj2EgmZ}+ zr-}qLMIj7Ep(0St-9};Znj-Q>;}Sr=)v8LEh>PMOm|`@^OU7XZO+^!^M@u*e{ IV$+;&pQQ_v&5Xr AG(HhQEEmkh?f^dE7lRr49g#YThk!k58_ z2b!5|j+rN788AOyrwwKTsQiyCxNlQqW$pe>NaGDf^o z5+Ya Lr$t2- z-zFENqQ`lZ6hsrIW;2u&IyeANGmG{S1f&rf_)y~!OH;PZ3rYm*hKltj@R~wUK|`g{ zpGpR!b3$s0d%ufUG{?9Mp-+UA`N!LbBMOYVB3JJbAn(&b6IXX?vv7OP#S$DAFP=%Q z{53-0#=Y853V`N5@6v*^Q>NIO54-;!XqInx#wzA#Uy*fR&QVpdriBMHT;T<0Jbzy? z;`#wr7Fv$Ld6NnujL(M0BjP}`)Hss?D9A8v^Re#8pza~EA2Xo9zM`Qgf+b1~c=NlG zJhhVTL-jUmm638)_Bs4W3NqSawX_t{j1L^UHXDZ s zLo{-h`C>$@pDfEH-SBycidgv(6dr2Bw>1g0>TG`Im=G~zxS?qC6X+fwaHb&GG1iL? zq?Vr|3KB6|@}pXp64){}kd-3X%QnOX#nFY =m6vaC<6F2y0EvLd MlBL0f IjORS*v03kiK?e&)LArjTGB@tXHD|QL| zvL(W-WjicfCT&zZVRbu!a?3LtoPh!2g=`1Ly8r+(^#%xiTARFPu^ICbMD+C)Y6tWS zAIv+ZF5JqJ5x7=d`%di64iu)MT(35gLp~q&S4bi-JZas0Y28>I)w!U~XHbf0bSEKl zcbs7l6hhWJg`;ZeR%q$QAIBFtBt{g#VtMRBZ-J9`|48Nq|L(NMpsbsOy!T646BDt( zX)1)mn7B!+r59JF>m705kCs;urB0A?ub^npr?g%hVp06>Fh7U~jF8bCbqJjgv7nWR zeAW(+GC^p78|4o3Q*OY2sqy0@>r*NjzX2S^NM|^)h#m1@lt3SX@}Q1eAE#Y!iWS^B zdADh3PiBiCH`7p#4#r1NAC24Kx99;o%)Be4#;QjlT#?~g;@ LxH8`jR`M4GV8LKKA@L2D3ai?v8bz#(CS)Y%SLgBpRFfFnrkpCbAo6bB7EA zkj7rg<-_X^Z4!?YFHdY9;;9^tUK)Z8EGLkyxzXf@>E!xWbij`k;JT;@!lMb8)(H+l zc%knT%rui70*nYAlYJjX=t%}?iANdSdoJ!p82Kxkk+EggCSE@cK?LBxkdL#ba~!(Q z=#@^%BTZKeOh+HWz%x!n%7R}-Ph&7lAx0x}me1^1!mB)u(LCWC2+Xp8XPQCddh!C4 z$iH)~u)aM3%t#PE%1&w*|3-?2w`Oh(wI0_bLHYcuEzaP#TRHFi;p~q?Ebk+Up|#&b zmb3gJbJ!De<&3k}pJyl1y5e-POLgayu!fRI`b4YdUBYMm(dX+K7MQITBo85DGT&=z zNv5`{YJ86tdS5SAJ@wqXPTM|BSs^bpTMxGgPPEBajUq31=`OiI!`!EZ!Swmnu#qL^ zxy`41Xfa~O197T+el~p}F0JY`e0iCK%j0QzNWN+WrMg3TrO9pu*Ki70)}n?o7g=t) zu{3!h&r4yos=)MH)36`#{5uL}v?hH;#&R7ae1UUqUb$Wcfkosac#ThI`X_kl@o9cw zZS^K>9ZzTtQoc?MH1#)VAhY41Z0lw$pa0;uC`r7)(6;exwb(Me@fmqj_s=@#iZH6j zroG+Txjd8l( $Fu2BJtP-}VhJFdHR+z8?~ Kt@m3L@IVm<3gb&z~&Y44|29@5teh-VU@I5lH$* zBCB*SV`Ji2|3v7cF6n@N27XaSuL2Mbka=p%I3KV=`v5$?ZG)6Od4^{{pCGoaeLsYG zmqBoJ+~g}(S5$sV`D^rQ<@BIq>>z?XRPP+#{A}D|BX<1El<06w;G7e(Pg8M@v6`nc zdVWZ8z*3?1>Uk(b;ezYeh0re)@aV2- ~3!6S*^7m)eqpJ1i_T5LeW;Ua -Y;mVgu5#ML=Q5vw`O7<@ z&+|4<)u(r*@SjF)pV@K#>_MJx+Sa$%o@e!+&(Q$?zbCfAD*D;NY_x&GS=sp+P;xxl zuu>41UTIiT10}~3l?B3DLI0oRcyD3$a?wie!bW7B{H%Q4=6;hNefz=xPLAI;X6N|4 zBkr)@D~sp9MVq4xME(ysjt}{JV@oCAOWHtP#>Jk;6BMG9^4A>y_r}&lB()s(^M}uv zv>)Pwy#6EDyxiDwBt{p+m0bEI7&EBod_*yB{U0~BGgH+CWqe;k6B2XFt^Y%g53X%c z!~Fn`nkmg4d+Z)8ue}I1dLtTTdOg+q3>ayLwwvOS@WyTb3O1#SEjL!W!{G5=O!**= ze@|?+V-G+DdkT6_$PT-Ub$?H6Z;jSs?3S){li7D1`~IHT-fL_P9-VKshNUvk&z1jk zV(Yp7)I4=8fNwv(H}*n~w>^D5+x#O0Sr(dgyFFN@UHhBZ(%#k0;QgvxqQrEnq;_6| z3N~ihc9=PJYdRoKvoIC(wuE*6zvehyS1p+@De7yZ(5mpHjel-zFUkfeaZvAXR&ApP zf;OZ6-q^-iHGV|_P3K792uk38GnD%G#5O3VnRjrTX2qXwJ5KBGiEU01m7A~;tW2s% zO!A+!pU@LqXUl2?(-?(?bK|rhEA+crez^PdnLqr$#3#x%&(lWwkh{{wM*_@uUjUn8 zxflx`sU)|8D>MCQZ#;wiLK`SxQ&!LSB_o({a=mECx|p!MAc-$HA9xKV#{ ;z{oUh z7V4Q8#*>!I0PGX>o``K0{aAP!RVU&9u;p}M_ zzG>N+*=osK{H)iuOy>jdKK!&(f8gRg(}L;JJ|AZ7mm3?@5e#GRWOBkK1+(8AUW|E% zm|UpRV}1FlGv0*!LXI;dk13IaPovIB>HZ#7cp=AcH09%FyS&1I)Jpc&P;xwx^YXJL zMEuM^nlb$vN{%nH*AtWNBrLn%966ag@1$$Y|9T _h%7 zTjGaLw_8wi+(j&6RZj7bwDt2H)Ew8lQ}`N*+R$0@VvgfPx5XSKeF;z8tGzh}d9^Uk za49tI)IFRG&_ -87gRmC&TZOOLV z!v^6et8V*+-MdnLIl*@aASgM$aA0vK+H5&|!w@a}OmOP8w@ErMWXhg5FX0V _b~h6|e5Mh9BeCK7kqij~ z1pb01w&2%&q1e?HkyZw@=uHDMTA%rR#j`QH0r7(8XE9mG#!h}%(k|07v9i$^)Sm{2 zc!59Y!ijT3j?J(sTC3w5FE^Oe8~Zd7ZG)6X@>v5lB|Z;TB-YhZvq8ym#jew&fp1Cd zsZes9%P6tMJs98E8QV(hBGvQK1h$SqO7tE*X$=b4_}nAp>8=oAX% ;s;aH+MO% jx;bNn6W{m0mp?O+C|IZmB2&K+}+{{d=_f7q9LxQoG|T`pD%)EY^N zsiN*eWKf2h<5`AP4ot-fpHpR2f5^udR{P *!huxRWF3XNsHX*r!Sw&m^CbIjvxy9L|2+6RuGg>XR=+f&-1 zJq@I1Xkz<&!A;vO7Jihw6Wwva$9A#RB%8Ji-)6y&-fHMMV7i;k&N@J{r4q%qzN@16 z QuD z6D}}N- DbuhzYK=SrzZ!Z?-@p%~H%YxCChbQ~xNg*_Db#Gn z3=MaqtL`5Z2IV#%j_=Gp`)Z&bAc3jnh|7o~ke&D~c-Qcwrjg09UG!^tE*b9oN!{s- z5dW6#ngnZb66)0$$J6XSF&}k^UTu+jxzuOVu9@d@yApjc)M;NBk4~`9WY*oYp1Ys* z@N-BR!_vLFC!8A)Dsu26VZRqxn3IsLuayUzlRF*}Iyk}?6@ri6e%YDtZ>ul7TRi&l z)^yQY0NAK0X=4xKmlz88>8+4%ZQcH`Lh|649c#Bg@v-~oZeK%(F^R3&nD$DI+EoYM z^STew*vAJ?p6>(-c1LP%ap)(tY_NJ~5n>6mPMc1^ohjSMRDtMT7F++h;j>uKV<@Hi z6cCFvE^#q!{749+QPuMTl3^b`Pql^@?)Yq)N%XYCJL}T3h;*LI-|8XK4-6kzI4{&D z(NcczVk)C~RqEENu1Wj(-2wQbB300u{{7W->gZ_r)Z^jzSt_b-t_uW=^xycApp`4$ z8(p)f5epN3+ZzSvh5gh$)snB*&3ewQAA~^0cn<@C;bHyU&xZ*&juTk=H?%SDFA{I~ zb~!7q8S~T6rO{gV)7{U&sVggB{HOg$mWMZ>=c@*%heM~ad*dC_n-*%f?=Fh&%vf&c z3~5-$zttZ$_*Xmfg|YU|XCHU8+t()&J$Ez(0PARw`?W-MJxIhL2&<1^2Ce-*GVzHc zx&047zy0wS_3x?IkYA^mneETI#t aL(#BId%>kobYj;@N-_0{;vL% zoJa#+s2bkNH9sRnJUwQud;)*r-g^Jsv1&E(Qn+#?clMF`^PReg9v|?F?$*cooez2v z{R5>JtFv#tlRL4Lk9DB0kd*7Y244YZd74{ai6j(kfG*=4Lwby#B)+Rcl8-h!^BAtb zqK2~?9olmj%STCn(Fr6?XMZ=mfc-4y!3`clXY%C@xF1n(e~7&KKJeC-F5qX9uX8m^ zq!H{%zfa%B8=Ezz*0sPh^*}!}C+9|{i^ zG(!-0CWQzna?+Z!o7mu za0jO)eT^Sr-aLl{+ERqL%mx>jk!CisxZ!)}%>l}jeih<}&P0be2f6!GzEuqf&8G`( z!B>M4 p|VH$kn=Va{hzf}FV-fB*)B4&aAZ83qg`1!_pX`PnBBO&7i-g*?+3 zb{QBBJ^m}64VP#PS2+vM0(f0~VSFLSgS;>x6LAif+8%lBMyofkMJX5?jq}N ze|6I#^gt BA3Qe z_KFsz2<)TtBMkN>ZbBvv4uX3VO(h-slHYpA1g^dLQ4~ut7qg?`$rjAStx5Yf7!W!a zU<-hJ7jf}>UyLj!9miNq9h!uhG8ZHx&7(LUx5^nmh#w!e5wA%Z#4jB|n;dU6@1eIA z=y)3NZ7`m$F@B)Z-@qJo!zbP*I6<^CLFmpxU@yR{IL@0s@jI`kp9``BJ&lSKp=nbb z$u7L_phw(flB#A>0zGc<9f_b=GJ;Pc@G3FTC7D?|9HogPP1;;wKGAJ2z??n>XpZ5a z85cZ|I4}{w-}gZ69b*o1jSOnp=YG6W!xb+We-NJ4X9Za$JBJhmTP8BIcBwHGdte#f{U%; z5VLcfY;X4vuZy#Z?rk>b5m6CyOlY%1r-O##vuR}9&=!oM=#v{ea+vq+=}M%iOOU9v za=Gqv-u=!-DM=Bq_`#hbMMjt>=IZ$0R;brYE7Sr8`EA v=aH3 z;0r`0Be`9ptxo=FC3^HvD&buTMR|3841AjdR)bq?{kN4kcv&cA#%YG0NnuEB7NY_8 zpH?FENOGY*Ri|!ZkT>2xt;B)!4**tJN~-ah%2f)0h}pj{rew_kDckm9Ix5O qz zR0^>3^!a%S7W>6IReJ?g$#3lT_;Mre*J2_jL-xxX|CBH)iNiEoyet2W#h4g}yto7$ zpecp666@%_sYgq`TB+0@YcSW$nUo&YZ&W5r7r^Izu%?z7a$#=REhs&1204Qevc_UQ zc;mADWP>->PM9?=+^&8xKi}%e)TVVT%EMn4%on6w?`uniCa_unJD{z^Ge~dP B;eNtErtXr8E}k- sQb*OmkoD pN7$={~7s`A`|mvrOEQf zbTfBEP M@zu9}v+EOd)9vx5B5owl;N#iA8Gp47_!mGf3s&8z_O=R!B)gbU7qzkD zWu*zue2rcYFJdrCLgw#E(=HlHijOY|9P}S5mkzV})Sp%SEewByuLGdZC9O#I%4h(( z(iDY%x|oH!KSBQVNzPyRWu>Vo^oUo9U4eJLjc%alWu@uWr50V Nis0`AL7 zlZkTBy+JpLgipnGQe=q9%Sw}35I9}w&7DRU2BK1m->!{Q3({!7t`u~o3G>VAB_qli zQE$PRQIhe{JQ-Bzjmsp4|49gmP{i86$F;W**K@O6YUoN6BTF@wL8&Aay%Kb#DJG64 zEV-0xeo%ekJi)%_U9CcJgz5|WNu1mFP1;X@h2jPM#54^;(2ePSRi^@7Y2xkD;IdDs z&4b>!xQIIG=9u&m!@k_OJhNe8rpV;J9)jMum{h2@=!lnw5I}EGE;2g4s6L^;swOeZ z&bWn|pUkGkg(x|yy*0UlJmy|6=BMq$R2Gfv5XVssaho4>r75M(rFt#xZSN)@{?G(; zrRfL4*KZt((3K_&`RpC?Vp&s}FWH)x#02Hg8y5? 6Q!_A5$Ua~EWu=L8 z#175@y3%9;v_VwKlX+QbijPw)O@Xd7aemgm3Ls5AovBWVmy $ LI`z9L z;oYva?8tXILKi}|7hoF>>yB~9iM;O@X5VUS*t#=PE^7oiwg1jP@pyaqx*9gAUF-6_ zJ6f2|D=g=ZHzwa9ZypvA%|gC(EjgU}QiQD|=uhJy9aq}yfYvd0)O%pFD;YdPjdm>> zdv0cILm#q@RQ#O#s{Pr*W}yA2-;LNz$7gon(oIaH`Tljc-d~Xdi+FfVZE^)?mW)eF zbg91w73 2NQZewx4*xq z9}P1do@^S`2GnLzE$!HS*TlkQ;jo@*F?=cz8TW0g$vJa1lRI^p4C#H9i;xDO65yNk z>#Jp7TH0m^y{{5&?#|2}VUT*=Ia(+rk Ih&z)iU!#SY`KGQskj>H{ z)pd^f=<7QQh>`g7Rvz-@+|MH68w*3KRJ?ikPvsRT6M @j+6t3z&+6)4Pt0(T1zlWpPy0Lb}nW3miM2XT2!-5 K3+Z=G3DWX<(nm{qc{YQm6kWsnUUa)TV+z z|0+gP0Hj$qEt8|+VQo=UL@sKKSX1(514Yzd7+K^j_Pf^{t^TOXrfs&*2_N{zGkC(@ zGi?meL7zwYDL&wNqhJ+o`O4GPS_lrOVMlUH-{aP>KLe}g#N$YJ@LnZPh MD1eh)6?ElqyPXnCiv8zAh;=3-c;jo&R7C^( zGTW+qOzE$Pb^T8(T A?K(d zT25g;(IOf*{0zX;!~l4q(Rt^^VIiA(SxaIO(76#0c<<0^$fEn8&;6w2k?HS8JPh
axlrh>JSdSjyji$d|!rqFG$&|%gT@I}gBb=OA} z-&f0wm}1S}hb~CC4wthL5ta6h-E9EJc#yRjnJIoSI%}}yZctcb5OvU(Gs#!3QvN8n zz8-*Y*|&l9Y(WLL{;Owx1>^y5b6k_0gQKLNt4^Vj&cP4S!QJToE_1 soq`Y7~qMHhLY5k9No14@cqXi$gHA>tuKrL#r7)(q0`4C&1Yacaas8jPCWjlxQf zT;YLfn?oQdj!wY{A~uh(KJ%Dz@-b76!5;Kw +papF7PCf3%+*#+aUODFcv;by2KV){bxbfo3Pt0CTtaLn1Zd16wL23%?t %_-*E4-zgl@4PxD^V&lxC z8#R-i>r#iMzk NCc?->$pzWQ#A0IJ ztNWNEj5K7YC}+PS#8>bZ5;>PZUrRnf$myKRPVUc~nayI_M?9WS_gaTodlm|>zj6Lh zf{eDG&B}*?v5;Fuo@0=NKU8n!E1oxZ>Xwg}Cl`VTnNN$bvz@?@nZwWTW_8O)K$uU= zV6V#2vOs{@j}Fa_`#O}(ikPD7iX)a%&|#FD>|OAEKbOSW$?&G&OFk=nuNJmUq9Xyp zPpv}7l&o)oKb@MHEj}vyRtsca6^auS`7F5l5vq#}gccPu>kJfOt41Zl7p1Wk#fLZ` zCH>^<$2VelpVnM*_D%DPMSMC%Np1 pe>7P)Vsp0Z=A3lcKc7;!`7GSxT*zL{LZ( zTUvVvTk(Q;7hze)r}xF{rGpHtbqh9N!m`Ua?Qz#KO}=tz71&t@NLhxK)}kxnz u)g7iTk6 zzLx#?HnjZO0*Jg=i6m}jeqPx~SoKP_N)`JpergpVQ7P7N74BsfxvVyXq3Rt-oMyO$ zg0Y$rB*#2l+?-#TVwl5*B=$kJ<~@jjC$)y >%0xQb&6U *$poaJFYVkvLj2Ihy_#0_TA*BezjjAOL!KosC!@!6| zEeZbOXe2QYBH%AK9cTW+sMMwyBA{a_(Cw;8o3UAdqbc1&x5$m)cTsccaN&h7>+%(l zl@ZkJMicK=kPQNLl#&L@)^%#P!2M{7d<9Ex&@zHVUID5fUTm2hCLKd+opNj4^KOX@ zZCx5B=}v84CTg2IYh7b(`=d>~u!wKv)^;cxws!zJB5H3`Ze3(-zdmSda%;aYC2W*! zd3b0qoB>H8cEBAHY=t(#r*-_$Y<^wVfhrJxve 1S)ek$9EKav)d+DTj{2>Xa9 zwb)6ShWl2hoyxt-8l#gtq>HHq7q<+bVyTOrSeM}tg2yJ%&Et;!o~e^}satKLefyyM zV;DAdS(})9k2rE=WoVC_95&|?-p)eLXJRaV z!dZWz59OTDdo?Rvz0 gB@HWec# %A?~a)X)U3T14ny(-meDZkX<|;af3%9;#&qk*bmx752g_hb*v4B&<_=~pqN|r z7PbuKUK 98AL -fAC zxEXl@n|Y#FZUTLIT&J@aKYZ+2XNaVAoGd(oif9t!Xn@9g92W&luRG58G{($4E~3-N zb~Hhljzg?FwJR_=q%+B9Jt6=G3q4JBxld`>b*IQpe|j1fET6u4oFqS*KDU~d{+RVS zeN@zXRLx^%Gi~P09Z08jI?Q|8&|^gDsLMe2H^}|BeEDx(!C|Yaw)_3xk#aM#6tnj7 zvwl{yGTyVU;9 )p6+E49y&!@z`>}k%iE)0nbDrmDA)PbPd%(YvSu 1cL$SrzRa|B%PZ*|J&>)ADilYLdsQL;UJx%(TDn zg3r 9MPVc2Yz -!6JETCxZ)?jh z{R7+XiIur>C}w=96LDCB4mtd(cEo9SG&lNXA%eiCZ7 S1k=o@^ zAY`$}Cs(6~IQpCBq$kYBmX=&+B#J8Aq!bwM&&qYrWgO1oD9>5@&R|E+nYYhh!(K>8 zoO85);d)O_2sz %8|*P3Xwl50E8h& z>|~O3m9WePutvhy2594|irn|lmmh2al8RSfA4?R3Kk5r#|J1)Rii9=!bshX=@8S8> zH|tnr6(_1B*=tnTz!q{7q<_O0b>rHOfEP*PX}kVb_{3H}p6nNIaORz3 v9{bmyX5bpD z3MIbt`y#??RGYQ`68n!M2d_Ed=c-6K>WfosF}z!2Sr(zy9inPnd&p+|^`Dg{?S#*( zYEwTivK5*}F 2(3D%MK@(da zcA}Y*j^H~ofvz8* Xkx3$_uUWC=JC}D#>O8w8~gEQ2Bx}0T$8eLXe*J`U$%q4 zqZ4}L^094sfIBli7eH6;^N7l%USzIScGd^eTzcA%D7jQwbHpY D$Z&j(p7-dt$AyPjQ)i{H?E083f!+kfDuU@&Y&{?WWN`Kbb8Ox>Ys zT3%-)<&<7IxxO^KHhL#7u=rafkd9*kn%Jrn>GhZUfJ=CYHG|8!%p4VQK;<}nO?S+< zYepo@PLmB=R+RIQBND|`KQVt;8x2WlV%tZ;(lC%8ghI7L#V5q{M@@E?9eU$J8bkKK zID5zcxcfcsHcivUX>6N~8#lJ?q)}rhjcq%b*tTukwrz9n>2>YB&wXC!+4&ph$$a0x z&sr;G)T5C!6bITdM8V@r^GWPy&xPYA(2WcKmqvWHqey2@(%nvqC>WSUn7HzrDbc8? z?Vee!wrj-$y7z}Qr^|PVd21c9Gizet`}0v@ iWug tM0B zIK&`Ins4OSA#&k6{#s4E#20d*YGXO*pHbV$CZZI;)^adGi|u8VRfuYQJj&?Mz>k({ zCjLG>%z3pwww3EhX9qYmO;H%suVxW0aCwA~>P0*)GI)+}yBN^JLn0u1C_Rfm!8*&J zsK!k!Kua5qnNghi6H{CkTt4Nno>=s>G-A4iDlw=BrqW_(XpE{$st}SV+i{cFG-kB( z&@?2X#N^gK2fA?)AJcS}`h5qUN@n7ctBd}ZN<3fzh?8ha+@=7R#ttab)Je?DZd145 z4r$xfiOfT9(~joI*~En=99nMEmn@9^5FsXAS8mg9_VlqYhbKLM+NUFd7x6+$$f+DK z^B&Otr4k4IL}&nT5k*3H$5S^@4mp_PML0B}>HcPSxr97B!i&r^(I6^OY_G_kJ9H+o zg~gv59z#f1Vm4)lp K-y_!7JJ8mjrJV0*p_s}5)T&rU2GR0XJ`LeY)dXvG_sQa zF1Gjh3YNEXWv=(7R=L!;kI)M>DawwTtkN2P2U`{CGKZPszk_X0H>;G&-@*2!w*Ex^ zpTYLkRkiV-!M3agrWL*O?_f&?L^J3_T^`Z+Q(a0sZb(16Jn?n7S{l5}SX6RF+_HhH zkgnWJm1}a0^J`sMM7hN%^lDGKT|?8jC9|R?%Erk9I4I`>h^FbYV7M|>%L>St*98g^*6gt_`OZ~>@hVG7^He`U8I z{AwNTCACL<2^du7sEz?9jTsVtQz!avRTEzb$3<$;G@vw5lPI5UpfhDZ`U~Oqd)ZhA z1;`_3@<5iXS+>Ulq7s8GnE7%*R3eVc_-tQI`s3Nb_f+sncLbKm_cm!}*q13y@;j#e z@FNj(^=W0R%3O+dV?HNf4EYdvHg51b3nkv@%=FS6{4p{!2bLcCIXv zH9)ytT59xV!LQ&x$9CMDkp_FA9pR6UBae(8&g(Su*N5t)h)v|yl;x>`^MC}rbF)f} zp1FpGhGEGweh0VJt%?h`TD%K8>&E8EAB` =m9m-tl zPM5Eno$aS>pJaeG-97W0Uu2ssQaNn`xU?$k`yYELey#wB({?Z`*>mY;uEO2k%1qmz z21Tuw#Y4f9&yLuKRWFp!`)z;Y7&ni_tWpb_IUTU`vgNQi-KM>AZ=6yZjeE*CSn*~% zHhgcHQN{TwNdJC(hM+r^E#o+}fq1Mu* YF%eA{N8bjc}cyUps%?-P`LvGMG @5*|?R&;(m0oPw|C%s Y$B=tH=~hk@x!sz!&S z=1cj+gaYuTJz^qR@@1e@-^K7_3Ff3|@@572#ou{wF8O_Z^7)DB|D(xQK+Rvp&|hqc zODNb+e91qv*G~pB0Gr)UK`r11gue rk@I4@S;xj{#Gi~gWfmX1n@(p)HbjWdzbt=1l1iOR@cxX&?Xg wA|TDYDhM?>BlQ$Xnm3Xq-sc;GfeYR7`;mH6)Ie{8q8F7SRbW+;gJ|kTzElM z_;|4Xq?p)YH*Bw31kpl>f>6W?0B-Fl+}v5Fy9xG?J+c;Lz(U2GF@fDGibOkz!15M4 z4vyTRjKcmC@dq_x95L!;$;^jc>=83^3^N*DB A>J@1PK?9i3{yrb8AkCrp3^C;S1F }V5sFf_nt*zz}(bh20&?{R!k5g^PZ;i`|@1Sv7lB`R(?CSh26vG7Zd zIIF0Ca*P<1I~6p}a&qBwa$*R4{VpASaj@+%Y``#785Kl@dZJ}A%+-}(!7&i3_?S?u zIW$B(xs^lnn;0cEYFe~Ss)%}8jdNN?a@x!SV2lqu@0owd1*#q^*}9o~&NRJ6*aSRU zV8RqS1v;vi1FBg(1NJe&v6lubKI0En`s`9h;8n)eu=P?ioX!s4`Y>h>SaL#DL<2|0 z`?2}~Ro3T{jN;~ugX}EWl|P_x!m2p$0~PX+NmkEt_H0)s8nu&OF$_Er-?x?oLf5P$ zs8m$WoUcyVg*G`4aXDwlN$|%RWlQkHFu912ne7ZIr?uIp$4N `GVgi zO0?)%X09AMEy?_!3T>&CdXumm%?h1D3&pbw-OLmRDbTc1I4w%x>7sM#`HKQV6%Z2( zkiCl >Rrp3%y}by1hOFvis`xBlnP&^E+LS2n<}ZXl6=a33 zE)=MmBr2;_sOX?7$+}9#IraF^pc z+5r|`b&k`uR@~-c(}k(^8P^;8R1@p4w1L0^2k#A94>aR~ey8Ye>b3TV(QXng%$HGA zs}Y&H*G_V+Zkn`SoHxX$Qw*Xvq;GKDHImS*?!8~)+c?U4F{XQaUwZk*I^S{Ho;3PI zX!+Js`^4Xnq;Sz0-`LtusdG6#vG_D&Y4)R&f~$oC`{~O1>DN$YxG9AQKXX=ncAy<( zBpld)?hn!Y 9_mOo74gIaAZwxRBNdMdv5UPzfGoL`!X#4w!t&% z{vTRH@OACMX?;7T$l5al->3U+1P0^NMoOdx3&wEt*9IqGxRj)N{KtmZ?fWy+dg-c% zfH?SuX;}u;sJ3k*vEd_q?w`%ThKzRx$E4~T`9>PtN1M}zTHCtX2su09q9WYC^`?z@ zayP|=kCE^}2%dFUYK^jRjV5LdPlxlGaF0vCp|o+g9!sR0YD^?ejTA}^*W-TXC!B~0 zpP-r<8wsaAp&dn8n|Ly4yK3u!szSN7AUZn(!rzBSu7-c(@0uJ@gTyXZ*TWs{j2=fV zpAuc0YDp_xaIZm0pMXrC#5f=7*P3FM7(Rd-^$MT#3!nYsT|>&l7i2MmrA0YKi$W$f z34WeV4?i30K0Ap!``L1qlP8m|9g1ds_TI0LFQQutX<9*Z9?D~m6MIbhdMFxh;ka$? z;ANU=93C#LRmXDv)NfwhvP-slNK1MSJblh4e4%4&PRo758Fyadbs<=8&Zd3JzI;BG zxyS!}f$%-ewS6&$b}2RsW4CQd4i62Dr!LTADL8$}VVsOg8!EkgrT}~SGyeh?-*R~O zB4zmkW=wh2uZ4_qZaDart=B07q-Mc%;6#-73dHnyDLnju)Wi+kYN2~so%ZVV?L^ai z`&cPD{_2uZ8`O&yWkq|f5#0zx`vMhz<5)TOBz(ts>%2HvKJoi}0N5I2%z7Ws@} gFTtCezn#o3v#} z{Vl4y*(RP2&zKD%-0o$f?N10hk`h~T+oWpd+pD{4S?vQj9c$U_^D}fiM4rnev+EY0 zIPW5M;_Wu=(}@{mMnj3VJ`?W}N$hYlm2i6U+riI4YhmWDEwV>r_Kd@S(%uu9&^eh( z760G@vGiPLd%Tg*bLHp)KX*yGfGf2Q`=2BBG%vEWH>PMmFmPoiL-_ZQ5VoSa$BeI* z4Ehf&zh_BC4(VE9+FvYvwmeMmJ=&Dm-p3=i`?BE`$;lnrFCB>)P_f}3d1z671h`l) zkrxFGxOsj(rnrYe_%jZ_X1&jk0p-U^7bm6_2U?C$pjK0^XB&0dmN@c(5!{jo?qC=G zS y zjF)#NXaa)8>PCK(Q6uB-sP>N1vPNI?o>6a%&H8%F>YlCtKJ0uu@caHRUU*?IZ87?X zJHLCW%&DsBTd#DGuJI1tQJCZ6p+NYdykgdM8*}~bUh$G3x&G0;(i86E#-Vfd4*`7C zrFQJs$B-!ba>RWR>Dy$Tr&Q0IZ~Ky-y3cg^xGycskx0*e=g$~kJUR4g+tX~1QrOPC zdq02yP@69m^sFv5z^kIn^mbm{Ug75^>)>46C#1{W65d_3U$2e4Z)Anf3G(|Sx3683 zFB6mMLmB8gya?v9_X}R{;G}QTw6$}co5QmB%w!*1yeud5>m&s4``;?BGZi;GKO_j~ zfI8K;Ua&L&U2KDbLqh+%*!rOgMkK@~r=+H(XJlq&=j7)7v)Gn^sKkF3+uFMNzl&`e zpryUTU!$|9fTW+PlW73CcWeydYts14?A(6`+x3mjt?jM0o&8Xu(Srq{0hEq`qm!Gc zz0mvHr{|Z~xAza=-@%ss5})6K5eB!-h*pdqeFQy)nX)>kKkPqLV(wrhD(?;qIa5Mn zV6%(}tvVg)|5g6j(Ar^1wxK8_q_NDtE0&~~&K3L5Vrx5 O3i>TCMq3eh1GwlL}%4z`_hH^$PO2x?k^1N|1P#VV^3SlHD0SVp;~3OEUt;P z<{SS~i7pBOaF}STBiTMi9clj!fAGZJKw-v7dU*yWH~bs^_*vDXwMr^m9G})=qqp;K z_~WH$&=#kr3$!_yElp->{u} @*y}asu3wz%r48)dG~MmBae^c ;Fz?V!zC^7&qUg1HE%(s=5XgEpxpYVrB54pNQAX?_Hv!kn|3@#PGL5l5HY7mtO zzM`J48!#N55QzRa{PC5u5a8q+U_xii*`$$|2GYo7#VJrH=1@T|V_Ihx{6i(K;4$Zs zqnDJ{Ets8_zu&3P=jUg%P*s35a%WW^eJ}CVz;DkIXEkF#PRo9@F)34(h4ZkV{=KoK zt8I}8qh$)Ubv|#{OEkACnI=!DpijmQG|N2%dF0x98&1o8ppsLPniyyP-q_l=RLDN4 z+?H!~=3rg*z_Ce T74! zjK>-0 xS;aK;RpOG?sZ1fd-+oM-! zpkgZSN84lkX!n`Nhh!FbY7K8?_IHo|n9vWzzbCec6z~qe#J?6ronuuxUbSRFi9Yc! zrXje-7!ZEJ674~6kt4+#(*#o#6FeEG0?E3v5kzYQMr{~W5zB^NT$i{I18suDr1bf0 zD0{I(_kwU3x5xoSpc7k0AU{Ps6l$1qYp--@s4848=6J2JJGV8FAPX^!@TURBmg|UV zDw0oMmiij&kRqMOb}ec!`R~SMqP*eu$|st>34By~_=2cJWirt{7o?c5@H|pHqalu; zHRK9udE{)#WIyeyBbk~>C`7Tu *rFD2=NtTf8Uz^Hg_gPJe<#C| zOi`MN!8RN&b8Q~gM~DJE2pUi`KJlqNj02|TNSPKzB)#8eLdcrQzUK~)i_6p|*Gg$3 z+80Ned(@^L&8=}9FAY}cF{7SJ6>{TXOu|Rb#yZpJQ=M>3dd@^-5;PZ##tz2VewxdK zk}jGy5tT#5R?0>MMiia@gr*9{QvxlvCY6*cQ>+(?xrFe=w6It$;c7~MsYD(h%;LC` zyL^WJU<#T+D$5VL0`_sLxQpf~nP#OzKKK$Wo~7BuSj8f-{Y~LbQv@IU;R5l95(N+D zSql~>09QhZ3SE=Z#W6epN#i$1RLgwL_sY_jzC+u-&~HU4_vOa#5sGm}02cH T@k$RjT_11N4w2muaOJa<>6Au`sa9Bd&>h zN&OZEX!i5JZ60ciq%A2*u+<0R6RUiAa?Fe+SM3=ZEPooFvaPw!uDm=n205S8u&hou zoP22-68;XVG}o)`; R2wQ(xaVouJr3V|$-gte%P(5vja+QwRq}aEh0ZKEJgS!toaxc_> zyP$PPliH48Z0i1|X%oP9Rt1|o^Xq0mT)S{v4 yjMdY=^FI*W@ zA+ 2%P6X?{t}Q)04dJ~oMu$kH5j}#NNr=?MQ&8{W$TkhD$W;0} zU5`<@ain~C@DIyeS*K6M8so4M1{n44=-JSX7)RPKFSzrahA&4NCDvwW9`Dhp9!}if z-)2ApdBiy-d#1vUYiXyx8Vhi_{+?AvkS)bE $STRXkHgzzXvMF*?52(`8&^GKaveqfm-I*k$B z81t K;})ch))*Z53iueh@Tc9>VQJ$}s6Yro-x(A2Ygg5j4Nw6!(r)Q2HsdtmCi zMHlFtWMqCE>W1s|df?od3i3>Pz3o*B)^*mF8^yPB|H0n8i_p(dJ y zI^DWWBTs@fg6KEYWXBWRt yVeRb3vBorEYlfYMD(7 zWSTdHUhikSI`xyH?`5uBDCai1jSdoFwkH;NNC%3pYmW#Pt+ms~=~`~3qgHkuI68HD zmG)T@rw@$;AJ@UMZ`s)(DV^ZQjoy9hGL@;zn469>`2CMjSdfpex8msA*7NUstCt1q z<0Qw<$p!VxmlXn@(GstwtuNbPE2|%m2~n%-F@4?d&-hP6gY}u1(2l#-+|N^wj9af0 z)V^$2Pt%hf2ErG!;w&GzE8lpl+>_kMw0VzqWW5H-WIa^xIsBGXy}EXFhhXJ_Lx{Zu zT(X_tJfB~62fb9_92m&x^=V>1djXTY#{!Lve2J +7?fo9$OKwh;GeU=C95DP*} Jr(w-|jP)O ?adT1IRM>6h5^S*1;ZOupMe5<~ZOSJX8cfVnW_k icp!4codD) zMvioTgrIb0J2Hvn{t>kp9ee^Ht`i6k-twh0iC_|o;xUOjjgA`IrdE84l+X5~Q&U5* z@uPJ1OQej}7mHr_70r)K%Oz$VH57e46p0T8CmQWb`W!`O8iQ)8ODPU-2|5P`_#!6z z5^cwTaR^g9yR$6&P(8cR49A{`MMUl3GA@(ii_4Ix$8kM-@o-$gKe30w$HhJWiD#uq z5LZw5GabRFPA|BuP5{l!WSa1c3PYxuRg)uJj0#g5E76RDI_}9k6FfoGIWcl5%3M7O z86wzfSj@-;%JdnU5-Ro&7C?3{P|*3ijW`sEdT@NSukSK|;MQN=6yPTQ33^y0;TQlY z{*Hl}d<&kiYXXCloSZYv$*Ta6#fp>70=O5)
~nX=CaZ2n?xtU8yrzPUBQ!Bh9H7 zfOO-=bRX2TVurM>W~V(wC@`XD2v8W3@m~ZG{x1Ru1qAy9^}mA-t)Z&y-XO&PSxf$Z zh5;4ego3+>zR2bNBtt#&ohenTHT(aD0oy5iisu?_po6cf8Y 5tN(WwklqxU zk*E}%fS{)CAIo&D`Q}7>t5a%wwmxvl #QlAv%{W(Sjhw~Vbiw~#v@5;{~08*cp)h&PyaiN|~erHx;qXs)S{Cywv zp|`GA!kkgdrJ)p?Ayy24G}Co+DmWUIUpQV#8z7)f&l|Tun(3mNJbf$Dqm)-Z-9lpO zLLt{bW{4@f3!pII6Sd0))Z4=;eJ9FM{yATn$l!Sm F%_VDCJf#(&w zZd?chq?ry#Pqi18C}njRaQ~4?TPZ^fvP`QPORKbC$!qax$U42=3Na{_-!GdKmj95` zvW5WhG$u@v%m%!gY}U|8?GGF7kHB*$acO%cJ5}4uGM07HjO42l7y6IK-M`inJ|Fu% zR)qkX^5!+_#xT<*gnpdcy}Tr=mK8rgB@WqS^N#1muaqrMUE%g)r}l-16|Wbpxvh04 zRJ(I6r{tw?(Hk|5*huH#J`=CEQ=&l26C&-4nX5k4U$!C>Y?n>zIFztpH#14rAJ5$# zJh3m{2AMo(1TLPfPhZg5rb>BpK+=*oRf%@7h1#^&ji6X^I#NaD-TC#if|L)AD<4Fy z*%N^q-U6&hZw5X59tQG;3(G5QB)DuS(V<)za2p6DtgX{6Rg~ZPW-Lx-aG$^K@n4cf z`m=+c2l9qJC-+z8D S7i^g7Z&g&2a>ZEJ2n;#R<)y|zXp`SAS zJNt&riBu#AQU4-%HKN*-rVw3$LulIReVTX7e>KyhJ6YGHeoxz~EMgg;j4$YUU})~1 zB!ZqLEW}nfh0#w5I_S8Gi6 zVPKol rM%wd=UzqR|{obtIzn!o)7P0tP=~VU?2^4#N0g2Xv0H-<-F} zbf1hwLtPjZiv(P%?nqb~hsUk-g;IPq_q8dn!nC@s5(<~&*cL$qo{pg};U@}pG5%2S z@Zm6Lvv7ylBjAMR%WWn~9EAvY6S|#(_b)4ceJyOLsX)%T^t0S7_H%*BB{Wi5!&u1x z{E_KMJH;&YH63lZ6A*$omz(hhCDyAj9oKS~|Dk0HV|0QR+jCdIzD~{!DWO
5%NHhJ8X&-0zk7oM5 z<=omRZ2iJ@QDc@>!m(3w;|7MNP0+UDuVz|3n~ie!uV$KtisrZQKbmRid!5X_znbZ) zl$TbN9+;;tsNX0)0gsyyTu Tu(?s<{uLewK;q$jK-Dgg)m%J_IIr*EHk{nCBs}1B4i9-(6C! z=ixtfjDFu>_Ng^FI3&@<<0{AYzgLR1qWq{y8axBn0W6PE4V?q% w}vYg9E_*W!}bleSuWKfysCkd*e;-tjJQYquq{(zGAmkozMEnM&C`*d zb@`B=50WTdXUP-o3q&J~ o5e6)qnrtugPP V)%$e;1_HrKffI`e&EM z?%OaceGJks5S5SZ7!|1gpS?Fxy}rjI!wCKs*h2>v)b_38*=iee(?9_qZ->p@WCQ+a z5f8zL3{iYsX~*Nv(6Eg(F=p7WgI>e>eI`_BNvSF +cN#|1oN@l(sf zP<_)0;2fOUtpyIgySOJD$MrqkRw@ig!AYXw*! LyA?b+);H8KAr>o+Qe`N8WwVeQ!q z(fqo9%Sl+T+b2tQHNESm;1U;=L7E;2Vay}@y5fXisjm8bx+zf^S@dy QlIL}OL^K@mo*+T>_HvjRt;_Hk |iYv0SNj2G(@~f-TqhT0di{ozn&DNxBW=7{WA0dhZcM?9s}SC z1IhS5f%Mb(`=~gM$a^S3>PyBAqHg0(zuW+U+k-)P0sgc=eqSRskD$eX028;cCf#uF zAgP0Za1#ZFr(h`-96JEgsA@=HaBvDBC}b%FOgI34JJgplB#zR%KrJLmOt-WsxNIp{ zr3pEg0VWX<>e --5!ni97;CI@LsOLq$e(Q 8Sfzk~uO+lo9NiafytopMCOHAi1JX}>0gKZ?1H9cgC{Mm0Z05r{;S zQbn&U;d>4t`>64un#3S*#2{nEp&rL#xS;$tiNXPzh5;}mN{)Pp#YxGq;unupPp1Q^ zp+kCRW50{XoKnUig2f?-$6*v1L5K!%s0Y8I#kM@fapXV?JSTuhM_dvGQu7D4u;5D$ z$IBka%V8y;b0omTfMdHPXo%}LVj(*XClKx={CZB%KgO>rLfV7GHc3w0g^IIq0U&TB zIV2}=t0TJ i>t_%=g+u<`ie zE(zJtu|JdDbJSCikikJAK<^M~vg?qG>lBXWxaXxf3j45zX2Ry;RLYR}ueXwydI^~v z-Y-KTKOX@7>ZyYqOvA-#XWOZy+rC#mannHYly%_@1e3JS0qM)lc&o$d!oz6_29D34 z(ngkI@J-X5p`nBeGEQA^-Ip^wpYet70#icpcAk@asdSTv0!X&QnS3(dU6{dEk_ SL0O%l6=cMw3lfEQe zPrFgVWUhDT;Js+`QhPJQ=u%7MdfDcZQD=QwVRC~cq~*+m3C;8uO=ta*FOq^GMjijM z?VQ(_dt{rHXp(u3mWRk+FsGcSN{#*_C7-mJz;!XUoyFlj+kNyg2mByQXef&$pujW~ z?bC1p#4^F}Bu|ODJdcrIN+(EcL#FOP*CLD0MLyJo6Wg{J%8va ix%NO>F7ao)l9H+2^^{YiF>j7PI6PF3&B`Q0= zKyf^WBi2;zEL0+dDc_(~fpL}~D^z_Aiy3Zm2JP_%*=pZTtMJIHhsCSWU<)x)S>Z;} z@L#J5SM^X &|8WPYo2Mc+ )}Pw?UcyuNN<@~`Hagn&(bG!Q z+Q?1QUSrr6Qfjb-Lu3amZBG?y&v