From 4bf50d5901ac0ef201ffce55af8a9c92244b8ac7 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sun, 30 Mar 2008 14:16:22 +0000 Subject: [PATCH] Make a start on running all the formula tests for xssf. Currently not enabled, as many fail, but provides a start git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@642741 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/record/BoolErrRecord.java | 9 +- .../apache/poi/xssf/usermodel/XSSFCell.java | 38 +- .../usermodel/TestFormulaEvaluatorOnXSSF.java | 341 ++++++++++++++++++ .../poi/hssf/data/FormulaEvalTestData.xls | Bin 136704 -> 136704 bytes .../hssf/data/FormulaEvalTestData_Copy.xlsx | Bin 0 -> 59230 bytes .../eval/TestFormulasFromSpreadsheet.java | 63 ++-- 6 files changed, 417 insertions(+), 34 deletions(-) create mode 100644 src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java create mode 100755 src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData_Copy.xlsx diff --git a/src/java/org/apache/poi/hssf/record/BoolErrRecord.java b/src/java/org/apache/poi/hssf/record/BoolErrRecord.java index 28564224a9..9a9ea554e1 100644 --- a/src/java/org/apache/poi/hssf/record/BoolErrRecord.java +++ b/src/java/org/apache/poi/hssf/record/BoolErrRecord.java @@ -45,9 +45,16 @@ public class BoolErrRecord private short field_3_xf_index; private byte field_4_bBoolErr; private byte field_5_fError; + + public static final byte NULL = 0; + public static final byte DIV0 = 7; + public static final byte VALUE = 15; + public static final byte REF = 23; + public static final byte NAME = 29; + public static final byte NUM = 36; + public static final byte NA = 42; /** Creates new BoolErrRecord */ - public BoolErrRecord() { } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index e566181c8f..96ddd9567d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -20,6 +20,7 @@ package org.apache.poi.xssf.usermodel; import java.util.Calendar; import java.util.Date; +import org.apache.poi.hssf.record.BoolErrRecord; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -139,12 +140,47 @@ public class XSSFCell implements Cell { throw new NumberFormatException("You cannot get a date value from a cell of type " + this.cell.getT()); } + /** + * Returns the error message, such as #VALUE! + */ + public String getErrorCellString() { + if (STCellType.E != cell.getT()) { + throw new NumberFormatException("You cannot get a error value from a non-error cell"); + } + if (this.cell.isSetV()) { + return this.cell.getV(); + } + return null; + } + /** + * Returns the error type, in the same way that + * HSSFCell does. See {@link BoolErrRecord} for details + */ public byte getErrorCellValue() { if (STCellType.E != cell.getT()) { throw new NumberFormatException("You cannot get a error value from a non-error cell"); } if (this.cell.isSetV()) { - return Byte.parseByte(this.cell.getV()); + String errS = this.cell.getV(); + if(errS.equals("#NULL!")) { + return BoolErrRecord.NULL; + } + if(errS.equals("#DIV/0!")) { + return BoolErrRecord.DIV0; + } + if(errS.equals("#VALUE!")) { + return BoolErrRecord.VALUE; + } + if(errS.equals("#REF!")) { + return BoolErrRecord.REF; + } + if(errS.equals("#NAME?")) { + return BoolErrRecord.NAME; + } + if(errS.equals("#NUM!")) { + return BoolErrRecord.NUM; + } + return BoolErrRecord.NA; } return 0; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java new file mode 100644 index 0000000000..cd8fcfe509 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java @@ -0,0 +1,341 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package org.apache.poi.xssf.usermodel; + +import java.io.PrintStream; + +import junit.framework.Assert; +import junit.framework.AssertionFailedError; +import junit.framework.TestCase; + +import org.apache.poi.hssf.record.formula.eval.TestFormulasFromSpreadsheet; +import org.apache.poi.hssf.record.formula.functions.TestMathX; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.FormulaEvaluator; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.openxml4j.opc.Package; + +/** + * Performs much the same role as {@link TestFormulasFromSpreadsheet}, + * except for a XSSF spreadsheet, not a HSSF one. + * This allows us to check that all our Formula Evaluation code + * is able to work for XSSF, as well as for HSSF. + * + * Periodically, you should open FormulaEvalTestData.xls in + * Excel 2007, and re-save it as FormulaEvalTestData_Copy.xlsx + * + * Currently disabled, as doesn't work + */ +public final class TestFormulaEvaluatorOnXSSF extends TestCase { + + private static final class Result { + public static final int SOME_EVALUATIONS_FAILED = -1; + public static final int ALL_EVALUATIONS_SUCCEEDED = +1; + public static final int NO_EVALUATIONS_FOUND = 0; + } + + /** + * This class defines constants for navigating around the test data spreadsheet used for these tests. + */ + private static final class SS { + + /** + * Name of the test spreadsheet (found in the standard test data folder) + */ + public final static String FILENAME = "FormulaEvalTestData_Copy.xlsx"; + /** + * Row (zero-based) in the test spreadsheet where the operator examples start. + */ + public static final int START_OPERATORS_ROW_INDEX = 22; // Row '23' + /** + * Row (zero-based) in the test spreadsheet where the function examples start. + */ + public static final int START_FUNCTIONS_ROW_INDEX = 87; // Row '88' + /** + * Index of the column that contains the function names + */ + public static final short COLUMN_INDEX_FUNCTION_NAME = 1; // Column 'B' + + /** + * Used to indicate when there are no more functions left + */ + public static final String FUNCTION_NAMES_END_SENTINEL = ""; + + /** + * Index of the column where the test values start (for each function) + */ + public static final short COLUMN_INDEX_FIRST_TEST_VALUE = 3; // Column 'D' + + /** + * Each function takes 4 rows in the test spreadsheet + */ + public static final int NUMBER_OF_ROWS_PER_FUNCTION = 4; + } + + private Workbook workbook; + private Sheet sheet; + // Note - multiple failures are aggregated before ending. + // If one or more functions fail, a single AssertionFailedError is thrown at the end + private int _functionFailureCount; + private int _functionSuccessCount; + private int _evaluationFailureCount; + private int _evaluationSuccessCount; + + private static final Cell getExpectedValueCell(Row row, short columnIndex) { + if (row == null) { + return null; + } + return row.getCell(columnIndex); + } + + + private static void confirmExpectedResult(String msg, Cell expected, FormulaEvaluator.CellValue actual) { + if (expected == null) { + throw new AssertionFailedError(msg + " - Bad setup data expected value is null"); + } + if(actual == null) { + throw new AssertionFailedError(msg + " - actual value was null"); + } + + if (expected.getCellType() == Cell.CELL_TYPE_STRING) { + String value = expected.getRichStringCellValue().getString(); + if (value.startsWith("#")) { + // TODO - this code never called + expected.setCellType(Cell.CELL_TYPE_ERROR); + // expected.setCellErrorValue(...?); + } + } + + switch (expected.getCellType()) { + case Cell.CELL_TYPE_BLANK: + assertEquals(msg, Cell.CELL_TYPE_BLANK, actual.getCellType()); + break; + case Cell.CELL_TYPE_BOOLEAN: + assertEquals(msg, Cell.CELL_TYPE_BOOLEAN, actual.getCellType()); + assertEquals(msg, expected.getBooleanCellValue(), actual.getBooleanValue()); + break; + case Cell.CELL_TYPE_ERROR: + assertEquals(msg, Cell.CELL_TYPE_ERROR, actual.getCellType()); + if(false) { // TODO: fix ~45 functions which are currently returning incorrect error values + assertEquals(msg, expected.getErrorCellValue(), actual.getErrorValue()); + } + break; + case Cell.CELL_TYPE_FORMULA: // will never be used, since we will call method after formula evaluation + throw new AssertionFailedError("Cannot expect formula as result of formula evaluation: " + msg); + case Cell.CELL_TYPE_NUMERIC: + assertEquals(msg, Cell.CELL_TYPE_NUMERIC, actual.getCellType()); + TestMathX.assertEquals(msg, expected.getNumericCellValue(), actual.getNumberValue(), TestMathX.POS_ZERO, TestMathX.DIFF_TOLERANCE_FACTOR); +// double delta = Math.abs(expected.getNumericCellValue()-actual.getNumberValue()); +// double pctExpected = Math.abs(0.00001*expected.getNumericCellValue()); +// assertTrue(msg, delta <= pctExpected); + break; + case Cell.CELL_TYPE_STRING: + assertEquals(msg, Cell.CELL_TYPE_STRING, actual.getCellType()); + assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getRichTextStringValue().getString()); + break; + } + } + + + protected void setUp() throws Exception { + if (workbook == null) { + String filePath = System.getProperty("HSSF.testdata.path")+ "/" + SS.FILENAME; + Package pkg = Package.open(filePath); + workbook = new XSSFWorkbook( pkg ); + sheet = workbook.getSheetAt( 0 ); + } + _functionFailureCount = 0; + _functionSuccessCount = 0; + _evaluationFailureCount = 0; + _evaluationSuccessCount = 0; + } + + /** + * Checks that we can actually open the file + */ + public void testOpen() { + assertNotNull(workbook); + } + + /** + * Disabled for now, as many things seem to break + * for XSSF, which is a shame + */ + public void DISABLEDtestFunctionsFromTestSpreadsheet() { + + processFunctionGroup(SS.START_OPERATORS_ROW_INDEX, null); + processFunctionGroup(SS.START_FUNCTIONS_ROW_INDEX, null); + // example for debugging individual functions/operators: +// processFunctionGroup(SS.START_OPERATORS_ROW_INDEX, "ConcatEval"); +// processFunctionGroup(SS.START_FUNCTIONS_ROW_INDEX, "AVERAGE"); + + // confirm results + String successMsg = "There were " + + _evaluationSuccessCount + " successful evaluation(s) and " + + _functionSuccessCount + " function(s) without error"; + if(_functionFailureCount > 0) { + String msg = _functionFailureCount + " function(s) failed in " + + _evaluationFailureCount + " evaluation(s). " + successMsg; + throw new AssertionFailedError(msg); + } + if(false) { // normally no output for successful tests + System.out.println(getClass().getName() + ": " + successMsg); + } + } + + /** + * @param startRowIndex row index in the spreadsheet where the first function/operator is found + * @param testFocusFunctionName name of a single function/operator to test alone. + * Typically pass null to test all functions + */ + private void processFunctionGroup(int startRowIndex, String testFocusFunctionName) { + + FormulaEvaluator evaluator = new FormulaEvaluator(sheet, workbook); + + int rowIndex = startRowIndex; + while (true) { + Row r = sheet.getRow(rowIndex); + String targetFunctionName = getTargetFunctionName(r); + if(targetFunctionName == null) { + throw new AssertionFailedError("Test spreadsheet cell empty on row (" + + (rowIndex+1) + "). Expected function name or '" + + SS.FUNCTION_NAMES_END_SENTINEL + "'"); + } + if(targetFunctionName.equals(SS.FUNCTION_NAMES_END_SENTINEL)) { + // found end of functions list + break; + } + if(testFocusFunctionName == null || targetFunctionName.equalsIgnoreCase(testFocusFunctionName)) { + + // expected results are on the row below + Row expectedValuesRow = sheet.getRow(rowIndex + 1); + if(expectedValuesRow == null) { + int missingRowNum = rowIndex + 2; //+1 for 1-based, +1 for next row + throw new AssertionFailedError("Missing expected values row for function '" + + targetFunctionName + " (row " + missingRowNum + ")"); + } + switch(processFunctionRow(evaluator, targetFunctionName, r, expectedValuesRow)) { + case Result.ALL_EVALUATIONS_SUCCEEDED: _functionSuccessCount++; break; + case Result.SOME_EVALUATIONS_FAILED: _functionFailureCount++; break; + default: + throw new RuntimeException("unexpected result"); + case Result.NO_EVALUATIONS_FOUND: // do nothing + } + } + rowIndex += SS.NUMBER_OF_ROWS_PER_FUNCTION; + } + } + + /** + * + * @return a constant from the local Result class denoting whether there were any evaluation + * cases, and whether they all succeeded. + */ + private int processFunctionRow(FormulaEvaluator evaluator, String targetFunctionName, + Row formulasRow, Row expectedValuesRow) { + + int result = Result.NO_EVALUATIONS_FOUND; // so far + short endcolnum = formulasRow.getLastCellNum(); + evaluator.setCurrentRow(formulasRow); + + // iterate across the row for all the evaluation cases + for (short colnum=SS.COLUMN_INDEX_FIRST_TEST_VALUE; colnum < endcolnum; colnum++) { + Cell c = formulasRow.getCell(colnum); + if (c == null || c.getCellType() != Cell.CELL_TYPE_FORMULA) { + continue; + } + + FormulaEvaluator.CellValue actualValue = evaluator.evaluate(c); + + Cell expectedValueCell = getExpectedValueCell(expectedValuesRow, colnum); + try { + confirmExpectedResult("Function '" + targetFunctionName + "': Formula: " + c.getCellFormula() + " @ " + formulasRow.getRowNum() + ":" + colnum, + expectedValueCell, actualValue); + _evaluationSuccessCount ++; + if(result != Result.SOME_EVALUATIONS_FAILED) { + result = Result.ALL_EVALUATIONS_SUCCEEDED; + } + } catch (AssertionFailedError e) { + _evaluationFailureCount ++; + printShortStackTrace(System.err, e); + result = Result.SOME_EVALUATIONS_FAILED; + } + } + return result; + } + + /** + * Useful to keep output concise when expecting many failures to be reported by this test case + */ + private static void printShortStackTrace(PrintStream ps, AssertionFailedError e) { + StackTraceElement[] stes = e.getStackTrace(); + + int startIx = 0; + // skip any top frames inside junit.framework.Assert + while(startIx= endIx) { + // something went wrong. just print the whole stack trace + e.printStackTrace(ps); + } + endIx -= 4; // skip 4 frames of reflection invocation + ps.println(e.toString()); + for(int i=startIx; inull if cell is missing, empty or blank + */ + private static String getTargetFunctionName(Row r) { + if(r == null) { + System.err.println("Warning - given null row, can't figure out function name"); + return null; + } + Cell cell = r.getCell(SS.COLUMN_INDEX_FUNCTION_NAME); + if(cell == null) { + System.err.println("Warning - Row " + r.getRowNum() + " has no cell " + SS.COLUMN_INDEX_FUNCTION_NAME + ", can't figure out function name"); + return null; + } + if(cell.getCellType() == Cell.CELL_TYPE_BLANK) { + return null; + } + if(cell.getCellType() == Cell.CELL_TYPE_STRING) { + return cell.getRichStringCellValue().getString(); + } + + throw new AssertionFailedError("Bad cell type for 'function name' column: (" + + cell.getCellType() + ") row (" + (r.getRowNum() +1) + ")"); + } +} diff --git a/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls b/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls index aaaf958a9d2747503a773502b73b03707081e6b3..ce94050789f600447ede6c710dd38492496b5e5e 100644 GIT binary patch delta 24858 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 RANU_19N;$3s9+`E{{N8kBAx&M delta 25026 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 HOxynhuIYY$ diff --git a/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData_Copy.xlsx b/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData_Copy.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..8e491a54edfbb7f0836ef06e56cab95eb3146d3d GIT binary patch literal 59230 zcmeFY1CwOowk=w=%`V%v(Pb;kt}a_$>auOywr$(CU0ueljrY!ZvG4f<_uUm4D>HI^ z5i95X#+YNwxgr&$LBY^~Ab_BNfPjdAJTqa)T7iLp-XVd2P=OYJwM1-foJ?$-^i?9LRwmj}lZx0MrTdkm>t#1N3Cx(eZtNm-ebwi4W(`Qph zViGvUz!3vAK*PdMKerC-@qt;Q9yLPZD6^zP+XAEveh|BTGQ*ZC4MdyM=g+~iLAta4 z$deqiSX@0f2|k(z>qlHZVrKkc$1z8Vi93tSnEsg(_Tee_-w5Q z^&dBaO<$eMd(YV?C*AnoH%7w?^d46vQQcB!iR${p!gIN09Fz!|I~dL7$E{nMTwZ{? z2n6k8j3-EMT2+vHK~KX8NWF1_+IFXg`f3rsZrs|Nlw#!Jg6RG^@A-y7KjLat$e0mH3^^-DMpM5-@7SP(dIx<%wz%yi!>u;kJs%0_s zShjGh%vM9pF(fuKM;pe8!ZT3c+_KVhD@aH;Tz)I53lGO>OL!+SWW|?9gT1|QD2!!P z95eVe8;@OLvXOAe7u5YjfsS{v*8&RC1G0?&mG`BtnN`--jp4}4Fj+1_FbkDu+~rWj z6t;AFy(CR|T+$!?K4Ttv^o`gEG>d#qTmIpziPN4~I&?;2=bm>v%u(?C+?PK4SLt)- z6z^Vfz^<(EvqA45qKe-4w*4p8t=<4KRNqQ<1O^0z0|W)^X2tL?xVzdqSQ^^eTK+?; z{tbPwe?b3x?f<`zj)X~z0YbFEr@$@|yX_R?qIspEiM&F_b(dElLmR^sQUB%7gG-vz z1y)8*+*9$EpS;KWzn$CP&e{(^;hHp=;)<~)1)+5s%M1=KZ#*64Q5v*WJLX}quz^Rb zI=a@n1cxhm0_yM??df5#W0w#R6Y^qa9A*9jja@FRJ#4hiu{!PSjo{{pC0UoeoC}Qw zn$=ZfF};l)5)Ac{={+tvZ^F3E?R7$$Op7Y?^4wComuFCMz-x$iBycMUPm5F-3VT{O zibCs~K`{_zx~LJQw5Kpqw)≠<)Z|g3=uz$snT+H5)+O&Xux=L6Lu%rSO8)heG?i zTx^WrE59iR@7Wp+X+32b$Yo1$SN3957%@Lfrf_vQ;Y9tl6*<{+rSATQ$bSMYk_liL z_2F_a`od0C^Ln~O4SapT`k>M%6q)ael+<+#XNRS zY8lzGJVwjXMoVDO4ddpQUObX0>Ps_ruI8FE&q~@3F#0G+wmF-8~L8<<4d!Knv&oI9zO$`FIj9Ap41fcTJ9Z*_(C!e zYFP2#EmmYb+GD9Z5ax+w!}3QlrNLA@^WQ-(@mK8ita?@`J+akpiEKw zxH^AC+Bdh0xc4&Cwm&~p1y+LshN3zlW6IZ#AIKkh^|~OUg|K1w$y|tU4GF|BN?vO`N?Yl7CF$i2Dj>sQUTZj_vA=-Z&U~xn z%-H4<`E;;G6qgA#BT#45M^!_C14wZ6`z#Z{h!UJJvWACW!YfkU8Hb7VE!u z%<-3riIXG4Ki^pYQ5_;wb!^wZw=TQkE2fn}CQlMiQ=hUxO5}t*(I&5Ovm6%>g>3+^ z*Y|quYE2OYwE3v8*h(;byy4O6Qte&MVk9z7ZSsO;FfR@9zlcTmqv%+~SS8~? zI<7V&Y8JP0Ch_Ukzun|eI#FQ^UT~zGNs5y}JV{jyS|@(Y7<{r9wcbIN(=&;toLWjM ziP=085M}*T$tLMofFyqSrC-A-N5X9|d!BZr?VG?#g7>U0si`vJm`wE?K$u@}i}m8h zIw)f7Ue)o+RJd+&Z3RU(9nlFj+lZ@JMMx$xT%?xT(+sBzw!yAF>#^wkO|*m9T{q0KP3MiGGq1@+rY z0s|U$Ek__4^e;<6*cFShDakQ?^aNZr#Cx$7BvdnaGH_i2Q6AH3=pZ8=b~`lnVl!^Y zs!%^gLl>(<^xPb1ReUMgr*HtIYvy!g9cYHRS7295VY90egT~WexsP=ZIt}k%jD;=u zK9>tJQHPHO8;)?uZ`RqAK)Gy>VbJ9YF05H^Po@`nNXoAKD5-LUV$ zHwd5Hx$}Xm^XOi|q0hef(;OPWiBfdUpYP-sV3_&(HI_50n}&~)_bTwJneWR^hAVEv z96|aRf$1*-Ji9d>QMg;}rRM0M;ip_jbQ2zjg4c5HxEBv#28)WS;9pD`ZydSXiYYp> zHy5+rIsxsP4Y3Sz^BpmUY(>$TI_BHvX#A@_dMSa1T-^Oa?PSY4=&JCH7bV@5aII$P z4qS#2$_t}eg;*O88eX6joDhH^Gd(wm4|R=-TV`iyWdhM@DxKh1Pz zz~kr53Rc^G6(J@oTUe)ZBt)HISBe` z)d>txJSGNzGUu3pf{YGM&Fk-&ytz3d=BY?$W)kQ6f?{YiE~}4IWLO=_n>>_46)7+= zE~WiQptc#%508Kjjpskor%85K7;VeMSD;Hfk~`dn`(-9mdkS|T>k4b=A;J6N<8t9~ zZHK?9C0J%APKnviL_N{q-eVy+c3qTo0dv+dv=@i-##mYJb&NkP+E%TrDA1bp{y8qG zH%Db6kABaxG^TqGpJ{wnuynULuc$N`mG|-OKmIdeFR~%I5zs(DyQKeP31a?7sxmY! zZP&&yKD-Ox2x0{ON`dhj?L)%g1qO?)%?BOLKGKkp=ZG*uW)$#se^y}&JUt3Vhlz@q zT^^@hrt&p0d_CWGSa%Ku?~|{>)6Ujbs�QN2hPj_xx^&rUxl^mceWv9%Nq~1U)zN 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%0DD zN1Vm*K6c(oBU6m0pPOhK(|5k7UwB%fU{}Z4Y;G&F7K~pd&%tXkISdD(}6RpzQb`cz=eYbz}SaI_<7Jfi0 z;a4;P8I&+73Pyi8$q)U3Q~cKMCkV?zt8pacT)5k^$9WHg^soOiB)dEG`WPZSipW`o zL4q6R{M?)FCYX}^*)+@Z1^WZ#me&?-2pg@eVn4H;Xfb%zPoAN^iNvgOzMF16aPMcq zO4}T->zZ1*>bR98v_@G!l|`u#Kjx6a#wxnV02`j!B6`^{n#B?aSWe*!9A$fhKdv1K zo2~%b-18bl)Zk8LJAn%gE*b$ddy&dpjCqg@TT%5CrldIYh>-!GGDuk#Jg+4fphDy8 za^j&ml-dcXv?aU^$k&k_wR^CNPW2}u$T?WHyvWC>UL7|Vii{MYbZ-9LqWo5)V1ma@ zo-T-$7OKA2xbGq8h4!VVu|1a-N4)zOO5*Kfq+hMYz!J9 zyt0L5Dx)NvurU#ZappFhm=WWgGJ6VFh8AH)#8uYV2pm(wjs!t?!7I#JAL>H_=RE)5 zQt3n*$BJ=?$3RIj4AnpZoeEQ5MnK+!oO_?;lPf&sX!yQlpBCst*zWcxZpoQIlL51Z zu9Pi=9&R7Lnf>6tnt@zJ!y=6 zOd51gxoc9T8^Ohgz(tTG>In>Lr%tY)TkgzD0gj z03RZFYknE{^~@lT{G&?0893p%Qs^OdRbllk?R7{WhnnmAX`&}`B=Wp#^rV2nYHrb* zb_5z{NgI8MRdikGlq}Q2C*yTLw;^>Z}chd$Zx`Z2CJ8$D~ znDwl&$#3m`eR_L$uGL&HiYF|5!!k(QMfC83zmhns7&w#CI9`Ea$r_lK5f_R>!qe2o zMGG*8W)TMpL&D;y5@u~VEI=BcHANXIuKkQGdpMx(8)G?{c1g-|(%u!fBp$W1BVKx1 zq}@=g{wBs$IlCl0@Bnx@zUt`k8F%^2-{;JpC_%J7*khl?b;S{Z4ZpL2Ca5qOW1X1! zc(7Xd_0$>ZD>SdR6Yj?K&k4+t%0zzXq;5p~tqfwARXG$TfA%=l*_W-}MD@H`Mg)&dqa_b=r_6kn^BUfEazl0)Jp7gXv7>MR=^0FFJa0TQla)!G< z!;WY6qNn*hSSoOT-O&A>7RX^h=k;i4@oMjdJsJ1r$kylcFq}Quf31`}Ib-=^iGBIi zn{g@)vD8_hZDzC@s!AD)(5Hv1P+q+F4H~1!2~^G)~rE zX#Jk7xhx zDpTT>2pI=_H53MZzArWG27ca4W`FR~wZo>vejM;yRYICadaN#th+5B(*0YlX{fTS% zT(Fiwz&(#8f%j_w_%=8K~;~b zRMKWeSELOMz<`YI5M+V7aO4`r=pBo?3#ZaJG`AE89PVgPIaMrt*%_a#Il|Iv)zSVR zM(_gM`%ha0Q|0*}qwCpHpb+m{G~{OIVXybtToA)NDhf}}5#dwqv(;KO4lzGTM7r-I zrMh~SHQ@EoLUz@nXX1Ak{KFIK-hE|{_hZ)R+WG4wV01NwFJPWMOVT>mh__qBFecJ< z|KmH*H9GQ*HY!}E7aOaDww#3}66WyN_v6B_U{KFo;Tlv4pGqxGHyqnDxXLE5zKF`E3%@hTz~oCkDpV(OuZJ?d~z#aGJ@GR@L@Ob>mCp3?c?;TRtpvw zcKm|-Nq6Vv%(T?A*?s)7Or@jS$~$4~o?OxiBEc$+2L=|4nP72Ngrj@!B}W;Rl5C(W z$`#GxA81`;D%d1=NR|*dj;b0lK6kBl7|47oVJ6(5KWHS}mth4QDCbqGhzRjk6C3)y z!+xc_GnH+`m(bkb;oJ95KqX7EmP} z!apd*x7XlK^~s5--w*2Q@1f`S^i&HW%Hua%Q5DH;SUN)&Rng`Jw~&d=5*JUt%}LSh z&x=gDCCrpbeI9%R^v_~XOzUY1@4nX9a$?l>OQf$flr4U}`Y#uM=FrFodYJqaeXT)< zpRzK{W#iii*Dn;#ahrDMJnnC**-zwTZPRBwmwXsUkl`DT-%wo*>4REZ#q@? znG|a^AtHu!OnEl<{7B|ziufA~Nfp(BiS_YIE1ce?5AKY39O#8u-BaD-CB%d^jhKH# zl-c3X?0Jo^#21i7K(_tQbmk6G#E}=6#x(Z41Ea@=8v&gs4#@@Tso8k)4x_Qt$Awsd z?zQF)c51Lks}n-WEtT?$Kp%3?g+M7Pf&aWgGGB%WZ;un>ab>%9r0oRiuIt&#J>STS z7|`dREubTLW@gN_B`-u3ndDs96@S<$B5xbBKzyqZaYmHEP(|sCy0UQ>bBk7}%#vr< zxDF>cY8^6`L#Qy@TGfnjK6+*}hFDyMJJ?mUPsuZBS$bf+hL{Se%fLjLy4`Dt z&uKu)rpNfqaqD_p{DK3KUdL?o1n&bf(1no?67gdAs)|8~O$UrTfPnZNWe zRLcvC;Hq|zk`>)UyRk~o#$payVSeUdMHY<$CrOs?s5U7P6bSWLf~6@I4hpCL zZXRRJ*D!K>ahi(7S5v%-%ize5HpEIxOsxw*KQE)CXC0&~C}gRFJH{}x#%)kZvY}~8 zKwOZ!G?c-Tm?$DYxm~QWlsnVubdC+ek^if6+XcQoVIj+sxNjQlYxH05UBa>mOM=aJ zUuw>MWk{vA^91;ZLmxN={?#~95|78}B>%3oO?IBfk3cdG^obwf)+_c4Y|^Wy@7t!B zlJn$d^UgyWSq)lY*o6h3Zt%sd95x7*9l~YM4HO(sqVK?Q!Lv1PM`SXFW4AZV&8|>0 zN{7|U01m>;hl$PDCPkYyvOYW^q%Pi7UQ3D=I@0vMA&njNfeUPyjE{qgXtZIRG7lO> zTXo;)oV#JM=6VP)TS^8idWlnW5$>wtRcQmD44hTr=G$1(4$U<m91c1Z#}z!~pSfhA`b)SsnW4}}v zElBMk2Up8LaFcGlo*Yw3@36X@tc_D!9PZfe^vtT&zAZ6OWczb8^7NE@H{c04OT8}n zem~Cr^?E8K^fi;Om$f~U;{CGUFZA_vx6SPGczXModwY*Bd*YFRa6)d+RKol~^L~q0 zvdPFWt3N0@T>Fl+%VAa<9+yVo3>)c&}o;YN*8#Ee$8wWhphKa=`NT);Wx$Kh75d;p;(`Q z+rWKJX`4Y$tKjrccO>GGpT-1o%wl-NjELLdZiFc~sgA)9W_Teb$YjsUO_Q%hBU>gJ zcl8i5ArcSy5K<;0-$N|Lipsm{FMFLpPE!Xq^PTM}luftY|q&awtOdi|CG2$n*g zFlerYknp6UuqL*#&in~Xb8NbM@XPwmYt)E=m?3LbH?*VBWLYThGCdzE&q>9j9;8YwPR&^%(kD zW0l^*Gt&2%MPd9az9H=N7eovLMO*E$>LVvtk-t4+5ke=k74vouQmXFHd>Si-6o>Hf z4v6aNgL$>zfQ0a8+1V^V(Xt$VUPT?$-OT>_Gincs)I`|5lEPt=(AGM_&%-_6KgX}# zD^Xo^|NeZBr=h;!eeRMz^^a(*=$hhkdpqcejB?&8eoT~g^Z9thLA@QbW5UAN!(Kc|32&)MSy_ZB|M_rNX9r1ES6XL@V5Y=Nv${sl9Z%1~E(3({`oH3V_ zfX0Bj9iCDwL=TBw+q>G>r@s!Gi*ebdgwk4I7+Z`A<(dI+CrP4{G?&X36^k?QY6of{ z9+ZL|19X#W^r4zgWcDJ{-BgiYOaKM|jl>}VnHcbX;L|@mdaCKvNBL>6?`Y<1j&bZP z{^||)IHRZ<(oUQC7Zpdj1lBqU%BvI4f0sE;`JnLk65%d!N?ciulqiFKTB=<;uU zlVq0#QZ)2+_%aqe7F4m9QONRP88fVGD&W8z2wc_@(i($-@}}ko+8Vj?mO>Q-U8r22L zCr!R3EMh4wyMA}X;(SPG06qaH&4o(f>@o;}sw4F^$TM9CkW&aLMHut=LmKI_bW|Fe zgLPm)l;G&-Bqxb9^!}J=$ncS?JyT9#^$Hy~Q?fHxbi)MPr;qepy}NSJMfHeYKRNg# zk3Uvv3cqqNYbvi|5nr&l)RDv3Fyya`i(zlJ-d3zj#v0TaAc-x;qE2jJ0ZlA zSI%7Oe$IX=Z_DIjN2jZCiUnHD?YA4CsCxF$h@PA^*_g7vHdoA1`8+x_ZLFt`%b6Pr z{TiyGip_N<0_CuMAoxD)B$5yGf`h;HnMYd`S>`N9th5LbxKPKvDPEcuALmQ@w zD48l2d4kqeE{K6P0`8{g{$)Xfw@6h?NGWk{84y+U)H_TrLSjdw$D{lRW@+}T(LD&4 z(~C%go2_$qI92*Rp-0$76#5~CTE8lzB3wpge@q=7-nxcK>Q;^Fnmuc#ZHMj)Uw3p_ zZAS&_)-xx=u|aJ=gc$i5Ya$&`^(hH?(LcZB3a2-@jN#cP$RV>RS38#X%TLa1WGi&e zgD8DWg34f+wGx5;o)P*u|7O5Af*^{AkX}~|+2t>8$!b+|vlY(vQstSthh^FaAi$v50&*Z}cAY&!y;PHVcKp0_(WZcu zj3R<^tf80p1d0&3K}g)g%BHmz`T>jzeQD7e?AbvueHV7|hhbW1D0^$aXvGwW-bQFQ zXHK=&aYR#I^g24Fixgh0N+q1?Ar}%q@i3M9Q^>%WUbO?ok#+w@LSNh_u)i{WUA#t} zu&^c=bJVBe^I%$%);I|%BT?45_0W(f^b{rL(CHeWePc-9f!)=28S=!up`I$Hn0D%+ z!8VOP-tPPFxAKBocQv_$F}3IJqp;hlRS7~iKyj{qI(byp2&*LiGGVcXi7$_`be;ei z&%ew@(dLHGOR5Y>7E zOd5?^<95Yn(1e$vVZ~I-q!-m7UPin1TzqpAf@ojy+LdR#-xfyIEiwxmBac}l4?5a5 zy~B@~)v8XN5WCZ-Up%2CrLWG)74BMfH_IHS@kdCKfh6yb_xtIZz?R@E)<4u7v%6#h z;t*Z;AGjN5I}rZ}oEKDiq&jsS%%(1VPQ;Toa=@^n7HT8!U!AGp1<$D-YDl={4@tLV zUF*v=A0diWd?U(N01gbm@#9jE&0Gq!*oCDQ!$|Nvq<5h#E)wzXcl`)+KW{kAQVDhR zPjJsm*yflJv%s00(aZ|{yfBN{+0>*I)sX)7Uo2eQpvXRV5rsFtKG@HSTxY4IU}dE* zs_gueb;V^co_D>%qbBw*8PyYuBm>05(fpMwwj7Sc@bcD?pDuy|=FVs|zQCBqscmem zY}K>E2OJczI9Qds;~L&E^N&6gZ7?+HfXJa*)L1G;1qV86b(0xFj?qJPP-x^e=RXS} zQ1i_nSRN<`uDdN@p(NY-ctyb$8^(a@MF|V&_dw_YLD89lmoq)j z{6B2uavEf#L%VwH7B%503+y)46QEo|CVP;&&u5BolYqx&2{F>D*>DsJXbW|@cfp!a z$5(e&#TP7hulx47jJYH?Wu?Wnt;ypwjdh}V_9ZwT=L(HLC24?j4~;OC!C4d@4halFX_8sK_FPkYO86HX}(sN;`NUVP(qumVhThP^psBik`d$)>U4nvs+M~% zD>1@Ta(>dcMjsvl3uZvrv)k`h!>b=4V0uB-z|i)2x>i_>UoYOp)?I6UvgRW`8ib)s z+XiMJgLs6n0txBQ+!l~zzjs$ImZO0?t<`pcPZVWFU!TMrFSr7YR8%u4>vraF7VL;yjq*pGHQlpx3 ztJ}xJe({uUC`0V07z(|mW2;^2#^$GsAYwM7f;;}bahNLyW>*+R)bAWCTKt>$T*;!| z2{ejpDgMdVM3rUOKS}r-UYOh$*cHCmGTq2tH$=;G7rh*AmGf~gjwEMLps-pBTN|Jw zf;jf;Ht2L zb!Ddapy`O#jWDx5%nEs_(D%JAQaU+ijS~D=Mj{kXSGAGXgM*^&yZV|kHAQGS-^P5` z^Z>=SQ5D%*o|?~<{#{rBAL*pW2QA;l0}R*joI?N`zne(&TPIRtzvn<+z9^mOHM2S8 zOKE`qG~;E7RYl}a&dJF8KOLhPz^Jdr26mJ3%=*Ut5E#qowGHm&ilonTd)hO?AbAYH za(1LJacL}@GAaM>WJ>9{gTft=tX#5jS~!|KHjEDHo9-bY9t^BcBFObbwy{byAwIK{ zNL3lHg^pEY91>Sn;^1cns}fFZ>}&ZIJB`Kzvr^yQl%UnTv7qGT;+$YPu?9PhBC!WN zD;@DEtYqmpOYIXaOp|}K{ISe2RIDIgWtUk|}Oj>aMrdM+u zfW-%n-u<}s$TPVGs5$)CuHn9x5Vu}z%!b0ZUaTGIa*C8?Mpb~%>vTp2lYjNQ)|Zku zXr<3SOhHc zyUd6Ufwwoi7w-hBm(rKhR{i8~(yHHrjit>DA8J*mld~B_-oGzu58KdFeD2w`>wi~? z*lX>-iR&2M@=L(y^=?GF2pM_%xM6qqf}-MWzr8a^lJc-w>2>KIRky6Mc-;dt1GHZT zNhe%|-CV5%$q|0eqVT%ew_SCZ3H~3pt|>SZpv%U#J+bX%VtZmcUu@g9ZQHhO+qN;` z&cFXYZa;K&cU9k)K6USHos(@fT=msM<-ra5sFfq{3&LLb-4M7Kl)!~qA9>TOiufD7 zm&^s(DkOUy6vc(H72s=H&90%9CeaW0v{huns=n}6vAyZv3R3gRiY0cQW@IchfIIz6 z>jz*_#;Q7Va<)fqGRm8@tsTUO(u&fBX1dC$1KLsZjnji<2U1{cYp|RSh__|!W#;pG z0XXNj0YL?L?qvP-f*4a+*5xJ7asdxj~ zShQMnPPsZHW298O#dqRsr3%_(TF8rJmeHtNYug07X{9-QIxv=jIFM)N= z;?~CH@pCdS{3JJKiP#l0VLv_gFw4uF$Dath1d;-#>sUM|2N1I3u5m+0T@~v@Ya4*) zJaGJjGhWb!pN7dvVO6&FoYZVC_vh2j$z@Sd{9@enZgYKQE3RwnBEHhCKRt zdbGwJZaMtZ9b%F{Y2*A-vujt}X~z#xicr5{I`AJNGO)^u1As$;&XF?c0)IYSB-k&4 z7=qcBajHa*C>Fao)%LV<{2b-K*kf_-dCE0Lavz4U3sv z+aVDv;dzuQEYV2pz)_V(nn=7P13Y_P!11u64jgSnqmcx|2+7*ws;9ijE6Z|+sTnH( z&xb|d5K>WcIR>P>mO+ln75h5U60R({lCpnIOOcc&i0;8_GLp<`zj*QHv|v_r(5Z}Z z%fAx?Vu~xs9t<;)l|vhgG(kzmr5TX3IRofbB;zqRqw>VA z08>h@cMWUU>aM!#5u9zU?&twSF~Wz6Di~b#vfiQCj|m&m#TC33hNb%SqaltgSl~;4 zew~?Q)T%58IRZyvae<81{5$7D;F@V`*SsEyH<8}=#}f(43WM1S zJ@~?a^_Iqa?|VjYt24#Sy%bbFkBe`JSX4%`P^4zYcjOJ<4@A~vr?ckd#WezKJ2{*8 zVbh8CNtFw*>h#uo$KqBhe6m%^kA){6lOc>t)=`~=(DD|GbPLr!>t461jyQv&xQ#?@ z+xh4~*3S)QxpWoDn4e1@jiGM5|6vY`-@cqRO{36g7jt)oKuC8QCQ77F>}kAGJIu;| zD~Mxmt+L9J8)L;CE=l|ri4~OGV@XR~X1fS-C~-GOqhMJ72kO+-QMK+d+e1s4nfRxm zd0Hw7t@qCU@d^|R%klkg0 z=M3}1<{M~L9O=U^h7&PoOOjp4S}GbFx&zG4QlUd~ic!H&FRbh(`rT5}NXzMAFtpEs zm!v9|=fx}GP>DqOiC}}f{?guP{p=N8?M?8j?Bx1ibgLlYnL(mK?^M2VhaMGhOYG zTS{DdP8@I41%O$}QR2I(Q(gpM$+0tC0R9=2SqE|qL?=}N%_Kc5(noR1Fele{6gpoU z63T~7_{R(6?0vYX~HKaRHf&CIilhL9Lj18K9e$86$%$E^i;x zPWIT4PJb3WSd?Rs7&M3`6Jox*-_4o2#A2oV{O|EkrD-2Y@;qH?jVi`SQou7tJZ7;K zQKXC{@1U4UuSdQo5kj^%5ezL-~dpg;OnvL3|R%9(wB@ z5mlOu7Ef!=D+M|fu1e*__}P$1r?VA1(-lece#PZIJIo`)r4tW6K3NdLNKqAppvpe$w6T8A1VqMUpUJzTDLFCvv!aY_ z$~Q5BVXEKrdNTg$3C%xO#&|7y$%MoK5nPuTFkZIgH4z}o(c$CK);T&d?P_~RJ%h;q zb$!ray)DC0i~;BpvLkpH?t6t)@laLmGP5JVUpFud&=7KCJmV2k^uAx*rG>_m%8*#% z^?RX~zee(K-H+~wTHp^4sthuzyLO)5-BF*Rq+o1oe(!wf*0Oe4eWgi)-9y}&mAu5w z!NcAJDxT*cmD?;$(6y^kZ)qw-A2=(Wwy_Lm`k3uolAjC_Da^r-7nc-+K}(km+GuAA zx5^Weg`urfvj}aTBW9zJM_GqKD`)X{Fo&j+6P`};O>|&2t8Tu;M}w>*7_x?wSTI*v zQ5~WnGuB_I)m`Vl#BdRz7%yGUCd`Q;a0^BVt^rgj2V2v+K#>2FTaZI6PqTg?|4U2- ztX?s}E0VSYkxLSUTg>UyjDMTkNdzgEyq{+m$&>}Ks{;e2 zu#ed?Mga90!Lr82_>EI6s!TkRwSW{cx!17<$^ElfU=k6Xz&L^deki*+sfDrXJZ>4G zXye&ABxh@cnd9}Ac3=RnY1Cfxw<54{O;;xouTuK?BJ1QVTa-ZsyHxsyPyPMFYz+2- z+ntU|T1MAbZc5A7MV3^$CU~5DU4g#t17Dj&z<<&}C|b~dz> z*s_3m=|H$Pni|C1hGBIpiqg0uYmX%=cJO!AefN&6jZFX`D>HO8g-XIi-^M*)s?fh4 z5ugA2{FzQydQbc5b%vHw-laaIdaE6Zm>DAFJKrz8@WATpxKq?o5UreDOiO5SNAS&li%A+w`eO*YFWtyR+H_x%#Bux9Zl5)nc4f4Oc(K8VfYSl~8~R;)-R_5A z@grU?3nI;f6Halz&r0O6BZkaL!(3gT+W-^d33`d11+Y7uzx@_S1l(^|kWOYV5q^XZliuE^zWI^mW;`R^H~VF=#FzKl^Q?| znGkcPCsTtfPWA4D(bEyl%H6h;JxYum=l#`JUJxi2 zF$;0X@##Sr4#mowf*$Eeu+jb647Gp&`G0rLvVAH5hmpJei{WUhT|`j@Z*> zV#lFYAfT47mG^s$fO+*7U*mSVxAdGgVFsY5g@b3-9 z#k@Fdm!U3zWairXzmt^LipdC zF{Pi(Tbtr!?iDZby(SxJZ%e|Uz}vB#2Ymh=i5qoHhSb8jeK2B;9$ZoV*%{j1dwi&) zh^JwC7zXilYHsdgx5UHWi~gs7jI+bYq^vkV!8*}orurHSp&bF@P8Z4>4T+!Qi}~S# zMZ$)wRDs2ZCT2tQz?)phgB>h&-#1EBJCTaWof&aB<)6en_0oMES1B#;f6i-s?Ah~b zdb4HdAsth~U6UG!`?1UCBvj#V^M471@VVs=^+n1L(E(@fi^bPEb2$zMR%wv!%We5} z=84HwVwoP3Dub|-pan+}qB#pjlci*G!nz8Aun)?L6D)#Dirm{$CCFo^xkWwmWVxL+ z(~aPFlkbf^Q9~=N;a36BW9N?anZ4X>xUcLm^RFet_bNOCAi$e6HVv#Kn|G)Q^2Ymz z$h+sz;FxKoBHmTEA6X`Kn{~hRzwFUtXOHx|`?^?NKhJXHChk-#2$q|>)%03rE-qDl za-h0P^nYR-DzD=YTl#&C9siAQY zzPc9?ktt+h{@QEY&!?2~5K%xACA;ijVQ1IN?rUd{By6@CAum9^Skcsq7g|NFZ+;T7R7fPWsh06(|OM4`_8`dco2IJDpF zY*i-CuA);zrsyn>Do3cR1sU1_aJKt5NTyOFo1pBMov2Y(T`0`k5PlJH*Q<=r-4A_b zd3h(FTh$_)gzK8bF`ILDtg%jw?TB#Oxw2IF+8IY*UlQU?HI>K=UCC|(hj?T!j4dj; z8g?nHpUS7BLGwy9CVp1`%aZy5Y31nept+bw5qH&j<7*!rmm(f@`x{osPA>1MESd9A z&S|@VjLNEpN;!}~BxL`cWa!|_?W+bC$pM=j{lecmXLOuw-J%vL&XFd2V(CrVJ9R5A zvcvB+!6Nm}8B-y~AFGa#xX9eYn>80;2NR54S$iRB1{(luH?9m*?r)+*OpYyRG2R0LeSpC0-X1a*5u-vJ+Z5RP_|w6B7nK&i=$)czR#@B?6%%>`SsHtHQ zpv4yhIQjDH)^U4|otK_*x9=tO;{@#@P`?&~6D@;O9@<~+TqP7nqa8&{n+=TYd??q$ z5-=%9`Dgo5?`FqS`*;_`(fK*tf?DUKQ=`u;2Q(zILy&tP+(S@-X^M_mDM<70$eu(1 zg1tb#;9nqF&|hv!@D&lTTF@$UQ!^@6Ej?CeiP0X3lek)3VcED^b!p2xO@^2;#K*$* zmy6{sY~o~$QQ8enEOpE11ccQwUKd6bSbvQSLt!}%6lgs>+adzD(+IE)d-J>kgoK>w z*UQAYw!X?LNpjn+X)2{J%gue<=|nPPcU*2f*C;U6wVL80Hx!K<+-OwP>2!5_-29hu zH9k9>nZqX${LL@WJl2>n461R<+Luh_P53ags7uaDwnOd<#@>neO;%&jz4uUVfwzSP zjYJWq1zNZP^ODHYdV0O?e^u7e%y{T>V2IfW9L`CJ?i#-Clu|-aoTLsXAR3PFSE%TX zO5o*F5OBi~s2cL94sZN+mJ|zIi;fLwTP&S2Ie#WvwDRV=l>00g;fc`TXYqud6OqFw zG@zj{44BJYu_xYIvE>H}iYV4ufr!09fL3UI%Yx$q#^N^g%@8c)I6?(tbmea061`Fk z8Xng7^VSs+Ay2(o%_8<0zeWWe%N7>$9(zgx`ip>CneD?XjSa2s?`Z&1uwg5zO0r8B zHY-cb`H&&MIYh0WnGY3;Rm1>_6^xI*Zr&fV8_-xe0`{`J7p;&X_!is0(vSmTaLYnv zp~)mu>-~DYcWpi2=Iz`~)ru+nVHOWS7|;CsNSjB~k$~RS`yH2cV6R(V9ureL`5#e z9Onch0f)*~5cv1A@ti+^=jSSq+b5-alqV`!mwV`9oRH0+GmO#6_vD!g1SNG~RHHRa z_;1$uAup@w9(4I&xWFVo1DJ~LP?+4^*s1+GtuoA}4yOCX(uT_{0XR&yoB)?{;iPEW z%-&%`%a(ZKFdGqdmkDTksM|f>jckV7%h?2tS@fp38b1UqR_#K6(Xj0q7}!ua z8MwFCkThH-aB~}O{f_*1zG2FIIhjl2}u}-Y~*rCDh z`l>bKVp1U-2dftnn%BdgHb*2AMq2)7U0+bb*h8<_gpK)16`HzfQe^T0vZi<(bR~louXB)2d_Iv7VSuwMpgoi}(-5~H zt!V0br9VfZfjN}AUDe8X_*;mEB-7)RF+&l`JaxN7*o5MubB6Lr!5BI?YKjPG>)Mop zl}8#4u#N`X$ezu-DqW)zaz+?SZQW;OJYL+=DUfHZ$SOzb`a9zT)V^V3p6eH0|L^)$ z>+Fv~3hAA4MXRC3j^%xqXjHH5n3HdTFw5~!sXBiu=hu(Y*T< zu2-)QDb)?%#QnQT4YmzT`SW3O^Yv$iuh>iP_yJskQj+Q%QTjr?S`~of!#nrwb+;!t ze))`|OFi}R@e_RBeekJEhB^IJI)~@;t^UxfF~FayA~OB^`6V*FC|>vL{-zZcOTzWl zm-l0K^yAO#uOC?aM$PgxmwU+KvI;eJf!my#zOK)rdHZw5g)&}s=9p>+giRO5DTokc-TJ9g?yjf;YpnWZ616G4Lv z&vaG*(vz{7ji^t~zX`MMMA!Pbl^rdR^L1>bN?E&+YMQlK@i6tlK|GT;&}?Yt#tOT> zTUzTG)vH?Cgd6`PGXcDGBr|o_YjtpQ@X1W;P2}u)eelt7Xfx-ta7Kq~nY#(9=a5Q` zON%j^cZ6rLYoOC$FL=8p4bhF!SlGwSnf$w`93o(mffH=oVA#NWM@f-_J zhyqT#?T3!mQT$`V8sXid)_$$aS=Oho_mp_2T&swKWkAGyl^&S8}`mm8)HA$n4RXZMD_ zwDt1>+VnzmH5;QJU}qJG8;eH~b@$(lMliT-_DZ?sGKN>vBfYY=>(|qC`@OJe*`GJpBVqzdj+{RvQO8DbEvGwEg?MXO1NP$|_pelXa?2e_lSUmFjx@jW1(21NK;CVXF^H#y>G~c0~R+ zHY1Yt7vtt2rjh)bHYS*d)8hh*abesj2fNg%Q}O-OcG_gVO4D>;J%04BrY5Aw3-4iO}`T$)|jgF zNnrhTQx-Zj1CB{uc z<2%WEk;gsEBD0XKg(YT5(Ig=W0i!-smg=0ek?+$q1`{w`p9H2#ShR{Bdjrrr^McUv!ko@FYqdr7NCg* zD^G=bYVu#x=Ty3I-M(b@@DhAnGmR-riY|$oj5I|k-mBPg(h#tKXqx8Jpg$KgQWwGW z#9n7e{o%#e7S=y-Se(2fsl3M3 zP0%LTc5@I8^ZNX(M=!mkSPhd{VExBqtgyjptSAfndXx6IjC?{CA$_KFRZ?o0k%k_z z*cVDaV(fx8o!)a#6AiOh z?Vc)c1X=FkORkjcB1=1y;NZI9NpE<1V<9Ho{yc@`^u=wp`wE06B3-nUlXZdyq!OjN z5XO4!?cjFsu(t`RK&te!0PH7dwFCzL)H!KS@g|ggR7q4XF$riyB6y)rpfRcxI0wOA zeY{|wE*+O5m{hBLD+>y02fiedVc_R6i%r>azy(~1)*M@Z0IC^L9>VPqXgvjI#+}h3 zm%_S4HWy17O&P7non{%h3cJD};VkxJ^j_UQzzH)sdbCC|b!e*MkNgk{G@3$bovc9) z*yg=KMu1C4&~sK8_9@F2Dy;p?0$VeiNHOya=m{}NTwx;HI)SboCEElVNeJ_=dT0K; z*k^)#>y%;DeRVY}WY*?UJX@L6wF4M3fCB8)VL@Ij`Pot5>C+75=&X4XMM;ma<~k-G zZK#bE=ZU1OZz!u~^U81#7K#fGVU*Pr|={^2y7^*Tu)ev7rnuPr*rE zQ=i}&AxDY34<)pX;4R=Ea>x|tGSQwP)$PSdWp#++MB;69}nP1$1yx6k@!um}f z4e)HX<1D`kEUFSj`{QOHJCdXEmdW#cFtIb_LrST$uh7@i+wL{7HRQtLV#G9|JS!A- zLz3dTQpHodDXo;D8_Ocn8({#1{EiSOo7hCx8GQ{IsID%EAQ=hSnikzfzmhB&F>TMe zX!*VDp4g8R^wyCxLM52LR-%dl3D^|~^MMmE_CEGFgj+}>I%znqxS!qASX6BUqqYEs z$3LD83TX#M{lr})Q-t51f7AOO#^Aogh(o7F;E*|C$HG#~nPCy$5iRWGO~q%0pb=Pr zhT_CcrdSOn#>|+vb>&WCD#IHO=cdoY%7BidF6~C(_1YCi!PHe$9Mp*78u|OkR)1*$ zv^n=iAp{oyc6;k}pv;R-Ww@>Na#~uyfz2ah$sdSlgVnE&*ZvWLEbyw3 z$rtB2QMkkvRGkEo`dHtaj^&YTKyo{DB#X2dBLQG0B)+2UI0!xlp-pbfZ)2bo?c*4% zCSHUwONQ)QU}^o%x66QK0Aju3(0d-Hc>vajsFOTZRQk`T$8?RS<0t7ojB`l-ADLNH zJ+5x#)Ubrvg~B@Q?lPH})VPrp*;p>YN3y3O3AtV{I3a%e4(yM4Wv=Q(YDkK%V{J$g zo(66%dtzLZO#n)x2;DVQB98Ii!ov7I0!&h>RFR5tZCe(}>+!jtH1Q}XJ)WVMGy5pp z(`ujK^Xj7QSPHc8Mj#IB9vGR20LU=i0B`HIy=AN@5L+m!wrB-8AzaNL_U-&#oBK#? zs0joJJWGtD&frZxREUPF*tR2>pC2Dz&MZ3!O=b{vOR>LHClJJa3eCg)q*(pdDk+d| zmk+yNdO-im&rg)5meQsa$~TSXt@O+w@V0Szp9%z?9V5czG2pd}OT^C-f07K=Vdne& znm}@~Fee2rnRt9^HPzgEdyym>^T);ElZVSaw@qB~O4R&JQ~^g+5-+AO@$hwg{C@H1 zXq@VgI4nchXM7_+e*f)-Q&KEB#cX2e`NPFxI)}~j=VR>of&EKt&6#ZPnR5bNNO0=c zz@xp(HjS4yMlU(V9c(rvKJZ(Qmi7G4RAirfbH$?x1fhkBXPR5CThFRae=xAp{Ds_X z)Hyr*Eh-a6E4K)z`kC{V>O6E@zSCBSzPsFSuAtGELmJW9EuW*&=_V|9I0U^@`y8bjt03oYv|8@ zn-(FL21THb#8LM^4?=!__uE!!Bv`UT^5cV<W#@t<8}P z%x^b{$8p3^DAJnyu2oo4mhu)k`QP9{2SbR{rR4J2vi9VV+f_*C|5>O@ z*%MpDu$)GL^3T{?p#M;Ek&l)q6*{0*Gs1wbhRAMN+&Jvy&`i`H zBDR^H^09_rUNgUb#{5~5v8;y3QbqmrN1oL5kf;k&AIg%W((9i31E*MtZ9;!htRa{GBknB%t1}_0G`m!3s{i-=tnEBtc1qAn|FvQ< zsL^kyC}S9F0AdD~(gViLfT~JL9{M!6^Y3)2#sVH@Uk{(&RLDQYwq81YQ@4p%omoCa z>C))_ai3Gay1^ob&|=7p0?NftCCg{*I(tZ%Y7pRKHKzs&FcnA=TMs<(!O&^tqPy|A5z+FUn6 z%=T9hT%mER?$pmM_W`}w>Tr1%cB`!iFUu;Q)tea+q5AVps#R&A%o%f5NfXBuqpA`> zpZ;B9t0>m@FZbuOV)7WznG^~H7af{kDSa|HMzU{erovN&0X}`?L%9qHGlCs~A>89h zwf0E6V59eo30S%Odo^z$#35h?%{F%cLT(=&NQY&gHpI)o!Dx(2vCmMw=!j~9*QiXx z*0_W-MB5C(BwZ~yrD%!te_fT7j6xpi@_Y71v`pmu;+VB?7$xO^XSVu$>Fic>glDK~ zSCOhy8>LI@e~`E=*$DNC%}GjS=F1n%|A<)w9iA{8=;8QUJiJ=8o&K#w%<4LSwfek| z3=jL|F$DvG!){=Pr5k>6ow)umRie8YU{(gbVmw+TcFfvFI#8BmXSuZWk=_zw5hUy; zlN?f+pR*$$CSEZit znbbTZ{0GikIPs~!WhHH@@QJTs$1@qJ3)rAX)WM?A^}iU@gmR^Tz2F#QLZ0EYw1upc z^F){jeD+p?W@HfIFMdSMrmAU* ze(lykoVnn@Kd+XyI997ciot*ANS^sZkj|c2VS>{Z%pt=|T@;QFZXZ@zqInbvDr}c- z7R<53hs|`o;GKUyJ0_MF-kqDNoqTk8h4Kw>W$MhNzV4nNs=c-@I-X!OX$E#YBkOmx zb;G2_a`bP1c6BnJ4L~UOopu%Tx#lNOQJz!#y;unVdtjNqeSr1|K&~pN{0gyYBePci< zsRh(~gsfBbtK$!#RT;>_RP^+nY6Siz?_Wbx#jFv)WId*c%072ZLdFjz`kp?QL3N@L$VAWh!D@(SC1eqD>wd-6 zCr3L#*|(LoUKY=_MB-!tJsfq(^qXxV&<2(liyu9o3z)rxFEEoui;X$dBS_a;CK_rH zHKQBn9JqBEF7hSKm^2O5ASwQzfhzF0w1~X25-#6#iUg)>NA2kKDs#58rn%sISYk8T z0OZ6rwno^+f39;|$9)7JvS#F}rU}QXV-aDwG>r*aHdG=&p~BHJ&Bs@ z2Z-y2jOb$-#a7^1wBsp8kSd5hMh)GX0)_yZQ8V>f2bugWN1eQmzL`-OKFBu|2kx1m znU)JTV%G1aXYff3`kfi24|C|e9n)ePPW2Q!6&LE)6;NlAe#L;B4Q#0oIca)ek@lIg zVjB|mlsTQ>;hr@99lZKfz^=iT-~`A`&uT)*py`7bH-5&jco_8PZXyab;E%Hl0R*t& z<71&MU}*Cpn-`P1=VF2kwcMC6PAz_;3$nn(s<=kb!)c(g|yt9I$3 z`R;Z3eSt;0Orlg=u{VO#GmGrT`)`lEckx5z+q(8Xj$|$ype|cYT-Hlw2hbsRZ)I5y zBLZ{H*#sI-LO^?N3Tj5A$FI3VMn6`0YUx#%EgTBI-Fr58wo_&vH%$V6K09>KDu1m# z4VYu~X!IVP{xxZI&53BGJB!ZeSS*xF=g*BHIJlZ^3#=KP{k$Sa8!5GC55`O^dDq-y zp6QW@s5!iX?(2D;9B9krl9CtHOy4AY_2fWnl@m2d%nEY@!{UUI30fBWq7?b zjHJI(W%xT?F*N%*L+%@bK9Ia^5Ates4w}x z3YD|wsGxl9i&J~^cwv3YQ#rH<6CS2;0*5-sN&p!LL6&v1n=qDc9j!m^Xf-e0BoY?WfIW{Qy0JTwsqT z#4543D(Ab0QmuDo6H|QhgVXi1lJck0jO{P~|0bTGK=RU{U}!)PKv4hsL_j2-3IUcN zKtPFLKtQLI)CW{Ul;+6LHBwarlQHFrqi6q9N?UE!`)zTG?y3Zeb?Q-u= zO06!4H&bcd)eV;gX*x9@-|osvykVlWXen7R5zKOZ`5vA1ETv#N{ec)zYnWFhFo>-} z?HJ9nG`52ZZBuBr(iKfhpmfZ+8cW$6Mr;?AR4p^3Y6y@p+= zDn!&`SS#PBUG;)kAJ}< zGD5W-3E0NAWgo%eiI|`)-tKro!q;3E5vBkUK8do9ZYEPVbF|sQ;2VGNSsmD+dih}f zW}%b|bkQ|}k64QH45Ek@W}c32SZrMkWrH$I?14dm+bX*oN&Qe=gpirwn?7W?#^?Ov zVJbr35||~Y0wppYaFdvo&_v5`*I45jVK(kSWjs>Yy2^rrnT@a#oCi*&<7P_6-}SV& z9u)E_5jELmcUAs6t%J}5ERrbU~lo8dGFfkwKoK~SVa{(y7UxK zgrCx8IlA04btS~pHi|On7L=c$$9E9rN8*}y697@njx}NK?#pLUNQQww9`%%fSL!gm zQTz@9xk?8JK%$4}0Z|G6hzyhbzZg9)A!`eO00L6_2T;`iV${jZ*xH!ke`_XsH*2da zjX$=V>}b7+Yp#S&w$>CaxRA~fYxSAcvbaMwp#gFVlhO+ixGT${BE-I4Kf8w{&d(cxVfn(uq{sG~l{z&Z zVMBbs7CFs4T|>U4aS0M&MvbQ2WHxrPByKlWK5lh}GpR|D1?%`yGTW|$rN}aqBc2Sf zCMS7_n5Jag!s-Ilkd;S3egSWXsjO5in~)8#zQ{+B5PEtt=ko~)%PwqAguP;QjYwSp z=Z5=}%VwcN{LWcn6`C@?j-KObW$Hfg#_}UH{PT-8!@ad?O5TVk$Ry>#|$&dLGS--VQ|rWMV2{uZlFoTv4> zI%K}KX;!H2d;|GU-N;oPJPwgvJk%oxC=3=84uV2y;1U9M1%yz{1i z2bvQIL645lpa2AThaJ$zhy@r<1KFZzr_~GhXyYt&#XW(`DsO%;_QxT^der9l{#^W3 zdb;?Vco;ex^XuE`^KAZp@E0AO={|i-;K4xZuFuQq>aRln9G}OBd(2}ujiI0SL5kkb zPj@aPW;3GsNQT_cm#gu}TE4HZ&QY>EYkzUkw>UA80<9w`{5vQomJoX~3KIJs^g$#g zQ*Z=-7wGdG82r6zE)(N61p8=LHGz9dP~F^ZR{(yHVTl>^DXzg0&?~1YKD`vYo$w>I zx*KO?pu>rw>JYxZm-6;SCEO4PIOtWzp$dQXIDM2PkQP(T#buWqbsH}C(WWqC|-wz1k{vN&@Yse zw0rIxD!k-)yn`@wcpuctI+?M4?Ke^FKh$?l0$AeROz{m?)7HT67+F4`!rj!)9|W1= z^oo?+bcODyj=CZ@cjg>J3W_24bDXq>{BcT93Q;fZ)PcA59Kuh(-+)JHw!KqPMz>2b z1AepGiD-g_<)lMjOH(e%eMOsnx(=r)l#Q@M?4TdEw8CpCX-Hk=Q1(~a{qzrX2AbaU z`K#;gxa}-&yE?CWUS8f*X!BV%>!7KZb$7VedDovO6ei0)1TnMAJBryzEmBCY(T;dy zEnQ9l#~+23kOqx5wf$}r&~Jo*uHh@7#tY)~C+IveC-#?-ghV0J9$24&OI=uTJ6lZV z#b$p>?_U88Uncmqx$n%Ig%9t*Y%&Qw^_Rt{sRlYLdHp>(iL&gAd&)wyjK#4MdtRp8 zvF(^T5HVFHuzxFKE|~C4r*A@*v%qr2j=euBs(JewBCCDaZJ$_&RG5dnJho|PlCJ`r z!nod$9+c2U%ByJBy;Qxruex}=2e`G7vwWbisJFYee{zEBo9q@M`vs#9U1KPq)$>6%Ds7?tI zg=iTeB_AH1B{>8rl8u7qM-z0)Ljh(@!WW)ug@X|5n~kb3rp9s{AmpXudtcV5EzZj3VQ{J-LzGj~tUZ$~jp%rrj)@ zgxhX*$nW!+QF0c_;}wI&Il#-TDDAq+wMQe*re|ctS-5DX%4`Ej8hT5BYQ{?~)c{wk zrdE9ltF9$rz#lV}Eu_DTNNR5Z@|?f!M`54k!(Pa?OxOpg8NI(1LKbcSqToHjnkSAv z&czNaIuXCAzerMJv7|b&MYBai&#pA{k=MYAZe8QkTh8coI(>3xd^nQT#lm28#l@<) zyuXn`2`z+tU2ueR#A}(_$L*l-WA6;V?I4$lOqQ|Vl*~W>883~;@2C}TdZD`a{|#CB z;XNAIa6mvcEq7BOEps~8IZZAeuAE@n;XB53;SrS8tFM=~l)pKXlJHaA=q0j(5(wbO_w9B#JKl`- zl6PWSrN-U|`_Jdc{YNjgF$#9PINNk(5q){?lt(WDk{eEbArQ22zZpMl>(M7&@OZSS z{z7QcS^aeKs(PTSP2*00uRWirwxU^?_uZVXx6qt{X+G|%oH%SuOmrPZM}78Bo$R?e z>pm^LMeORq(DNYRVav|WB9Ng^O4D{qJZm*Zt16i5yfD|v> z=g}#8yiB)c_XVv?dZ@9T3f-y$jB_hEK&?^C+`_y74WL~1&@!nP&>wY!7&;e#Mz8a8 zS`r13F>}ehN3;@i+#k^1HBv?<(CQ9zVA$5QT_~F>%=7M6F))?*UhrQ&ulgRZRGPaV zZzfQ^k1HnDXd~tJ;_7L_3&P_OI)N#UV9`qoygd% zxt?w@O&QLx6{)@vZN*QC`noXj)O}svL{109D`o!C`Uqnqz)0QAz*^+IPb7R0@-?<@ z==A;C?BdnfNt3l26;D%*wrAch?Ma(Wt=dj2Kxwete zQ_n`&Wo>+k-gW3c3JYrJm6A^OiB+yuhz55JaaNRK64@-I`m&<$%+MOrztT_@>ZVin zXDBB<<%}FVcI)Hn81?Zxu@Lp^a>=R{XNUib+15*=dh*>uk2fnFvE3RN@nlOb%T5)^ zLX};sQ(^FeE+kKgQrfL8erQu_sR+j4?7$OE(bKl)lqn1C1_ocqbL+& z@N$(+Lxi->3VkNL=90;H4qg(yffO8)S(~G7*$cF=teF+P)Sftic6%8cN<^{V=eUXs zxx>nM{xr>5M4egP45nXy!3qG`jHi#zK*H39W0dGWo0UP=HDBM!3mVYzBRLtYGfv#EsJ^MlR-1(?l+$pa1{paJAqKXtXZOeg#{OnB44+$0>goOX=$D!1;0Vx)evIEPod-N2U{GREs_8+y|D%hrC|G3f_@Rt;{eVCkHqe>z{Z zh&>{qPF|i8^{pT;7`U_IrtK-Kd-@9o42-a545cY&k=>YsZlkJ%G9h!}no7+57>|$v zhS7*4w5BjN!?=Q!y(v_$30l@6mMp`e&a?nZa-CgGk`>LZLZ${ed!9cgBOX%cu6@+M zv_^hbin)PM=7#kAgqwI?Glq<#YMwI!H>uBR*zw-N@xz$c2*D6A(Eo-ERR+n`3oS+Q zSHI1Ueq#l2ni|S}`35>-kn?OQ3QbIMD5S={&LpD>I~+Mhz|F+94;AH_8;6s37`i9# zfgQXuqhHSkztY7mf67V$O;*xxsEh-LzBi{1Bb7c7AHoES3XNh0JvJpNe=}Ru|HeO_ z+e|LWn*q8vbQ1~EI7@G1JDv*?9|1do1fJm#DW-*7QN$P{l&%MB8S04hNp>lid6RG@ z2;PvK(nV&8eq!t!P?$$OQY-7G61(4YoYIi;`?uwyH8Xh7N2;N?hm-5x>g(SFb;2}st5cI3PsLYNO$-zvJyv96ml6`M_#%2GU3xER#@4F8n*-Vj!+((iUD!8_w8LJVIOn8Au|=OHS2z zIY9^o(Rhsbz)z}rDaH=DDhrKRG8#@f663kVc5ob~qyS`^q__xlt16#s!Tj5G^_8B* zr|Gk+#W*L#^j>V^{ysm(0M`*FWT*jPWKxTy&z$%k|M1mmfxv$>PqRlSOWeDABfDs_ z5Z5UpXcL$c@@xyi+=JO|+5J(&?R;9$@eqz7;a*5F&A~lZ6x{b)tPBd__eyCDo>HY{ zObv!oqsc^z75 zsVKOZ^SX6ayQknmu_`jP2YBLAyM&8dR8ViUD>qBVfQ7d7$w)QYXqS zg(GXuL8X!Z)~-0Ty`Jv2X;x*amC%+CeRVz)+(OrYD~{EMjr!(~y2ID+T_M&=U6b^i-^aaAXw(#T?H~B1M-{gig zR0Wb4=f!pBsz-g6L~-6>$P-B#2G%P0sGBB~WK$U(xtR5>Jsr2drjGr#AG4KVoP#JQ zH%)oJM6(+y+GBLGaH#^fBE8)xxNuCwL6FgKY!-%28*uSm@Sr5EGIo-kx@|-AgkrmM z14z5Ju+(+1)zf|=c7VNeP}=|!5pyXIUiH>7doU;(`7yb29^l&!l3Sw6pV2$=flkae z(!v^nuu+2m*&qa%zR^J7LLMAITn$~&a%=_(^CspA!5m-6J4?hY4;qcPX^(<9PtfG` z0-tRnx=a)KQZ%qs)kTMW67_(_7Ve`EhglUmMPhLNsfLE3c=#Y#&)b`i3SLG$#FyLy z5v|(U&&A>$tg*tE%@lAqpqwf*OsEh;M+sM9nQmm308miuK!K6*%s(gPYex`>Q$|1( z&a8Qg5e5-8EUBL1sdkL=zrSx6C|oqb$g9w?B$WT;*Jle3yWuqH0-<+8w}DavD;rZ0 zFra}G?P%jvbVO(YDM>`apk|hmuX}T;OD>}=%o9-=g_B?Z?{UGd-!0rq}(01wiKcY+WGakhC%1e5c~MvS`T zH88-q6qg%~Rggo3fAN4n?B?2LV6kpvzje(Bx63winX`M-MGq+fhGEGkqD197%1jA- zU>YRK37I%_6A`9fj}7x3pef;ZJoumXu7WL!Hfk>d5=*0WBO<7DNJ=*gC|yz_y-2gP zbf=04A|)NtQcAgmbSNw#A>ARc)Hk5-tMdB&g6|uyYuMTAx$oyb=Q*=8bDlFZ4|m8* zW7j{lw6oSI9RmfyQ`5+qTU>f~yN_nI$~g719y?f8zUdpZ*&1luJ5iV~9Gd*d{;kw= zEzWxwrtrM)p%Y%W6lJC3)z9y;;>jUWSAg0qPF~$_JojM+PCA=fPXF z99vG2)z6-=a(uAPJ3zi(-eI{lTZ+aY13XI3y=v!bbQ&a%h2f}zsWPSfR+BhW-M&EE z(y$m^v+rdn+}M5l+JRaPq4=>t>%w8_p@2eDbL-B=a`0;DI{$djbyFoBOVVQ95!#ZM zQkFGx+}oRuWqt{0W%BvB=7{?Oxp&!eO!KO_57_^DDG`-wjL<~~fyh}vAl#pq5>Do~di z{Wsgo83Z7XZ3ZlTMCjdx&qiDR=Zdl$Z@-ogShOjf4aH|o0)HWcX+@h8%b=n(T$_UV`=C!Yohq`SMSpF= zZ%={;0A<{Ivp#)9gQNj2OEQD_u7pk=3HQnQY?304E$KJq?mW8;5{BDarX>rnGVZhW zX}fqxx7{YR?n8OtC#P6@!t$Qz&NEL7VO?EM#Uc>D7Kac@D{rVY3Y-h1Oc8@c(>5Q* z^*umhPv8cR6PigCez~CXGoQB~bP3pvhuYYl8s<@c(0a6^R~RcCH0A8dgq2ZAEPP3s2e1OzVZ~p*Y$g!#-Q(lJn7tt3(BOcn_&3Y`Pj4&>AB7O zOJEY-Jo_<>5~_vF8(};yc0SP87~um}uw<{8*f+`ktXJ|>TJFI|N4!`_9MWHxdpBYa zzmF_(jgXF(BQ-^3f^`hp=N)M-4zPfWyCdzQ3HwUQA7$0*lTV=X#|$LS4EKI=PYt$u zr5u^Z;ew$(z=O*!TmdP8#OYDidXd%2n3RBwbDtH3w`OM%7^;FmQ?7G4#-SQ*TO-cG z{^ia*(0+MA9gIR9G>Tza+a)qAFuyrRH>ELVEoETB?rf`l1oa~a_fSsQG`3Y*!?>@- zoYd4eoz|!Ka=tGX)IJh%bF4I=AX*#jhX-7qqUluT_2g~&E^Nu!^lpGb2A;Pg@>btw zrQ=KDkP5SQ!TqXZixI-cT-TO+i8sB9yE_dXnuFpMB31?Z&E-?5njIY%xyl*~ETY^O zt(l5ZJq{WD0;Rtr69a9Jtt!y2+DahE+`T4Eo8vcbCXiQezkO0ql+;!a8=KAX7=T|r zPVm)&;Bae1)4OolE-gHnS9aRv<+Q=(2j>X}W7{{KRRyFdQt^KX^O;1v8Yqh*M`LjZ9F_$pTOCSqb8ntB*mO) zC5(i)^2rhHn9vs|B(2Bis!Zo33ok{@Y$NeJSl3HUBfrM@Kxpd~(Px=(6Z)p(XT)&Z ztxUphk_t!dnJbldLYy|1Gjb0}Ju~A=I8Ne-G1;*@4ces0Ox<5Me09~hPKFCc%pUz*@lOl$iID8tOt7mx1_&(8(G_+vIbpKP} zipkQm&+D6IRCoBEP#davTQR=3Og_dqtIxVPO~%`B|B*2Y2xJaSl@a{-5jKU|+CH>% zay*}ZD7a^!xWYl;MY`rgw&l%V8{Sr0ewF<*dLxGTF^Z{BMXYDSr}Bam7_*Dkh5;s% zBiD-oM@ZhX=?2Gr^XDeEeEAh9VYW;9o`qf815@kWAn->#uQ2tOt|pG-NAGe*uUwKg z?nQ~U<_?MQuzp8?waj}gUsq+1)YmyzF6FmI% z2OVq{juQ);q1zL0JxOD7i@V-;b`5`Um?_Hd(#^)EuDHDn>+K1*Wj*mF_p)`73FkXV zXl#v&%H(%>d1+2EtdvJ&D&`VN3Hf zZt;ELJAh3ie`p!RR&l?bRGL=i#c2??#JX@{13IGB*dt8ZV4tw}-SiwV;q%|&xPsyL zL>U+cVPMvh`NweB19>&4hYt52Iys$BUS8PdWHYg}b1;=N%Q2#(#s0{?PjA5%OE>T^b)@pOf!9NV7e} zNP9Ru8-G&N+Z#Ev+deq~e@_K56h8HIL+)>ULk!F;$NPwgrXHQl_4vScr=~iC5i0np zsfHG~Dm}$2qQ^%E$Hm#e%}k;q-d=7etB5@~^X-GfD%uCM-eGr7?s%P?%xq50Y-hva zsSn;Kul01Zsl2yBXNDSjxoytu%71xa@TzXVfDHmUJ-pW-Jn0}2)rRUI_R4ksu=)Gv z``O=?C=}T?EAuz`*f^FCYo9$dESWtu%@rB{-JTAb$mXlVSP`(}jx zp;!Rkp+6=53O!BlKJfW7sR7u-uJvF7H_~djQzE;c#Z@82Bs*=O4q-We3aye|d9}60 zWH@Ouao83@6XXG3Fz}prTi@^IT&r_`JU;_%5WBjPR*+Ixk$zkJdkCbKyJ!f!gaYp@ z+5VnIjn`^CkJ8RQK2WmFnMFUYFu5`ocbTTvL<;G6aeM1M}cO?ol4u(rNb*{v=RET%(LVI8#%I3ZCC(}CVUixhkPauHNY-;PCPe8nxu4OpelxN0?N=Pk!@~TdQcce=-$gf%tLNh4uTrHy*MeLy8sa=UWnW^ z2I4?W4^M^541|F>Epkc$nyWL)`F!P8lGfbie2gocb*O})QfBD{Psu_<6GH>FvBn7x zR?_ttB=@9(?7||H7D(C^SviT$j3Vsb6rlb=c}8_+jzYk;KmL}VoYa|Idq1HAzYr+~ zF0~K^K)|OKi2!i2!DR-b&^9UhpB!l}o-+4@f<`$3bIx?LS_Obb_x^DmBPZe1rRb$I zh@0#$QFn-3TSPWr^?v_)^nGiL43J>*vlFF&o5CNd{?!z4(~yTK_DszW#lXE0J)s!? z3IKv<|2Kg-H=+t;B3lL1&Ay0dwgGKL~0dbs` z?I%oxB7(mYCuJrPjd9FZ*d>`293G@;WPu*^iiLtPjXA=QsK~vPkpYNbb(3q?O|A!7 zk7eXX;VTYtHu17&{XP!20!BBhae)<4h3QWTsu(iWANdDRoJb)bPHATcP%SK3x~6Z1j}?EX)b@d z_h=u;KK<4?w_J+&5>CIHL{itKTh1Nb#D~bw-D~4(+bw6t^ zk6Ib%6(e|Cj5J15WiizlU{Tbht$jyS}a_lqYvVpt*>GTZ%Qu9HYu zXPai%LiSQ7oMDslh~Q;XTiVRqPs*iZDlx6LFCPn7ZJ!qK@%LIeVi)oq_F7qQJ{})7 zsi@Ef-XkzHY-!oVG|1}qf;IUt_^O6)c}2`HmSqaCs&Gcu<`oXy`>dM(_2KB{oT2Sf z&7OPc$yw?sfcE8pa>&^VHzrC@PL?_|1JA17O<0dzbGfyDSfY@d-8x05kUQVmd~pD! zLbP6~eq*m4vV`6_2+lO5+r4xiB1`D^*keB8^b2E7M7Z=TVcr^0$CPuVr&A8{<)OSp zA!O-*_RP`+Epw4DW=>Wti4JAlxn_N*=srSpEg0cWUvoH`) zUrF-o%QWXxYwsErypaK@7JQ{_Xem)d+{XFS3EHHajG;^2CV{zB57kgtFW*ZA($KaA z;_U$5*9Z?DJ@k=6i!BsGS)ETb-HDv~dqsKzkEytQ2i87+bx({t9MD?TWJgjXMJEg) z-U9BZafd2)54c5-TqojYaph_5j_cY%8^jy+%nYvEtoLPgJ%e%-RkaB&0vn6aPJXgO zJu@%$%Dsh*x8EpNQuWM~(MKl+ROt4W`N;zG%(`?MCj}>sQYRTO%(_K-+)^BSpqvO{ zI!6*%(=z$N++BDGhSA33U6SUgg+}V5CB63)R2a||Jz8v32E4$kFI~{L;7ONS4C@y2 zS-#M$Qxy`g{v$(!!kUEuop+4pcS&an%Zf-psTQ{-QI@WL&hZ*p@<8xP<0x*zJOoFp zMvG*H6IQX&rdN_)+$}0!H(IZ1I*@@8t#{d;E>7*{l6=&e%&+br*y9Y!HNn(8fxKZZ zEy`zpKcNI+Qt;IBKu*=C-Img@#TbNbj521&E(rVTfxNg%G^m)AJsk?0vgelCvuVa3 ze6>?>mDYYI`b1kGZGLXTNMy{V7+FR8eCXY%B5Rror&eSt6OSdXPjhGpGTm8iT!p-b zg?sdPppu&lIoK18SZ0hmA(!0_C;&e>6-pXUnnT)Jhwl??2`Op?-X3_Zh=!wP3Xpz zmmtF1nGtfL^3=mN!DQFw<<~#t@-PN7Z)Sx;=$}6B^zZkmKo?~X(^~^QRm*Y1_|zW>;7`n)VIwH~uC%as!Lt!eQV4QiKD%^DM8K|Fa3+79_xY5S;f zp;&y6{h%0LJb9?*xLjMnQ)2b7Tq>Mb{ie5JKP$EODN1DXclDUpj5lmdvT!m}gjQU= zW~ve2>Vr)YQt>%^dFkd$eSMcRwW!*(C})c_nq*NsusoBJmkwapB5 zqifkY9TS{SQ-CK;r0-(BNk_ADKz1CwxiNbbe`VU;Bo@^yVfaPe%2m}}DFY0E>y5dACEYPT}0-_b?+(hn{_s6hhPhW`!g zFjP5(Bp_xjfv_g{J*vuHv$bvLHBRW+njgN+N5Pm_%bds7v7 zC)`!?IIO3eoMQA*zS9amCz&oRE-`H=<~D>S1h{HdPl;?%3mdOip}H<5>PjZR@sDs` zy)`CvI4VK+u6vuEXaZ9LeMs7s>q`7gW%em=VLJ8x##><*oB|Cj+j(3+%`K{Du@USB zV8Qt<7B!q|jKd@<>fml+4G(K!{j#c}NLke_eN|VZpm(bgia8o82%1~132BGz@p|Da zBXl@YfeXqG*9qcrOIgTGC+V4vuMB|sKmiJ+Myyd&`a;p;GEf;548qk~mgByX0AD9-f4u;W*Z;jQ?zqkJ0(le79Hk@|M5&XEk zS@5}Qwd)i*Z4K814&tOfuiiW)&bZ7Xoyf?=?JEc2fyF~|IR3~fJ9wP;i z4)q-eHw5xo+)o&hq`=_(h-Z{bw}BF;f9lCSQ-F7F0}*`$q|wf5b^l!SB%wf(#?I-1 zy1V^DM}xBvS5^FzphAO#aTh=-0f`o1pZRTR0CtiG4i9Y{+1bw47lAg1I!Y`+&vQUd zh~hUGkdpxpDL`HO53DQH!P*20wLa_nuRM{QI@W;z4;&DH{|65-);Z7b3>QUIbccyi z0Xkm;=9B#aZpHo=>}c`up_3!~`9Ge&`C#adkjMsrHUK0r{=q_ucai0XRp(sinaID| zbf6rP76GWAx^_{P9AF~gn=_k!m&NrrS){j%b!q@#+5ztU(>QGMzp`-ujm7EU$sBG1 z2vpL2=>iLq_OC4GW?gjj#rqb1c}b-FoaKMJi{T>C#p3c`L{pXLL>EiVFA`iV_4`GT zP=8MFpTfV33>Rnkelbk8|6urczV9ORVqW?e)U4+m`bU=fBKl$)^%r`(_Z)p8iOPOq z`#h<7k@R9F^cQJh-w#Q@=S44~|2)zAg$03T$3UR}oc3LW|9L?D9bP;68~o?tRaFrk T2xkz82>7c9em26V&$j*tn$#To literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java index 4b079bcce6..1575c29dbb 100644 --- a/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java +++ b/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java @@ -25,13 +25,12 @@ import junit.framework.AssertionFailedError; import junit.framework.TestCase; import org.apache.poi.hssf.record.formula.functions.TestMathX; -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.FormulaEvaluator; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook;; /** * Tests formulas and operators as loaded from a test data spreadsheet.

@@ -89,8 +88,8 @@ public final class TestFormulasFromSpreadsheet extends TestCase { public static final int NUMBER_OF_ROWS_PER_FUNCTION = 4; } - private HSSFWorkbook workbook; - private HSSFSheet sheet; + private Workbook workbook; + private Sheet sheet; // Note - multiple failures are aggregated before ending. // If one or more functions fail, a single AssertionFailedError is thrown at the end private int _functionFailureCount; @@ -98,7 +97,7 @@ public final class TestFormulasFromSpreadsheet extends TestCase { private int _evaluationFailureCount; private int _evaluationSuccessCount; - private static final HSSFCell getExpectedValueCell(HSSFRow row, short columnIndex) { + private static final Cell getExpectedValueCell(Row row, short columnIndex) { if (row == null) { return null; } @@ -114,40 +113,40 @@ public final class TestFormulasFromSpreadsheet extends TestCase { throw new AssertionFailedError(msg + " - actual value was null"); } - if (expected.getCellType() == HSSFCell.CELL_TYPE_STRING) { + if (expected.getCellType() == Cell.CELL_TYPE_STRING) { String value = expected.getRichStringCellValue().getString(); if (value.startsWith("#")) { // TODO - this code never called - expected.setCellType(HSSFCell.CELL_TYPE_ERROR); + expected.setCellType(Cell.CELL_TYPE_ERROR); // expected.setCellErrorValue(...?); } } switch (expected.getCellType()) { - case HSSFCell.CELL_TYPE_BLANK: - assertEquals(msg, HSSFCell.CELL_TYPE_BLANK, actual.getCellType()); + case Cell.CELL_TYPE_BLANK: + assertEquals(msg, Cell.CELL_TYPE_BLANK, actual.getCellType()); break; - case HSSFCell.CELL_TYPE_BOOLEAN: - assertEquals(msg, HSSFCell.CELL_TYPE_BOOLEAN, actual.getCellType()); + case Cell.CELL_TYPE_BOOLEAN: + assertEquals(msg, Cell.CELL_TYPE_BOOLEAN, actual.getCellType()); assertEquals(msg, expected.getBooleanCellValue(), actual.getBooleanValue()); break; - case HSSFCell.CELL_TYPE_ERROR: - assertEquals(msg, HSSFCell.CELL_TYPE_ERROR, actual.getCellType()); + case Cell.CELL_TYPE_ERROR: + assertEquals(msg, Cell.CELL_TYPE_ERROR, actual.getCellType()); if(false) { // TODO: fix ~45 functions which are currently returning incorrect error values assertEquals(msg, expected.getErrorCellValue(), actual.getErrorValue()); } break; - case HSSFCell.CELL_TYPE_FORMULA: // will never be used, since we will call method after formula evaluation + case Cell.CELL_TYPE_FORMULA: // will never be used, since we will call method after formula evaluation throw new AssertionFailedError("Cannot expect formula as result of formula evaluation: " + msg); - case HSSFCell.CELL_TYPE_NUMERIC: - assertEquals(msg, HSSFCell.CELL_TYPE_NUMERIC, actual.getCellType()); + case Cell.CELL_TYPE_NUMERIC: + assertEquals(msg, Cell.CELL_TYPE_NUMERIC, actual.getCellType()); TestMathX.assertEquals(msg, expected.getNumericCellValue(), actual.getNumberValue(), TestMathX.POS_ZERO, TestMathX.DIFF_TOLERANCE_FACTOR); // double delta = Math.abs(expected.getNumericCellValue()-actual.getNumberValue()); // double pctExpected = Math.abs(0.00001*expected.getNumericCellValue()); // assertTrue(msg, delta <= pctExpected); break; - case HSSFCell.CELL_TYPE_STRING: - assertEquals(msg, HSSFCell.CELL_TYPE_STRING, actual.getCellType()); + case Cell.CELL_TYPE_STRING: + assertEquals(msg, Cell.CELL_TYPE_STRING, actual.getCellType()); assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getRichTextStringValue().getString()); break; } @@ -196,11 +195,11 @@ public final class TestFormulasFromSpreadsheet extends TestCase { */ private void processFunctionGroup(int startRowIndex, String testFocusFunctionName) { - HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, workbook); + FormulaEvaluator evaluator = new FormulaEvaluator(sheet, workbook); int rowIndex = startRowIndex; while (true) { - HSSFRow r = sheet.getRow(rowIndex); + Row r = sheet.getRow(rowIndex); String targetFunctionName = getTargetFunctionName(r); if(targetFunctionName == null) { throw new AssertionFailedError("Test spreadsheet cell empty on row (" @@ -214,7 +213,7 @@ public final class TestFormulasFromSpreadsheet extends TestCase { if(testFocusFunctionName == null || targetFunctionName.equalsIgnoreCase(testFocusFunctionName)) { // expected results are on the row below - HSSFRow expectedValuesRow = sheet.getRow(rowIndex + 1); + Row expectedValuesRow = sheet.getRow(rowIndex + 1); if(expectedValuesRow == null) { int missingRowNum = rowIndex + 2; //+1 for 1-based, +1 for next row throw new AssertionFailedError("Missing expected values row for function '" @@ -237,8 +236,8 @@ public final class TestFormulasFromSpreadsheet extends TestCase { * @return a constant from the local Result class denoting whether there were any evaluation * cases, and whether they all succeeded. */ - private int processFunctionRow(HSSFFormulaEvaluator evaluator, String targetFunctionName, - HSSFRow formulasRow, HSSFRow expectedValuesRow) { + private int processFunctionRow(FormulaEvaluator evaluator, String targetFunctionName, + Row formulasRow, Row expectedValuesRow) { int result = Result.NO_EVALUATIONS_FOUND; // so far short endcolnum = formulasRow.getLastCellNum(); @@ -246,14 +245,14 @@ public final class TestFormulasFromSpreadsheet extends TestCase { // iterate across the row for all the evaluation cases for (short colnum=SS.COLUMN_INDEX_FIRST_TEST_VALUE; colnum < endcolnum; colnum++) { - HSSFCell c = formulasRow.getCell(colnum); - if (c == null || c.getCellType() != HSSFCell.CELL_TYPE_FORMULA) { + Cell c = formulasRow.getCell(colnum); + if (c == null || c.getCellType() != Cell.CELL_TYPE_FORMULA) { continue; } FormulaEvaluator.CellValue actualValue = evaluator.evaluate(c); - HSSFCell expectedValueCell = getExpectedValueCell(expectedValuesRow, colnum); + Cell expectedValueCell = getExpectedValueCell(expectedValuesRow, colnum); try { confirmExpectedResult("Function '" + targetFunctionName + "': Formula: " + c.getCellFormula() + " @ " + formulasRow.getRowNum() + ":" + colnum, expectedValueCell, actualValue); @@ -307,20 +306,20 @@ public final class TestFormulasFromSpreadsheet extends TestCase { /** * @return null if cell is missing, empty or blank */ - private static String getTargetFunctionName(HSSFRow r) { + private static String getTargetFunctionName(Row r) { if(r == null) { System.err.println("Warning - given null row, can't figure out function name"); return null; } - HSSFCell cell = r.getCell(SS.COLUMN_INDEX_FUNCTION_NAME); + Cell cell = r.getCell(SS.COLUMN_INDEX_FUNCTION_NAME); if(cell == null) { System.err.println("Warning - Row " + r.getRowNum() + " has no cell " + SS.COLUMN_INDEX_FUNCTION_NAME + ", can't figure out function name"); return null; } - if(cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) { + if(cell.getCellType() == Cell.CELL_TYPE_BLANK) { return null; } - if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) { + if(cell.getCellType() == Cell.CELL_TYPE_STRING) { return cell.getRichStringCellValue().getString(); } -- 2.39.5