From 3a9004244f42fd251e921f16dfead1d838640524 Mon Sep 17 00:00:00 2001 From: Nisha Bagdwal Date: Tue, 18 Jun 2024 12:34:50 -0400 Subject: [PATCH] HPCC-31857 : Develop an automated ECL Watch Test Suite Developed a testing framework using Java, Selenium, and TestNG. The framework is initiated by TestRunner.java, which loads all test classes listed in config/TestClasses.java and executes them sequentially. Each test class contains at least one method annotated with @test, which serves as the entry point for the tests. Initial test cases cover the Activities and ECL Workunit pages, including tests for text presence, link functionality, and sorting order. Additionally, provided comprehensive documentation with UML diagrams and detailed explanations of each method within the classes. Signed-off-by: Nisha Bagdwal --- esp/src/test-ui/tests/framework/README.md | 11 + .../test-ui/tests/framework/TestRunner.java | 98 ++++ .../tests/framework/config/Config.java | 20 + .../tests/framework/config/TestClasses.java | 13 + .../documentation/ActivitiesTest.png | Bin 0 -> 15534 bytes .../documentation/ApplicationValue.png | Bin 0 -> 2919 bytes .../documentation/ApplicationValues.png | Bin 0 -> 2566 bytes .../framework/documentation/BaseTableTest.png | Bin 0 -> 128722 bytes .../tests/framework/documentation/Common.png | Bin 0 -> 6174 bytes .../tests/framework/documentation/Config.png | Bin 0 -> 13193 bytes .../framework/documentation/DesignDocument.md | 464 ++++++++++++++++++ .../documentation/ECLWorkUnitsTest.png | Bin 0 -> 21757 bytes .../framework/documentation/ECLWorkunit.png | Bin 0 -> 21832 bytes .../framework/documentation/LoggerHolder.png | Bin 0 -> 2861 bytes .../documentation/NavigationWebElement.png | Bin 0 -> 10506 bytes .../framework/documentation/TestClass.png | Bin 0 -> 3296 bytes .../framework/documentation/TestClasses.png | Bin 0 -> 2324 bytes .../framework/documentation/TestInjector.png | Bin 0 -> 10050 bytes .../framework/documentation/TestRunner.png | Bin 0 -> 3979 bytes .../framework/documentation/TimeUtils.png | Bin 0 -> 6626 bytes .../documentation/WUQueryResponse.png | Bin 0 -> 12328 bytes .../framework/documentation/WUQueryRoot.png | Bin 0 -> 4085 bytes .../documentation/WebDriverHolder.png | Bin 0 -> 3135 bytes .../framework/documentation/Workunits.png | Bin 0 -> 4176 bytes .../framework/documentation/relationship.png | Bin 0 -> 4857 bytes .../framework/model/ApplicationValue.java | 15 + .../framework/model/ApplicationValues.java | 11 + .../tests/framework/model/ECLWorkunit.java | 100 ++++ .../framework/model/NavigationWebElement.java | 14 + .../tests/framework/model/TestClass.java | 16 + .../framework/model/WUQueryResponse.java | 55 +++ .../tests/framework/model/WUQueryRoot.java | 12 + .../tests/framework/model/Workunits.java | 15 + .../tests/framework/pages/ActivitiesTest.java | 117 +++++ .../tests/framework/pages/BaseTableTest.java | 310 ++++++++++++ .../framework/pages/ECLWorkUnitsTest.java | 155 ++++++ .../tests/framework/setup/LoggerHolder.java | 16 + .../tests/framework/setup/TestInjector.java | 31 ++ .../framework/setup/WebDriverHolder.java | 15 + .../tests/framework/utility/Common.java | 45 ++ .../tests/framework/utility/TimeUtils.java | 63 +++ 41 files changed, 1596 insertions(+) create mode 100644 esp/src/test-ui/tests/framework/README.md create mode 100644 esp/src/test-ui/tests/framework/TestRunner.java create mode 100644 esp/src/test-ui/tests/framework/config/Config.java create mode 100644 esp/src/test-ui/tests/framework/config/TestClasses.java create mode 100644 esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValue.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ApplicationValues.png create mode 100644 esp/src/test-ui/tests/framework/documentation/BaseTableTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Common.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Config.png create mode 100644 esp/src/test-ui/tests/framework/documentation/DesignDocument.md create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png create mode 100644 esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png create mode 100644 esp/src/test-ui/tests/framework/documentation/LoggerHolder.png create mode 100644 esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestClass.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestClasses.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestInjector.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TestRunner.png create mode 100644 esp/src/test-ui/tests/framework/documentation/TimeUtils.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryResponse.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WUQueryRoot.png create mode 100644 esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png create mode 100644 esp/src/test-ui/tests/framework/documentation/Workunits.png create mode 100644 esp/src/test-ui/tests/framework/documentation/relationship.png create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValue.java create mode 100644 esp/src/test-ui/tests/framework/model/ApplicationValues.java create mode 100644 esp/src/test-ui/tests/framework/model/ECLWorkunit.java create mode 100644 esp/src/test-ui/tests/framework/model/NavigationWebElement.java create mode 100644 esp/src/test-ui/tests/framework/model/TestClass.java create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryResponse.java create mode 100644 esp/src/test-ui/tests/framework/model/WUQueryRoot.java create mode 100644 esp/src/test-ui/tests/framework/model/Workunits.java create mode 100644 esp/src/test-ui/tests/framework/pages/ActivitiesTest.java create mode 100644 esp/src/test-ui/tests/framework/pages/BaseTableTest.java create mode 100644 esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java create mode 100644 esp/src/test-ui/tests/framework/setup/LoggerHolder.java create mode 100644 esp/src/test-ui/tests/framework/setup/TestInjector.java create mode 100644 esp/src/test-ui/tests/framework/setup/WebDriverHolder.java create mode 100644 esp/src/test-ui/tests/framework/utility/Common.java create mode 100644 esp/src/test-ui/tests/framework/utility/TimeUtils.java diff --git a/esp/src/test-ui/tests/framework/README.md b/esp/src/test-ui/tests/framework/README.md new file mode 100644 index 00000000000..0f56ebe39b8 --- /dev/null +++ b/esp/src/test-ui/tests/framework/README.md @@ -0,0 +1,11 @@ +Project: An Automated ECL Watch Test Suite + +This project's code begins with the TestRunner.java file. The main method in this class loads all the Java classes +created for writing test cases for specific web pages of the ECL Watch UI and then runs the tests in those classes +sequentially. + +The names of the Java classes that the TestRunner class needs to load should be listed in the config/TestClasses.java +file. + +Each Java class created to write tests for specific web pages should have at least one method annotated with @Test. The +code for each class starts to run from this method. \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/TestRunner.java b/esp/src/test-ui/tests/framework/TestRunner.java new file mode 100644 index 00000000000..3be28b05a87 --- /dev/null +++ b/esp/src/test-ui/tests/framework/TestRunner.java @@ -0,0 +1,98 @@ +package framework; + +import framework.config.Config; +import framework.config.TestClasses; +import framework.model.TestClass; +import framework.setup.TestInjector; +import framework.utility.Common; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.testng.TestNG; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +public class TestRunner { + public static void main(String[] args) { + + Logger logger = setupLogger(); + WebDriver driver = setupWebDriver(); + + TestNG testng = new TestNG(); + testng.setTestClasses(loadClasses()); + testng.addListener(new TestInjector(logger, driver)); + testng.run(); + driver.quit(); + } + + private static WebDriver setupWebDriver() { + + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.addArguments("--headless"); // sets the ChromeDriver to run in headless mode, meaning it runs without opening a visible browser window. + chromeOptions.addArguments("--no-sandbox"); // disables the sandbox security feature in Chrome. + chromeOptions.addArguments("--log-level=3"); // sets the log level for the ChromeDriver. Level 3 corresponds to errors only. + + System.setProperty("webdriver.chrome.silentOutput", "true"); // suppresses the logs generated by the ChromeDriver + + WebDriver driver; + + if (Common.isRunningOnLocal()) { + System.setProperty("webdriver.chrome.driver", Config.PATH_LOCAL_CHROME_DRIVER); // sets the system property to the path of the ChromeDriver executable. + try { + driver = new RemoteWebDriver(URI.create(Config.LOCAL_SELENIUM_SERVER).toURL(), chromeOptions); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } else { + System.setProperty("webdriver.chrome.driver", Config.PATH_GH_ACTION_CHROME_DRIVER); + driver = new ChromeDriver(chromeOptions); + } + + //Capabilities caps = ((RemoteWebDriver) driver).getCapabilities(); + //String browserName = caps.getBrowserName(); + //String browserVersion = caps.getBrowserVersion(); + //System.out.println(browserName+" "+browserVersion); + + return driver; + } + + private static Class[] loadClasses() { + + List> classes = new ArrayList<>(); + for (TestClass testClass : TestClasses.testClassesList) { + try { + classes.add(Class.forName(testClass.getPath())); + } catch (ClassNotFoundException e) { + System.err.println(e.getMessage()); + } + } + + return classes.toArray(new Class[0]); + } + + private static Logger setupLogger() { + Logger logger = Logger.getLogger(TestRunner.class.getName()); + try { + FileHandler fileHandler = new FileHandler(Config.LOG_FILE); + SimpleFormatter formatter = new SimpleFormatter(); + fileHandler.setFormatter(formatter); + logger.addHandler(fileHandler); + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + } catch (IOException e) { + System.err.println("Failed to setup logger: " + e.getMessage()); + } + + Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF); // turn off all logging from the Selenium WebDriver. + return logger; + } +} diff --git a/esp/src/test-ui/tests/framework/config/Config.java b/esp/src/test-ui/tests/framework/config/Config.java new file mode 100644 index 00000000000..98b8311ac28 --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/Config.java @@ -0,0 +1,20 @@ +package framework.config; + +public class Config { + + public static final String LOG_FILE = "errorLog.log"; + public static final String LOCAL_OS = "Windows"; + public static final String LOCAL_USER_PROFILE = "C:\\Users\\nisha"; + public static final String PATH_LOCAL_CHROME_DRIVER = "C:/Users/nisha/Documents/Internship/Work/jars/chromeDriver"; + public static final String PATH_GH_ACTION_CHROME_DRIVER = "/usr/bin/chromedriver"; + public static final String PATH_LOCAL_WORKUNITS_JSON = "C:/Users/nisha/Documents/Internship/Work/files/workunits.json"; + public static final String PATH_GH_ACTION_WORKUNITS_JSON = ""; + public static final String LOCAL_SELENIUM_SERVER = "http://localhost:4444/wd/hub"; + public static final String LOCAL_IP = "http://192.168.0.221:8010/"; + public static final String GITHUB_ACTION_IP = "http://127.0.0.1:8010/"; + public static final String ACTIVITIES_URL = "esp/files/index.html#/activities"; + public static final String ECL_WORK_UNITS_URL = "esp/files/index.html#/workunits"; + public static final int[] dropdownValues = {10, 25, 50, 100, 250, 500, 1000}; + public static final int MALFORMED_TIME_STRING = -1; + public static final int WAIT_TIME_IN_SECONDS = 4; +} diff --git a/esp/src/test-ui/tests/framework/config/TestClasses.java b/esp/src/test-ui/tests/framework/config/TestClasses.java new file mode 100644 index 00000000000..2a1a3fb1faf --- /dev/null +++ b/esp/src/test-ui/tests/framework/config/TestClasses.java @@ -0,0 +1,13 @@ +package framework.config; + +import framework.model.TestClass; + +import java.util.List; + +public class TestClasses { + + public static final List testClassesList = List.of( + //new TestClass("ActivitiesTest", "framework.pages.ActivitiesTest"), + new TestClass("ECLWorkUnitsTest", "framework.pages.ECLWorkUnitsTest") + ); +} diff --git a/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png b/esp/src/test-ui/tests/framework/documentation/ActivitiesTest.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b17514907881bf55ec3e7d592f0893847d9c4d GIT binary patch literal 15534 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�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 NIpuBPKfU)a{{z3MCF}qI literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValue.png new file mode 100644 index 0000000000000000000000000000000000000000..47bb55d8d921f2c9f7655e61ff28cd0c7a022b7c GIT binary patch literal 2919 zcmd^BaZnTK6<@?@sTCP&JD$v(-q_A%#_JrmG*-Zba&Rc8l2crA1_NHTQi%nQB?J<) zXzSE-(CT@msYntnLe5P{=7gYRNy43XSUE2d!?Gn10wM+yl2}5rCLy7_;B}_sIn#Fh z<7RIE*!kw$?|bjSaEA<8-5gI zDlaj3%NezUqb0IU zjKJ!5H(L*>1N`zEMMF}EVEZ!(J_EJxKqGxk*Jk&jY3;-73;b8Ccw+#WGN{=IM5F5! zrADFtdK$#B`<11v2P4H9iTa#SRskBh8b=@)GC_`_% z*>pP7du%#-+BuTj);_4;ZBbToa2WF+GDZB)gfg_HJzXR)UbqN~?+t zWibq`O*l}%2eJD{#6_-AT7{>Jtmtk|WYa0k5Irz=w~V23{sGnSxn^x?GAQSD4i{hh zIR{18QNLrys*Is^)vhaue4yI3yAb2IX~(asgW#h(O(G9j=3iKn3&AktE?q#>_-g^u zd4XF>CQ7rH=um=sGGi?BkzIr`tbT?r~0cE`SK@(qw^n@SeV${#N7a82#h&i{kI7Xsqv8F^xV zzrMcy3%!mc#j6`$C~ux|Ii;9n)IAW#8qfMf|De+IJ!a70$W+R+a5Y<>Q1N-KiJ~Us z6WZvFQOGa3qCP=`WH^=TRgoPJu2%EQG1=iN29D_S%c>>)A`8=}vl3bay>L*_Q1$mYVy0q2=VY|U*Bujg(plk#VK&tLzu zQX!brAB!io^UT}yLEXX%jd1}zD%@o}Cha@?eXn_-a$Tg_W)8pFi)4t$Qm4?UuE{pUm0!fy4cx znZFt(P6lE<+K{hIX)M;S@~8zA6xM-b4YG>4}!lNjnyrA zO@tHR=*?S8_Q#1a$GP;UADH;O5uTrUPvTqYf5E*chBYxSql|`@qh{@}Kx*(#cPZ8` zB)&vwp0a23i(u-~i41=ijCck2%$pNbU4Jy*3f2XNn%x-f%Le46;jv zK!m0=e5f*bD%;UBqiEoor`QgGa$?TE)2D=L;vJ})_BZ^uaNOL9iX%n#b~Hof%+hM; zZm?g>)$DcTl?qw9x;O022M@8myRpN{CXTd!-syjb7q6K-W~6fKx%XXe*#1?QXd%>V zmoB1yfhDRVJIlNLyhV!AyZ_{iQ0=l3)OS=1NRiLd7GsAo!(f$uk2L+7d(gh?-#9Sy zY=zk4G!rpQg5~cm`bsY5Q7twS0o^9>)P3ZnX>FlwzMY1Q*!+FYra=c^tDtxPWyyu^ z;MT3p8s<(P%r9q$bqYsEYZzPGBEnJ``Iw(0y?BI+E1Gtuxlya!rTB`HH4I1CO%h=) z4-F5wV^d@jqS9broCP{ixsADLqP8~q>5r43*nuSe*k#D>7KVNH}KX?5P yg7u9x^8Uivo8&X1RLX(l<-K1&$38paE&%XK2RakGhMb%MAotC@Z1o!le*Z6W{vrzi literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png b/esp/src/test-ui/tests/framework/documentation/ApplicationValues.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa4a5756328c3af6c39de72be3cb2ce924bae11 GIT binary patch literal 2566 zcmeHJYfu|y6pc@`V~4RmI`sjfIM|}`fmIPgwA7|4wc1)p!ERDV)677zT0&y7B$@ik z*lJa-FxmmXYPB?Z{RFmblV~ZgRz*qcJ(F(;|c?fKfdl-`m0cDmM|FC4{=vNz4;A( z^OIw~tmb;*57vwi{2yL8x?zU>khtyTLhf+B1Xx55N`@MPVGag7VP;=qcM z*M#Kh-cY-!ljC$2g7_%{Ca96}x_!xbaz8F7O3AQk%^~a@lh_ ze-##@fHk(ODDNxBe!fa%2lr8 z0DEYZa2Q!&Rz>1)NZR$NFWMl40=wF#1`EN~13a}SCiAW=3UZ~Z5Gc*t4k@~k4ccS< zOldcwN7roED7tXj`2xZ68dRq)R|F`a)|0Rt@b71Gs_n6kJ4<-FcNwOO*;|8DU8F;`84c~3JE2EySyq3CsttVB zUPT&Pl~a#sy28@tPhh5|*`&i(6b#691y~ zd%%$)m!$(x+(`FtmfN`cjQ1OwwRQg*P&S?hslCwR3 z-~Xg$yyH^FV`!v$q#0BWC;5G#FTr#A9(Q4+-kZGq2T`|hAAgWq)=4)38t?I8J6Ysm zP{O;%=_ALKR6V;0nLXWU03z*vbJA0nZ4*gX{v1|te3wAvCW>FFpZ?15zF-TvS6d^Z zEaf{B;hfoK?X2C$9L^!fQH!-ZXdXvxd|#8_>Pd9)qO4A^c82nA^;pBDwb8@EVChU5p1{?Hq&C&6>*kL%Kl2mKpLWrFUR z{<(brg6?@`Gv{Kug(txAL-57{LuqKHmyowN@OA1|>P$_v`czOidOq4&2~HKKlZsX^ zXG3)A`M|yrU7={_$YjtZFEQKqeKgqqd2}x=fZkQ4(Fn^g8$u;rhK^^u<5_(u$kG$rF*ocY zPt$|P&w<>EV|-SofpR6JU13O;`lG%ryNH5GM{y?5G9vLG1~X+uwfT2@u~$v?frBxZ zn_DZ*>MCcUmA9{DMFrlbNe8m$_eQL^uymzPi+pLt;qJdyzZ?Fxd3Lhd8?)$|jYFhU zlB#rSqoZ!y3?~&9GHXVok1PiPW&yx5mv28nTac-V6tkt6(Vho-VcA?L019cR#)YI@ zqL^rkIB>f|yfkj_r)zZ#5Q#8#Hg8OUNEH*zfOJ1iaD)01)Mvm>hRUEFWXhLFd-Mxw zQ)$fIL)`kG1N!K0{zC8sSC`#_D;sk+ihI(w_&@j;Nl;|QC(~i0?%qOgQ-X_swnzE@ c_F*c+&?A#WXLnsm?{^IDGaFW$R&9IpHwH3<*Z=?k literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png b/esp/src/test-ui/tests/framework/documentation/BaseTableTest.png new file mode 100644 index 0000000000000000000000000000000000000000..289db16ed4529dafef09e02a9d1daee42a8cd85d GIT binary patch literal 128722 zcmbTeXIxX;+V%@d@4a_KkdE}4B_OCY5u|q%RC@13x=0g|CQU?&(xunXL69OyFM&`( z51|GUk`q{K?X~yw?Dw4Cdp-ekCUcHHuKRyqgV@Kqn&c!bBse%YCFCDjv$NneZi!s zqUn3S!=qqUH+2UZX6B}MvCj;Z0KvK%eaOBe6<7*2JfvX&L5b-HqVygxCa!)yE$q%$ zi@Ev{+Mo&7qI_!|_!u=F0ZHee106q*4#nJS=cRulqQnryo_*<>^yl?Yh(f|%F=c_! zt>jlI^i8i@mL@BQA?kHm(fxdjzeuz}-6eF^-(q z>kGhcaPZ>oj`~@ZwA-V4RCpd^HWykDyEuXU_E1>^#?hSv}(fND1?*wf79c zWjwN*=A-t6W0E8#5v9GhD1I8C9cSlpdQYDJ&X3=-kygsIXYa;g-%Sl zBK6WJ3!$_3Yj)lSTGEhQ+}!pXxb-4>Nl{$!M~epokrK$CbW=C&ONJj=K075DEi4Yc zxqkcY>Ki{Lt8~QB!|Bmy%WUi!vxlpPD{Di`hDI}Grus;=;JTn2KxrQqVDYkFQ7=WQ zLLlH?tLt@_xhXrV07_qR3m?R^PvXt@TC4eZ8&P3)k2twjG3=DZPTz8g`v>-Vx+ctV z%GLNg>esib-|(Rql2wFVmAjgDb1p5SaifaeY@W>}^`_$F4v*S=YNJUbdzkyv`9lLa z1kDRbOEZ>`l@G5kNGtKIu{hae$?f`CBdwH^*ZUYsEGIq4L#t<)0>5($z5m&0;ZOvU z2~PTo?0)e)6yK$f2Ge#Z$!s2L2bJ^UOv-h&aoL$a5L4EjBqD?Fg#icuvpnvEL_*5>k9?e>0g`kQetb3zp$4s zk)MoO;TK!xbTQh^>8F`|7ECe?-{RFCkp$^}{?<$_a_MD4QTD0w31e*`7dmLo@oxS5 z*qkZ-@V7!9v&3WWU!XeEHZ1pAK;Ncf+L5YqHJD<|uCKQmTgy~oSSoZ9N^>zCA z>-9=jrvxk5Q>QdzKKe~nOH30tEC+o-z{>MtUHE7fZLPCyfud?jt<9oj!-RO%OC|x~ z`6C*18GebzJh=$Ty9xMm0RecDLSnrd9VlgsuVSz7-ECH-3L?K+!64<1mA!efmq0WU z6l)`^jHU_~uNbi}!LTn-G4&nvNFt_<;jWHR5Rw2(7-&;cK0i?dcheq0aAyR)Sj0A>!X@(Cvc) zoc6J=zN--X1dl~KHwh?;*?wdk7dj__fMP;#I|=FUMk-14SO^oS#ad4Gs9 zPw1#zc&=ls+!E~Gr9Nf6sa<>a5hZV=jCLA+?s#DB>8R~Xq1P*c9-Yj^FMHV0$OJ(V zDHa{6?H8Q(Z(qGviStx##@v#53ytM@UPFlAO zSXJI;bQ=N6_RwK|@>qm?PnZ>o>4i-hA?l~bywt}@*YS(L1MMAW026rAzs%?!GMss2 zvodnJbOUPy5sMLVUh^5SJ7JIJ3WjS78ZU@E>7u`3%T1$F9RkV57}N%R34Q*lYF=zc z`F;LX(H&{7=5UoB73R4&y+E93|I6hPXHCp;^9&JDS+}e^@w)ur1W|k=B+oKzDofI2 zhA!wrOS1b#xo`3&Z6*8llEoPQ480ap*aioj2gtO zR8~l%FQpD11A^lJCVP@a;**4N-Q6p%fYe!<2(N7Mhs596I2xAF7Jl3@YF) z+nFzeJjzcx?$I+1omQ;u>9e4{~7R`_dLark7V4O#ZfiQH*ZqPMrr(^kaQvO z>uhxC-n<8;ckMuuzuNT}Zx`=D23gl96}H`3aTK@xFamHp4BrISzy6VIB}K>7J=!T5 zui4@bgwNZxm%FXbBKX)~8L?Dm!z*6?&}0EQ)%KJ7@fH=4rgN+7LD0lzD{ZA9j**57 zZyL*f=ar|(Cy>}zcU6cXn0@)RX-ZpB#LQe@G$-#~;R^lEBM2xx^tQcF)6Da(S%1Q$ zDO0^*3X#*z?>vLUW1S%=nvthH=+$C>NTvMT+r(xinh;3B^#Y1eh0B0uVhpz4?F~jL z_ESkjvM0wF+;j5iux(Ifg(lg~jI~6s56SQdk$XJsD;9sn>zQHQ;%^jEiNdZ4->Zj~ zcbxC;&`hUuEj_s&lULFSH~inFQ;{$_hJszS`EOmtcMI*Qqf4-Tel4@ii6+1wg3yQT zU;lt$mDD{dH-@Y6aV60_USF%KtBZt0MIfXqiuhXaNs3>RhwP^*(__f$qOsbJ>y0eV zzw5mJD*pceTm(0$qI6i;FFc+7bF*Ud80d+sT(JH7+{` zc#RJstE}Ro>q0l2v#=YFa1u%mvKMWTxh!0%77$7ywg1TQDPwoZ;M+k>Y?XE?ur)G6 zWtLzL+*RI!PNkoPY-zo%l1hX6NaM(*l75_{W@3%_4UVk%LX){YEu@~kGp?KIDJU2K zvP&1c2qtAI_2keEp=<6FefILh1n*(dil*6`ubskj|0Ip_-R!*smx>j$CKUxvY*DL) zGSK_xa9O7l)k>Az11(k@VKGGwSAK?zU|OXR{2R{Zxg6mJPdo1(^2@b)Rn;DPx4yRD zJ#z;$MPB&G;CLc?4*knQKpOiq$SMMm`Kz6G)SBM+^8nF&*7B6a?cv#(XSU)3#hUM; zIe&aof#0aV`1U5GY}(o@=qBrGx%knkd@61~!A+AaIZCaM>(p3D?R{M!$D?y+le}1D z3krHi1@?Y1k=0B@DTcy!(5^Fn@@<#R>g)CA|I%mk0$2KsTb=t-xlGenJ!T?X^AsUu zLc)ji4;%a`8uj)}&6QVeHBzvD*iDm^v3Q(k;>j%zMzxu{PN1X()|&%{4~zwk1<~0f zA&ww z8en4O8^53{OhHL6&_lV4?RA}ya(TH_l*_4m5y{U;AY7LCQ* z>JpNRrX}0duruxPRWOv2vQl@30-Bj%rzEQ?Y%j@6XhZTN|Gj< zkr^6FOr9rRY0c(;(@KY(4^3_7`sZqIR4)i;K8~uHcXgAd%p&dOD!kQtBaJM{?azY5 zC2XIA6O;!sQ8>31LFHSKF56J?rf|Jmjjp^%Rn3D&&kRC9*j^7cTuz6ZYzf>kYe>Bw z@qV*U#Q5Oc%YP|TJuNq6TJzzfu7qw-(>{mU9=x>40mX@0POnc257 zCH1j}Z~eu#hhkO2`TlzW(ADy=W_yw4Ickk12)?}N{PRnzawD!|)HH1)p3D)6z86tZORVE+>@6_kK z)J(hMsqp$pyGyznH^i6Yt_aV!Z$ADPgav_9*zRdq_%te?>hQ3=K%5eI!zo!CHF3=Q z3l6vIcua$VI62K&u&OuJvOSfkP+IEibGQFsja^mL55+GR8z5rrr+OMFT5@DDKl)G} z!z+FoLZWHFEas~FBI`yKC5F|a8xY+VM1J~fG}%&gWAtYW@lIV{=Q@(C0)3x}RLPF= zd{fYq9}w-e8S&skXEsB>lR;{qsCOROT(aWoQ2iU7t&?@mpB!_Vg??4W-JwG z4ychBB0oX7NKfUUx>P)p?VgPSbO62{tx5#WoV36OZB$*tS#{G1Q@QIy`94Xe#ks!U zy))!W*h$DEp$$AMN5D=BLg5>zRqnSNj#X(d0^pEeChxYKqt<1>M{dIS#^RJ`J-59H z($X0R!kOiY!g-uqi08)?jvdP7l&p`LDz;#MRNCLLz&#psvsE21iN?~GbWO5^`R`Q{9*@UGl|vi# zMb6nt+A_d_v3}c|ob1@GYCLQU)=m%XLnBf+J>V8g-58N~ikF0qniza}5%$N=C8~#F z(1W8ZnJ5tpUQlHBPJ|EFtuEJ1vvx{o8~C7Y)%ZX=`1S6`ad!PWzpjgs{(}W1y~PLtrvEyzUGV0HYUP?cCA#bl@NU)wv zsOzFp^z>XFh#NteX%=-!{J^l{ou<87QEw4yw=J9Q^1%keUxG>luQnM&Y2y|YnGlsF zU`H;TO33J7Ww&I`uy}B_Kl|ce@04VL)uWvelD{E+U4qeBY-3NsU9I344OU_-Wl?Vy zzYG!T$-Cap+rs``KVZ=dwt)XbRQz)h)=qUzc(|6xw1H}QEzhx0#*!d6_O;kqeJ$&+ zo=HJ<#YwL80|e)qQvC0Wvd`fF?@g+4K2vxx=Jc8$wQ*l-m1xiKvfn1fGZiA2n65xoRANi%f{>-HLEU2)Wgr_YR(U8;DxkqOAC+D%zIX%=TZ` z|0P}^?*PVQ5dj#H50T?OCyj0U{iv=WrV{#{Q5G3Zq|CwQqv{@h^4j2^HNzJJ&5wGm z^KNEM5cu@CF^hc3{s=Sm8@4;QWnAcjeTf-)b&mm*^YXAG)1C-sUw@Z;R-E}cIet0* z?HcY~EoaPU7tI;{KYlpMuN=k?I@!zBacIP_GDM_-Wjbsm?xUuNC;Ut~efGqS8c>ZE zO!JQ6azrJy3MRGRFHKP@Z8E_L)j=gAFJ9{~W+qws1x8Sqes}uy6YTW8&eW{|QG*|% z34)W~o59qT5Gk{eAA&BPIyYI&EXyCBR2C>p(vB{=a#LPwlH|i92z&B7*M8p8Elu|X z40RJNXP0~}ndM_Pc}>bPwaR6VOZ+@EakeospMrwAh9j|gU*4kK7$pIUblT;w`k-Jp zr=@|Ck71lu%j;0?o6kbfRpfF%+lpAnkDB*9&09VVAqz4X9;xOVIv_)SlJU3ALUEJ5 zxAIbea5kW4Wo_~hcf?rCBtZ6biNs63^`4heN>3w9X3f<6UY6+6A6%rn-vMM;O(pd< zm6o)9f9=?oYR7R8HTBEO@c7}Ld{lc(u-oO<4Y2!6&+cQ=h0d>u?+|A`{t``%@w5D_ zCZ@;v<%VqJv3y@Frl`G#-BvWDkG^uKnNyA}%10HZK8?2)CV@Fg!5O!H=$EN%ha2!5 z7lt_bdzPzG^);gJ%%ol9s|)9;l_(E4%C`_>x_CCyZ)UK%cH2JGyJtQVy;5u*d?EQ$ zOyxf8+)Dd`@G;vlKtE9MWM$zmvDo1EF_G)^M#u^^>fi~75>0;Px601A6r+{Utkk_8 zlYWWdhEfvqC3~W5-vWVPK#l!(n83(R4=k{S)xfg9w{j}{z#J_L$tdOY>{i{9|jcqNnM>n5Q@d3F#!j( zGrDZluG`r~R0J@$W#?~H6Vf?VI+tv>jjI~gn-g|P*&pKr-v|VSBQUu2(HbvEd>?1s zhd)z&u@N<8WzC(1zO;}ud@uh>_jz>tj)9zRYB+h;PFo&a z##ck>2|XtA1bSc362sdVghVJnJIBsIHULv$M1>(Ry6`zmmifes5sI7z1w$}}4W!io zk=q}KrgdY!n|Qpk6-;SSW?{}6?9^RCGbOxMaJh0@V`PKG06%*wA-csWW1DJ6h-6*H zs5tN)zf_~tfQm#oe_X@k&-UQds1NI<%_nT_r2C&fwZ#ylZ`2H^C&mJbOM5#8Z_FKq zzciiPv^-sX#66VW0l=S+eY0Nkq7sL_hLy?X4%N_*=jTK>=iwuA{weciDZa)F|C`;z z0bKzJw!Pg|Z!zz$aCR<% zA_@(6*@@Q|gKi{vXUus}j>Pi4h&;@2$4JIAWV&xv@IX8DY{*13geW^C0@@7#)sezN063Qbo`$(J6_JTj{L0Jvmvvx;3o9;&CT-hLms1u_S6`; zZfkJ`?n^0eVS@9;V3;pcoiCxV{Jrg%>RqRZhm9r~kK22ef8?xq>-sP;LSQ6or`CNo<3dd8((-@o&SE|x>KMvkCz}ibPq?F z_4pl(5PcLvm1A+|Q7Uu~+$iW9mMLR{J|ENVbbo#85#<)?LME$`aGSd4Ubs*6xAR9yTu*8jR15)n(>JAXcFP~%yA{G~YdicugM=0NUjjkI(U(z&1kt?sCiCR;KmGEj z`>FR=F$2hR?%gHE0b2_U&VHtK$1crLp)mU4Z|hGNd`gnQKXlJWSn#5;4ct27I71c> z$?#s|X`x>&RTGeuT^*TYN+eeHzWFNVCX;K`XFIOfND+uPiJvpm&Q9yWh)Q4l2PAt} zm6`urF1d0pw(f=s*1q}xbLV|4(+9JGZ!dnOH+l`SaUZXEpSSad_}_)yuXq$Q7^Z^| z^?!e)=gLoPcg`m2_FdV|mc3XpYNed`cMaJ50f;FxcRFhJT_b-=u4>3XAVo5uR_(HwCEQQ*7{%EkeIagFeP38k8V3F|xQXaucrKQVXh{u3pFLN` zJXqN<td&k|z(pbTWlg@kJ^@C#D~2eQZ5Bj~oz zDP?z+*131Hz;D1uewLALE)0&AgWPf%b!pV7?JlCMieh%X~O?^nnYBFefS zFf_(skV(BF#kc+NI#{5Q?A zBcM@xUmD-V8MJ(I!bt26^Q-IEEk?S$U=OTe=z4Vax!+v}NO-Xfi5Ccp?Xk9`m>3h9 zVfhx}wR?Z;EEsP(ir_~!NE=lXvyyRvOLmy$2IpDmj8-3nfu zk|c3MkUN20tP*5X^M#Srd^9S`XZ(;f5M^Qtq_7qWdc~75y+pwYa=U+5czB~xOvR#q zpefuYLVz%}jZ$JsUr@IfuNUZ3M0wxgmuApJi;2Z@udosn6tyI16is1B))0 zDH2V`EB5+~uk$jmbX5Y3wC)&hakPCf1;AG%^E={-j#lJRSF-Sp9Q`h3s~dXLzWlyj z0E_H)jIlUOgb|AW)HNH9e^7;yB3Trj(Hi*->tsn&gX9We*I=RvVskOLZqDHZAvTdb zP+HLwHb)bfcCHLxAmWA)HOrSf4b zL!E&Vb|%Fh6%+a`p1lbdrYVEs&=2 z9REgn%=(g0yRcf1$0Hf0M-Z_K+G2E~qB{aD6kl(XS$}UP1Q7O%S=;yxe{p#yImXw& zT}gXg1ksS2zj~m1o-N492(4d%0XXzQ!hSa^^vb(HYyGqs7Ki_Hf;$17_VfF^S_qFv@Fuf&BQ$W21;N z#f#McU|)x=a=$D7nKbb8@#0jBtxINKUo_>()aC_M&%H>=psL@-q}H|vTP0kkMugGx zNpNKZOYnRUTd9sKU609LWnI&9izgcxR?#`M|ESeVic`z21|fMmgdLsA{^eaqC<4m6 z>!Yut6ZNx_U#2QU^9HQgW(JSQ>^biGB=i5U{vdaf6!YYA&n2m<+MV|P`#a%=k29Uc z2Xf;Q{%{K8>!%65fas)*fw;22;jkagn>6d!lpft0Cjin)DBAqiEPl?^lZ#Dx2EB(= z%c3^*yN4TaTPAJYkX+Y<2Odlu!()OzTp*3!0PeA=%Y|?}avFS>vwV5uj{TkP%$)+JqhUML z5>sorbn;(~7}#8bcH`NNKRq4(UXeZ475zW{P`(BL{-poHd=LJN z^oP5yvU-0<`d|`xG3e|HXuZJ#23R{I=JL>vGn@vbeAD?ttA1zc5<-ZP1@(M%|gjo_2w0PMA4nW#qeKZ{?i>Us}L){Y*40olvs|N zQISkK2msS*+T|!8E?1klFV@`L;(q$ zf!TracTbwWZ8N&-pxEk#B*k+=2|9m?V)KH;n;N^2*}#|h$=xnU#kn|1DF7t!?P zQm$}ZiVeJ6#ovK=$?acKj3f>{=4;F!T4A$yPZU#c{p>62{!P$C1C19Wi)e|&0*6EM zeY}<+lYW2oR4>~IG3c4QkMHfL6vetQHf_SGoyw-Rumrf#y@fp&FB4YRNChUpsS>jLv3Id4=5-P;a_(=Qd?80Rha%m(<9`He7Y>?QTflIlV#Tg2YR zC$3g*5c;;~3C_^M9lP=t#iNUdNE?Ty3(LK5)Fhou4lScKh3547&YszK9{Yjc0JEPj^-ex|1Yu2H2v2uLlgABnm)N; z5g|L{yO;HF+0L9#clC#B>Fzy`4;BkyN}&D5CJPdI7-yf9Y>Et7TVi@cMYolZZty*` zgH!h@>ClX36&(wojF4^f3Ab>sqSNi3Rnq*s>PusC^uX-Q-ZU}rW3sy5GLxjoDqHpL z@qOe^WrB1n!$)87-t~I>?&~ys-r?EDG8~?YQ<_a|BV$B6Ie>$8x#u!;sPx>3_h9+# z3a^iQz*i2pbml3-j> z*Qp&tcYh5Vn#06{x=76XQ-HqQLJI9$`dqp-tk!-mu_cw2~ zWh2np;XV+1t42G$1a}It?=dQ2LGcX$_#F#nwSjTMB+4a(h$DvB72IDXJ1H>5tI8F* z$9bT<3UyyP=UYh0>kdKUO5Mx4(WExOd`XsDjUk?H!{9ny^2&wZ82&oSGk+#za`@Rz zJ99nDoe~+DoA=&Lm1Fc%&nc*D4spv_(YBS&`8F@QC1GWMn+cEx-=Qte4iC*38j8yD zx{HRP>XQp_OrZ#SvmL$wAdc6B-%8*auYZwB)a5bri;qjt$|&pZ%VoV*mr8N`6z#>k zf91x;---RrX^P7@--snD8XVbQmnLS80( zF=q5C^@}DcWx5ZZ<&k-#{&4WO{;{c>-hR5aFQ3z|GRAcwS#(Uta@cye3qhIKpmfbBI5|uadAlF;6Ui1 z{RAvtbmO;g;>xc%8JU=#BhyF1@XD5&goH`_g?0z9H(MWd zXNp28QiS|#d=@oMqY@8-YZh`p%s?>wawAj3Ncj-_pD+~jNX_Jr^X}-&B>d%O47W3* zX1?ev0#sLj;}_t+RiUU7Q+SMFmprww45EcMyPKdh2oge`}tcv;kP zAKwK)hvbAehQF=%9@9J5@!2)k(-pPry~ha=I;)nBDL{WV*yM#$grt3UdsLqg z0-CSR5wLnBgAa!W{UA>mquc!?<7AL{H3Iq5Vz;p)&^_ScIfxaGVH-I*fdp&>;P4}t ze9aIeri6&*5TY7>k42`mw3p7VItB8LX_1S|rEY}c9#(AC1FQEju?=L*nimJ&?S!HZ z{Zj7Ho?ifclltmGFw>FALK_jO6dr5v6B?oC!PTNhurd* zlCgQ=h0918H(hvffWL5%OIC^hW5&MWN8&VQp-D3EBTva=z1W5Z9WKpF_10?ta-bzcQ-C~7iZUkj`QLBY6P-7DJ@Ze8s@4Ug} zoi8DhY+&HdCxVGZUue1)Cna=+X(#!0vE=;yAy5{Akz|U9OO$)6EPMtC=bJHr8sdvD zp=rM--L7CQK+LhoOcUsf!mnJQLVj5RU^Y2f=H(!5Gpn9gV-1H?j-J?@^}A3Og^i$4 zS#S%xM)@MHmhQU?TVdp!jonswRqHj(a{PCgMR^6YBzjo))Uwll^M2R-*87XqDPxZ= zsOj6cd6SPVf-;7G@&kA(Bl z^+PXK_|9s2FtEpueKiOmuPMYnRq;;DvgJ05sv(;t1m z>$Vtc5;EG<*L`%DJwiHvd}i}*Br4`me*frmEm65UZ>*?hwaSxuVo2c&$<8W}T_&+z zhAw-79do6M#~^Wf11TmI70ZCh@xG0o3c`9oWRI08`@(?fZ-Bea5{C+Twvys+?ceM3 zi~gTU8rQLVWNUwPb^8b@Y}fwhgC;O8Wt`rNYmj#FLbZEF#w~8RK#-KOC2?ER8ZvT6 z@{8=Edvh>2Sw$)HjK{c8ZN1}mFr(6sbN+@Dyy{?zblF*oxZ{SYoUVf@yzN<-&=>1? z?a`es=LZWZ53lx=*$Kv+2tRKQz3JT5SQvvY=c1`S4YpGejD8|E0XuxT@nChYCUbZ$ zGfy(2#%s*z7fGcXJ!=>ahm}6l^9MI%tli|t-{$w~96yas$oQ)(leZF20}yV%iLQbS z>*nQAw}u$}7Cv6JYg@*PPU~g}EOGN3upCrQ8O41!z)C**;~C5!XWs)*+nJS)-4Q0ErW~uLHAe`)$MNi-#8$TU-?Ai9KyBfTXHuV4mNoz(SQISnz+)J6W@H72T)tLPyv&y1ct% zQ0ilZ(0AI4|IY6`U0!YP+wtAnj~xelhuF=melHtP_F>dRHF!vEmRkIAe;yTJFcUfQ zi?8f3;dSqptwo7YxRvck;WUKTE1^SO-<7GK1TyuxtG_J8wn@rXG&FhSoS3&q*<*B! z9L|Svio{|k_&mX>+m}&Pn6}X0Vmb1_rxSX~L0;m*xe(MQ);MuTbZX_d=;j=dEa-@s z$nI~Cg~*J%wZ<>|#v;(okSZu&13w=hTyHI@o?f1|(xwzZoSI0UH1|o6CCmk7ZxVN& z3u|q_;n3(K^-w6i%3n<3@4HQo;3I7*S zoZD5R`|Sf6QN=Mx*9ted|4Y`aFr*@}KNtqY)q>?lahqc3cEuNlBbZqB-%!EbXQ@?& z#v|p=$>Zx7V%J|TlyF*gwl-L>-FedF(bs=whSVz<+Y4`76TaXmvz5Od3)n3>9I6zf zSkqlH?9hKe-v2!-gL0uicKQ4{NG>KJmb6Mh2{5`pxdEx!Y==Twapz4qA>CbPZ``r&t@G5MUTYWXg_Cll z<1Y{S0a&AnRfbBq<3$LQn$YfEPF4Gngc3?;_#ftohKNyE4xO#Ep0T!To|5FoQoge^ zU}>ionj?Mx7Quh0IbiKhDBsMtAa6 zbR|N~qgy!TTTO!Y;U`UJVB4=*i6(oTVpu^(8w+|N8O2m&q8T8(I?3Oh4Ip{mBur|W`mH5)&d%^hX+JKfb0i)a_ zmmgSN8UX!3l`ibZYrRB(LO)lsB)4%mQ1UE<7Ja32biELlZ+J}zTk3&ti~f9IbaWji z*g}m>4h&@sy^-QWq5VBD$DL`JA{)lw9n+ zM=ax?Eb|vZ)m9{bo|dls5I!UHbCy4qV@+p@zbkhRr(l>Mq3fLIcUBH2=&|niTjqd` ztUgHiutS1Lm9P$&6r73P4}v?6#f7x{S55xzW994)?IbNPX8Cw%UbPg+r^La)G0gRb zD?6V-mcdA3;g%>wag&Jj_y+FrQz2Q%c$k6wSTK-Y#ZB_jVccWGAdYEHXNbO^sr$!U zq0I|ccUwm;b_q|-FEh~X^w<+-5-Zv#;`PcgAq#L zdvUM(EMvcI+c6oS^!%~-nG);O5kYJJ1`fmp^@1-gf0qV#R~}zpOh+lX+24Hq50fp1 z{b6nR?s)#A+=>1sOUt{HXpGQDgQibk*~6+O9xOh6ag@Y!Bz?&bGz{QQ%+Xdb3LzIWKL z8vk^&aWRHvem~KmXO;rIVTQDMd z?3==yL3>rmrPVjnneC!8t*z*2sMwgtMOdn0V-^1=InZZq*K(Y^Ni?xo6XZtE!U3kJ<81Hu#549t$2!i|q9CWGgo+yOQ z$7`oZLndo>+fJ{nS@GZf=65W{>Muzu5=jT7<`MR@LK1b4Wig~mH&+M7A38I!*tQ)J z&Lqk|_r2nx7sB*F-QINOT6W!Od4KC(d(|!GGG|K;SV2#kD5GGh$gY>VRRZfb=TnlW zFO@TyFdRld9{&7#zI5Ki*)1u>0jGH7Yd`u^l-{03R7`;bekhd6&(~$GChrakDJ{fuAjP*w`02q2zPRTg$4`E0 zU8c5fb+76v5#Nwdwz`ZrE8t1wRb)PYhg zYrvDz8P6t!6k}rW<<5)IpFLg;<^$b_-?3-+n83LQ%Q?QR$Ebvu5Ldm8`|Gh<`&6D9 zfC$H3V3!XJ*kOhtN`yyM;anq3#1d>%Y?%dvH&S}}m@sCw2J3l;A+J2|kzOyD6>d*$ z*9@FqlB6kF8k%O}Uy7%vlLBr-4|sw$X&d`PiKlyt-A~B4wK# z@MS-D3pufcUHVmOeqh<5?;!n-t2|QA9jOxC_ElpcPu%xMFYh;{SVT?V+dnO7!IlWm zD+0SUg4{@fa~oyj|IH^~0G`ld{-Set1QYbfBogE?q-A1awhq2j{qeiOCI6c==6iFB zHYD0Pgc6hPh*e8XM%evmDiLw+K9~?eFy`8Z!tVr*p4p89UPH!CR@=k3%3b26Og{(n zytyPRuDA#O#+lRmt6-#gPVr#WGD@q__zeU+z0$h|x$BVUZ1enAO#Kt5v5^t!-u6=E z;;}RLn_7B|;xO=^9=2aiImbHak7ivHC(sPmrq@a;mRl@o$lhz14cHm7rl8!xv^Fv| zFP~*8uwR^Wh|EtNB2Buvl<+%%>GQU&fmTG_4eI&N^DyY7URxFaG|p6OlJs8ny(?(< znafGbb{mP;bPo>w7g4lpjusn2vdU!%`fl@3+jTmeQteX839(dF=`t-Vq5Nhk7q^t6phrrrt?hUZJx*wq3Tv@Qu9kU)_&@6n(tzSB9`&&uRFLc98TsCzajYv#jSP!UJNP3)0B(b&UGu2aeE za`N_J#gZqD>0Yx?4*(WIu=sM?LqG{n+iibp5Jlc;q~-Ph?oZ0sJmy2!Ty*$rgcOMd zk|nd!1%DAq67?2T+Zs=v%G?vK3ZXH^WmFGCk?7kqigW2QyoqaSH;;vOub-F+!;>bD z93f((LNP-*VNTwnb{XkHR+0R-(76xWjT`>s7)5vYM}0f!MpAM-n*jGr+Zi6qmiW6> zj%-@3PK|!oUW}tS0b`c?w?LD9Af8s}W)NHmR5wj@;gFO z%7wE#V1FhNBxv<%7zH!%XO%z0#An}K_wN}JOFMIHi~-^WVJOm`RHqAEAV z;qMK&u|agUxOKHq@eCMEIacQxiNi`!TXVf}m`OI86~nV5 zN5u2A5yjD7+~y^!`Q@dat((ulQWs{qhJiUe}>YTfXZC`K1Ve_ zNQ;wcTu$$nd`F}M~5l)M}}@49f(zRWTzLO2fiC#VI*-G zEJn&x9fgO+=K>WyivX{GRHqov!+&Ja1LxW0f&tO7FdeUenpURJB$#QO*HBrMQ!D)) zG&TH93cx5}#hxBTuVM5)KF7pr*Z*0@P`-y8wb{ZC^+hkg+uLUwzfl4HN;qeY)^f(a zJ2%xt(SLi({Ja+psDUG9(HCC*wkhQLX<#y&i}!M01VA1FvB-)Z%)wJ7v-X6$KTZn1 zw#3nYMX-+AcssEgF#0ty#Biaz+y!OLIGk5PwVw5-EDn)2Gp=yD(rHYpDq~inb53Ns z+Rqaj$BwKam7H5XWzzRbX^T16r>kiGJiD`@4@iqy4`ENbsOB7) z!Q9DCuefI~_F53cIAso+r3Tu%o;6hE{6DO{Wn7eB`|b@Q-Q6M}-5mlWAfU7$-6bL| zD$UTXgp||>NOwqgcZkvwLkvg^Fx0>>^NjxDf8YDFpErB&x5JBz&$ZUN);hk&ah|IJ zZ*sf!voplMdV;GrH1E|l&ue!QRfS%o<7nD;Qfqlb!c;>-Z8XM-#SB_Yuz6EMJ+m!L z+!0!tC)=F%8SgqbVZC*lOde9ryA2B>aU60eA(AZ72&h>@Z8}q-rmP(ZZ@%N$XKExF zc(OFk=xj*q^L_usml5S}ODT&rHbo;c*)8&w9eIlWNPv>Bplt7Az)7BOh;w6Tr_JDz zg;ivcM<{IXONW^chnz0T`_oyAY--3AK0l)QGw;u|JIC)JVRDn9EF2xi3w|FMf6SbJ z;6NVjC=wBSKPJMDJluOFQd1Z5P(aOQ2DT=1%bhL2&Rt5I}N zZfaUZ*xn&2R`a|e|A$Av;-)3xOdnlsH%)?w`Tjb@v3~-b zo#wS&={FanFs8x)ePYc-7TPr~mJ4qL)}mmm?&}PJ15y+UkKSoHNt3jlgphL}ml#%# z-R&C1UWZ5LJwUq9p?*`B$xA%G`0XL#vqEONOhRirvEafVXrs$FKE#V-I`VY+m*-&* zf#Ds}@Q6rta3|vlt#B%MT#JPhLUX+SGfUd?X9RuBm6=&lZS98g?LE0oO)__eIUA8Q z%faab2H?*C#{DcaA5n?u$i6yDU)_%RG~SC2V0iS7cfY7mv z+J<=^#2wl4X*0q=M_6Z7QfW!v8quHXuFXY}3dfSvTii$7S`gJ2@v=3Pe0>>1#a#D( zSff-D^PXlywYqDOb? z*que2#p8o=e2`Lp@fL6O=~Zr(ZTM{v^ztKuLAi0Em`@${1FXivczT2wik}&q(}h*ycGW%Fte{kgP0G!6HoV^`({we8Zl~g zcR_M_=$r99xMx2y{GSSU?dJ^WQuC8*o9njU%}TCGNg)MS&Q@`LsqT1bgQvP!*53aV zz~Pj(5x63s*>@g!)BIbr4pk zfwwB{mCw#jpqgBNm;jLSl@xbaWpg_U-1GaF$az9l8WQC~^I{K}|dYp9IRp zUkR(Rgi9Xup=*ZBLsxC$N2|lH`w16*mFHg!h5r2f%FW%{uATbD#@ng`=6Ou>>UafD znZGN|D04W6{z-u8+$|P(G6;&htSTaH>%W{ z8>4k$u6R)}z!HD}nutn8HZMfQaM(CPL02eMuqJy*OuJAK)>TpkRmHiXxSln`4 zZc;5<8J9w>Qt@c0CLf-WgVKuzyo>s^xU8ZPo4)bHCDDu|r$jeiTh~MUH=44UcZP}m z6pa_$DF8)WkNQzU!UVinsz<^3Nag0pBHIh!bagSU?ch4NnDkO+;$+dpmsp)iGX@dr zrGYDzpkcrw;l%KFU3%g~!pkh9OzTDy+klTwuJ$u2W>9=>=z`pS!jFUm|Ez1MT zxjn++?;0y(3VFVou#AMuUppt3*)?4hH_KiduO%8Jxri7zZY;3gD-OBxbwH2r!pTP- zp32R>6k0= z;pV}gG2q{Q2%iPL?nMqE0^aaZ4Z}|oYBxRZ55ERiHccnze!$h{qK)e3n2$chgExPE zbn4GbXC@V|th3H=L-pZPu}3p*68UO!N^Oe`!!^U?iOzZklIFt^t9?nI&1t!?5Q5-3 z)2iF^hOl|3GvXY~!Tli$coMK;rDO!h_z`em@AEa@tKo9srtmA6 zf>8|w)cd?dGxLS&1a8Gd7pqt1`P-Mwyu>^KF`Hf&V>q?7l#h&_^+)v!iL+PtPEYbr z?)$V=Y1kPr;n{k6QjhUz?D9)_p1fY(soerbSDs7o^OJz%C07kI1!<`dH=7w31}=0B z7LZP7Zr3xGpX1}I%jhD3rIaMeO&jX8fHVD?m%HBvrSYAmY_?(Sb{elaVIPGgU^ez>7v+DcW@Z74_=Tdp48}e_KaK#gx z?sfh0)l6)AHPiG2VG`jkAI_m8R)_6dGVUDd=o>{0B<=j+aAtng6W_&xz0t~J;8TZ) z-m);dVVaYa6#0?K0s+yf8pb;BW1givO?afSQ}9?;WIOKWXdrb^g#T);rtTci+3P1a znK%La<on)jGrdba1Io(C-+QGe+0Oa;D=}*pHTZwH+O}16s3^rJU|}Am9>tpTD`UWCjN9K z-mkG|cGyTMAai7skzuE{Lo8wGxZSpnR<=l&uUw>|BXrKCGxVdQ)J9}ma+d79&KKhL>qjs;u?zY#$%gh#)a4i=4N5WU}s50%3OZwg8- zrbnMuJV9nmzF$ZF!XPk6q7^(n-ToX=Nv8Ho6z*8`Cf`pyxJ5E3B_<`oP%@x`H64^- z00Ez#k?fe(Q?5p>=*1Eq@$lDD2YGDX!&&0BnU6ja!~Zkx*S^_tjRW@~q!9N=X2(U6 zm}&?Wgr&gRfAKQ(`1^|!W&s15U!0A#%ruuN8$7VEt)Dj;N7nn#6|s2eAD}8}RTm@s z8C3nN*Ug`ji08wDJQdUnDTR=v8y&Cj5S*I7Dcrq~@3jwmpTO6wlixL@ieQJ`$g6Xx zZAnw4sUspJ!{=i+V{FXDT&i#HQT1*Jx8OL@t1GyGgIqFP?_BIj2*P}yA+Z`Z2I%4| z2qH&>tcPQmAWHuGP~n{T{%yuP&&*;uGul~{(2|I~@5;&V!t&IuM-I+BK9J-LB&<{< zOSqC`4qr-%c!QNt;X+uI6^3}Jc;|$RJCmi)63FS4xz%or&>s+Lrs;lXO~$b?DhMYO z;Qx;OvTMpv(rBv3A=+x5{4%*lC~Y$o7q*{J^R+RWu`<tfou<(LAerY~mh zlcns01YzSAsg$ANx|!AnVyX1YI{>fN1U)SOOjV*;}|FVCQkf+VstL$}1&+nd!YSq?>RD3c zlz6(39#YhV**HG>CaCx0cGNCC3y!FjyYx(S-VfKav=d_GzbAd|Mk5UiLaKMRJM<<# zy36?EWuFEVPDqP@SI(7KOMNNyeEfmkrj!Q3Y>H@Ey;XOCTG~9y)FU3``2hn_og+xu zkf6RqfhT5*IJ5j~FvmKYjbkK*DIq}ZvFYJb$OAAmGs5mbdweR;_J}X($}G|b7KE3> z;hVXY5#6QFjpPCIP3hSBL+&x;B;DwoDrr#J9|c5`f1*|OTmuqv^}WYC(db<^e3WGr zc2O(gQkM$()sCy>2+Jb@@Tu-R?mHmiWX#Ure?EL@8nNb;>l~uyrk(~O8m2cOq?_DM+CpxU%1mdB$JPwP@K*aNo#mWj9?XF~ zVTV1jX(XR8va42?3w+0QRJEq$DGkDptuI)Jj`lA*ehyDsr{@Y2p(!Xsx*9*8mEZ_u z9q;PX;fjVm%-lEru`qaf#1l@y8aLYAnju zHy=Fx_=U9`E-!k6(;`7&p2-6ii;y?Au|hCz+px6I`r*nu=)ncKzhC$f3Hj;TfDd`& zZq^C4z~)y$m6aNJ+EP9DPZ&)^vGasVl;^`im2%#-tEhM4`~@Yrof9{^ExLFevFAp1 zY8%_07b|SPvXxj^Y`pSl;eN^PyvELMc5fpp>A*YcBj&p_s=vJY-UGz6&sTb$n?3Wf zc_CJCLZ-J6vQ`T@%rAHfw_&6v6=_sAcu#{{)KkQ?3W=WxgKcC&n(JB#UT!|dmXWt{MP z)KcK&LajVdHG>f3`}>iM+P$9*J($&D=W*yiUEO9g%nZ=U2<%;?B77(8#{_weHm!A=5)3*$ImHEERKsYZ0gayMA*d zLf7m{Mpm!;hY=vsd52G0RUu^JFrpSvdj;$KTHh%j8K*TX0;juJ@^!hf_6QJHl?f!b&D-&OaPg=EL-Gi=JMWv$|Ah=H&$oxr1p1 z`%K>Ndu1J0!xt?rFbFB-rCoo**!z6%$-6*@pjJcvW_b$+-}7(oBXe91`rvHk_6{RA z#j4xG>@GL0Ee1bNHvVi4OTL=2QvINPuXey#7ArrIrD{=)!guNoJrJ#!246MEu?up2Pt* zN)R1FJl#%9F2mnX3J3$}ZYauqY~+cQFdb7!hR-6KSw+5GJ2uF8qPP+%-V^Sr$G~px z8)UA46}DG_cwb`OT|48})mctC{G>|nvs0PIVH3nSkBANHmTsQ9bbWCipDqJW4Sg2x zwwCO#K&|hXd$*U++=^=y)j#^!eGgK;iWAlkO(OMUv7dRF?JDVsiH%3Mt%y2`6BP{4 zNInjvxRpNz>-aEBUOZj!2M$<^Q#aSv;p-5iU>`S$3MSMHrYtIitd!^C{A5V+nre8c zl-yh1*zGqf!>+brWe^ee`n-3qDJ{JP2)s^{tUT%G9h*Fx$}?CRb;t!9n^-J&ZkcE{ zem{iGCE=UpKOth+Be<##7G)2E!1 zh9YgvTNNTbp=?E*gBxyg%vpwI$5^M|ppcqy=*L|lY9K*`Ql73Qdo)t-q*#}mieOtJ z^#A?O_Xtmb%;)GQGRqk{@mqn?pTd)7iSamh?x<_r7Ly}kqv+t}0h zPP>+QQZ|Xu>skP*_CjMV9ixfza|ixXrpzv5(P#O$BzqKXvQK-4b(G$AV$rK@0So9| zImA=nt_a%1k7KF~;59({vJb;WArHQByc70c#Ji=4>d>^uhANq5(0b>(?3GE2-AN5w zE0Q4>+J?Vqv{Tqp8^V`3a9q-T+e=01#$Bb>H=sXF=q))*n^$(iX7v81>-?7M|r!na;;m6qAs)|V|cP2FwG(MLJjdF|X!epZdk#bp{w z$+pVs8kyYviMijEZhEn;W{x;lmzXct;Y9S}V8m!tkuQ^p=bfL$y8tVK8lRp0q{VlOEL?L`G zV+BMD55WI254<)c>nT;$Ua6eW!1I|@zITz3MDJ;HO5Uh!`F#KK+qkq;Y_~b1CeLZY znzMZHB<1h-5S77lq*B~Qdla&qag1HtC>&g0)eq$_5Kz(YVsv=n)Ha31KD$0{jTf>v zCj6xtoh9u050tX#`kyG}^^0o8q2ukVNyYe_bmI&B$3Rj6}$tiO`` zBR>9XDc2PGQ9QvbpJ@xTa6fSxQiacdae94UEYt23kZQ$qSbq4#=kWDGK_QX_VO4Y#* zs*??f0nyqy^*?_}yGaXY1#&hqDxfe3`XuQMsNG!Q8)m*Nx76(xdNDZ%#NeYJcN7_1 z5(W>#pR%-d`NUt9Pt+_3Bo3u;P~7W1*Y6dzQB@pbn}fdT9@#Es;4KK@W7(6XJ$RvY z##EbHC8AhNEkTunvwN0VA{28Q*Q7N$#wWM1a9 zh#<_ty`hRnoVjIBUg+~9N5BMq7IvUs5f~N8<$b9y{M*Yx2Ze1o*zglIx~a8D|2(t?+-Y>daJGYKQ zg#@X9F_D(4^7}x$AC{{{K9)`nVG9fRpUb(E(+fRr=8v_trL|AADg@u=gMSgMqMMRk zB;Z}pwCbEnZdDQPcJy7$r5i0o_DRx2F{~3^+OvVzmUjlnf63B7acgUTsdyzlBfH0k zT!F_^?j9emtIC{|5-2~c-+cw@TN>mnGKCdDCig`@mofG2{3KbxR)1w^A? z%7+x@CzjjOIgr2UuwoZudv{8)i`x~sy@Ib`o`n1UMq|NQy+9Jo>nwTzt6m`3d{QR^CZF_`WVFCVh^V68b3gccq~S$*>qR!EZN!X~)01jL3ZXmDwA zwQa2e`vTrMBtg?`Hzw?|dYKn1&bjq3hsyh#Ly_OyP@Gj{fyOuPQn!kLB_mSAXKPhEX>CGx(uYT4*b(@|;o|`S> za&_#L+Rmkaiu#9P&jzDmbjT)CEL3f)Id9{G^u_YXoyB-Ladf8{IKK$~EO8Z-4 z^g>!rXs&BKolbaEhBJ~`u<_*4U0I5#gdqi7c{54a-+U?`lBJH&mlL8WUN^;94pB_O z`(|jUV{6xt*5S?g%TdWiM`eWI7n=XB^l*qR&+haJDXE-t787>9CFQMlQX`Q zR36%9CcjjptDw@%`Wrm8fbN1>P7dAF6q`fa!s0^Z-j`x52FUud2M@gKoEPM4i}+fo z-I

3cz1(Prz;-l{5{_h2cl3@uc)UDmpEDC`V^SU>oRgPd=TX#XBbaX&f-QZYr=V zPIlkYM;pRmSRJLdce-+1dB$dB9I1i34yXd7D_YULZi^W%01a25mB*aRZB$isj!gRg zUMmj*BB{UTCD`sU#|V~C5LVEMR%hkH1o@k~B1?6%zWo_7zKt%jTKAi}d1y>d6U`2K zh#c+xURKG6ZM%N_^7-kK!MmQiW5Q0UNedWeLnyXWd_}g_J{mn;ZlphN?pBc5@w=={ zPc&>GafDERp?B+%tP3Xk%9uvqLlqp3Iwb@KmsbkL`+}S7QVi0L) zeZMM-yiKP;^*dPcuFQeMP^vzyDJiH=a~ToknufSE3FTM+d(Ol>>oWCzBHB1lWdF*jn2TZdaysI*S*?E?*0ITn8@@`u*E}?R>TJmJygv8&<0Q z@U(CD7!_)n>=G!)o`a`|{egHnDyGwP#m}b#^uEIqEFKSWFI#86KSStWrS=A$`5Xwo znE>^@&gAEo!~D74r3?&WoXlN)*{3)PCicqb@2&-raYp{kdo zqM5w~{3~~Qw)cm%6IH)Jprxx>kgZ90=!ie^gP{*rT#45cBM-2bxz10>(2xB3-L(ug zS09cy>Zk`UUXZWp!j1KDEpz=jI0W1Gg$He)|L7u)D{&LrBeX#>2QmDLi2Ivd)jleq za#XAJG#@~zpuR(=(fO2t!Vb8=0n|LKHL>;vm5!k1Pu-At+k#a_)5vAy zPlDc2>oV8a>)nNUFXHRSclNkyo*O6?vGrBb44xogV(*bSoDG ziH8XkcFYRkiNZK&6h!DLf7BG;ueS9hp5lH!pecsAc*?55y1_jo|7Gat#|JhBl8$fS+$SL z!?!EqoM~-rEAaiLl^()D`=v1pQy-|W#}H4%<~KK6j0}nF*S|0CjoB!Jf09mJ8w3dJ zI3%!VAl!ovr0Tqx1fqG`17hlwBL1yh z*P&x|JTD`HK7ErD>g?|_YRmGCmtCP>m)}kw%meTruDrExegh$2mDfOVq@3EW&llYl zS@EF2`5LK& zvrDTDpyO|BhGN|1LuY{N^5xH|s#pQvX?j?89-Q!{-r~g$P9@1m-^<~&IX&uYA-h=) z;6WAkgB}H`B(@y0OfTBavc`S?{=dLAON0y~y#63CAPQY#RMQsq*@;Svz0k)p{#4xU z%DVuz{Y;ybkpO{bvG9jtVWJLE)u&r;ED26sx>XTeu}(|UM4hh%e-EUe9*q`x_q>MEB8b=8EM zHM{tjKyNB92$vj4VnHr=?kiH?5W2V==+oAYML1-Fz*hr90}TcMH7VxqJPeBLZ>1UUvRHK*JaHrRY zTb%7jrc^sy>|J2dswuZkHzRPQz|5K*D-s|cUq!IAgIjX}#B+u!)0OYv_n*8+wQZf4 zCu9MkO3AnJLxU>cLlLUYZ|5TM{QvP3oNe0Ro*7fJP- zX|=2VzyEm+ZDM7)cg8>*y1?$^y7@ZQYSSCxr!2^jumCQ|lMHEv-!P4v%83muG`Dqo z+;NU@e*Ov}DMj1#RyGBdfWjO=Ym!8$ovDDr@Z=6Sy1JmEr*4u)Mt#Lh|~ z)E)Qh_`C5a#4i69Eb~CK@PFY>mvYt(4lmn&#LWuXhEe+ywl9b5b}ph{)M>l0s2IU3 zGhLUs>H^D`w;Vly7ik-)4s$*&6;9+y;#Xoc}ZZdzRKeNQ#w)zGO!q1 zTP~nN=^ywB4u^&$IeEMg4(~p5pzDm1L%+Uig?N5aqoW9q+vfo}uM@AG0q1!c!12m{ z)a;K@G06zj&i>lN&cvHnv4BrgTz%J%SKRACvO?3rXl$?rT&>k_1%ly@wVVm zJtRuBnm%`%`O0WD%>6CBe7e8zCR9!FD#AM3NTjPiE{Q=oTL-;PUh5{ucGVzlzjnWM zBGO<~x6{+2$0?eICf&m|8TZqH-gBg!8Ue{y8;m?i0im36!n5CDhEQY<+t0 zMhN@QI-+-PCug2RHGjq^JNEp~FiO}i6^1{5qq5KGebP*zp6A*K1c>xfOi5TBi-{8o zryX?kc=Jwi@LYQ_*J+}wS4NmfhU@qrLBC%pw&a%Ks1Q2IK#uC_HMJr%G47^UdC2d@ zq6}HTed@ImT3Y%(tI2VTW12LGc&vr8T>yK(=?~Y~M1WoJ2LPo%^>!C=BEFVU*?$jB zf++ojJ4&0rx_ToGK>cA0b`!pIQJ~tB`T{5Vzal86`i~LRHI{S{Q(ciWt9;T%$yo1S zb^^-nsL|LUwEcn5C_2Nz9mXmrLH1WtBa~%g`fs5gz#jRGDj#M^mb=7{?0jxglC?0{ zsEeRBXr^9@s4f>4?D{j`56lp$Kj@Y$6`dskxBOFXy~N%eQd;UC2F`7$TuCO|#X=+A ztKs1oiX2p_g>VGDF;z#jyx}iwUeE2NSbmA;w$k^=jN>5l>V{0|>~bL*xaFUqH^NGd zzU_qa91(LBw;8(;aiYI#5jvNakIxB>nr4U)5WWc6H?jIB-a-ECR-ge#Q4UT|rwZzR zU5ZWL+QD;2a9pDAVl+%Qt1i)PJt@_-=dG8pYy~s=UQA>uTKPmN34iZj;Isx=5?W~> z5NOrjtNoX1m&RkEH7B%wC>%|Z#A07o(ApPvQh0yPXlKT&l&tJ-L=N!T(R%*<9G{c_ z(7_<^=1$9o*`7+(bksM@s|c_VU-u9H1C4bVp-+y#rzY8j0P^%s!`j;5!VfPGdho!* zDh2z8x*rJdjaLJD=a$&q8Vq~$;&cE?Y$pl%Qv;t2N!yVi*4@jE7w47`t=}#S-`_!v zIvdnuFJ!6T?OjW{-|-8o>(_LuoxuuOavl#;Bv_5*U38XUtQ8iR#zVP1&nd`%SShp9 zHFAD&Jn!*2B=ztC^?G_yFPYP>Z7Q_HjDH%cAq}L`fZ|Dwl0mXwPNHX7kWM_E=%}DE zO%Uc+(GS0Cgz04pT3&CxMGItMrOxta(Y`#vU zMumQ$u7Jw*-j*tSPm|`@hvSv@gEVhV|0ACf^DI*MF)*RxADO%GPn_a`TRt{$3QH*d zcXUF!*d@#<4GI@CiK|%n6P>u67_Q4>euBO=t$j_6MfGr94SqaLbO?SWx?+@si2pA6if?dR zfm`;31g8bR_Mh0CV$d%&aALF2W^quva1d^BmX(iM5Udn^$)fqKGNRq9iga?%wL}~d zruiq_PGUK)z<_ZUYpy`qlM+1cp|EvyrlqlE^SZ7Ul)Po0DUMKR{j zluO>bu&brwYR#i?9p|YP-1OQwrisxIwpFe@Em*+(r&agNa{;u<6GUp-kQy$8zAcao zs3?1cQYGsn=CaYPA0oi2;BciocUJ{Ey1QB^d9>n39-Cs6(r!Nj3weQ)(_Lp)+oR=* zvF3VZ&n9td&|q9tqPz1kG?%zK@H5(igap%~n9(W1aQuBCfB8sS`4Zt1)6e`zVM5|D zUK@S}<}8CndEuR(Nh~OX8p&(o&XG-<;3qMFr^N?9ab1QE0Xh-iM?$Rj@BPS!G^9gyP05nJ=eaTofU zgyh3*fXx7cJwuyT#UJK0hc5dKB%1Gc^w30?#CqfNQm&P-I+dCNNg)WUjm%q;s-Cwc z<2PTIdzJ$K=sUlzkd6YYh9yA66`#&#B#<`l5I*DeD_@dGAcAa##Ksjy-n8(gtCMW> zNoE?adDhQv)t6~z+}s>T|62uf=R`_!oSp70U%lpD82U6zLMVi6!;`=AC0g#IT@Y5h z<*5JMFcvrP1LLUjZtciilvG*$MZfWLme|>iS-l?JH}prUK{+22AA^B)wWN@^iW`bs zJoK7sxS~wH?GTbt>$OZfrVQ^L=4MXZBlhg$`SN4%r588|03uRF+jP&aFRz#wXuqXW zKt{f*KeU&<&8>mX3i5C}nKlZSkw_`o{_X!`3mDnz|Kr1hh^OvPsrAk)=gkZtsxiIt zX~!;CJd((XJ`rjWCainWvh1q-9(P)7IF!6{;7)`+DGGZ&Dk^*znnVliC2grqcwT+= zHe%-a`rs(1oP3``7;b{irB}ztwMvq-)6$jlAc3qSIJAm0>vMx_u)mb&T}Yk>N@bto8pM7pyad zRVcIC+5VC)lPM^S#YWDgr)`>MXJCM9*@Aa6{?Yb&lalsbb^!hlIEj7xFlv9wWhh`c zVY0VFv{wR8+oF5Gd!>14DL9r5SJbv~RQ!+kPU%9?zdJVbZeMnk!es(pw{bx@_1^~j z7-oTh9W;-&m~v%vY+V}i5Nbvk>$(P9it1gx1AT`vuWotUdJ?tMoa&5DAs8aG=+&!? zbowp$uWX-e2FH^mI`_Y`k`FH| z<3DPr3h)DloIDN)d2V^jcR;HF-lTT#k!U5;KW>q}W~`YE#H$opHPmdUZI5H~<^@q~Em{ZDVdxov=V`dvf3dNA+ILaZM&rzD45Tq(@ z2Hjf!WsBqJv;F@HE70wNeM8|(+iIbYFIPH4sj=*9QGHorz6FtnuBdm51$4+Ft zi{v>-{FKv>n>&%WePX7bk*#Kr&DysLbVw(U3ydWB5RX$-hMmAiUzg zYZJnWiInMAG+5)!Ya%!CEe*fY)3jlqW+3#G9mJz2YvH{L`X4R*x{jVSFMf`R920** zWd*Z?51OE(wiHc^U+!aI1Y5w z*li}1UZlOp;)U2R%6W?9RA!UP^S;X1Omnvcj!EEHjEiaYmnT6>2LQj~45?`cBZ`N+ zQa13941U3rVW$M7lHQ2s&w}sx4w-{=fd#8#le3}OCNZcqTP5t~-(JURaKCt`SZ4R~r>o2$i z35&VN4xPkAskgTG(U-wsPtKt2XqRKzr*UuCpzwU@fua8XCHMZ+mvs~Z( zaI)5;+fNGex^Vd^Oj6qcuLbmooJ$V6y(}-PBRyKkO?RZbWQN?!kb3am*&vJZk za5F0Op-$1|;O?{m)rCqBLq}Fn18si-MJaFOhSjg|ur_a`1G+J_-HW%(ahG8W#^?Dh z!*q@M5qUW#+4CpwwtqX-l>JMm1OZ4_eiDgp`lASFgnM6CUF3Ept}%m?5)EVSvSb1W zO4+5d+Q!C{%(3CbS0M5qyScSlI5cG2NAox7NbEHR!^V3y zu2qcKq3uS0jOM=8zW+3u6H7As+Zo`w=7{Yo(=&nO2Ez?AQk#+4c$bi$&*AC3a*G}6 z@>WOfFy0;ScOrUr(XjMW1k?OqD-Jlw=>9nB93aRY%p0&$thd3r3}atQJ&^e(9IcI6 zGi3WPoQw4IGn}iFLt6m_0}y6djdbA5=UxX9E)F5R`& zGz~5**Rd&|)c8dj!^oBU6wIZbfWEe^WwQcXnsY6TZRM9ee_xI7T9i6aqaqi?T7YU%-p zeQU3{;z0ZzU%)~Sv2TYdFQnzpjA2j@3)c^ft;w3O`(O}T*OTl}XG|AdoM#jYFJ7Z7 z18N(rMMepaA6q^;atI9X8STK1wZB{N)``(=Qm1Dub9Uh3Os=G6$yzw7^wj$2G7+<{ z+k=3wr0`x=`4)oL*r-5&P&t+T=$HQ%qQ`+TuBXV=9+jTZ{NGZv)q_1LakeG$$A0lu zv#;BgpjO}`ETJ?_Kr6%>^35N=@kVxlkHN{l=WebLp$qc^V zB-Gh2^0n{>=N8W2C0bU}2VE>DI+6zJrD#}XSIcrv;7wF9;nmIeJih?i+*eu$ zV}65Sm6aGYv``zxVS7gNej0p`lUDQYD}a!*=x{*Z#$)zK!=@RtK}h{Vk&p4S0PVkg z)j=nPs(yK4blhK4_aw%b`c%I3%FF3%|4u^ebL8xbyat?Yyelw*tIa3|GIV23)C8nu zyruS3(9Z>JnpUB+>Lw?&=4Ufb4>{eBH>S6pexD+9~1h9vtMTX?6FsNQBJB*{vG`X9kM2^dVMK8 zLffcD5VVbYB5=Oqc9mAm{xF2aTqE#(Wq*Wnm^yO`Z_qDC^y`e5w-YHtTi7b%-;KY~ z_97l4rav#B!+A{qBaQcYejBH?RwqF83;lHU@!scVDb547Qym&eEplfq%nk|B^@1rBPLl?rbN)O4iu>M=e)L|%J5PlmdabLuCadpi&(pFN zyrD>|b+>7I-ZS(RO#0Ny5aw@xLHv53RvM_+uLC$In;fxHO5fZ%bIl&-h=Bp9Iyb>HHY=TgXFaA~jOBa>8njYs zYCG$V!g`>wiFC2o|EB)Q?fy;u7nlE&`j2q=OM2tx@Sezm>=yOjkH$f~A+E3aGzTw_e>Zt2r^!^(4S|IYz z8LBr3edAAf$2b7KF|aE&ZG>YDLfrXKTI@j#&ucvPlG-XXvbv?K`c%D62fr)XL_3J| zVU1g|vwCgNhYAe@Yc$SZ->uq9u$Hx;qAnMAei#o`h;#;vNprIFt+w4wjdA~e%yvU$ z;*BKyL^!pcc}>*Vi7T8!a};Ai0c`e|rKZE}40cA&uRK>Bz1o`c<(0C@Lh3ZPS9Ey+ zqhNEg;({O7bHM|k#GoBW1qg+iWAU7orf+QY_5iw({aDO5gm)OcvHaD2_PdZkdBOOTk}_u3D^v5u z7t-aPfo_yY3Bb_}mT|^zkJJ9Dyrc9~fg>wk7myk18ewY$H7)aSeHV7_kY<+gB=Uq$ z?Vio@{6rzi(l-}&Owt6OQ6%mT}*0VD-ljH2@^4{rReUVjMh;NRftKYRS!_QV;9aE_OZI?Op* zBmIjJcq9L21n5drU^6-H_NqHre*gkbOv2H>Xa8#pHQi)&@$rRtRra|-lI?S@r$HuJ zXd3@5Dj+7!qjiv|k{6jtmx4n#j^p-)>-C4M{pFK<(=&aBPm_1F?)ZO69-dydPP`(P zrd1sk;ri0@5_V|&9R%L&Bq3=5TGy#&lN@Kg~uHp;u^p)0)m7lxvn%!MrYO?(w%wG@0aid#md?z z(mKh*{bOxPIgcrj4()1Ryvt|vayN#m^p@1?zG;YG^hvd54eEmK0sYiYx{EeE^eC={5M;8c>;t@NS(C*f2_S_SX*ts?fbO26?ZG{?p|Dr z6etvTDPAZJDeh28DNrP(P^1(sZo$21aSaw6f=ftF+CI-(@4MF8XYYNT^L3KRMJAb< z_dUk%KZfq#qXc&>jK9ImTF4)JRsgBD3Z_X_?kZm>@xrHa#a%P&G}mfqe1pQk@x7t2Lm z{$tis#4)ueD@Z)z7o5IJ;fSl?t>;=Z&g6trl*4X6Y zkk;!%EGDmHWQt}gC4<}qn%m(+T=JOw(XpqEI8%BN2UO_}9^v&4k8YzmoOE&(n|nrI zjiD5jMzt?v7>2uX;45n7%`QbsUU>$LI&tNfeoL6o+Sj%FxA6lTk21UP{6;!FavgcT zr3YG;kzf0~tG*0)s5q#|AKH_!&do*PdnhUj=`8o2vGa^Xi}oT0g%$*Bm-l*iQGG2% z3lBJi#y%HKCnZ-r`e{fe&sJ?~D`>GJGiSQC{AkT&FkzJ-_7zP0)t3Il-xA3G(I|od zgrb+jsYNcz`vB0rG=iX=x0^des4{!ZmUZa&%QIh-JQH^sWC`7iV3psJ-? zqEWcOfIgfn z$v|97T>#dDv4DYYQFXTuJ#4mUQX=y+kY?iV-l;dAL~lHm8+H?E8w|L2}V#4~@?( z!nj(2O>OQp-5F==6-m`+5C7GQekM&kRQ5xU8~E&xfx3M*SS3q%wRiwQ6FvGk9Z#*n zVumCEBqAQ*s4$&&C87LwPnkB2zU`3Tr+tVBCXZo@IN$)fkE%AC^oGtdnLFCipRYtP zglD=B#3WuY6|t4RdNL2Aq;Y$yHfuWPGI*J*G2nurt$=gbm7t0WBT-&B7q{bqE6t3y zc&M{14HeMZsy}3%HhfOLaM#JwfM*Ol3G|LZ&j@ z>d(c@sw%?T?tXttdnyUK~^H$3nN3;jI1rLMT9@L#boFquxOGDgFn8KUDCax z7H>L_p#Bw+{}wfgKWmZ0^Vg{txGtzQ1M^`191Hr@Q8s`0+yUAmaOH z=MA1d_zX<0`a?Q{K3z~Xy28^mra^Cwj}Vqc&%jo*6w@Iw-eebDtGg8bJP_zu@a=$u z$^2tc--kP#@jYBoi=b$~S6x>I!Ng^nxh0Lw;a7p$P%rV$6@@GH6~Ctahk?gcZ5Lal z_28#O=Ef$z=9y?64i-vTGh>_{T}gC!i2a{24oh40KWqmP1g85g#>O-~lso}N$YhV> zFvNdLb!ZJ5YIX4c;J0QO@UKA;sdv5>y|7VUm6t>y;`c_t0u$NZ-?uE{u2p&`^qfh1 zE>5>>#XsV1<+tQ=$MQ#VdAzD_h6F>jBa^;yk0ukm(x%bDP3ydTrJC3AOmD!@A+ZLt zd8IOyk~IB)ngxjb{9|4iuT!!G?~Bqt50&cU;Ag(qCx6tJ#DUl`ma7!d_HmVYU^YHP zg+8y-B%LRV*AI{KQjR#>_Eg{4r2i8ydtBBr8)K1U)VPTucEv2ue*{c8t6g(sY3E$C zT?%b^YrKObhW<5kgQ4rFcE@UOx_I}aefZ7$r{Ve5bc<4FC3uz2R(724SFx>cYjUMV zZIlu1Efmgdfz=25(Ghd?!rjy-pS0vBf5;E#x+VU!KgA>e4{G1!54F!;)2NdDzoPb~ zk<@+xE_$kyH)-0hl|7f!VEm?`MBvPQ<44u?FDE)(zMQchGdKmViZ*x!ZAP9I%otP? z!7rcpa{@h5U6?21D$V{-`k7PzQ2IV`No7_+-oK+Cyj-Ly{$xM!kN}iP-J^WL`<#hq zS*N$22E)Y^|LZUZLGm>U(|Fny9^)vkXV4ahxjZ+5m-=Lrc+xdBJdN&;RAS85m3|Cb zq}jCl1J)6yPH1P~caUe-{g!7QhmUT zefn;@Cxkr`@8Kfq!IX=2b>fviC(@JGIdB|;yk{PxRL)?h^`aa7jr;%XL*o7|xN7sv zB!4^mVLC&5>aK}1HNI{oK&)yROct(^;)xb7jEoUioopNsCTVr{6xwR@zb7_;a~kEk zthQD>C7Fg*_9sP`dQ(sQp()qC4F!+Qpi7;~^6mWwTCR#Gn@N8mM~W?4z8#Rwe2~0} z*5E_}#>W{x`h@?^)Jrp1Po}%P3tDSmRnC3QC;dC2p}TI=#VPOs(jH)XDh zTssm#&ysZHMgKYU>!Kr#k*IF?9U;P?8y-W3NXs6ep-6r){X@Ly^I4nO^@#0UjBNZD zKjvmnF72NN?#9~ytR&B)7dc1mJ#wOEr)JoQ!irSOYZNoL*Y9>UQU%1_nj7p66@5rGIzj{YLPyecIb; zI9tvC|}o|RTo<^qjEbvs#im{$%saEHpkU*W`nT5o}V!37G0TDc^UuJi^O69~?u zldFpfDih>AU#m#n)s<-0Tpt7_fUtDB?I$6+q{MqGMeipS!`_-5#&P_yz(^srj2zcQl&6yy)zeivm2GRf_{8 zB5paIIQja^-x}42pqRRGtPUsd-w=n9Ucxqd`FV3Aka-)B_xxki1C1~&GjrN-4y-uo z9OL9BVD0DE;#V)w3tfrc|BW1I%bV12*K#96YnD+EN-{sKvlmSGVE4;A7B5uN66E@M z2+Z1(50rMJgW$-Fh8tC6Mnh&R zd;!`4-qHq+0?QxQiGiZ-b6s?ey%~mg!@SmpW%R(?4M?iso#k530Ie=E*w*DxLMasQ z@t?2++g`ydUYeB@D{1`)SBato!UANnK5n1V#g`S?H0xjK>bkK&ren*0|-DyIZ|7g)8(Oz#WdgHh=2S_jQ!0{ z@|R#Z7T2PZ1NmykUPgBs;QsVOOtJMzaQDg>#|pqu!Y5=EdmDzI*PpZ8MfdGMdW~!b zYYgIhS6zMa*NO_n!psGy^`Hr_^Mvk&=0u<)4%0=GwcLpKv^R#nn=;Ht(HJI19++Cm z*8eAvVGH4S{B(6e^0f6BWCM@7Yd*>gP0c$Gv7CZDJfu2onQNLe`c4@^j@vi)M!p^m z9YrwO>Mhh%1hXdb)<55_YB0Hep>3oyPHK1bkdlg7GoVfc zH$5-)@ilB3G7|^mgD=xJ23|{8b4g91l?^f1D&u{ab*vyC6ZS2+K4G8la}N$%}QC3uHU4OyCU>=-QB zLI{AvNVZ6VejrqW5o8r*!{d@s)5nW9AGVtx4(|X5M3`@~u6Yvcgapd&{eqHiHokJ6 zqly0F+=nm-=lqFjUwp1fx8FEeVtr^7iI$SOfjz5d_R&JwisQ{)n8=8>nTlZ{LwCX* zBX7=5-_LcbBc5or4QnEvo38IfF9;|C&qZhAJj>A^X68|K-zG@*8Bk{xjZH$r*M?+pb2vAP-LA!F(9K%w z!qdljLIu9qNw$=j1)M93PaOCEXhK^GETC8AY!Tr4YW9>z2owF@iC_J0L|poy|4xYR zD=3Hzz`4X1e%J%7;e)Rjxy6@yHXTTas}>W-1k||~mNAbOLkPg?`n||tO=hh_g=Uk$ zpW*GMc|}Vv)uhQ6uQRYY5I44glf$Bmk8eh0?#Z8+vkoqf-e+hy_8-(D1>^3S)m4m#87B0bMq=L``lF^BNyZ`HLS?^mX`1-G(FcRDf;gH_$34$>9|b8&r-eo=eO?FFEZlf zB08=3DPl0cBKzbianU0>#g%mL?bpYU2XXrt!uR-y0my?^{Er9?09n^U6v&r&#eTXS z?g9QfFHsS7+L9Ii>pUwO#uB(7)Dd|e`UZjgzx`?q1sG@ybY=hhXECVLt08>wI~!a2 zzObmYT`+sOvU5EPLt^LLF}wLzNy$hI?;xO7h$1L#@3@@|abNT0csSZSFQUTB;A73H zn^+OpPMh5YJzuLPot=#@y1AM<-VF|spwo5;Z~cVPy#0bA#WI2wiIgA8UVI(g>C$3< zbMz38W}4QCoxeYlT2niJ%U=R_owgcR*~zIq!rVrTS0HC39JW2hu2qwtK(G?_LFge{ zirD9G{5Z`d_MN+&;{uz?hD0rV#GMe|_j8sZ3w#lWr)M>lXJdk#Cm1qGkqJlP>Rq#+9;y6f54A?`AOmU5f6nWHOhsWG2 zzHe-bSLBX96>q1N8!qif>`8F(i^c&m>E~`kxE)p3#|CRl=#U87o^Ya6?3lloryxpe zt|5hIYtH`YpljnUPoML}a5ae50B}`)J#`Z-`Aw(y9`7_DvB$h-e!Tcu=lz09rYMzw ziy(v8lK3aDT?wdfPw*2Z(2k{#^m$NlBlAl(14r4I?*(|f=v;(T<>8-$#)_%W9#65% z11xsmjI1k+SX?d66%@|4rX;pM7%Zo7R(|WwOEj54w@3ugJ`5k(i@(rQfTi6$O&QKc z5Fdr9vnz=)7rRC7E|eS78yqO_>FY;qFkgvVb!hO@`XIW!v{j-CRSD%<8azm;d= zy4k=Q`8UV5&TVA*W4qKEn;$6Rqhwn821u#E zM97S3pAXocrm;)sUUHecL|c&0>grPF zi#ZjvGhgvd_$Ja~6$U4>eazDiY{O%led6fXSz?%aY~qx3n|UW;f6X%gEcH%Xch$n@JuG-8ncFAiKqKU6) zt0Yu&cwnR-uJq~mvzm8@3%;upV2v=hpbJdbutRLJ&3Q@^GLy8zB^RcqpaWa$8-L#o zvV*H%$9q>B6eo}&)@+FI#L}@fiWkw6+@EvW$cs`P3z4uI5uB8Uyy6KR-RKuap2`r^ zVg#iGL|?ogfzrol4Z5_uWJIEwZ2F28O}KZPz_n&Lhgm~=blagYJsTsuX#2&aA_9eG z7T75ReSj+=3SJV2uFiPesAt{-yEC(lON$|9VfnT1D-$JJFt$@G*QnS6vTxBxR|wgK z38{tK@U5h8F_T?-X0wq~c0M>mp2%2AkK@@D*CIn)TYFnP8D&B#`xDd;p1gt@&t9P= zc$4c+HN6qz%ZRBIAx((c;UPQa@uQEp65TDAGk%O0^LmNWIZTt3!%-gAMoYJZEK1J3 zlSdXMdld~ZW9yL6Y3sc?y1_d)dF`qIvdC|K$-?~$+B2$XF*IyObK>a9n zoIGIG6JbMXNw#>)W^H;9Loyhg{Mb*d05K~05GNti@{#qZANmU<`uufC=tO4jG1$W< z6#9S{*q)dj_FyySUWXLUdB)T}dQRyLr08DKAn-flUhnLp;Wfb4SCXI=%EXcG>)v7+ zS)o*^V+ZM-OO)(V^)J^w{gxuk9LYwESa8Y4tl+iU2}a3jRzlqPS7?v8y4uw4u4%i` zDKV}C+5~aJ@-$FezCz`71OjtRFABO2I{Z~dRt_sVqKm2WH+VOrj%N+P(Dh3Gd9U1_ zkd`u<{FRre**OE)I#}Z>VO(S$FwyGr0y<_tfHz^YM%4bm3=7EbQvwgkHHX ztJ{Qg?&XSgPsgIMOTuDn%kvXK3=#p4gvsF;qnE6mtiTmZYdJ5a>mMmp!K&+y%5FUn zxi6MMRq6uuBUT}{=s&gxPzqJHbTRddqX-kV7;mp+Sk$;q);ojwa(>od;KE#F4cMJ6 zY9>O1Xbaecu1gfxbk=^p#Nr zqXMXDzvMqWCo59hvPvYDuz3Gdgu?j6lOP9iExowm;Rin3ll~mAw5r^AJ6W8|SL0r6 zvDF`F7-XVQ>I$nxbf~mzi#s`RyucO&?b}*#3&_tbaf#~Wi>k(AT)@^1p}FI+t`=5pw2rrdLiy4-??-M%uIVk#yB=jiHm&-dw@FqCegNe z>LaNtik@3^=u&&&@xGf<*A87L;xm~jEMH1Ke0i7)l!5RW=Ui?3_ieH@Xq4IesayG? zer3iPKTX`Od%oGvrKLpFcn)B{p%We`WHZoz^!bKwH80H7dE(V)?BVpTb73~IPi;*E zZM=1#@TjER&AI#0^n0}N$jTCRC;02)gjrp@JhERi8UXMUf8|E-l^IB4_?Z^_euf}KFvzB`NA4pp z;iWLjpz09;w;249CKiuBCww!gNuH#V0)5qpe@o922^9@_kYfSO-aKPGEOC2jyDs~F z9qe|8N~5m{3s49|JTf=-)#q^2 z=N6_?o{MPA;3Q@!D#7lX6e4uRRg`YcM532B^Qs*ff2Ji6LC>s)dcMX8Kiawf$Z5t6 z7p`EVPeSJzk$j+OA-m%7y8qk7T5(UUq+N?yW1gWHNV!KpN=}6flys@w#{`H2gnM|aeAXxP&J2fU)C4pbL+wkt>gn@8H z>WZIhTLohY)=m989pVJ?b_l$4&04JtIYQq371mA^LE$d_PB*Sty28?M<1q3oh|Iv- zQa#zKM}X`gM|khz`~&2pq{#2POugVU`UnqOY`k;$diPjgw4?8aw$hRx5%R%7?5LCG zhn-g)AZ;8Jc?XxL;j32xzTkk49b0sq_7N`u4^+KNxo!_MQ#D|_GEO`$QT?EJEB466 z-1SAqn_0>n#PiQcgWY@XtmUR*#Qs+uz>LjYMXPK3l4TA>xjoKH+> zrCq)2IvW<>6sihv%WO=R2DbO9L^!!{JdcA}=yLgb&Aer|TV8rGvCU{R(;6vLuDGf3 zz@Z;oi7f)hEL+$3tiCHFJC%8o*iNO0KD_K)J&Ol%6%_~Kj8-plkQ<(OZS{bd7#dko zbfc8nSMn&-p<}IzRD{R!j(GSFQdhpX>vF>ZF?AZ5j$~cC)sFnzeb|niAZO)LdKg)K z^jwoc;0A|jX`|@6qc%us454B+CRe9>yd8Md%c?x>kFrmFHNHnA*P7)7`kshmE{n>l zEl;eiKYO5R^@+R<2Y-B{o$3`Va8*E(g*~$&D|RovJ#p7;&3D8*6^kGOWl>C{q8vZnm0;@X7#O zDJiFZ;Dt>rm~7sE-$4-H-QJe~vdUf(YkImvW!lB*jLJQFJ^nl!BdMqMg&^|#lGSd; z&(>2kcCC+TsqIMKEt$hNzu*Y94;jE6A{qdRhOQI#fY60**7HE)k11GRV>|v}l)0lJ zNdRJeZ-f9Dk@uh|QG*n9z~E6xkSLuccNe8?4?fQ*Fd!6~GP{|3GKoyJ0PS5#d&6sr zESU-b;tDEGls_4+YgUc@t1fD41vDQX22ElvV)c)vY0+@wiGMc-{; zj*=CBUFnmCEvb|of|{FKG0Gbix=Hy>m8<*gtgvSP{^4kS!Dr+-QIfKVQrJSm(-n8H zJ@;Geblz_XGzFXI=vAjDgs}4Sr-`0src$uYxp*hzkE33|wtIqt;#XaG)Hp+Yt9^E= zdj8d49>dGNTWnJ9c!;<@^|0~^i+zF2mq5wja-w=!G7tg$7ah%+8T;)|0mpus$vexA zNouzIg+8jgs_7-^4L5YgkS&!A3dqL7+iS70i`+^&Xo^Sdd)%TD|gO z$ZNAXr;0Q$@@j_a1JimQCvuWZRrugoJj%r{xI_SFEc0t2{aHSB3C^l_{daFn?Yd5O zsJ3WGAKneygb?B5q&H8w@oCg!nONYkg_N=sH56p6hmQZmTaR>_8A!3F+Q#}zw{-=x zzF{UtIDH<=!_mrO#w!zRhLxjHWeyOl8orLI$o4QU%uFh`Sk9{zJ6}@YzeiBH(HN#~ zB7EekE?%J(u@L=Cx}M;fhUV}tXPpS|_XDL!&2s=s{%!$>i346Z zIqehr@al(Lm&7f{0iB!{iVYM&($}m$=M+f1+93lMJNpBx!Pu!fc zZ$)6bw#FrMdnxB6efQ4BG$SM%=?0r38g*R)v%mR#ItaX4HQb>Ij4fZEL-V0&%)8OkJd&-Ll!o7;s(` z=v2{Jtg+XV9)HigaOuC^|LiI9?mQe5^#jyOByt`+H9(NA`LP|7?e@MAS#50UalWBu zFXo_JcB3B!8iIKWrd|(!W8a5vJmTq(di>nzDF4`Ld&b+zt)thJ%NT1pp7(K5j3_)& zxftwBx6Jb z72k8FpD*I3H?mIZ?%(_tbXPKtJIk0?AhXS>6&i_SKqj%r%OqEM0L~!wPf!VS->#qw z0k8Lk5UZt+#Y-RDV95*mEpID6Xs0|kbC!H2@wI{KQ451J+;7cDu+VkkZzYgOrhfVH zlxhCcQ#!tsAbc#)LLI&`wDt`;^zz>ot! z61r`}ZMMEVGo0LM>@Pj{U65>9e7?uIxm|-xPT3*h0Xl>Ac&L4vD*4-pS%sJ87>7SO zgiR>k6G09iOVdd-^`8?V9uBPndXnui#*{frew88@S0#l|1Vv5FeDbg+ZD+M6T(yp| z{Paf`ED53$&!YVy_8fdAT);1dA0SffwL2qubcu;f8IfLD(e}@}na3~T!VsW8DS)!v zqX}$yDqLJWiABnJ{sNvKwMY!pJGdvl`!oC(?a$EFq_oR#P;(4F0*Vs(|Bt%&zZVYi zBd@bbIM1nZF(u7)?>FR5$B)k`@DfsftBmN1R9}A=9RH+(nQA{;8Q<5t0U-F^%iR*< z-^&(FfsJ0g2+p}aqezTEXPfHQGf9|q)l{H}V2GMDOpYH4-nncPd-&_^`&lN)kzQC5 zc=6rIA=s?BR(C$MSAs_SZx}@W64w{1ea&WZ`^YP21j{}NpHtID^7OOIxI^&@Zp@Tu z_qYiD>vwM2emEf0PX&0*Ma~o^todA(NLZ^Pmha(zDvQ|_PZX)Lg66A}rlu850jD>^ zTm?8n`G4_}U|$J>DuY#cK8^;CFHa?D2EW>MaDFLx@*TpH&3{*+MRRykSqZk;#V>~27Dnr5dqF9dC!XKZtqZf} za0+yP+-xuYrKPNX(}lJLavnj$>G9oY#wQ*GYPaUz$F?2`e8VHf>Sywt_x60clrVpL zZr?G;X+?8Stc4c0TOx_T?T1cAZa_Uhs_cx7DY$9XR-5j8XssFQ_tXw~=mOzBXIqVY zy`$NP-uD=goMc*9Ay&*CQ*kBK*cXa5Ovwm$r0_*G)BH)!Q8G4UMae zR=#ywYjYBR!8^K&1AZ1@W6}b(WxI)oI7(bxTgo`1^|3MS>mJpj26Sj&*M zK=H`B(kcG-H`0QS&~t_&^ZK}d?iLQ`2-#cJiIIO%Kf?OuI3Q*%g7C(Meb;p$XS-Fh zq*r1C5CI~;K?g;k2AY_J--1)mx53CIz%85XsCb+rQUy@-niKY4AM2P+IlI;=cEc~X z`+_2vkPxiXnrTownbh>w+4k_2AnhdXb2yE5Hhxp;b+NC)>uqmwsfD-NUE&-;&(;yG zyIkgPvz&E8_hIGv$Wi>qjd0oqF(rU} zct1B=!h>~YTfkLL1^w&YQwGnCT^+zJJIIFCsXuBV^ls55>6X^5sipin0TxSVlx1CQ zY8(7^$f&iPJzDywAq)1Q9DPeTfWo6guHVd$MX)THq5HA5W6Z&HDpB|px8*5g3lor1Gl zgE>G(MvTQ5qItO+EYTcoqHU$l{mKFv8QK&xUfD;#ACoA=a4i{+a(rPpIWva_(f z-pQNJoGz$(-XdeMPC0Tm5D#o8W<13muR5epNzFExUH7QPgH%6_N8)I&U=1I{@aMsd z8evGQ=4<%pT_aCzI2xrskT7Ui*M%5Il^Z?=gk$j2g`oD=>42MWXw4KGJ|#vT>%tn& z7~ZM!461%T_ZL*LqP!zJf+C{5*Fjb<8*ze+#Up%|_hnBG|pQ->8^H!DhLX5KM= zgD(C$4qj{n`hW%5>lx`|RmpxQCzg00!`ko{NIV0pL2ZYN>g!44N>2jlzl(dSnc`V^ zVr{+Rv`4K@uDn`)^n~k|@4JoiTA2RX3s^!6=#`Npaf4$qlCT!b@;=g}Xha2Lzf<>P zNwg=S{fqh1LGN)6k;sh9J#10xMo%_WNQ$AILVF%<|D0`Hs#^g}6W&xF0bJeMwC8`T zu`;9EM^3{w7Pj4m=$K#Wxw?#uhmTd|zKqrqb}biIjw}`q z|CDX)r6RC64|wzmv~fnNoRPHWU65%W5Wcp+SP`Jju=-Ivo{a?_EIA`cbEajJEKC*7 zb;UoYhaV#`%}=t>6Rcw$K9+coQ(SA+rT<9B|28Jglz*>O379k!6==rX z1!(B$xH{T(($Uvv5v3aG@<_e*e#KPb^W3&xjnBvAy=0DyM7ZU>ZjapQeT_yh6X^#n zSlR`w^t!)4DJIRR+dtRfl5HV>+yhVb%=#$15aLI#QT=3|Z7tIT8|Oj!4g#;a@#e%| zAf8PH29&x7#Aw%2=uDhani+6AFXhG~d}Wzq5u&^HBV7`r@$n{1_PyhmCGR=y!sP|BM@rJDnmD;{H16E8 zVgE4CsdbBTv^4Ho|MH5#y#nJ5$6_-!gq>PxO*sK1O>cfRD=_l{qd`EgmH1RyX*OUa zCTok$ztIOH#Bm?|ldXuJA?sRIVDr=MH+*=<7$NS+#*kjVSF`@5X_jYAu+It;9+l-r za*-p&9m+yjDYMMIRUQ8Y+t^6A6htspeILt(RY9hSop4sDNb6hRD?RP*-gS@RJ{3Pv z>>hg^*R~+tUQ6i%5HWPseNJvZ2k_Mb5P3cln#l`C*G4pWTD*wl?dLh)i#JLYSW5_4 z6aS-06~q~whrf+I>`l;PP39l{ZJ0*Y_@)oRc-*j2{ahMJQ5lq%u1FY zKWr*&HiV%^cYTtr1E#nUCp&f;F;Hkt$ujq_kr9sGW5%K0U8<`7M9P$~fASpjs)Zy4Uu6W|Xa&gV<546|@*65>UKGncW{zr`mW--vhOA@o`g9 zXpg;y`0-f5xL}13=-MWt0B$KCye!I@jZ)+9drmtfdjtJd3u6oXDF@{R-%LE_gnB=n99!pr@ z#&f&)h=(^m1JpKltK7S$y4yy8;u@> z^mIMf$S7N_3e`f0PFKG>+k5l#V61Es!wtM|9!rX4T*3I68snaOnBTl+KiA4dW_e4% zuE=?XUyytH1z@s#KGmDC=pWJ~KB)*bDPp;GPZen< z@@*K(jV|Et4=6g}a*j*v*8Y)<@Z@HnVc!o38K*pthWM%5|GY!XaZ^o;$55U*cd

  • 3EJ!T_EZIpnUbYv;W-TIzfN+}Wh7Ph-B&Bz*0x2Zm>SYacO{ z$(h`byLo$nu@Of@VxBoIm|u7>Y7U0^@j{ze;9s8`7pWoRTp9G!YDu0CoT^yo24m~D zyX)Mfx30X;Y4N<3i!N z8UnVnEB~_*S zt_50&+-f%*9?*pAyYWXua=%2{87VM%gCl|Gk(D&66~kDjV0C|wa_bk&!he*ew`>f} z;nyB(uapmKN@GfIgdd7lOM5ai zB)`9&^5LwIWyJf|z%K_@R%|zX6&t(=JDd^(7o)31>>#zHhtK=qY~O2WQpPeia`m-$ znCv-cyQlP$ZUiIvu}jC-d!U?=dsJ&nMt^%!YPu3*yRJD|5QKCAY%|N^uj6x4Z1#u*$}WIRnoE z7y~UkWX>3T&`loLDTZ9mdj5b>9+?7Sg8V684iBr#A@fJGNQZ6>=ZfLz4Zt}doXbpc zc)U4kdbTupF6sKLzV`L_>sE}G z^id#Az_Zj^q_o74l#&HXJ#UZN=NxR9s(o!i6y#jNRh0K7-?(wkxmK*ot5a_Va zC@aeX26hK*aL}wsl>AWW7S4LAZ5Y+w!FuH5mZahoFUc=RuHcCb8kuH;G1i6YM+Mt= z^jC|nt(TL2i*$$LpdtUUVhY^_d|h#&a_*x%YctgM;?L%j=BviXQ&Vpz*o=Y4QTm^s z5%vIx^Hn|it3nScu!wKukD6-etH=qY&)0(Vw-Qu{VHpJsO17#S zjLKmyyElB!2Fq1F3DqIZJAc3N(o6Kiqnc~|dgN?hU}7|KwvW6Ul;W;&nJ07eGj&L_ z?JO0e9iu!x2*Ygajh4q8k*^nwJSSAzN5r{Vf?P03l);rt`xU)!qNHzTdWDB)vUY!4 z<=1sf$h$1Jw;C>dH|fnQNb`<(_iOGV(Lt)k2LYG6vs!l|UN32^dLchTvmMpEl77vz zufmenbsq~?5v*YBK!oO|i;h#&isGi2(OPdr5FPwAv-XFGb)LMD)P150U#C;~n!2WXuO;2z~N*_7Ys54O!WqK8b z0iHtzAh)5&&N-a_54hL=UJ&{hlB~rM3OKBrJ!w5K_*H<@O2$QJZ?`@h5FmXn zC8N^4zVVwm>wL?~_-D8HVhkkj(St}!i_pt`#3Fak;e)tN`SV(*Un)^c#6L(G8ZwlY zlk+U!7SZraXp$30%5F^%dVm!l@(Itm2O1bsfy>?NcRg<>bfQS|eoOt=FKy@tyHC=? z+gr`?&Gg6SHvLr@Dk|g-3J=WKe?I;(@d$Bi;*;{~7w&dIFJ4DUo-&bKS*zknMXa5k zY5jCEtl+mk^J(&=?e;Lza_O%>c#;L`X>)&-r~xz0Di`!p`~_NK0U&Bw2m{G>X*tq& zZQo&6v=a_k%A>rwye*3k$JDOx>hK``s(j&z>7rk3t@Y~cH#v6~rk^!Fl^G?O>vKPn zC0MnPoiNFKA%?{1xZpmrz(@P~UVw;TIwr3SSJCrQ15eN;RZ)`4$VaUKJh4YkW=NHY zHom*46G`;7hvxJHB;8t^m`ieXb8l!ylSK=uzpW|RXkEqXh;7RkrLC~ZKK;W=<((5< zqCyc!4T*6vUV|b85cXw~TSF(o$2;|{g_%i?S&WY+-K5CN)8#ilZ5$5SONYT*|1eN2 zfm#+D-Fqs3LA+T`dw&6g5QU;=-6io-6_5LcIYV03fWBlNNqmuIr^F4pomL2X|A64n1<(AsAZw}s^x3&%^=l(fv&M%3 zcKiB_lYi8MRBzcRZqYAqUt)ns$rh>P`(-h#L+~)Ruf%N>x7TE)Bd<@iNTB?*YYxm{mCkNtc20co0ZI1=(tPqwx=~;-Ggs zgpL~}DzK_g;mz|4ABDm^HE>v^w@!?^!g(94e(J}`np6&-H>yP<+~dNIm%U%{eEi5+ zJz+%_n$QDGqxSmpo$9-C;J}TfMT|F(>PZ>>@9vI&7>vUnxff%=ctEfj2T{*L2=VB@ zZ`no~=EMU;5@+Kc1D#?NfZ|F(s}ynss3VlOb*(ahY&(o^jqX&DV=sRy{|*Udc>Dup zsB_tpjaD}~@c~mZko!lZ|9`Eq0r`zsc#b4>4W3Q}co555Zp>h!{K8``Fl&n~)dO!k zU!ovP^Ri<6M(r8XW)^3(B9U7!#ykg6dzj4e{Ab_8zIyuEYf|XWy7`(~{C>47z@D&~#?PlhrqjZ|6IkH* z;k?VyTHK3vAs&5zaSHPlhQU*YxnKlJ@iEg};EWaZ-J|ViQES6%bvq>w=~pGNRFzvoY#BwbJwe( zv$4Txu{uR4-*9qQU|ljt-`l#{tuQ3TUVZw$*A4yti5fQnWN4kpA*Clnryv{t^BVDqzWPlgE zK1S_f8%xUUZW3?pEu)=JhIx=fBU~P!6G1Xjy8Oy#?;VhveQF)gx)1jejL7TS$}Pw> z480DPSdrL@lzqlFd~xDqVB0?O7ioC|sY#BwMU-x?dgd&7f}Hb{^ISQF^}Q%bOZz7} z`-HI5Pw{g0AY_iDqpS|<1x}-*Y~(0GduBavW`%52(7Ly{hjdi86h_?(mY$5JPssB6 zefn-Q!&;VlughogAZhB4qdIHtH>${{@u=mE80RMh09i9r4DW@k0ipUS;=3$`*vycBKO3PuJcaD(0@`txvY2ISaM)pXPysmJbblg7z7jAX}HGr7QD3xmXn2Y;4KhyNX@$7Wsn1-GmHf3V8@#@2PB?vy+JCgzQh_u$5b zKU-DaAM_rB0BKnq-SpGX;rzXB@~`_h0{=LS0C0KL{_D@MYNhyX9j@|G-ys(?O5#~` z$&)7U9ZZS3C@|>1l+lo;-;5vH0P*|q>5-nA3G8YZX@Oz?r+xJsjCbsBfgh@h?>p~M zwd7-ZDBehWHU~QG>nM=Tlf6($mRk7a@-aH!o~Zd$vQYCN?^@b(!GWTAJ6{we-XdVX zm|SVz;*(fv3+m@^wN8dhLuj5Xjv|efR}lmzcBjfgfB!bVSb`5L2WoGpoG8-Hp;LnEG!C6n}` zWJ*1Q!*QtNr3bG@+Ixxrn{}c9J;4OuEjcazJsmx7+yd5g))@G}NwK*TTiZZgpHKt2 zMpT*naL~p<`}T#|W(&Jk7hN6Ge^^%sF4We|myX6|v|i5J3PnlfG!m51&L?L&2OLO? z?2uzBsV*xs1yaKyhd$L)%wGq>zfvAMI#6-jdFwu?*sMa!1{dK^20XB>&?af1x$PXY z8d)_#sVQ*z@*`%+>FtOnbKdn`Meqmew-sVx?&Ue(5~t4ltxrP~hs2qhJf79F^Z-=1 z*lPw~m{A(YWO?xCB)Wq7$vTIf*IsyN z>4bq1qI;UJ5JYbMbE!{;ApW0scME5kyk6n?_>w1@kls{8&6KD%&s7?LTSih^`(mb( z{u+g_US&b|QcHjGe_c=J8W2e0G+C)V(%rAE`f9r|5%i?MP?6Bjl42ml<2lEp`s*pQ zkY415hwlJ1JgivxEbagZL#5Vc3y%z+wNwp4CiXX(1=CPvyS?{$k$+4l3pO{mVHf(&U4Y8y4aq1J@uoU9KB`tm zJCw))0pWLGeNMJ3VT9~}*`j|ndK4D0$<^2w_oLKf?SM8+0ST@Bveo{pXNDW2`6XMB zKB#t3zY(`#48LgxW&ele6RtgpqMBjIq6{vw)!H)!A(lf7iYSH39_T^Y@DfUqHHyr@ zJ@t@s*+}RnsA~&=ZK|JcXTb=qoj6{+%lRO{czW~8ackK+^R+i?enj5(Jh)Y9^_e+7 z1E_RJV8X$qm;brw%(y;DoDsT?6&9qXJAkt(ytfIbWY?@CJ7YLXy!Bc}$)kF$Whn%A zWwEdUZWSg>Gvno0h*ohTtfTZ_>3cN_EDhGeoX>wPpHc6W70QZO*=>*oHWyXb*2E8f z516n`3VbFolVW}0E=I$c&v#k@hW84>v*u@z1!p#Lg=*X0s7)=D_kJ^k#>PFcSD4=I zLIXq>qXtcmYe7}=U8_B?brdt%5K1u=lmYxZAZIY&4cIIKw2BwHhg z2!hG5LX;Ir>1MP2p+=ds6vrifEz6{HCk9MDOHr*m-|f4fdI)I8ND)zG<4i59MmEZ9 zouotP%%F(Z$T%-KxB%aQLCG|ds6e#+tD*KL6p57}$7dM7**Tp0_Ke#?p@q6RjQlGGcwx+Ck0Et-vs-(n}!d&8AtCOTlTLogkBn}?DytxnOGmx1j0Rcr6Z>Z*s?oi5IJ5q zF`ZZWq_-GeBI-KaBfG^TzAmJ02?5I zqAtQgh?<7ctB{!TpY0OF{3%q~DbhfH$xhU3f&Oi?`yu0~n-)V-*Y8;kZf1T;?xG&r zF%j1z?G2%qwQH$plI|Bs+U5NC%^n#|q+MHRgt%4AUOEmN2qgtSe4)<8B}<2tlg*d8 zeQ&}h@IH5jS;9$oZ3H+H)i@2>pJ$8?esl70pvX#)Z>WjWSUL9Ck;1825MXaQ=2}-H z3+(l?ZJ46JaIqwm(*4x@lvhjRn!!|$&%1$f zQGv`f||H4n{xLc&-v+Sqq4>1x0*lc^;QdjUS}ZQx~rzg1L^be zHC4ZS%C2vAuoT1$TQ`Mg0!DsQI59J<_sc-TH9<^#tT{MF7Lombg6KPVhb5wwqb!weKlX$;iOwGBB5$vr%04ET`Hi~@h z$8qJ|%)NccFW+r}TS_-$z%6dJ;KL}V_~*c>$4l0crq9(V6o@CqQ(hLG|LG*x_T>h8 zr{|C0Zvi+CH7J_82DRAORCsGZ^+C0ngWIW8+5}VJY0V=L*51SuiWR!L-Njbm$er2! z2G%jSB&jfC#kE&^@4d0PE#4+#f9+n`UQPpnJv?4;XXo!N*~Pxr?Fa0(^;{uH@36sZ zR_5J2&CU!o$HJ&9QvL$3QAGk&zGD2KgAPOe6+Aarovrw6PMKaV=tlQ)=T;9`?rcc8 zP(>2|bWs$3(;_1vv2)S8&Otbn5V0yj2m%MTzaJqYJWQ_P{e759fjS5lSa~YtIosq= zGez|*4QWOO)RPWj#^OP#6Mec#tQO;qgb**K@Q!?#X;PV192uCW$T*K*Nk(chU4>mW zVej)mf0o_%#qldR;Z+@Fv666CMi2~08`OUbopxYuZZXEkHaq+DYe#3Qdx-JJevkT( z{T_F2O6!mD$a#eB%Z4Yq1{S`k_L{l=x%i2urx^Q_{&AxhkhNCDA3IBE_ zq)h{0$-c4IYiL2W;2E3V;35R8t^+9nTcW+|og7_Xjx+!c zP*_B-%11c+D$?Sq{@-zNX1=bBGb+LBxG-P{Pp_q#jt?6r(aPygu=#VW zcdFo6rc@g>6uAEr0naFM`-m+5Cjx%M_BR6FZhRka}lENvqWvGczXpcl)$<9 zO`O|_tP@X1#P0k9oG1NT;M`wV-T#{Jned0;z0gW%#pt_utDN?qmCsuPdJ$>fObEg; z4a#$DigRg_^i}PN%h`fC{n|K1EaMri|6^`LI4;MxQ5=(Q775M-(5t+jAJ}i1+VwW-$i{qSlcV^^G%Z= z!PT;MUiTuDbpL$XN{0uUe7`FU3hwzCb|CloonGu}3i7MJX>g5r&_l>@*tm>#+5e=$ zlW?*{diIkcK-qV~#Xwf4=q1%eYl+!laK4JXM*B(-6lzL8lR@-b#p9GvhaZpKP9=y?@Uak>Vy0x50#&`$g2OJ%R_i4=eB>VLt_hns6)Je1VRu5!L5W1pP|OK zzVuL>bgLhfV@{a&Rkc>*8cCJ8OBiLzF3-C7Ho_-wY`#@q@zZrn#{Pp~>`+#atDByS zK$fQP$88qUl5*rRcAzF=n>`Tyen6A%rh)udG=%dBO@9t|mo=9dTpaH>9_T|{vk=@( zUFp#<{<(boa2ctj0n=lbH^S6LFV~YOTIm-N9?^E3#4R#BdcN^@E=2odlp{{&U&wca zDR{hrER*PlqNnht`J^|yi|@+x&~umB!*E4&c3woiktLUvBG~4X^hpspG>lse<{$8H z8E~loe`LTjely_eI#_06t8yEVQ=I{T#`>*cVf0D7pW=Vvxs7Z0n5uKz4`XWLW1Of} z>?iQsHQqGFQs#hbLD;i*`cd=(&NdhuFyYh;lCYv$X1+45HH<#=_y0nKLs(%Ityg4O z#D69{wCK^SQ&kKK2VDLc74aU3GjJUfhjkd4{FxZ>CFEZ|;lJ$p{{Isre&OrDF8G(u z#c6~A*#BFhCn*3UUqPh$IV``1sBkVhn6ocZZjV_`#!}49=MLK&2%~TUw4jP!P`lk; zI)7wazFch+qYLqws_mSROSh-FvFNP|}tUoa%KE}sH+`P_ij4@^D}$c)5F zr8}8ZsZOOm7`6#F=|H#zAt*?(8?s-I@9+Hh{qMyMuB&uWKZm>s8lbzh>6=~o%A6ipz}B0wWzEbp*+_lw#_RPtcul=0FUI)3;}UEsJe6$>`r3mjIiPl&z@ zsjf5Qu89C|bj69MOhsOIJVomU3%EZHr9|RvKP5tXi(tI#&I$xy*7JadumDk`!GzD+ z?CMP{E+`sNJB;uw)g^xoh{YgI2|~PH@~rf2CTAC;A}dyrZBw57w?Pi|#~}qU`uUhD z+K07;6Q#LvFIVc?ikNsS$-7p%owo|&4PF^XWb^BqM)l2;zm%zW`s`k;R}}J!f}CTUl$e4i?xy#v#uGbm5&F#s(2b_if1|7sP!TKI zW3DdTL|hu70=(>^49hX8YG?Jq5_h76f8;GV#rh%bj5w}cV4zFgn}K7AFDWvlHVTQ^ zJGfx%Zdf+p9s5Ds0kESfyOzut|KEHyTG7rQVi6D!`xk`mw>IXDeRCt{r0R>*PrlNz zr5{PEBJYXa&3(nTxB*vLzr*_6cUu|R0}{U7`{~%d#E;WzYAGi!**Cl}UfjJSbYDP? z`##~rvy-9!AvrCqmyq;*?<0Hnfd-b+iLcw$c<7Xoz@nSc{QlD@VvBd9L3lU%mDB|h zI^X88`RVer)=Omcg0;#RVOln)5*qBpr?6!#YzKDsjnVt3+C=vPnihB=K%^ze;QuRq z!Q15Ezojp5T>O>3kTD#ZzHFAEtqCS>^BF>`eAkAj#y-8CdBvI-d_=63O!GrO2z04s zQcH_1N4vH82TlzKT`kvqDPtLffCwRMi?y)E%ct&Njt%R_xbZ&e(SE|+;7%od{DznB z4Mz17&d>*sg1Ar~_nD->C&B1)R(_>n?ojllRQP8}y2Y#hJ(tg=`wdhexKH-4P%rsM zY5|p0zR7N*S^hrRepjAqljVMwO4b;C3R0QgWbN;|5sTz^Bbk*>Pcz~jl|HKQDc2>f zx0cf!HYu%%pS;j6##{icTsN>{4ZCL&-dz!NX{LJn_QD})Y2)|1axImbx!S-31Mc^t zu#JV34nfz^12fPC98Vr0z%ywJlLGkKq6Zp9GT4>RHMa=I#R`r1%xL{Oo zC?qIELC7x*1YfB%6vN^y4?eJqWxgByJYIVp?(ovIJ$ok<0Khb#uu4|g00?z)1Ug)K=x!nsjYsh zE&dxH1m~6RZ37O2yRXrYK7VjtG^CKk;>hCa$%e9!y?fyJ@p0gb_8`);Z=^KR=^w<4 zn7dc|(DV!*)^D0!l--WUE8Npps?i)vOGko8wUsc`CsT|qdz^d(kHe?Wt4E2}GSPCY z@jpntj4*{$Ci}SLtpoW>97L+|flQv%ivgCBLd^ol?0tmjeqrtn%E54tEThzskGAUi z`cX@YnkF7<7i~kB4f8KQgcxLwXED}z<*%`dL36`FPJZobC7Y;5$V+$;?E+ZNv%p1j z8ht%mv9cytmg}=AkpVRKhR8+0A9n4cJATB4R^+%Jo`{A6*o4fv`7C=fQWqS*Ca)FI z_noF^_f)lNCto!Yjw9K&=58j9rwqRGGIs8B4WAv;Y=iZpG^yhvKPRMK@t1ep#5GbY zXJ%t1O>x|{SnhLU3OhMiZut43ZoV3i4u%5R;234r<`yp9MNZ=}(yKzZXG9)#vR%yO z-}aIC%74aR0L@1Sa>lq!Lz{RPj*F6_-ria*x8B9YqI;scMv$Cgvk+?f7lp_N%WrnQ zd`f_L%>ls)jSyDMG9_WB9mJ*lUUBP%qw>S|FMwtHOR=sV5Ec&{K1hPlp@=U+7 zxua7gNna`SWQJRV$NI_hMqbQW_Cn_x?^QkmQ6NLI$a@6#KBZFC0>G+z>jkn@uSG$- zA#+W%iw==LEEJu69x2uE6kg>PI6>X zQ%t_1!vOC!QB&U0uP31lZDR{oTyZA)4R6o6;bu9E` z=}5qmB-Gva;ow{T;p#m42dKAO&q432k0f{Je_r!>+~G449+mF^DVxhrWU|_@%=JGq zZpo+yamP|+G1H^s|9<4v50yWtv8BhC6y2YED>`>+=@Rf(mGGn z`q+SrZV8zgC{4f0Qa!t%h79-=-8y^DMQf#@g#-zo@(E(UF}4svehMrtix8M%@*cJ5 zq{-i%uU;LQnpd(i`vZ&Lb%k%1tEO^7+!knwIw@wgPdU*uvZ9SYUP-oir)lbPtz<_6 z+B}Edrg%_5+dJf#HrPETz!J%QX#aMDo;QW zj>=9Q*wzCL^>S!Wz_fdoR6;I8Tn${YO{*71G`Do?sy)@=@b0tIT0d3&*oY<3;o81q zX&&Hp6PaT6(vu*6#i1`z7<(jO={7?!I_i$cNp^AjlUej##LDsM>qp*tM9bpk>+n3# zKE&4+X56V^h^O1m5$dq3ulvQ-ED|2j-H_uU9@>3`^|coWog188oXjHC>jWCg1FA6mrC2hR^r{tB~@p7ESb~|?kF;X^6w52 z7&rnt&k0eD8yrtMX7ZlHq2P1AQyx^~?zQ^|pE@w4T)G*Y-nEAoN|J!l>SPzFm|zB~ zRN5X?r{o7cV>J0QVbQnPtM+b(x3x7LO2_tJFFr22b`W_Z={YX-Lwlp%-!m~DHizuh z8MNW!5x_@6{4MtOYSEJC4|EMlr9G@iK*WAByqJWEn}tJ+Cq1(ts9cW(C7<9uVsjr` z_6UoD=~Q~$KjKBMRimN&knezypT%bpA#BrGgUtlHxT!CAqS+Iz^qG99Irdar@ODNS zY2(!zGkZ_>mE_%BUZ(L?K184q>$pyXm3a5sPuSoa(&diQY6U0S!HwxjGo{Y_7+$+j zuIS7Ci779lcG2>6H9>CBnfXzuGZgg+KMbS)kiYU0L7F!dO2vzD*5DIT5&9+Rg?!(j7tO7mRP#d$*< z=wEOciwCkqEr(u79&Aygg{?05k=xtkK`r*I4d;VSN-G06y~O8UhVbw3t?8eyl{=!N zYx*%(A#|%d8_Rh55x>!{ce47aCWJj@JwUXt?j)51?;NX?>T#Od0crve=7$V#;m@B^ zk0(H^cY5GhvZF_EI-XoV4e-DZ0e%>YZ~$h^dIJKaI|9y>iI}yGclQkhsxh@o?Z2uc zPRiQ>I6@=#jOB=07`GQsk}2e4w6>R?;vh;J!b#JZS@m>46iM@a(i`Cx3M+7A7M{pH zQ;)vYWYyKT9{A;qasPRO{2i0r)`{Pq>WSt&@4$~LD`Fb&WX`dmxGZ#q(o;o(X@!^b z)KlbL!7kz=q+rs?xB?99Y(`j0K;boCoeommWd_`VaVjl00vc^cqWBnt32E@2v?4J0 z3USqf)LMVJd!Epgk7@G$bs*xKP=Se>QkkeOugZ^WDkP5;G=;?(QKgD z^*2<;fmGTqXLJ|)y;CfTiZ4SMS>IpqY)Uh4k%WUPBp*kncW(TfR0v5_3f9jRS~i&6 zw)~3ugCbGnkw)~pJ-3X{SU01V#mXF?skhY5tDj5g3nTk=^VWnA$|neD!eqKg4{}P1 zLGDFIg&t<1=yNcNI_dq4cfuK;jS;nlHGonfB&ZGFL{dxnbvWN-Yjf%#mPt4*FCT6CKcegds;{JnH8^dke87HY;L=a zhr#hQ7NZZFRMkdW&7F+7X7U8hO1bxqA&ZMj{2K*YX-) zx_ZTNvhvrm>De186@+L(V!RA2L8fP}B;1hmkwNra@*9HC!~1(8Nh5CRso)eF-J4H# z1DFL*v^*Ho#e-VQP!%2u=O4!7!GpIlp5BvO?+iz$UY(epwQz1x>D*bqEsjDO=yhgP zk+1p`&)UQ=Rq*uW8#bgoQHpp^9M6x4Suro<3jV{O7nJ_B2afuM9IZj|ZCq(e_|AK$ zZ%^DR>^d^*jkOJ2kUm+>jDM_1tPxFh{M1jEiC;&cqWe00NsVblzAClrJ8fc&0cP3H zhe5ImZMHdFyKw{q*)79CBZgG-Jo(*RB;vdlii8;7!*2&Sv-C*cF<6s-oqTJe9det0 z^jjcENUxk8^!e?NdJSFq$QK%ics0fjF!ht z=CP@PTK}HQXfohBoS_XGHWv@J=_Jj7;U!=dMAu zFy_Ph4L=Es<4Hd~V1wW0iYhYa_~N9^ubgk(#ij7wWZQPuM=t(JxVUxXT9@PMsaR-X z9l~HORh$SMvxFx*!9_nz5#LavcRjly1HUl)DO`qjc6Lcp&EYg8k`{KR7k?$OdGLL;I(PmXzV zhRVv8(4^bgO1_y$yNT*oZ}_@h9f{kL>Z@AbVf&@ra2}9LdsODSx|#TUVsF$|9gqcq zr6m5xusxGv@e%W*eW6#y7nJ5>4d|F~9ARqOh6T~^Rdy$Rl2cio0OyRm_UVEqikj&* zm=L~V^+pnsPX+FRIeYMFRkZejsMJfGUX^XPvkZ#PbLFg*7?VBY&U$*%ax12+?X&yI zzX(EeFVi&`nS11o+=PKHF0@nADxY?bB7{z%;L#-l;c~m`K$#W8(9}$?JZ9&3pB3I* z`0WMC-vc^Mz3;AETX5rg&FbfY;J$lAyIRBm-V&30is_r`z~;|neN{zt<-DDuX;FRs zz?)z)Z3ByI?hzcVgsT_stqbev>WrleXl`x#(?~$C=*#xYkZR%!)SZ1TR ztdcby%yR5{H~FyD!@X?1T$qD7MswaRv5hMxBwB8ES+6(smgd{YM76rc`dE=U`-^BF zGNpp4%2sD&Df=ChDd_@SsNhJlZKV^##sH%eiBa*6 zs%ybtFSTrfFvs&6*MS!$lUFr9=va8+^haax&S#gkt{+$)J?j<4J(VErAyL7Xd_2Gb z7mz{wycptyoIE1njn=o++aOsh^SRrS2FMh+xZBMdP53!YWL`f>XYd<$cdE@NKyMTp zxW3Ye(ph3rxXM?J3AnH5g5H1K70b|(3noQ0s)Uj1O@y{?hN`XQ1orid zs>!x1nNF21+E8V1^@^(+l%Q9tv4*HrxXyjaZIFaq5RMxx2KEAF*Mrz5Um5Z33cb^s z$g|WA2<&)lY4l;J^Wpc%VR&%qtqjil+3O+;&LY zE53->owpT9H3kLW+D0}^zQgh`bXyMU!Gq)6U?kSPTfJ@ z;$lO7z;eF(Wh{U>PCN0)x6N^_rT9sHFPx8E_iAaXd8YE_P3|iHRPGo8we zklbe{0x1c3G*3F~-HpaIEc?7(hu<7jYZl);CF*_P}Yh{;up%cDalDdi5u01N^cMddQ ztkC$GyN9E7=(lUX=5;zNAo24&77vc#EHld#!}8rDjYwh7vD5cnDb=NBvX0Tm#K;T# zZLQl)Vt2TBYmEMAn6hyO=);$D`$H&$I+=loU=DQ3)_q#0fg#!1@!;X{yD%qMlwb{r z7WlTIR-R=heh}PaRqP!0l}_=K0p37h)7tdJjNLkTp*h07ovL1l?hPr{1H%gb42PcG zeXN_vU{&SBBi!ql7KSYc``4i-iV>^zKZ0(n%S_X+1$2msx_iX29abp$kcRT?EI9qc z>E^gkD`_*`J`gfiu=lKDFuI{V|k3_~T7?QVzC` z2@;E>r@O)|QUxPa1UYcnc2n)>(FLB1)x0tFOZ-?UAzZ@&qXxN{^}iN>G9|_s5spGT znRJR<()C_b@ws!eg6u+l7oTl#KcR6Y^i&hlwJw&_tUBqB1g;>2R?ppL91a~4oo{FR*x)6nQ|l-(X4rFCj_fPRVGn&Ga)%8 zBIs`;Mx3jDnO4?>Wbm_fRqjNpOefHoXrSrw?cG?;_KfMS-i1!3Rtm!OT_o^YMKryi@qWSBM2vVA z`)R$@&ogRPcfuAZJszv7(W9Upmeen3kPS+x(C8;nMnm|xO@%+^0(nYqrNxWnW#o-< z;@kBKJL&Jk_^B*o5}#?VmHDKSpJSb0n3Gfw4j5-)FEKh-Fk>AWKb4%m6+BdVmG>NC z4Nd_HT}mF)-e!K_(RUgZ37(e+VaB1VjDb2Prr3LM>oc&k{R^P3f_}QxH17%poJJzy z>^C3i_Jed!?TESRb|umjipjsXJY>Cf%%O=(E_6p-;8Ed}zw^)9mdf^fD5@zoi8|YT zvpUBpuCcB*#q{pr;ojGlpsf;rtvBiPMFSM>v?P}`)Jl1poh9En8>*tKLU}lg34M!x zB&>wmwvCLR9MamS;6bD!+J^()RZ!KJXUTo;#!?zZyjWT6YSO*in|!c`)B0)@R{PP} z#fgx3-PDKL-+uzj@YFEwVAX-8*Cl{baXyCLRvpxa07C;Zy;zArlK~Br{>jjvi1T)$ z@5sj1>-z!XL2eDmzw;LQK|$3mcuPFnFCOsoD8!lbDXc(3^ZDJQx)P27c^E2gMXU+) z;1*&Aw&TAl2ZtxS;+A{C;IdztPDr=W{gsy-5|(&;F%;63s)FSJolcII)gyXY!I?PL zKX*hW&aSHY(0<{z@*NDpcEzyRwY%v4BX?iiI(24bW5w#Jzueh%g}flc*K2g|JsNM+ z&8b^LJHw!t&G)pu**vu$Rr_|FM&V?7qP08}rPC|jTyPx$#{^#4>0CursEQVFyAo%H zf5$TbADLG1u*6Xk!bPD}cdSvFRb=bW@I=x`5k-wy%N^E6zw`0&AFnDV*|r-DCpGxG zJ|>5y=Z*x&j~io+Fma^p)zqji@wKT*Rh@i8LAf!1m&5t_e(^L3XNZKu4zm^Yaax`z%B% z=GTk>M+{f>q(=`#+L9)DOGP(l9a2=77`3W&T7JvQXG<{;KBO` z3epl<&P46IOr7~zk}dAfC~W&*|GIL3rob3I^;zydRAf^XMC=%KdFy&sq7tOcMsbzc z7f~><@{SUR`AHFm4V|x7p&)PRDU*5AvIA9iBownG0dDhY*h1pa7jI3IVv$Hp)v^cl zgwg&EL=zlrcqncvNX72QmAt($Yef1Yxrb2{*NwJl+AdU*hP5`**eGFOY$))fWsbc! zwyl=eMuC#OCdnaZdh}%bAZVh_HaK44^po&XtdHm7om!?q8omm8Y~|r-!xrtF`@6NAu%XLq(bPfQ!mNRprNCytsio`nsB-=W&2Fw-MK z!_bPDx|5Pryxv0K;;Ri^C2v>3w-d%s^1H7^I|jcNH&>xnG-Ct>E*^`kv0%s{M|J1f2>mcg(Up%2_XHFcXKPZ+`lc1 zW`M-8*$ZcUa@Z}<BrWWC1{scr2BS}DLCFK)1ng-}pd|Dvm2&j(stBtkp zFw=3Lh#ugF_HLPh)(^(-BI=)|fv|`_6b`c|sN~x^{z#?!>~vIT@X3urDpV`bvTK()n*bmj=TfbeQve2>`%%ma})8o*VNNWLOlvXIOpdULkIg3e> zz@RDygOY^D68&b6fSs%p&<$GM5pw>MaX=x6FW^3-4#mFvo-qRVWJtQQ5z%`Zu-)*O z+6H)9p{Jb3j#A5D^g%F-xYt}TDWHn&{TcJ&k>1Zz&1?F#QcAA+Cb#7=iO(l{jVrXy z^KZPmIF29uF?E`azIBHZf`J|j+9h-93NI8_%a=dyt?0SMRJ9Shq5Pa#G5+cqO=L}1 zh{YHa4)OAth9I2vLMoZJ;uz6NB7HD%TKBUVPNZ^7%Pr?v5aFaZhE!8ccK5uR+&z8w z!fckqX7AEuOE8<-^Ua6k0%^F<`6*5NPh^t(#YZl|`MOySPH>3~>%zV-fI{1>JF+_?mEZtfs(Io{0@BnJejV2GQ8e zDS^0x$-Y{J4F5dd9=fFaMt79>=wBYAE@7upd8Z+#H;dI+ z_0^?y3OEcTGLt0YLOu?P)^cC8ji+fPX+N%JUZnC1`$0ySK)cK$YQwMmee-c7NW?y- zSBdI+3e(TZ{}j*FyF}F3WbKps@-Ex=~zk9GS%iuID7Ge&4MzH^)33oj$vHH=%rqB3%jk7%(J{-X& z{8twE=fD;(is?Pa)dtzFl{>WQ&q^)XIZ*NgB9qJ;9=n;W4#7*MT^`nit9};qEZ`sV z&>@$BKNbF{!Ozxx3K1f#e53D`~F*qMg6ws z0tScY0&<5!yl;HCrMczqr;j^Q;%D^3ghkg#pENBbH(-zI<{xz$PN1GI_K(j!re(P0 zR93N%L!^|}@&#tu-z0#%jwa^DtfnsWRNmdQ%r>cDIPv&wNW7;=dS0)%2bmdNudxw^ z{h09hONpYj+CQ`uCCIvtfTA;Ei^xS)A{LhG_Yhyw?;`ceh7( zweR{G_cYOGHsc^9@}z*tq?Dw8=_mDO@op{PSOCdL0b8*=9&)Ym23$`XvpLqDlz_Tkdu3h=ls)(oo<>BCV&#gU^f0*!mm_6&i?u9v1%9w{lEGF791Eh2!hdq1Dh;#&8fT z7A>sv@?NYkfx(NyO^FV+F3@92d#`{?KMjxuR&}|2jd2z@afC}@=lkKDT}dfjFJx=C zZ;0p)q&1JL)`b(HaGsjH5zruJcGrXk@bEPDBCk7W51g)Qub|FSnOLV1#^lmiZ>K84 zE4nBc<_U{;*$^(+oIq2WqFzD2qybswKzvcnwKvAS5-K;!+M zn`(0CG*EDNeb+;z@%A@Okh28P1m2+$;!H(6I(3z^Oi?bDGTplR`$R&_5r-ecg>k`l z+f(`!FOt1%y5}N7Fem47_bi*LS|(#Lz~}5FfgFs-5sTSe;u);u6b1NoMBygCtn<+CTL{QJvI$2;`6<6F*JKldjHUTR#qIX2qaQ7$2$1@!N!(&$MHSU)t4{h zZv>nJ9p7$GK7fy`*Gv$HS@R?E?c@mO-qfUOt}?Bf-Nu4XS}bTfwe^ePGA8K$8lrS08=o z*qb~!*b3ZMq_=ti-FaN(2>srlRAv!)>1`fzDEO|$_+&Ale$boq7TDE1sItQ<xa z##bVQH*cq^!M2lF;r#TjXe`^et}oTB6aaI`7JqNZ(FWkv`9t2A{Y&16;JXv8fC_iX z!uUXoxa0W<95|`)jbjzn7Qkg-8M*)%Yic#-IKu{j-LQk8CBucJFf6PxRAOBPuBx7h22k^e90es-{eu`7|0`l(q`wp5SV`Q<0vX>V zI0lm=oU}&Nkk}x|!LpbqFwk1-TPQ%Aj*cOowz$NHlYvCuu~c*H0C%Jx(+N~}A{ITw zpZk5cm{(q!^r<3n+{~ViUO4C;z;~}B*qW)tC4fjDj{yd?zsZ9|9+H0CfAosR^YJIM z#@%UC0|VlZt$I%Kn5GA^p+{KR^l?R&YxltS#Bo#PKUTfX@#S7r16lSd`Y}xk@eA=A z;?yzJ^lt)<6s1Jm-^;!{$o#%G{FpO#IZUqtLHs_`9r@}yTY>^-y%_5C@Q$eONt3W1 zhRQ+ZI@QHN;QT!aR(-k}LzW7M)*VmsTIyVYqSU#}ods)$5HUM!G@hQZ=0flB+?wXS%v9b)YuZLo*{L>Lf-*+!fH(-yw$oDG99(lahTcwBaNl#6>MK@ng`$ZWK zzYkQSMGWz)=UhrApUq(mhi^-Yf4jKQLsU9)|5}d2g7VBVZnLI?jqhRU`nuR3d}tt6!`ST^mA5F4NlNgW_niWx z4Ij|Km9049?bbUf?Yp9?L|hgQ4J2O!00ovPEl+Hi#FgFpnDLh{Ca1obwuYz;bUw=I zM#WJ4hc7*SF?J4(O{m}q+V#YJ5>-&pBdK0q)*mq?6>AxHq;Bk{eb1NyENS>wCwcXQ zBS(!9Wu6mC+fw~R^0RMB$uZM~qR?_Qa?&8kM~YWot`7KZ`Y>MA*ZhT$o3Vi10R zDK`oe0s!a-aJe!E&>xc1{HSgf`WwfKbt9kU;U1uGJpud(cq7*WWcjU+`hSi^-6E zAGsyfP_J|3;IV-IVhG}d15EljYy`V^mNWLqo`c!^PLLo7C?&p7{d$?wnclck_cGys zk5%x<=*@P~f-R>|v9aWXZ2c8Cq%}4jp9AS7@90Qr{dck%+ftN8(v1js9W(eSxK$3* zNK{Q_6FPk>@A{d{mCo($Dlne1Tt5K!NPOmz!UyZmb0#8@Xkg?T+qJyKn(~h=ggoA5@OltupAg1 zd+};1WK-wP7@}dRpmwbEo$P(x`XdXD_2B;hEFScT{~;cz#EJba9W2WIt8^eC=sHhR zg9*u}lWpN32evjPTgCS7`Cp3AiAT32JqP$!L$*7oADxU6vG24)rE;?f*XHV;j*(@y z6MupToKh@wk!66oqhqF#61V2#Six{kC4AQ+oZ=>ZH^1NYfOLzxQD_b==<1V5Hu89+ci5nh z^X|&VOCz6KN`tZ z%keIrd_?D&#ivtQUe>7ZGL!g?Uo@zBK1priaNGlyBs6jhCamSG)z+M7$+XDBSHHxO zw4mJvb5Scjtg|LifNPuxRT3kn%JV35P)OsCXNvr?X%RifcKQQ`mh^jQrdT>{;B%ta z$r1~w9BZgA*cwZFFgnt)I_M31H>!p3jFeCx_jj$ z@M>*2$z}HupJE~HXwd9^;$##-B-2+m)IwSvDO>lBoR<4<20ZFg>$V;`kW zthHemWF56F_%BOAlAaalj+kC2GY<_kNbXjvzoZFg@mr3mv;6AQyo%>Jiz(y8am{5! z>z08(GiEJp{}APNiDzMWQy5%cMP}?5rcQ!_M-;NJ=7{Dulx2&rP z3!j}KSNdefeS7Mm3d0Ir?BEX6wR?O;R!Z5yC;Q#%is?x=e=f>q7{jRR_9n5(8NeyC zybH3?=zFz$evU}3toz2yr_1VL0!IR8bP`QFGV2P0H#*A<0l&s)O4_YMn_yH>hERqU z^g&6M&4j!Ws>}hg6R!?Brsf0+pGW=pNAh8-hl_2`TjD9h#ZQ>EQ<`2*R|VGJqCIvV zM>-dKH-@q|l=*zOT}Ji*qAlNViX54b>4YHL(b-qqJ`z3m)17sBsjsh;c%)G_-lyh; z(_qm=ZA&Ce?~l*FL79JWmL{DtrO^F9WFVsN`Hvd!^&5N|-;e#J10gc7bZlL+T@Wga zy?9eIVm=7Lfy~TQRtf}au=$Nn?1i5{^@ZfMIzK`mvej*bqu9E(4iNq1vV6lM0`XYW z_a-0u0vY!#!LDwTus}XP+U>YIrtGtg?c;v?)oQ3Y;#_rJ-0B`7nXj&@q2YrMi_$JT zQF2zncW&--%_fXQch&W)X-W^-pc50+8-BmtVQtxKouueax&4|<#}&LEYVnyDLPm!3 zo-5R2)|ilE@s3F^e1jfCW~!R3^fHk<`LDmK!M%wUIrC#vAd#QJUb04?Hm- zYEf>XveHl*bE-z8;va!tcZA82?s14@zVq)7B1m+Z(Y@kVH%Zk!;lhV(wUT$fsYR8B zrP6pu6GDz%vK8rL=QA13ILX&)xt>TRc^Ss`A_~i{_Ay=u=$(AVgLW(OS{at;uc8+Cc!+yAP z+Z~4lW%ZR1r)oKg(<{=KJcp$8rAnmM^vC#^q+M-~+>zKv4$aD6d8HJd zQS%e$^od5(Pdd*nHw5L@xmMcb4QT*Xlji?c29xP3WbY8GA|Ts3hkVmn!}t*BnjCfd zFQS;dH8Y!H@diqI-ZhsUv676xg5@;+!e2Uu@w$23I$S_Z|6WuUtQmdckhlapVs{B>C(|-_# zP-S)ClOH%$U|WSEamQ0lZpL7~_9w~7?T%3&-F>m*+z7PBHQ(M2kAw>?Fbex%qLEna z3Xi(De>%ngdHLL_j9)wwu(f=MHn@)A8H+qhw4l(A15z>Kw~cEPU@^M_+grRDZelF3 zvriuP&mfBj6+8}LOB+#=9>F0E1jT-=#vJiu<7T=k(Fc18KX)g+v;w4}Zu) zk?o4n%IWnL!Ch+L32qL`Zaqh{|CR{~?Y_=*-p=%;tjT88xO($sCYLUF97Ow$nju&$ zsmzIAQXo02-DgUUwhpIX55!5!?|klqt};x@Nu&<$k0G$6MwXAw<56+R`LsL&G^Bff z#)iI6O1I78$#(UL$SVXEwAqkV1tQr9kq+R&Fg4@Ji&~M@ED>y`{{(}00%J*kI!!Wj zVVRZvIA`$Nk&jci45BYmm1c>!5NMpnVRh}N-N_qTB3=!T85j&Ywv)@WF)E4Z8;K^s z+@=(lC!YM2qt7N0s8fY^1$KWRL5#=%8JLjZTQ3)4&l|BwJJl} z5Qv=KZrk0h+6V^?{C zm^I|kUGfcT97p*+;1RUz)f@A9!Vn5X7_QjYH}^Y>FX-24^ZdfIG`}=3oz!&MRdpkaob8Yr!1P6lVQeM`^YXHY1Wgb*j+im~tVIe%3 z2A{b$lYwjhA>vLu#Qb6)2TU@hugv-6AaEFVPBDvn9-zD`Ic^@Vr&njbQiLuQ@Ru zpTOpA!}?HW%U0S3>Ep$;=Mk}fj%FJLbH;RAM_dj)bg+5-l?A=dhvHnhR^Z5{o*1uW z;GBc2XSrKq_d#PX(cB*ZQ^b^(ohLI`^sTZeq%{U69K^QV8)C$sAsYtK6SgnKV^G)b zApw9UJt@RalG*)=cbd}s@dbMr%(fs+&JT9mr;s;g&|$d5JA`^l`6fx`SDuu`)EAex zIB9uAWnxFtTArj6{+8{1)K+!%Dq;n$4CNx}m=uyl$DW13sYP-ZTJT81NhYyVV}@Z_ z1D*si)>rKn-^`@e73zlEz*bzBKCP0njzX$l$3wHvM${w z@%q>8JL=1Ch2J%+KjqJ?%9X}r(zQFS`EHNV$RLOdG^Xw_quD@EuoKka@<2j^{OsOf z?p4mzxN4kodjH>6*&HrC0weP&9rK#dj)^a-sWpX}a$IJ+5~Vt*{))cp^$jPUkwrRZ z^0hCfzP`8_<y(I|la4K|)jot7&~P#Omga?p9OGNd$$z2m9ZAR@WV$a{7-5n5MVVnoU7-^d!mH z^N=aH$Ec3nxQ4W~GktCoktv7YVD%Qd({uFT2}$pH8vYyOwz&(e5$Xx4u=lLd4Fr*1 zbM4<8Wv$P=v1|CI93MRrtba{z(&x}2xMZ>IahWv5WIHU-hChS#IB_Tk7y|O9IXM!& z^uH@&1nsr`xxzJmbU~nbbYZ7OyFcBvun>BhvA^WCV>MvG@t#t7yOJl{vR_f`zPB!& z1eLSO&_T!Prs4VI`m@p}c5&Sy=_>K-v^&~jokHCOS>Rz-O~d|Y16-hQpDTmi6*Gc2 zXVFsZNUPZS>EJC%wX~mxuEcdScNNWRV9y2we+N6XqWiPpj-N5D<`+XJ&scPC4`nhM zK{SK6<*x15Q>G$HYqro6@)`uw_ZRKmL{d!!8R&g~s$MP5=;LK2`pDpk;Cwj~sX({o z``8afbGno4vHyeZw)vjK{ISw4=mv2@2v_OXiz3$dFbI}GK-3SjrbN0gV-M~|?L=7e zQzLyo$ZZp}axUfXa(Lv3T`Ifw3;8tVxi}ta_x)ELJSJ&30g*;wS-)BH#=r^h>Tplu zvgjEocp&9jKkE+hATsJWt25KiYWxba>5;;((%*owckc1L8HOr!#VP>DZZ9H$-1IQ^ z*9b%G&?lp5~HvTny{|X!m#EZKT_cWZ}Xv<;_BS#w*Z{#EV>d@iNO`kEK8$@%EhI zIVCs?&*dqR6_3XOkN$J?+;z!0(GzH3tjo$%6{r7%&2ky@A)`#78V|VcyicdY6lGHi ziunk%o-oD8p0cVTKym6pd@s$G8>%=?9tVVq#>W!oojj6(%*Opv4c zeLH(`1+v=bGagP5OEQlw1&u^fzWx{;5JRR)Qv+k2PHs%(s&9*1lkXB8!sbJ-nDoB* zxX6cHg8_dz5c==jRszGxRSO`r5p(;7q3;`<3lwyRF@BYMPZ<)eoVWtbQbWb*upZC# zvs?o-LbBnz+%&f4KMm-(g!*Wd04T7kqnU?Ve-IilMx-|X4Z*obzV zrCy|tB1uHPKHon|Bq+sAlPDY958{bJEfZMkzU;qO!Km;$^bgRT8{R@EWBq}?3%^Eq z?N!`J%RN_Fi}_R9sqe?#<%v@y!ELyev*>+G>qJ*(dc&)oPOJhAchXq?xzJVsc<&cG zez9I5NLug=C5+2Owd1I=;J5npJ#<(j78P=Jm)GQf zAdAcb7tAiPl5Z+%g>Z1B9ZxVL<~QQ+l5~+WfXx_AZSm<(&Ji*E_<)?zmjbH9YhogRp3XeZp5| zWa{|U!~g%Z{pe`~au4Vl*$NK(v--L;Df?RS-Kn$*0|5JhB9mx(ZAg~qI-Td*oByFt z=#PkDOz<^Td?NYCUb&seGZ+YghIglSq*?nM`MVvPH}CgdfWH3P4Kg=dZcqzdMczSk z-X93k-uTKCb)i{XH)ZuYVs{UO#P664@F@CuDJM_?2M+Qpta6%8LRE^}&|QkqK;ZLB z`p1BfC#y!sP=wBeW=jr(FXWVHaad{lo+H0FvH9A_Yc$rQ5dJ&tIHOVIuuHd?75lC% z%j=W;>DkZO#TkJuV9L36Oh$S5l{m{&8NUX!xrT@2?@DD<#hk$`TPL2BfpZjoLF`Oy zKXL31tr3l!w_H{({JHSs9z;^Kta*&@D&3L#pE4k{7s;o7(Al&UdYFFK(BpxQY2%2% z5f;;<(nzww6DRpZ`!&tb14EP#SAFHY%Zkd6NS-g6#&`DEGABPNw`MY`B$L}fBpGXg zevd4l>xt*KqEe(p3wE?iJyuQiDAR^z3d+Lx7J@tUq9Uu{~Wy6bn9rO|53~+ zdED6F{7}}4C>_M@wt08<%=j{H#m-h;ScYyNo9(H_-kZRqMTti|jia+5|5-uMW{Gw? zaX*jbtvA*}{?~(L*I=uLxxgk=m?(M;Ry=tl@d7yfA&H;XB;#Rm>GE7Q)z6GTa>JSS z&$To|t)8oBVe#Xn*Yz2_!wDhKBBu|c%J^aWi@-4gP>lt5TdM-Hr{d3x zrapbPQw5Bi-CM5=xi+lSb(Aj%I=h(Wv*a~tvy$6H!n2yPlvYClCK~#-^7~0|T6ig~ z#YvX?K%4iE^vI8ei`a6@-R)Vo7y{l|i`={d7v&W^kWFlx`hU}WOZd>4U9~>9!caIHoWKFYf@ZL^;ErW*x z4w1nJ>ziTTyx{o+*F#~)OJf{yhygp#+Y>ygdA_;~%ct zdAcvgwx$LqNAzfTtrFm=`;>u)&n)|qy#12p*P*ttB1;(_>Kc9+3#RL@c41?;r~G(A z9==w?k#=WF%XL$r-+Qc`5UGX|_29dhH*dCIv3^3V(V0%$v)H?*12bnv;u3<;aM6xJ ze;Z~wP2y{v`dk*@mAdk?yemssLFM>z!18!V^6`TUHrr`vNJk|JrL_w`$$HlwFj55t z7$&=12P65RntV;h!737h1@-T^B~O|o)BwjN$JaHfn^4`MUiK}ueQJa}60-z+|Afd* zprZcvJh{xxc!5qy7Q5xE{R|9_8TAa3Mpap~r`yyR74?eevrCl!dv?ACZ=y*tdZXWxVokZb!^43V z8qR2;Rs!@VFCJgS?%u%5jrX|^5#>O4(tLVzrqr*=L)n0!X*wf$U zh?DZuW*^FKmdtR`ouBD+wRx>e8+2q;C9Gxw_Qc`1q66ENkj;Ln(D@y_OkQ8H<1Ag2 zUHU3Dc=IThOB0O&22SwyIY}1Z<1KqWuGe+iK&O&vkr%eAs_hr{Yi$E~9!{@lXi}CI zI^Gwb-$GuBlw8F8-hZu68)2#LLDDmDUM+k5QE0?3le?6-PJ2KelytAx%}gSJ1&==m zrYIe>y#+x?h<7SF_5sF<8F;GtiML=TL2L+`rtd27|4Wn|FREDonCfa~i~zRC^9kK?uRBk%2+ zQ4afM#yL-|)JY$r8Q(jp0^w}wJ>F@?k$9nGf95m$Gj%oe|G>DWmH&ouLHufMiypk= z@|mVVCi@Xc+4uA6XBV3ZCHI;KVjOd&w~w8}sa=<5L-L21no!uuxL+KYY-O(^16i+T zfMCx%{a>5ot9D8?Iq9yyl5a6#RYZx#GFL&KQGP9OUwNjGJ8#{?zOV`yqm#iN-Jj_7 z$XA&uCPAO`Bu4Nwf0b@Wm{6KkDtM8tr6{wJGVo0C0K42L{H zg8k%H=^FA&KWwg&La$myVfQ0R%ma#X-Gl7I)8 z>>oApbAqxp4BAyu69XLiPzRDSOLj_9y}nr#S{62X74Gh^73mkvwZQIRcR(KvV|scz zWA>Mqhjd09eJy^MQd|31Eg80|c?M$w54{0h+A8F1{(o z+aWpz4otr2%mpfJOCetBYzSvh&pEzI8M(l@xNnHDn|zL1 zsgDZV+)}{@WlUcs1%7D5$Ae=A6cymLwj&G-TXr*xz}CP&Gm_V*Ocjck@xB>EImL&$ zb^T<5-+Wcz6)%xLuv08MxZgJF#+>iM zMCQD(Lr}iQ8Q3hw2uukl-D>nECks9BaH6j;XuajY{!Y6X1l1#3Lf5`_x;mt^uyg<` z3|di12ypF!MnAibPr6h3Ymc}+ANRMw<}Ar=)c$U1{dsIhxgaeax^^xR08C3L<2PTf z5a&(HlTJLf`+k+MI=tm3*5W6it=$ddADDeo0=0wXvjdl!$d)^Rr!FjUu^%;UiScsx zPVwTZ8YsvPfo3nz65Yn%UY^K76z{BN%%~8VXws~!!k?XXg>;#NV?oK1Dsph&ZM$|c zHYn~wGONg#Yj9QAL1>3#%)^{-TC$l+bs_eQ`&Kc*zz}ly`IRE?%*%OMh*qpiL>K7Q zds9AbT$V3X)CH^x9=}|=*|(zwyW9^HHEVrw6n!xul~gyGtwu~g2<#K3BL=?>FYoN* zi%9_2`cgf9s11!b3&to77mdhDaHIKrXXc6+^0CEuZ1`ri3n}npJgfDwSGDrOrLMrK zx-ZT3v0$$5QeCixN1i>geR}$@*6qG)T-Jrqxk}zAU%H>w1hty^~0Qu-P4^dxrR{fN+w>9$9{E9V4;QO7eK2JJN@h~ckexXQ9^(+ zg2{%vJFO*!zppwn1DJl>F;doeQkeCa5)wMkVtf7N$fi&YjwaEJ(oXr=gZ9wriGr9H zU*Gpdag-kIFUy@{l^3l-j%0ca3+amcKN}xTpAYA3O#3REP+v3H_9&x*wHvZURTauE z6r~^P;`g)gjz{?_)9^cP_hT}vhC-Q;-IxVPQBgG}W;BD48n6dRo#Zbcw$S?{yBjVkTHqH!1lZB%|7H z)uf@bz+#`bW)?FMntsjU+G~5QZuV0`l^Akbw&T^}Z*zR*NRShLrlOf7a-u`r&U>u= zenZ1Du;TH(+ihc@d8(ikh3;E678cc&W4$d0aRVYHi zW5O?oKsRGYAv1RFi+}SW4JY@fP*LzfOv%AQS2d9lI4gK8T-H#Scj`6yZ0B~@4iz{u zy`Rj&w8~RN&W z=Av9%*jGhbg`a(p5SMih{step&I=;lek{{36~l|TXY+U~6tD*+qoI!O!_uY%VuGU{ ztCbFLNC0oN?|sE#$rNSG8acLL$tLIq=b*1~`_sGo(1ciaiHq?nKkTdXtd&%_xWwJS zh;HpJbB8#35t7PG)fdO(!*vXj>_<#FU1mmX%SQUT+__Y5n|c;v$OTDQJ( z_iQXPTg=y52w8>78owt+skG6>Kw^7L3p;uj(oNnnHQ(t+h%AlxpL7ZS(!(}22V=9G z1sjf!bqkFfMyY5Op>scU60ZwMjpa^I6jKX;;51mspg&4JIb3jrmze02aI2Nz>odcm z!d#~|W~$M2v!Ja<&!Q7w1=W<{ptyj8raE->d_RozbDd|hE+<==jVBOBwiSiCY!JbKwn+={G3Go7LG) z;)_}uq_%nDlnU`#pLLMTeeLECS7TRVrMGu1)yY7DvYHg4TnN4TYCqvn8)jSNVh|w)u*;Ffh&jjQ~loL$5-gjR1)b;hYV3^aY zMw&^*=eNj|=PT3r!VkVDHGRqDoyk^-qqXzlkHSqcTfDz@w|&-zRX}EUmZtlqox_Ez z%SoG=%vR_r(yulhBA{BZ^fc#br^6G;ktp$6pZ1$gA-m{`-`A-*}b!tFT!4xS=6O#cPtmVK=suDK;78!E@Pv~DI!_ZO9+$6UayqS-(-bs z`Hyeq6z(x69T~{E$Aw;cE(?bTcWiU3Eb)20al}O1Rn#Fkp3HsBg6Em2S|?B+ot6<$ z)`XpQ<=mWK3>83(o!10@`+;}XcJEyr{1um}<^JUz3)(P>jY@1eA0|D{a59-!IxE@$@PO)1;lT}wJ-f0A$8VkynD>a zdjfQQ{?Rfi^G^cS;a@FWCy)MB-}V3U=c}M=Ds4(veY?8k#Hg6F)A!pRy9#%CE5GGd zlU`Zi;UYt_2Vx+n_qqg|Y2|@v-TBfjEr8t?zSH3_MD>_7MLS}mq<1N5q?-Z_KMR`m zcsW&^bT`T8$TjRorXJZhw|WsEk_+R5VQB;&B*ihoff)Ea?N8#~v$P3l`G%4@x<;OR z*dI8e;Xxuv>bB=SXbcWHea3Qr@sxMc&_BsFpp!+!36o4a(N}{>)H!}!xOGMfD@t<_ zQj5RepwQ2mv#L8r^xd6k$N+C)G^CEG#y#mnkXSVgNpG`>@q1Z&;rw zmN|#NOev8JVpBwPueiGLrl)?mdH4}haoR^ebD<;Rx8kNV9y#z~=q^u$DwJ;~A#FJ`Jj*L)g-%TWVMzCJ25hl-se17s4BCv5>mgh&;zp9MCpO~E z5P7iyrdAtk(Yo`s>&hzG8n^akKRo(0tVihHXWwI9O_^D{*q+cAL{UjmA3Jm(M`i8# zIKi39lbc|q;;<}K`wK>-yLspy5P1Z{Nb_88L3jySFOa%h8vO^>LO(7v>MPv}+U{cf@K2ynr zNbkl8{z;Qn8!*FG&GLpK5AkRXs5n18&=SolYv}WEqMaxKwfQ{e^DQ?Nz|9{B9WzT< z&%z4kZiy!&Q;b*LCxh8kWb@9O4RrJ*5bOK!XwxUQztiQLtFkMKXBJ3fj`5_&6w~D4D!AsL0%Q2x*K+?tZbn?%p*p^%m>6)Kwr9Ca4wFou zrfYk8szTm;8FW6LD7}9~aYJ1a#^MOOftjP%pNZKwa{H}W{v}Wn)_-^~XHwXLwzX{Os4fwFyUVD(nwzb1TV7EfGSvP&ofrpK zey2cjcwa04DJ;?G}Re zv5bdj^WXT$nt+s=N=oX1V(|8xDDd%@3SV;JX`yl{ zjl|`w7w{Nt`zKWmABrrCmd9A;ctUDSXSX&9=28^nwYnc|*l;80wl>?3?~cyefn@C2 z!qMrHw*aNV=sVcayHy48N9W?dU&yeExQw6q3?U6l9ZD*8oO8~6A6gnJaYhXi$#H&O;}OW`m6<=mp{@?j-n-IUBAO|x zv0#V`hnnBJ>~s5W?vm+>Ymh#1AA2R3|>_-WjBIVl__xI6X<*x?D*u!R&HTI}FsCNW{UfbuC9+0Pt z)jOwr@^Gh=KHXRIc=e1$i3Jl_i!dNYFYdUjKeOD3?RbS;>d434rUjj=qW(tAObCG<5o^b->3I11*Q1ra_H%0{=EiYE?e@cqc zdfn=p;hI9J#xR~8Q_J@@c^*l>uT#TIg2|xNRssoJWbBXF1UZXKL3+^B*HmJ0$)nDI zI$q~+_7nwZDyd)QH3yaE*aH>Rr$*pUT=B#c%z)d zF)iJJs1xgNY=H(eA7iff#X{D@XB>&^5H$OX9vTh+ofxBw^a+OI^I(hy^~wPYfB?<7~eAN>6?K zUj?;;e~FNR20r=P`&aR;i7>wl1s2M`uWg6%hUct6z`{ZQf&*Aq zILA}oY!mvIJ!(w+Mw+Uc)iyp$PdE$hc-?YA>c4!6{>?z?vvvRDNH4Ng#b$Q?moZI- z^jyXU22Ax*zY!Ho%!m0Tzmf(c*M4r4Af};~4blDfJGEL%v?u7vZsy)o40H7|?@%F) zJfIeqqU)xcOF&U*BhS{+ncIYWviBd_<69u+Ov9n+q`r03`~fDOTn3sI1YX6PN7#0@ zZwm!I71RD$Jou2tOJb#3m`xh>94x=0j+C%`c|tb!S~^QV^fHI(N1R&gY84%q;%Ro` zn+8>8MEY3dzA4Ri8U}rp6P|GCtz)N++Dz|{GupP5eiZnAhJYR4Z)5-&ExnOE`wXgQ zI|pW)pAE`?-#21)ZZJ8#eWwD4RWF0u-8n00OI)R0ZWw0vV!BZkG_Uw7yl!fZIx4SM zQf`=B$I{p!v5_(l{ef4+NB2mTpZ^YZGhCT<;vN5!a~VUotU6!RX32N8j}e&&(eLNl zu5KFCe)q190|q}scKOi}#vMjlv~SLM*2Eu2Q-T+Sb9`!OXC58O*f7?xP0S>FV3q7- z$rk0fO9WnXM1aZPqw2f8F;jow>B#Map`%i5)$E(L3US2AJh>hD95s{Q7hH0N=jf41 zGNxpHg=?4nyeo@iyFI`Ptz=}`HoHi>gm(M04|>N>&)7S3du^Bw?-56|?Y3(!{WCAb ze_=Aw;of49uVlr-hpTfK4(n1is~Xcdk<}!aDw2Ja5)J9kD9dVN80|&Oc`w-uvgAjr zpl7I$EbqQojfmvQ8czhmj#;A>GQGX`sAbl;c+Ht>9I90LHif^qFg_Q%pQd{#nU1fZ z2Dg^_>afIs5_-i88jC9QN!yR3T8K>Xwjezd_SRth``HI=xWVG-)I5l9YOYp}k+{(% z^CP78s<&t0{R3X;9X{<7k$)J?R0r%jsWPwQm`P%s?wP}2P{kpX(CA>TBQ|YN;PfMU zuG*8Kmrhy?9pb2a_jZC_AaUMk{l#5e6Oa@y6njkQVBwK^P=CwoEnYLMN`^6k@kDUe zn#7mu8gL`Ek&$bWMe+g0Hv#*^w-gyPk|FlW3+OfILNY% zh`1M%_(3fTLR(v~n65+e&hkC8^_CR{rA^gP+0i`_L3|7L$nqZ?0u|<8 z5Udj*k>Rb26fXh~o(t2f81RJ12%Mwx^3{Im^YC)4`+@TG%L04{{&ZoI@$MCBa)8-+ z#h>s-JVvQ=$;X*8N8{crC4@wH+e`$o{lhHTrUogkhwmxpkqlcMo($KoQY^Ny|*f#3VV z-_zYcDZ|-HyOwU>t>)`&iiNM)c=yi2_nz@#%M5OfRJ)kfAsddO+E^~+=ramRNoNXWxg zghJrLlKWj4pfrg@UQd*c3{ zjRDD8dTK(aR!(;_fCqLskv?DxEUb%(bf!BgP3*(yG5Ro`B<*p-@IHiax`Cn*E5E37 zBly+zUJU}Y{AQULcOs_b$#RjRv>NRxdzz!QGmWtLL$KNwkE(;XRsRhy9d@=wGGa3U zm}gJ@56-X!(yD^#IhZ$ES0+by=$D7LygI@%^y6#u9F9p(d8?yk_kL|q5Op8EWtZvr zN{@|Z!6(FzZR{e-xf)fl0|%18R2cubNlpLOQcm@+dh`Ele_kM3MY1ColL2XoJko&( z_!0F!fpFnof_W3pk>@y$q;%3w(SmI;<+tB|g=**};oUvWRBbikMFmcvrdE*+)H@u( z<8*m|`^w|RgF&kOvk!b1h$C5gvO%uI6!Rj6yPnH~7b7%w z?>(pKi)hAI9uJXODR~z6mV%<5D85}xZy~nRY1C{{L0g6k6cHn5w0YFcN&RjDb^}4B z5_{;odcND+`_IZdbFk*Fs|!Zo`mbOk;S2A(;fB% z%T{Ub!T-oQDybZ!!6H4RtI;Y8SRW5Is|0z|GyJ>H;pW*rF!uh#4nYK)?Usd!l@D1> zk#XCCIO>KAHDj)X7hO%^80r=4xs~}uejg1U3*$ND^66##4D{nCf1Ha&t=AhyqHKZF3BDEN0e~e`Gfvm6CfX2O_3pZ>!i(tq;}lo z{9)89?-aKcw0mU3@ppe0B-Cdru1v*UoV#f9xaorQ+Y9Ewl%Ks(uDDjZl!~9#h`m}W zO7}1iLGQCd{kDb;k}x>X@+TNNK8Io#E4+pm+_OkI%^vB=vZj;W2x|YlA9?-UAdrvV zzQR@XAb^3^PdFEe(P1usr<727T<%L&R?3+D4Y*ZaeyfJlBHVbIAet!&Um<} zLEqR!`bHtuwFV=fwG|djavff?8$NKpI?+ie7BN{-qd1^CkODq#wVv#n44#2x%{?kw zAk?8N_es#(rm;_PeTVqvn$d?Z9-{kZr)O6I-_nI>jgQwZ&8lG&&7;rrJ#enfGNK_Ip;%A>MR7==eM3i6Rt_)Wa_*6kxC}B8*g0(C7 zVW6$LduOc-b)kM}(=(eI898Lt3@#+>(IWGRtk3I_AvQ zjXgyR0sBJN#4VEy7}JZ%t7U39_F-7Qqj5%%a-&i@}8LCx%Y0>r8&;Wu^X>Ui5-gP7$UM60u8C_NM>N`YBb{h~q$s5#1Ad$g zD>ZY;=BhM>0gR$0b9^J~8~p2??yRn?CHTDI8$QIG~2t9t=R+Sb`k`oTdS@X8?yr>fzz zmhHJh7xgxXB}!Yc2Oso3nxU#;3i{;}(9MtfVX&7e(e!TI63{RTPG9{G^`67a-!;a)yUXe}6hXkF@gMo*CubXW@Wn1babJVfEjfZLBS{Z)L89qGJ z`3gAQOi#n=xPlI2-R8q!BR*G+@GIJ=M>@=&ED6!*Tk>1F4)^m9%ccFnLsul}ZcH*huf%P&vf7u! zBR?4GfUT{GrWO(b4B_+#hHw&O8o842&pkA`arJDw;h@F|eF!nc84Ofc(z~s-uGNNn zBqinCp1js`or6BXp5ERntHza1Gp4Rx$vvR-+Uv*3JUn|sdm5$TIMM2jyr6hdf_0{Ji+ zFT)b0MY0Sp#)n_bw!4j+&BzJSf*H zo#E2a%OcM|c502xh)iq#@brkZ%ynGUl`zaK0823b7c2o<@?J|I;WcDwpLL{64Jo#E zqPHWwqIqKE1Wd1Qd2t~$_BG(*Xe2^t-#imeZO?8sUoI{U*UC#2M428jfb%ON-f|YF zq@A$3vP_v=fdVYAWm95aW7dpSME;8A$u~tEI$?_CLOyCXL$*bCf((IKkswbP+n;QK z&O4=s>%VdUacQ8jyy4wlijm)kMwQCCUtZYUvTtW|8HteO3Oww3cj%~)5DiCKox)l% zfqD9lmmha=K_Oc*x<)AqIp^F@P9S^5wZ~0)gpiXeq3U{UYx zMUS9Bx{a;PLHdolM3BpGTjivgmr{zM5p6R98p3gmTEY=A;w{;Z9^ZXHm9S8p$!%Ev zUU7}p27;rmzjnE=hL04mR@x`dPc&(iiHS_F1$%GtaX$3&)St*G`w4%bSL}mG01i3t zGAc4XQlNG4g#Am8a#~s$d0SCS?^Sh(&3`}uyYf3Kj0eh{AgJm60V+I4?;mIvU57Ki zjEZ6>`2+MdaTeDPiqL~Q>YUUplE73W7heB}D%+imGu&*o6RJZ?PF}Qa0~<0kn4m+o zs&2c@H9%LPVnN6sKNKz>(@!;F2rQrOb@XyV8sP367dqyBdl13Y-Woj6*Mr7ItJ^so z(C@!zrxh`7*$&J>Bi)j}nhrY%N=3o4*8Cza1chqUA*ykfPU__2 zmQ8Svf&=G`#n|g3P)yo@jwWNnu(o1}sXXVuk%+9e84gEGhKAw9oO$yObk8I;`O7=U znme=gqb_NuG;<}PQx@=W&oCkD)z-?L-AAZ)d~HVw;QpT$(&cl8_8|prCqtj?otpEW z`!MK<=kN7Ff(~@e7L0ZRHqRByrs+21!~gP8aw%Qye2f>l>b^m6xuCCQ*Zgq2Rbj8^ zeASn~vpvtUr)*PpxWetsLeD_-3p)Z%P2vKUyc!uGA=rgM8z`nu6w6-G1j@+vr&R#RCtqFhI=tuu(dp4KK>%<%9OylO3zIBc^^4bs7IfHN;5Jrk5$8c*UtLIG?Z# zx9FA+B{=e8fd@MistvCX;O4|9Xf_~)0WIW@8k9E~M&dtve&YJZ7CID!(0ZRMyU4%vk>c>9gt>@$N69)$ z?_r~Njp=nq&*3EY0;uhEP8%Z53*0kUl%taMA?D@R<6rNO(RsR{S!GW??u}cf3^>n>cW-KR!?U;7=O@@(Nc}h`j8_V zbburEIe1^pE#{AD1nO|_(F!e$Cnfqt&%x!Ar9&v}AhZ*SRi{ALJ}Ze9B|oz)PbKiT zIuZww>)iW89r3)swI(*y;d4RoE0^&g4AeGTU!4mwZ}WC>2Q%p z%i9e&c3^lFB*X*%HE74+1>lA(ALXSZAMWvie;Tu@ps}gsrTdqz>~E{i8~|^@kaLnN ze@l?%4a#=Z#1OTW9w@~7X88C;oWxCXPPsz+x1ueY%`6Q+H&JdhVZQlHvc8ybBy;Yj!`HJDKA?Tg#koM`AXr)`N&^{G+b4_-2Tj)WvPi z2y<%v^H_Va8uKgnkxq4r@eB9qYPLS_Z|@M30>NF;>l=*i`LiutKA+$9L8!lH05#*C zL59>)c9KV&5WY(-VFJBv>C8b^NgAMLe9LestB!<15 z|1EP=!o^`cbM6_uUSWt$T-UWBE;^(basF|(`R4siUwI{QLG12YjJa;}cW%6egm-x( zWqQrHA$CDu0jB%AJM8S;3h`|Y6pnvMN;i?o|2_N`=ou$SSAA9S0B#pN{%ZBKogMC` zkEAQpSrMo{4*kR97+djq_`i4@Gd6!>hD~|+E8f79N3s_l>Ojr-WCulIHpmU{axuo_ zs0Gi(je(dSs2N}UFm91s)`Xt4b$z>G*rpv6q9RLGSmx~p(ic^1dhYkKl7mQD&R%}F2PXaRR;OpepNG>uQ|_bA$+I4tTI0<@*l zN^O4I<8U;|d>;AvN&5sArK@_!Oa&8P9I}WjV4kCiPg*vMVPR!-cFAOD^boE9Ek_VI zbSr!Roqmqb&#tAof=$H>?O$I5c!J$=xA*TwF{p02J@Y)5vVHZ{$v%A-|C~%J)Ek(U zE-Bv$WkT)g&02ov5c(uaq}ev_(&Z1);*JD&iTcG)7v9>%-~}Z4;Q)$83+nvN-(14z z*FpYf*=DIf0I;jHUWwn_+grI;7^Qz{M%x@+T_B`8=2|8q&pouL*8xL0T|q_OrqJ$p zdm0P-_#T;<0i~y@Qq(7mWX5X70ZB%5%EhNUQh5JTGL*HX9tD<*Yy691Sl(%S^E|Sc zDkB!biqU(|oe|YRZriW=kt%tJyM_cf<^Nj^O4eTeJ7nb1YsrPtXjZ#cp@)MPCT`9T z?zUAp#DnyPQZR$9sI7rl&@ckcpVP+|6oYh~jTav2TTbvY(>?o?Gl_25O*QD$Gdt$8 z_4I|O#`fB9=2E_swC^rf-JISha8+#Gxq-7_!UYmT{fL}j@QZ+}ATJ(*q6U)%Lv}1I zCfSsK1p@^DA@;{*rO>ZA?%u_GV>Zy2KuEGS+epsji} zf)DZo62NT4r;*>tF1)91^89KnB7=qbd<=j_@+LA~x_w#cPJ1=2;3AK}6yx`J&55Ho zFIP-F(1nLLB2FJmx)xE9n!-KLomNY$+c&Ga+}@!g0o#SJo~^j|D5dK(3bzg>HU_W{ z`gosV-uKH@yKn6Uim@{uK5AZ<(oQqs-F;ibSj)p_w_Eb#+|-TXV`cpbV8-wo;iiAN zw?+1PnPbkYrv3$wnkr{br7lkJQ23V!>0k9es3FhwA74pC%wv`#rK)jWH_Bgg|I{xC zUR()L%4c438%f26YtD>0CVanE5%d(_zv%_4v2yorwEx4#=o}740o@R&S(+_p&i@R} z0b2vNC?PA#`}oqDsw(g0_SUAHyG%-g8BVL%Icnw#GQ?)RmRDyX$kg_Jp%ufyZ=k^+ zj-)X#jaiX^JnZi!cC=Us?L6S=r9@H>`I}q0uD@mf)5EA?rZ2@lA|a26=z9o4+Z#k1 z*{R_++6)_BepfG)(!C&KgPdoaDG$kdWqrWhoN;LDS`$H^j>BArNfdl_N~lV z0nWDjbg6an*}jHVHm5$b+c`^JX}kanG$i+{^`3%H^vyckK~H}-r5IMOIjcWUUC>j} zSYCOZG7%5j#4XZe`)PW5Y#ty~ypsJXWK1jKkjkve&(hzOdg`}0@qAc<9kF01^@5Yz z^wJ%jBjSEKyFdhdtt-o8SmHx8499>wSLhY^-^~i6!Q$@!hqbp1i|Xz7z7?gV1nCZG z7`j2aOHyf2LRvtYkr+CpK}uSrr8|ZONu^;Jy1N->o>Bk%+SlIue(wF|eh2F~W;kZn zTCDT;Ilu7<^G7vZ+4BBJ9maFel6|9pbqL9A(&b>mkCv8y=!BZ<2Oeajd{9 zViYY1`^Ylj1h@HfGk{=UK7jo1WZ-c!20Qe$n!3%|+>#}{S<0VS!6Lh#{HwI6W_oaH z^cif>{zr4+oFw8w_hcz9{uu$g#;Ye*2&>sx zYJ8X;BR9mrWjfg*S)Os;?{mt-S>~DCl%2NTZn+Tgx@!d4CEgOjGs)QKYqz0CfO7;+J(k#wDVqP5FTm?S=JPFfm4+Wmu*4bYXYtND z(koD;?HqwsjP}+5OzQmpw4)|s8*=%~0)pH+Nbh(+qTc@jD^Ng6MUOv@GPAup);{JH z?B&Da5BayZOkfg?O{S~t)0?Ze_4hJf_9+plp~jk$1A`y|tAy*>4wRfG!hKwjb7kRW?ZMaBg? zO?|W6XH#9;?l@wJw_Y&6IvP7PB$_X_rA*%v(S{u{xLke&yx>h*>4rUu&Mv5_J#XUf zyfLD?-mA&|asc|P)j-sT1J8X^U;kj(N>zg;#=uIhRlzF%NFriXyc=NhUU`-q=^yRI zAD1&xkUf7WzhmN6ao(@cjJdk=+*OXjM5LY>j-&+29G$#QcKd{@FtKw2x{WiD8jdNZue%blzZDOqp-LXx`=B<$CkNx8gFx?Kjy3H8nx|9A$0Cai+U5% zI(C&xOS{9?acyOr9JTqNm>Xe5QBFFb`sB{yjCMDf*~z1KYXTjbXl?Qre(Vf2&s^^<6vnOyerr#}RRk)9jyA>yy+ zrU~tCT*oky;o>6mB7F(YH4T>iitowK@q-i@kse=79c&N&x}vx(s(TAQHptMPq*&f% zH9)#txCoZ#jM51B=Fv3OU`MMmZ(d2W)I9tJ&S2zhre@}byCdX&jX!!aO}<9GoYwL4 z;DwOW*xjeX@fEEjQ54SXgE?k(<`f`-Uzd8>xqe?0vP9e95waPL%C@f)S=+6Ox)e`> zSa$^dU{o`FJUF}FTxVI%G{~%;~k&n~%KZo?>?~nTek@5ny*{{8< zCgYjU^OtV(!w*dje)>n3Wy7xxu3Lp7UId`H$ukkX6A(@gGp+)--eLHl-;}e2Sgf#S zI@;up&wb&*=#;!o&58n&->t7I^_sl{zCO7c1xvK!#>9peW{}#fq(z1!u)k_n{BeX_ z$9SyzwUGoFHu>TOZkChLjs}oFT&<`7OuUw4TD#mBWzXCiFJ3PE)8mnqBdGhOk{ryy zra9iGphKW)rY*P^^%T%M4HFvIQ#l)d;W!w2r6h(%(w!!1g#SuI+0T4q(b%y88S?#5 z^@v}l!Q}4EBy??Jry~a4>rQD^;pOjJ5yRK}f4W0}F0)2k_~g!ktlvpq9C{-u4Ev%j zMu_X$kn4K0Nfilyp6`2{VP9lP*aA`ru-mWzJO%H>%0Mn9DdCW=2@i_-?sB_#lF@Bc zn+-JGe5a_!`FPO%?BKrdzX+flHW8ivm}BSYF!76v1RQWZ#+ZTx|R&hdL$lkn-%QXt% z3Tt)jPRiN;+pw!hBbgC*oaO^jF?WNt$)9XNs?v+N z6&BV7*c+F&lx&Cp=E6uE1(RxQVz+GPQ=ova0%ASr>r1<6i~7P`E|o5)fj9%=Ro|Uz z-JS;E-S@BBl)s#3PQ>l~XKUa3X0O{E@PWqBf&y)`8>2j|y7u-#ZnDv~g!TiE+WTrf z=;}I_es?0Q=xx)MH}mS46^op#<^w`E>@>e(^sr%3Kuv0IPQvbye+k9Kf;x0-B5e&) zGn&qjCzvcOP<}=$%So8imzx3k8F5s07C~>4Z z;?BF_^YFs%AD_g*aZXJE%M-zE{)j`KpU>0EiW()bxD#tHlDt^Y8BU7W!VyWK)e@$<{_mSrj7<$e9U8MeS4H`(dtg7n$Im9WVp_SoL{<9eT|JmW+>Dw36MqZ}%>~OSXv?YCt z!?$nO)>_4>Z?l@UrR==^M2L`{%JrIk8(e@E#=uISJcpT8lFXd@5Zzz*j{}c<#m~h& z@&ovz`Kg1uX7B#Zw_vp|$#zATl(He4vo5tt=1ce|r#n?t9DAoHC-S!Pa*GxbCZ#4k zB!qR5Z*ln&{i9Cfmv60T{^}tNTe+hm;n60yz`GDwo-U=YYq83~gTH2kS!M6@kW&9q z;_ba6b8!*0``rA2PnjXTtRq^~+ac`%XhqHJ;|UsOi-RBi$k1~ydT3%)2WO9h+mAo8 zWYWB|w`@uV1&?nONU?-Z{Q}QQ;>9rW#Mm%Z`1LD`oURV1Vrh8efBua7rs$gcXz4`- z*G}EYz+NES7Kt^A(+|@Au|d#g;wn!W*icEEl;TlkQQ3;?V}NmUDE=`&05QX8U4IYg zn)w6qX){g>CsSoFVOBbA;>oYBcRn0)|B(t<+Dvpfn7+N2hl+g(d*=#^#@l+WnfHDC znI}q#xfLN+!fY4WaCla#)-B3H)D|+p47sbWP?tjUtN7{fhV;L}bCEKk6$3^}P(bSK z5i(=;%A%Al=6;i?5MXl0PT4M!_Ib-f@``WvK5pgEEND7cGn_k&|A%hR7IR)R-A;*S z3#LT(jKupWsh|Yv`%;z`yqW9bs;rE_+!K@8iU3s4Bm5)+o;BUDFCE7si?Rr;Jy!bI z@++kNoP4yth9{6<=$h!&49S=2zEtJkOOes6r=UB+5%j0S<&sx6!f_f(^60UAtzO|7&;t>n#LiXnZ}2<1Yz@0UOe}shQrD{{&&M!Z=@~inW&ojqJT_l zV6*Nd_U{JX7@_TB7DF?~H|%=|!fex*+~nFmp=*GoHrY5e=tUR(irQI&|n>YM8|A>T1TJs zX-sTp18`|FS^aftrZ4{G3AZ`x@>nY8@?non@YKteRk4=Lq0lF7@p%1npLvLvdyZW# zhH`X>R$$#&e)2|wZt13(pABVfcy{D=|7GU@WPDk#j3XvL&63n1L&M9|HyKgi?a*`# z{^b-e1vL3D0AXQQxR{7Lo{Gn_4pl#la}=%Vz4BC~#cwx=oa?pn!81RbMl7j_7B03o zsWbG$EQzrgZwqNkDWo%hsK+01ov`i2O~zKIf>E_!*r+1;qm?(VYIV`dNf zVHY(lJE{?Y7FEkmoUdP>6@6=@-kjE9EK=`_Q;2lYAx%BVH1F#*nzL?rMyt57R>`Nc zU>bAqhD^B2ilS8aPV|#Sx0V|KKL--DDUKkw>c2y#5(FOXjT3r>A~M2Swk!uGO zZquJRZpI(IKSnS9oATl{-<~9+6Ht2kddmfuLl!JFeu~n=8i8->i=z6_&YXyxWjIAy z5*T!Mi*#uO;3%pRLRJQf)5ZP1!|G3;^??5+prB?={VT8lDkyA1Iz22Nq{nO5;cuk^ zrteWIJdv9MyA-o=LND~L9vXu?m~RN_+E=2~5BfJqnBjGRI4Q>ZLGA^YAq7Jev(BWf z#%jKNFDfVC0~J@YVGS_vDSk?@5yO}b0dPLzC3O?J!3sf%)k`=O@v%h9@M$>Vf|5kq zx1%l*rCtBOkmTu@WI-eFWy+W@YTv4*G{%%EcD2Mw&4YAirOZt>?b!p92KTpwGfXxY zT`IdvKGzRcL!^3Z;$63?zr(Cx7le~KvcGPhEf&8EL948#VW+U)=7_#c{VUbjusLXT zoJzx9?qAwq8X39Fm(d*70tLn>yVq-4*u8ybRqoBxKrZ`J>SN6h*|c=C?(QXY!_Unh z{j~2({!ii!v(4p{gqN*7A3kl(OaVfglJTu=NL+0!aJPmzl!uv+%lxjWp-YQJ^?#E*paY&EJ9;rc%BCj1#f3dOL~@G7i6tS~OdrDZ|Js-l!a^jWN5CAC4{Sd_9|fc$mj8g3-tqs7r3IPL zjdZlUunqYI0=P>l=$D;vg;pbY92D^|;NOh5{mi;v89Y^$UA#WEdrm;>Lnp9>w4h|E zPI3mfpGlCmexNhCM>S-Y4D90SQC8xU_o9>HjV!AO9BKhgvMm0TVfd@?Ajo=WkkY9{ z?&zzB2}yJNmmNjs_OBfUbMGu$S$OA2r~d|$iL9sH8M8QNl(fa1fOo@5vJ~7X)`n}WM>wP&`gXhv@3g_$84Rt`Grmx8>*ns4Z zny!-9O8r|pq$U%-6@l)Ll@$jVdW5nv`)>RAcNy#p&u^+`Oqp>upH_J0^iHf&ZZq!P z&rwA+91dqJ^$1z47Lh~ck_SOwAq)}V)sw&p%2*`zT)e^ZcO%=Qm|0ohj$Dy$8N zPMg(UmzMHWwSSzx@8&C6gai$@TfyF=-*a*rJo!JkT~3St&FwC`Pf9vMuw z5}VQbU#&DTr+>LoOaoH1(j)U@@(qDBjKJEUL71q=Z?@q{=Q*sza@1aC` zfEXl>)i`e;xh(}UF&y{sM)pc=T8m>XMF<2O1^**!sUdc<46{vP;-b>qO4*K3%*EpS zS#H*O(9$V1JH`kf!b+p5g z$H4#EZNzeo<;;!i0@S#rI+qGx89Pa!rPA>rSO$BfLMNgk^`%g{a_ERM`;*^EJA|~J zy2geZ4VcxG7siqdmX=9zZK06a4V&3$m|z1PrUU1%AKdr5=bc~WdpJ=^&ch=QM*b&Q z%fa03m<<*`aVz-wq9lP^k&?9{_wVuu*@)M`0N*LP&v^yI`;EB(PPfQJt1dFf))K^H zg8e|v)tz=?`gI|7O zX5gf8m^zYWHa&_9^@x7@&^Y9?DY`P52u^iaY$M**KsbUh4g2ZTlsk;c>4(&R*YPZn z+nwFi31Hn6wg6uyaT6m&kTRp$awm{wkHpZzp5&Oy;bIrh4=-{{LhM#}_J4Kn%Z(iJ zkD+a4h3(DrlWlB&5xK*N-EB2A{bL8>ZH{b?$jw6kmjuW5xG*N)eMoQj`PPxJMBK{8 zz@!0)#*_K=nqZ6T995b+J=V*5cGL3)!K251vS*DoAMhF;`3ncQ*dyd+n!>#{JUPt0 z*B&~>U3_Vur7G1CnT(J!+5Dc&4<<2`XQAwiaa(PTT)}p-ENtMVTXs4_K5V9@tpJoS zl95;)Y5Q`uYQh8gEyy~yMq$Tqu+sTI`W7Yxt(@+KIG+bJw}j69!vXQsRW}0&88{U) z)&KJp3&BtiF4N3&78~OJ_~x9z5Wc7m`^;$5lw4w=7f47q08EJXaq4Nir2`4JA0C8v zIO4~4Dgr)fll_jX+4AR=A)FSn(|idb;fA}~6=CFXbQl_^D`eBeKaUnHnSCBB2!bU< z4M_e;r|HRCX_5rbklB<49UAI%SA6hTm~r{3LpKP@J;L1AGs>easFb&!vN^_wLQ!88 zMK8kbERTLi)5tNxiMN~Uiz*r>hl8QJ5DRuyKfO;n3BLO-q=(hCK$-%=1>rz7PXr@p z4%#NNry(j#~AGqkZE1@=-c?>|{#k48W zZ&oRMdS%)P%Tk@qSzm@K!d2IopPI?mJ$x5a1!FOabu|8G_3$r8Q}``Aq|;5Dd|nEm*97_gT=d~WD*It1GUoeo;dZ@VSp{gqJ=gg z<^D~=GgZbL%(>&7fzRILgg}+P+&h=Jc0Acwqp$XQ z#6K@Of_xcAoU_;0=6%d58nMgco!WJ+{w19XZFqE|>4q3c(cGXzAtWB!`f@dJS&3TA z!f26$RVlsephf)HoaTO5l>nJowr?XNLEdoXaBN47z*&TALfd~nlWNf(2cb@;nQ%qH ze(&fog>)sNTTCWE*a-J~9UG~QW7@);oU>$YTTzP!Odp5@&c-9V{%kQmY5z=K8}Mi` z=eCu*S|?ADUp=Zg>i^im>GVx7g@pSF#Wq`vr)Cw{8zs0VK=-vR<>U$LZkL}Iks^Z! zH>ZIg^*hotiV2aYjP&&p8_Qr!i}jwIO`Y3IiODV>yfcQSuR{%k8hdA|G;)*>$%IB$ zj|T5w7pbpiK{vk^w!d+H)Rvvc%_2lq2lpWPwo`QsUX|!nOe-R%?F!~()pFE^$Ywqe zd8M5BhCb*kI<1eD&1|U>R>5q>fNTWnQ`U&5QCM+ufkf;qGLL7al@&$%T`Ow7uli=) zWj3Cei9C4l!9!V2TDK=+?d=_7%E9c+Mmt=x#zqSb^tePNqJty{b!5K{*fKH#KNPH) z^B)t!^bJN z1A;m>NgBnr&=bJDMD^;JFe}Xsl>cJ<@}8o%n8@Ek>CCV5!uau#$Z?}5!l|!@{;vCh;BDZ>Z9AG zO%()ASLTHG#7g@_v&uUh@g~__4W6KTYT1r^{k*Pk5wv zbOlXA2xPi-1iM*2V$6YNv%080QJ*65rok) zq;jRP>0yk?zC~m}!d86Z8H)Sa4A1J=;0Q7UJm{j!8G7Ctat3u?A>BF<>HXD}M}w|Q z1qnP@2A;MVERO|OT9k1SSB$y#m{ldO!Xth_5Co^&q!5rG^X+GdYlZx4IAs}MhwSE} z>g;0TI0gg8kpgTET{FpFD(Gxi{p42>(O4*cpC83E$PBDYzzKx5ekV70#9igiD$16} zbqHQp!Ef=EzHZ3I#?I`Uj|wTF>57{J4ZCH`J{iTtMoo;kL;mR(2GP^@)FTzwfU6sU z%yRNh870^p#?PjOvFa@Q_S) zr=*zy#rM2t-p1{#YXoaArOg&GJyRP^rH7rv@`Tv!Wl-Ip7zxg8qElEEts~k!}6!v1rEL zji8TG9~A=~ITk6TJ-!k$Gz(dV9QC53Pyi(`RkCzQ~{OWwI~{iau6D>iu4gn2@S-4yzeYoSOt{3U+kRGBUjT zW5Ln-+2MQrQ01Yk0%d9zM+vvlw0k0<8yDb&M|UqXIjY*n(u!2t?}F8UEpl( zVYu)zH1_)&qVe-PQ~{Khm(4KfCAjTKvH>G^iNh$XqdUVBxJq zB&*>;t-*t*PcnLS~-);<(A(|Zb`f3u-IJY zUo`mz2vuMe_8^WdRb}XZOb6m?adCCWuS*}4QoCq3zg1n;#D6S}UyM=I!3anG@Ypr- ze?M5s0at5;JpTKFlS7OsU@J8Z>h298@(p^>F{U5}hd2E>UeA()cC(o>OkL-Q(@=9`Fd+ONWKDPxO`vkQUqmcAogo(}f2L7N&xR8_ecsoJ3S6ZWs- z=Dwqz4>zFqo6>3vs7bFO{)^7o7TmWZqWl-lJOKWW^=`f6RBkjF8b*U=iQ2j}Ej z`grr!V)Z~tr1TdQcnl}q2e#h1D%V49GFG(~3dLNOUn$K#O&M;)8U`OpXIMfGWF0#! zW^qg<+M|}zx!#0K4zs#V@NX!ZJ5pPvE;aJ|kkr6wsZBk)Nat7N7a4phfyV-)?jd@_$Xou)LFIJ})l28XM#V_*9cy)i)$MYgl*f z+hU69IrqaY{ywEP&*rKm39rU(AZM*+9lb%NDomL&1rIJ`Qi{tyO>8~*1D!6M0y6L@i<2Nx9^ zYwv2&LBv`%zqt#ihA* zqF-iMKy51mJ|_ETi9`1vTSJHCN4JpD#E>8E*S49YMHs>D>W!*Q3~x@2&qr=~bc@tp zD-5p2n-Z4Xkrk3XkJ5(G&|J~os8wclPX|1>_l|%{T3hy*<%X(PYHYhiz}L0x1OTN^ z9Vs`n)nMQN&Uf-7{=^;zFH&=Z^{9L`%C#fx5=$+9VBBjaqyW@_nq}8DsQyeq_*PIA zLN!1#^cmJVY$wMO;?&Qj3C+1D<0>eGMu6$AEdpMpd5OIY(9-&Jj>P?YfG3IE(AGPe zsxdg$hpQ048?MN0DH#Z9$iXF^#TATtw8Y~pFCz&b(X{Io#60Il#36Vlo{P*$YViXy z@-z~e3k0NiO~DOs#b@V+5nUdJ+FAu3P)J?cr+w>AuE*NZqo^8%2~m0?tIij>%?}QV zu4q#ufeG3Vyv1@-xeR2;6E^|{xF+|qkG+AI3yd^Qw?Jt#jyd19_b3^63#4qgH=31w z+xibuv68f<=ydBE@D0gAvI=<^Mf3fgMk<`mcP6+5XC$^+1w-~50Zme2edC{uo6p1* zNIaotXI&Jt;K?`Wl)1|mLh-8A*9ju7k1|$O1MTmgeEhC9Oo~4# zj4&yTXf@~1p|6gKct*69Lb^=tg4W2=Ablpdq|Sf&o~L!so^*$@%fb8!YOW1i@*Ogn zI(2xwFzndb$)ZR|iq8MU<@|zoY($2A-xC-k=rhL^+H#5;_`D!Ja|>n6l{rNOfePY?m7)b7A@#h@y_T>bkl8Vp2biEiWQ zmC78D2^cHzWEQxY3W{hTwB}=1tzrNno9RjLQcYu@m|k;KyqC5W(G#hi2|%^i!IXo- zaLOD#^1goa?hpc^8yV@bIFRu^55RTv&n4B5M~}Iavan~9%5&6Cn!+;hh9YqJKPVqb z*gw3yi_68RTNOFuG?dWH#adD__IXw-tC>4o7hYcn2K)%X$=dK*&Edt1R0T-E9=b!( zyCre0JZawKM#@5X;@a-L`NK9tMBMPieH*mW%dRZ;d+t|EepdCxX;pW05}RpPXO{pN zUjr%Prk%eiJu5%&!Qw(E@se&@N{Mh!Q7C+b<5_=FrAfI2ophTRZh;&OJTvOqHFlSr z?FTPAbV=BoQ^hS7V(y4w41qBR!E~!*tGhKeNJmsQ;;}(`DcOIITOEkJIPz#n`hvMvsMu7L&ibQS;2zgp+y!b?=?^l_ zuudERc+a|Pa=~v+%TiVOdVJYTf{TjS_FJM?T~)5WUc2pxHu~CE8Rp?ERg$~c>RaWj zIAFZrA!{5rMk=dSC<(NTcs!d>f=&;Z=?BR+ zeYqzhnVy#qouy$Jyq4*OQxb0FfeRhn^F80S_TREsOh)*A%+v4_}F|-gkc(I!=FMVJYqS ztXKcoQG3odIBG}Y|-S_Jg;AU+;w!cirPU$rXv+hXU1!g<`n#$6=V3Prg_dS zHHYj%)#ANG^xHBS;n3^if#6SDW%dALxQ%31N6`JPXl>J|5(DGjq}4viCq78RgU<<7 z!bN#Csvx~GlSIhri=h|5u(v%JI_@60GAiYTGsO+~^(CTwP zrgzcC7tgqg$Sk)g=+s5#)Ftg2+tnnzTv)G6`|QPl+xJ?RSC0&_qVBX8@rFwaj8~^V z=+64JwO3&$?)j3I6XhIS^QsVQ=3VzU8*zIPG`{A%Rgc%?p(=DiH#K)F6Qqlw;mf<8 zF<<0ryGq`+tppoCgh&swc6zpC0aS)HEP7$KJg?`Jq}e=6uK7ArORE-n?HCNq~wS@{iU05MD9EDg_u1ah)lK_JzZ0RNE zweQ;#8wrSS`|NU)OdOwz$4h850dR|Q-;)H-*e`zm@+w#0?Ctougs_uD5WSNgi%n+G zuNrhcK?>>PzWKq|tG(Ap*T=aQ4E4`f6nIZM9!$Yz{MP8n_2;hKl*bUq;yne-SslbS z!7d|@zdVU(`+g#Md1)}QfnmUi>ppU@7JzO<$$~iyS!|Ns!#Hlko*u@$5-ujsW1#L9 zIdZa$Yi`{xN1?JxS+Oh^vw;tVi(o1iUBhTZXGS^f^H^j_ikr z9i8CiU@-$42IN<7+5TewjD+Gbp`U+Wdd*F?KbK0uRhstvnI@F$84&x(lNS93eMxhg zQoO}Dn%ZBOiv0Y_uV58XWOm`(CW0{QoHV5RoLU)l*jH)p$Pq~}QH3BqA?b!c*>uYl zxpx=SCAl{Ba%=06sB`3!z6$DF zD%^1^ySr9lwWvt{!F06p!M6fXIarvX#q&Kpy?u53ryLg-2bybT@r%qW-K~6^OH6Cu zo;~Lsldi*Hr){RQ(%4N*HI0kj@Gznw@ZA`4MeiT2`+QS9GZE73ZqS}a40=>iqVBcy zcJ(U-V!zfW$gp)eNIZ-xB~LJV)X|E87$>J_cplLb2C`!tA z$wf>D`Q@58?)*0=l&Z*&taA)5Lc7davo<*udM>Hoy^2^eHSPShpS@CPrcKaJIUt)} z#bSi+X@=9fLDp?7mQn2NSfWt1OuKAVvRH_0YwLw^C56I%c7WX8{ zGd*Sx8;y^NiI3BTkuh&FNKH$V_L+6NBKloM;6e_vtM9IKSGhB5jDw(?LN3d91p8MV zfsXE|Y*w{Q-nt8!%@1!&%(~|}1c~TRe)&a=fPf&bLla&7n-XsLgVDL1u7JC+s%8m5 zG*cw9LIsFBoerUMJ7jV=RJLulG`OQlLD%>GD%$>Np$!pof2b-<YD^#RTN^0eZUlJSRoO!h+uScyuWsR^q6t zYE|MT?o$@LBPl$~c~jc!^Pz_x=Qt!=21JhYij>@Eym5nHbe;u%DlM4vOZ{& zPa=+P_&6knXD>`-0}{Aj{f0Hv#{mwH3#ok)C9NGp05)w$(z1)}7Q9(xpC9d4zfZ9- z%+)*{ZCELK8I@1*4+ml!c*JJMniQ58AND3>ZBk`9D)!4n1OvWB#~)yX?RKg79?#X# zw2)FjisJ`X8!7eN@cv2ek_bUVy?-%ffI`#S`%%oGj!Aw8f;!xi8DqTvt4=lDncDM zxAc^gHT8bscs-)#Z;#MKC1ghXLxc!Jh(`CjdncrSS}TMVLl`qfv3q|N0-oFXcd)YH zm3Z%YkEiBc44J6;rU2ZW$qy@bXB%HO(Ihrx=NN3@Y$Xcc0PdMin153koySOGLyXXr zym?%S9U+B;K+>&7-K#W}gNlJZf1uFG!|wB|WMB9RvnlFRAd=|>c{Tj|%gz2C6qf&A z4?^%{U^{2+ze&@HwfU_tvT>onVP7`$iEuh@{ddu%jkKqW;X+Z}+JQsgP;AXkj4mHb zXR0Ab6x$Oi9;4g#hr;T7yj_U9 z_O&c;Ok|2T8rH9>U*}zVq%Dqx?X^@?oX-Y69llJ_eqvxCQKtMsDY1J{jm7p*ZsK7^ zTKFL{Fp0p<-cHV2Td1^eLws@G*bgYO_= z&)vrZ>#O#h3ydEdGFEA-V+tOc47^MWR{=_Ym`F~pE_T~3IK*uJf%%_dn;BJO3Bv?| zqU&>Fty~F2t10E(P<>p@e@+1%&*u2rOFw*C`r&q&J?`yqHBS$Sb4u$VQ?YRMTD4S=jP>uvRcRJw75dTHtr`*ksB~MP460ky06B zHsD*eMX4>|*jd0mF?I!8vP-}zCiU)xA%OG~$va9w2ZvfKRp^hrJ~z$h0Vf=0*L6m? z6<^n&KLra)_$RDD1a_j2W~qO4SF1(wkr69hRof(6f37Cwl~kW_8_7xUu=4`4i6u!O zH`^;I>~h`mv=Bm1&=;e%#Z(G*&S{9E$7GCPT zYHeW*(0l#{&8-`wH{OAj@)Oyden&!;@{l6NzfmGCcayNt>VeHEvy`Se6exMJJQSHTKIC;MGP-7#>mj6~Fm=Q7Sx)h=|< zk_ZvD_?Dbdg&V!tMFr~KTt00r1ufClPN&9TpO!{+dA=1RpIrIR2NgKsPp!>I1t%QSgKa3 zj8N{4@MFbi~7jbu``2 z`4Lh!9$?`cH{l{6#$B*kx1=~`lW0=xCx8D1sZQt(T1wGwk|5IjSAz=%+&qnKK_Ct7 zTU9uwiaxeVM(1}|1Gcw<`#A`r(Xft?!op{fMMvF|_g0dX9nh(@*u@^j>OyBPlm*WA zOlu%s|1~91ZYv`@4c(7q!r4VgpO)*ahREVWDam2Xrc~4Z+acO_+_%SG1v2Lh;yq%d zTm)yChvIP)^6d@nn``We5*+FuItj>|u?;Z(J5W+uBxHZAVH*DMNU}n|nm;1B`#(uf zQJz*-OH}#B!&ycdGx6pa#nfT>Y6%X1We3%%_~|mSx;s!x5}pnON<)Um zWi9!MtJ}-$3tJz{Uc`9g;|^-$eg6kXYn+cSgS^JgKzZ#V;-`))C(C?g8Ul(6?6H=m z9eZ5FtpV2`vcU)!Qq){g-UerC_CTB2xnnB}I~0NW^&OjAU*x;pd3%rFPtag?!-IoR zzQR}VLJ%{$Y{mwqAcP8>(w?*m@y|IwRi@_8i7e;5yj!TmqW8NOX71`B((uGd5i#BW zrS_$K-1J^^_NYCiT5kVWu@IbFnCtRm%wv}wy>VO#5Z4U7e&)PInsrC$Xo7GLm-7~C z>+rJ}Mf_be@Zvazyi?Nolfvy$2#l;X?X~enZsYr0Y8d7|$>*NN$9El}g>7Wts|Ki% z+GyORl>~m*owoyN*CHbqpgajwGwVY{NO_6z>eW@1NAst?*NLMdv$L+6Q7$87edg&1 zyf?ye@AibM>a(9M3B&*vZzXaX_LaPQQt|%9f~M80`t*MZBWOM5L)JLj>AlvudeghL z%e=!ZZ0dhV96M;{zU-Pz4#tl1ZCpxWeM0kI1)coRVa>wKX@J^y#mqbknD#vcEghxr zcEPK5^h#KFU)USe3DaBlLeXqsICqik4Sv|Zzb2QVN0j-E*eXNPcmS(uuoUo}ptDze zlUx2aVO9f_wprXb-9&g5WC`B1 ztP=PSJ?9MO!likmLk(}s9gyN`pix{BGIDU0qpf=iN2e&&ZGLp#!L z6%8vCCrF|sxJE^=@7ff*F=QE|FQ^^xVBPAp^9W{JS$izp8aq+uXV6dAe0O*sas{pF z)Vb+P7X#03L*A^f=H%jVeuBQ?+CD-M-D;_3CT_@x!717^W8duoW!PWASdOmogbih% z`(?_(u(_PAoPAN=?ib-@=?E_NZ)RDyKPj`#!LclOIf!j2pddst@ov?(KFAkamt#4T z&P%9B%f4F184LQkJG2;GbdyW`c#OwYgZBr+u)@($Hb5@m({k1)vu{h*PW zd>4d*$)KUyU3tH5n5`d*G|$RxB(ov!-D3L8;$Ka7Y0Y3aPh7V+n3qdA6>e^VPVV`x z#^iZ86x$`flF_rcM?UZ55_8q$zH$Ft(|#Du0=OQcFg@7@~$>@p9PQUvMvUe z5BMOr17-WcHjVmjx<KUt&0l+X4CjZwMy^F( zk7Bz5GAH7|KE4m%*HLV~8YFtrj5Ab3%c0{J=eO%y^~4eU{^|;l0z&0ZzNX=oGy4u2 zsV+&wO4GsZYCU#z)ukVW$2+L>=FH{%C-r%;w$FDWw0K8wo({EYkLSNM(uT#^Ma2ie zbD;b7QI!3ucnrTO4(d^!!uRHEz7H1G_D>7Rel*re#E?sm^MB34vi#Qd@wD2!KyT!i znuSdm$?`w&#->1Kw#&u#we(0TE|Twf895wEHeJ^UJgI0IbKUb(P%A_>fJ*gW=~H_z z4XlG2EFJK&owg<>Nu0MZ7*+X-N96YIX{j$m6<$ZaI#T{j9mXhL`t=XA=@OJ~Rn_RO zp*~@MhR}8Gm1x*cCpV3&$hTk^a;!01@wqs0ea zUtA0Cf0zyGm;u!+haDX9x=TofHqG~#mC0;BhYRtNBON1TF&Mn5bx00&biM3qYa8yY z{LYz@10K5;-ofx{3=v>Fh7jn1h@jss$qz8aL+uK>R`ZsOgh0C+KvK+Abwfua zR~UcXtH!F@z%ErCj79q}WEw;LTyWfx>;Z7oT*HP#0{7XsIjf?`>4^-IIQ{yl4~!cD5bYE*6X-xede3ryk7Q`wH^BU zAe9<4SwoPePta{|;4iHOI%w^KBFTjS81@NpME|myrZgU#RgEr`migT z>KisBxUh+Ol{^?Zc=9;%toBN^`-KSqfhF`DWr->3hb|8?#57lS63z`dNmig^j<*W& z6h5D3MI)AbsTQ5aa0JrSzLLJ`Q8TL+rXu);{}-Ud>Q(Xk$9h0WvFOh}-jSBPasB#* z-BL7LGmQZ+B74FkrN^&%)_H>0_4Yy&r* zIwL5Ay|o)42(I%*i5AJh{O2ZHx4w98 zprXw5%7dV1?-d_ah%d@?(sbr`3KAd2e3^fW3#PvIcv6qM(se7SKNIW+;th@s8gIt# zxVMjBu;olgCvz;}zo-_)Rd{#`Bm< z%CGsccW@=U)&#hVLPxtevLvf7ES#ixBtm1o_YZwm5*D`}pDcUfjWs8=J%9)+(RYXS zc|19hs^C;;z0Tojaq)H{%;;)L(-vn{1Dd^pN!_dywsMv9Pv6pOosomQa}N>pI0h-S8^nG}0wu z%SqSpgBJR?w=z|r6#r$CLf}nHm%TwZq|1tKze7&#eS5@Gbvb<80&0Ar0 zELxwYF`!os!T8iImuctR`kV&jIeCUBOL2#9@gJi;k$>F=Ke%MnitW#E-)GG$oKALw zBSG5O@Nf*Ym^LJ%=kaLyBYF(FA4)Q9I38h9N9E#KoYV;$r5;iup@dsJD&y+G8l6A~ zTkB+v9Djd+CTU;tk#6ww!ysBo$uxMv^&e>kYtRn&-}yX~{{QD-HpZWs9x1x$JQsrb z8ZUpn?r%^*PWi}@UF?6I&i`$Wzo+dn%dh^D4SpQ;L&b7;*5uYc&DmDLmvj*cBmWRH_dLzfe zrxmFuNNEixTiO>J7~PgYLyiPj=16!#Ca&(g z!i5?(^D6#)p<}=hQ zRE``1p|^9n^;QRz)ObkTP`Z|s?qR#@VP$Unz;P=wSIj!A%Z`0QNHTI)s8*+_$%d?p z*$iu6z4_D8ayVtB376(E&7Ua>p(#L|YXD3;R;76GXW6{v-#xhNT6yPIt8%FXByssp z*_iRD(JrR1ln1YSraD|ZO0o-)(X9`N;vQ?J#lw_fp2}|vK!+TDR)}KzOx)x~X(s3n zX5>}?Zaf(MCNHFT$Vk1uAqOjD>v(e$-N>q9=|H3K%?l$)cnJU%5>&Ht1c!-PIh`Am zgV(zSVc7w~vKOJ{j^quZXHUEPW+zheGw{speE2+Y2oY^rtVyb32H(ZcE8DMKdUJkk zT@gXzFj{3_Mda@48A~*Penm-juitQgfvMW}Wc^X2033(~vVD0^qHJ!uE0^BG+Q#O3 z4N49GrTjd;*@{aJ0M=yJt^B<1L0zrV3j&Kb1*}iTLESx#>>Pk^jP*p;hWtJQ^m%M2 z>_S~-0zI=aB=Sw|*ii?jY9bswc5&;^n!`T^{sL3W3)r`38%DZMb!|hEF|YX7B#uOn5kHo7Fk!Ho^D*k@nVcQFU$mw~BOw zbSX$EEuAAREh630(%p=b(kc>4g9y^yJ#>dO2tzjvIRnGYJLq-YdEL+NexCPV9X_-7 zp0(HduH!h)bM5v#|4j1t;6|EM+^M_vVSd&MvQm`&CYbRxA~nhjki!qM;O+k5^uc@l z<{0r&yH9W+KEE&Bxb)em!Xt#eREEZREwRf8qKY666Nwwfhu+~5Fh!|~&$ zbKcA!(iV|IG5Gu>v?tJH(25x%Er+SlzNZVT@E?uPbu?!1?%Ts-HtW=x>CgI>3l z->tWmbiKIy#q{imh~|NX6-)ahGDWx=$jBShpcvIGgRIR}L!=+)(5%sttbN$QKEvUS z2xDZ^5*%CHQNP`Ili-|&D_fY+m_*};;4;0_VPFlDE9lut)lySPj359$$=QpyuDG7s zc5)Kn90KR#)noG|rp@aFqEB9$;)e$xD-(5Yzll#+J?<8if9!$n7`@QqQ*<}o%o-FI znv4Cz2Ik9}R%(8+$>YBL0G?uyygd|`YWE{_QDW<`Aqu^ep(Sne2tX_U)}r9W@5sen z|2VLb3Fz4-mKB;g8#K8K=&;NRoyz#y^A72~I?)R;ftTYUz)8?GLZp(g)i1d%I!XOF z6ZUe?r($U-P>Tq>+cRdiVd12?Fwy zPTROLwpeQ|vs9!J*I>;4_OTE3G7U$%A?CQA=(=Fl)Mc4=GH1hpopYf%G1}#O;crRi zO^dj-Z|fm0UYusnxnotn?#}b*>Ei~!H(`EV2!kFM1sM=uFgSf>mxf5GGgs=`=zub?AUSUZL6>lONIg|64cMWqhsx{>M~&Dz9qv%7QQAV zsfJof)O0a>T@eILw*d#y=Q%ALm|yB(2-H?l+%-uagtdaWM~Lw_i_nXoq!URcejWO} z>{3=I*6h%2;gD!oT}>mTebPupz#7%EMN1blUR|<%*VPb`v5yFp-2+_js&D|$ z4~Z{8oyg2|04dVD72+HgXkXQ!aZj`E@mGZfuAFD0_lkGBR?mq)HGhPTWa&^eC|Y#Y zO?B6vO1sIV4o3bAb5NND)rfC>s3JO1YVtqSZ-U5btoilP1=dO%!SZ;PWsD`JARV9>yOxF_$E zo^yMb&{KQ+{DM32boA~J3D2=+4Wbk16GbjWIgEeP??}s|ndjPB90Dk6O1_dXbSG$^ z7LDO*wy@!r3&ai*miS5)HO9jex}9KT58dD$*MI1#GEPW>l&hj-_HYVKcs zOxic)UNDWQK*H|P#ypdYZS+u`u~>LoEWUlC{HUd%+|(WC9YGEcLz&!y+v%~2sieNp z*LAP&)Mexcx-vwH0ohfC{(1h2md3H1g{y)V8rk=v?)C(QS@qDM;M(TF%i_7a*{m zffPB`pt^-%p%FO0txIM}EYxj=i!jD4_X46bkB3saa=vtJQ7CMEcZ-JX{W+YEUzKTnVTQUqb*yr1NR`EJr zd76pUk5+77M}waFj(O>j(QCsl8;FN^u@iY72lS+2uhIL353!B`xijyR2GoNW%RN+v zTaV>wJ;)mk&Qnd&AknWSHs@1BjSDCgjF;kb7u@cVMOPfF=!#L4RIL5j7AldecZLwAQZgXMb*TmmJlW`QL< z)}X$98__GQlw9T&L*M9IB0jB+M>;>+zx@E2?e`eYPl*u&!+70r+NWH8eAn}?(FXI1 z`^-wG&s-e~tkZLlk#}?8407nV4a4O2rUj&EL`Q5>z_zr(%0nv}Pc2={D|gAMnT2em zzEg~d36(KYaW3jW4fWE)xt*MVPpkp4bYc6It4({*K! z>kV#o+a!ygVt2d^7b8>Oz3GXJ?RF&|*cXEqxX~fz2>6p)hRl$wo%W60ytes zf#$Y3ZmbFqHMhi;AHiJa91P_cN)~OsE9HNhA9cl3Ptti{OoS-joLMyN()If=^T;A_ zkjpTAzSGK?V5oa-C6E?EF-n$m_64(&U2-rW5Z}5Gqs*DQGsESD@mBU*pVlf5| zkBLVlpf1ox>Med2w)m!`OHnM#M{(B&ZHmhd z>nJKB#MA~nI`vE*3R^o|tGtZj#0%6sOOj`8!6p*jz)>i#*&!!4sWg{@Uy$?8jN<7; z(9MZc7~&`KkU_CJGo)y)nhbOgTi6Qebar&gU%bEGaJ0AybU!N-YWi~M)V}H{uc0P+ zY$xVo=}0&rll$R=f@TlxofJPt^RwRODsmAk#EL_h+2xhgI{?HHJdQi6#Tx`p9slYi zauYf~ycO_BzjUFi${L&R;v4v&APj{lsR#uVnhrO+5Q1Rz4H{ zE1ph*<0taCa98%Y=()9)LhL{VJ~je`vhl`NfG=uJ1GN6wov`+mcsr4*S;;D@VLq-N zcc3TZ(fu-(qIui=<6{1eqZ(|6ipf?Is5U#|;o)cQ8}hpM6wQk`Fkf~nXgEk3*9Dt4 zUZQ9CKPnU2mTvK5a)nQMo|$)Cvj{(f115DtjIYf)xE*f&GRx8~6ycJPLmZckt6Prx zIgr z74_Wg6y7U$eEW-?g0z`AykC{a4xiU^wacXBu;W!Dg(iWr${dr=i-K3f1D`M~*jD$39t~R6crMKSuf=`K0g**oekUVe~sM5wfrDjH&pv4$dpb7~*x&X%UaUBK}D4T4A z?P~sAoi$KDyeAlm4*GltTqn7U!ve*4I`hXKsl|J_a|qWeAJ$=xvd1b(;Iv_en;jOb zqUlxMNm1Ij|0-d=~Tv>>=bQLmPsKhucDXZzkYh_V(dlsm#-^ItAhAE-pu8{n{1fKmR z(uSwYuiPjbPKgjhoP(zu3c~_B9S8KMUW;8p(}YXIZcqk-oTsG4c?mue$@=pOZ5Nb3 z&jg~~V@(Bl!h+)T;L{j^K~C3-zR}P)A;}n8WEaE0GDBd5I^w7_#Qax!7~~CmNccrv zs{{B?eiN4jO>on*;dRS!-}TuoF^aaF4waVoGLH4xG)azfGG~tk2L?J<&7+W9{<&SF zN5z18FyqueqIeUfV2Fdmzq2?r?r$tkN40#y-zKChUQh6~(!JlorufXPn8(09X?j_^ zhY{oS0Ysg<$Gefj5zTFN^+3NP)0p=2v*}v1iYjsp>f5L}k15pS4aeqT8_m(`unk~m zz%?@><#2>rw};8gmOuLbfjY!AljPF5heHaEI!qAd$P@zpjPMq2>HIr8dr@}*Yp$+{ z%aNz0eC6=jR)qyZQe?0%LIu@1u^U8nSw6NSub~1icu()r7|q!C96#@W!OU2RQ9|h` zUh$p+_h_F`2UX+qu5f&9yv8up$HjY1Y`#I6UO)HY!B>Nb{>YvqicK7ZWliA>07;b^ zWI)d)bb_CrUD>Nm2fPeH-MS3(kZyF?+ea#;d#^x3aUZ4_^QArPTp=d1Q5tiQND8E7 zm0tFNNN`}0$#ucd8fuPUBK9}*v$C(u^)%YRx~Qz*D0#aj_?vJ$;0sh?ah7(XTDzr|uE9n4Gr9zq zG2EfgVHS7e=qsc9L`WwvZ-X{E@=hJh81W*|(_+TtnO7bmqT2`h^@kS|dn!dGjhJfE zdytU(>&MgJp<0ENamo~zW={e!I+_{Jn9KotC0)#$AWC`1#_n0DQL^C@$R;`fNM8ue=9d$;6|hCs@e&vuU5LJG zzG7$lz}5NQF6$$E`!+XYn>_kg31l?tceQrO^P|6}(r8T}L)5Y%#?XPbRQtMnx}ERz zQcG9xP-4iFcTF;P4fen%kQCGoF#v;ZN4C|lfnH>Gb;h#GB*holAXJi=nOA1cJHr1a^Rp zxtgC5P`>ETnpiclIch^4mDMs#BuUD9PK?9rE}IWP!(U$;U?Bz2RheG*p#aPgp}8VLZFk-T^vz$v1X!NGrOUA|g$Cqi3&UyTSebeWiEd$*D0(hUt?=Ifn2J_SD+O|ei zDu$hke8v!s!R~)}m`j3U%jmKO1?FLuUcQj+e_!L_iFOy%R^X=Bw-?Ps8sfT}o2tDUBacH1v+C z{pZo^mR9t*Mk+ZGSa0cmXF|OM2VsJ|yuK=(8kEH!n*H8Is`(*MRiVFBZ$6&ufc11BJVFP|hQc_(^9R2w4{xKQ^7?S~ z{=}9;+&@V!V#&2;wqex%$-~sRupwC^gvi>%*$;8QwDYpG>wndcB?f=%$FENy9du;B zqWAwsZ-i88iD+JKw}gr#gxY2cIH8dhq{9lJsa4~PO&cwiu$wZ-pW-Ue82ky{`6KXf zGL1x1H&1;Terq1X@N*-3yOi$Y;iix>UeBuatqqXQm!E3aLw{tg4j;8J5POGLkjP9H z*7-W(7E%C1`c6!q!jh)m{h>|HaJ&}3uvnoOISw@u1JWLD-WUFi^SYYe^)v00TrzD{ z3=2ii26IH!oQm$Jf`^W;x2ilTKPfqHQ`=}YP}1y$X`p1_$}--~I2J^?t$SP6)cYGJ zqRCuXj~F8$#W_h{AnZTEn5z`SOE^#j3AhnkJ9nHQhE0F3b@OVV)-Oc!jmhVuZsw{u za}xivW=(!}NxoC!YC=?;9?nfUd=IPVOizcWUFcTF9|-zqOlgP$=PH0VC1H8#&Qo-V_V7%rt8f~gXBFbnCEJ2QRVYC7 zAYS#6IjS*{QtUM)pPLcr!n_&0+Q)EZN^`8(*L)NQIb3aJYCe-$Wrf_gx3D=Cp zUdLK?p%n?mkZ<{Pi90xOQ(TgiOaHd~mucSk{d>NbsS6S5zJL}w5+Dk|&|(6;UFn`t zEc`)696LS4NL3Dsq;^VM;om>H@(f$aI-JfM?H{U^uJzD%QNfy+FyhYZNA!3vr5OrJ zNxOclhdeQ33Fb3bv=?GU*(P$t7{BYHcA|fmMP2YlAnh+Mm|h{bO{`zRDuHoz3@ixD zGx%p{&sB`Vy)iO8n(WZtKGaGG3U*W+h%#~yoqKEVMsrZTznqxXiWPR-z8bH`_|`5~ zdPvvOXk5%Wjk7H$Prh9AXLIk3*9sVJfJ7+ZX_EdI`kQp>y9+5)ju0PBGue2yE6j?$lx`>a5~41+*E(}m zTK8hNr@n}I&>ca#lL}IxJ_pzg1GGvr9z<^8iM|REpg8y@V93k+Rxq>ah=qKl^i^YD zaQzqFL7~HynqaR=lb)m!E=h-vWtWmr(8|bySiq6cFo-p`g+`AUveZ_`3Ar<+-4g{Y z8f6tzxS2}D{;{IPgS8$SC7rQn_{3`$o%@bXppExmYLbEiz0CF#(#rOVfX+t4GepFrS(!NEZ|oJu>LqBMJ@!foQK7WusZGl%z!;@3xOnp@>q(PI;pu~9EH%yF@8k`8#{$A=Z#K3-9 z_UR0)W{R6M&`FS;>xJG(*pNk7I-&Fh?R0qYEoPSY>#uCow&0VmPkT@be34d%A021+>c7lCaH zDa0Hk#Y-6E)8wgJ>Cx+_A^8C`D3fJXZ(1-2UuW#~yAl>vmOrnZ;;&-;qTWFamAFZp zg5^}HGL^jbbqoq{boVZs=8g8fNJ6&^6VPnIZ4Uq5l@afyjEfjzje27FYQYU7|1m=D z6(#m)B}-{2ACA#!HeV~sTHrU4_Dsb`VMm%cF9Ow~*@oYfk}P70_?Id|&~eB4&z!sp z-^-o5oIaNPq7cy0M*xVLPJ!X z9@RSH(9fLV20)<6sF-_p7xJO~_LU^qLjKd5d%NW*OP#GsOr5FQ!_=Dy{!a$`9!X0p zx-Y(ql$6v@=j&f>tziPK0aU3qBmt{A`GO4G3mU(|CP>W~xvfbC7Wg>EtzY&d3>Bpl zaYjurg&XW_G4r~;#ysJhS_0T+Hd1y%sV@jV9Ng%~mi*Bjcv12h?=ynOWqyfVf111b-Ohhj(1)m)OK-2=nkt!+ zvL0oUFyh(@jzn^ABJ;LW%RcjeaDyCJf3iyEkcR;M7q(y96ccO-WDnb%HW0cgoBXc? zA8E5c1fRRCg+0v&jg*6FZSuP~cZzR|J5bA*hk3h*d?q;`w9|DUG;Q@kZy&y;tz4Li zOV-do`t~!qq{_e(K?4fjbfLRWS7e_;7S=^6SZJnUWy&))Cm@r>putfhl(TR<+B&@} zO`GAH{pGWUuPZ=Z>dsU3zcPdqE*fL@EAe?49!T5_w)Q_O%yYTgV?N9a#U-@y?b$=i z%lO|?bDAjRop>A|Xv4T9LV#|#e9f>AZZQpIjhNR)UggVYpxP5!L^z0TRCd?W(wOku z)H(5yM3`3qK2sV~GJbT{vdleX_1lbP1K>w`Cd6utI#Ul2((?owZn6>&fU|>>f2RkG zCHsOmG|Pns1A$jsQX!=bn-8H$jFFoJo&`oc*u^}Yt~l05KPJ&>NT*K?-6vI6vh}#n zKPGT39H#bIcgV4~Jv$M#sz{SQ{1PuVrg_*?E3-0^Yi*u6MyOtbwjI=nUtBF&L}nGf zLf(b^rbQ65|JZYm<#{Oyw^cNhAra%jb>mS2xeO@J#If$32SWI{F#-Nbp>4Z=5(Oyi z$My~F6NJTl(H~xVE418`HWv6JY5ghbv`_!PYB!@lo@PS`1#FTC3pT0(hXDOX5{_Y4{pcQ3p+=d2II%CD2%c^@6RuU`8kNy zS#EL%ncXtr1eH^?i3YKnL4;1tbN*G9Ii1TvX{he`Y!{5)Q|M@iiT*PHMe2~#8?TgJ zm94v4u*H({i}H$v_Nkz~xze*k@OA_@4QjGs{J?L{OO5f3r@0~ue@R?kKZf}q+Nkf&iFO4uvNq{kRnXNNgyeZsRoO$tZs;TO5 z;&6PiJLhQJ3{ca(1Ff?XYHGp$ggtMw%XF8k5Uz=T#Z3rDGam|E;G*g&OmEH3wOLaE zA$o>j8B@E~N5}r5j=9fIEuFpWO*xYKv@q?~%{i9zdK|+sqhcm>D-OZjq2RJ0CrEs; zkiUIU)tui^&)P_bpZ`%UcRTCXYC>j4n8J8}0go+eZTS@55n_fUjeXz>Uuq|A%>Jay zvwqY;Cov`*L3~|P20u{;(7P<&EJr<{jos>m=H$h>9$AUQv>(Ttav85p3XYl@jqkG1 zK1Rh0Ks6*$)`9hwcF)u;N|$MJveI+OJHv`UaKi#DLiwPShcLniGa`5=yny$*2t3;Z zG<%U&kj3@*2e`Uu*hw$))9TI0jSZieY}>F8lB&92>bY}E`C@=EgWC}C&8*0ABvYQ{ zNM%4g=;oRXu3sHf-~hVwnkKmgH-V!I5&nv#q;yLb#G2|!?uk>dM z)*S^nsWhQ)Ric+^EyXISN*=q3@z|Y!d02oE*r5HCqh!_h3N>doRla2}^r-Z5KPw^Z z&st`WF#u=#bbZK9bK!8fy2u|-Pr*6TN(J-csH%}#-_qOQTWI+?{RWyCW%0V0b@y9= zz2<{p!J0C$(1j6ZpyC7CbTkg&Jhq$J?dU`<6^?^fR~7vkAMgob;C0v?Cd&ydcL&qy z`k0IT__FUX^bq^u1y4KlaETPGx#?xQhB$>WW3PvVKFpUp>Fs{j=)0Vb3&X9LCLOPl z+TyS0+rrD<%NR-8*TiPZk+F;EAwFD-u;9%G1(_jNQ3q!o1NOad7R7iC?M2Yu-0kyo z!sR8{yXIxlZ)u6o!XK0Ln1WEprMCym&76H-52S}FjJ|B=U2pIBLKwBAnzfyX>%?6N zr!u*Ov|t~9+R4%>h(8FhZg%)CPUu^|On*uFWN0jIcx5B@z6J1BJR4zzI0dz>E6jSm z)BIVmN*u~zS}7pW^DpLn)1Ijupe|`wO4k1{>1&Jrx?dK>0f_U!=@3kTP?SiQ{V#5C7~d?|5SE}i22y&Gxc z{rL4N$*{0XNWu6+Ef%#i)=3HR?0mJt2*2mKzc zA(Hn06Ss}tgTivfa-r;%+e6(u0?6L`l90gCVr+*{;Hxx}0C zk5n3D&VuuiYscK7^DVe06Ik7L=${O-%#M?^%*%d~)nkc_q+oQx)TUI;A+ZdY#fxl` zAlxvV0V~Ly;p5)JyKUU^akj@*yTcCZSZb`#&{WzALX zRdA3q5e^7A$g{Qn46M|?p|jQ`Z*4p;v7{IqfpYiJL;u@ExYjOu)Gm_I48{~-h!NT+u#y=NXvn4*=|+oPfs0%5 z^%VQgq5)P_DdUg&Hxd3u;w7h6G#hi*(9!zHOujcyHH8MprXL@}#KRlm*n(nHWlN+T zjWrKm%Auz#jrTApWW#f*X{_dJkA_=<_PGFX{4};$0zSGVrvM`;lw-rWjuyR3Q%0=o>dofCy@`%IMtpo-O6kmn22dgGILpz-8vNF&W+#C_{yD z9{f-{+VSvJ6C&T7`Rm?KlBql4SPoYZ&vk6-NwA;*>q20wK_>{)X_@d~dGe``zeytt z`9ZtsAz#zkB^Wm#1UZED_@#nF$-+WheT)|tR1my4*XBJUOnzq~zb^WC$@!Y5^-5JO z2yQ(G=&S`^*MJg_|9U~$vbsZG6=@rszWv*Xg&iq$p8nz^B>^m@J9Nr%-xN(X! zROnj{sa@}-2I44t9lU2NL$0VL1N9~!d)jekUt$5{3UJsMA)uv3&bvS@y%&q9jl3cA z3|0|jSR55$+hD~Q(>K6LuxV-StPVX~6i~2bbVa_IF7dT7Piub&L!E@Ai%n(cCZHYd z4Op@CqG!;tYCpQ9-`Hb*&x6UPG>QL+E7+}|T|mB`;}U6i5yo1k>w+8BlU>gY!2(6f4uB|7h27&`ER-6*-zVL4zv z;3bxtlIM8;r%)cMhNEoukUVtOJ^;jzvR?vPpCw?{@b+fia5XXs6`ZC`FWonruMKet z4?W~qr)5Q2y6>RxyL^P}j9H4~aMPWe+ZDye*?EF?Q=Wb{`yb$SZt1GJp%54X`PJe*bw$JMp459P1xUq+ut?_fq9T&|C$0MbN zZ6md5qYCO9FPDOER$^jD2C|`Kf&;Lvmq67Z=@ZWA>I)u*nRXk_rS>NTMP`Q{3{~Z0 z)Aw8fNpR*+XK#WsxC858C_0aR15bHf)V?}1kmVq1Ss2DwvGM?bojruI*!iGzl6#(x zV1-Q*E9JpdG zaU<*|zbL;f+i*n{7||@h#FrF) z4U=CFMau9&GEnh%_svjK1oQ7cnq)z+q~GABgY|#yGb2%IBxSVE^r5oD-+1eq>lb<@RL8!$2_lt*C+VcPFrM=Ze>O zQ;nlv;rxJXBDEJdwGwZ7d=xCdZz(~wpLep$0QGjnbhI2VJ!oJbC6 z#BH@Ek{g@u*z}U-4LepwHu$(3)?9xjJzEGXGe3H*>8?<&Z7nzlM8wF>VVH&DDN zK_1TJwKjuv_2kX${!VlG57se`zt_#ySQ}E^_CR_* zu*t|LNZzAvaRj@z?~ojF)J_8p7V{Q(PQNr=5)tahGjoOK)Eo$vW&i{Ef^gbjR{Ry} z2!C6&LJaA{oazuUOV=!{QV70%hL!o&>*~9R4<^q0I>2}Km3163!VKNqheOX7pUX;C zwj!_U8HbmIl;c-$MO1tJpOgnos_0ZXZ?GhkPN4j+u_Ubqg(Y~$6k;$A z|KoIEff;iBEzq=RHg2AI)qChQ_f1OV%zoY{Z}c3G2kI6bh}~{_#2qu(ahsg8c41KQ!Azz5eo{;e2XEREM3V_fO(DK=6R2;=m^o-v#_{r#QO?9X*nkl)l zb|XiTfbac{Jo=AnRB+ArB?d7)dGrS^;4x@+Gk%Mh4)$4|IQ1FIh>z03;+VRK8q$r9 zJCvM8$+`<&=avZoCIkB8oF@cklT;le5(Y;?ULfQ6pJjmgL_0A^5z`w6+T9tiruGn@ zyDj-}b@r$SlT|Ak^B9uCO;{eVvRTm}ax#WQB}D2Pi{qpZq@@}c27aQZ#GsyY0Pu$jAI8XmtD+pwT>dY;7^H8Zf&M^YTj*fNrKkG;|!xLl|&i1q_12jwS{^ z_M#fhF%K)IeoEK$Fdu?Zs&4u}CPR&@_Bm%Ni@7_Lcnv=;*1|!#IO|=D(#7LPUUy_` z>-(|oiyGsMiiY4RXUEq5L)_XJbDHWg&7-b#19aU)7*K1(@~0un!b9P6oPD>B^_Q8ojt{dLSwQbt70Sc5h%ph3grdrKdxv-YLJenONZP zv0S_2X+GD!e6v0@>?xJIycmYkZl*fK^Lu5-<|1y2TH3vD{SG~g@Q$z7sJqg^pW5h; zG8pAu4%^MbHL5Ml6xpPCA>tu%Fr<>%?%d*T9r|~*>Lc7KKl+35wc-ke@vX9(**}9D zpS7^tv>8{mU;Ts$2mCPCc^=I>)$3(qKM$VC#S@n3xv$X8wIM=HFadEp=2wJ!+7<6T ze_Z_@=clWe(YIiEE_H&WjgHJI=1$dw^mw)`4T`4}!@&a@QpKZBNeI-*babaQe5vmB z{}OGc4=iM}c` z1J8|q?7X7XqY4Uu9J2CBmlFANf4(iBAozkX0`^r>8?}Jj2gmF3?BRA8x&4TB9e;Al z4TY3x6GS|w5XiZ0uTt|gXM&M6y!uLsts^5BJo2x~&Phg>S|S5@kQ$D z^21{9u?srdpr4MvHG-g{P3I&)yHyYMxu3N6v|vbqjlYX;=x~Hi+HL;9!jtI4uBu-Y5`CBdS45_d@A?YXd$vEseMBV-?}sYD%SSzCm$b z2U$GS847TwslbVkF9)*%7=Uv%p*gPTW=rgp=*Pl*vi zO!-7A%mYK$$@AXfZ=6Vf7UM@>M4Lb0iHRIwL*h@jLK>IW9`*viUCa1i)wU+K0giD? zu6GDOIQ-TJq3g|51vLJIpRTW$M#x+cEqY(>ne^I9Z-BhO)t_XBAL|>(e2*nc9D?5q z;gLwvjOD!|H%=mlNCemtU+SYlVbRB%t}4#eSKvqNvT6?lBx#2v?O%S$wuBsKJgN`< ze6%##U(rb%J~6IL1F7<(;&OP25YZkKZg$=!;pTV=i^uYikSYv{OS+FteR3)|{Hix| z-EYU0#`v5AEGZVjwB$tC^5t=Uhfc|hMWULH`P+qLkI8i=BXW(o<=u-))czQg9?8*O z8(@4WFM#*m)ZB}FS-M1$Y4R4YY1-U~-fJ}D#+|Gf59;_eAl8T}vqe$b4_)4s>vu_u zKK_QE(LuX@$(2b*#u}e8ce^CdTUlV-r`McZS2RG5?wxC3H%R>>(nSKu0(3Ft&BGBP zIgn~yemrQn-}N>D=|Z|z>i5QU^VtgFN1?Zb)(NeSMDxQ6W#3~)ANibiO$b+sxbS^U z#}*9%IRZTQXoPJXgVorOniB&WCbifo9qVDsLk^gi*Fg?jx)3)|En6y008W=;{{gN^ zcr|celf1)Xt0Ss}D4o2sWr-1ke~i@dMdNWW|{iZQm1|o zOIVjJw34fw+RgiA%sR?i38wmcbXzK87YPW-Y4XY~mOv&r@vRIg3@NVO;Mnxj)XsN- z2D%8?ScB;PuXl%1(4@3@uWN5gl4Zx|@M|J~`|{=0i_p!*Ge(}-wjPI685^@(`dK0&T{*Uz4q8ejHpW;`)7*D7 zj>S!dmw$KhJnwPYeO5TC=r{2%G*LlFgL|N#YA;;;;4%Fc84Frn(9c~-8*|)h&E9Ln#8PrSpZ|PWoj}_X8?pX2JFInv$CTt7$y?|;z~K2z&S5e%C=Yj zlhy@KqvxCEYc!~rL>jeP3SC;5C3%th#mbZsO&!#Ghk9e3!Fi`vT9)6@bQ zyP}Kq4F`{+9`1xqDQ;g$sfJYdU(ZtBqP_BO%2UisHtvI2=EwLz)~D_%g{f`b4Pq6# zVvih$nLhwl?E=fyAH#r;gcZ3snAM`IOU#Qq++A2%ZmbqX)12bJ!o$6Lk4_GA-y^5- z^6a~H1A5AJY%)l>^6oTytWrKIek+L^dsF2mj5bFt+?@`tw?;2DM%f>=w|(31Jmvjs zNAAD2?*8(FwgbqyYP;Thzf~@OW0XgIv+J8mM^3}NO@4)=QhAWy7EdS+pM_WU0t}3Q z%Tu!BT$Vga`SHIsWhkvMcH5Zq4ET^H0 zLNHDAkxIgRY$GgG@#-eczG~*Q5>HW^Y2JoEEkn`Zs3YYzT$83bz4~+TE;Zh!vKMU_ zLW{Nu`KSX?gui~U4?XYB7x?`x|L*#oFcY`7BHY>)mB2NJVCyT&*RqxrFF96Li@U$_ zquvtP*Z85nhhrhqA+>9=A^{`U)HwFP+do?R4~fNpb!)fC*U3O=l=V8aI0B{-dPj@Lxz; zeV`02)QKh#owLA%V{6>Y(~p3jb;pLWpdm2w>4mDCMPs!Eo_Ytxt@1xyO(@udn0`s% zDOHL1`9)9Y$FIVy4<=`L=37E9(u_lVYlv+;yTgxjh30vt4|>9fweF_fzWb%YEVf07 zR|CzvHq3kG)Dl69$y zoe7my+$O!-P)lTEBA4%Wn-tbFqJR=oEl5*4BggiQqNnXXc2HVgB$km2%i7Gx)v~LP z<`dLriGT$mi;VP=-e^E)%uA6;zihUL{b(WK+CeJHm;SfW9us#4)*6^pKgsal$Op&eyFk zP~$lB<;{*-uf{FSrFA7|DeZo#fHhzhILE|-?D2V#k2+^($2UkD-2|mVx%H3E3r9T& zPCWcR@Z0y>>l7b>gzWZ`wcI-XM8+5%;AHy;SVCRDf}4DGc#75)2wi`BlCko)u!8FD zmT9P>TKuBo=!5Eb+0`}o9*_A0BkXXO8tr1oW!Dh5OO4J(yG5-~f>?-k8Of6=^4CR_ zkigD?198cc!65LN#NezlV@^?O_FW_H^Ku~Bdh6&#ZQY&|yqvP|0!c*(P(<{g;^^=$ zmoDc9DSNSnvWG8A?ubCjG<5IE2&7uwN*Q+f@r@ZNhi8+`8u1lJ(+JGoytP2Y+6Q_% z&$WT`3e|*@yH1*4$Ir!dU0wWUL`eACWv=A6@P!7M_(@LMAC ziRjrKz{5TunbE(;uf!Cm6tMjFkJSbCTE&kDqXn*98ZBr`eG!p~*&q1uuNZ_jf%>Hx z?PUH@8TQR!I6B~|w63}|VPgE;QGpXZ9V0kH6`=sOkG1Uwhl=^GIFm44I+)FFfBVHsMc1QGpcCvaf zfmbB{()w4=Ns4I_e#SbbP!R9@>@IPjZ4O)bv3mz48&uH#Bj{!PN6<4tfgWt`e{cl- z4+HTgJ3=X62;6%iBD_y@$NuHhnUhu@!;x0(lK^GPCZBt?EyGB?wUPH5l5L46Vk%SI zbbTgB9*$L1aO;GXn|<{L;!twl9&H#5@5!cX6`R1&{k7DPv((x?l-}ZxEo_8uKg>cY zi+lV!kD$!GmE#!JvF=3Oy>pKDIvZ7sSCQy*x7G8XrMf^#u{XIme1KLicF=nVnxB!` z&t`(pIZ-lQ)Znc1_#JotfH+fC0l-DtePp)tf&_F||2_9~Hjfigl#v+fx3Dkhu=feh zxIB+tb8}JDk7Mo#lS=Kj?X0>Cu1F^W6TUo;S?}l&=wAQ}CS#`&`56zxAqc z0qsbLzStt^wc{%4(9QWjyu&&kQuKm<7X40q!miEBq7oh$Jm=ZV_!svuckEPGmg13*W2U=Vzh$77l%3FTZSF>iW+cFvKx^?LC=G*(hhTG9`FXZ$#fpHo9w9% zReKO+US{Ub`);|NaqsenDbAL5s_yHvVB9+@2{OC`!t?zw}x}iMYrMUR~OpSHv^cCY@@(62%u)e{q zV5y|bbQIZC$PH0UmTUZzok-FT1X6({O?fl-Lu`V`_7@TP}C~U16W?W+@`|W%|CAce^dMyul92}``r4Ojz9qw;Ozgm zKL|rq{(o8U8Di>_dZwH6b!ctFi-5bXp!DedG@~*V0(bB0a*v7US5+wY0s-?WxopIH3a3c{h!Cb%z}$Q z1OI}p3V>5?yS}=A@^9`w*Z&IUYpCaqFRk7GpWV82LF2Q3EjA25;0fI2y3Q$~2>>4m B0^I-r literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Common.png b/esp/src/test-ui/tests/framework/documentation/Common.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2b76cc7bb8b8565471fad4f62958cba598e55b GIT binary patch literal 6174 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Config.png b/esp/src/test-ui/tests/framework/documentation/Config.png new file mode 100644 index 0000000000000000000000000000000000000000..e33466b0fb8d7c95774a976fa76b5eb491869edb GIT binary patch literal 13193 zcmdsedsI_*zHc1w$V^-1p4B_2$68?K%veS_#i>Y9V#u+!Qc#H%LXMG;xzhqdET|At z5=fkJrk>6?a4k}XM?$SYWQSx=g$T(ei5;i)2qsA4PRb(*t%Z5)qMhLC_4Dk44Gc!17;&hOly-aa6xkel+#wtIq?L4B z)UN9R3y9~hpFig2Dr02|SUus!xZErO6U&RA5{tzin`IB1qexH59+}X8?-IKqoCxll zVXPfW-p!5ITlGk|U1d&aT)lx&tQ}OQxRlZ=OE!ASH_s#;U#bs32mTs1#(i=ox>>5O zpY}|%M8-T$gRTAyY|LxmY(iNydJ;k*-NlUdT`iqcnPW#)gzlR&w?x)$ zbSb1zlQovK$aR*T+iN;jG^?^EvIXcKNUES(^-35YlU+C)(By95Rg}q-W&AD=A8H=4 z)!QE@347-IMmmePWr$j3)o#@Uj&D6pV~OYmWOAZ?%HtjMb|`%l+F0~j_X^U|+mU-d z_hInjN&gQ?;e^m@y~WHAMYkpHo0{((U&<7%1KWDLETH?%?J_KQS@1td%6UIn{+k`) zcNh)dYN?o^roP9K!W)SeA`#08@4>!L}X85NYGyJ`c z)9QhijB*xx4(ju9JDa@$q(Yb4=qu_}8n8VnZ8J7C?2s4Y`s zQ6+&q=Yl-slWgRYVt!jsG1D_KD$|}qG+h|2xvg6kH0C$(l!Y062gOpXm@S}dcNbYz zynF`!X#jDUM%yNDge0lM+5EUJ8<$u1`h`blGux6t02;&^l_}IZ5qCpDb#AjPlv?yT z2mB_DhtDKiRkHH_eDELJ>1m{#2g~@!LY``?fzJP9!gQ%p=aV&YE#jhdC4_**_B7MYp;j24IAKP> ztz#kA@WPl?bOEs!j9K`ZHK8uJ?IqoKZ7F+LUe2_m;&fOC1?XiB!Y3MOspq%_eK6Ou zGHdteo}mIp@);Z*wwkZU|HG-mr2;G7Yisa9d0vJ{ZQ*epM?&~aMN>G->g^GT8BRr4 zD98S>;q(R9OG%v0{b~Jckm=5q5oZI-2>Kr zu;-;$YEJj^l)269uH=@9Q?g{_U){M?=(-6?vHR2kv4ub8=1|=8JWo0ngI2*VpHif> zp>A&I{elzIfwba$Tmo)1uF$NnsF`e!L_}JF@J*c0VVApk=_z(+VP$}ot9Mpgbk7f; zb&MRIW?}<|in%OqY=Fn<1mGB=fnT3MPhOT(+C0o{7 zc**CuGC&;I=)7mJa zD@5|l!*}2^4qX$&^9vENf9l4mxr(L#1vba4MpCwqeqZ>9dCH$b_H7?+xze31o38k< zAi(cHQcYr=OJ3vWcQ|saIK9DHYv#a%&_HvB$Ftg_=IEM7f{McFybDP;bAo6Hn=oj+ z(|?~WqL%})AA$B^-t=xPxk51}=Vzl9iH8RlxsSQ&3-2T`;k;aMu0bcCafcO%ofvUr zDsC1w*tJ$VZV9sKA*e6Y`@5ld@re4uxJ8Yv5bceu$n(t7$zvuyy$xiypUOZFAZ=}?j`V8YNI zfx^5;fK>Uj*$jM^TSLd+uxgRM7+z)8j6xR5VPxsIT7{OlyytSN0{*=VlZCw!b@&%O zrJdMHQO3h=XYLzP1(B zhO>Buy>OCRrZV(vW%xdN*|D{^813F)?={__&5aA=TKneKjy4^Yc$O+We%{~xt}(p( zy&*;F(b~5E3fU4@hTocJf!GLVWQ9k*edP%N{7Zc!M{CEt1^QgjBG)EWNlF#(fNS(u8I;%YK4xuwMIHEI;* zHVC7!(gN7g2G4f6w_o7h83@U2(0I1>6p=@A4a+Ja7ojj;mf(jM+LOQ&DED3d~ z!)NXk^Gc0X3{EcID@@U7%^Rn(Q=}o8*Pk0ickv&H;1FaxRSKiI1X?3(p z(dN%Lj_SJGHLU2o%Yu_-r_)Y=f?OYde-eD|?v6ULKd^`R-nU~955sQoZKv1PA5QRm ze6`B!SwY ztHo|qc>?pe)Ri`GpRA?1zejyB&`K;qRQkHVj9FA-OFVxk>QyuqGRAn05xeN5fhxCW zz^qW1xs+qSBbWg-$YRxed^Pb_cKfi3I8TplUucJ-K=t0A#w{PC zE#=cU9VI`cmGr&Tc9du(^&0&8VMa5ziu)Q44PZQp0b%w)QXFyO%G?cYAZ*z+x=OBq zB|0*?Z;Ij34MwG$16g&liJQcVySvxum>}v*5j-}MPf#LN^{a_-`3)SA96;gJkp&Z8 z>+*l}vYR3&TU&h=^jrgVH0p6vhj7YQ1So-DBBS(%5%#nok^Gz2Y%8wrw;a^3ywI-946N_43cr(B!e9L-Kx<0)AhtfGx@Fv_7C z3jwN}7!9qN(Y+tjHuinn`kE}j5y|nsiAKbQmGVQs=U?%7JIcub?OzwtrRClkUoVU& zIF<7}vBo}mP#FCgqPqWWo=-8G)59rq;0dmnSEOSyzRcr4@2eD?knG0DY6@{9-lL4M zCI`B+T+HHzl1-Kbt9SaX5@{-Ikk{xHUjS70pGR(tfj#kJT?|sbv)O%2vq?POg;-;- zS`WwFKDrU+@8r?~b5JQQ$n^FHZPDd@}?o>Frtzs88 zSjxr}QPnN;+kj{RSeR+kEI9N&*D-gS;_*-ngGnyFI4HC2v(|?Ppz(Df{O%S_l$<^& zEzJs|0v*JEb3Ee!x4kJjdqdpBDYFSI*M+UL|7*=IVh?#fNDQS^gt~^5B6Ze>i~K_u z6Z8ZzFo&zxP(oF!d7eWnF+6V^W?$E18hESsk##qTnN^y z?BfNOK*rFCjB%Xuj`JsG8*_m|M)Vtjo_tcs-YiipnNcNxAJPkJU+os1Cm8e_t zw9sgbMf3q>`!=tYLh?3fWdv1_3FhiX_!XezJNNX-EavJ)$t#pPpEv*J4>cEUC(Jx? z>M*NK8_uzw46mEG-Nhn#Piu+26Eob!9+#)?6-%5tOt)4oX9eWnfwj5*CM#~mIt3-B z-ifLY@*DNSMw#o^$=r}kJ$HzW#dyNv-lSpK$>~(Y72tHj47FXq9?jzBiw_2yS^6SP zVFULfpVf82HHKF8uDVrY^n<;vQiji7f2Fa-eF2ZAUohm%(Y>{v?SO1wLH!jCVHWiD zFo|SeUqd6JRO(YK{u6eGp4#T?1+4UsVSaTpc1r{BnH)1-S@9*6|C0YDdv;_I zO}(;^z6nLt8inYCtyjczIRYA%1>loXv6<*&>hR=+9pxITUS=}^#DDpkx=9f|DQNeC zoFIz*FS$Pl6kWpi^gqwD;vO|Zrt-!J!l3aw+5H+{M`b zH~eev#u#}Yfuk@|`++(|#Ynd(MxODzAjK;$#k7UTH!GHYFL?c!4H4X}F&4c~bVzQQ z@FUB)`a<)bA~j2MaT=)*QR*aY$Nau#tku_RmJIcp_wXv6RcZ{&Yh)a-m{=+BC^DnO zW50-XKJmZQMsO{I%(sQd^-p1eofi991m!BsnRAfY{|=y?<#d%VHI?B`>jJ7I4PzKN z?g1(l?OTj}pgsM;{?nQ@1Ve{E!Y+(@kI_RrTGioNu@z`y0Gf+KTaspdvT`o9UaWHQ z6Wl6hlDlI7;++B<-LM^wZN_FH3~tiqJB2BYIb^hoTk7UiCb!{0R2p@0I|d;R!!h!t zC_C^}gilAm8;eXFZj`fs`>MEWT4wu^({H;fwgQo-8PF0N_tP&Hu>NPHyZ;#-Hw6@6-3$-H@|dzJxP zB;+N;Nx4_M?NvI(v4IG|<=^fB! z0{Mt+iK%JaMs|qeAM_Y!=scecl7iZQ`23v&KRZI?@5O(eZvFDcOMO}9X1XSa{7SBa zdVt|ia{KV=1_cZSx3Pxv(YRiqHhrw{euI>{za*`ReZjR4P?qiZ#Cse=CBnCHcL|!2 zrj2Z@A(B9SKHf}?Q(|j05DDlVLnH{$0R!V zK=t*e01<}hy9V206gyhk;yhbL_ZrI&EnQvURn9*-2Cqpur`{6;`f4|(5)QIo=9I;k zC-rEb9~L+kQ%$&17^UgVKZqe&Vuymp7D1k!ORGJ1Z+ObyvPCTyP&rUa*i|g_P04P5 zHsERAPZhekF?^Mq!A<2!TeuFven2XrRPih416EtLoXnTYD*7NrRvbMp{Z8)TP#o?D#=!%qmu; z8ipJ;md|FA=LYzP6g@J9t`LZ0L2KTAca8&9DdADH+RVv4P$aW7Y?LWj;&e>6Q4 zd7pJbDKTrqHfwD*OVEfcHIcuL)P!Di)+{S|2cwm9XV*qfgzt8x;nmD|siC1zHsD%~ zQk=svYEvkO9|Bsyx_cMhFlF*gywk&En43zq%_D7X@7`Af*qRg>)YvaRLr-r$kkk+n zf89PMP`}u3+3r=&>61re#fc`ZIV)MF$%*&)O=B57^nCmcC6$dWUk$}^F1lMK11vL; zJt(!Rb`&WU?fzHJ7tTARGxr%1!>fl}?wLrZJ39zZh#Cm>;U2FEv+I|GCBX-EyH+DL z^2fzGCK>Ja?FVu+fR|p^ZDx6qp^}Q@QjR|eel{qZD|XKurZY4Mm#dA5_e;!T09pgW zZYXHIuRZfc%?yq7J`-DlGrT82Kh2ms(HXZ@UnxkGxq!stQ&vKwkR#AcPiig(y_2o~ zSt^Xr(jAqdL<`^DA#7GPV^v(<$#E-1)Cknk(c8<^>W)&^0+)9w_?*fYl~R92(XL?X zIiwjog(1vnI{tKHXno|=Rvp*5JoYPyK=->~h~;Z+_k(7)mK26S4QN|#zoTFS9wqYo zZo-H5%MorBGzwlNfMQfLkmGF2Kx zKrxiI@r)#XG<`ZimsAK8j=%=di*k+ln*Lhg5sFtlhwZUg0x|Q={MY2(RIUU`106~o z9ZKoHnT>3X50ODL<7K&vDFW8gAO>X_2c{L3x^xsk$=Xtew-|3Xcf07^)GPaNM6Ut>@v??PiTp2jt>o4!U4&=ofWa%a^e*dy0wc z2&rz6Q#BPpWF_a$F^(-i)EOF5e!@_~%J5#^-R2|?S2opC4>%wh+laLIi*XF^l)MA zd|4!cpZI+wfBjFr4$n(~_VyhpgO@}#filMfX%KV=&4mcRZ;AU)d>_&j+swcdDJOkx zt)ilI_-x2^BncV<^o{r#G6yS>(gub`2`5U~>uo6m7k6XnZ+bQqK|V)<4;e?a|i zu+YUbstPJfhUT(7fd{$?SuG2~-3aEqmWlmUEOQl8=pnJq6lj=d25iH&vRj`Q-@mw~ zd-j^^l$l&9)MfewxdKG9W4HrXh!2QW`#I0)g#l;2*C>|Zy(YL&@hM&N%It)-e7Xw1 zo>#?XuE$5_`V3od;Q*(jUf&ViveDBo`#CLyGnQY z5lfHRrYId2_qZ4uv>|AzHm;Q?fDVSlh7&Zj&vH74$Z1YG%(6-)H0;wGD&t{r2xryt zA=N8IxkV74vPCwdsiaylmO2}?hG6x-S?yWc@(^!CaQ&WqKPO~ORqoG?DK6CKL^Q_U zaSNb}chmWG5r#6>5@)Weh=2p4cZ&P%gqHe1k>L?rEMr}SJX{AJqxJ#-vjMxKpt|#y zSo5*H%TlJ)f9^~BbXxeClUoM<*YmuzImrLOb-QUd20`Lf8yA1$$MiO~`JBx~D)3H4CU@+CBCl|v*X6EqO9_*BnB9`%c zL@#n{W6GsSUDuE$T>6zv`3+G!5g=r@u`enJjkbk6ZywQ9a8l<+LHUp2dd5hJJ5GO)&J{W zs)N#3PA=Z%Jv*4E8-!;Ru%l9moCInihh3zuigyo0o-Mv{8DhLR4sNG4CvoqihZ|Lu!d7=%pe!|@QT`w}^w3!Z*#7xkS9GrhBcf_s>Mk*EL@rcj@XSni? z7}NdXf!-wcV;lSGzc9pc#sAXME}~X2-1<#J+f!Mc1O#St^qtFKqgSfzNs=WgDo3F} zh?j3a8&sGNH(W^c2238@{-SrsvK%GkQz2XJm)LPPk$Z>yIgm{~0GQW)@ysHbqklT( z9QP9g9gig9g+xmj<)1{f+26pG(C!ZKKv1R?3;${U(X*qa!v%Er%r>iH=#7mu3NH_J zmwabw>OCD66NxoR_k=?##DB0K40zm)b=o7zn?H5c-WHEgn}QnF8{W6V^2nc_x$Q5c z99iwPf-kQIieP-`FN9lhWU+OneSN5fXxsm|S*HVbMeqTnj>>CD;}GWw#MhzTSTPt< zNHw`#%48rwF&UaflPXd7Jdevx(n}L9R_j^|yV$1Jyp_)Yb1q-%bT7-XLstBxLbuzG z3v$MQ?p3 zvN)mOR{!uG4t`v0VHRu4Mc7gL7*A!+<_=qDZ%mDWak92|{O>3;7jEc_shYSiarDm2 zuO-IOTF1)Sg9PMFE;JKn;0q2g+{BSr+M?s#{c{|ON=#_8IihA;-94Rn-p0_xEL#mZ z3k|`CPfB&&lX>4XU^q+oF2Q-0RbClh`(F7y+d^licLHbs;jTq}WF%qX%))xbnyCwC z2eXG`7+j>MvWlCtkcnmSY#S|FU}6A|KFQH5Rkf&GS8a<w~L3e=e09?LE+H|Z0^HZJQNqhUIp2gxL zyfu2LiIE97ry|>-!c2fT1h0!ukkgcpPEsPCfocw-=vmg#(OIHrbp-j;1YR8cjs;SD zVe;ekx_Js=hyiXAVUYNxW`dUbU7_{gm0tluT4ouT({^XgRyxk}Wu-K3lG?73D1E>v z_O#N$1eRh#H(hTy#2R&TtT?HeHlf6nHr#H3Y;kfCRJK5wPus7-Jhoe}K5=Q; z0y^ecF5kl6Nn~UP8t$DgzL@0m%yxc@fu!T!`pDVJ@aW$yI}D=pk}-{gzz|k{0rywm z%uAj`B90O<)YCxyRVosTK;?8`*DB1jkN*vaSYH}nfSv|cPDk~TBqj|oA}O%6fFE^! z+2#$N1FWurK`G*CTTDWTy7#`PCJgxHUup{6H^m}DMX94=?=+$QKU-!Yu%Do7SRNb+kaAXGJ-%(488yU?VdFxU@paf zC+_dVr2c>Gm4?)}m)Xo#n_w$|GGF!X!*{@Q{x7_d@&CbHeg4gWw(pUS!w-4WC3b>D sTKw_${uQLVJ6=Dsl633Dq9`}+4^MLw3L)@{4JqTrtQQo||MEBg4bN@U6#xJL literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/DesignDocument.md b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md new file mode 100644 index 00000000000..268d34458db --- /dev/null +++ b/esp/src/test-ui/tests/framework/documentation/DesignDocument.md @@ -0,0 +1,464 @@ +**The Class Design and Code Flow for ECL Watch Test Suite** + +**1. TestRunner.java** + +![img_2.png](TestRunner.png) + +The TestRunner class is responsible for setting up and executing automated tests using the TestNG framework in a +Selenium-based testing environment. It initializes the WebDriver, loads test classes, configures logging, and runs the +tests. + +**Methods:** + +1. main Method + +The entry point of the application. It performs the following steps: + +- Calls setupLogger to configure the logging system. +- Logs test execution details to a specified file. +- Calls setupWebDriver to initialize the WebDriver based on the environment (local or remote). +- Creates an instance of TestNG. +- Sets the test classes to be run by calling loadClasses. +- Adds a TestInjector listener to inject dependencies (logger and driver) into the tests. +- Runs the tests using TestNG. +- Quits the WebDriver session after the tests have completed. + +2. setupWebDriver Method + +Initializes and returns a WebDriver instance configured for headless Chrome operation: + +- Configures ChromeDriver to run in headless mode, disables sandbox security, and sets log level to errors only. +- Suppresses logs generated by ChromeDriver. +- Checks if the tests are running locally using Common.isRunningOnLocal. +- If local, sets up the driver to connect to a local Selenium server. +- If not local, initializes a standard ChromeDriver. + +3. loadClasses Method + +Loads the test classes specified in TestClasses.testClassesList: + +- Iterates over the testClassesList and loads each class by its fully qualified name. +- Adds the loaded class to the list classes. +- Catches and prints any ClassNotFoundException. + +4. setupLogger Method + +Configures the logger for logging test execution details: + +- Creates a logger for TestRunner. +- Sets up a FileHandler to log messages to a file specified by Config.LOG_FILE. +- Uses a SimpleFormatter to format the log messages. +- Adds the handler to the logger and sets the log level to ALL. +- Catches and prints any IOException. +- Turns off all logging from the Selenium WebDriver to reduce noise in the logs. + +**2. TestClasses.java** + +![img_4.png](TestClasses.png) + +The TestClasses class in the framework.config package is responsible for maintaining +a list of test classes used in the framework. This class provides a centralized and +immutable collection of test class metadata, which includes the name of each test +class and its fully qualified class name. This setup helps organize and reference +the test classes easily throughout the testing framework. By using the TestClasses +class, the framework can dynamically load and execute tests, enhancing modularity +and maintainability. + +**3. TestClass.java** + +![img_3.png](TestClass.png) + +The TestClass class in the framework.model package is a simple model class designed +to encapsulate metadata about a test class within the testing framework. It contains +the name of the test class and its fully qualified class name (path). This class +provides a structured way to store and retrieve information about each test class, +which can be utilized by other components in the framework for dynamically loading and +executing tests. + +**4. TestInjector.java** + +![img.png](TestInjector.png) + +The TestInjector class in the framework.setup package implements the +IInvokedMethodListener interface from TestNG. This class is designed to inject +dependencies (such as a logger and a WebDriver instance) into test methods before +they are invoked. It ensures that these dependencies are available to the tests when +they are executed. The TestInjector class provides a way to set up the necessary +environment for test execution by using holders to manage the logger and WebDriver +instances. + +**Methods:** + +1. constructor + +An instance of TestInjector is created with a Logger and a WebDriver. + +2. Before Invocation + +- Before a test method is invoked, the beforeInvocation method is called. +- It checks if the method is a test method. +- If it is a test method, it sets the logger and driver instances in their respective holders. + +3. After Invocation + +- After a test method is invoked, the afterInvocation method is called. +- Currently, this method does not perform any actions but can be extended for cleanup operations. + +**5. WebDriverHolder.java** + +![img.png](WebDriverHolder.png) + +The WebDriverHolder class in the framework.setup package is a utility class designed to +manage a singleton instance of WebDriver. This class allows the framework to store and +access the WebDriver instance globally, ensuring that all test methods can utilize the +same driver instance. This class is used in the TestInjector class in the beforeInvocation() method. + +**6. LoggerHolder.java** + +![img.png](LoggerHolder.png) + +The LoggerHolder class in the framework.setup package is a utility class designed to manage a +singleton instance of Logger. This class allows the framework to store and access the +Logger instance globally, ensuring that all test methods and other components can utilize +the same logger instance for consistent logging throughout the application. This class is +used in the TestInjector class in the beforeInvocation() method. + +**7. Config.java** + +![img.png](Config.png) + +The Config class in the framework.config package serves as a centralized configuration +repository for the application. It contains various constants that are used throughout +the framework, providing a single point of reference for configuration settings such as +file paths, IPs, and other constants. This approach enhances the maintainability and +readability of the code by avoiding hard-coded values scattered across different classes. + +**8. Common.java** + +![img.png](Common.png) + +The Common class in the framework.utility package provides a set of utility +methods that are frequently used throughout the testing framework. These +methods handle common tasks such as checking for text presence on a webpage, +opening a webpage, and determining the environment in which the code is +running (local or GitHub Actions). The class leverages constants from the +Config class to maintain consistency and facilitate configuration management. + +**Methods:** + +1. checkTextPresent Method + +Checks if the specified text is present on the current webpage and logs the result. + +- Retrieves the page source using driver.getPageSource(). +- Checks if the page source contains the specified text. +- Logs a success message if the text is found; otherwise, logs an error message and records it using the provided + logger. + +2. openWebPage Method + +Opens the specified URL in the browser and maximizes the window. + +- Navigates to the specified URL using driver.get(url). +- Maximizes the browser window using driver.manage().window().maximize(). +- Calls the sleep method to pause the execution for a short period to allow the page to load completely. + +3. sleep Method + +The sleep method pauses the execution of the program for a specified duration +(4 seconds in this case). This can be useful in scenarios where a delay is required, +such as waiting for a webpage to load completely before proceeding with further actions. + +4. isRunningOnLocal Method + +Determines if the code is running on a local environment. + +- Checks if the operating system name starts with the value of Config.LOCAL_OS. +- Checks if the user profile path starts with the value of Config.LOCAL_USER_PROFILE. +- Returns true if both conditions are met, indicating a local environment; otherwise, returns false. + +5. getUrl Method + +Constructs the full URL based on the environment (local or GitHub Actions). + +- Calls isRunningOnLocal to check the environment. +- If running locally, returns the URL prefixed with Config.LOCAL_IP. +- If running in GitHub Actions, returns the URL prefixed with Config.GITHUB_ACTION_IP. + +**9. TimeUtils.java** + +![img.png](TimeUtils.png) + +The TimeUtils class in the framework.utility package provides utility functions to handle +time strings and convert them into milliseconds. This is useful for standardizing time +representations and performing time-based calculations in a consistent manner. + +TIME_PATTERN: A regular expression pattern used to match various time formats. The supported formats are: + +- d days h:m:s.s +- h:m:s.s +- m:s.s +- s.s + +**Methods:** + +1. convertToMilliseconds Method + +This method converts a time string into milliseconds based on the matched pattern. If the +time string does not match any recognized format, it returns a predefined constant for +malformed time strings. + +- The method first attempts to match the input time string against the TIME_PATTERN. +- If the string matches the pattern, it initializes the time components (days, hours, minutes, seconds, milliseconds) to + zero. +- The method then extracts values based on the matching groups. +- If any parsing errors occur (e.g., NumberFormatException) or if the string does not match the pattern, the method + returns Config.MALFORMED_TIME_STRING. +- If the parsing is successful, the method calculates the total duration in milliseconds + +**10. NavigationWebElement** + +![img.png](NavigationWebElement.png) + +This NavigationWebElement class in the framework.model package, is a record class used to represent a navigation element +within a web application framework. It offers a concise way to store and manage information about such +elements. + +- The class is defined as a record which is a recent addition to Java that simplifies creating immutable data classes. +- It has three properties: + - name: A String representing the name or identifier of the navigation element in the menu bar(e.g., "Activities", " + ECL", "Files). + - hrefValue: A String representing the href attribute value of the element, which typically specifies the URL linked + to by the element. + - webElement: A WebElement object from the Selenium library. This holds the actual WebElement instance representing + the element in the web page. + +- Due to the record nature, a constructor is not explicitly defined. The compiler generates a constructor that takes + arguments for each property and initializes them. +- The NavigationWebElement class offers a structured way to manage data related to navigation elements in a web + application framework. + +**11. Java Classes for Representing Workunit JSON Data** + +This section details the class structure used to map JSON data file of list of "Workunit" +entities into Java objects. These classes provide a clear representation of the data and +allow for easy access to its values throughout the codebase. This structure is particularly +beneficial for writing test cases, as it simplifies working with the data in a well-defined +format. Below are the UML diagram of the classes used for JSON mapping to java objects for +workunits JSON file. + +![img.png](WUQueryRoot.png) +![img.png](WUQueryResponse.png) +![img.png](Workunits.png) +![img.png](ECLWorkunit.png) +![img.png](ApplicationValues.png) +![img.png](ApplicationValue.png) + +**12. ActivitiesTest** + +![img.png](ActivitiesTest.png) + +This ActivitiesTest class in the framework.pages package, implements a TestNG test (@Test) +for the Activities page of ECL Watch UI. It focuses on verifying the following aspects of the +Activities page: + +- Presence of specific text elements +- Functionality of navigation links and their corresponding sub-tabs + +**Class Variables:** + +- textArray: A static final String array containing expected text elements to be present on the Activities page (e.g., " + Target/Wuid", "Graph"). +- navNamesArray: A static final String array containing names used to locate the navigation link WebElements on the + Activities page (e.g., "Activities", "ECL", "Files). +- tabsListMap: A static final Map that defines the expected sub-tabs for each navigation link. The key is the navigation + link name, and the value is a List of expected sub-tabs. + +**Methods:** + +1. testActivitiesPage (Test Method) + +- Obtains the WebDriver instance (WebDriverHolder.getDriver()). +- Opens the Activities page using the URL from Config.ACTIVITIES_URL and Common.openWebPage. +- Retrieves a Logger instance for logging test results (LoggerHolder.getLogger()). +- Calls testForAllText to verify the presence of expected text elements on the page. +- Calls getNavWebElements to retrieve a list of NavigationWebElement objects representing navigation links. +- Calls testForNavigationLinks to verify the functionality of navigation links. + +2. testForAllText Method + +- Iterates through the textArray. +- For each text element, calls Common.checkTextPresent to check its presence on the Activities page using the provided + WebDriver, text element, page name ("Activities Page"), and Logger instance. + +3. testForNavigationLinks Method + +- Takes the WebDriver instance, a list of NavigationWebElement objects, and a Logger instance as arguments. +- Iterates through the list of NavigationWebElement objects: + - Clicks on the WebElement using the webElement().click() method. + - Calls testTabsForNavigationLinks to verify if the expected sub-tabs are present for the clicked link. + - Logs success/failure messages based on the verification result using the Logger instance. + +4. getCurrentPage Method + +- Iterates through the tabsListMap. +- For each entry (navigation link name and its corresponding sub-tabs): + - Checks if all sub-tabs from the list are present in the current page source using driver.getPageSource(). + - If all sub-tabs are found, returns the navigation link name (current page). +- If no matching navigation link is found, returns "Invalid Page". + +5. testTabsForNavigationLinks Method: + +- Takes the WebDriver instance and a NavigationWebElement object as arguments. +- Retrieves the expected sub-tabs list for the navigation element from tabsListMap. +- Gets the current page source using driver.getPageSource(). +- Iterates through the expected sub-tabs list: + - Checks if each sub-tab is present in the page source. + - If any sub-tab is missing, returns false. +- If all sub-tabs are found, returns true. + +6. getNavWebElements Method: + +- Creates an empty list to store NavigationWebElement objects. +- Iterates through the navNamesArray. +- For each navigation link name: + - Finds the WebElement using driver.findElement with By.name strategy. + - Extracts the href attribute value. + - Creates a new NavigationWebElement object with the name, href value, and WebElement reference. + - Adds the NavigationWebElement to the list. +- Returns the list of NavigationWebElement objects. + +**13. BaseTableTest** + +![img.png](BaseTableTest.png) + +This abstract class, `BaseTableTest`, in the framework.pages package, provides a framework for +testing web pages that display tabular data. It defines methods for common functionalities like: + +- Verifying the presence of expected text elements on the page. +- Comparing the content displayed in the table with corresponding data from a JSON file. +- Testing the sorting functionality of the table columns. +- Verifying links within the table cells and their navigation behavior. + +**Abstract Methods:** + +1. `getPageName`: Returns the name of the page under test. +2. `getPageUrl`: Returns the URL of the page under test. +3. `getJsonFilePath`: Returns the file path of the JSON file containing reference data. +4. `getColumnNames`: Returns an array of column names displayed in the table header. +5. `getColumnKeys`: Returns an array of unique keys used to identify table headers. +6. `getUniqueKeyName`: Returns the name of the unique key used to identify table rows. +7. `getUniqueKey`: Returns the unique key value for the current row (used for logging). +8. `getColumnKeysWithLinks`: Returns an array of column keys that contain links within the table cells. +9. `parseDataUIValue`: Parses and pre-processes a data value extracted from the UI table. +10. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the JSON file. +11. `parseJson`: Parses the JSON file and returns a list of objects representing the data. +12. `getColumnDataFromJson`: Extracts a specific data value from a JSON object based on the provided column key. +13. `sortJsonUsingSortOrder`: Sorts the list of JSON objects based on a given column key and sort order. +14. `getCurrentPage`: Retrieves the name of the current page displayed in the browser. + +**Non-Abstract Methods:** + +1. `testPage`: The main test method that orchestrates all other functionalities to test the target web page. + +- Opens the target webpage using the URL obtained from `getPageUrl`. +- Calls `testForAllText` to verify the presence of expected text elements. +- Calls `testContentAndSortingOrder` to compare table data and test sorting functionality. +- Calls `testLinksInTable` to verify links within table cells and their navigation behavior. + +2. `waitForElement`: Waits for an element to be present on the page using explicit wait with a timeout. + +3. `testContentAndSortingOrder`: + +- Retrieves all objects from the JSON file using `getAllObjectsFromJson`. +- Clicks on the dropdown menu to select an appropriate number of items to display in the table. +- Calls `testTableContent` to compare the table data with JSON data. +- Iterates through each column: + - Calls `testTheSortingOrderForOneColumn` to test sorting functionality for the current column. + +4. `testTheSortingOrderForOneColumn`: + +- Gets the current sorting order for the specified column using `getCurrentSortingOrder`. +- Extracts data from the UI table and JSON file for the specified column. +- Sorts the JSON objects based on the current sorting order using `sortJsonUsingSortOrder`. +- Compares the sorted JSON data with the extracted UI data using `compareData`. + +5. `getCurrentSortingOrder`: Gets the current sorting order (ascending/descending/none) for a specified column. + +6. `getDataFromJSONUsingColumnKey`: Extracts a list of data values for a specified column from all JSON objects. + +7. `getDataFromUIUsingColumnKey`: Extracts a list of data values for a specified column from all table cells (UI). + +8. `ascendingSortJson`: Sorts a list of JSON objects in ascending order based on a specified column key. + +9. `descendingSortJson`: Sorts a list of JSON objects in descending order based on a specified column key. + +10. `testTableContent`: + +- Compares the number of items displayed in the UI table with the number of objects retrieved from the JSON file. +- Iterates through each column: + - Extracts data from the UI table and JSON file for the current column. + - Calls `compareData` to compare the extracted data. + +11. `getAllObjectsFromJson`: Parses the JSON file and returns a list of objects representing the data. Handles potential + exceptions during parsing. + +12. `compareData`: Compares a list of data values extracted from the UI table with the corresponding list from the JSON + file. + +- Iterates through each data pair: + - Calls `parseDataUIValue` and `parseDataJSONValue` to pre-process the data (if needed). + - Calls `checkValues` to perform the actual comparison and handle mismatches. + +13. `checkValues`: Compares two data values and logs an error message if they don't match. + +**14. ECLWorkUnitsTest** + +![img.png](ECLWorkUnitsTest.png) + +This class, `ECLWorkUnitsTest`, in the framework.pages package, extends the `BaseTableTest` +class and specifically implements test cases for the ECL Workunits page within the ECL Watch UI. +It inherits functionalities for common table testing procedures and specializes them for the +ECL Workunits data and behavior. + +**Override Methods:** + +1. `getPageName`: Returns the display name of the page under test ("ECL Workunits"). +2. `getPageUrl`: Returns the URL for the ECL Workunits page constructed using `Config.ECL_WORK_UNITS_URL`. +3. `getJsonFilePath`: Determines the file path of the JSON file containing ECL Workunit data based on the test execution + environment (local vs. GitHub Actions). +4. `getColumnNames`: Returns an array of column names displayed in the ECL Workunits table header. +5. `getColumnKeys`: Returns an array of unique keys used to identify ECL Workunit table headers. +6. `getColumnKeysWithLinks`: Returns an array specifying the column key that contains links within table cells ( + currently, only "Wuid" has links). +7. `getUniqueKeyName`: Returns the name of the unique key used to identify ECL Workunit table rows ("WUID"). +8. `getUniqueKey`: Returns the actual value of the unique key for the current row (used for logging). +9. `parseJson`: Parses the JSON file specific to ECL Workunits and returns a list of `ECLWorkunit` objects representing + the data. +10. `getColumnDataFromJson`: Extracts a specific data value from an `ECLWorkunit` object based on the provided column + key. +11. `parseDataUIValue`: Parses and pre-processes a data value extracted from the ECL Workunits UI table. +12. `parseDataJSONValue`: Parses and pre-processes a data value extracted from the ECL Workunits JSON file (if + necessary). +13. `sortJsonUsingSortOrder`: Sorts the list of `ECLWorkunit` objects based on a given column key and sort order, + considering the specific sorting behavior for the ECL Workunits table (default sort is descending by WUID). +14. `getCurrentPage`: Retrieves the title attribute of the "wuid" element to determine the current page displayed. + +**Additional Methods:** + +1. `getCostColumns`: Returns a list of column names that represent cost-related data (Compile Cost, Execution Cost, File + Access Cost). + +**Test Method:** + +1. `testingECLWorkUnitsPage`: Calls the inherited `testPage` method to execute the core test logic for the ECL Workunits + page. + +**Class Relationship Structure:** + +![img.png](relationship.png) + + + + + diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkUnitsTest.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ab0792d8e434dd9e516fc0e3add0792f17ebd GIT binary patch literal 21757 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 I-}?Rk0S&~DegFUf literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png b/esp/src/test-ui/tests/framework/documentation/ECLWorkunit.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbf9018ae624487a62be8bdd4f47a20885873b7 GIT binary patch literal 21832 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 SH>5%zeelV@v)@1d<^KoiLcxCk literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png b/esp/src/test-ui/tests/framework/documentation/LoggerHolder.png new file mode 100644 index 0000000000000000000000000000000000000000..547e7c857c765c7ea8dda03d57d478a7e745a264 GIT binary patch literal 2861 zcmchZdr(t%7RTA?40aXkvbG8sWh@W3wXR5b2sFu7Eg@K;WowiuAO*uCjhI4+l7!6I zEj}tlp{&x7unt6uc_7V8$dag4*ab{TViG~aT}UCC5CRjDKoXL@=uF$u>AKyW-GA=f z`TgdcIrpB=_k7RU4>ORfSB9+&2nbk>O52ka5b&#m;Cs`nf#9>W^UcYCfR*#8J@0*d zBG;-Puj3?3_NbP8+o_$yqzjKbz8$=9AtSjw&6nR9dpV9PP|E!ck%o!z^^quL{^yNt zj0Z=eoF)^n-p6bN)}NnNf4_^=moac5vZKIup83^g zR9633Xv$l=>)Yyjp_N%Rk*JO2qUp9ERDH5j@cE6j=;#!mXRmIFy$4K?q zr6fK<@hFX>6jECS?QTLfTVZLZzNMLJ?M1eRxndKga2NZ$&?pTCUavt5VS;2F9=6vm?glcs{I^)fa5KliZnEf^X103{z4kz3Mt!I;A`WqjC>BhX`$j`~~6A@yVH<*J3d zvGZ@si2%uDdy^Vi&6yiK`gnh;3-3QyP}>b9<|3>G*t=RPLtIu_t)ttwK0QfwucNq( zmu?ORA!JDSbzvv3OW|qZwa3qNPh7+eIoYGrizn&?4q+b*><#HR@|88YQ3eU`8F-z2 z9=msbx+)CWyxgf>-dM1z3P4Ui}mm2y>Z4;C@_POPe)I5+oMyjaEu60nW zMGEq9CYfD!+l8oJ9Yp=Q(uek2M(vWGw(~%Sw?4!jXZ7-YdXcG&hzgZ67ov8|&p7?@ zh7}@ro}MMwM)Ag7Yvs{3sSEkZ5QsW)JSAKn@QVk{bN&D2lj^wy|2Kfto{%NH*zwW6 z7AwQYZ}DxiPtT!3FhnBIn(8w65BASJ!75`o)Civy;czY9FV~pMxl?1o%1teQy0ZU( z3wF&Q(IVa_*P;FB7N3;jUR1ijH%*Qh8)Ag!i&Tif%}p2>8ghPH-JI89cb9}i!6|a= z;}%1U!{|+C>N7o;vk64ts+Ga~@ni%?56K}#GuwG=@=)mp9kM&~rl5aIesK-r_cU(w zWF3yjnu_DJk52n2;-?@+Y-=#%Yl*DMPhmWQ@(udo0`Yb&R@o1N1agbQ^k#P>>z&P1 zSq{cDsx6nTV!`0Q-p$!GLV^fJe+T`}O;CjCSs!H@&)6^id9Oq4JiiREJj|xFYXp`O z2!X{doVjgEnxF{9C<_PIa;k`)d3*R8$5ZTFu@6(@s9cg-g!LoB!`CFD6tl3td#w#n z&`3;HWB1_n$(`XmyxMIZZU4u!A2T2m7J+e>lc3Avv&@b(|2-Y6`K)71cd*P<_JS0Y z14FZii)x*n{GVj0XkS`Gg50SZY>TgJ{fQLlS+!&hG1bx`Q+Dc3uHl#4u5Bfs1XQ8e zc%5ren{2y9oH0P@VL4>&r~YX#mkrTp`y<~aQC8N>|ItImECrKt$@&?UnU+KLp%Io5 zy@t9VIY&!+*|p5zBtt-1NpavO$oViD$3mX9g#&@0wmwOMyw(rxZy#?mu8sLQw|-6o zFN#R*Nux1@(N7!;+xoUQJjJiH0>Cqk8g@|{uJb0~lqfd$uBv`z?#m;^S}m1c>cTrR zcU0A>+#IiSiA}mywz)bqh*wnz%;o*Ts~_%CkgvapCl-BZhqO%NyvOf(6|Up&4xX z>F^IhsMcEk3WrITJvu`0h+COB#!zM|`R#-|-4*L)xVd`;#o9({$r{98t}Yw0T$-`9 z>E1hu97C<^m=XjEbY|#m&X;AIc60dCMi$=pctr&kgck${2ZAGLn#79Uc-IyBNYA37 zO-Tw}L*x1RAc}s1(LZc((y{XGHX7Id%HAenA0dv@^#dfTZxS$wRzu2oHxktQ59gip zA5i2I5Br8WOU@-mr3_8m(^HA@6k1PWa@^Y}iAKi2zq&GrJsbO_B_y%dm_?Sns;;LzX3LBBTj({tSg(Wt7h4cth>oxrWA h#I9TE>V3ZO_jWhWnj(4=!8JGl^?t@4{;ngZ{t3JLE$09L literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png b/esp/src/test-ui/tests/framework/documentation/NavigationWebElement.png new file mode 100644 index 0000000000000000000000000000000000000000..b32e3dc1ae1e182fb6fad59ed7efba80101093b2 GIT binary patch literal 10506 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestClass.png b/esp/src/test-ui/tests/framework/documentation/TestClass.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9370dada3720217e4b76ce76377d045fb9ae70 GIT binary patch literal 3296 zcmcIne^gV~9e=0?N{>Rfo}QK|v1j#2R~%L;#u^h^>*`RE9v#F033D#wKq#OgL=qmb z%@sWrSw%piNpwz_gd~+nAqfdO9R3I-0_Md?l1GXVAdtr-KOiAwFW}l*+a24v`^P=+ zym#;S-uwOh_}+K?qdhxTy!f*h0RUK$@aye+0U)RneQtgs813buAG{6#%Nr85zyF&f zl*#)Qr)-F9SfjW5-eeNO=td zl&PPgo0yuJwuZkNX!_FH#)P>@3;?V$?*4ni%!j~xNx5t9ttoy3I3I<5Is2!op8$8O z&W6T?!Y=@$w|kCqkLE1{91kOQKPssPIPPlg#vViniJ zGcsT>%RbSRFw<3c=uL%9IAM&AXF&1lAb|1swGqehHR_ZOnRK2M2ApBgXy^i((d&2) zZ~Y~wR4G=`A)Lb9B*v%qZvp0hZ{ICMqebSzZ>8x>TX4e5CUZ2BmmE?i(D1U*-L`d3 z;x@8)&NpjU(Bk53Ix8I}ecTWR#Mj~U=&25s4_KRDF z=ak!L4AWPa-!yspE{beM(b_rO<^Vye{lOoqu8v)sLb*oGKer-0CeXx(E_0Xp)k}e? z_~*%ir}sItFH$g!1u?)8Eb9|!P4Q4vni5X-WgRT5a9==n=vkl+1YT#*cA@z!Y1Vnk zI>Fzxnh(~{fT_#Ih-8##NxlA`v$PnQkp3}L#X;H>td<>cD3B5Y*GV`VNHPl#it0!xTT(ciAnA_OUTe?C$G)~xf#BaAjim8 z119ouPz;Bv?8LLm2i)WAOsJuVqTpr%Yz8f$9YWTs{n9_}qKlI_nKCiUWMJF}?M?h? z6Wg99BG=G?!NpL03PCwz4g+jl++vm4xAokR8~BTCL3o0{`fEeY>;1uVVZdqJtN*iH zpN8s~_awqdKPYlarjp%3W!=1AqT)KnaVWaK3l4~xr;!@wqwRL`WUsqkdz(&-S2Geb zX!24h=oxzFgFAaaiZXHPb#F9jCBc*8U3 z4tWejZ%9Wxnw)@79)qL(aLSzP{{+a7vf*#zdc30|eW4BQjSG#Z0^jT3-=6p*%fLa_ zP1d7OSRK_KGKUd7LYzsE#mf*}L2C!gXu!@7GxbD+j94<#R9e%~AJtyY>MxCQ;O;uf z8B9Tv)RQjs^p|)L?>#X7xc5ZB-iI`*cACqREaZ$aXg=v2S>>ID-;bAi!Ga2ZtEVKz z88s#?{SxtxAxLzac0cL^IQxW}qoG)LW%+U>LWJwo*zrPoC3Kb0w$-ggT|vZQ@OxYt zhge8Lsxz#8coK zXwwqWWnyPP)!E)^rB#c@b9p@7yyxYF zYbZ4Q9cm{jv4`!PeZWc?xEwC!j^v7nVxAHL<$m1gG*gt~JODMwy!?%|%58`hVrThI zKulk*rFncKE@EHBX ze(P=$UyG?S)>aSwTUWRa96> zBE#-Ic((|OQMX*DDvVyPZramCtFf{5Jbbyysu_P57Fkug2UOVz)bZH@zm93IMrd^te)Gwx#G5_8i8O15z9n~l>F>@&mV(g%t$PH#)9uAC$o5yCJP;1A7@EF_2r%B}k) zVd0nXLS}s&IDd;m3YX61rwmxk?yy!w=j;xwQ5e?)Y*qVu0urd|`or6Np;qfOST+bn zuE?u)b_>dtEeykfnv4yckvkeMq5Esb1P>N19tR#%2>ff@hV)O~RjnUX8sT&_ud04l zyg$J%l`Ur!X9VDo1?~@h|7tG|itv{Ju-a!r*Ze^=`2M^0a}HCwQq~q|U6-<#0N0ju hE(P)( literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestClasses.png b/esp/src/test-ui/tests/framework/documentation/TestClasses.png new file mode 100644 index 0000000000000000000000000000000000000000..913e8d519fa36031a34507ec607ddb3447a9089e GIT binary patch literal 2324 zcmd^BeM}Q)7(b&!XQs=xWF}kGE!%X+tQz7XA3`P?M8zslI)-gcTw$UXw{kscr3@3} z+=n<3>ld&LYV8NDQUU34c8ggSQ8@+bS<00Wg-Va!F|a+_>-Bb;Y|;6z%a-h)_j%sr z$?x|*@B99Kc@A&coH=Lq8?ylbn3J`BZ4LlTyTa#(X2tRA&g#@v05Hpwwf3XDebT_) z+lqV1ugQ7tHufb7q};b5VaN38?z&mt*>YZ{NIJ8JiBs?hA3?OJULYv~kf( zX~31Qf1df1c*PVjwIpsKAk)v^Um1&D{NQ?vrCpk^=h$pux#aYY=NKvfK7(+-4H}|f zj%JTC=dyE#WS5y#Sc#69*%!O3dYT))@JTUrTb(R0J$mV3Meicx-e1XYAf34SY<4|@ z+L5cI1PXVz!jZ5D*0@l~6O~7smLVBB3~_-Hv6(HYHE7uZwUu-cYK2^9>nko`JJnW! z5EnRifhv#^NzuODI`K-X8=&4}Qxr9MAG^UEsT~h?kpuQ{370piuBdIfDiAtIMX3(L z#PMdbzT$pZn=;dz8-WHE8Mn+Y?hQ+{=fk904w3Htt(B&7#Hw=ENUrpN-5OVIcOLGI zm%IGC*{E6|hdYZPo@^Og_$-+})t44WSH>2!4(tf@X@B|k;p($yAtN%R6Jn*Ga_mH`G4?1amzC!oB8xNEBZg z$H=$~`93j|TSt{it_fu2ZL}$(fPHs|6VTAyV3+x%~E>ap)ig^xa{A#pO>rb{EQnx{OgDOSIxTY*pA#&q<`@nVQJVuNoX z$}>%CKz1DlijzHZ43T&xGQGv234QNl0-dmQv>SJuF?1FA`&b1TawwsYAN08s;U^0{ z!=f%#KE5MeE^3Ery*6$BO<`~oLJr_I%!~+i-VRg9I16--OL1q)~pM))i za3W^uA3juePTD|{7|~n84kxTvQXWjlAC0vaj;&rrMYtqHu zHwkPSo3z2fI-qS-J?G+Ifbf!$zQCZ{BN^OUSz3Lb@5&#d#sXF$3_WO3P>(9im_gwr zU67?5_Y7l*f_udrE8&i|WZWc_cRD?qXV|8e`WEKVZp>0|WF*}9ZYhP=nKd{XykRU_ zIap_8;IZ3@Ak~lb52v7Igc3xz(8MVR6p#ic_)>XL%YKXYevqmPk zDR8H=K8qQ3SWTW3{aEhf9)Xh&JkItW#_-qPU+9E;G={MnJHtnWktjrla121 zdG`m|gN3}5sn)atwex>rEB};T{l{>R9N-OFj!b@1uoxJxdUhBYc1B-MjzgPOoA_x5 O$Xd5~t#!@z1AhQwxV?n{ literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TestInjector.png b/esp/src/test-ui/tests/framework/documentation/TestInjector.png new file mode 100644 index 0000000000000000000000000000000000000000..e45e93682a7382aa26d7fc47e06ebbb6e4e26ea3 GIT binary patch literal 10050 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 literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/TimeUtils.png b/esp/src/test-ui/tests/framework/documentation/TimeUtils.png new file mode 100644 index 0000000000000000000000000000000000000000..342180bc0fe82a8acfaff67afc6fb4b351a884bd GIT binary patch literal 6626 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 W`en>^cknq6?A;R?#(y{A)V~4M-*OTF literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png b/esp/src/test-ui/tests/framework/documentation/WebDriverHolder.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c4ebf958f666be44ed57b4236632a20f4dc725 GIT binary patch literal 3135 zcmcJSe^gWF8OJZBgRZOE9qYC#j?IEjIig3To`8X^qfoSjPKcQ?3AX-VF)I<0cp)Lc z?D07K#W9E}SqP_sW+ddMP9h{BfzwVs{BDTJRg!QS2!Vto$d3fMB-w@9v#z$A>v8WN z@44^2_kG{zKJVxGKF=+GkC3+F<+U#Z0I(wcos@k55K@R;*S-{n^)vF%egy!pgr%qa zCcBX4x^KA{gFByMme5<_v$H4YY)y8jIWS$P?F5Izm!#wG+ zd}V*cRO3V5vDN7#nR`6aE}Kp1Fq*d;P?lPSJ8UynmzLc(-~wfXGDu*Rq))e97`zE((Q`zhl1s&Xf80Q4Yu+FAs`e}9 z?h`pgSM9=_Mr0I0@uUfF40oH!Y2?#W={+^PQr9$HCnws!5FgWUOj^0OiNuo5FlxI1 z!ZiLydHwG=cq!lJG*`ufV4G~4M(MQCJ^d~@-b2&Q&zyz1*8g@`KJZP^!lrXJ($_&r`>s?7&<*depoVCEq(=ASsL1jG34zhK! zllgPdn3pIB$zGmoP%jX4CVk)+JBehT0xrJM&#SQ0*SHYE!0M?&_UHT z&O{d@)u$2H@p%L%ccsEfW=Ko$nr?dXgHVFNa~AW%e6SD!7B3$eyr0tl=io3tbgEKN zeHf!DuqxOZHf0nPEe*a0TF-^g?^xaf*77dN>4nLR3Jvd~g9bA|LJxhcm&~}>#a88&DpX;MoDSw^OS|O5{URua z=-&CBdFqSb#$}mRnWeTHExa$0{EBE`UilDwAKOFT!k}lsRa@W{9}@&cLXOMLyzOGR z44iA7{AqO6;{FcL*Orx9Rdz2mBf6Tv@%K6=0{g9;OomN90}4tFt8Sa71y1Ku^b>Iz zlFu<`*z=H^1eh8*9+PxG7tQ&l`b^Y_)rBf#eKyk;s(YP2Cky7QW^w&irf~Ne>}+~% z`dkid^JyoUR|a_^^haN^>YG56nXUHR;;xyEeHa>bGw;^^T{t#y)#y)=^VidAd2s(o5^ML)3@DG_^R-Q{i&)9xklMfI%UxvuDV zDoJL|#3PA~jM^o2_d%*O40%u!sblJbRTELw;Dls3M;He-?RnzV+64X(L1^&jQ5y=R zs7Y0MBsNxfkByCz=ZZa_LN>pmg|EPCplo$*VX(4WyL+J+!c@M=TfY3E2DQ=7B}BH= zRU64ZnTXX%<>eu!Y=OFkvd_pFy^NOI6B{7p0N#e2)w<~l9*JVzL1wQZQ;L=d9*eqvJWOx_SR~L^z^RIhsiOXf? zPI7uCDF{6$P6LldxGXF(Xg{G!Biacy3zA6qe! z|NctSy4JNwL*M1%yswoFcg_Wpw=VIXnUHj#Ao#T>->WK#v*wN*uN~5OGIih~^0WoZ zs0Ovg*J$LxuNK|jUUVzC#)@wl$o%Udi6m#Mndo8}DP7-(ZJPk15)&0fJb!CD!0{0M zo3dfZv899GWe;!NH+>MJ%usZlxgH&GIpf*N&TIxq6=piAii9&`Vp$2!6-|Kg274oo z)OTg~zhfKXxw2fSP-eS=<3b8+K#oG!8Q0J}Mf}~P8gg?RR#_0LjkFEAa3bExb@evj zdaMU9bgLn=OQ|xKfqV6=WeXQ56@hl^4Wp`mnILXkqRx}(YZDhpbs!nW`#E=q-3J*J zOG?d7<|5o+Oz2|MLtZWxcPwe&oVet~H{g?6>7E)hN87fhS-FgFGaO&X*wg_iuM~T* zLu0#V>3yms|4>Aa*sLL$#90InPYDXTM=vM3qGhP3QG!W3)z@U!$;QM5?xg*?$|Gf@ zy?PL{SKq&ouW&l%e1799gA3np-|-bQ%HI42uWaEB4WsrCwFjLy;P{&?zLeiHP7^*+ z_VB6W9bgZZdO(prz#JP~M+%*?2@oBoG@hM&Khmw+1%(Z1quY2`wVG32I{ZTWVZi}9 zmV4d~kHZSw(p5uLfk%kF{@)AMr?T_2YxVz7I#Vu0EVVXteD;Sxd)f!>q3yzF=oWGc Yq`9yCl)1MN`!N90-zKC$Zyh@IPlJbg&j0`b literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/documentation/Workunits.png b/esp/src/test-ui/tests/framework/documentation/Workunits.png new file mode 100644 index 0000000000000000000000000000000000000000..0c50d24564b5366198622c12137dd4f283d639f5 GIT binary patch literal 4176 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 S*`c(wP8sN!YFBCAhW-a@CUa2$ literal 0 HcmV?d00001 diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValue.java b/esp/src/test-ui/tests/framework/model/ApplicationValue.java new file mode 100644 index 00000000000..67f87f1da0a --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ApplicationValue.java @@ -0,0 +1,15 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ApplicationValue { + + @JsonProperty("Application") + private String application; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Value") + private String value; +} diff --git a/esp/src/test-ui/tests/framework/model/ApplicationValues.java b/esp/src/test-ui/tests/framework/model/ApplicationValues.java new file mode 100644 index 00000000000..d7a1425d1e3 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ApplicationValues.java @@ -0,0 +1,11 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class ApplicationValues { + + @JsonProperty("ApplicationValue") + private List applicationValue; +} diff --git a/esp/src/test-ui/tests/framework/model/ECLWorkunit.java b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java new file mode 100644 index 00000000000..6a4cc340fe3 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/ECLWorkunit.java @@ -0,0 +1,100 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import framework.utility.TimeUtils; + +public class ECLWorkunit { + + @JsonProperty("Wuid") + private String wuid; + @JsonProperty("Owner") + private String owner; + + @JsonProperty("Cluster") + private String cluster; + + @JsonProperty("Jobname") + private String jobname; + + @JsonProperty("StateID") + private int stateID; + + @JsonProperty("State") + private String state; + + @JsonProperty("Protected") + private boolean isProtected; + + @JsonProperty("Action") + private int action; + + @JsonProperty("ActionEx") + private String actionEx; + + @JsonProperty("IsPausing") + private boolean isPausing; + + @JsonProperty("ThorLCR") + private boolean thorLCR; + + @JsonProperty("TotalClusterTime") + private long totalClusterTime; + + @JsonProperty("ApplicationValues") + private ApplicationValues applicationValues; + + @JsonProperty("ExecuteCost") + private double executeCost; + + @JsonProperty("FileAccessCost") + private double fileAccessCost; + + @JsonProperty("CompileCost") + private double compileCost; + + @JsonProperty("NoAccess") + private boolean noAccess; + + public String getWuid() { + return wuid; + } + + public String getOwner() { + return owner; + } + + public String getCluster() { + return cluster; + } + + public String getJobname() { + return jobname; + } + + public String getState() { + return state; + } + + public long getTotalClusterTime() { + return totalClusterTime; + } + + @JsonSetter("TotalClusterTime") + public void setTotalClusterTime(String totalClusterTime) { + this.totalClusterTime = TimeUtils.convertToMilliseconds(totalClusterTime); + } + + public double getExecuteCost() { + return executeCost; + } + + public double getFileAccessCost() { + return fileAccessCost; + } + + public double getCompileCost() { + return compileCost; + } + +} diff --git a/esp/src/test-ui/tests/framework/model/NavigationWebElement.java b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java new file mode 100644 index 00000000000..cf095ad554f --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/NavigationWebElement.java @@ -0,0 +1,14 @@ +package framework.model; + +import org.openqa.selenium.WebElement; + +public record NavigationWebElement(String name, String hrefValue, WebElement webElement) { + + @Override + public String toString() { + return "NavigationWebElement{" + + "name='" + name + '\'' + + ", hrefValue='" + hrefValue + '\'' + + '}'; + } +} diff --git a/esp/src/test-ui/tests/framework/model/TestClass.java b/esp/src/test-ui/tests/framework/model/TestClass.java new file mode 100644 index 00000000000..240cdd98a90 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/TestClass.java @@ -0,0 +1,16 @@ +package framework.model; + +public class TestClass { + + String name; + String path; + + public TestClass(String name, String path) { + this.name = name; + this.path = path; + } + + public String getPath() { + return path; + } +} diff --git a/esp/src/test-ui/tests/framework/model/WUQueryResponse.java b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java new file mode 100644 index 00000000000..eb1a9aa3a7d --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/WUQueryResponse.java @@ -0,0 +1,55 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class WUQueryResponse { + + @JsonProperty("Type") + private String type; + + @JsonProperty("LogicalFileSearchType") + private String logicalFileSearchType; + + @JsonProperty("Count") + private int count; + + @JsonProperty("PageSize") + private int pageSize; + + @JsonProperty("NextPage") + private int nextPage; + + @JsonProperty("LastPage") + private int lastPage; + + @JsonProperty("NumWUs") + private int numWUs; + + @JsonProperty("First") + private boolean first; + + @JsonProperty("PageStartFrom") + private int pageStartFrom; + + @JsonProperty("PageEndAt") + private int pageEndAt; + + @JsonProperty("Descending") + private boolean descending; + + @JsonProperty("BasicQuery") + private String basicQuery; + + @JsonProperty("Filters") + private String filters; + + @JsonProperty("CacheHint") + private long cacheHint; + + @JsonProperty("Workunits") + private Workunits workunits; + + public Workunits getWorkunits() { + return workunits; + } +} diff --git a/esp/src/test-ui/tests/framework/model/WUQueryRoot.java b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java new file mode 100644 index 00000000000..c5a1c54993d --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/WUQueryRoot.java @@ -0,0 +1,12 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class WUQueryRoot { + @JsonProperty("WUQueryResponse") + private WUQueryResponse wuQueryResponse; + + public WUQueryResponse getWUQueryResponse() { + return wuQueryResponse; + } +} diff --git a/esp/src/test-ui/tests/framework/model/Workunits.java b/esp/src/test-ui/tests/framework/model/Workunits.java new file mode 100644 index 00000000000..d52b00c5682 --- /dev/null +++ b/esp/src/test-ui/tests/framework/model/Workunits.java @@ -0,0 +1,15 @@ +package framework.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class Workunits { + + @JsonProperty("ECLWorkunit") + private List eclWorkunit; + + public List getECLWorkunit() { + return eclWorkunit; + } +} diff --git a/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java new file mode 100644 index 00000000000..50b0ac82213 --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/ActivitiesTest.java @@ -0,0 +1,117 @@ +package framework.pages; + +import framework.config.Config; +import framework.model.NavigationWebElement; +import framework.setup.LoggerHolder; +import framework.setup.WebDriverHolder; +import framework.utility.Common; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +public class ActivitiesTest { + + static final String[] textArray = {"Target/Wuid", "Graph", "State", "Owner", "Job Name"}; + static final String[] navNamesArray = {"Activities", "ECL", "Files", "Published Queries", "Operations"}; + static final Map> tabsListMap = Map.of( + "Activities", List.of("Activities", "Event Scheduler"), + "ECL", List.of("Workunits", "Playground"), + "Files", List.of("Logical Files", "Landing Zones", "Workunits", "XRef (L)"), + "Published Queries", List.of("Queries", "Package Maps"), + "Operations", List.of("Topology (L)", "Disk Usage (L)", "Target Clusters (L)", "Cluster Processes (L)", "System Servers (L)", "Security (L)", "Dynamic ESDL (L)") + //"DummyNavName", List.of("DummyTab1", "DummyTab2") + ); + + @Test + public void testActivitiesPage() { + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, Common.getUrl(Config.ACTIVITIES_URL)); + + Logger logger = LoggerHolder.getLogger(); + + testForAllText(logger, driver); + + List navWebElements = getNavWebElements(driver); + + testForNavigationLinks(driver, navWebElements, logger); + } + + private void testForNavigationLinks(WebDriver driver, List navWebElements, Logger logger) { + + for (NavigationWebElement element : navWebElements) { + element.webElement().click(); + + if (testTabsForNavigationLinks(driver, element)) { + String msg = "Success: Navigation Menu Link for " + element.name() + ". URL : " + element.hrefValue(); + System.out.println(msg); + } else { + String currentPage = getCurrentPage(driver); + String errorMsg = "Failure: Navigation Menu Link for " + element.name() + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + element.hrefValue(); + System.err.println(errorMsg); + logger.severe(errorMsg); + } + } + } + + private String getCurrentPage(WebDriver driver) { + + for (var entry : tabsListMap.entrySet()) { + + List tabs = entry.getValue(); + boolean allTabsPresent = true; + for (String tab : tabs) { + if (!driver.getPageSource().contains(tab)) { + allTabsPresent = false; + break; + } + } + + if (allTabsPresent) { + return entry.getKey(); + } + } + + return "Invalid Page"; + } + + private boolean testTabsForNavigationLinks(WebDriver driver, NavigationWebElement element) { + List tabsList = tabsListMap.get(element.name()); + String pageSource = driver.getPageSource(); + + for (String tab : tabsList) { + if (!pageSource.contains(tab)) { + return false; + } + } + + return true; + } + + private List getNavWebElements(WebDriver driver) { + + List navWebElements = new ArrayList<>(); + + for (String navName : navNamesArray) { + WebElement webElement = driver.findElement(By.name(navName)).findElement(By.tagName("a")); + String hrefValue = webElement.getAttribute("href"); + navWebElements.add(new NavigationWebElement(navName, hrefValue, webElement)); + } + + //navWebElements.add(new NavigationWebElement("DummyNavName", "http://192.168.0.221:8010/esp/files/index.html#/files", navWebElements.get(2).webElement())); + + return navWebElements; + } + + private void testForAllText(Logger logger, WebDriver driver) { + + for (String text : textArray) { + Common.checkTextPresent(driver, text, "Activities Page", logger); + } + } +} diff --git a/esp/src/test-ui/tests/framework/pages/BaseTableTest.java b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java new file mode 100644 index 00000000000..6468196aff5 --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/BaseTableTest.java @@ -0,0 +1,310 @@ +package framework.pages; + +import framework.config.Config; +import framework.setup.LoggerHolder; +import framework.setup.WebDriverHolder; +import framework.utility.Common; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Function; +import java.util.logging.Logger; + +public abstract class BaseTableTest { + + protected abstract String getPageName(); + + protected abstract String getPageUrl(); + + protected abstract String getJsonFilePath(); + + protected abstract String[] getColumnNames(); + + protected abstract String[] getColumnKeys(); + + protected abstract String getUniqueKeyName(); + + protected abstract String getUniqueKey(); + + protected abstract String[] getColumnKeysWithLinks(); + + protected abstract Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger); + + protected abstract Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger); + + protected abstract List parseJson(String filePath) throws Exception; + + protected abstract Object getColumnDataFromJson(T object, String columnKey); + + protected abstract void sortJsonUsingSortOrder(String currentSortOrder, List jsonObjects, String columnKey); + + protected abstract String getCurrentPage(WebDriver driver); + + protected void testPage() { + try { + WebDriver driver = WebDriverHolder.getDriver(); + Common.openWebPage(driver, getPageUrl()); + Logger logger = LoggerHolder.getLogger(); + + testForAllText(driver, logger); + testContentAndSortingOrder(driver, logger); + testLinksInTable(driver, logger); + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + } + + private void testLinksInTable(WebDriver driver, Logger logger) { + + for (String columnKey : getColumnKeysWithLinks()) { + + List values = getDataFromUIUsingColumnKey(driver, columnKey); + + int i = 1; + + for (Object value : values) { + String name = value.toString().trim(); + //WebElement element = driver.findElement(By.xpath("//div[contains(text(), '"+name+"')]/..")); + WebElement element = waitForElement(driver, By.xpath("//div[contains(text(), '" + name + "')]/..")); + String href = element.findElement(By.tagName("a")).getAttribute("href"); + + String dropdownValueBefore = getSelectedDropdownValue(driver); + + element.click(); + + if (driver.getPageSource().contains(name)) { + String msg = "Success: " + getPageName() + ": Link Test Pass for " + i++ + ". " + name + ". URL : " + href; + System.out.println(msg); + } else { + String currentPage = getCurrentPage(driver); + String errorMsg = "Failure: " + getPageName() + ": Link Test Fail for " + i++ + ". " + name + " page failed. The current navigation page that we landed on is " + currentPage + ". Current URL : " + href; + System.err.println(errorMsg); + logger.severe(errorMsg); + } + + driver.navigate().to(getPageUrl()); + driver.navigate().refresh(); + + String dropdownValueAfter = getSelectedDropdownValue(driver); + + // Log error if the dropdown value has changed + if (!dropdownValueBefore.equals(dropdownValueAfter)) { + String dropdownErrorMsg = "Failure: " + getPageName() + ": Dropdown value changed after navigating back. Before: " + dropdownValueBefore + ", After: " + dropdownValueAfter; + System.err.println(dropdownErrorMsg); + logger.severe(dropdownErrorMsg); + } + } + } + } + + protected WebElement waitForElement(WebDriver driver, By locator) { + return new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.presenceOfElementLocated(locator)); + } + + private void testContentAndSortingOrder(WebDriver driver, Logger logger) { + List jsonObjects = getAllObjectsFromJson(logger); + + if (jsonObjects != null) { + int numOfItemsJSON = jsonObjects.size(); + clickDropdown(driver, numOfItemsJSON); + + if (testTableContent(driver, logger, jsonObjects)) { + for (int i = 0; i < getColumnKeys().length; i++) { + testTheSortingOrderForOneColumn(driver, logger, jsonObjects, getColumnKeys()[i], getColumnNames()[i]); + } + } + } + } + + private void testTheSortingOrderForOneColumn(WebDriver driver, Logger logger, List jsonObjects, String columnKey, String columnName) { + for (int i = 0; i < 3; i++) { + + String currentSortOrder = getCurrentSortingOrder(driver, columnKey); + List columnDataFromUI = getDataFromUIUsingColumnKey(driver, columnKey); + + sortJsonUsingSortOrder(currentSortOrder, jsonObjects, columnKey); + + List columnDataFromJSON = getDataFromJSONUsingColumnKey(columnKey, jsonObjects); + List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + + if (compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, columnName)) { + System.out.println("Success: " + getPageName() + ": Values are correctly sorted in " + currentSortOrder + " order by: " + columnName); + } else { + String errMsg = "Failure: " + getPageName() + ": Values are not correctly sorted in " + currentSortOrder + " order by: " + columnName; + System.err.println(errMsg); + logger.severe(errMsg); + } + } + } + + private String getCurrentSortingOrder(WebDriver driver, String columnKey) { + + WebElement columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + columnHeader.click(); + + Common.sleep(); + + columnHeader = driver.findElement(By.cssSelector("div[data-item-key='" + columnKey + "']")); + + return columnHeader.getAttribute("aria-sort"); + } + + private List getDataFromJSONUsingColumnKey(String columnKey, List jsonObjects) { + List columnDataFromJSON = new ArrayList<>(); + for (T jsonObject : jsonObjects) { + columnDataFromJSON.add(getColumnDataFromJson(jsonObject, columnKey)); + } + return columnDataFromJSON; + } + + private List getDataFromUIUsingColumnKey(WebDriver driver, String columnKey) { + List elements = driver.findElements(By.cssSelector("div[data-automation-key='" + columnKey + "']")); + List columnData = new ArrayList<>(); + for (WebElement element : elements) { + columnData.add(element.getText()); + } + return columnData; + } + + void ascendingSortJson(List jsonObjects, String columnKey) { + jsonObjects.sort(Comparator.comparing(jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey))); + } + + void descendingSortJson(List jsonObjects, String columnKey) { + jsonObjects.sort(Comparator.comparing((Function) jsonObject -> (Comparable) getColumnDataFromJson(jsonObject, columnKey)).reversed()); + } + + private boolean testTableContent(WebDriver driver, Logger logger, List jsonObjects) { + System.out.println("Page: " + getPageName() + ": Number of Objects from Json: " + jsonObjects.size()); + + List columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + + if (jsonObjects.size() != columnDataIDFromUI.size()) { + Common.sleep(); + columnDataIDFromUI = getDataFromUIUsingColumnKey(driver, getUniqueKey()); + } + + System.out.println("Page: " + getPageName() + ": Number of Objects from UI: " + columnDataIDFromUI.size()); + + if (jsonObjects.size() != columnDataIDFromUI.size()) { + String errMsg = "Failure: " + getPageName() + ": Number of items on UI are not equal to the number of items in JSON" + + "\nNumber of Objects from Json: " + jsonObjects.size() + + "\nNumber of Objects from UI: " + columnDataIDFromUI.size(); + System.out.println(errMsg); + logger.severe(errMsg); + return false; + } + + boolean pass = true; + + for (int i = 0; i < getColumnKeys().length; i++) { + List columnDataFromUI = getDataFromUIUsingColumnKey(driver, getColumnKeys()[i]); + List columnDataFromJSON = getDataFromJSONUsingColumnKey(getColumnKeys()[i], jsonObjects); + if (!compareData(columnDataFromUI, columnDataFromJSON, columnDataIDFromUI, logger, getColumnNames()[i])) { + pass = false; + } + } + + return pass; + } + + private List getAllObjectsFromJson(Logger logger) { + String filePath = getJsonFilePath(); + try { + return parseJson(filePath); + } catch (Exception e) { + System.err.println("Exception: " + e.getMessage()); + logger.severe("Failure: Exception: " + e.getMessage()); + } + + logger.severe("Failure: Error in JSON Parsing: " + filePath); + return null; + } + + private boolean compareData(List dataUI, List dataJSON, List dataIDUI, Logger logger, String columnName) { + + boolean pass = true; + + for (int i = 0; i < dataUI.size(); i++) { + + Object dataUIValue = dataUI.get(i); + Object dataJSONValue = dataJSON.get(i); + Object dataIDUIValue = dataIDUI.get(i); + + dataUIValue = parseDataUIValue(dataUIValue, columnName, dataIDUIValue, logger); + dataJSONValue = parseDataJSONValue(dataJSONValue, columnName, dataIDUIValue, logger); + + if (!checkValues(dataUIValue, dataJSONValue, dataIDUIValue, logger, columnName)) { + pass = false; + } + } + + if (pass) { + System.out.println("Success: " + getPageName() + ": Content test passed for column: " + columnName); + } + + return pass; + } + + private boolean checkValues(Object dataUIValue, Object dataJSONValue, Object dataIDUIValue, Logger logger, String columnName) { + if (!dataUIValue.equals(dataJSONValue)) { + String errMsg = "Failure: " + getPageName() + ": Incorrect " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue + ". Correct " + columnName + " is: " + dataJSONValue; + System.out.println(errMsg); + logger.severe(errMsg); + return false; + } + + return true; + } + + private void clickDropdown(WebDriver driver, int numOfItemsJSON) { + WebElement dropdown = driver.findElement(By.id("pageSize")); + dropdown.click(); + + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); + List options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".ms-Dropdown-item"))); + + int selectedValue = Config.dropdownValues[0]; + + // the smallest dropdown value greater than numOfItemsJSON + for (int value : Config.dropdownValues) { + if (numOfItemsJSON < value) { + selectedValue = value; + break; + } + } + + System.out.println("Dropdown selected: " + selectedValue); + + for (WebElement option : options) { + if (option.getText().equals(String.valueOf(selectedValue))) { + option.click(); + break; + } + } + + wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".ms-Dropdown-item"))); + driver.navigate().refresh(); + Common.sleep(); + } + + private String getSelectedDropdownValue(WebDriver driver) { + WebElement dropdown = waitForElement(driver, By.id("pageSize")); + return dropdown.getText().trim(); + } + + private void testForAllText(WebDriver driver, Logger logger) { + for (String text : getColumnNames()) { + Common.checkTextPresent(driver, text, getPageName(), logger); + } + } +} + diff --git a/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java new file mode 100644 index 00000000000..b5837fb4d6b --- /dev/null +++ b/esp/src/test-ui/tests/framework/pages/ECLWorkUnitsTest.java @@ -0,0 +1,155 @@ +package framework.pages; + +import com.fasterxml.jackson.databind.ObjectMapper; +import framework.config.Config; +import framework.model.ECLWorkunit; +import framework.model.WUQueryResponse; +import framework.model.WUQueryRoot; +import framework.utility.Common; +import framework.utility.TimeUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.testng.annotations.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; + +public class ECLWorkUnitsTest extends BaseTableTest { + + @Test + public void testingECLWorkUnitsPage() { + testPage(); + } + + @Override + protected String getPageName() { + return "ECL Workunits"; + } + + @Override + protected String getPageUrl() { + return Common.getUrl(Config.ECL_WORK_UNITS_URL); + } + + @Override + protected String getJsonFilePath() { + return Common.isRunningOnLocal() ? Config.PATH_LOCAL_WORKUNITS_JSON : Config.PATH_GH_ACTION_WORKUNITS_JSON; + } + + @Override + protected String[] getColumnNames() { + return new String[]{"WUID", "Owner", "Job Name", "Cluster", "State", "Total Cluster Time", "Compile Cost", "Execution Cost", "File Access Cost"}; + } + + @Override + protected String[] getColumnKeys() { + return new String[]{"Wuid", "Owner", "Jobname", "Cluster", "State", "TotalClusterTime", "Compile Cost", "Execution Cost", "File Access Cost"}; + } + + @Override + protected String[] getColumnKeysWithLinks() { + return new String[]{"Wuid"}; + } + + @Override + protected String getUniqueKeyName() { + return "WUID"; + } + + @Override + protected String getUniqueKey() { + return "Wuid"; + } + + private List getCostColumns() { + return Arrays.asList("Compile Cost", "Execution Cost", "File Access Cost"); + } + + @Override + protected List parseJson(String filePath) throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + WUQueryRoot wuQueryRoot = objectMapper.readValue(new File(filePath), WUQueryRoot.class); + WUQueryResponse wuQueryResponse = wuQueryRoot.getWUQueryResponse(); + return wuQueryResponse.getWorkunits().getECLWorkunit(); + } + + @Override + protected Object getColumnDataFromJson(ECLWorkunit workunit, String columnKey) { + return switch (columnKey) { + case "Wuid" -> workunit.getWuid(); + case "Owner" -> workunit.getOwner(); + case "Jobname" -> workunit.getJobname(); + case "Cluster" -> workunit.getCluster(); + case "State" -> workunit.getState(); + case "TotalClusterTime" -> workunit.getTotalClusterTime(); + case "Compile Cost" -> workunit.getCompileCost(); + case "Execution Cost" -> workunit.getExecuteCost(); + case "File Access Cost" -> workunit.getFileAccessCost(); + default -> null; + }; + } + + @Override + protected Object parseDataUIValue(Object dataUIValue, String columnName, Object dataIDUIValue, Logger logger) { + if (getCostColumns().contains(columnName)) { + dataUIValue = Double.parseDouble(((String) dataUIValue).split(" ")[0]); + } else if (columnName.equals("Total Cluster Time")) { + long timeInMilliSecs = TimeUtils.convertToMilliseconds((String) dataUIValue); + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " : " + dataUIValue + " in UI for " + getUniqueKeyName() + " : " + dataIDUIValue; + System.out.println(errMsg); + logger.severe(errMsg); + return dataUIValue; + } + + return timeInMilliSecs; + } else if (dataUIValue instanceof String) { + dataUIValue = ((String) dataUIValue).trim(); + } + + return dataUIValue; + } + + @Override + protected Object parseDataJSONValue(Object dataJSONValue, String columnName, Object dataIDUIValue, Logger logger) { + if (columnName.equals("Total Cluster Time")) { + long timeInMilliSecs = (long) dataJSONValue; + if (timeInMilliSecs == Config.MALFORMED_TIME_STRING) { + String errMsg = "Failure: " + getPageName() + ": Incorrect time format for " + columnName + " in JSON for " + getUniqueKeyName() + " : " + dataIDUIValue; + System.out.println(errMsg); + logger.severe(errMsg); + return dataJSONValue; + } + + return timeInMilliSecs; + } + + return dataJSONValue; + } + + @Override + protected void sortJsonUsingSortOrder(String currentSortOrder, List workunitsJson, String columnKey) { + switch (currentSortOrder) { + case "ascending" -> ascendingSortJson(workunitsJson, columnKey); + case "descending" -> descendingSortJson(workunitsJson, columnKey); + case "none" -> descendingSortJson(workunitsJson, getUniqueKey()); + } + } + + @Override + protected String getCurrentPage(WebDriver driver) { + try { + WebElement element = waitForElement(driver, By.id("wuid")); + if (element != null) { + return element.getAttribute("title"); + } + } catch (NoSuchElementException e) { + return "Invalid Page"; + } + return "Invalid Page"; + } +} \ No newline at end of file diff --git a/esp/src/test-ui/tests/framework/setup/LoggerHolder.java b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java new file mode 100644 index 00000000000..b80c46f471f --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/LoggerHolder.java @@ -0,0 +1,16 @@ +package framework.setup; + +import java.util.logging.Logger; + +public class LoggerHolder { + private static Logger logger; + + public static Logger getLogger() { + return logger; + } + + public static void setLogger(Logger logger) { + LoggerHolder.logger = logger; + } +} + diff --git a/esp/src/test-ui/tests/framework/setup/TestInjector.java b/esp/src/test-ui/tests/framework/setup/TestInjector.java new file mode 100644 index 00000000000..48742c85d51 --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/TestInjector.java @@ -0,0 +1,31 @@ +package framework.setup; + +import org.openqa.selenium.WebDriver; +import org.testng.IInvokedMethod; +import org.testng.IInvokedMethodListener; +import org.testng.ITestResult; + +import java.util.logging.Logger; + +public class TestInjector implements IInvokedMethodListener { + private final Logger logger; + private final WebDriver driver; + + public TestInjector(Logger logger, WebDriver driver) { + this.logger = logger; + this.driver = driver; + } + + @Override + public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { + if (method.isTestMethod()) { + LoggerHolder.setLogger(logger); + WebDriverHolder.setDriver(driver); + } + } + + @Override + public void afterInvocation(IInvokedMethod method, ITestResult testResult) { + // Optionally, clean up if necessary + } +} diff --git a/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java new file mode 100644 index 00000000000..0daf2f245aa --- /dev/null +++ b/esp/src/test-ui/tests/framework/setup/WebDriverHolder.java @@ -0,0 +1,15 @@ +package framework.setup; + +import org.openqa.selenium.WebDriver; + +public class WebDriverHolder { + private static WebDriver driver; + + public static WebDriver getDriver() { + return driver; + } + + public static void setDriver(WebDriver driver) { + WebDriverHolder.driver = driver; + } +} diff --git a/esp/src/test-ui/tests/framework/utility/Common.java b/esp/src/test-ui/tests/framework/utility/Common.java new file mode 100644 index 00000000000..2fb12970a09 --- /dev/null +++ b/esp/src/test-ui/tests/framework/utility/Common.java @@ -0,0 +1,45 @@ +package framework.utility; + +import framework.config.Config; +import org.openqa.selenium.WebDriver; + +import java.time.Duration; +import java.util.logging.Logger; + +public class Common { + + public static void checkTextPresent(WebDriver driver, String text, String page, Logger logger) { + if (driver.getPageSource().contains(text)) { + String msg = "Success: " + page + ": Text present: " + text; + System.out.println(msg); + } else { + String errorMsg = "Failure: " + page + ": Text not present: " + text; + System.err.println(errorMsg); + logger.severe(errorMsg); + } + } + + public static void openWebPage(WebDriver driver, String url) { + + driver.get(url); + driver.manage().window().maximize(); + sleep(); + } + + public static void sleep() { + try { + Thread.sleep(Duration.ofSeconds(Config.WAIT_TIME_IN_SECONDS)); + } catch (InterruptedException e) { + System.err.println(e.getMessage()); + } + } + + public static boolean isRunningOnLocal() { + return System.getProperty("os.name").startsWith(Config.LOCAL_OS) && System.getenv("USERPROFILE").startsWith(Config.LOCAL_USER_PROFILE); + } + + public static String getUrl(String url) { + + return isRunningOnLocal() ? Config.LOCAL_IP + url : Config.GITHUB_ACTION_IP + url; + } +} diff --git a/esp/src/test-ui/tests/framework/utility/TimeUtils.java b/esp/src/test-ui/tests/framework/utility/TimeUtils.java new file mode 100644 index 00000000000..d15f72b2a13 --- /dev/null +++ b/esp/src/test-ui/tests/framework/utility/TimeUtils.java @@ -0,0 +1,63 @@ +package framework.utility; + +import framework.config.Config; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TimeUtils { + private static final Pattern TIME_PATTERN = Pattern.compile( + "\\s*(\\d+)\\s+days\\s+(\\d+):(\\d+):(\\d+).(\\d+)|" + + "(\\d+):(\\d+):(\\d+).(\\d+)|" + + "(\\d+):(\\d+).(\\d+)|" + + "(\\d+).(\\d+)\\s*"); + + private static final long MILLISECONDS_IN_A_SECOND = 1000; + private static final long MILLISECONDS_IN_A_MINUTE = 60 * MILLISECONDS_IN_A_SECOND; + private static final long MILLISECONDS_IN_AN_HOUR = 60 * MILLISECONDS_IN_A_MINUTE; + private static final long MILLISECONDS_IN_A_DAY = 24 * MILLISECONDS_IN_AN_HOUR; + + public static long convertToMilliseconds(String time) { + Matcher matcher = TIME_PATTERN.matcher(time); + if (matcher.matches()) { + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + int milliSeconds = 0; + + try { + if (matcher.group(1) != null) { // Matches d days h:m:s.s + days = Integer.parseInt(matcher.group(1)); + hours = Integer.parseInt(matcher.group(2)); + minutes = Integer.parseInt(matcher.group(3)); + seconds = Integer.parseInt(matcher.group(4)); + milliSeconds = Integer.parseInt(matcher.group(5)); + } else if (matcher.group(6) != null) { // Matches h:m:s.s + hours = Integer.parseInt(matcher.group(6)); + minutes = Integer.parseInt(matcher.group(7)); + seconds = Integer.parseInt(matcher.group(8)); + milliSeconds = Integer.parseInt(matcher.group(9)); + } else if (matcher.group(10) != null) { // Matches m:s.s + minutes = Integer.parseInt(matcher.group(10)); + seconds = Integer.parseInt(matcher.group(11)); + milliSeconds = Integer.parseInt(matcher.group(12)); + } else if (matcher.group(13) != null) { // Matches s.s + seconds = Integer.parseInt(matcher.group(13)); + milliSeconds = Integer.parseInt(matcher.group(14)); + } + } catch (NumberFormatException e) { + return Config.MALFORMED_TIME_STRING; + } + + return days * MILLISECONDS_IN_A_DAY + + hours * MILLISECONDS_IN_AN_HOUR + + minutes * MILLISECONDS_IN_A_MINUTE + + seconds * MILLISECONDS_IN_A_SECOND + + milliSeconds; + + } else { + return Config.MALFORMED_TIME_STRING; + } + } +}